From bca7187fd40c1efa87599e96601628a977ce7aa4 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 03 2016 06:06:18 +0000 Subject: import glibc-2.17-157.el7 --- diff --git a/SOURCES/glibc-rh1027348-1.patch b/SOURCES/glibc-rh1027348-1.patch new file mode 100644 index 0000000..363a3af --- /dev/null +++ b/SOURCES/glibc-rh1027348-1.patch @@ -0,0 +1,280 @@ +Backporting the C11 atomic support will allow future algorithms +to be more easily backported to RHEL7. This is initially backported +to support the new semaphore algorithm which is now in RHEL7 +(rhbz#1027348). + +commit 1ea339b69725cb2f30b5a84cb7ca96111c9a637b +Author: Torvald Riegel +Date: Sat Oct 18 01:02:59 2014 +0200 + + Add arch-specific configuration for C11 atomics support. + + This sets __HAVE_64B_ATOMICS if provided. It also sets + USE_ATOMIC_COMPILER_BUILTINS to true if the existing atomic ops use the + __atomic* builtins (aarch64, mips partially) or if this has been + tested (x86_64); otherwise, this is set to false so that C11 atomics will + be based on the existing atomic operations. + +Index: glibc-2.17-c758a686/ports/sysdeps/aarch64/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/aarch64/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/bits/atomic.h +@@ -36,6 +36,8 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 1 ++#define USE_ATOMIC_COMPILER_BUILTINS 1 + + /* Compare and exchange. + For all "bool" routines, we return FALSE if exchange succesful. */ +Index: glibc-2.17-c758a686/ports/sysdeps/alpha/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/alpha/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/alpha/bits/atomic.h +@@ -42,6 +42,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 1 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + + #ifdef UP + # define __MB /* nothing */ +Index: glibc-2.17-c758a686/ports/sysdeps/arm/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/arm/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/arm/bits/atomic.h +@@ -33,6 +33,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 0 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + void __arm_link_error (void); + + /* Use the atomic builtins provided by GCC in case the backend provides +Index: glibc-2.17-c758a686/sysdeps/i386/i486/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i486/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/i386/i486/bits/atomic.h +@@ -54,6 +54,9 @@ typedef uintmax_t uatomic_max_t; + # endif + #endif + ++#define __HAVE_64B_ATOMICS 0 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + + #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ + __sync_val_compare_and_swap (mem, oldval, newval) +Index: glibc-2.17-c758a686/ports/sysdeps/ia64/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/ia64/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/ia64/bits/atomic.h +@@ -43,6 +43,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 1 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + + #define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \ + (abort (), 0) +Index: glibc-2.17-c758a686/ports/sysdeps/m68k/coldfire/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/m68k/coldfire/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/m68k/coldfire/bits/atomic.h +@@ -49,6 +49,10 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++/* If we have just non-atomic operations, we can as well make them wide. */ ++#define __HAVE_64B_ATOMICS 1 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + /* The only basic operation needed is compare and exchange. */ + #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ + ({ __typeof (mem) __gmemp = (mem); \ +Index: glibc-2.17-c758a686/ports/sysdeps/m68k/m680x0/m68020/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/m68k/m680x0/m68020/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/m68k/m680x0/m68020/bits/atomic.h +@@ -44,6 +44,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 1 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ + ({ __typeof (*(mem)) __ret; \ + __asm __volatile ("cas%.b %0,%2,%1" \ +Index: glibc-2.17-c758a686/ports/sysdeps/mips/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/mips/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/mips/bits/atomic.h +@@ -43,6 +43,12 @@ typedef uintmax_t uatomic_max_t; + #define MIPS_PUSH_MIPS2 + #endif + ++#if _MIPS_SIM == _ABIO32 ++#define __HAVE_64B_ATOMICS 0 ++#else ++#define __HAVE_64B_ATOMICS 1 ++#endif ++ + /* See the comments in about the use of the sync instruction. */ + #ifndef MIPS_SYNC + # define MIPS_SYNC sync +@@ -82,6 +88,8 @@ typedef uintmax_t uatomic_max_t; + /* The __atomic_* builtins are available in GCC 4.7 and later, but MIPS + support for their efficient implementation was added only in GCC 4.8. */ + ++#define USE_ATOMIC_COMPILER_BUILTINS 1 ++ + /* Compare and exchange. + For all "bool" routines, we return FALSE if exchange succesful. */ + +@@ -204,6 +212,8 @@ typedef uintmax_t uatomic_max_t; + /* This implementation using inline assembly will be removed once glibc + requires GCC 4.8 or later to build. */ + ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + /* Compare and exchange. For all of the "xxx" routines, we expect a + "__prev" and a "__cmp" variable to be provided by the enclosing scope, + in which values are returned. */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bits/atomic.h +@@ -33,6 +33,9 @@ + # define MUTEX_HINT_REL + #endif + ++#define __HAVE_64B_ATOMICS 0 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + /* + * The 32-bit exchange_bool is different on powerpc64 because the subf + * does signed 64-bit arthmatic while the lwarx is 32-bit unsigned +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/bits/atomic.h +@@ -33,6 +33,9 @@ + # define MUTEX_HINT_REL + #endif + ++#define __HAVE_64B_ATOMICS 1 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + /* The 32-bit exchange_bool is different on powerpc64 because the subf + does signed 64-bit arthmatic while the lwarx is 32-bit unsigned + (a load word and zero (high 32) form) load. +Index: glibc-2.17-c758a686/sysdeps/s390/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/s390/bits/atomic.h +@@ -43,6 +43,8 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + + #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ + (abort (), (__typeof (*mem)) 0) +@@ -59,6 +61,7 @@ typedef uintmax_t uatomic_max_t; + __archold; }) + + #ifdef __s390x__ ++# define __HAVE_64B_ATOMICS 1 + # define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ + ({ __typeof (mem) __archmem = (mem); \ + __typeof (*mem) __archold = (oldval); \ +@@ -67,6 +70,7 @@ typedef uintmax_t uatomic_max_t; + : "d" ((long) (newval)), "m" (*__archmem) : "cc", "memory" ); \ + __archold; }) + #else ++# define __HAVE_64B_ATOMICS 0 + /* For 31 bit we do not really need 64-bit compare-and-exchange. We can + implement them by use of the csd instruction. The straightforward + implementation causes warnings so we skip the definition for now. */ +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc32/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc32/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc32/bits/atomic.h +@@ -47,6 +47,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 0 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + + /* We have no compare and swap, just test and set. + The following implementation contends on 64 global locks +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc32/sparcv9/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/bits/atomic.h +@@ -44,6 +44,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 0 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + + #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ + (abort (), (__typeof (*mem)) 0) +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/bits/atomic.h +@@ -44,6 +44,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 1 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + + #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ + (abort (), (__typeof (*mem)) 0) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/hppa/bits/atomic.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/bits/atomic.h +@@ -44,6 +44,9 @@ typedef uintptr_t uatomicptr_t; + typedef intmax_t atomic_max_t; + typedef uintmax_t uatomic_max_t; + ++#define __HAVE_64B_ATOMICS 0 ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++ + /* prev = *addr; + if (prev == old) + *addr = new; +Index: glibc-2.17-c758a686/sysdeps/x86_64/bits/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/bits/atomic.h ++++ glibc-2.17-c758a686/sysdeps/x86_64/bits/atomic.h +@@ -55,6 +55,12 @@ typedef uintmax_t uatomic_max_t; + # endif + #endif + ++#define __HAVE_64B_ATOMICS 1 ++#if __GNUC_PREREQ (4, 7) ++#define USE_ATOMIC_COMPILER_BUILTINS 1 ++#else ++#define USE_ATOMIC_COMPILER_BUILTINS 0 ++#endif + + #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ + __sync_val_compare_and_swap (mem, oldval, newval) diff --git a/SOURCES/glibc-rh1027348-2.patch b/SOURCES/glibc-rh1027348-2.patch new file mode 100644 index 0000000..ca54870 --- /dev/null +++ b/SOURCES/glibc-rh1027348-2.patch @@ -0,0 +1,229 @@ +commit ff8714269c9312d9164456279a56b6f6c47e2771 +Author: Torvald Riegel +Date: Sun Sep 14 20:04:54 2014 +0200 + + Add atomic operations similar to those provided by C11. + +Index: glibc-2.17-c758a686/include/atomic.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/atomic.h ++++ glibc-2.17-c758a686/include/atomic.h +@@ -542,6 +542,218 @@ + ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; }) + #endif + ++/* This is equal to 1 iff the architecture supports 64b atomic operations. */ ++#ifndef __HAVE_64B_ATOMICS ++#error Unable to determine if 64-bit atomics are present. ++#endif ++ ++/* The following functions are a subset of the atomic operations provided by ++ C11. Usually, a function named atomic_OP_MO(args) is equivalent to C11's ++ atomic_OP_explicit(args, memory_order_MO); exceptions noted below. */ ++ ++/* Each arch can request to use compiler built-ins for C11 atomics. If it ++ does, all atomics will be based on these. */ ++#if USE_ATOMIC_COMPILER_BUILTINS ++ ++/* We require 32b atomic operations; some archs also support 64b atomic ++ operations. */ ++void __atomic_link_error (void); ++# if __HAVE_64B_ATOMICS == 1 ++# define __atomic_check_size(mem) \ ++ if ((sizeof (*mem) != 4) && (sizeof (*mem) != 8)) \ ++ __atomic_link_error (); ++# else ++# define __atomic_check_size(mem) \ ++ if (sizeof (*mem) != 4) \ ++ __atomic_link_error (); ++# endif ++ ++# define atomic_thread_fence_acquire() \ ++ __atomic_thread_fence (__ATOMIC_ACQUIRE) ++# define atomic_thread_fence_release() \ ++ __atomic_thread_fence (__ATOMIC_RELEASE) ++# define atomic_thread_fence_seq_cst() \ ++ __atomic_thread_fence (__ATOMIC_SEQ_CST) ++ ++# define atomic_load_relaxed(mem) \ ++ ({ __atomic_check_size((mem)); __atomic_load_n ((mem), __ATOMIC_RELAXED); }) ++# define atomic_load_acquire(mem) \ ++ ({ __atomic_check_size((mem)); __atomic_load_n ((mem), __ATOMIC_ACQUIRE); }) ++ ++# define atomic_store_relaxed(mem, val) \ ++ do { \ ++ __atomic_check_size((mem)); \ ++ __atomic_store_n ((mem), (val), __ATOMIC_RELAXED); \ ++ } while (0) ++# define atomic_store_release(mem, val) \ ++ do { \ ++ __atomic_check_size((mem)); \ ++ __atomic_store_n ((mem), (val), __ATOMIC_RELEASE); \ ++ } while (0) ++ ++/* On failure, this CAS has memory_order_relaxed semantics. */ ++# define atomic_compare_exchange_weak_relaxed(mem, expected, desired) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_compare_exchange_n ((mem), (expected), (desired), 1, \ ++ __ATOMIC_RELAXED, __ATOMIC_RELAXED); }) ++# define atomic_compare_exchange_weak_acquire(mem, expected, desired) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_compare_exchange_n ((mem), (expected), (desired), 1, \ ++ __ATOMIC_ACQUIRE, __ATOMIC_RELAXED); }) ++# define atomic_compare_exchange_weak_release(mem, expected, desired) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_compare_exchange_n ((mem), (expected), (desired), 1, \ ++ __ATOMIC_RELEASE, __ATOMIC_RELAXED); }) ++ ++# define atomic_exchange_acquire(mem, desired) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_exchange_n ((mem), (desired), __ATOMIC_ACQUIRE); }) ++# define atomic_exchange_release(mem, desired) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_exchange_n ((mem), (desired), __ATOMIC_RELEASE); }) ++ ++# define atomic_fetch_add_relaxed(mem, operand) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_fetch_add ((mem), (operand), __ATOMIC_RELAXED); }) ++# define atomic_fetch_add_acquire(mem, operand) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_fetch_add ((mem), (operand), __ATOMIC_ACQUIRE); }) ++# define atomic_fetch_add_release(mem, operand) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_fetch_add ((mem), (operand), __ATOMIC_RELEASE); }) ++# define atomic_fetch_add_acq_rel(mem, operand) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_fetch_add ((mem), (operand), __ATOMIC_ACQ_REL); }) ++ ++# define atomic_fetch_and_acquire(mem, operand) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_fetch_and ((mem), (operand), __ATOMIC_ACQUIRE); }) ++ ++# define atomic_fetch_or_relaxed(mem, operand) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_fetch_or ((mem), (operand), __ATOMIC_RELAXED); }) ++# define atomic_fetch_or_acquire(mem, operand) \ ++ ({ __atomic_check_size((mem)); \ ++ __atomic_fetch_or ((mem), (operand), __ATOMIC_ACQUIRE); }) ++ ++#else /* !USE_ATOMIC_COMPILER_BUILTINS */ ++ ++/* By default, we assume that read, write, and full barriers are equivalent ++ to acquire, release, and seq_cst barriers. Archs for which this does not ++ hold have to provide custom definitions of the fences. */ ++# ifndef atomic_thread_fence_acquire ++# define atomic_thread_fence_acquire() atomic_read_barrier () ++# endif ++# ifndef atomic_thread_fence_release ++# define atomic_thread_fence_release() atomic_write_barrier () ++# endif ++# ifndef atomic_thread_fence_seq_cst ++# define atomic_thread_fence_seq_cst() atomic_full_barrier () ++# endif ++ ++# ifndef atomic_load_relaxed ++# define atomic_load_relaxed(mem) \ ++ ({ __typeof (*(mem)) __atg100_val; \ ++ __asm ("" : "=r" (__atg100_val) : "0" (*(mem))); \ ++ __atg100_val; }) ++# endif ++# ifndef atomic_load_acquire ++# define atomic_load_acquire(mem) \ ++ ({ __typeof (*(mem)) __atg101_val = atomic_load_relaxed (mem); \ ++ atomic_thread_fence_acquire (); \ ++ __atg101_val; }) ++# endif ++ ++# ifndef atomic_store_relaxed ++/* XXX Use inline asm here? */ ++# define atomic_store_relaxed(mem, val) do { *(mem) = (val); } while (0) ++# endif ++# ifndef atomic_store_release ++# define atomic_store_release(mem, val) \ ++ do { \ ++ atomic_thread_fence_release (); \ ++ atomic_store_relaxed ((mem), (val)); \ ++ } while (0) ++# endif ++ ++/* On failure, this CAS has memory_order_relaxed semantics. */ ++/* XXX This potentially has one branch more than necessary, but archs ++ currently do not define a CAS that returns both the previous value and ++ the success flag. */ ++# ifndef atomic_compare_exchange_weak_acquire ++# define atomic_compare_exchange_weak_acquire(mem, expected, desired) \ ++ ({ typeof (*(expected)) __atg102_expected = *(expected); \ ++ *(expected) = \ ++ atomic_compare_and_exchange_val_acq ((mem), (desired), *(expected)); \ ++ *(expected) == __atg102_expected; }) ++# endif ++# ifndef atomic_compare_exchange_weak_relaxed ++/* XXX Fall back to CAS with acquire MO because archs do not define a weaker ++ CAS. */ ++# define atomic_compare_exchange_weak_relaxed(mem, expected, desired) \ ++ atomic_compare_exchange_weak_acquire ((mem), (expected), (desired)) ++# endif ++# ifndef atomic_compare_exchange_weak_release ++# define atomic_compare_exchange_weak_release(mem, expected, desired) \ ++ ({ typeof (*(expected)) __atg103_expected = *(expected); \ ++ *(expected) = \ ++ atomic_compare_and_exchange_val_rel ((mem), (desired), *(expected)); \ ++ *(expected) == __atg103_expected; }) ++# endif ++ ++# ifndef atomic_exchange_acquire ++# define atomic_exchange_acquire(mem, val) \ ++ atomic_exchange_acq ((mem), (val)) ++# endif ++# ifndef atomic_exchange_release ++# define atomic_exchange_release(mem, val) \ ++ atomic_exchange_rel ((mem), (val)) ++# endif ++ ++# ifndef atomic_fetch_add_acquire ++# define atomic_fetch_add_acquire(mem, operand) \ ++ atomic_exchange_and_add_acq ((mem), (operand)) ++# endif ++# ifndef atomic_fetch_add_relaxed ++/* XXX Fall back to acquire MO because the MO semantics of ++ atomic_exchange_and_add are not documented; the generic version falls back ++ to atomic_exchange_and_add_acq if atomic_exchange_and_add is not defined, ++ and vice versa. */ ++# define atomic_fetch_add_relaxed(mem, operand) \ ++ atomic_fetch_add_acquire ((mem), (operand)) ++# endif ++# ifndef atomic_fetch_add_release ++# define atomic_fetch_add_release(mem, operand) \ ++ atomic_exchange_and_add_rel ((mem), (operand)) ++# endif ++# ifndef atomic_fetch_add_acq_rel ++# define atomic_fetch_add_acq_rel(mem, operand) \ ++ ({ atomic_thread_fence_release (); \ ++ atomic_exchange_and_add_acq ((mem), (operand)); }) ++# endif ++ ++/* XXX The default for atomic_and_val has acquire semantics, but this is not ++ documented. */ ++# ifndef atomic_fetch_and_acquire ++# define atomic_fetch_and_acquire(mem, operand) \ ++ atomic_and_val ((mem), (operand)) ++# endif ++ ++/* XXX The default for atomic_or_val has acquire semantics, but this is not ++ documented. */ ++# ifndef atomic_fetch_or_acquire ++# define atomic_fetch_or_acquire(mem, operand) \ ++ atomic_or_val ((mem), (operand)) ++# endif ++/* XXX Fall back to acquire MO because archs do not define a weaker ++ atomic_or_val. */ ++# ifndef atomic_fetch_or_relaxed ++# define atomic_fetch_or_relaxed(mem, operand) \ ++ atomic_fetch_or_acquire ((mem), (operand)) ++# endif ++ ++#endif /* !USE_ATOMIC_COMPILER_BUILTINS */ ++ + + #ifndef atomic_delay + # define atomic_delay() do { /* nothing */ } while (0) diff --git a/SOURCES/glibc-rh1027348-3.patch b/SOURCES/glibc-rh1027348-3.patch new file mode 100644 index 0000000..b2040fe --- /dev/null +++ b/SOURCES/glibc-rh1027348-3.patch @@ -0,0 +1,144 @@ +commit 88ed594f5d431d855256edbe7e886c8cf4b575dc +Author: Roland McGrath +Date: Tue May 19 15:04:41 2015 -0700 + + BZ#18434: Fix sem_post EOVERFLOW check for [!__HAVE_64B_ATOMICS]. + +Index: glibc-2.17-c758a686/nptl/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/Makefile ++++ glibc-2.17-c758a686/nptl/Makefile +@@ -224,6 +224,7 @@ tests = tst-typesizes \ + tst-key1 tst-key2 tst-key3 tst-key4 \ + tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \ + tst-sem8 tst-sem9 tst-sem10 tst-sem11 tst-sem12 tst-sem13 tst-sem14 \ ++ tst-sem15 \ + tst-barrier1 tst-barrier2 tst-barrier3 tst-barrier4 \ + tst-align tst-align2 tst-align3 \ + tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \ +Index: glibc-2.17-c758a686/nptl/tst-sem15.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/nptl/tst-sem15.c +@@ -0,0 +1,99 @@ ++/* Test for SEM_VALUE_MAX overflow detection: BZ #18434. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++static int ++do_test (void) ++{ ++ sem_t s; ++ ++ if (sem_init (&s, 0, SEM_VALUE_MAX)) ++ { ++ printf ("sem_init: %m\n"); ++ return 1; ++ } ++ ++ int result = 0; ++ ++ int value = 0xdeadbeef; ++ if (sem_getvalue (&s, &value)) ++ { ++ printf ("sem_getvalue: %m\n"); ++ result = 1; ++ } ++ else ++ { ++ printf ("sem_getvalue after init: %d\n", value); ++ if (value != SEM_VALUE_MAX) ++ { ++ printf ("\tshould be %d\n", SEM_VALUE_MAX); ++ result = 1; ++ } ++ } ++ ++ errno = 0; ++ if (sem_post(&s) == 0) ++ { ++ puts ("sem_post at SEM_VALUE_MAX succeeded!"); ++ result = 1; ++ } ++ else ++ { ++ printf ("sem_post at SEM_VALUE_MAX: %m (%d)\n", errno); ++ if (errno != EOVERFLOW) ++ { ++ printf ("\tshould be %s (EOVERFLOW = %d)\n", ++ strerror (EOVERFLOW), EOVERFLOW); ++ result = 1; ++ } ++ } ++ ++ value = 0xbad1d00d; ++ if (sem_getvalue (&s, &value)) ++ { ++ printf ("sem_getvalue: %m\n"); ++ result = 1; ++ } ++ else ++ { ++ printf ("sem_getvalue after post: %d\n", value); ++ if (value != SEM_VALUE_MAX) ++ { ++ printf ("\tshould be %d\n", SEM_VALUE_MAX); ++ result = 1; ++ } ++ } ++ ++ if (sem_destroy (&s)) ++ { ++ printf ("sem_destroy: %m\n"); ++ result = 1; ++ } ++ ++ return result; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_post.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sem_post.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_post.c +@@ -83,14 +83,14 @@ __new_sem_post (sem_t *sem) + unsigned int v = atomic_load_relaxed (&isem->value); + do + { +- if ((v << SEM_VALUE_SHIFT) == SEM_VALUE_MAX) ++ if ((v >> SEM_VALUE_SHIFT) == SEM_VALUE_MAX) + { + __set_errno (EOVERFLOW); + return -1; + } + } +- while (!atomic_compare_exchange_weak_release (&isem->value, +- &v, v + (1 << SEM_VALUE_SHIFT))); ++ while (!atomic_compare_exchange_weak_release ++ (&isem->value, &v, v + (1 << SEM_VALUE_SHIFT))); + + /* If there is any potentially blocked waiter, wake one of them. */ + if ((v & SEM_NWAITERS_MASK) != 0) diff --git a/SOURCES/glibc-rh1027348-4.patch b/SOURCES/glibc-rh1027348-4.patch new file mode 100644 index 0000000..27f6115 --- /dev/null +++ b/SOURCES/glibc-rh1027348-4.patch @@ -0,0 +1,105 @@ +commit c2f5813ae0a68f6c6d69e66dac2da6e46b9df034 +Author: Joseph Myers +Date: Wed Mar 18 17:05:38 2015 +0000 + + Make sem_timedwait use FUTEX_CLOCK_REALTIME (bug 18138). + + sem_timedwait converts absolute timeouts to relative to pass them to + the futex syscall. (Before the recent reimplementation, on x86_64 it + used FUTEX_CLOCK_REALTIME, but not on other architectures.) + + Correctly implementing POSIX requirements, however, requires use of + FUTEX_CLOCK_REALTIME; passing a relative timeout to the kernel does + not conform to POSIX. The POSIX specification for sem_timedwait says + "The timeout shall be based on the CLOCK_REALTIME clock.". The POSIX + specification for clock_settime says "If the value of the + CLOCK_REALTIME clock is set via clock_settime(), the new value of the + clock shall be used to determine the time of expiration for absolute + time services based upon the CLOCK_REALTIME clock. This applies to the + time at which armed absolute timers expire. If the absolute time + requested at the invocation of such a time service is before the new + value of the clock, the time service shall expire immediately as if + the clock had reached the requested time normally.". If a relative + timeout is passed to the kernel, it is interpreted according to the + CLOCK_MONOTONIC clock, and so fails to meet that POSIX requirement in + the event of clock changes. + + This patch makes sem_timedwait use lll_futex_timed_wait_bitset with + FUTEX_CLOCK_REALTIME when possible, as done in some other places in + NPTL. FUTEX_CLOCK_REALTIME is always available for supported Linux + kernel versions; unavailability of lll_futex_timed_wait_bitset is only + an issue for hppa (an issue noted in + , and fixed by the + unreviewed + that + removes the hppa lowlevellock.h completely). + + In the FUTEX_CLOCK_REALTIME case, the glibc code still needs to check + for negative tv_sec and handle that as timeout, because the Linux + kernel returns EINVAL not ETIMEDOUT for that case, so resulting in + failures of nptl/tst-abstime and nptl/tst-sem13 in the absence of that + check. If we're trying to distinguish between Linux-specific and + generic-futex NPTL code, I suppose having this in an nptl/ file isn't + ideal, but there doesn't seem to be any better place at present. + + It's not possible to add a testcase for this issue to the testsuite + because of the requirement to change the system clock as part of a + test (this is a case where testing would require some form of + container, with root in that container, and one whose CLOCK_REALTIME + is isolated from that of the host; I'm not sure what forms of + containers, short of a full virtual machine, provide that clock + isolation). + + Tested for x86_64. Also tested for powerpc with the testcase included + in the bug. + + [BZ #18138] + * nptl/sem_waitcommon.c: Include . + (futex_abstimed_wait) + [__ASSUME_FUTEX_CLOCK_REALTIME && lll_futex_timed_wait_bitset]: + Use lll_futex_timed_wait_bitset with FUTEX_CLOCK_REALTIME instead + of lll_futex_timed_wait. + +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c +@@ -17,6 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + ++#include + #include + #include + #include +@@ -45,6 +46,13 @@ futex_abstimed_wait (unsigned int* futex + } + else + { ++#if (defined __ASSUME_FUTEX_CLOCK_REALTIME \ ++ && defined lll_futex_timed_wait_bitset) ++ /* The Linux kernel returns EINVAL for this, but in userspace ++ such a value is valid. */ ++ if (abstime->tv_sec < 0) ++ return ETIMEDOUT; ++#else + struct timeval tv; + struct timespec rt; + int sec, nsec; +@@ -68,9 +76,16 @@ futex_abstimed_wait (unsigned int* futex + /* Do wait. */ + rt.tv_sec = sec; + rt.tv_nsec = nsec; ++#endif + if (cancel) + oldtype = __pthread_enable_asynccancel (); ++#if (defined __ASSUME_FUTEX_CLOCK_REALTIME \ ++ && defined lll_futex_timed_wait_bitset) ++ err = lll_futex_timed_wait_bitset (futex, expected, abstime, ++ FUTEX_CLOCK_REALTIME, private); ++#else + err = lll_futex_timed_wait (futex, expected, &rt, private); ++#endif + if (cancel) + __pthread_disable_asynccancel (oldtype); + } diff --git a/SOURCES/glibc-rh1027348.patch b/SOURCES/glibc-rh1027348.patch new file mode 100644 index 0000000..4aca8a2 --- /dev/null +++ b/SOURCES/glibc-rh1027348.patch @@ -0,0 +1,3917 @@ +Torvald Riegel's semaphore reimplemenation to fix upstream swbz#12674. + +commit 042e1521c794a945edc43b5bfa7e69ad70420524 +Author: Carlos O'Donell +Date: Wed Jan 21 00:46:16 2015 -0500 + + Fix semaphore destruction (bug 12674). + + This commit fixes semaphore destruction by either using 64b atomic + operations (where available), or by using two separate fields when only + 32b atomic operations are available. In the latter case, we keep a + conservative estimate of whether there are any waiting threads in one + bit of the field that counts the number of available tokens, thus + allowing sem_post to atomically both add a token and determine whether + it needs to call futex_wake. + + See: + https://sourceware.org/ml/libc-alpha/2014-12/msg00155.html + +Notes: +* For x86_64 and i686, rather than movign to the generic lll_futex_wake + we fix the existing versions to return the syscall result and to be + usable as an R-value. +* We also backport fixes for swbz#18434, and swbz#18138. +* We ignore swbz#17870 because it applies only to x32. + +Index: glibc-2.17-c758a686/nptl/DESIGN-sem.txt +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/DESIGN-sem.txt ++++ /dev/null +@@ -1,46 +0,0 @@ +-Semaphores pseudocode +-============================== +- +- int sem_wait(sem_t * sem); +- int sem_trywait(sem_t * sem); +- int sem_post(sem_t * sem); +- int sem_getvalue(sem_t * sem, int * sval); +- +-struct sem_t { +- +- unsigned int count; +- - current semaphore count, also used as a futex +-} +- +-sem_wait(sem_t *sem) +-{ +- for (;;) { +- +- if (atomic_decrement_if_positive(sem->count)) +- break; +- +- futex_wait(&sem->count, 0) +- } +-} +- +-sem_post(sem_t *sem) +-{ +- n = atomic_increment(sem->count); +- // Pass the new value of sem->count +- futex_wake(&sem->count, n + 1); +-} +- +-sem_trywait(sem_t *sem) +-{ +- if (atomic_decrement_if_positive(sem->count)) { +- return 0; +- } else { +- return EAGAIN; +- } +-} +- +-sem_getvalue(sem_t *sem, int *sval) +-{ +- *sval = sem->count; +- read_barrier(); +-} +Index: glibc-2.17-c758a686/nptl/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/Makefile ++++ glibc-2.17-c758a686/nptl/Makefile +@@ -95,7 +95,7 @@ libpthread-routines = nptl-init vars eve + sem_init sem_destroy \ + sem_open sem_close sem_unlink \ + sem_getvalue \ +- sem_wait sem_trywait sem_timedwait sem_post \ ++ sem_wait sem_timedwait sem_post \ + cleanup cleanup_defer cleanup_compat \ + cleanup_defer_compat unwind \ + pt-longjmp pt-cleanup\ +Index: glibc-2.17-c758a686/nptl/sem_getvalue.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sem_getvalue.c ++++ glibc-2.17-c758a686/nptl/sem_getvalue.c +@@ -19,23 +19,37 @@ + #include + #include + #include "semaphoreP.h" ++#include + + + int +-__new_sem_getvalue (sem, sval) +- sem_t *sem; +- int *sval; ++__new_sem_getvalue (sem_t *sem, int *sval) + { + struct new_sem *isem = (struct new_sem *) sem; + + /* XXX Check for valid SEM parameter. */ ++ /* FIXME This uses relaxed MO, even though POSIX specifies that this function ++ should be linearizable. However, its debatable whether linearizability ++ is the right requirement. We need to follow up with POSIX and, if ++ necessary, use a stronger MO here and elsewhere (e.g., potentially ++ release MO in all places where we consume a token). */ + +- *sval = isem->value; ++#if __HAVE_64B_ATOMICS ++ *sval = atomic_load_relaxed (&isem->data) & SEM_VALUE_MASK; ++#else ++ *sval = atomic_load_relaxed (&isem->value) >> SEM_VALUE_SHIFT; ++#endif + + return 0; + } + versioned_symbol (libpthread, __new_sem_getvalue, sem_getvalue, GLIBC_2_1); + #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) +-strong_alias (__new_sem_getvalue, __old_sem_getvalue) ++int ++__old_sem_getvalue (sem_t *sem, int *sval) ++{ ++ struct old_sem *isem = (struct old_sem *) sem; ++ *sval = isem->value; ++ return 0; ++} + compat_symbol (libpthread, __old_sem_getvalue, sem_getvalue, GLIBC_2_0); + #endif +Index: glibc-2.17-c758a686/nptl/sem_init.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sem_init.c ++++ glibc-2.17-c758a686/nptl/sem_init.c +@@ -18,17 +18,28 @@ + + #include + #include +-#include + #include + #include "semaphoreP.h" + #include + ++/* Returns FUTEX_PRIVATE if pshared is zero and private futexes are supported; ++ returns FUTEX_SHARED otherwise. ++ TODO Remove when cleaning up the futex API throughout glibc. */ ++static __always_inline int ++futex_private_if_supported (int pshared) ++{ ++ if (pshared != 0) ++ return LLL_SHARED; ++#ifdef __ASSUME_PRIVATE_FUTEX ++ return LLL_PRIVATE; ++#else ++ return THREAD_GETMEM (THREAD_SELF, header.private_futex) ++ ^ FUTEX_PRIVATE_FLAG; ++#endif ++} + + int +-__new_sem_init (sem, pshared, value) +- sem_t *sem; +- int pshared; +- unsigned int value; ++__new_sem_init (sem_t *sem, int pshared, unsigned int value) + { + /* Parameter sanity check. */ + if (__builtin_expect (value > SEM_VALUE_MAX, 0)) +@@ -40,16 +51,15 @@ __new_sem_init (sem, pshared, value) + /* Map to the internal type. */ + struct new_sem *isem = (struct new_sem *) sem; + +- /* Use the values the user provided. */ +- isem->value = value; +-#ifdef __ASSUME_PRIVATE_FUTEX +- isem->private = pshared ? 0 : FUTEX_PRIVATE_FLAG; ++ /* Use the values the caller provided. */ ++#if __HAVE_64B_ATOMICS ++ isem->data = value; + #else +- isem->private = pshared ? 0 : THREAD_GETMEM (THREAD_SELF, +- header.private_futex); ++ isem->value = value << SEM_VALUE_SHIFT; ++ isem->nwaiters = 0; + #endif + +- isem->nwaiters = 0; ++ isem->private = futex_private_if_supported (pshared); + + return 0; + } +Index: glibc-2.17-c758a686/nptl/sem_open.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sem_open.c ++++ glibc-2.17-c758a686/nptl/sem_open.c +@@ -307,9 +307,14 @@ sem_open (const char *name, int oflag, . + struct new_sem newsem; + } sem; + +- sem.newsem.value = value; +- sem.newsem.private = 0; ++#if __HAVE_64B_ATOMICS ++ sem.newsem.data = value; ++#else ++ sem.newsem.value = value << SEM_VALUE_SHIFT; + sem.newsem.nwaiters = 0; ++#endif ++ /* This always is a shared semaphore. */ ++ sem.newsem.private = LLL_SHARED; + + /* Initialize the remaining bytes as well. */ + memset ((char *) &sem.initsem + sizeof (struct new_sem), '\0', +Index: glibc-2.17-c758a686/nptl/tst-sem11.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/tst-sem11.c ++++ glibc-2.17-c758a686/nptl/tst-sem11.c +@@ -34,8 +34,11 @@ main (void) + puts ("sem_init failed"); + return 1; + } +- ++#if __HAVE_64B_ATOMICS ++ if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0) ++#else + if (u.ns.nwaiters != 0) ++#endif + { + puts ("nwaiters not initialized"); + return 1; +@@ -68,7 +71,11 @@ main (void) + goto again; + } + ++#if __HAVE_64B_ATOMICS ++ if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0) ++#else + if (u.ns.nwaiters != 0) ++#endif + { + puts ("nwaiters not reset"); + return 1; +Index: glibc-2.17-c758a686/nptl/tst-sem13.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/tst-sem13.c ++++ glibc-2.17-c758a686/nptl/tst-sem13.c +@@ -33,9 +33,14 @@ do_test (void) + perror ("sem_timedwait did not fail with EINVAL"); + return 1; + } +- if (u.ns.nwaiters != 0) ++#if __HAVE_64B_ATOMICS ++ unsigned int nwaiters = (u.ns.data >> SEM_NWAITERS_SHIFT); ++#else ++ unsigned int nwaiters = u.ns.nwaiters; ++#endif ++ if (nwaiters != 0) + { +- printf ("sem_timedwait modified nwaiters: %ld\n", u.ns.nwaiters); ++ printf ("sem_timedwait modified nwaiters: %d\n", nwaiters); + return 1; + } + +@@ -52,9 +57,14 @@ do_test (void) + perror ("2nd sem_timedwait did not fail with ETIMEDOUT"); + return 1; + } +- if (u.ns.nwaiters != 0) ++#if __HAVE_64B_ATOMICS ++ nwaiters = (u.ns.data >> SEM_NWAITERS_SHIFT); ++#else ++ nwaiters = u.ns.nwaiters; ++#endif ++ if (nwaiters != 0) + { +- printf ("2nd sem_timedwait modified nwaiters: %ld\n", u.ns.nwaiters); ++ printf ("2nd sem_timedwait modified nwaiters: %d\n", nwaiters); + return 1; + } + +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S ++++ /dev/null +@@ -1,151 +0,0 @@ +-/* Copyright (C) 2002,2003,2005,2007,2008,2011-2012 +- Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +- +- +- .text +- +- .globl __new_sem_post +- .type __new_sem_post,@function +- .align 16 +-__new_sem_post: +- cfi_startproc +- pushl %ebx +- cfi_adjust_cfa_offset(4) +- cfi_offset(%ebx, -8) +- +- movl 8(%esp), %ebx +- +-#if VALUE == 0 +- movl (%ebx), %eax +-#else +- movl VALUE(%ebx), %eax +-#endif +-0: cmpl $SEM_VALUE_MAX, %eax +- je 3f +- leal 1(%eax), %edx +- LOCK +-#if VALUE == 0 +- cmpxchgl %edx, (%ebx) +-#else +- cmpxchgl %edx, VALUE(%ebx) +-#endif +- jnz 0b +- +- cmpl $0, NWAITERS(%ebx) +- je 2f +- +- movl $FUTEX_WAKE, %ecx +- orl PRIVATE(%ebx), %ecx +- movl $1, %edx +- movl $SYS_futex, %eax +- ENTER_KERNEL +- +- testl %eax, %eax +- js 1f +- +-2: xorl %eax, %eax +- popl %ebx +- cfi_adjust_cfa_offset(-4) +- cfi_restore(%ebx) +- ret +- +- cfi_adjust_cfa_offset(4) +- cfi_offset(%ebx, -8) +-1: +-#ifdef PIC +- SETUP_PIC_REG(bx) +-#else +- movl $4f, %ebx +-4: +-#endif +- addl $_GLOBAL_OFFSET_TABLE_, %ebx +-#ifdef NO_TLS_DIRECT_SEG_REFS +- movl errno@gotntpoff(%ebx), %edx +- addl %gs:0, %edx +- movl $EINVAL, (%edx) +-#else +- movl errno@gotntpoff(%ebx), %edx +- movl $EINVAL, %gs:(%edx) +-#endif +- +- orl $-1, %eax +- popl %ebx +- ret +- +-3: +-#ifdef PIC +- SETUP_PIC_REG(bx) +-#else +- movl $5f, %ebx +-5: +-#endif +- addl $_GLOBAL_OFFSET_TABLE_, %ebx +-#ifdef NO_TLS_DIRECT_SEG_REFS +- movl errno@gotntpoff(%ebx), %edx +- addl %gs:0, %edx +- movl $EOVERFLOW, (%edx) +-#else +- movl errno@gotntpoff(%ebx), %edx +- movl $EOVERFLOW, %gs:(%edx) +-#endif +- +- orl $-1, %eax +- popl %ebx +- cfi_adjust_cfa_offset(-4) +- cfi_restore(%ebx) +- ret +- cfi_endproc +- .size __new_sem_post,.-__new_sem_post +- versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1) +-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) +- .global __old_sem_post +- .type __old_sem_post,@function +-__old_sem_post: +- cfi_startproc +- pushl %ebx +- cfi_adjust_cfa_offset(4) +- cfi_offset(%ebx, -8) +- +- movl 8(%esp), %ebx +- LOCK +- addl $1, (%ebx) +- +- movl $SYS_futex, %eax +- movl $FUTEX_WAKE, %ecx +- movl $1, %edx +- ENTER_KERNEL +- +- testl %eax, %eax +- js 1b +- +- xorl %eax, %eax +- popl %ebx +- cfi_adjust_cfa_offset(-4) +- cfi_restore(%ebx) +- ret +- cfi_endproc +- .size __old_sem_post,.-__old_sem_post +- compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0) +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S ++++ /dev/null +@@ -1,327 +0,0 @@ +-/* Copyright (C) 2002-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +- +- +-#if VALUE != 0 +-# error "code needs to be rewritten for VALUE != 0" +-#endif +- +- +- .text +- +- .globl sem_timedwait +- .type sem_timedwait,@function +- .align 16 +-sem_timedwait: +-.LSTARTCODE: +- movl 4(%esp), %ecx +- +- movl (%ecx), %eax +-2: testl %eax, %eax +- je 1f +- +- leal -1(%eax), %edx +- LOCK +- cmpxchgl %edx, (%ecx) +- jne 2b +- +- xorl %eax, %eax +- ret +- +- /* Check whether the timeout value is valid. */ +-1: pushl %esi +-.Lpush_esi: +- pushl %edi +-.Lpush_edi: +- pushl %ebx +-.Lpush_ebx: +- subl $12, %esp +-.Lsub_esp: +- +- movl 32(%esp), %edi +- +- /* Check for invalid nanosecond field. */ +- cmpl $1000000000, 4(%edi) +- movl $EINVAL, %esi +- jae .Lerrno_exit +- +- LOCK +- incl NWAITERS(%ecx) +- +-7: xorl %ecx, %ecx +- movl %esp, %ebx +- movl %ecx, %edx +- movl $__NR_gettimeofday, %eax +- ENTER_KERNEL +- +- /* Compute relative timeout. */ +- movl 4(%esp), %eax +- movl $1000, %edx +- mul %edx /* Milli seconds to nano seconds. */ +- movl (%edi), %ecx +- movl 4(%edi), %edx +- subl (%esp), %ecx +- subl %eax, %edx +- jns 5f +- addl $1000000000, %edx +- subl $1, %ecx +-5: testl %ecx, %ecx +- movl $ETIMEDOUT, %esi +- js 6f /* Time is already up. */ +- +- movl %ecx, (%esp) /* Store relative timeout. */ +- movl %edx, 4(%esp) +- +-.LcleanupSTART: +- call __pthread_enable_asynccancel +- movl %eax, 8(%esp) +- +- movl 28(%esp), %ebx /* Load semaphore address. */ +-#if FUTEX_WAIT == 0 +- movl PRIVATE(%ebx), %ecx +-#else +- movl $FUTEX_WAIT, %ecx +- orl PRIVATE(%ebx), %ecx +-#endif +- movl %esp, %esi +- xorl %edx, %edx +- movl $SYS_futex, %eax +- ENTER_KERNEL +- movl %eax, %esi +- +- movl 8(%esp), %eax +- call __pthread_disable_asynccancel +-.LcleanupEND: +- +- testl %esi, %esi +- je 9f +- cmpl $-EWOULDBLOCK, %esi +- jne 3f +- +-9: movl (%ebx), %eax +-8: testl %eax, %eax +- je 7b +- +- leal -1(%eax), %ecx +- LOCK +- cmpxchgl %ecx, (%ebx) +- jne 8b +- +- xorl %eax, %eax +- +- LOCK +- decl NWAITERS(%ebx) +- +-10: addl $12, %esp +-.Ladd_esp: +- popl %ebx +-.Lpop_ebx: +- popl %edi +-.Lpop_edi: +- popl %esi +-.Lpop_esi: +- ret +- +-.Lafter_ret: +-3: negl %esi +-6: +- movl 28(%esp), %ebx /* Load semaphore address. */ +- LOCK +- decl NWAITERS(%ebx) +-.Lerrno_exit: +-#ifdef PIC +- SETUP_PIC_REG(bx) +-#else +- movl $4f, %ebx +-4: +-#endif +- addl $_GLOBAL_OFFSET_TABLE_, %ebx +-#ifdef NO_TLS_DIRECT_SEG_REFS +- movl errno@gotntpoff(%ebx), %edx +- addl %gs:0, %edx +- movl %esi, (%edx) +-#else +- movl errno@gotntpoff(%ebx), %edx +- movl %esi, %gs:(%edx) +-#endif +- +- orl $-1, %eax +- jmp 10b +- .size sem_timedwait,.-sem_timedwait +- +- +- .type sem_wait_cleanup,@function +-sem_wait_cleanup: +- LOCK +- decl NWAITERS(%ebx) +- movl %eax, (%esp) +-.LcallUR: +- call _Unwind_Resume@PLT +- hlt +-.LENDCODE: +- .size sem_wait_cleanup,.-sem_wait_cleanup +- +- +- .section .gcc_except_table,"a",@progbits +-.LexceptSTART: +- .byte 0xff # @LPStart format (omit) +- .byte 0xff # @TType format (omit) +- .byte 0x01 # call-site format +- # DW_EH_PE_uleb128 +- .uleb128 .Lcstend-.Lcstbegin +-.Lcstbegin: +- .uleb128 .LcleanupSTART-.LSTARTCODE +- .uleb128 .LcleanupEND-.LcleanupSTART +- .uleb128 sem_wait_cleanup-.LSTARTCODE +- .uleb128 0 +- .uleb128 .LcallUR-.LSTARTCODE +- .uleb128 .LENDCODE-.LcallUR +- .uleb128 0 +- .uleb128 0 +-.Lcstend: +- +- +- .section .eh_frame,"a",@progbits +-.LSTARTFRAME: +- .long .LENDCIE-.LSTARTCIE # Length of the CIE. +-.LSTARTCIE: +- .long 0 # CIE ID. +- .byte 1 # Version number. +-#ifdef SHARED +- .string "zPLR" # NUL-terminated augmentation +- # string. +-#else +- .string "zPL" # NUL-terminated augmentation +- # string. +-#endif +- .uleb128 1 # Code alignment factor. +- .sleb128 -4 # Data alignment factor. +- .byte 8 # Return address register +- # column. +-#ifdef SHARED +- .uleb128 7 # Augmentation value length. +- .byte 0x9b # Personality: DW_EH_PE_pcrel +- # + DW_EH_PE_sdata4 +- # + DW_EH_PE_indirect +- .long DW.ref.__gcc_personality_v0-. +- .byte 0x1b # LSDA Encoding: DW_EH_PE_pcrel +- # + DW_EH_PE_sdata4. +- .byte 0x1b # FDE Encoding: DW_EH_PE_pcrel +- # + DW_EH_PE_sdata4. +-#else +- .uleb128 6 # Augmentation value length. +- .byte 0x0 # Personality: absolute +- .long __gcc_personality_v0 +- .byte 0x0 # LSDA Encoding: absolute +-#endif +- .byte 0x0c # DW_CFA_def_cfa +- .uleb128 4 +- .uleb128 4 +- .byte 0x88 # DW_CFA_offset, column 0x10 +- .uleb128 1 +- .align 4 +-.LENDCIE: +- +- .long .LENDFDE-.LSTARTFDE # Length of the FDE. +-.LSTARTFDE: +- .long .LSTARTFDE-.LSTARTFRAME # CIE pointer. +-#ifdef SHARED +- .long .LSTARTCODE-. # PC-relative start address +- # of the code. +-#else +- .long .LSTARTCODE # Start address of the code. +-#endif +- .long .LENDCODE-.LSTARTCODE # Length of the code. +- .uleb128 4 # Augmentation size +-#ifdef SHARED +- .long .LexceptSTART-. +-#else +- .long .LexceptSTART +-#endif +- +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpush_esi-.LSTARTCODE +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 8 +- .byte 0x86 # DW_CFA_offset %esi +- .uleb128 2 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpush_edi-.Lpush_esi +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 12 +- .byte 0x87 # DW_CFA_offset %edi +- .uleb128 3 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpush_ebx-.Lpush_edi +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 16 +- .byte 0x83 # DW_CFA_offset %ebx +- .uleb128 4 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lsub_esp-.Lpush_ebx +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 28 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Ladd_esp-.Lsub_esp +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 16 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpop_ebx-.Ladd_esp +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 12 +- .byte 0xc3 # DW_CFA_restore %ebx +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpop_edi-.Lpop_ebx +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 8 +- .byte 0xc7 # DW_CFA_restore %edi +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpop_esi-.Lpop_edi +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 4 +- .byte 0xc6 # DW_CFA_restore %esi +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lafter_ret-.Lpop_esi +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 28 +- .byte 0x86 # DW_CFA_offset %esi +- .uleb128 2 +- .byte 0x87 # DW_CFA_offset %edi +- .uleb128 3 +- .byte 0x83 # DW_CFA_offset %ebx +- .uleb128 4 +- .align 4 +-.LENDFDE: +- +- +-#ifdef SHARED +- .hidden DW.ref.__gcc_personality_v0 +- .weak DW.ref.__gcc_personality_v0 +- .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits +- .align 4 +- .type DW.ref.__gcc_personality_v0, @object +- .size DW.ref.__gcc_personality_v0, 4 +-DW.ref.__gcc_personality_v0: +- .long __gcc_personality_v0 +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S ++++ /dev/null +@@ -1,67 +0,0 @@ +-/* Copyright (C) 2002-2003, 2005, 2007, 2011-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +- +- .text +- +- .globl __new_sem_trywait +- .type __new_sem_trywait,@function +- .align 16 +-__new_sem_trywait: +- movl 4(%esp), %ecx +- +- movl (%ecx), %eax +-2: testl %eax, %eax +- jz 1f +- +- leal -1(%eax), %edx +- LOCK +- cmpxchgl %edx, (%ecx) +- jne 2b +- xorl %eax, %eax +- ret +- +-1: +-#ifdef PIC +- SETUP_PIC_REG(cx) +-#else +- movl $3f, %ecx +-3: +-#endif +- addl $_GLOBAL_OFFSET_TABLE_, %ecx +-#ifdef NO_TLS_DIRECT_SEG_REFS +- movl errno@gotntpoff(%ecx), %edx +- addl %gs:0, %edx +- movl $EAGAIN, (%edx) +-#else +- movl errno@gotntpoff(%ecx), %edx +- movl $EAGAIN, %gs:(%edx) +-#endif +- orl $-1, %eax +- ret +- .size __new_sem_trywait,.-__new_sem_trywait +- versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1) +-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) +- .global __old_sem_trywait +-__old_sem_trywait = __new_sem_trywait +- compat_symbol(libpthread, __old_sem_trywait, sem_trywait, GLIBC_2_0) +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S ++++ /dev/null +@@ -1,343 +0,0 @@ +-/* Copyright (C) 2002-2003, 2005, 2007, 2011-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +- +- +-#if VALUE != 0 +-# error "code needs to be rewritten for VALUE != 0" +-#endif +- +- .text +- +- .globl __new_sem_wait +- .type __new_sem_wait,@function +- .align 16 +-__new_sem_wait: +-.LSTARTCODE: +- pushl %ebx +-.Lpush_ebx: +- pushl %esi +-.Lpush_esi: +- subl $4, %esp +-.Lsub_esp: +- +- movl 16(%esp), %ebx +- +- movl (%ebx), %eax +-2: testl %eax, %eax +- je 1f +- +- leal -1(%eax), %edx +- LOCK +- cmpxchgl %edx, (%ebx) +- jne 2b +-7: xorl %eax, %eax +- +-9: movl 4(%esp), %esi +- movl 8(%esp), %ebx +- addl $12, %esp +-.Ladd_esp: +- ret +- +-.Lafter_ret: +-1: LOCK +- incl NWAITERS(%ebx) +- +-.LcleanupSTART: +-6: call __pthread_enable_asynccancel +- movl %eax, (%esp) +- +-#if FUTEX_WAIT == 0 +- movl PRIVATE(%ebx), %ecx +-#else +- movl $FUTEX_WAIT, %ecx +- orl PRIVATE(%ebx), %ecx +-#endif +- xorl %esi, %esi +- xorl %edx, %edx +- movl $SYS_futex, %eax +- ENTER_KERNEL +- movl %eax, %esi +- +- movl (%esp), %eax +- call __pthread_disable_asynccancel +-.LcleanupEND: +- +- testl %esi, %esi +- je 3f +- cmpl $-EWOULDBLOCK, %esi +- jne 4f +- +-3: +- movl (%ebx), %eax +-5: testl %eax, %eax +- je 6b +- +- leal -1(%eax), %edx +- LOCK +- cmpxchgl %edx, (%ebx) +- jne 5b +- +- LOCK +- decl NWAITERS(%ebx) +- jmp 7b +- +-4: LOCK +- decl NWAITERS(%ebx) +- +- negl %esi +-#ifdef PIC +- SETUP_PIC_REG(bx) +-#else +- movl $8f, %ebx +-8: +-#endif +- addl $_GLOBAL_OFFSET_TABLE_, %ebx +-#ifdef NO_TLS_DIRECT_SEG_REFS +- movl errno@gotntpoff(%ebx), %edx +- addl %gs:0, %edx +- movl %esi, (%edx) +-#else +- movl errno@gotntpoff(%ebx), %edx +- movl %esi, %gs:(%edx) +-#endif +- orl $-1, %eax +- +- jmp 9b +- .size __new_sem_wait,.-__new_sem_wait +- versioned_symbol(libpthread, __new_sem_wait, sem_wait, GLIBC_2_1) +- +- +- .type sem_wait_cleanup,@function +-sem_wait_cleanup: +- LOCK +- decl NWAITERS(%ebx) +- movl %eax, (%esp) +-.LcallUR: +- call _Unwind_Resume@PLT +- hlt +-.LENDCODE: +- .size sem_wait_cleanup,.-sem_wait_cleanup +- +- +- .section .gcc_except_table,"a",@progbits +-.LexceptSTART: +- .byte 0xff # @LPStart format (omit) +- .byte 0xff # @TType format (omit) +- .byte 0x01 # call-site format +- # DW_EH_PE_uleb128 +- .uleb128 .Lcstend-.Lcstbegin +-.Lcstbegin: +- .uleb128 .LcleanupSTART-.LSTARTCODE +- .uleb128 .LcleanupEND-.LcleanupSTART +- .uleb128 sem_wait_cleanup-.LSTARTCODE +- .uleb128 0 +- .uleb128 .LcallUR-.LSTARTCODE +- .uleb128 .LENDCODE-.LcallUR +- .uleb128 0 +- .uleb128 0 +-.Lcstend: +- +- +- .section .eh_frame,"a",@progbits +-.LSTARTFRAME: +- .long .LENDCIE-.LSTARTCIE # Length of the CIE. +-.LSTARTCIE: +- .long 0 # CIE ID. +- .byte 1 # Version number. +-#ifdef SHARED +- .string "zPLR" # NUL-terminated augmentation +- # string. +-#else +- .string "zPL" # NUL-terminated augmentation +- # string. +-#endif +- .uleb128 1 # Code alignment factor. +- .sleb128 -4 # Data alignment factor. +- .byte 8 # Return address register +- # column. +-#ifdef SHARED +- .uleb128 7 # Augmentation value length. +- .byte 0x9b # Personality: DW_EH_PE_pcrel +- # + DW_EH_PE_sdata4 +- # + DW_EH_PE_indirect +- .long DW.ref.__gcc_personality_v0-. +- .byte 0x1b # LSDA Encoding: DW_EH_PE_pcrel +- # + DW_EH_PE_sdata4. +- .byte 0x1b # FDE Encoding: DW_EH_PE_pcrel +- # + DW_EH_PE_sdata4. +-#else +- .uleb128 6 # Augmentation value length. +- .byte 0x0 # Personality: absolute +- .long __gcc_personality_v0 +- .byte 0x0 # LSDA Encoding: absolute +-#endif +- .byte 0x0c # DW_CFA_def_cfa +- .uleb128 4 +- .uleb128 4 +- .byte 0x88 # DW_CFA_offset, column 0x10 +- .uleb128 1 +- .align 4 +-.LENDCIE: +- +- .long .LENDFDE-.LSTARTFDE # Length of the FDE. +-.LSTARTFDE: +- .long .LSTARTFDE-.LSTARTFRAME # CIE pointer. +-#ifdef SHARED +- .long .LSTARTCODE-. # PC-relative start address +- # of the code. +-#else +- .long .LSTARTCODE # Start address of the code. +-#endif +- .long .LENDCODE-.LSTARTCODE # Length of the code. +- .uleb128 4 # Augmentation size +-#ifdef SHARED +- .long .LexceptSTART-. +-#else +- .long .LexceptSTART +-#endif +- +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpush_ebx-.LSTARTCODE +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 8 +- .byte 0x83 # DW_CFA_offset %ebx +- .uleb128 2 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lpush_esi-.Lpush_ebx +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 12 +- .byte 0x86 # DW_CFA_offset %esi +- .uleb128 3 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lsub_esp-.Lpush_esi +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 16 +- .byte 4 # DW_CFA_advance_loc4 +- .long .Ladd_esp-.Lsub_esp +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 4 +- .byte 0xc3 # DW_CFA_restore %ebx +- .byte 0xc6 # DW_CFA_restore %esi +- .byte 4 # DW_CFA_advance_loc4 +- .long .Lafter_ret-.Ladd_esp +- .byte 14 # DW_CFA_def_cfa_offset +- .uleb128 16 +- .byte 0x83 # DW_CFA_offset %ebx +- .uleb128 2 +- .byte 0x86 # DW_CFA_offset %esi +- .uleb128 3 +- .align 4 +-.LENDFDE: +- +- +-#ifdef SHARED +- .hidden DW.ref.__gcc_personality_v0 +- .weak DW.ref.__gcc_personality_v0 +- .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits +- .align 4 +- .type DW.ref.__gcc_personality_v0, @object +- .size DW.ref.__gcc_personality_v0, 4 +-DW.ref.__gcc_personality_v0: +- .long __gcc_personality_v0 +-#endif +- +- +-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) +- .section ".text.compat", "ax" +- .global __old_sem_wait +- .type __old_sem_wait,@function +- .align 16 +- cfi_startproc +-__old_sem_wait: +- pushl %ebx +- cfi_adjust_cfa_offset(4) +- pushl %esi +- cfi_adjust_cfa_offset(4) +- subl $4, %esp +- cfi_adjust_cfa_offset(4) +- +- movl 16(%esp), %ebx +- cfi_offset(ebx, -8) +- +- cfi_offset(esi, -12) +-3: movl (%ebx), %eax +-2: testl %eax, %eax +- je 1f +- +- leal -1(%eax), %edx +- LOCK +- cmpxchgl %edx, (%ebx) +- jne 2b +- xorl %eax, %eax +- +-5: movl 4(%esp), %esi +- movl 8(%esp), %ebx +- addl $12, %esp +- cfi_restore(ebx) +- cfi_restore(esi) +- cfi_adjust_cfa_offset(-12) +- ret +- +- cfi_adjust_cfa_offset(12) +- cfi_offset(ebx, -8) +- cfi_offset(esi, -12) +-1: call __pthread_enable_asynccancel +- movl %eax, (%esp) +- +- xorl %esi, %esi +- movl $SYS_futex, %eax +- movl %esi, %ecx +- movl %esi, %edx +- ENTER_KERNEL +- movl %eax, %esi +- +- movl (%esp), %eax +- call __pthread_disable_asynccancel +- +- testl %esi, %esi +- je 3b +- cmpl $-EWOULDBLOCK, %esi +- je 3b +- negl %esi +-#ifdef PIC +- SETUP_PIC_REG(bx) +-#else +- movl $4f, %ebx +-4: +-#endif +- addl $_GLOBAL_OFFSET_TABLE_, %ebx +-#ifdef NO_TLS_DIRECT_SEG_REFS +- movl errno@gotntpoff(%ebx), %edx +- addl %gs:0, %edx +- movl %esi, (%edx) +-#else +- movl errno@gotntpoff(%ebx), %edx +- movl %esi, %gs:(%edx) +-#endif +- orl $-1, %eax +- jmp 5b +- cfi_endproc +- .size __old_sem_wait,.-__old_sem_wait +- compat_symbol(libpthread, __old_sem_wait, sem_wait, GLIBC_2_0) +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_post.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_timedwait.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_trywait.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_wait.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_post.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_timedwait.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_trywait.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S ++++ /dev/null +@@ -1,19 +0,0 @@ +-/* Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include "../i486/sem_wait.S" +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/internaltypes.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/internaltypes.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/internaltypes.h +@@ -20,6 +20,8 @@ + #define _INTERNALTYPES_H 1 + + #include ++#include ++#include + + + struct pthread_attr +@@ -141,9 +143,29 @@ struct pthread_key_struct + /* Semaphore variable structure. */ + struct new_sem + { ++#if __HAVE_64B_ATOMICS ++ /* The data field holds both value (in the least-significant 32 bytes) and ++ nwaiters. */ ++# if __BYTE_ORDER == __LITTLE_ENDIAN ++# define SEM_VALUE_OFFSET 0 ++# elif __BYTE_ORDER == __BIG_ENDIAN ++# define SEM_VALUE_OFFSET 1 ++# else ++# error Unsupported byte order. ++# endif ++# define SEM_NWAITERS_SHIFT 32 ++# define SEM_VALUE_MASK (~(unsigned int)0) ++ unsigned long int data; ++ int private; ++ int pad; ++#else ++# define SEM_VALUE_SHIFT 1 ++# define SEM_NWAITERS_MASK ((unsigned int)1) + unsigned int value; + int private; +- unsigned long int nwaiters; ++ int pad; ++ unsigned int nwaiters; ++#endif + }; + + struct old_sem +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/sem_post.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/sem_post.c ++++ /dev/null +@@ -1,71 +0,0 @@ +-/* sem_post -- post to a POSIX semaphore. Powerpc version. +- Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Paul Mackerras , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +- +-#include +- +-int +-__new_sem_post (sem_t *sem) +-{ +- struct new_sem *isem = (struct new_sem *) sem; +- +- __asm __volatile (__lll_rel_instr ::: "memory"); +- atomic_increment (&isem->value); +- __asm __volatile (__lll_acq_instr ::: "memory"); +- if (isem->nwaiters > 0) +- { +- int err = lll_futex_wake (&isem->value, 1, +- isem->private ^ FUTEX_PRIVATE_FLAG); +- if (__builtin_expect (err, 0) < 0) +- { +- __set_errno (-err); +- return -1; +- } +- } +- return 0; +-} +-versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_1); +- +-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) +- +-int +-attribute_compat_text_section +-__old_sem_post (sem_t *sem) +-{ +- int *futex = (int *) sem; +- +- __asm __volatile (__lll_rel_instr ::: "memory"); +- (void) atomic_increment_val (futex); +- /* We always have to assume it is a shared semaphore. */ +- int err = lll_futex_wake (futex, 1, LLL_SHARED); +- if (__builtin_expect (err, 0) < 0) +- { +- __set_errno (-err); +- return -1; +- } +- return 0; +-} +- +-compat_symbol (libpthread, __old_sem_post, sem_post, GLIBC_2_0); +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_post.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sem_post.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_post.c +@@ -25,34 +25,78 @@ + + #include + ++/* Wrapper for lll_futex_wake, with error checking. ++ TODO Remove when cleaning up the futex API throughout glibc. */ ++static __always_inline void ++futex_wake (unsigned int* futex, int processes_to_wake, int private) ++{ ++ int res = lll_futex_wake (futex, processes_to_wake, private); ++ /* No error. Ignore the number of woken processes. */ ++ if (res >= 0) ++ return; ++ switch (res) ++ { ++ case -EFAULT: /* Could have happened due to memory reuse. */ ++ case -EINVAL: /* Could be either due to incorrect alignment (a bug in ++ glibc or in the application) or due to memory being ++ reused for a PI futex. We cannot distinguish between the ++ two causes, and one of them is correct use, so we do not ++ act in this case. */ ++ return; ++ case -ENOSYS: /* Must have been caused by a glibc bug. */ ++ /* No other errors are documented at this time. */ ++ default: ++ abort (); ++ } ++} ++ ++ ++/* See sem_wait for an explanation of the algorithm. */ + int + __new_sem_post (sem_t *sem) + { + struct new_sem *isem = (struct new_sem *) sem; ++ int private = isem->private; + +- __typeof (isem->value) cur; ++#if __HAVE_64B_ATOMICS ++ /* Add a token to the semaphore. We use release MO to make sure that a ++ thread acquiring this token synchronizes with us and other threads that ++ added tokens before (the release sequence includes atomic RMW operations ++ by other threads). */ ++ /* TODO Use atomic_fetch_add to make it scale better than a CAS loop? */ ++ unsigned long int d = atomic_load_relaxed (&isem->data); + do + { +- cur = isem->value; +- if (isem->value == SEM_VALUE_MAX) ++ if ((d & SEM_VALUE_MASK) == SEM_VALUE_MAX) + { + __set_errno (EOVERFLOW); + return -1; + } + } +- while (atomic_compare_and_exchange_bool_rel (&isem->value, cur + 1, cur)); ++ while (!atomic_compare_exchange_weak_release (&isem->data, &d, d + 1)); + +- atomic_full_barrier (); +- if (isem->nwaiters > 0) ++ /* If there is any potentially blocked waiter, wake one of them. */ ++ if ((d >> SEM_NWAITERS_SHIFT) > 0) ++ futex_wake (((unsigned int *) &isem->data) + SEM_VALUE_OFFSET, 1, private); ++#else ++ /* Add a token to the semaphore. Similar to 64b version. */ ++ unsigned int v = atomic_load_relaxed (&isem->value); ++ do + { +- int err = lll_futex_wake (&isem->value, 1, +- isem->private ^ FUTEX_PRIVATE_FLAG); +- if (__builtin_expect (err, 0) < 0) ++ if ((v << SEM_VALUE_SHIFT) == SEM_VALUE_MAX) + { +- __set_errno (-err); ++ __set_errno (EOVERFLOW); + return -1; + } + } ++ while (!atomic_compare_exchange_weak_release (&isem->value, ++ &v, v + (1 << SEM_VALUE_SHIFT))); ++ ++ /* If there is any potentially blocked waiter, wake one of them. */ ++ if ((v & SEM_NWAITERS_MASK) != 0) ++ futex_wake (&isem->value, 1, private); ++#endif ++ + return 0; + } + versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_1); +@@ -65,6 +109,9 @@ __old_sem_post (sem_t *sem) + { + int *futex = (int *) sem; + ++ /* We must need to synchronize with consumers of this token, so the atomic ++ increment must have release MO semantics. */ ++ atomic_write_barrier (); + (void) atomic_increment_val (futex); + /* We always have to assume it is a shared semaphore. */ + int err = lll_futex_wake (futex, 1, LLL_SHARED); +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c +@@ -1,5 +1,5 @@ +-/* sem_timedwait -- wait on a semaphore. Generic futex-using version. +- Copyright (C) 2003, 2007, 2012 Free Software Foundation, Inc. ++/* sem_timedwait -- wait on a semaphore with timeout. ++ Copyright (C) 2003-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Paul Mackerras , 2003. + +@@ -17,42 +17,13 @@ + License along with the GNU C Library; if not, see + . */ + +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +- +- +-extern void __sem_wait_cleanup (void *arg) attribute_hidden; +- +-/* This is in a seperate function in order to make sure gcc +- puts the call site into an exception region, and thus the +- cleanups get properly run. */ +-static int +-__attribute__ ((noinline)) +-do_futex_timed_wait (struct new_sem *isem, struct timespec *rt) +-{ +- int err, oldtype = __pthread_enable_asynccancel (); +- +- err = lll_futex_timed_wait (&isem->value, 0, rt, +- isem->private ^ FUTEX_PRIVATE_FLAG); +- +- __pthread_disable_asynccancel (oldtype); +- return err; +-} ++#include "sem_waitcommon.c" + ++/* This is in a separate file because because sem_timedwait is only provided ++ if __USE_XOPEN2K is defined. */ + int + sem_timedwait (sem_t *sem, const struct timespec *abstime) + { +- struct new_sem *isem = (struct new_sem *) sem; +- int err; +- +- if (atomic_decrement_if_positive (&isem->value) > 0) +- return 0; + + if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) + { +@@ -60,57 +31,8 @@ sem_timedwait (sem_t *sem, const struct + return -1; + } + +- atomic_increment (&isem->nwaiters); +- +- pthread_cleanup_push (__sem_wait_cleanup, isem); +- +- while (1) +- { +- struct timeval tv; +- struct timespec rt; +- int sec, nsec; +- +- /* Get the current time. */ +- __gettimeofday (&tv, NULL); +- +- /* Compute relative timeout. */ +- sec = abstime->tv_sec - tv.tv_sec; +- nsec = abstime->tv_nsec - tv.tv_usec * 1000; +- if (nsec < 0) +- { +- nsec += 1000000000; +- --sec; +- } +- +- /* Already timed out? */ +- if (sec < 0) +- { +- __set_errno (ETIMEDOUT); +- err = -1; +- break; +- } +- +- /* Do wait. */ +- rt.tv_sec = sec; +- rt.tv_nsec = nsec; +- err = do_futex_timed_wait(isem, &rt); +- if (err != 0 && err != -EWOULDBLOCK) +- { +- __set_errno (-err); +- err = -1; +- break; +- } +- +- if (atomic_decrement_if_positive (&isem->value) > 0) +- { +- err = 0; +- break; +- } +- } +- +- pthread_cleanup_pop (0); +- +- atomic_decrement (&isem->nwaiters); +- +- return err; ++ if (__new_sem_wait_fast ((struct new_sem *) sem, 0) == 0) ++ return 0; ++ else ++ return __new_sem_wait_slow((struct new_sem *) sem, abstime); + } +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_trywait.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sem_trywait.c ++++ /dev/null +@@ -1,49 +0,0 @@ +-/* sem_trywait -- wait on a semaphore. Generic futex-using version. +- Copyright (C) 2003 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Paul Mackerras , 2003. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +- +-#include +- +- +-int +-__new_sem_trywait (sem_t *sem) +-{ +- int *futex = (int *) sem; +- int val; +- +- if (*futex > 0) +- { +- val = atomic_decrement_if_positive (futex); +- if (val > 0) +- return 0; +- } +- +- __set_errno (EAGAIN); +- return -1; +-} +-versioned_symbol (libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1); +-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) +-strong_alias (__new_sem_trywait, __old_sem_trywait) +-compat_symbol (libpthread, __old_sem_trywait, sem_trywait, GLIBC_2_0); +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_wait.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sem_wait.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_wait.c +@@ -17,79 +17,18 @@ + License along with the GNU C Library; if not, see + . */ + +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +- +- +-void +-attribute_hidden +-__sem_wait_cleanup (void *arg) +-{ +- struct new_sem *isem = (struct new_sem *) arg; +- +- atomic_decrement (&isem->nwaiters); +-} +- +-/* This is in a seperate function in order to make sure gcc +- puts the call site into an exception region, and thus the +- cleanups get properly run. */ +-static int +-__attribute__ ((noinline)) +-do_futex_wait (struct new_sem *isem) +-{ +- int err, oldtype = __pthread_enable_asynccancel (); +- +- err = lll_futex_wait (&isem->value, 0, isem->private ^ FUTEX_PRIVATE_FLAG); +- +- __pthread_disable_asynccancel (oldtype); +- return err; +-} ++#include "sem_waitcommon.c" + + int + __new_sem_wait (sem_t *sem) + { +- struct new_sem *isem = (struct new_sem *) sem; +- int err; +- +- if (atomic_decrement_if_positive (&isem->value) > 0) ++ if (__new_sem_wait_fast ((struct new_sem *) sem, 0) == 0) + return 0; +- +- atomic_increment (&isem->nwaiters); +- +- pthread_cleanup_push (__sem_wait_cleanup, isem); +- +- while (1) +- { +- err = do_futex_wait(isem); +- if (err != 0 && err != -EWOULDBLOCK) +- { +- __set_errno (-err); +- err = -1; +- break; +- } +- +- if (atomic_decrement_if_positive (&isem->value) > 0) +- { +- err = 0; +- break; +- } +- } +- +- pthread_cleanup_pop (0); +- +- atomic_decrement (&isem->nwaiters); +- +- return err; ++ else ++ return __new_sem_wait_slow((struct new_sem *) sem, NULL); + } + versioned_symbol (libpthread, __new_sem_wait, sem_wait, GLIBC_2_1); + +- + #if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) + int + attribute_compat_text_section +@@ -120,3 +59,34 @@ __old_sem_wait (sem_t *sem) + + compat_symbol (libpthread, __old_sem_wait, sem_wait, GLIBC_2_0); + #endif ++ ++int ++__new_sem_trywait (sem_t *sem) ++{ ++ /* We must not fail spuriously, so require a definitive result even if this ++ may lead to a long execution time. */ ++ if (__new_sem_wait_fast ((struct new_sem *) sem, 1) == 0) ++ return 0; ++ __set_errno (EAGAIN); ++ return -1; ++} ++versioned_symbol (libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1); ++#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) ++int ++__old_sem_trywait (sem_t *sem) ++{ ++ int *futex = (int *) sem; ++ int val; ++ ++ if (*futex > 0) ++ { ++ val = atomic_decrement_if_positive (futex); ++ if (val > 0) ++ return 0; ++ } ++ ++ __set_errno (EAGAIN); ++ return -1; ++} ++compat_symbol (libpthread, __old_sem_trywait, sem_trywait, GLIBC_2_0); ++#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c +@@ -0,0 +1,467 @@ ++/* sem_waitcommon -- wait on a semaphore, shared code. ++ Copyright (C) 2003-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Paul Mackerras , 2003. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++/* Wrapper for lll_futex_wait with absolute timeout and error checking. ++ TODO Remove when cleaning up the futex API throughout glibc. */ ++static __always_inline int ++futex_abstimed_wait (unsigned int* futex, unsigned int expected, ++ const struct timespec* abstime, int private, bool cancel) ++{ ++ int err, oldtype; ++ if (abstime == NULL) ++ { ++ if (cancel) ++ oldtype = __pthread_enable_asynccancel (); ++ err = lll_futex_wait (futex, expected, private); ++ if (cancel) ++ __pthread_disable_asynccancel (oldtype); ++ } ++ else ++ { ++ struct timeval tv; ++ struct timespec rt; ++ int sec, nsec; ++ ++ /* Get the current time. */ ++ __gettimeofday (&tv, NULL); ++ ++ /* Compute relative timeout. */ ++ sec = abstime->tv_sec - tv.tv_sec; ++ nsec = abstime->tv_nsec - tv.tv_usec * 1000; ++ if (nsec < 0) ++ { ++ nsec += 1000000000; ++ --sec; ++ } ++ ++ /* Already timed out? */ ++ if (sec < 0) ++ return ETIMEDOUT; ++ ++ /* Do wait. */ ++ rt.tv_sec = sec; ++ rt.tv_nsec = nsec; ++ if (cancel) ++ oldtype = __pthread_enable_asynccancel (); ++ err = lll_futex_timed_wait (futex, expected, &rt, private); ++ if (cancel) ++ __pthread_disable_asynccancel (oldtype); ++ } ++ switch (err) ++ { ++ case 0: ++ case -EAGAIN: ++ case -EINTR: ++ case -ETIMEDOUT: ++ return -err; ++ ++ case -EFAULT: /* Must have been caused by a glibc or application bug. */ ++ case -EINVAL: /* Either due to wrong alignment or due to the timeout not ++ being normalized. Must have been caused by a glibc or ++ application bug. */ ++ case -ENOSYS: /* Must have been caused by a glibc bug. */ ++ /* No other errors are documented at this time. */ ++ default: ++ abort (); ++ } ++} ++ ++/* Wrapper for lll_futex_wake, with error checking. ++ TODO Remove when cleaning up the futex API throughout glibc. */ ++static __always_inline void ++futex_wake (unsigned int* futex, int processes_to_wake, int private) ++{ ++ int res = lll_futex_wake (futex, processes_to_wake, private); ++ /* No error. Ignore the number of woken processes. */ ++ if (res >= 0) ++ return; ++ switch (res) ++ { ++ case -EFAULT: /* Could have happened due to memory reuse. */ ++ case -EINVAL: /* Could be either due to incorrect alignment (a bug in ++ glibc or in the application) or due to memory being ++ reused for a PI futex. We cannot distinguish between the ++ two causes, and one of them is correct use, so we do not ++ act in this case. */ ++ return; ++ case -ENOSYS: /* Must have been caused by a glibc bug. */ ++ /* No other errors are documented at this time. */ ++ default: ++ abort (); ++ } ++} ++ ++ ++/* The semaphore provides two main operations: sem_post adds a token to the ++ semaphore; sem_wait grabs a token from the semaphore, potentially waiting ++ until there is a token available. A sem_wait needs to synchronize with ++ the sem_post that provided the token, so that whatever lead to the sem_post ++ happens before the code after sem_wait. ++ ++ Conceptually, available tokens can simply be counted; let's call that the ++ value of the semaphore. However, we also want to know whether there might ++ be a sem_wait that is blocked on the value because it was zero (using a ++ futex with the value being the futex variable); if there is no blocked ++ sem_wait, sem_post does not need to execute a futex_wake call. Therefore, ++ we also need to count the number of potentially blocked sem_wait calls ++ (which we call nwaiters). ++ ++ What makes this tricky is that POSIX requires that a semaphore can be ++ destroyed as soon as the last remaining sem_wait has returned, and no ++ other sem_wait or sem_post calls are executing concurrently. However, the ++ sem_post call whose token was consumed by the last sem_wait is considered ++ to have finished once it provided the token to the sem_wait. ++ Thus, sem_post must not access the semaphore struct anymore after it has ++ made a token available; IOW, it needs to be able to atomically provide ++ a token and check whether any blocked sem_wait calls might exist. ++ ++ This is straightforward to do if the architecture provides 64b atomics ++ because we can just put both the value and nwaiters into one variable that ++ we access atomically: This is the data field, the value is in the ++ least-significant 32 bits, and nwaiters in the other bits. When sem_post ++ makes a value available, it can atomically check nwaiters. ++ ++ If we have only 32b atomics available, we cannot put both nwaiters and ++ value into one 32b value because then we might have too few bits for both ++ of those counters. Therefore, we need to use two distinct fields. ++ ++ To allow sem_post to atomically make a token available and check for ++ blocked sem_wait calls, we use one bit in value to indicate whether ++ nwaiters is nonzero. That allows sem_post to use basically the same ++ algorithm as with 64b atomics, but requires sem_wait to update the bit; it ++ can't do this atomically with another access to nwaiters, but it can compute ++ a conservative value for the bit because it's benign if the bit is set ++ even if nwaiters is zero (all we get is an unnecessary futex wake call by ++ sem_post). ++ Specifically, sem_wait will unset the bit speculatively if it believes that ++ there is no other concurrently executing sem_wait. If it misspeculated, ++ it will have to clean up by waking any other sem_wait call (i.e., what ++ sem_post would do otherwise). This does not conflict with the destruction ++ requirement because the semaphore must not be destructed while any sem_wait ++ is still executing. */ ++ ++/* Set this to true if you assume that, in contrast to current Linux futex ++ documentation, lll_futex_wake can return -EINTR only if interrupted by a ++ signal, not spuriously due to some other reason. ++ TODO Discuss EINTR conditions with the Linux kernel community. For ++ now, we set this to true to not change behavior of semaphores compared ++ to previous glibc builds. */ ++static const int sem_assume_only_signals_cause_futex_EINTR = 1; ++ ++#if !__HAVE_64B_ATOMICS ++static void ++__sem_wait_32_finish (struct new_sem *sem); ++#endif ++ ++static void ++__sem_wait_cleanup (void *arg) ++{ ++ struct new_sem *sem = (struct new_sem *) arg; ++ ++#if __HAVE_64B_ATOMICS ++ /* Stop being registered as a waiter. See below for MO. */ ++ atomic_fetch_add_relaxed (&sem->data, -(1UL << SEM_NWAITERS_SHIFT)); ++#else ++ __sem_wait_32_finish (sem); ++#endif ++} ++ ++/* Wait until at least one token is available, possibly with a timeout. ++ This is in a separate function in order to make sure gcc ++ puts the call site into an exception region, and thus the ++ cleanups get properly run. TODO still necessary? Other futex_wait ++ users don't seem to need it. */ ++static int ++__attribute__ ((noinline)) ++do_futex_wait (struct new_sem *sem, const struct timespec *abstime) ++{ ++ int err; ++ ++#if __HAVE_64B_ATOMICS ++ err = futex_abstimed_wait ((unsigned int *) &sem->data + SEM_VALUE_OFFSET, 0, ++ abstime, sem->private, true); ++#else ++ err = futex_abstimed_wait (&sem->value, SEM_NWAITERS_MASK, abstime, ++ sem->private, true); ++#endif ++ ++ return err; ++} ++ ++/* Fast path: Try to grab a token without blocking. */ ++static int ++__new_sem_wait_fast (struct new_sem *sem, int definitive_result) ++{ ++ /* We need acquire MO if we actually grab a token, so that this ++ synchronizes with all token providers (i.e., the RMW operation we read ++ from or all those before it in modification order; also see sem_post). ++ We do not need to guarantee any ordering if we observed that there is ++ no token (POSIX leaves it unspecified whether functions that fail ++ synchronize memory); thus, relaxed MO is sufficient for the initial load ++ and the failure path of the CAS. If the weak CAS fails and we need a ++ definitive result, retry. */ ++#if __HAVE_64B_ATOMICS ++ unsigned long d = atomic_load_relaxed (&sem->data); ++ do ++ { ++ if ((d & SEM_VALUE_MASK) == 0) ++ break; ++ if (atomic_compare_exchange_weak_acquire (&sem->data, &d, d - 1)) ++ return 0; ++ } ++ while (definitive_result); ++ return -1; ++#else ++ unsigned int v = atomic_load_relaxed (&sem->value); ++ do ++ { ++ if ((v >> SEM_VALUE_SHIFT) == 0) ++ break; ++ if (atomic_compare_exchange_weak_acquire (&sem->value, ++ &v, v - (1 << SEM_VALUE_SHIFT))) ++ return 0; ++ } ++ while (definitive_result); ++ return -1; ++#endif ++} ++ ++/* Slow path that blocks. */ ++static int ++__attribute__ ((noinline)) ++__new_sem_wait_slow (struct new_sem *sem, const struct timespec *abstime) ++{ ++ int err = 0; ++ ++#if __HAVE_64B_ATOMICS ++ /* Add a waiter. Relaxed MO is sufficient because we can rely on the ++ ordering provided by the RMW operations we use. */ ++ unsigned long d = atomic_fetch_add_relaxed (&sem->data, ++ 1UL << SEM_NWAITERS_SHIFT); ++ ++ pthread_cleanup_push (__sem_wait_cleanup, sem); ++ ++ /* Wait for a token to be available. Retry until we can grab one. */ ++ for (;;) ++ { ++ /* If there is no token available, sleep until there is. */ ++ if ((d & SEM_VALUE_MASK) == 0) ++ { ++ err = do_futex_wait (sem, abstime); ++ /* A futex return value of 0 or EAGAIN is due to a real or spurious ++ wake-up, or due to a change in the number of tokens. We retry in ++ these cases. ++ If we timed out, forward this to the caller. ++ EINTR could be either due to being interrupted by a signal, or ++ due to a spurious wake-up. Thus, we cannot distinguish between ++ both, and are not allowed to return EINTR to the caller but have ++ to retry; this is because we may not have been interrupted by a ++ signal. However, if we assume that only signals cause a futex ++ return of EINTR, we forward EINTR to the caller. ++ ++ Retrying on EINTR is technically always allowed because to ++ reliably interrupt sem_wait with a signal, the signal handler ++ must call sem_post (which is AS-Safe). In executions where the ++ signal handler does not do that, the implementation can correctly ++ claim that sem_wait hadn't actually started to execute yet, and ++ thus the signal never actually interrupted sem_wait. We make no ++ timing guarantees, so the program can never observe that sem_wait ++ actually did start to execute. Thus, in a correct program, we ++ can expect a signal that wanted to interrupt the sem_wait to have ++ provided a token, and can just try to grab this token if ++ futex_wait returns EINTR. */ ++ if (err == ETIMEDOUT || ++ (err == EINTR && sem_assume_only_signals_cause_futex_EINTR)) ++ { ++ __set_errno (err); ++ err = -1; ++ /* Stop being registered as a waiter. */ ++ atomic_fetch_add_relaxed (&sem->data, ++ -(1UL << SEM_NWAITERS_SHIFT)); ++ break; ++ } ++ /* Relaxed MO is sufficient; see below. */ ++ d = atomic_load_relaxed (&sem->data); ++ } ++ else ++ { ++ /* Try to grab both a token and stop being a waiter. We need ++ acquire MO so this synchronizes with all token providers (i.e., ++ the RMW operation we read from or all those before it in ++ modification order; also see sem_post). On the failure path, ++ relaxed MO is sufficient because we only eventually need the ++ up-to-date value; the futex_wait or the CAS perform the real ++ work. */ ++ if (atomic_compare_exchange_weak_acquire (&sem->data, ++ &d, d - 1 - (1UL << SEM_NWAITERS_SHIFT))) ++ { ++ err = 0; ++ break; ++ } ++ } ++ } ++ ++ pthread_cleanup_pop (0); ++#else ++ /* The main difference to the 64b-atomics implementation is that we need to ++ access value and nwaiters in separate steps, and that the nwaiters bit ++ in the value can temporarily not be set even if nwaiters is nonzero. ++ We work around incorrectly unsetting the nwaiters bit by letting sem_wait ++ set the bit again and waking the number of waiters that could grab a ++ token. There are two additional properties we need to ensure: ++ (1) We make sure that whenever unsetting the bit, we see the increment of ++ nwaiters by the other thread that set the bit. IOW, we will notice if ++ we make a mistake. ++ (2) When setting the nwaiters bit, we make sure that we see the unsetting ++ of the bit by another waiter that happened before us. This avoids having ++ to blindly set the bit whenever we need to block on it. We set/unset ++ the bit while having incremented nwaiters (i.e., are a registered ++ waiter), and the problematic case only happens when one waiter indeed ++ followed another (i.e., nwaiters was never larger than 1); thus, this ++ works similarly as with a critical section using nwaiters (see the MOs ++ and related comments below). ++ ++ An alternative approach would be to unset the bit after decrementing ++ nwaiters; however, that would result in needing Dekker-like ++ synchronization and thus full memory barriers. We also would not be able ++ to prevent misspeculation, so this alternative scheme does not seem ++ beneficial. */ ++ unsigned int v; ++ ++ /* Add a waiter. We need acquire MO so this synchronizes with the release ++ MO we use when decrementing nwaiters below; it ensures that if another ++ waiter unset the bit before us, we see that and set it again. Also see ++ property (2) above. */ ++ atomic_fetch_add_acquire (&sem->nwaiters, 1); ++ ++ pthread_cleanup_push (__sem_wait_cleanup, sem); ++ ++ /* Wait for a token to be available. Retry until we can grab one. */ ++ /* We do not need any ordering wrt. to this load's reads-from, so relaxed ++ MO is sufficient. The acquire MO above ensures that in the problematic ++ case, we do see the unsetting of the bit by another waiter. */ ++ v = atomic_load_relaxed (&sem->value); ++ do ++ { ++ do ++ { ++ /* We are about to block, so make sure that the nwaiters bit is ++ set. We need release MO on the CAS to ensure that when another ++ waiter unsets the nwaiters bit, it will also observe that we ++ incremented nwaiters in the meantime (also see the unsetting of ++ the bit below). Relaxed MO on CAS failure is sufficient (see ++ above). */ ++ do ++ { ++ if ((v & SEM_NWAITERS_MASK) != 0) ++ break; ++ } ++ while (!atomic_compare_exchange_weak_release (&sem->value, ++ &v, v | SEM_NWAITERS_MASK)); ++ /* If there is no token, wait. */ ++ if ((v >> SEM_VALUE_SHIFT) == 0) ++ { ++ /* See __HAVE_64B_ATOMICS variant. */ ++ err = do_futex_wait(sem, abstime); ++ if (err == ETIMEDOUT || ++ (err == EINTR && sem_assume_only_signals_cause_futex_EINTR)) ++ { ++ __set_errno (err); ++ err = -1; ++ goto error; ++ } ++ err = 0; ++ /* We blocked, so there might be a token now. Relaxed MO is ++ sufficient (see above). */ ++ v = atomic_load_relaxed (&sem->value); ++ } ++ } ++ /* If there is no token, we must not try to grab one. */ ++ while ((v >> SEM_VALUE_SHIFT) == 0); ++ } ++ /* Try to grab a token. We need acquire MO so this synchronizes with ++ all token providers (i.e., the RMW operation we read from or all those ++ before it in modification order; also see sem_post). */ ++ while (!atomic_compare_exchange_weak_acquire (&sem->value, ++ &v, v - (1 << SEM_VALUE_SHIFT))); ++ ++error: ++ pthread_cleanup_pop (0); ++ ++ __sem_wait_32_finish (sem); ++#endif ++ ++ return err; ++} ++ ++/* Stop being a registered waiter (non-64b-atomics code only). */ ++#if !__HAVE_64B_ATOMICS ++static void ++__sem_wait_32_finish (struct new_sem *sem) ++{ ++ /* The nwaiters bit is still set, try to unset it now if this seems ++ necessary. We do this before decrementing nwaiters so that the unsetting ++ is visible to other waiters entering after us. Relaxed MO is sufficient ++ because we are just speculating here; a stronger MO would not prevent ++ misspeculation. */ ++ unsigned int wguess = atomic_load_relaxed (&sem->nwaiters); ++ if (wguess == 1) ++ /* We might be the last waiter, so unset. This needs acquire MO so that ++ it syncronizes with the release MO when setting the bit above; if we ++ overwrite someone else that set the bit, we'll read in the following ++ decrement of nwaiters at least from that release sequence, so we'll ++ see if the other waiter is still active or if another writer entered ++ in the meantime (i.e., using the check below). */ ++ atomic_fetch_and_acquire (&sem->value, ~SEM_NWAITERS_MASK); ++ ++ /* Now stop being a waiter, and see whether our guess was correct. ++ This needs release MO so that it synchronizes with the acquire MO when ++ a waiter increments nwaiters; this makes sure that newer writers see that ++ we reset the waiters_present bit. */ ++ unsigned int wfinal = atomic_fetch_add_release (&sem->nwaiters, -1); ++ if (wfinal > 1 && wguess == 1) ++ { ++ /* We guessed wrong, and so need to clean up after the mistake and ++ unblock any waiters that could have not been woken. There is no ++ additional ordering that we need to set up, so relaxed MO is ++ sufficient. */ ++ unsigned int v = atomic_fetch_or_relaxed (&sem->value, ++ SEM_NWAITERS_MASK); ++ /* If there are available tokens, then wake as many waiters. If there ++ aren't any, then there is no need to wake anyone because there is ++ none to grab for another waiter. If tokens become available ++ subsequently, then the respective sem_post calls will do the wake-up ++ due to us having set the nwaiters bit again. */ ++ v >>= SEM_VALUE_SHIFT; ++ if (v > 0) ++ futex_wake (&sem->value, v, sem->private); ++ } ++} ++#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/structsem.sym +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/structsem.sym ++++ /dev/null +@@ -1,12 +0,0 @@ +-#include +-#include +-#include +-#include +-#include "internaltypes.h" +- +--- +- +-VALUE offsetof (struct new_sem, value) +-PRIVATE offsetof (struct new_sem, private) +-NWAITERS offsetof (struct new_sem, nwaiters) +-SEM_VALUE_MAX SEM_VALUE_MAX +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S ++++ /dev/null +@@ -1,75 +0,0 @@ +-/* Copyright (C) 2002,2003,2005,2007,2008,2011 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +- +- +- .text +- +- .globl sem_post +- .type sem_post,@function +- .align 16 +-sem_post: +-#if VALUE == 0 +- movl (%rdi), %eax +-#else +- movl VALUE(%rdi), %eax +-#endif +-0: cmpl $SEM_VALUE_MAX, %eax +- je 3f +- leal 1(%rax), %esi +- LOCK +-#if VALUE == 0 +- cmpxchgl %esi, (%rdi) +-#else +- cmpxchgl %esi, VALUE(%rdi) +-#endif +- jnz 0b +- +- LP_OP(cmp) $0, NWAITERS(%rdi) +- je 2f +- +- movl $SYS_futex, %eax +- movl $FUTEX_WAKE, %esi +- orl PRIVATE(%rdi), %esi +- movl $1, %edx +- syscall +- +- testq %rax, %rax +- js 1f +- +-2: xorl %eax, %eax +- retq +- +-1: +- movl $EINVAL, %eax +- jmp 4f +- +-3: +- movl $EOVERFLOW, %eax +- +-4: +- movq errno@gottpoff(%rip), %rdx +- movl %eax, %fs:(%rdx) +- orl $-1, %eax +- retq +- .size sem_post,.-sem_post +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S ++++ /dev/null +@@ -1,380 +0,0 @@ +-/* Copyright (C) 2002,2003,2005,2007,2009,2010,2011 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +-#include +- +- .text +- +- .globl sem_timedwait +- .type sem_timedwait,@function +- .align 16 +-sem_timedwait: +-.LSTARTCODE: +- cfi_startproc +-#ifdef SHARED +- cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect, +- DW.ref.__gcc_personality_v0) +- cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART) +-#else +- cfi_personality(DW_EH_PE_udata4, __gcc_personality_v0) +- cfi_lsda(DW_EH_PE_udata4, .LexceptSTART) +-#endif +-#if VALUE == 0 +- movl (%rdi), %eax +-#else +- movl VALUE(%rdi), %eax +-#endif +-2: testl %eax, %eax +- je 1f +- +- leaq -1(%rax), %rdx +- LOCK +-#if VALUE == 0 +- cmpxchgl %edx, (%rdi) +-#else +- cmpxchgl %edx, VALUE(%rdi) +-#endif +- jne 2b +- +- xorl %eax, %eax +- retq +- +- /* Check whether the timeout value is valid. */ +-1: cmpq $1000000000, 8(%rsi) +- jae 6f +- +-#ifndef __ASSUME_FUTEX_CLOCK_REALTIME +-# ifdef PIC +- cmpl $0, __have_futex_clock_realtime(%rip) +-# else +- cmpl $0, __have_futex_clock_realtime +-# endif +- je .Lreltmo +-#endif +- +- cmpq $0, (%rsi) +- js 16f +- +- /* This push is only needed to store the sem_t pointer for the +- exception handler. */ +- pushq %rdi +- cfi_adjust_cfa_offset(8) +- +- movq %rsi, %r10 +- +- LOCK +- LP_OP(add) $1, NWAITERS(%rdi) +- +-.LcleanupSTART: +-13: call __pthread_enable_asynccancel +- movl %eax, %r8d +- +-#if VALUE != 0 +- leaq VALUE(%rdi), %rdi +-#endif +- movl $0xffffffff, %r9d +- movl $FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi +- orl PRIVATE(%rdi), %esi +- movl $SYS_futex, %eax +- xorl %edx, %edx +- syscall +- movq %rax, %r9 +-#if VALUE != 0 +- leaq -VALUE(%rdi), %rdi +-#endif +- +- xchgq %r8, %rdi +- call __pthread_disable_asynccancel +-.LcleanupEND: +- movq %r8, %rdi +- +- testq %r9, %r9 +- je 11f +- cmpq $-EWOULDBLOCK, %r9 +- jne 3f +- +-11: +-#if VALUE == 0 +- movl (%rdi), %eax +-#else +- movl VALUE(%rdi), %eax +-#endif +-14: testl %eax, %eax +- je 13b +- +- leaq -1(%rax), %rcx +- LOCK +-#if VALUE == 0 +- cmpxchgl %ecx, (%rdi) +-#else +- cmpxchgl %ecx, VALUE(%rdi) +-#endif +- jne 14b +- +- xorl %eax, %eax +- +-15: LOCK +- LP_OP(sub) $1, NWAITERS(%rdi) +- +- leaq 8(%rsp), %rsp +- cfi_adjust_cfa_offset(-8) +- retq +- +- cfi_adjust_cfa_offset(8) +-3: negq %r9 +- movq errno@gottpoff(%rip), %rdx +- movl %r9d, %fs:(%rdx) +- +- orl $-1, %eax +- jmp 15b +- +- cfi_adjust_cfa_offset(-8) +-6: +- movq errno@gottpoff(%rip), %rdx +- movl $EINVAL, %fs:(%rdx) +- +- orl $-1, %eax +- +- retq +- +-16: +- movq errno@gottpoff(%rip), %rdx +- movl $ETIMEDOUT, %fs:(%rdx) +- +- orl $-1, %eax +- +- retq +- +-#ifndef __ASSUME_FUTEX_CLOCK_REALTIME +-.Lreltmo: +- pushq %r12 +- cfi_adjust_cfa_offset(8) +- cfi_rel_offset(%r12, 0) +- pushq %r13 +- cfi_adjust_cfa_offset(8) +- cfi_rel_offset(%r13, 0) +- pushq %r14 +- cfi_adjust_cfa_offset(8) +- cfi_rel_offset(%r14, 0) +- +-#ifdef __ASSUME_FUTEX_CLOCK_REALTIME +-# define STACKFRAME 8 +-#else +-# define STACKFRAME 24 +-#endif +- subq $STACKFRAME, %rsp +- cfi_adjust_cfa_offset(STACKFRAME) +- +- movq %rdi, %r12 +- movq %rsi, %r13 +- +- LOCK +- LP_OP(add) $1, NWAITERS(%r12) +- +-7: xorl %esi, %esi +- movq %rsp,%rdi +- /* This call works because we directly jump to a system call entry +- which preserves all the registers. */ +- call JUMPTARGET(__gettimeofday) +- +- /* Compute relative timeout. */ +- movq 8(%rsp), %rax +- movl $1000, %edi +- mul %rdi /* Milli seconds to nano seconds. */ +- movq (%r13), %rdi +- movq 8(%r13), %rsi +- subq (%rsp), %rdi +- subq %rax, %rsi +- jns 5f +- addq $1000000000, %rsi +- decq %rdi +-5: testq %rdi, %rdi +- movl $ETIMEDOUT, %r14d +- js 36f /* Time is already up. */ +- +- movq %rdi, (%rsp) /* Store relative timeout. */ +- movq %rsi, 8(%rsp) +- +-.LcleanupSTART2: +- call __pthread_enable_asynccancel +- movl %eax, 16(%rsp) +- +- movq %rsp, %r10 +-# if VALUE == 0 +- movq %r12, %rdi +-# else +- leaq VALUE(%r12), %rdi +-# endif +-# if FUTEX_WAIT == 0 +- movl PRIVATE(%rdi), %esi +-# else +- movl $FUTEX_WAIT, %esi +- orl PRIVATE(%rdi), %esi +-# endif +- movl $SYS_futex, %eax +- xorl %edx, %edx +- syscall +- movq %rax, %r14 +- +- movl 16(%rsp), %edi +- call __pthread_disable_asynccancel +-.LcleanupEND2: +- +- testq %r14, %r14 +- je 9f +- cmpq $-EWOULDBLOCK, %r14 +- jne 33f +- +-9: +-# if VALUE == 0 +- movl (%r12), %eax +-# else +- movl VALUE(%r12), %eax +-# endif +-8: testl %eax, %eax +- je 7b +- +- leaq -1(%rax), %rcx +- LOCK +-# if VALUE == 0 +- cmpxchgl %ecx, (%r12) +-# else +- cmpxchgl %ecx, VALUE(%r12) +-# endif +- jne 8b +- +- xorl %eax, %eax +- +-45: LOCK +- LP_OP(sub) $1, NWAITERS(%r12) +- +- addq $STACKFRAME, %rsp +- cfi_adjust_cfa_offset(-STACKFRAME) +- popq %r14 +- cfi_adjust_cfa_offset(-8) +- cfi_restore(%r14) +- popq %r13 +- cfi_adjust_cfa_offset(-8) +- cfi_restore(%r13) +- popq %r12 +- cfi_adjust_cfa_offset(-8) +- cfi_restore(%r12) +- retq +- +- cfi_adjust_cfa_offset(STACKFRAME + 3 * 8) +- cfi_rel_offset(%r12, STACKFRAME + 2 * 8) +- cfi_rel_offset(%r13, STACKFRAME + 1 * 8) +- cfi_rel_offset(%r14, STACKFRAME) +-33: negq %r14 +-36: +- movq errno@gottpoff(%rip), %rdx +- movl %r14d, %fs:(%rdx) +- +- orl $-1, %eax +- jmp 45b +-#endif +- cfi_endproc +- .size sem_timedwait,.-sem_timedwait +- +- +- .type sem_timedwait_cleanup,@function +-sem_timedwait_cleanup: +- cfi_startproc +- cfi_adjust_cfa_offset(8) +- +- movq (%rsp), %rdi +- LOCK +- LP_OP(sub) $1, NWAITERS(%rdi) +- movq %rax, %rdi +-.LcallUR: +- call _Unwind_Resume@PLT +- hlt +-.LENDCODE: +- cfi_endproc +- .size sem_timedwait_cleanup,.-sem_timedwait_cleanup +- +- +-#ifndef __ASSUME_FUTEX_CLOCK_REALTIME +- .type sem_timedwait_cleanup2,@function +-sem_timedwait_cleanup2: +- cfi_startproc +- cfi_adjust_cfa_offset(STACKFRAME + 3 * 8) +- cfi_rel_offset(%r12, STACKFRAME + 2 * 8) +- cfi_rel_offset(%r13, STACKFRAME + 1 * 8) +- cfi_rel_offset(%r14, STACKFRAME) +- +- LOCK +- LP_OP(sub) $1, NWAITERS(%r12) +- movq %rax, %rdi +- movq STACKFRAME(%rsp), %r14 +- movq STACKFRAME+8(%rsp), %r13 +- movq STACKFRAME+16(%rsp), %r12 +-.LcallUR2: +- call _Unwind_Resume@PLT +- hlt +-.LENDCODE2: +- cfi_endproc +- .size sem_timedwait_cleanup2,.-sem_timedwait_cleanup2 +-#endif +- +- +- .section .gcc_except_table,"a",@progbits +-.LexceptSTART: +- .byte DW_EH_PE_omit # @LPStart format +- .byte DW_EH_PE_omit # @TType format +- .byte DW_EH_PE_uleb128 # call-site format +- .uleb128 .Lcstend-.Lcstbegin +-.Lcstbegin: +- .uleb128 .LcleanupSTART-.LSTARTCODE +- .uleb128 .LcleanupEND-.LcleanupSTART +- .uleb128 sem_timedwait_cleanup-.LSTARTCODE +- .uleb128 0 +-#ifndef __ASSUME_FUTEX_CLOCK_REALTIME +- .uleb128 .LcleanupSTART2-.LSTARTCODE +- .uleb128 .LcleanupEND2-.LcleanupSTART2 +- .uleb128 sem_timedwait_cleanup2-.LSTARTCODE +- .uleb128 0 +-#endif +- .uleb128 .LcallUR-.LSTARTCODE +- .uleb128 .LENDCODE-.LcallUR +- .uleb128 0 +- .uleb128 0 +-#ifndef __ASSUME_FUTEX_CLOCK_REALTIME +- .uleb128 .LcallUR2-.LSTARTCODE +- .uleb128 .LENDCODE2-.LcallUR2 +- .uleb128 0 +- .uleb128 0 +-#endif +-.Lcstend: +- +- +-#ifdef SHARED +- .hidden DW.ref.__gcc_personality_v0 +- .weak DW.ref.__gcc_personality_v0 +- .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits +- .align LP_SIZE +- .type DW.ref.__gcc_personality_v0, @object +- .size DW.ref.__gcc_personality_v0, LP_SIZE +-DW.ref.__gcc_personality_v0: +- ASM_ADDR __gcc_personality_v0 +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S ++++ /dev/null +@@ -1,47 +0,0 @@ +-/* Copyright (C) 2002, 2003, 2005, 2007, 2011 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +- +- .text +- +- .globl sem_trywait +- .type sem_trywait,@function +- .align 16 +-sem_trywait: +- movl (%rdi), %eax +-2: testl %eax, %eax +- jz 1f +- +- leal -1(%rax), %edx +- LOCK +- cmpxchgl %edx, (%rdi) +- jne 2b +- +- xorl %eax, %eax +- retq +- +-1: +- movq errno@gottpoff(%rip), %rdx +- movl $EAGAIN, %fs:(%rdx) +- orl $-1, %eax +- retq +- .size sem_trywait,.-sem_trywait +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S ++++ /dev/null +@@ -1,176 +0,0 @@ +-/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2011 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper , 2002. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +- +- +- .text +- +- .globl sem_wait +- .type sem_wait,@function +- .align 16 +-sem_wait: +-.LSTARTCODE: +- cfi_startproc +-#ifdef SHARED +- cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect, +- DW.ref.__gcc_personality_v0) +- cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART) +-#else +- cfi_personality(DW_EH_PE_udata4, __gcc_personality_v0) +- cfi_lsda(DW_EH_PE_udata4, .LexceptSTART) +-#endif +- +-#if VALUE == 0 +- movl (%rdi), %eax +-#else +- movl VALUE(%rdi), %eax +-#endif +-2: testl %eax, %eax +- je 1f +- +- leal -1(%rax), %edx +- LOCK +-#if VALUE == 0 +- cmpxchgl %edx, (%rdi) +-#else +- cmpxchgl %edx, VALUE(%rdi) +-#endif +- jne 2b +- +- xorl %eax, %eax +- retq +- +- /* This push is only needed to store the sem_t pointer for the +- exception handler. */ +-1: pushq %rdi +- cfi_adjust_cfa_offset(8) +- +- LOCK +- LP_OP(add) $1, NWAITERS(%rdi) +- +-.LcleanupSTART: +-6: call __pthread_enable_asynccancel +- movl %eax, %r8d +- +- xorq %r10, %r10 +- movl $SYS_futex, %eax +-#if FUTEX_WAIT == 0 +- movl PRIVATE(%rdi), %esi +-#else +- movl $FUTEX_WAIT, %esi +- orl PRIVATE(%rdi), %esi +-#endif +- xorl %edx, %edx +- syscall +- movq %rax, %rcx +- +- xchgq %r8, %rdi +- call __pthread_disable_asynccancel +-.LcleanupEND: +- movq %r8, %rdi +- +- testq %rcx, %rcx +- je 3f +- cmpq $-EWOULDBLOCK, %rcx +- jne 4f +- +-3: +-#if VALUE == 0 +- movl (%rdi), %eax +-#else +- movl VALUE(%rdi), %eax +-#endif +-5: testl %eax, %eax +- je 6b +- +- leal -1(%rax), %edx +- LOCK +-#if VALUE == 0 +- cmpxchgl %edx, (%rdi) +-#else +- cmpxchgl %edx, VALUE(%rdi) +-#endif +- jne 5b +- +- xorl %eax, %eax +- +-9: LOCK +- LP_OP(sub) $1, NWAITERS(%rdi) +- +- leaq 8(%rsp), %rsp +- cfi_adjust_cfa_offset(-8) +- +- retq +- +- cfi_adjust_cfa_offset(8) +-4: negq %rcx +- movq errno@gottpoff(%rip), %rdx +- movl %ecx, %fs:(%rdx) +- orl $-1, %eax +- +- jmp 9b +- .size sem_wait,.-sem_wait +- +- +- .type sem_wait_cleanup,@function +-sem_wait_cleanup: +- movq (%rsp), %rdi +- LOCK +- LP_OP(sub) $1, NWAITERS(%rdi) +- movq %rax, %rdi +-.LcallUR: +- call _Unwind_Resume@PLT +- hlt +-.LENDCODE: +- cfi_endproc +- .size sem_wait_cleanup,.-sem_wait_cleanup +- +- +- .section .gcc_except_table,"a",@progbits +-.LexceptSTART: +- .byte DW_EH_PE_omit # @LPStart format +- .byte DW_EH_PE_omit # @TType format +- .byte DW_EH_PE_uleb128 # call-site format +- .uleb128 .Lcstend-.Lcstbegin +-.Lcstbegin: +- .uleb128 .LcleanupSTART-.LSTARTCODE +- .uleb128 .LcleanupEND-.LcleanupSTART +- .uleb128 sem_wait_cleanup-.LSTARTCODE +- .uleb128 0 +- .uleb128 .LcallUR-.LSTARTCODE +- .uleb128 .LENDCODE-.LcallUR +- .uleb128 0 +- .uleb128 0 +-.Lcstend: +- +- +-#ifdef SHARED +- .hidden DW.ref.__gcc_personality_v0 +- .weak DW.ref.__gcc_personality_v0 +- .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits +- .align LP_SIZE +- .type DW.ref.__gcc_personality_v0, @object +- .size DW.ref.__gcc_personality_v0, LP_SIZE +-DW.ref.__gcc_personality_v0: +- ASM_ADDR __gcc_personality_v0 +-#endif +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/sem_post.c +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/alpha/nptl/sem_post.c ++++ /dev/null +@@ -1,5 +0,0 @@ +-/* ??? This is an ass-backwards way to do this. We should simply define +- the acquire/release semantics of atomic_exchange_and_add. And even if +- we don't do this, we should be using atomic_full_barrier or otherwise. */ +-#define __lll_rel_instr "mb" +-#include +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S ++++ /dev/null +@@ -1,111 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +-#include "lowlevel-atomic.h" +- +- +- .text +- +- .globl __new_sem_post +- .type __new_sem_post,@function +- .align 5 +- cfi_startproc +-__new_sem_post: +- mov.l @(VALUE,r4), r2 +-0: +- mov.l .Lmax, r1 +- cmp/eq r1, r2 +- bt/s 3f +- mov r2, r3 +- mov r3, r5 +- add #1, r5 +- CMPXCHG (r3, @(VALUE,r4), r5, r2) +- bf 0b +- mov.l @(NWAITERS,r4), r2 +- tst r2, r2 +- bt 2f +- mov #FUTEX_WAKE, r5 +- mov.l @(PRIVATE,r4), r1 +- or r1, r5 +- mov #1, r6 +- mov #0, r7 +- mov #SYS_futex, r3 +- extu.b r3, r3 +- trapa #0x14 +- SYSCALL_INST_PAD +- +- cmp/pz r0 +- bf 1f +-2: +- rts +- mov #0, r0 +- +-1: +- bra 4f +- mov #EINVAL, r2 +- +-3: +- mov #EOVERFLOW, r2 +-4: +- mov.l r12, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r12, 0) +- mov.l r8, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r8, 0) +- sts.l pr, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (pr, 0) +- mova .Lgot3, r0 +- mov.l .Lgot3, r12 +- add r0, r12 +- +- mov.l .Lerrno3, r0 +- stc gbr, r1 +- mov.l @(r0, r12), r0 +- bra .Lexit +- add r1, r0 +- .align 2 +-.Lerrno3: +- .long errno@GOTTPOFF +-.Lexit: +- mov.l r2, @r0 +- lds.l @r15+, pr +- cfi_adjust_cfa_offset (-4) +- cfi_restore (pr) +- mov.l @r15+, r8 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r8) +- mov.l @r15+, r12 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r12) +- rts +- mov #-1, r0 +- cfi_endproc +- +- .align 2 +-.Lmax: +- .long SEM_VALUE_MAX +-.Lgot3: +- .long _GLOBAL_OFFSET_TABLE_ +- .size __new_sem_post,.-__new_sem_post +- versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S ++++ /dev/null +@@ -1,281 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include "lowlevel-atomic.h" +- +- +-#if VALUE != 0 +-# error "code needs to be rewritten for VALUE != 0" +-#endif +- +- .text +- +- .globl sem_timedwait +- .type sem_timedwait,@function +- .align 5 +- cfi_startproc +-sem_timedwait: +-.LSTARTCODE: +-#ifdef SHARED +- cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect, +- DW.ref.__gcc_personality_v0) +- cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART) +-#else +- cfi_personality(DW_EH_PE_absptr, __gcc_personality_v0) +- cfi_lsda(DW_EH_PE_absptr, .LexceptSTART) +-#endif +- mov.l @r4, r0 +-2: +- tst r0, r0 +- bt 1f +- mov r0, r3 +- mov r0, r6 +- add #-1, r3 +- CMPXCHG (r6, @r4, r3, r2) +- bf/s 2b +- mov r2, r0 +- rts +- mov #0, r0 +- +-1: +- /* Check whether the timeout value is valid. */ +- mov.l r8, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r8, 0) +- mov.l r9, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r9, 0) +- mov.l r10, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r10, 0) +- mov.l r12, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r12, 0) +- sts.l pr, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (pr, 0) +- add #-8, r15 +- cfi_adjust_cfa_offset (8) +- +- mov r4, r8 +- mov r5, r9 +- +- /* Check for invalid nanosecond field. */ +- mov.l @(4,r9), r0 +- mov.l .L1g, r1 +- cmp/hs r1, r0 +- bt/s .Lerrno_exit +- mov #EINVAL, r10 +- INC (@(NWAITERS,r8),r2) +- +-7: +- /* Compute relative timeout. */ +- mov r15, r4 +- mov #0, r5 +- mov #__NR_gettimeofday, r3 +- trapa #0x12 +- SYSCALL_INST_PAD +- +- mov.l @(4,r15), r0 +- mov.w .L1k, r1 +- dmulu.l r0, r1 /* Milli seconds to nano seconds. */ +- mov.l @r9, r2 +- mov.l @(4,r9), r3 +- mov.l @r15, r0 +- sts macl, r1 +- sub r0, r2 +- clrt +- subc r1, r3 +- bf 5f +- mov.l .L1g, r1 +- add r1, r3 +- add #-1, r2 +-5: +- cmp/pz r2 +- bf/s 6f /* Time is already up. */ +- mov #ETIMEDOUT, r0 +- +- /* Store relative timeout. */ +- mov.l r2, @r15 +- mov.l r3, @(4,r15) +- +-.LcleanupSTART: +- mov.l .Lenable0, r1 +- bsrf r1 +- nop +-.Lenable0b: +- mov r0, r10 +- +- mov r8, r4 +-#if FUTEX_WAIT == 0 +- mov.l @(PRIVATE,r8), r5 +-#else +- mov.l @(PRIVATE,r8), r5 +- mov #FUTEX_WAIT, r0 +- or r0, r5 +-#endif +- mov #0, r6 +- mov r15, r7 +- mov #SYS_futex, r3 +- extu.b r3, r3 +- trapa #0x14 +- SYSCALL_INST_PAD +- +- mov.l .Ldisable0, r1 +- mov r10, r4 +- bsrf r1 +- mov r0, r10 +-.Ldisable0b: +- mov r10, r0 +-.LcleanupEND: +- +- tst r0, r0 +- bt 9f +- cmp/eq #-EWOULDBLOCK, r0 +- bf 3f +-9: +- mov.l @r8, r0 +-8: +- tst r0, r0 +- bt 7b +- +- mov r0, r3 +- mov r0, r4 +- add #-1, r3 +- CMPXCHG (r4, @r8, r3, r2) +- bf/s 8b +- mov r2, r0 +- +- DEC (@(NWAITERS,r8), r2) +- mov #0, r0 +- +-10: +- cfi_remember_state +- add #8, r15 +- cfi_adjust_cfa_offset (-8) +- lds.l @r15+, pr +- cfi_adjust_cfa_offset (-4) +- cfi_restore (pr) +- mov.l @r15+, r12 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r12) +- mov.l @r15+, r10 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r10) +- mov.l @r15+, r9 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r9) +- mov.l @r15+, r8 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r8) +- rts +- nop +- cfi_restore_state +- +-3: +- neg r0, r0 +-6: +- mov r0, r10 +- DEC (@(NWAITERS,r8), r2) +-.Lerrno_exit: +- mova .Lgot2, r0 +- mov.l .Lgot2, r12 +- add r0, r12 +- +- mov.l .Lerrno2, r0 +- stc gbr, r1 +- mov.l @(r0, r12), r0 +- bra .Lexit +- add r1, r0 +- .align 2 +-.Lerrno2: +- .long errno@GOTTPOFF +-.Lexit: +- mov.l r10, @r0 +- bra 10b +- mov #-1, r0 +- +-.L1k: +- .word 1000 +- .align 2 +-.L1g: +- .long 1000000000 +-.Lgot2: +- .long _GLOBAL_OFFSET_TABLE_ +-.Lenable0: +- .long __pthread_enable_asynccancel-.Lenable0b +-.Ldisable0: +- .long __pthread_disable_asynccancel-.Ldisable0b +- .size sem_timedwait,.-sem_timedwait +- +- .type sem_wait_cleanup,@function +-sem_wait_cleanup: +- DEC (@(NWAITERS,r8), r2) +-.LcallUR: +- mov.l .Lresume, r1 +-#ifdef PIC +- add r12, r1 +-#endif +- jsr @r1 +- nop +- sleep +- +- .align 2 +-.Lresume: +-#ifdef PIC +- .long _Unwind_Resume@GOTOFF +-#else +- .long _Unwind_Resume +-#endif +-.LENDCODE: +- cfi_endproc +- .size sem_wait_cleanup,.-sem_wait_cleanup +- +- +- .section .gcc_except_table,"a",@progbits +-.LexceptSTART: +- .byte DW_EH_PE_omit ! @LPStart format (omit) +- .byte DW_EH_PE_omit ! @TType format (omit) +- .byte DW_EH_PE_uleb128 ! call-site format +- .uleb128 .Lcstend-.Lcstbegin +-.Lcstbegin: +- .uleb128 .LcleanupSTART-.LSTARTCODE +- .uleb128 .LcleanupEND-.LcleanupSTART +- .uleb128 sem_wait_cleanup-.LSTARTCODE +- .uleb128 0 +- .uleb128 .LcallUR-.LSTARTCODE +- .uleb128 .LENDCODE-.LcallUR +- .uleb128 0 +- .uleb128 0 +-.Lcstend: +- +-#ifdef SHARED +- .hidden DW.ref.__gcc_personality_v0 +- .weak DW.ref.__gcc_personality_v0 +- .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits +- .align 4 +- .type DW.ref.__gcc_personality_v0, @object +- .size DW.ref.__gcc_personality_v0, 4 +-DW.ref.__gcc_personality_v0: +- .long __gcc_personality_v0 +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S ++++ /dev/null +@@ -1,102 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include "lowlevel-atomic.h" +- +- +- .text +- +- .globl __new_sem_trywait +- .type __new_sem_trywait,@function +- .align 5 +- cfi_startproc +-__new_sem_trywait: +- mov.l r12, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r12, 0) +- mov.l r8, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r8, 0) +- sts.l pr, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (pr, 0) +- mov r4, r8 +- mov.l @r8, r0 +-2: +- tst r0, r0 +- bt 1f +- +- mov r0, r3 +- mov r0, r4 +- add #-1, r3 +- CMPXCHG (r4, @r8, r3, r2) +- bf/s 2b +- mov r2, r0 +- +- cfi_remember_state +- lds.l @r15+, pr +- cfi_adjust_cfa_offset (-4) +- cfi_restore (pr) +- mov.l @r15+, r8 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r8) +- mov.l @r15+, r12 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r12) +- rts +- mov #0, r0 +- cfi_restore_state +- +-1: +- mov #EAGAIN, r8 +- mova .Lgot1, r0 +- mov.l .Lgot1, r12 +- add r0, r12 +- +- mov.l .Lerrno1, r0 +- stc gbr, r1 +- mov.l @(r0, r12), r0 +- bra .Lexit +- add r1, r0 +- .align 2 +-.Lerrno1: +- .long errno@GOTTPOFF +-.Lexit: +- mov.l r8, @r0 +- lds.l @r15+, pr +- cfi_adjust_cfa_offset (-4) +- cfi_restore (pr) +- mov.l @r15+, r8 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r8) +- mov.l @r15+, r12 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r12) +- rts +- mov #-1, r0 +- +- cfi_endproc +- +- .align 2 +-.Lgot1: +- .long _GLOBAL_OFFSET_TABLE_ +- .size __new_sem_trywait,.-__new_sem_trywait +- versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S ++++ /dev/null +@@ -1,229 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include "lowlevel-atomic.h" +- +- +-#if VALUE != 0 +-# error "code needs to be rewritten for VALUE != 0" +-#endif +- +- .text +- +- .globl __new_sem_wait +- .type __new_sem_wait,@function +- .align 5 +- cfi_startproc +-__new_sem_wait: +-.LSTARTCODE: +-#ifdef SHARED +- cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect, +- DW.ref.__gcc_personality_v0) +- cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART) +-#else +- cfi_personality(DW_EH_PE_absptr, __gcc_personality_v0) +- cfi_lsda(DW_EH_PE_absptr, .LexceptSTART) +-#endif +- mov.l r8, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r8, 0) +- mov.l r10, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r10, 0) +- mov.l r12, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r12, 0) +- sts.l pr, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (pr, 0) +- +- mov r4, r8 +- mov.l @r8, r0 +-2: +- tst r0, r0 +- bt 1f +- mov r0, r3 +- mov r0, r4 +- add #-1, r3 +- CMPXCHG (r4, @r8, r3, r2) +- bf/s 2b +- mov r2, r0 +-7: +- mov #0, r0 +-9: +- cfi_remember_state +- lds.l @r15+, pr +- cfi_adjust_cfa_offset (-4) +- cfi_restore (pr) +- mov.l @r15+, r12 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r12) +- mov.l @r15+, r10 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r10) +- rts +- mov.l @r15+, r8 +- /* Omit CFI for restore in delay slot. */ +- cfi_restore_state +- +-.Lafter_ret: +-1: +- INC (@(NWAITERS,r8),r2) +- +-.LcleanupSTART: +-6: +- mov.l .Lenable0, r1 +- bsrf r1 +- nop +-.Lenable0b: +- mov r0, r10 +- +- mov r8, r4 +-#if FUTEX_WAIT == 0 +- mov.l @(PRIVATE,r8), r5 +-#else +- mov.l @(PRIVATE,r8), r5 +- mov #FUTEX_WAIT, r0 +- or r0, r5 +-#endif +- mov #0, r6 +- mov #0, r7 +- mov #SYS_futex, r3 +- extu.b r3, r3 +- trapa #0x14 +- SYSCALL_INST_PAD +- +- mov.l .Ldisable0, r1 +- mov r10, r4 +- bsrf r1 +- mov r0, r10 +-.Ldisable0b: +- mov r10, r0 +-.LcleanupEND: +- +- tst r0, r0 +- bt 3f +- cmp/eq #-EWOULDBLOCK, r0 +- bf 4f +- +-3: +- mov.l @r8, r0 +-5: +- tst r0, r0 +- bt 6b +- +- mov r0, r3 +- mov r0, r4 +- add #-1, r3 +- CMPXCHG (r4, @r8, r3, r2) +- bf/s 5b +- mov r2, r0 +- +- DEC (@(NWAITERS,r8), r2) +- bra 7b +- nop +- +-4: +- neg r0, r0 +- mov r0, r4 +- DEC (@(NWAITERS,r8), r2) +- mov r4, r8 +- mova .Lgot0, r0 +- mov.l .Lgot0, r12 +- add r0, r12 +- +- mov.l .Lerrno0, r0 +- stc gbr, r1 +- mov.l @(r0, r12), r0 +- bra .Lexit +- add r1, r0 +- .align 2 +-.Lerrno0: +- .long errno@GOTTPOFF +-.Lexit: +- mov.l r8, @r0 +- bra 9b +- mov #-1, r0 +- +- .align 2 +-.Lgot0: +- .long _GLOBAL_OFFSET_TABLE_ +-.Lenable0: +- .long __pthread_enable_asynccancel-.Lenable0b +-.Ldisable0: +- .long __pthread_disable_asynccancel-.Ldisable0b +- .size __new_sem_wait,.-__new_sem_wait +- versioned_symbol(libpthread, __new_sem_wait, sem_wait, GLIBC_2_1) +- +- +- .type sem_wait_cleanup,@function +-sem_wait_cleanup: +- DEC (@(NWAITERS,r8), r2) +-.LcallUR: +- mov.l .Lresume, r1 +-#ifdef PIC +- add r12, r1 +-#endif +- jsr @r1 +- nop +- sleep +- +- .align 2 +-.Lresume: +-#ifdef PIC +- .long _Unwind_Resume@GOTOFF +-#else +- .long _Unwind_Resume +-#endif +-.LENDCODE: +- cfi_endproc +- .size sem_wait_cleanup,.-sem_wait_cleanup +- +- +- .section .gcc_except_table,"a",@progbits +-.LexceptSTART: +- .byte DW_EH_PE_omit ! @LPStart format (omit) +- .byte DW_EH_PE_omit ! @TType format (omit) +- .byte DW_EH_PE_uleb128 ! call-site format +- .uleb128 .Lcstend-.Lcstbegin +-.Lcstbegin: +- .uleb128 .LcleanupSTART-.LSTARTCODE +- .uleb128 .LcleanupEND-.LcleanupSTART +- .uleb128 sem_wait_cleanup-.LSTARTCODE +- .uleb128 0 +- .uleb128 .LcallUR-.LSTARTCODE +- .uleb128 .LENDCODE-.LcallUR +- .uleb128 0 +- .uleb128 0 +-.Lcstend: +- +-#ifdef SHARED +- .hidden DW.ref.__gcc_personality_v0 +- .weak DW.ref.__gcc_personality_v0 +- .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits +- .align 4 +- .type DW.ref.__gcc_personality_v0, @object +- .size DW.ref.__gcc_personality_v0, 4 +-DW.ref.__gcc_personality_v0: +- .long __gcc_personality_v0 +-#endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/Makefile ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/Makefile +@@ -24,8 +24,7 @@ libpthread-sysdep_routines += pt-fork pt + + gen-as-const-headers += lowlevelcond.sym lowlevelrwlock.sym \ + lowlevelbarrier.sym unwindbuf.sym \ +- lowlevelrobustlock.sym pthread-pi-defines.sym \ +- structsem.sym ++ lowlevelrobustlock.sym pthread-pi-defines.sym + endif + + ifeq ($(subdir),posix) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +@@ -225,17 +225,18 @@ LLL_STUB_UNWIND_INFO_END + + + #define lll_futex_wake(futex, nr, private) \ +- do { \ +- int __ignore; \ ++ ({ \ ++ int __status; \ + register __typeof (nr) _nr __asm ("edx") = (nr); \ + LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \ + __asm __volatile ("syscall" \ +- : "=a" (__ignore) \ ++ : "=a" (__status) \ + : "0" (SYS_futex), "D" (futex), \ + "S" (__lll_private_flag (FUTEX_WAKE, private)), \ + "d" (_nr) \ + : "memory", "cc", "r10", "r11", "cx"); \ +- } while (0) ++ __status; \ ++ }) + + + /* NB: in the lll_trylock macro we simply return the value in %eax +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +@@ -224,20 +224,21 @@ LLL_STUB_UNWIND_INFO_END + + + #define lll_futex_wake(futex, nr, private) \ +- do { \ +- int __ignore; \ ++ ({ \ ++ int __status; \ + register __typeof (nr) _nr asm ("edx") = (nr); \ + LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \ + __asm __volatile (LLL_EBX_LOAD \ + LLL_ENTER_KERNEL \ + LLL_EBX_LOAD \ +- : "=a" (__ignore) \ ++ : "=a" (__status) \ + : "0" (SYS_futex), LLL_EBX_REG (futex), \ + "c" (__lll_private_flag (FUTEX_WAKE, private)), \ + "d" (_nr), \ + "i" (0) /* phony, to align next arg's number */, \ + "i" (offsetof (tcbhead_t, sysinfo))); \ +- } while (0) ++ __status; \ ++ }) + + + /* NB: in the lll_trylock macro we simply return the value in %eax diff --git a/SOURCES/glibc-rh1064063.patch b/SOURCES/glibc-rh1064063.patch new file mode 100644 index 0000000..154ab66 --- /dev/null +++ b/SOURCES/glibc-rh1064063.patch @@ -0,0 +1,70 @@ +commit a3e5b4feeb54cb92657ec2bc6d9be1fcef9e8575 +Author: Paul E. Murphy +Date: Mon Jan 11 17:24:04 2016 -0500 + + Fix race in tst-mqueue5 + + The check is done on line 117 by a thread spawned + from do_child(), forked from do_test(). This test + generates a signal in the forked process. + + Either thread may handle the signal, and on ppc, + it happens to be done on do_child, on the thread + which is not doing the check on line 117. + + This exposes a race condition whereby the test + incorrectly fails as the signal is caught during + or after the check. + + This is mitigated by ensuring the signal is blocked + in the child thread while thread is running. + + 2016-01-15 Martin Sebor + + [BZ #19432] +diff --git a/rt/tst-mqueue5.c b/rt/tst-mqueue5.c +index aa74fa3..25042bc 100644 +--- a/rt/tst-mqueue5.c ++++ b/rt/tst-mqueue5.c +@@ -116,7 +116,7 @@ thr (void *arg) + + if (rtmin_cnt != 2) + { +- puts ("SIGRTMIN signal in child did not arrive"); ++ puts ("SIGRTMIN signal in thread did not arrive"); + result = 1; + } + else if (rtmin_pid != getppid () +@@ -403,6 +403,16 @@ do_child (const char *name, pthread_barrier_t *b2, pthread_barrier_t *b3, + result = 1; + } + ++ /* Ensure the thr thread gets the signal, not us. */ ++ sigset_t set; ++ sigemptyset (&set); ++ sigaddset (&set, SIGRTMIN); ++ if (pthread_sigmask (SIG_BLOCK, &set, NULL)) ++ { ++ printf ("Failed to block SIGRTMIN in child: %m\n"); ++ result = 1; ++ } ++ + (void) pthread_barrier_wait (b2); + + /* Parent calls mqsend (q), which should wake up mqrecv (q) +@@ -514,7 +524,14 @@ do_child (const char *name, pthread_barrier_t *b2, pthread_barrier_t *b3, + result = 1; + } + +- void *thr_ret; ++ /* Reenable test signals before cleaning up the thread. */ ++ if (pthread_sigmask (SIG_UNBLOCK, &set, NULL)) ++ { ++ printf ("Failed to unblock SIGRTMIN in child: %m\n"); ++ result = 1; ++ } ++ ++ void *thr_ret; + ret = pthread_join (th, &thr_ret); + if (ret) + { diff --git a/SOURCES/glibc-rh1140250.patch b/SOURCES/glibc-rh1140250.patch new file mode 100644 index 0000000..570adbe --- /dev/null +++ b/SOURCES/glibc-rh1140250.patch @@ -0,0 +1,346 @@ +commit 7fe9e2e089f4990b7d18d0798f591ab276b15f2b +Author: Florian Weimer +Date: Fri Jun 5 10:50:38 2015 +0200 + + posix_fallocate: Emulation fixes and documentation [BZ #15661] + + Handle signed integer overflow correctly. Detect and reject O_APPEND. + Document drawbacks of emulation. + + This does not completely address bug 15661, but improves the situation + somewhat. + +commit 543ef578c3304661713950b37abd0c916f52ecf0 +Author: Paul Eggert +Date: Tue Aug 25 23:42:01 2015 -0700 + + Fix broken overflow check in posix_fallocate [BZ 18873] + + * sysdeps/posix/posix_fallocate.c (posix_fallocate): + * sysdeps/posix/posix_fallocate64.c (__posix_fallocate64_l64): + Fix parenthesization typo. + +Index: b/manual/filesys.texi +=================================================================== +--- a/manual/filesys.texi ++++ b/manual/filesys.texi +@@ -1723,6 +1723,7 @@ modify the attributes of a file. + access a file. + * File Times:: About the time attributes of a file. + * File Size:: Manually changing the size of a file. ++* Storage Allocation:: Allocate backing storage for files. + @end menu + + @node Attribute Meanings +@@ -3232,6 +3233,99 @@ is a requirement of @code{mmap}. The pr + real size, and when it has finished a final @code{ftruncate} call should + set the real size of the file. + ++@node Storage Allocation ++@subsection Storage Allocation ++@cindex allocating file storage ++@cindex file allocation ++@cindex storage allocating ++ ++@cindex file fragmentation ++@cindex fragmentation of files ++@cindex sparse files ++@cindex files, sparse ++Most file systems support allocating large files in a non-contiguous ++fashion: the file is split into @emph{fragments} which are allocated ++sequentially, but the fragments themselves can be scattered across the ++disk. File systems generally try to avoid such fragmentation because it ++decreases performance, but if a file gradually increases in size, there ++might be no other option than to fragment it. In addition, many file ++systems support @emph{sparse files} with @emph{holes}: regions of null ++bytes for which no backing storage has been allocated by the file ++system. When the holes are finally overwritten with data, fragmentation ++can occur as well. ++ ++Explicit allocation of storage for yet-unwritten parts of the file can ++help the system to avoid fragmentation. Additionally, if storage ++pre-allocation fails, it is possible to report the out-of-disk error ++early, often without filling up the entire disk. However, due to ++deduplication, copy-on-write semantics, and file compression, such ++pre-allocation may not reliably prevent the out-of-disk-space error from ++occurring later. Checking for write errors is still required, and ++writes to memory-mapped regions created with @code{mmap} can still ++result in @code{SIGBUS}. ++ ++@deftypefun int posix_fallocate (int @var{fd}, off_t @var{offset}, off_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c If the file system does not support allocation, ++@c @code{posix_fallocate} has a race with file extension (if ++@c @var{length} is zero) or with concurrent writes of non-NUL bytes (if ++@c @var{length} is positive). ++ ++Allocate backing store for the region of @var{length} bytes starting at ++byte @var{offset} in the file for the descriptor @var{fd}. The file ++length is increased to @samp{@var{length} + @var{offset}} if necessary. ++ ++@var{fd} must be a regular file opened for writing, or @code{EBADF} is ++returned. If there is insufficient disk space to fulfill the allocation ++request, @code{ENOSPC} is returned. ++ ++@strong{Note:} If @code{fallocate} is not available (because the file ++system does not support it), @code{posix_fallocate} is emulated, which ++has the following drawbacks: ++ ++@itemize @bullet ++@item ++It is very inefficient because all file system blocks in the requested ++range need to be examined (even if they have been allocated before) and ++potentially rewritten. In contrast, with proper @code{fallocate} ++support (see below), the file system can examine the internal file ++allocation data structures and eliminate holes directly, maybe even ++using unwritten extents (which are pre-allocated but uninitialized on ++disk). ++ ++@item ++There is a race condition if another thread or process modifies the ++underlying file in the to-be-allocated area. Non-null bytes could be ++overwritten with null bytes. ++ ++@item ++If @var{fd} has been opened with the @code{O_APPEND} flag, the function ++will fail with an @code{errno} value of @code{EBADF}. ++ ++@item ++If @var{length} is zero, @code{ftruncate} is used to increase the file ++size as requested, without allocating file system blocks. There is a ++race condition which means that @code{ftruncate} can accidentally ++truncate the file if it has been extended concurrently. ++@end itemize ++ ++On Linux, if an application does not benefit from emulation or if the ++emulation is harmful due to its inherent race conditions, the ++application can use the Linux-specific @code{fallocate} function, with a ++zero flag argument. For the @code{fallocate} function, @theglibc{} does ++not perform allocation emulation if the file system does not support ++allocation. Instead, an @code{EOPNOTSUPP} is returned to the caller. ++ ++@end deftypefun ++ ++@deftypefun int posix_fallocate64 (int @var{fd}, off64_t @var{length}, off64_t @var{offset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++ ++This function is a variant of @code{posix_fallocate64} which accepts ++64-bit file offsets on all platforms. ++ ++@end deftypefun ++ + @node Making Special Files + @section Making Special Files + @cindex creating special files +Index: b/sysdeps/posix/posix_fallocate.c +=================================================================== +--- a/sysdeps/posix/posix_fallocate.c ++++ b/sysdeps/posix/posix_fallocate.c +@@ -18,26 +18,36 @@ + #include + #include + #include ++#include ++#include + #include + #include + +-/* Reserve storage for the data of the file associated with FD. */ ++/* Reserve storage for the data of the file associated with FD. This ++ emulation is far from perfect, but the kernel cannot do not much ++ better for network file systems, either. */ + + int + posix_fallocate (int fd, __off_t offset, __off_t len) + { + struct stat64 st; +- struct statfs f; + +- /* `off_t' is a signed type. Therefore we can determine whether +- OFFSET + LEN is too large if it is a negative value. */ + if (offset < 0 || len < 0) + return EINVAL; +- if (offset + len < 0) ++ ++ /* Perform overflow check. The outer cast relies on a GCC ++ extension. */ ++ if ((__off_t) ((uint64_t) offset + (uint64_t) len) < 0) + return EFBIG; + +- /* First thing we have to make sure is that this is really a regular +- file. */ ++ /* pwrite below will not do the right thing in O_APPEND mode. */ ++ { ++ int flags = __fcntl (fd, F_GETFL, 0); ++ if (flags < 0 || (flags & O_APPEND) != 0) ++ return EBADF; ++ } ++ ++ /* We have to make sure that this is really a regular file. */ + if (__fxstat64 (_STAT_VER, fd, &st) != 0) + return EBADF; + if (S_ISFIFO (st.st_mode)) +@@ -47,6 +57,8 @@ posix_fallocate (int fd, __off_t offset, + + if (len == 0) + { ++ /* This is racy, but there is no good way to satisfy a ++ zero-length allocation request. */ + if (st.st_size < offset) + { + int ret = __ftruncate (fd, offset); +@@ -58,19 +70,36 @@ posix_fallocate (int fd, __off_t offset, + return 0; + } + +- /* We have to know the block size of the filesystem to get at least some +- sort of performance. */ +- if (__fstatfs (fd, &f) != 0) +- return errno; +- +- /* Try to play safe. */ +- if (f.f_bsize == 0) +- f.f_bsize = 512; +- +- /* Write something to every block. */ +- for (offset += (len - 1) % f.f_bsize; len > 0; offset += f.f_bsize) ++ /* Minimize data transfer for network file systems, by issuing ++ single-byte write requests spaced by the file system block size. ++ (Most local file systems have fallocate support, so this fallback ++ code is not used there.) */ ++ ++ unsigned increment; ++ { ++ struct statfs64 f; ++ ++ if (__fstatfs64 (fd, &f) != 0) ++ return errno; ++ if (f.f_bsize == 0) ++ increment = 512; ++ else if (f.f_bsize < 4096) ++ increment = f.f_bsize; ++ else ++ /* NFS does not propagate the block size of the underlying ++ storage and may report a much larger value which would still ++ leave holes after the loop below, so we cap the increment at ++ 4096. */ ++ increment = 4096; ++ } ++ ++ /* Write a null byte to every block. This is racy; we currently ++ lack a better option. Compare-and-swap against a file mapping ++ might additional local races, but requires interposition of a ++ signal handler to catch SIGBUS. */ ++ for (offset += (len - 1) % increment; len > 0; offset += increment) + { +- len -= f.f_bsize; ++ len -= increment; + + if (offset < st.st_size) + { +Index: b/sysdeps/posix/posix_fallocate64.c +=================================================================== +--- a/sysdeps/posix/posix_fallocate64.c ++++ b/sysdeps/posix/posix_fallocate64.c +@@ -18,26 +18,36 @@ + #include + #include + #include ++#include ++#include + #include + #include + +-/* Reserve storage for the data of the file associated with FD. */ ++/* Reserve storage for the data of the file associated with FD. This ++ emulation is far from perfect, but the kernel cannot do not much ++ better for network file systems, either. */ + + int + __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) + { + struct stat64 st; +- struct statfs64 f; + +- /* `off64_t' is a signed type. Therefore we can determine whether +- OFFSET + LEN is too large if it is a negative value. */ + if (offset < 0 || len < 0) + return EINVAL; +- if (offset + len < 0) ++ ++ /* Perform overflow check. The outer cast relies on a GCC ++ extension. */ ++ if ((__off64_t) ((uint64_t) offset + (uint64_t) len) < 0) + return EFBIG; + +- /* First thing we have to make sure is that this is really a regular +- file. */ ++ /* pwrite64 below will not do the right thing in O_APPEND mode. */ ++ { ++ int flags = __fcntl (fd, F_GETFL, 0); ++ if (flags < 0 || (flags & O_APPEND) != 0) ++ return EBADF; ++ } ++ ++ /* We have to make sure that this is really a regular file. */ + if (__fxstat64 (_STAT_VER, fd, &st) != 0) + return EBADF; + if (S_ISFIFO (st.st_mode)) +@@ -47,6 +57,8 @@ __posix_fallocate64_l64 (int fd, __off64 + + if (len == 0) + { ++ /* This is racy, but there is no good way to satisfy a ++ zero-length allocation request. */ + if (st.st_size < offset) + { + int ret = __ftruncate64 (fd, offset); +@@ -58,19 +70,36 @@ __posix_fallocate64_l64 (int fd, __off64 + return 0; + } + +- /* We have to know the block size of the filesystem to get at least some +- sort of performance. */ +- if (__fstatfs64 (fd, &f) != 0) +- return errno; +- +- /* Try to play safe. */ +- if (f.f_bsize == 0) +- f.f_bsize = 512; +- +- /* Write something to every block. */ +- for (offset += (len - 1) % f.f_bsize; len > 0; offset += f.f_bsize) ++ /* Minimize data transfer for network file systems, by issuing ++ single-byte write requests spaced by the file system block size. ++ (Most local file systems have fallocate support, so this fallback ++ code is not used there.) */ ++ ++ unsigned increment; ++ { ++ struct statfs64 f; ++ ++ if (__fstatfs64 (fd, &f) != 0) ++ return errno; ++ if (f.f_bsize == 0) ++ increment = 512; ++ else if (f.f_bsize < 4096) ++ increment = f.f_bsize; ++ else ++ /* NFS clients do not propagate the block size of the underlying ++ storage and may report a much larger value which would still ++ leave holes after the loop below, so we cap the increment at ++ 4096. */ ++ increment = 4096; ++ } ++ ++ /* Write a null byte to every block. This is racy; we currently ++ lack a better option. Compare-and-swap against a file mapping ++ might address local races, but requires interposition of a signal ++ handler to catch SIGBUS. */ ++ for (offset += (len - 1) % increment; len > 0; offset += increment) + { +- len -= f.f_bsize; ++ len -= increment; + + if (offset < st.st_size) + { diff --git a/SOURCES/glibc-rh1165212.patch b/SOURCES/glibc-rh1165212.patch index 104c456..d5a5a7d 100644 --- a/SOURCES/glibc-rh1165212.patch +++ b/SOURCES/glibc-rh1165212.patch @@ -213,7 +213,7 @@ + dlerror (); + + /* Lookup func. */ -+ *(void **) (&func) = dlsym (dso, func_name); ++ func = (int (*) (void)) dlsym (dso, func_name); + if (func == NULL) + { + err = dlerror (); diff --git a/SOURCES/glibc-rh1189278-1.patch b/SOURCES/glibc-rh1189278-1.patch index b0e6bc5..012e005 100644 --- a/SOURCES/glibc-rh1189278-1.patch +++ b/SOURCES/glibc-rh1189278-1.patch @@ -10,6 +10,16 @@ # when constructing an application or DSO. We do not adjust the link # lines used to build lib* targets. # +# The rest of this patch is brought in by glibc-rh1292018-0a.patch +# where we need to link against ld.so from libm.so. +# + +commit fab7ce3f5b4060bf62659e8b58529de4156b5a2f +Author: Joseph Myers +Date: Fri May 31 16:16:33 2013 +0000 + + Link extra-libs consistently with libc and ld.so. + diff -urN glibc-2.17-c758a686/Makerules glibc-2.17-c758a686/Makerules --- glibc-2.17-c758a686/Makerules 2015-02-18 19:53:00.000000000 -0500 +++ glibc-2.17-c758a686/Makerules 2015-02-18 20:08:33.299000028 -0500 diff --git a/SOURCES/glibc-rh1207032.patch b/SOURCES/glibc-rh1207032.patch index 09a5c78..ae6ae18 100644 --- a/SOURCES/glibc-rh1207032.patch +++ b/SOURCES/glibc-rh1207032.patch @@ -48,9 +48,26 @@ Date: Tue May 19 06:40:37 2015 +0530 this patch. I also ran the malloc benchmarks and found an insignificant difference in timings (< 2%). -diff -pruN glibc-2.17-c758a686/malloc/arena.c glibc-2.17-c758a686/malloc/arena.c ---- glibc-2.17-c758a686/malloc/arena.c 2015-05-28 13:32:17.544433238 +0530 -+++ glibc-2.17-c758a686/malloc/arena.c 2015-05-28 15:29:02.605120231 +0530 + +The follow-on test-suite fix has been folded into the patch below, but +to keep it minimal, ignore_stderr is put directly into +tst-malloc-backtrace.c. + +commit 02242448bf431a69fd0b8c929ca4408a05479baa +Author: Tulio Magno Quites Machado Filho +Date: Tue Jun 2 10:32:25 2015 -0300 + + Avoid outputting to TTY after an expected memory corruption in testcase + + Protect TTY against an expected memory corruption from testcase + tst-malloc-backtrace, which is expected to SIGABRT after a forced memory + corruption. + + +Index: b/malloc/arena.c +=================================================================== +--- a/malloc/arena.c ++++ b/malloc/arena.c @@ -119,7 +119,7 @@ int __malloc_initialized = -1; #ifdef PER_THREAD @@ -92,9 +109,10 @@ diff -pruN glibc-2.17-c758a686/malloc/arena.c glibc-2.17-c758a686/malloc/arena.c LIBC_PROBE (memory_arena_reuse_wait, 3, &result->mutex, result, avoid_arena); (void)mutex_lock(&result->mutex); -diff -pruN glibc-2.17-c758a686/malloc/hooks.c glibc-2.17-c758a686/malloc/hooks.c ---- glibc-2.17-c758a686/malloc/hooks.c 2015-05-28 13:32:17.379431450 +0530 -+++ glibc-2.17-c758a686/malloc/hooks.c 2015-05-28 15:31:14.132551554 +0530 +Index: b/malloc/hooks.c +=================================================================== +--- a/malloc/hooks.c ++++ b/malloc/hooks.c @@ -109,7 +109,8 @@ malloc_check_get_size(mchunkptr p) size -= c) { if(c<=0 || size<(c+2*SIZE_SZ)) { @@ -135,9 +153,10 @@ diff -pruN glibc-2.17-c758a686/malloc/hooks.c glibc-2.17-c758a686/malloc/hooks.c return malloc_check(bytes, NULL); } const INTERNAL_SIZE_T oldsize = chunksize(oldp); -diff -pruN glibc-2.17-c758a686/malloc/Makefile glibc-2.17-c758a686/malloc/Makefile ---- glibc-2.17-c758a686/malloc/Makefile 2012-12-25 08:32:13.000000000 +0530 -+++ glibc-2.17-c758a686/malloc/Makefile 2015-05-28 13:34:11.967673754 +0530 +Index: b/malloc/Makefile +=================================================================== +--- a/malloc/Makefile ++++ b/malloc/Makefile @@ -25,7 +25,8 @@ all: dist-headers := malloc.h headers := $(dist-headers) obstack.h mcheck.h @@ -158,9 +177,10 @@ diff -pruN glibc-2.17-c758a686/malloc/Makefile glibc-2.17-c758a686/malloc/Makefi # These should be removed by `make clean'. extra-objs = mcheck-init.o libmcheck.a -diff -pruN glibc-2.17-c758a686/malloc/malloc.c glibc-2.17-c758a686/malloc/malloc.c ---- glibc-2.17-c758a686/malloc/malloc.c 2015-05-28 13:32:17.848436534 +0530 -+++ glibc-2.17-c758a686/malloc/malloc.c 2015-05-28 15:53:16.694991702 +0530 +Index: b/malloc/malloc.c +=================================================================== +--- a/malloc/malloc.c ++++ b/malloc/malloc.c @@ -1060,7 +1060,7 @@ static void* _int_realloc(mstate, mchun static void* _int_memalign(mstate, size_t, size_t); static void* _int_valloc(mstate, size_t); @@ -500,7 +520,7 @@ diff -pruN glibc-2.17-c758a686/malloc/malloc.c glibc-2.17-c758a686/malloc/malloc mutex_lock(&av->mutex); return NULL; } -@@ -4467,7 +4467,7 @@ static void* +@@ -4436,7 +4467,7 @@ static void* _int_valloc(mstate av, size_t bytes) { /* Ensure initialization/consolidation */ @@ -509,7 +529,7 @@ diff -pruN glibc-2.17-c758a686/malloc/malloc.c glibc-2.17-c758a686/malloc/malloc return _int_memalign(av, GLRO(dl_pagesize), bytes); } -@@ -4482,7 +4482,7 @@ _int_pvalloc(mstate av, size_t bytes) +@@ -4451,7 +4482,7 @@ _int_pvalloc(mstate av, size_t bytes) size_t pagesz; /* Ensure initialization/consolidation */ @@ -545,10 +565,11 @@ diff -pruN glibc-2.17-c758a686/malloc/malloc.c glibc-2.17-c758a686/malloc/malloc if ((action & 5) == 5) __libc_message (action & 2, "%s\n", str); else if (action & 1) -diff -pruN glibc-2.17-c758a686/malloc/tst-malloc-backtrace.c glibc-2.17-c758a686/malloc/tst-malloc-backtrace.c ---- glibc-2.17-c758a686/malloc/tst-malloc-backtrace.c 1970-01-01 05:30:00.000000000 +0530 -+++ glibc-2.17-c758a686/malloc/tst-malloc-backtrace.c 2015-05-28 15:54:10.135577633 +0530 -@@ -0,0 +1,50 @@ +Index: b/malloc/tst-malloc-backtrace.c +=================================================================== +--- /dev/null ++++ b/malloc/tst-malloc-backtrace.c +@@ -0,0 +1,71 @@ +/* Verify that backtrace does not deadlock on itself on memory corruption. + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. @@ -568,10 +589,28 @@ diff -pruN glibc-2.17-c758a686/malloc/tst-malloc-backtrace.c glibc-2.17-c758a686 + . */ + + ++#include ++#include +#include ++#include + +#define SIZE 4096 + ++/* Avoid all the buffer overflow messages on stderr. */ ++static void ++ignore_stderr (void) ++{ ++ int fd = open (_PATH_DEVNULL, O_WRONLY); ++ if (fd == -1) ++ close (STDERR_FILENO); ++ else ++ { ++ dup2 (fd, STDERR_FILENO); ++ close (fd); ++ } ++ setenv ("LIBC_FATAL_STDERR_", "1", 1); ++} ++ +/* Wrap free with a function to prevent gcc from optimizing it out. */ +static void +__attribute__((noinline)) @@ -587,7 +626,10 @@ diff -pruN glibc-2.17-c758a686/malloc/tst-malloc-backtrace.c glibc-2.17-c758a686 + void *ptr1 = malloc (SIZE); + void *ptr2 = malloc (SIZE); + -+ call_free (ptr1); ++ /* Avoid unwanted output to TTY after an expected memory corruption. */ ++ ignore_stderr (); ++ ++ call_free ((void *) ptr1); + ptr1 = malloc (SIZE); + + /* Not reached. The return statement is to put ptr2 into use so that gcc diff --git a/SOURCES/glibc-rh1211100.patch b/SOURCES/glibc-rh1211100.patch new file mode 100644 index 0000000..63bb49d --- /dev/null +++ b/SOURCES/glibc-rh1211100.patch @@ -0,0 +1,522 @@ +commit a1b85ae88b1a664e93ca0182c82f7763dd5a1754 +Author: Florian Weimer +Date: Mon Nov 9 16:52:31 2015 +0100 + + ld.so: Add original DSO name if overridden by audit module [BZ #18251] + +Index: b/elf/Makefile +=================================================================== +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -119,7 +119,8 @@ $(inst_auditdir)/sotruss-lib.so: $(objpf + endif + + tests = tst-tls1 tst-tls2 tst-tls9 tst-leaks1 \ +- tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 ++ tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \ ++ tst-audit11 tst-audit12 + tests-static = tst-tls1-static tst-tls2-static tst-stackguard1-static \ + tst-leaks1-static tst-array1-static tst-array5-static \ + tst-ptrguard1-static +@@ -216,7 +217,9 @@ modules-names = testobj1 testobj2 testob + tst-initorder2a tst-initorder2b tst-initorder2c \ + tst-initorder2d \ + tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \ +- tst-array5dep ++ tst-array5dep \ ++ tst-audit11mod1 tst-audit11mod2 tst-auditmod11 \ ++ tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 + ifeq (yesyes,$(have-fpie)$(build-shared)) + modules-names += tst-piemod1 + tests += tst-pie1 +@@ -1210,3 +1213,15 @@ $(objpfx)tst-unused-dep.out: $(objpfx)te + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ + $< > $@ + cmp $@ /dev/null > /dev/null ++ ++$(objpfx)tst-audit11.out: $(objpfx)tst-auditmod11.so $(objpfx)tst-audit11mod1.so ++$(objpfx)tst-audit11: $(libdl) ++tst-audit11-ENV = LD_AUDIT=$(objpfx)tst-auditmod11.so ++$(objpfx)tst-audit11mod1.so: $(objpfx)tst-audit11mod2.so ++LDFLAGS-tst-audit11mod2.so = -Wl,--version-script=tst-audit11mod2.map,-soname,tst-audit11mod2.so ++ ++$(objpfx)tst-audit12.out: $(objpfx)tst-auditmod12.so $(objpfx)tst-audit12mod1.so $(objpfx)tst-audit12mod3.so ++$(objpfx)tst-audit12: $(libdl) ++tst-audit12-ENV = LD_AUDIT=$(objpfx)tst-auditmod12.so ++$(objpfx)tst-audit12mod1.so: $(objpfx)tst-audit12mod2.so ++LDFLAGS-tst-audit12mod2.so = -Wl,--version-script=tst-audit12mod2.map +Index: b/elf/dl-load.c +=================================================================== +--- a/elf/dl-load.c ++++ b/elf/dl-load.c +@@ -909,9 +909,10 @@ lose (int code, int fd, const char *name + static + #endif + struct link_map * +-_dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, +- char *realname, struct link_map *loader, int l_type, +- int mode, void **stack_endp, Lmid_t nsid) ++_dl_map_object_from_fd (const char *name, const char *origname, int fd, ++ struct filebuf *fbp, char *realname, ++ struct link_map *loader, int l_type, int mode, ++ void **stack_endp, Lmid_t nsid) + { + struct link_map *l = NULL; + const ElfW(Ehdr) *header; +@@ -1582,6 +1583,17 @@ cannot enable executable stack as shared + l->l_dev = st.st_dev; + l->l_ino = st.st_ino; + ++#ifdef SHARED ++ /* When auditing is used the recorded names might not include the ++ name by which the DSO is actually known. Add that as well. */ ++ if (__glibc_unlikely (origname != NULL)) ++ add_name_to_object (l, origname); ++#else ++ /* Audit modules only exist when linking is dynamic so ORIGNAME ++ cannot be non-NULL. */ ++ assert (origname == NULL); ++#endif ++ + /* When we profile the SONAME might be needed for something else but + loading. Add it right away. */ + if (__builtin_expect (GLRO(dl_profile) != NULL, 0) +@@ -2081,6 +2093,7 @@ _dl_map_object (struct link_map *loader, + int type, int trace_mode, int mode, Lmid_t nsid) + { + int fd; ++ const char *origname = NULL; + char *realname; + char *name_copy; + struct link_map *l; +@@ -2144,6 +2157,7 @@ _dl_map_object (struct link_map *loader, + { + if (afct->objsearch != NULL) + { ++ const char *before = name; + name = afct->objsearch (name, &loader->l_audit[cnt].cookie, + LA_SER_ORIG); + if (name == NULL) +@@ -2152,6 +2166,15 @@ _dl_map_object (struct link_map *loader, + fd = -1; + goto no_file; + } ++ if (before != name && strcmp (before, name) != 0) ++ { ++ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) ++ _dl_debug_printf ("audit changed filename %s -> %s\n", ++ before, name); ++ ++ if (origname == NULL) ++ origname = before; ++ } + } + + afct = afct->next; +@@ -2371,8 +2394,8 @@ _dl_map_object (struct link_map *loader, + } + + void *stack_end = __libc_stack_end; +- return _dl_map_object_from_fd (name, fd, &fb, realname, loader, type, mode, +- &stack_end, nsid); ++ return _dl_map_object_from_fd (name, origname, fd, &fb, realname, loader, ++ type, mode, &stack_end, nsid); + } + + +Index: b/elf/tst-audit11.c +=================================================================== +--- /dev/null ++++ b/elf/tst-audit11.c +@@ -0,0 +1,36 @@ ++/* Test version symbol binding can find a DSO replaced by la_objsearch. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++int ++do_test (void) ++{ ++ puts ("Start"); ++ if (dlopen ("$ORIGIN/tst-audit11mod1.so", RTLD_LAZY) == NULL) ++ { ++ printf ("module not loaded: %s\n", dlerror ()); ++ return 1; ++ } ++ puts ("OK"); ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +Index: b/elf/tst-audit11mod1.c +=================================================================== +--- /dev/null ++++ b/elf/tst-audit11mod1.c +@@ -0,0 +1,24 @@ ++/* DSO directly opened by tst-audit11. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++extern int f2 (void); ++int ++f1 (void) ++{ ++ return f2 (); ++} +Index: b/elf/tst-audit11mod2.c +=================================================================== +--- /dev/null ++++ b/elf/tst-audit11mod2.c +@@ -0,0 +1,23 @@ ++/* DSO indirectly opened by tst-audit11, with symbol versioning. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++int ++f2 (void) ++{ ++ return 42; ++} +Index: b/elf/tst-audit11mod2.map +=================================================================== +--- /dev/null ++++ b/elf/tst-audit11mod2.map +@@ -0,0 +1,22 @@ ++/* Symbol versioning for the DSO indirectly opened by tst-audit11. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++V1 { ++ global: f2; ++ local: *; ++}; +Index: b/elf/tst-audit12.c +=================================================================== +--- /dev/null ++++ b/elf/tst-audit12.c +@@ -0,0 +1,49 @@ ++/* Test that symbol is bound to a DSO replaced by la_objsearch. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++int ++do_test (void) ++{ ++ puts ("Start"); ++ void *h = dlopen ("$ORIGIN/tst-audit12mod1.so", RTLD_LAZY); ++ if (h == NULL) ++ { ++ printf ("module not loaded: %s\n", dlerror ()); ++ return 1; ++ } ++ int (*fp) (void) = (int (*) (void)) dlsym (h, "f1"); ++ if (fp == NULL) ++ { ++ printf ("function f1 not found: %s\n", dlerror ()); ++ return 1; ++ } ++ int res = fp (); ++ if (res != 43) ++ { ++ puts ("incorrect function f2 called"); ++ return 1; ++ } ++ printf ("%d is OK\n", res); ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +Index: b/elf/tst-audit12mod1.c +=================================================================== +--- /dev/null ++++ b/elf/tst-audit12mod1.c +@@ -0,0 +1,24 @@ ++/* DSO directly opened by tst-audit12. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++extern int f2 (void); ++int ++f1 (void) ++{ ++ return f2 (); ++} +Index: b/elf/tst-audit12mod2.c +=================================================================== +--- /dev/null ++++ b/elf/tst-audit12mod2.c +@@ -0,0 +1,23 @@ ++/* Replaced DSO referenced by tst-audit12mod1.so, for tst-audit12. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++int ++f2 (void) ++{ ++ return 42; ++} +Index: b/elf/tst-audit12mod2.map +=================================================================== +--- /dev/null ++++ b/elf/tst-audit12mod2.map +@@ -0,0 +1,22 @@ ++/* Symbol versioning for tst-audit12mod2.so used by tst-audit12. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++V1 { ++ global: f2; ++ local: *; ++}; +Index: b/elf/tst-audit12mod3.c +=================================================================== +--- /dev/null ++++ b/elf/tst-audit12mod3.c +@@ -0,0 +1,23 @@ ++/* Replacement DSO loaded by the audit module, for tst-audit12. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++int ++f2 (void) ++{ ++ return 43; ++} +Index: b/elf/tst-auditmod11.c +=================================================================== +--- /dev/null ++++ b/elf/tst-auditmod11.c +@@ -0,0 +1,39 @@ ++/* Audit module for tst-audit11. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++unsigned int ++la_version (unsigned int version) ++{ ++ return version; ++} ++ ++char * ++la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag) ++{ ++ if (strcmp (name, "tst-audit11mod2.so") == 0) ++ { ++ return (char *) "$ORIGIN/tst-audit11mod2.so"; ++ } ++ return (char *) name; ++} +Index: b/elf/tst-auditmod12.c +=================================================================== +--- /dev/null ++++ b/elf/tst-auditmod12.c +@@ -0,0 +1,43 @@ ++/* Audit module for tst-audit12. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++unsigned int ++la_version (unsigned int version) ++{ ++ return version; ++} ++ ++char * ++la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag) ++{ ++ const char target[] = "tst-audit12mod2.so"; ++ ++ size_t namelen = strlen (name); ++ if (namelen >= sizeof (target) - 1 ++ && strcmp (name + namelen - (sizeof (target) - 1), target) == 0) ++ { ++ return (char *) "$ORIGIN/tst-audit12mod3.so"; ++ } ++ return (char *) name; ++} +Index: b/sysdeps/mach/hurd/dl-sysdep.c +=================================================================== +--- a/sysdeps/mach/hurd/dl-sysdep.c ++++ b/sysdeps/mach/hurd/dl-sysdep.c +@@ -187,7 +187,7 @@ unfmh(); /* XXX */ + assert_perror (err); + + lastslash = strrchr (p, '/'); +- l = _dl_map_object_from_fd (lastslash ? lastslash + 1 : p, ++ l = _dl_map_object_from_fd (lastslash ? lastslash + 1 : p, NULL, + memobj, strdup (p), 0); + + /* Squirrel away the memory object port where it diff --git a/SOURCES/glibc-rh1211823.patch b/SOURCES/glibc-rh1211823.patch new file mode 100644 index 0000000..007b7d7 --- /dev/null +++ b/SOURCES/glibc-rh1211823.patch @@ -0,0 +1,29005 @@ +commit f22bc486c1ce5e92380a0d06b98fbba639d170e4 +Author: Andreas Schwab +Date: Thu Jan 10 17:46:49 2013 +0100 + + Update BIG5-HKSCS charmap to HKSCS-2008 + +diff --git a/iconvdata/BIG5HKSCS.irreversible b/iconvdata/BIG5HKSCS.irreversible +index d873dfa..34a261e 100644 +--- a/iconvdata/BIG5HKSCS.irreversible ++++ b/iconvdata/BIG5HKSCS.irreversible +@@ -1,5 +1,3 @@ +-0x8BF8 0x9F9C +-0x957A 0x8728 + 0xA27E 0x256D + 0xA2A1 0x256E + 0xA2A2 0x2570 +diff --git a/iconvdata/BIG5HKSCS.precomposed b/iconvdata/BIG5HKSCS.precomposed +new file mode 100644 +index 0000000..3ebb1f5 +--- /dev/null ++++ b/iconvdata/BIG5HKSCS.precomposed +@@ -0,0 +1,4 @@ ++0x88A3 0x00EA 0x0304 ++0x88A5 0x00EA 0x030C ++0x8862 0x00CA 0x0304 ++0x8864 0x00CA 0x030C +diff --git a/iconvdata/big5hkscs.c b/iconvdata/big5hkscs.c +index 18e413d..5487323 100644 +--- a/iconvdata/big5hkscs.c ++++ b/iconvdata/big5hkscs.c +@@ -29,8 +29,7 @@ + /* Table for Big5 to UCS conversion. + + With HKSCS mappings 0x8140-0xA0FE and 0xFA40-0xFEFE added; more info: +- http://www.digital21.gov.hk/eng/hkscs/index.html +- - spacehunt 07/01/2000 ++ http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/hkscs/ + + Using the charmap: + +@@ -43,7 +42,7 @@ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + while (<>) { + local($big5, $ucs) = split; +- $big5 = hex($big5) - 0x8840; ++ $big5 = hex($big5) - 0x8740; + local($ridx) = int($big5 / 256) * 195 + $big5 % 256; + printf "\n " if (($n % 4) == 0); + ++$n; +@@ -54,4545 +53,4621 @@ + */ + static const uint32_t big5hkscs_to_ucs[] = + { +- [ 0] = 0xF303, [ 1] = 0xF304, [ 2] = 0xF305, [ 3] = 0xF306, +- [ 4] = 0xF307, [ 5] = 0xF308, [ 6] = 0xF309, [ 7] = 0xF30A, +- [ 8] = 0xF30B, [ 9] = 0xF30C, [ 10] = 0xF30D, [ 11] = 0xF30E, +- [ 12] = 0xF30F, [ 13] = 0xF310, [ 14] = 0xF311, [ 15] = 0xF312, +- [ 16] = 0xF313, [ 17] = 0xF314, [ 18] = 0xF315, [ 19] = 0xF316, +- [ 20] = 0xF317, [ 21] = 0xF318, [ 22] = 0x0100, [ 23] = 0x00C1, +- [ 24] = 0x01CD, [ 25] = 0x00C0, [ 26] = 0x0112, [ 27] = 0x00C9, +- [ 28] = 0x011A, [ 29] = 0x00C8, [ 30] = 0x014C, [ 31] = 0x00D3, +- [ 32] = 0x01D1, [ 33] = 0x00D2, [ 34] = 0xF325, [ 35] = 0x1EBE, +- [ 36] = 0xF327, [ 37] = 0x1EC0, [ 38] = 0x00CA, [ 39] = 0x0101, +- [ 40] = 0x00E1, [ 41] = 0x01CE, [ 42] = 0x00E0, [ 43] = 0x0251, +- [ 44] = 0x0113, [ 45] = 0x00E9, [ 46] = 0x011B, [ 47] = 0x00E8, +- [ 48] = 0x012B, [ 49] = 0x00ED, [ 50] = 0x01D0, [ 51] = 0x00EC, +- [ 52] = 0x014D, [ 53] = 0x00F3, [ 54] = 0x01D2, [ 55] = 0x00F2, +- [ 56] = 0x016B, [ 57] = 0x00FA, [ 58] = 0x01D4, [ 59] = 0x00F9, +- [ 60] = 0x01D6, [ 61] = 0x01D8, [ 62] = 0x01DA, [ 97] = 0x01DC, +- [ 98] = 0x00FC, [ 99] = 0xF344, [ 100] = 0x1EBF, [ 101] = 0xF346, +- [ 102] = 0x1EC1, [ 103] = 0x00EA, [ 104] = 0x0261, [ 105] = 0xF34A, +- [ 106] = 0xF34B, [ 195] = 0x2A3A9, [ 196] = 0xF3A1, [ 198] = 0x650A, +- [ 201] = 0x4E3D, [ 202] = 0x6EDD, [ 203] = 0x9D4E, [ 204] = 0x91DF, +- [ 207] = 0x27735, [ 208] = 0x6491, [ 209] = 0x4F1A, [ 210] = 0x4F28, +- [ 211] = 0x4FA8, [ 212] = 0x5156, [ 213] = 0x5174, [ 214] = 0x519C, +- [ 215] = 0x51E4, [ 216] = 0x52A1, [ 217] = 0x52A8, [ 218] = 0x533B, +- [ 219] = 0x534E, [ 220] = 0x53D1, [ 221] = 0x53D8, [ 222] = 0x56E2, +- [ 223] = 0x58F0, [ 224] = 0x5904, [ 225] = 0x5907, [ 226] = 0x5932, +- [ 227] = 0x5934, [ 228] = 0x5B66, [ 229] = 0x5B9E, [ 230] = 0x5B9F, +- [ 231] = 0x5C9A, [ 232] = 0x5E86, [ 233] = 0x603B, [ 234] = 0x6589, +- [ 235] = 0x67FE, [ 236] = 0x6804, [ 237] = 0x6865, [ 238] = 0x6D4E, +- [ 239] = 0x70BC, [ 240] = 0x7535, [ 241] = 0x7EA4, [ 242] = 0x7EAC, +- [ 243] = 0x7EBA, [ 244] = 0x7EC7, [ 245] = 0x7ECF, [ 246] = 0x7EDF, +- [ 247] = 0x7F06, [ 248] = 0x7F37, [ 249] = 0x827A, [ 250] = 0x82CF, +- [ 251] = 0x836F, [ 252] = 0x89C6, [ 253] = 0x8BBE, [ 254] = 0x8BE2, +- [ 255] = 0x8F66, [ 256] = 0x8F67, [ 257] = 0x8F6E, [ 292] = 0x7411, +- [ 293] = 0x7CFC, [ 294] = 0x7DCD, [ 295] = 0x6946, [ 296] = 0x7AC9, +- [ 297] = 0x5227, [ 302] = 0x918C, [ 303] = 0x78B8, [ 304] = 0x915E, +- [ 305] = 0x80BC, [ 307] = 0x8D0B, [ 308] = 0x80F6, [ 309] = 0xF3F0, +- [ 312] = 0x809F, [ 313] = 0x9EC7, [ 314] = 0x4CCD, [ 315] = 0x9DC9, +- [ 316] = 0x9E0C, [ 317] = 0x4C3E, [ 318] = 0xF3F9, [ 319] = 0x2700E, +- [ 320] = 0x9E0A, [ 321] = 0xF3FC, [ 322] = 0x35C1, [ 324] = 0x6E9A, +- [ 325] = 0x823E, [ 326] = 0x7519, [ 328] = 0x4911, [ 329] = 0x9A6C, +- [ 330] = 0x9A8F, [ 331] = 0x9F99, [ 332] = 0x7987, [ 333] = 0xF408, +- [ 334] = 0x21DCA, [ 335] = 0x205D0, [ 336] = 0xF40B, [ 337] = 0x4E24, +- [ 338] = 0x4E81, [ 339] = 0x4E80, [ 340] = 0x4E87, [ 341] = 0x4EBF, +- [ 342] = 0x4EEB, [ 343] = 0x4F37, [ 344] = 0x344C, [ 345] = 0x4FBD, +- [ 346] = 0x3E48, [ 347] = 0x5003, [ 348] = 0x5088, [ 349] = 0x347D, +- [ 350] = 0x3493, [ 351] = 0x34A5, [ 352] = 0x5186, [ 353] = 0x5905, +- [ 354] = 0x51DB, [ 355] = 0x51FC, [ 356] = 0x5205, [ 357] = 0x4E89, +- [ 358] = 0x5279, [ 359] = 0x5290, [ 360] = 0x5327, [ 361] = 0x35C7, +- [ 362] = 0x53A9, [ 363] = 0x3551, [ 364] = 0x53B0, [ 365] = 0x3553, +- [ 366] = 0x53C2, [ 367] = 0x5423, [ 368] = 0x356D, [ 369] = 0x3572, +- [ 370] = 0x3681, [ 371] = 0x5493, [ 372] = 0x54A3, [ 373] = 0x54B4, +- [ 374] = 0x54B9, [ 375] = 0x54D0, [ 376] = 0x54EF, [ 377] = 0x5518, +- [ 378] = 0x5523, [ 379] = 0x5528, [ 380] = 0x3598, [ 381] = 0x553F, +- [ 382] = 0x35A5, [ 383] = 0x35BF, [ 384] = 0x55D7, [ 385] = 0x35C5, +- [ 390] = 0xF43D, [ 391] = 0x5525, [ 393] = 0x20C42, [ 394] = 0xF441, +- [ 395] = 0xF442, [ 396] = 0x5590, [ 397] = 0x22CC6, [ 398] = 0x39EC, +- [ 399] = 0x20341, [ 400] = 0x8E46, [ 401] = 0x24DB8, [ 402] = 0xF449, +- [ 403] = 0x4053, [ 404] = 0x280BE, [ 405] = 0x777A, [ 406] = 0xF44D, +- [ 407] = 0x3A34, [ 408] = 0x47D5, [ 409] = 0xF450, [ 410] = 0x269F2, +- [ 411] = 0x24DEA, [ 412] = 0x64DD, [ 413] = 0xF454, [ 414] = 0x20FB4, +- [ 415] = 0x20CD5, [ 416] = 0x210F4, [ 417] = 0x648D, [ 418] = 0x8E7E, +- [ 419] = 0xF45A, [ 420] = 0xF45B, [ 421] = 0xF45C, [ 422] = 0xF45D, +- [ 423] = 0x28256, [ 424] = 0x244D3, [ 426] = 0x20D46, [ 427] = 0xF462, +- [ 428] = 0x280E9, [ 429] = 0x47F4, [ 430] = 0xF465, [ 431] = 0xF466, +- [ 432] = 0x9AB2, [ 433] = 0x3A67, [ 434] = 0xF469, [ 435] = 0x3FED, +- [ 436] = 0x3506, [ 437] = 0x252C7, [ 438] = 0xF46D, [ 439] = 0xF46E, +- [ 440] = 0xF46F, [ 441] = 0x9D6E, [ 442] = 0x9815, [ 444] = 0x43D9, +- [ 445] = 0x260A5, [ 446] = 0x64B4, [ 447] = 0x54E3, [ 448] = 0xF477, +- [ 449] = 0xF478, [ 450] = 0x21077, [ 451] = 0x39FB, [ 452] = 0x2106F, +- [ 487] = 0xF47C, [ 488] = 0xF47D, [ 489] = 0xF47E, [ 490] = 0x64EA, +- [ 491] = 0xF480, [ 492] = 0x20C43, [ 493] = 0x8E68, [ 494] = 0x221A1, +- [ 495] = 0x28B4C, [ 496] = 0xF485, [ 498] = 0x480B, [ 499] = 0xF488, +- [ 500] = 0x3FFA, [ 501] = 0x5873, [ 502] = 0xF48B, [ 504] = 0xF48D, +- [ 505] = 0x204FC, [ 506] = 0xF48F, [ 507] = 0xF490, [ 508] = 0xF491, +- [ 509] = 0x5579, [ 510] = 0x40BB, [ 511] = 0x43BA, [ 513] = 0x4AB4, +- [ 514] = 0xF497, [ 515] = 0xF498, [ 516] = 0x81AA, [ 517] = 0x98F5, +- [ 518] = 0xF49B, [ 519] = 0x6379, [ 520] = 0x39FE, [ 521] = 0x22775, +- [ 522] = 0x8DC0, [ 523] = 0x56A1, [ 524] = 0x647C, [ 525] = 0x3E43, +- [ 527] = 0xF4A4, [ 528] = 0x20E09, [ 529] = 0x22ACF, [ 530] = 0xF4A7, +- [ 532] = 0x210C8, [ 533] = 0xF4AA, [ 534] = 0x3992, [ 535] = 0x3A06, +- [ 536] = 0xF4AD, [ 537] = 0x3578, [ 538] = 0xF4AF, [ 539] = 0x220C7, +- [ 540] = 0x5652, [ 541] = 0x20F31, [ 542] = 0xF4B3, [ 543] = 0xF4B4, +- [ 544] = 0x34BC, [ 545] = 0x6C3D, [ 546] = 0xF4B7, [ 549] = 0xF4BA, +- [ 550] = 0xF4BB, [ 551] = 0xF4BC, [ 552] = 0xF4BD, [ 553] = 0x28CCD, +- [ 554] = 0x20E7A, [ 555] = 0xF4C0, [ 556] = 0xF4C1, [ 557] = 0x7F93, +- [ 558] = 0xF4C3, [ 559] = 0x22803, [ 560] = 0x22939, [ 561] = 0x35FB, +- [ 562] = 0x251E3, [ 563] = 0xF4C8, [ 564] = 0x20F8D, [ 565] = 0x20EAA, +- [ 566] = 0x3F93, [ 567] = 0x20F30, [ 568] = 0x20D47, [ 569] = 0xF4CE, +- [ 570] = 0xF4CF, [ 572] = 0x20EAB, [ 573] = 0xF4D2, [ 574] = 0x20D48, +- [ 575] = 0x210C0, [ 576] = 0x2113D, [ 577] = 0x3FF9, [ 578] = 0x22696, +- [ 579] = 0x6432, [ 580] = 0x20FAD, [ 585] = 0x233F4, [ 586] = 0x27639, +- [ 587] = 0x22BCE, [ 588] = 0x20D7E, [ 589] = 0x20D7F, [ 590] = 0x22C51, +- [ 591] = 0x22C55, [ 592] = 0x3A18, [ 593] = 0xF4E2, [ 594] = 0x210C7, +- [ 595] = 0x20F2E, [ 596] = 0xF4E5, [ 597] = 0x26B50, [ 598] = 0xF4E7, +- [ 599] = 0xF4E8, [ 600] = 0xF4E9, [ 601] = 0x95AA, [ 602] = 0x54CC, +- [ 603] = 0x82C4, [ 604] = 0x55B9, [ 606] = 0x29EC3, [ 607] = 0x9C26, +- [ 608] = 0x9AB6, [ 609] = 0x2775E, [ 610] = 0xF4F3, [ 611] = 0x7140, +- [ 612] = 0x816D, [ 613] = 0x80EC, [ 614] = 0x5C1C, [ 615] = 0x26572, +- [ 616] = 0x8134, [ 617] = 0x3797, [ 618] = 0x535F, [ 619] = 0x280BD, +- [ 620] = 0x91B6, [ 621] = 0x20EFA, [ 622] = 0x20E0F, [ 623] = 0x20E77, +- [ 624] = 0x20EFB, [ 625] = 0x35DD, [ 626] = 0x24DEB, [ 627] = 0x3609, +- [ 628] = 0x20CD6, [ 629] = 0x56AF, [ 630] = 0x227B5, [ 631] = 0x210C9, +- [ 632] = 0x20E10, [ 633] = 0x20E78, [ 634] = 0x21078, [ 635] = 0x21148, +- [ 636] = 0x28207, [ 637] = 0x21455, [ 638] = 0x20E79, [ 639] = 0x24E50, +- [ 640] = 0x22DA4, [ 641] = 0x5A54, [ 642] = 0x2101D, [ 643] = 0x2101E, +- [ 644] = 0x210F5, [ 645] = 0x210F6, [ 646] = 0x579C, [ 647] = 0x20E11, +- [ 682] = 0x27694, [ 683] = 0x282CD, [ 684] = 0x20FB5, [ 685] = 0x20E7B, +- [ 686] = 0x2517E, [ 687] = 0x3703, [ 688] = 0x20FB6, [ 689] = 0x21180, +- [ 690] = 0x252D8, [ 691] = 0xF522, [ 692] = 0xF523, [ 693] = 0x2183A, +- [ 694] = 0xF525, [ 695] = 0xF526, [ 696] = 0x5899, [ 697] = 0x5268, +- [ 698] = 0x361A, [ 699] = 0xF52A, [ 700] = 0x7BB2, [ 701] = 0x5B68, +- [ 702] = 0x4800, [ 703] = 0x4B2C, [ 704] = 0x9F27, [ 705] = 0x49E7, +- [ 706] = 0x9C1F, [ 707] = 0x9B8D, [ 708] = 0x25B74, [ 709] = 0x2313D, +- [ 710] = 0x55FB, [ 711] = 0x35F2, [ 712] = 0x5689, [ 713] = 0x4E28, +- [ 714] = 0x5902, [ 715] = 0xF53A, [ 716] = 0xF53B, [ 717] = 0x9751, +- [ 718] = 0xF53D, [ 719] = 0x4E5B, [ 720] = 0x4EBB, [ 721] = 0x353E, +- [ 722] = 0x5C23, [ 723] = 0x5F51, [ 724] = 0x5FC4, [ 725] = 0x38FA, +- [ 726] = 0x624C, [ 727] = 0x6535, [ 728] = 0x6B7A, [ 729] = 0x6C35, +- [ 730] = 0x6C3A, [ 731] = 0x706C, [ 732] = 0x722B, [ 733] = 0x4E2C, +- [ 734] = 0x72AD, [ 735] = 0xF54E, [ 736] = 0x7F52, [ 737] = 0x793B, +- [ 738] = 0x7CF9, [ 739] = 0x7F53, [ 740] = 0xF553, [ 741] = 0x34C1, +- [ 743] = 0xF556, [ 744] = 0x8002, [ 745] = 0x8080, [ 746] = 0xF559, +- [ 747] = 0xF55A, [ 748] = 0x535D, [ 749] = 0x8864, [ 750] = 0x89C1, +- [ 751] = 0xF55E, [ 752] = 0x8BA0, [ 753] = 0x8D1D, [ 754] = 0x9485, +- [ 755] = 0x9578, [ 756] = 0x957F, [ 757] = 0x95E8, [ 758] = 0xF565, +- [ 759] = 0x97E6, [ 760] = 0x9875, [ 761] = 0x98CE, [ 762] = 0x98DE, +- [ 763] = 0x9963, [ 764] = 0xF56B, [ 765] = 0x9C7C, [ 766] = 0x9E1F, +- [ 767] = 0x9EC4, [ 768] = 0x6B6F, [ 769] = 0x9F9C, [ 770] = 0x4E37, +- [ 771] = 0xF572, [ 772] = 0x961D, [ 773] = 0x6237, [ 774] = 0x94A2, +- [ 1007] = 0x5D3E, [ 1008] = 0x5D48, [ 1009] = 0x5D56, [ 1010] = 0x3DFC, +- [ 1011] = 0x380F, [ 1012] = 0x5DA4, [ 1013] = 0x5DB9, [ 1014] = 0x3820, +- [ 1015] = 0x3838, [ 1016] = 0x5E42, [ 1017] = 0x5EBD, [ 1018] = 0x5F25, +- [ 1019] = 0x5F83, [ 1020] = 0x3908, [ 1021] = 0x3914, [ 1022] = 0x393F, +- [ 1023] = 0x394D, [ 1024] = 0x60D7, [ 1025] = 0x613D, [ 1026] = 0x5CE5, +- [ 1027] = 0x3989, [ 1028] = 0x61B7, [ 1029] = 0x61B9, [ 1030] = 0x61CF, +- [ 1031] = 0x39B8, [ 1032] = 0x622C, [ 1033] = 0x6290, [ 1034] = 0x62E5, +- [ 1035] = 0x6318, [ 1036] = 0x39F8, [ 1037] = 0x56B1, [ 1072] = 0x3A03, +- [ 1073] = 0x63E2, [ 1074] = 0x63FB, [ 1075] = 0x6407, [ 1076] = 0x645A, +- [ 1077] = 0x3A4B, [ 1078] = 0x64C0, [ 1079] = 0x5D15, [ 1080] = 0x5621, +- [ 1081] = 0x9F9F, [ 1082] = 0x3A97, [ 1083] = 0x6586, [ 1084] = 0x3ABD, +- [ 1085] = 0x65FF, [ 1086] = 0x6653, [ 1087] = 0x3AF2, [ 1088] = 0x6692, +- [ 1089] = 0x3B22, [ 1090] = 0x6716, [ 1091] = 0x3B42, [ 1092] = 0x67A4, +- [ 1093] = 0x6800, [ 1094] = 0x3B58, [ 1095] = 0x684A, [ 1096] = 0x6884, +- [ 1097] = 0x3B72, [ 1098] = 0x3B71, [ 1099] = 0x3B7B, [ 1100] = 0x6909, +- [ 1101] = 0x6943, [ 1102] = 0x725C, [ 1103] = 0x6964, [ 1104] = 0x699F, +- [ 1105] = 0x6985, [ 1106] = 0x3BBC, [ 1107] = 0x69D6, [ 1108] = 0x3BDD, +- [ 1109] = 0x6A65, [ 1110] = 0x6A74, [ 1111] = 0x6A71, [ 1112] = 0x6A82, +- [ 1113] = 0x3BEC, [ 1114] = 0x6A99, [ 1115] = 0x3BF2, [ 1116] = 0x6AAB, +- [ 1117] = 0x6AB5, [ 1118] = 0x6AD4, [ 1119] = 0x6AF6, [ 1120] = 0x6B81, +- [ 1121] = 0x6BC1, [ 1122] = 0x6BEA, [ 1123] = 0x6C75, [ 1124] = 0x6CAA, +- [ 1125] = 0x3CCB, [ 1126] = 0x6D02, [ 1127] = 0x6D06, [ 1128] = 0x6D26, +- [ 1129] = 0x6D81, [ 1130] = 0x3CEF, [ 1131] = 0x6DA4, [ 1132] = 0x6DB1, +- [ 1133] = 0x6E15, [ 1134] = 0x6E18, [ 1135] = 0x6E29, [ 1136] = 0x6E86, +- [ 1137] = 0x289C0, [ 1138] = 0x6EBB, [ 1139] = 0x6EE2, [ 1140] = 0x6EDA, +- [ 1141] = 0x9F7F, [ 1142] = 0x6EE8, [ 1143] = 0x6EE9, [ 1144] = 0x6F24, +- [ 1145] = 0x6F34, [ 1146] = 0x3D46, [ 1147] = 0x23F41, [ 1148] = 0x6F81, +- [ 1149] = 0x6FBE, [ 1150] = 0x3D6A, [ 1151] = 0x3D75, [ 1152] = 0x71B7, +- [ 1153] = 0x5C99, [ 1154] = 0x3D8A, [ 1155] = 0x702C, [ 1156] = 0x3D91, +- [ 1157] = 0x7050, [ 1158] = 0x7054, [ 1159] = 0x706F, [ 1160] = 0x707F, +- [ 1161] = 0x7089, [ 1162] = 0x20325, [ 1163] = 0x43C1, [ 1164] = 0x35F1, +- [ 1165] = 0xF6B0, [ 1170] = 0xE311, [ 1171] = 0x57BE, [ 1172] = 0x26ED3, +- [ 1173] = 0x713E, [ 1174] = 0x257E0, [ 1175] = 0x364E, [ 1176] = 0x69A2, +- [ 1177] = 0x28BE9, [ 1178] = 0x5B74, [ 1179] = 0x7A49, [ 1180] = 0x258E1, +- [ 1181] = 0x294D9, [ 1182] = 0x7A65, [ 1183] = 0x7A7D, [ 1184] = 0x259AC, +- [ 1185] = 0x7ABB, [ 1186] = 0x7AB0, [ 1187] = 0x7AC2, [ 1188] = 0x7AC3, +- [ 1189] = 0x71D1, [ 1190] = 0xE325, [ 1191] = 0x41CA, [ 1192] = 0x7ADA, +- [ 1193] = 0x7ADD, [ 1194] = 0x7AEA, [ 1195] = 0x41EF, [ 1196] = 0x54B2, +- [ 1197] = 0x25C01, [ 1198] = 0x7B0B, [ 1199] = 0x7B55, [ 1200] = 0x7B29, +- [ 1201] = 0xE330, [ 1202] = 0x25CFE, [ 1203] = 0x7BA2, [ 1204] = 0x7B6F, +- [ 1205] = 0x839C, [ 1206] = 0x25BB4, [ 1207] = 0x26C7F, [ 1208] = 0x7BD0, +- [ 1209] = 0x8421, [ 1210] = 0x7B92, [ 1212] = 0x23FF0, [ 1213] = 0x3DAD, +- [ 1214] = 0x25C65, [ 1215] = 0x8492, [ 1216] = 0x7BFA, [ 1218] = 0x7C35, +- [ 1219] = 0x25CC1, [ 1220] = 0x7C44, [ 1221] = 0x7C83, [ 1222] = 0xE345, +- [ 1223] = 0x7CA6, [ 1224] = 0x667D, [ 1225] = 0x24578, [ 1226] = 0x7CC9, +- [ 1227] = 0x7CC7, [ 1228] = 0x7CE6, [ 1229] = 0x7C74, [ 1230] = 0x7CF3, +- [ 1231] = 0x7CF5, [ 1267] = 0x7E67, [ 1268] = 0x451D, [ 1269] = 0x26E44, +- [ 1270] = 0x7D5D, [ 1271] = 0x26ED6, [ 1272] = 0x748D, [ 1273] = 0x7D89, +- [ 1274] = 0x7DAB, [ 1275] = 0x7135, [ 1276] = 0x7DB3, [ 1278] = 0x24057, +- [ 1279] = 0x26029, [ 1280] = 0x7DE4, [ 1281] = 0x3D13, [ 1282] = 0x7DF5, +- [ 1283] = 0x217F9, [ 1284] = 0x7DE5, [ 1285] = 0xE362, [ 1287] = 0x26121, +- [ 1288] = 0x2615A, [ 1289] = 0x7E6E, [ 1290] = 0x7E92, [ 1291] = 0x432B, +- [ 1292] = 0x946C, [ 1293] = 0x7E27, [ 1294] = 0x7F40, [ 1295] = 0x7F41, +- [ 1296] = 0x7F47, [ 1297] = 0x7936, [ 1298] = 0x262D0, [ 1299] = 0x99E1, +- [ 1300] = 0x7F97, [ 1301] = 0x26351, [ 1302] = 0x7FA3, [ 1303] = 0x21661, +- [ 1304] = 0x20068, [ 1305] = 0x455C, [ 1306] = 0x23766, [ 1307] = 0x4503, +- [ 1308] = 0x2833A, [ 1309] = 0x7FFA, [ 1310] = 0x26489, [ 1312] = 0x8008, +- [ 1313] = 0x801D, [ 1315] = 0x802F, [ 1316] = 0xE381, [ 1317] = 0xE382, +- [ 1318] = 0x803B, [ 1319] = 0x803C, [ 1320] = 0x8061, [ 1321] = 0xE386, +- [ 1322] = 0x4989, [ 1323] = 0x26626, [ 1324] = 0xE389, [ 1325] = 0x266E8, +- [ 1326] = 0x6725, [ 1327] = 0x80A7, [ 1328] = 0x28A48, [ 1329] = 0x8107, +- [ 1330] = 0x811A, [ 1331] = 0x58B0, [ 1332] = 0x226F6, [ 1333] = 0x6C7F, +- [ 1334] = 0x26498, [ 1335] = 0xE394, [ 1336] = 0x64E7, [ 1337] = 0xE396, +- [ 1338] = 0x8218, [ 1339] = 0x2185E, [ 1340] = 0x6A53, [ 1341] = 0x24A65, +- [ 1342] = 0x24A95, [ 1343] = 0x447A, [ 1344] = 0x8229, [ 1345] = 0xE39E, +- [ 1346] = 0x26A52, [ 1347] = 0xE3A0, [ 1348] = 0x4FF9, [ 1349] = 0x214FD, +- [ 1350] = 0x84E2, [ 1351] = 0x8362, [ 1352] = 0x26B0A, [ 1353] = 0x249A7, +- [ 1354] = 0x23530, [ 1355] = 0x21773, [ 1356] = 0x23DF8, [ 1357] = 0x82AA, +- [ 1358] = 0x691B, [ 1359] = 0x2F994, [ 1360] = 0x41DB, [ 1365] = 0x854B, +- [ 1366] = 0x82D0, [ 1367] = 0x831A, [ 1368] = 0x20E16, [ 1369] = 0x217B4, +- [ 1370] = 0x36C1, [ 1371] = 0xE3B4, [ 1372] = 0x2355A, [ 1373] = 0x827B, +- [ 1374] = 0x82E2, [ 1375] = 0x8318, [ 1376] = 0x23E8B, [ 1377] = 0x26DA3, +- [ 1378] = 0xE3BB, [ 1379] = 0x26B97, [ 1380] = 0x235CE, [ 1381] = 0x3DBF, +- [ 1382] = 0x831D, [ 1383] = 0x55EC, [ 1384] = 0x8385, [ 1385] = 0x450B, +- [ 1386] = 0x26DA5, [ 1387] = 0x83AC, [ 1389] = 0x83D3, [ 1390] = 0x347E, +- [ 1391] = 0x26ED4, [ 1392] = 0x6A57, [ 1393] = 0x855A, [ 1394] = 0x3496, +- [ 1395] = 0x26E42, [ 1396] = 0xE3CD, [ 1397] = 0x8458, [ 1398] = 0xE3CF, +- [ 1399] = 0x8471, [ 1400] = 0x3DD3, [ 1401] = 0x44E4, [ 1402] = 0x6AA7, +- [ 1403] = 0x844A, [ 1404] = 0xE3D5, [ 1405] = 0x7958, [ 1407] = 0x26B96, +- [ 1408] = 0x26E77, [ 1409] = 0x26E43, [ 1410] = 0x84DE, [ 1412] = 0x8391, +- [ 1413] = 0x44A0, [ 1414] = 0x8493, [ 1415] = 0x84E4, [ 1416] = 0xE3E1, +- [ 1417] = 0x4240, [ 1418] = 0x25CC0, [ 1419] = 0x4543, [ 1420] = 0x8534, +- [ 1421] = 0x5AF2, [ 1422] = 0xE3E7, [ 1423] = 0x4527, [ 1424] = 0x8573, +- [ 1425] = 0x4516, [ 1426] = 0x67BF, [ 1427] = 0x8616, [ 1462] = 0x28625, +- [ 1463] = 0x2863B, [ 1464] = 0x85C1, [ 1465] = 0xE3F0, [ 1466] = 0x8602, +- [ 1467] = 0xE3F2, [ 1468] = 0x270CD, [ 1469] = 0xE3F4, [ 1470] = 0x456A, +- [ 1471] = 0x8628, [ 1472] = 0x3648, [ 1473] = 0x218A2, [ 1474] = 0x53F7, +- [ 1475] = 0x2739A, [ 1476] = 0x867E, [ 1477] = 0x8771, [ 1478] = 0x2A0F8, +- [ 1479] = 0x87EE, [ 1480] = 0x22C27, [ 1481] = 0x87B1, [ 1482] = 0x87DA, +- [ 1483] = 0x880F, [ 1484] = 0x5661, [ 1485] = 0x866C, [ 1486] = 0x6856, +- [ 1487] = 0x460F, [ 1488] = 0x8845, [ 1489] = 0x8846, [ 1490] = 0x275E0, +- [ 1491] = 0x23DB9, [ 1492] = 0x275E4, [ 1493] = 0x885E, [ 1494] = 0x889C, +- [ 1495] = 0x465B, [ 1496] = 0x88B4, [ 1497] = 0x88B5, [ 1498] = 0x63C1, +- [ 1499] = 0x88C5, [ 1500] = 0x7777, [ 1501] = 0x2770F, [ 1502] = 0x8987, +- [ 1503] = 0x898A, [ 1506] = 0x89A7, [ 1507] = 0x89BC, [ 1508] = 0x28A25, +- [ 1509] = 0x89E7, [ 1510] = 0x27924, [ 1511] = 0x27ABD, [ 1512] = 0x8A9C, +- [ 1513] = 0x7793, [ 1514] = 0x91FE, [ 1515] = 0x8A90, [ 1516] = 0x27A59, +- [ 1517] = 0x7AE9, [ 1518] = 0x27B3A, [ 1519] = 0xE426, [ 1520] = 0x4713, +- [ 1521] = 0x27B38, [ 1522] = 0x717C, [ 1523] = 0x8B0C, [ 1524] = 0x8B1F, +- [ 1525] = 0x25430, [ 1526] = 0x25565, [ 1527] = 0x8B3F, [ 1528] = 0x8B4C, +- [ 1529] = 0x8B4D, [ 1530] = 0x8AA9, [ 1531] = 0x24A7A, [ 1532] = 0x8B90, +- [ 1533] = 0x8B9B, [ 1534] = 0x8AAF, [ 1535] = 0xE436, [ 1536] = 0x4615, +- [ 1537] = 0x884F, [ 1538] = 0x8C9B, [ 1539] = 0x27D54, [ 1540] = 0x27D8F, +- [ 1541] = 0x2F9D4, [ 1542] = 0x3725, [ 1543] = 0x27D53, [ 1544] = 0x8CD6, +- [ 1545] = 0x27D98, [ 1546] = 0x27DBD, [ 1547] = 0x8D12, [ 1548] = 0x8D03, +- [ 1549] = 0x21910, [ 1550] = 0x8CDB, [ 1551] = 0x705C, [ 1552] = 0x8D11, +- [ 1553] = 0xE448, [ 1554] = 0x3ED0, [ 1560] = 0x8DA9, [ 1561] = 0x28002, +- [ 1562] = 0xE44D, [ 1563] = 0x2498A, [ 1564] = 0x3B7C, [ 1565] = 0xE450, +- [ 1566] = 0x2710C, [ 1567] = 0x7AE7, [ 1568] = 0x8EAD, [ 1569] = 0x8EB6, +- [ 1570] = 0x8EC3, [ 1571] = 0x92D4, [ 1572] = 0x8F19, [ 1573] = 0x8F2D, +- [ 1574] = 0x28365, [ 1575] = 0x28412, [ 1576] = 0x8FA5, [ 1577] = 0x9303, +- [ 1578] = 0x2A29F, [ 1579] = 0x20A50, [ 1580] = 0x8FB3, [ 1581] = 0x492A, +- [ 1582] = 0x289DE, [ 1583] = 0x2853D, [ 1584] = 0x23DBB, [ 1585] = 0x5EF8, +- [ 1586] = 0x23262, [ 1587] = 0x8FF9, [ 1588] = 0xE467, [ 1589] = 0xE468, +- [ 1590] = 0xE469, [ 1591] = 0x22325, [ 1592] = 0x3980, [ 1593] = 0x26ED7, +- [ 1594] = 0x9037, [ 1595] = 0x2853C, [ 1596] = 0x27ABE, [ 1597] = 0x9061, +- [ 1598] = 0x2856C, [ 1599] = 0x2860B, [ 1600] = 0x90A8, [ 1601] = 0xE474, +- [ 1602] = 0x90C4, [ 1603] = 0x286E6, [ 1604] = 0x90AE, [ 1606] = 0x9167, +- [ 1607] = 0x3AF0, [ 1608] = 0x91A9, [ 1609] = 0x91C4, [ 1610] = 0x7CAC, +- [ 1611] = 0x28933, [ 1612] = 0x21E89, [ 1613] = 0x920E, [ 1614] = 0x6C9F, +- [ 1615] = 0x9241, [ 1616] = 0x9262, [ 1617] = 0x255B9, [ 1619] = 0x28AC6, +- [ 1620] = 0x23C9B, [ 1621] = 0x28B0C, [ 1622] = 0x255DB, [ 1657] = 0xE48A, +- [ 1658] = 0x932C, [ 1659] = 0x936B, [ 1660] = 0x28AE1, [ 1661] = 0x28BEB, +- [ 1662] = 0x708F, [ 1663] = 0x5AC3, [ 1664] = 0x28AE2, [ 1665] = 0x28AE5, +- [ 1666] = 0x4965, [ 1667] = 0x9244, [ 1668] = 0x28BEC, [ 1669] = 0x28C39, +- [ 1670] = 0x28BFF, [ 1671] = 0x9373, [ 1672] = 0x945B, [ 1673] = 0x8EBC, +- [ 1674] = 0x9585, [ 1675] = 0x95A6, [ 1676] = 0x9426, [ 1677] = 0x95A0, +- [ 1678] = 0x6FF6, [ 1679] = 0x42B9, [ 1680] = 0xE4A1, [ 1681] = 0x286D8, +- [ 1682] = 0x2127C, [ 1683] = 0x23E2E, [ 1684] = 0x49DF, [ 1685] = 0x6C1C, +- [ 1686] = 0x967B, [ 1687] = 0x9696, [ 1688] = 0x416C, [ 1689] = 0x96A3, +- [ 1690] = 0x26ED5, [ 1691] = 0x61DA, [ 1692] = 0x96B6, [ 1693] = 0x78F5, +- [ 1694] = 0x28AE0, [ 1695] = 0x96BD, [ 1696] = 0x53CC, [ 1697] = 0x49A1, +- [ 1698] = 0x26CB8, [ 1699] = 0x20274, [ 1700] = 0x26410, [ 1701] = 0x290AF, +- [ 1702] = 0x290E5, [ 1703] = 0x24AD1, [ 1704] = 0x21915, [ 1705] = 0x2330A, +- [ 1706] = 0x9731, [ 1707] = 0x8642, [ 1708] = 0x9736, [ 1709] = 0x4A0F, +- [ 1710] = 0x453D, [ 1711] = 0x4585, [ 1712] = 0xE4C1, [ 1713] = 0x7075, +- [ 1714] = 0x5B41, [ 1715] = 0x971B, [ 1717] = 0xE4C6, [ 1718] = 0x9757, +- [ 1719] = 0x5B4A, [ 1720] = 0x291EB, [ 1721] = 0x975F, [ 1722] = 0x9425, +- [ 1723] = 0x50D0, [ 1724] = 0x230B7, [ 1725] = 0x230BC, [ 1726] = 0x9789, +- [ 1727] = 0x979F, [ 1728] = 0x97B1, [ 1729] = 0x97BE, [ 1730] = 0x97C0, +- [ 1731] = 0x97D2, [ 1732] = 0x97E0, [ 1733] = 0x2546C, [ 1734] = 0x97EE, +- [ 1735] = 0x741C, [ 1736] = 0x29433, [ 1738] = 0x97F5, [ 1739] = 0x2941D, +- [ 1740] = 0xE4DD, [ 1741] = 0x4AD1, [ 1742] = 0x9834, [ 1743] = 0x9833, +- [ 1744] = 0x984B, [ 1745] = 0x9866, [ 1746] = 0x3B0E, [ 1747] = 0x27175, +- [ 1748] = 0x3D51, [ 1749] = 0x20630, [ 1750] = 0x2415C, [ 1755] = 0x25706, +- [ 1756] = 0x98CA, [ 1757] = 0x98B7, [ 1758] = 0x98C8, [ 1759] = 0x98C7, +- [ 1760] = 0x4AFF, [ 1761] = 0x26D27, [ 1762] = 0x216D3, [ 1763] = 0x55B0, +- [ 1764] = 0x98E1, [ 1765] = 0x98E6, [ 1766] = 0x98EC, [ 1767] = 0x9378, +- [ 1768] = 0x9939, [ 1769] = 0x24A29, [ 1770] = 0x4B72, [ 1771] = 0x29857, +- [ 1772] = 0x29905, [ 1773] = 0x99F5, [ 1774] = 0x9A0C, [ 1775] = 0x9A3B, +- [ 1776] = 0x9A10, [ 1777] = 0x9A58, [ 1778] = 0x25725, [ 1779] = 0x36C4, +- [ 1780] = 0x290B1, [ 1781] = 0x29BD5, [ 1782] = 0x9AE0, [ 1783] = 0x9AE2, +- [ 1784] = 0x29B05, [ 1785] = 0x9AF4, [ 1786] = 0x4C0E, [ 1787] = 0x9B14, +- [ 1788] = 0x9B2D, [ 1789] = 0x28600, [ 1790] = 0x5034, [ 1791] = 0x9B34, +- [ 1792] = 0x269A8, [ 1793] = 0x38C3, [ 1794] = 0x2307D, [ 1795] = 0x9B50, +- [ 1796] = 0x9B40, [ 1797] = 0x29D3E, [ 1798] = 0x5A45, [ 1799] = 0x21863, +- [ 1800] = 0x9B8E, [ 1801] = 0x2424B, [ 1802] = 0x9C02, [ 1803] = 0x9BFF, +- [ 1804] = 0x9C0C, [ 1805] = 0x29E68, [ 1806] = 0x9DD4, [ 1807] = 0x29FB7, +- [ 1808] = 0x2A192, [ 1809] = 0xE51E, [ 1810] = 0x2A0E1, [ 1811] = 0x2A123, +- [ 1812] = 0x2A1DF, [ 1813] = 0x9D7E, [ 1814] = 0x9D83, [ 1815] = 0xE524, +- [ 1816] = 0x9E0E, [ 1817] = 0x6888, [ 1852] = 0x9DC4, [ 1853] = 0xE528, +- [ 1854] = 0x2A193, [ 1855] = 0x2A220, [ 1856] = 0x2193B, [ 1857] = 0x2A233, +- [ 1858] = 0x9D39, [ 1859] = 0xE52E, [ 1860] = 0xE52F, [ 1861] = 0x9E90, +- [ 1862] = 0x9E95, [ 1863] = 0x9E9E, [ 1864] = 0x9EA2, [ 1865] = 0x4D34, +- [ 1866] = 0x9EAA, [ 1867] = 0x9EAF, [ 1868] = 0x24364, [ 1869] = 0x9EC1, +- [ 1870] = 0x3B60, [ 1871] = 0x39E5, [ 1872] = 0x3D1D, [ 1873] = 0x4F32, +- [ 1874] = 0x37BE, [ 1875] = 0x28C2B, [ 1876] = 0x9F02, [ 1877] = 0x9F08, +- [ 1878] = 0x4B96, [ 1879] = 0x9424, [ 1880] = 0x26DA2, [ 1881] = 0x9F17, +- [ 1883] = 0x9F39, [ 1884] = 0x569F, [ 1885] = 0x568A, [ 1886] = 0x9F45, +- [ 1887] = 0x99B8, [ 1888] = 0x2908B, [ 1889] = 0x97F2, [ 1890] = 0x847F, +- [ 1891] = 0x9F62, [ 1892] = 0x9F69, [ 1893] = 0x7ADC, [ 1894] = 0x9F8E, +- [ 1895] = 0x7216, [ 1896] = 0x4BBE, [ 1897] = 0x24975, [ 1898] = 0x249BB, +- [ 1899] = 0x7177, [ 1900] = 0x249F8, [ 1901] = 0x24348, [ 1902] = 0x24A51, +- [ 1903] = 0x739E, [ 1904] = 0x28BDA, [ 1905] = 0x218FA, [ 1906] = 0x799F, +- [ 1907] = 0x2897E, [ 1908] = 0x28E36, [ 1909] = 0x9369, [ 1910] = 0x93F3, +- [ 1911] = 0x28A44, [ 1912] = 0x92EC, [ 1913] = 0x9381, [ 1914] = 0x93CB, +- [ 1915] = 0x2896C, [ 1916] = 0x244B9, [ 1917] = 0x7217, [ 1918] = 0x3EEB, +- [ 1919] = 0x7772, [ 1920] = 0x7A43, [ 1921] = 0x70D0, [ 1922] = 0xE56D, +- [ 1923] = 0x243F8, [ 1924] = 0x717E, [ 1925] = 0xE570, [ 1926] = 0x70A3, +- [ 1927] = 0x218BE, [ 1928] = 0x23599, [ 1929] = 0x3EC7, [ 1930] = 0x21885, +- [ 1931] = 0x2542F, [ 1932] = 0x217F8, [ 1933] = 0x3722, [ 1934] = 0x216FB, +- [ 1935] = 0xE57A, [ 1936] = 0x36E1, [ 1937] = 0x21774, [ 1938] = 0xE57D, +- [ 1939] = 0x25F4B, [ 1940] = 0x3723, [ 1941] = 0x216C0, [ 1942] = 0x575B, +- [ 1943] = 0x24A25, [ 1944] = 0x213FE, [ 1945] = 0xE584, [ 1950] = 0x213C6, +- [ 1951] = 0x214B6, [ 1952] = 0x8503, [ 1953] = 0x236A6, [ 1955] = 0x8455, +- [ 1956] = 0xE58B, [ 1957] = 0x27165, [ 1958] = 0x23E31, [ 1959] = 0x2555C, +- [ 1960] = 0x23EFB, [ 1961] = 0x27052, [ 1962] = 0x44F4, [ 1963] = 0x236EE, +- [ 1964] = 0x2999D, [ 1965] = 0x26F26, [ 1966] = 0x67F9, [ 1967] = 0x3733, +- [ 1968] = 0x3C15, [ 1969] = 0x3DE7, [ 1970] = 0x586C, [ 1971] = 0xE59A, +- [ 1972] = 0x6810, [ 1973] = 0x4057, [ 1974] = 0x2373F, [ 1975] = 0xE59E, +- [ 1976] = 0x2408B, [ 1977] = 0xE5A0, [ 1978] = 0x26C21, [ 1979] = 0x54CB, +- [ 1980] = 0x569E, [ 1981] = 0x266B1, [ 1982] = 0x5692, [ 1983] = 0xE5A6, +- [ 1984] = 0x20BA8, [ 1985] = 0x20E0D, [ 1986] = 0x93C6, [ 1987] = 0xE5AA, +- [ 1988] = 0x939C, [ 1989] = 0x4EF8, [ 1990] = 0x512B, [ 1991] = 0x3819, +- [ 1992] = 0x24436, [ 1993] = 0x4EBC, [ 1994] = 0x20465, [ 1995] = 0x2037F, +- [ 1996] = 0x4F4B, [ 1997] = 0x4F8A, [ 1998] = 0x25651, [ 1999] = 0x5A68, +- [ 2000] = 0x201AB, [ 2001] = 0x203CB, [ 2002] = 0x3999, [ 2003] = 0x2030A, +- [ 2004] = 0x20414, [ 2005] = 0x3435, [ 2006] = 0x4F29, [ 2007] = 0x202C0, +- [ 2008] = 0x28EB3, [ 2009] = 0x20275, [ 2010] = 0x8ADA, [ 2011] = 0xE5C2, +- [ 2012] = 0x4E98, [ 2047] = 0x50CD, [ 2048] = 0x510D, [ 2049] = 0x4FA2, +- [ 2050] = 0x4F03, [ 2051] = 0xE5C8, [ 2052] = 0x23E8A, [ 2053] = 0x4F42, +- [ 2054] = 0x502E, [ 2055] = 0x506C, [ 2056] = 0x5081, [ 2057] = 0x4FCC, +- [ 2058] = 0x4FE5, [ 2059] = 0x5058, [ 2060] = 0x50FC, [ 2065] = 0x6E76, +- [ 2066] = 0x23595, [ 2067] = 0xE5D8, [ 2068] = 0x23EBF, [ 2069] = 0x6D72, +- [ 2070] = 0x21884, [ 2071] = 0x23E89, [ 2072] = 0x51A8, [ 2073] = 0x51C3, +- [ 2074] = 0x205E0, [ 2075] = 0x44DD, [ 2076] = 0x204A3, [ 2077] = 0x20492, +- [ 2078] = 0x20491, [ 2079] = 0x8D7A, [ 2080] = 0x28A9C, [ 2081] = 0x2070E, +- [ 2082] = 0x5259, [ 2083] = 0x52A4, [ 2084] = 0x20873, [ 2085] = 0x52E1, +- [ 2087] = 0x467A, [ 2088] = 0x718C, [ 2089] = 0x2438C, [ 2090] = 0x20C20, +- [ 2091] = 0x249AC, [ 2092] = 0xE5F1, [ 2093] = 0x69D1, [ 2094] = 0x20E1D, +- [ 2096] = 0x3EDE, [ 2097] = 0x7499, [ 2098] = 0x7414, [ 2099] = 0x7456, +- [ 2100] = 0x7398, [ 2101] = 0x4B8E, [ 2102] = 0x24ABC, [ 2103] = 0x2408D, +- [ 2104] = 0x53D0, [ 2105] = 0x3584, [ 2106] = 0x720F, [ 2107] = 0x240C9, +- [ 2108] = 0x55B4, [ 2109] = 0x20345, [ 2110] = 0x54CD, [ 2111] = 0x20BC6, +- [ 2112] = 0x571D, [ 2113] = 0x925D, [ 2114] = 0x96F4, [ 2115] = 0x9366, +- [ 2116] = 0x57DD, [ 2117] = 0x578D, [ 2118] = 0x577F, [ 2119] = 0x363E, +- [ 2120] = 0x58CB, [ 2121] = 0x5A99, [ 2122] = 0x28A46, [ 2123] = 0x216FA, +- [ 2124] = 0x2176F, [ 2125] = 0x21710, [ 2126] = 0x5A2C, [ 2127] = 0x59B8, +- [ 2128] = 0x928F, [ 2129] = 0x5A7E, [ 2130] = 0x5ACF, [ 2131] = 0x5A12, +- [ 2132] = 0xE619, [ 2133] = 0x219F3, [ 2134] = 0x21861, [ 2135] = 0xE61C, +- [ 2136] = 0x36F5, [ 2137] = 0x6D05, [ 2138] = 0x7443, [ 2139] = 0x5A21, +- [ 2140] = 0x25E83, [ 2145] = 0x5A81, [ 2146] = 0x28BD7, [ 2147] = 0x20413, +- [ 2148] = 0x93E0, [ 2149] = 0x748C, [ 2150] = 0x21303, [ 2151] = 0x7105, +- [ 2152] = 0x4972, [ 2153] = 0x9408, [ 2154] = 0x289FB, [ 2155] = 0x93BD, +- [ 2156] = 0x37A0, [ 2157] = 0x5C1E, [ 2158] = 0x5C9E, [ 2159] = 0x5E5E, +- [ 2160] = 0x5E48, [ 2161] = 0x21996, [ 2162] = 0x2197C, [ 2163] = 0x23AEE, +- [ 2164] = 0x5ECD, [ 2165] = 0x5B4F, [ 2166] = 0x21903, [ 2167] = 0x21904, +- [ 2168] = 0x3701, [ 2169] = 0x218A0, [ 2170] = 0x36DD, [ 2171] = 0x216FE, +- [ 2172] = 0x36D3, [ 2173] = 0x812A, [ 2174] = 0x28A47, [ 2175] = 0x21DBA, +- [ 2176] = 0x23472, [ 2177] = 0x289A8, [ 2178] = 0x5F0C, [ 2179] = 0x5F0E, +- [ 2180] = 0x21927, [ 2181] = 0xE646, [ 2182] = 0x5A6B, [ 2183] = 0x2173B, +- [ 2184] = 0x5B44, [ 2185] = 0x8614, [ 2186] = 0x275FD, [ 2187] = 0x8860, +- [ 2188] = 0x607E, [ 2189] = 0x22860, [ 2190] = 0x2262B, [ 2191] = 0x5FDB, +- [ 2192] = 0x3EB8, [ 2193] = 0x225AF, [ 2194] = 0x225BE, [ 2195] = 0xE654, +- [ 2196] = 0x26F73, [ 2197] = 0x61C0, [ 2198] = 0x2003E, [ 2199] = 0x20046, +- [ 2200] = 0x2261B, [ 2201] = 0x6199, [ 2202] = 0x6198, [ 2203] = 0x6075, +- [ 2204] = 0x22C9B, [ 2205] = 0x22D07, [ 2206] = 0x246D4, [ 2207] = 0xE660, +- [ 2242] = 0x6471, [ 2243] = 0x24665, [ 2244] = 0x22B6A, [ 2245] = 0x3A29, +- [ 2246] = 0x22B22, [ 2247] = 0x23450, [ 2248] = 0x298EA, [ 2249] = 0x22E78, +- [ 2250] = 0x6337, [ 2251] = 0xE66A, [ 2252] = 0x64B6, [ 2253] = 0x6331, +- [ 2254] = 0x63D1, [ 2255] = 0x249E3, [ 2256] = 0x22D67, [ 2257] = 0x62A4, +- [ 2258] = 0x22CA1, [ 2259] = 0x643B, [ 2260] = 0x656B, [ 2261] = 0x6972, +- [ 2262] = 0x3BF4, [ 2263] = 0x2308E, [ 2264] = 0x232AD, [ 2265] = 0x24989, +- [ 2266] = 0x232AB, [ 2267] = 0x550D, [ 2268] = 0x232E0, [ 2269] = 0x218D9, +- [ 2270] = 0xE67D, [ 2271] = 0x66CE, [ 2272] = 0x23289, [ 2273] = 0xE680, +- [ 2274] = 0x3AE0, [ 2275] = 0x4190, [ 2276] = 0x25584, [ 2277] = 0x28B22, +- [ 2278] = 0x2558F, [ 2279] = 0x216FC, [ 2280] = 0x2555B, [ 2281] = 0x25425, +- [ 2282] = 0x78EE, [ 2283] = 0x23103, [ 2284] = 0x2182A, [ 2285] = 0x23234, +- [ 2286] = 0x3464, [ 2287] = 0xE68E, [ 2288] = 0x23182, [ 2289] = 0x242C9, +- [ 2290] = 0x668E, [ 2291] = 0x26D24, [ 2292] = 0x666B, [ 2293] = 0x4B93, +- [ 2294] = 0x6630, [ 2295] = 0x27870, [ 2296] = 0xE697, [ 2297] = 0x6663, +- [ 2298] = 0x232D2, [ 2299] = 0x232E1, [ 2300] = 0x661E, [ 2301] = 0x25872, +- [ 2302] = 0x38D1, [ 2303] = 0xE69E, [ 2304] = 0x237BC, [ 2305] = 0x3B99, +- [ 2306] = 0x237A2, [ 2307] = 0x233FE, [ 2308] = 0x74D0, [ 2309] = 0x3B96, +- [ 2310] = 0x678F, [ 2311] = 0x2462A, [ 2312] = 0x68B6, [ 2313] = 0x681E, +- [ 2314] = 0x3BC4, [ 2315] = 0x6ABE, [ 2316] = 0x3863, [ 2317] = 0x237D5, +- [ 2318] = 0x24487, [ 2319] = 0x6A33, [ 2320] = 0x6A52, [ 2321] = 0x6AC9, +- [ 2322] = 0x6B05, [ 2323] = 0x21912, [ 2324] = 0x6511, [ 2325] = 0x6898, +- [ 2326] = 0x6A4C, [ 2327] = 0x3BD7, [ 2328] = 0x6A7A, [ 2329] = 0x6B57, +- [ 2330] = 0x23FC0, [ 2331] = 0x23C9A, [ 2332] = 0x93A0, [ 2333] = 0x92F2, +- [ 2334] = 0x28BEA, [ 2335] = 0x28ACB, [ 2340] = 0x9289, [ 2341] = 0xE6C0, +- [ 2342] = 0x289DC, [ 2343] = 0x9467, [ 2344] = 0x6DA5, [ 2345] = 0x6F0B, +- [ 2346] = 0xE6C5, [ 2348] = 0x23F7F, [ 2349] = 0x3D8F, [ 2350] = 0x6E04, +- [ 2351] = 0x2403C, [ 2352] = 0x5A3D, [ 2353] = 0x6E0A, [ 2354] = 0x5847, +- [ 2355] = 0x6D24, [ 2356] = 0x7842, [ 2357] = 0x713B, [ 2358] = 0x2431A, +- [ 2359] = 0x24276, [ 2360] = 0x70F1, [ 2361] = 0x7250, [ 2362] = 0x7287, +- [ 2363] = 0x7294, [ 2364] = 0x2478F, [ 2365] = 0x24725, [ 2366] = 0x5179, +- [ 2367] = 0x24AA4, [ 2368] = 0x205EB, [ 2369] = 0x747A, [ 2370] = 0x23EF8, +- [ 2371] = 0xE6DE, [ 2372] = 0xE6DF, [ 2373] = 0x24917, [ 2374] = 0x25FE1, +- [ 2375] = 0x3F06, [ 2376] = 0x3EB1, [ 2377] = 0x24ADF, [ 2378] = 0x28C23, +- [ 2379] = 0x23F35, [ 2380] = 0x60A7, [ 2381] = 0x3EF3, [ 2382] = 0x74CC, +- [ 2383] = 0x743C, [ 2384] = 0x9387, [ 2385] = 0x7437, [ 2386] = 0x449F, +- [ 2387] = 0x26DEA, [ 2388] = 0x4551, [ 2389] = 0x7583, [ 2390] = 0x3F63, +- [ 2391] = 0x24CD9, [ 2392] = 0x24D06, [ 2393] = 0x3F58, [ 2394] = 0x7555, +- [ 2395] = 0x7673, [ 2396] = 0x2A5C6, [ 2397] = 0x3B19, [ 2398] = 0x7468, +- [ 2399] = 0x28ACC, [ 2400] = 0x249AB, [ 2401] = 0x2498E, [ 2402] = 0x3AFB, +- [ 2437] = 0x3DCD, [ 2438] = 0x24A4E, [ 2439] = 0x3EFF, [ 2440] = 0xE701, +- [ 2441] = 0x248F3, [ 2442] = 0x91FA, [ 2443] = 0x5732, [ 2444] = 0x9342, +- [ 2445] = 0x28AE3, [ 2446] = 0x21864, [ 2447] = 0x50DF, [ 2448] = 0x25221, +- [ 2449] = 0x251E7, [ 2450] = 0x7778, [ 2451] = 0x23232, [ 2452] = 0x770E, +- [ 2453] = 0x770F, [ 2454] = 0x777B, [ 2455] = 0x24697, [ 2456] = 0x23781, +- [ 2457] = 0x3A5E, [ 2458] = 0xE713, [ 2459] = 0x7438, [ 2460] = 0x749B, +- [ 2461] = 0x3EBF, [ 2462] = 0x24ABA, [ 2463] = 0x24AC7, [ 2464] = 0x40C8, +- [ 2465] = 0x24A96, [ 2466] = 0x261AE, [ 2467] = 0x9307, [ 2468] = 0x25581, +- [ 2469] = 0x781E, [ 2470] = 0x788D, [ 2471] = 0x7888, [ 2472] = 0x78D2, +- [ 2473] = 0x73D0, [ 2474] = 0x7959, [ 2475] = 0x27741, [ 2476] = 0xE725, +- [ 2477] = 0x410E, [ 2479] = 0x8496, [ 2480] = 0x79A5, [ 2481] = 0x6A2D, +- [ 2482] = 0x23EFA, [ 2483] = 0x7A3A, [ 2484] = 0x79F4, [ 2485] = 0x416E, +- [ 2486] = 0x216E6, [ 2487] = 0x4132, [ 2488] = 0x9235, [ 2489] = 0x79F1, +- [ 2490] = 0x20D4C, [ 2491] = 0x2498C, [ 2492] = 0x20299, [ 2493] = 0x23DBA, +- [ 2494] = 0x2176E, [ 2495] = 0x3597, [ 2496] = 0x556B, [ 2497] = 0x3570, +- [ 2498] = 0x36AA, [ 2499] = 0x201D4, [ 2500] = 0xE73D, [ 2501] = 0x7AE2, +- [ 2502] = 0x5A59, [ 2503] = 0x226F5, [ 2504] = 0xE741, [ 2505] = 0x25A9C, +- [ 2506] = 0x5A0D, [ 2507] = 0x2025B, [ 2508] = 0x78F0, [ 2509] = 0x5A2A, +- [ 2510] = 0x25BC6, [ 2511] = 0x7AFE, [ 2512] = 0x41F9, [ 2513] = 0x7C5D, +- [ 2514] = 0x7C6D, [ 2515] = 0x4211, [ 2516] = 0x25BB3, [ 2517] = 0x25EBC, +- [ 2518] = 0x25EA6, [ 2519] = 0x7CCD, [ 2520] = 0x249F9, [ 2521] = 0xE752, +- [ 2522] = 0x7C8E, [ 2523] = 0x7C7C, [ 2524] = 0x7CAE, [ 2525] = 0x6AB2, +- [ 2526] = 0x7DDC, [ 2527] = 0x7E07, [ 2528] = 0x7DD3, [ 2529] = 0x7F4E, +- [ 2530] = 0x26261, [ 2535] = 0x2615C, [ 2536] = 0xE75D, [ 2537] = 0x7D97, +- [ 2538] = 0x25E82, [ 2539] = 0x426A, [ 2540] = 0xE761, [ 2541] = 0x20916, +- [ 2542] = 0x67D6, [ 2543] = 0x2004E, [ 2544] = 0x235CF, [ 2545] = 0x57C4, +- [ 2546] = 0x26412, [ 2547] = 0xE768, [ 2548] = 0x24962, [ 2549] = 0x7FDD, +- [ 2550] = 0x7B27, [ 2551] = 0x2082C, [ 2552] = 0x25AE9, [ 2553] = 0x25D43, +- [ 2554] = 0x7B0C, [ 2555] = 0x25E0E, [ 2556] = 0x99E6, [ 2557] = 0x8645, +- [ 2558] = 0x9A63, [ 2559] = 0x6A1C, [ 2560] = 0xE775, [ 2561] = 0x39E2, +- [ 2562] = 0x249F7, [ 2563] = 0x265AD, [ 2564] = 0x9A1F, [ 2565] = 0xE77A, +- [ 2566] = 0x8480, [ 2567] = 0x27127, [ 2568] = 0xE77D, [ 2569] = 0x44EA, +- [ 2570] = 0x8137, [ 2571] = 0x4402, [ 2572] = 0x80C6, [ 2573] = 0x8109, +- [ 2574] = 0x8142, [ 2575] = 0x267B4, [ 2576] = 0x98C3, [ 2577] = 0x26A42, +- [ 2578] = 0x8262, [ 2579] = 0x8265, [ 2580] = 0x26A51, [ 2581] = 0x8453, +- [ 2582] = 0x26DA7, [ 2583] = 0x8610, [ 2584] = 0x2721B, [ 2585] = 0x5A86, +- [ 2586] = 0x417F, [ 2587] = 0xE790, [ 2588] = 0x5B2B, [ 2589] = 0x218A1, +- [ 2590] = 0x5AE4, [ 2591] = 0x218D8, [ 2592] = 0x86A0, [ 2593] = 0x8728, +- [ 2594] = 0xE797, [ 2595] = 0x882D, [ 2596] = 0x27422, [ 2597] = 0x5A02, +- [ 2632] = 0x886E, [ 2633] = 0x4F45, [ 2634] = 0x8887, [ 2635] = 0x88BF, +- [ 2636] = 0x88E6, [ 2637] = 0x8965, [ 2638] = 0x894D, [ 2639] = 0x25683, +- [ 2640] = 0x8954, [ 2641] = 0x27785, [ 2642] = 0x27784, [ 2643] = 0xE7A6, +- [ 2644] = 0x28BD9, [ 2645] = 0x28B9C, [ 2646] = 0x289F9, [ 2647] = 0x3EAD, +- [ 2648] = 0x84A3, [ 2649] = 0x46F5, [ 2650] = 0x46CF, [ 2651] = 0x37F2, +- [ 2652] = 0x8A3D, [ 2653] = 0x8A1C, [ 2654] = 0x29448, [ 2655] = 0x5F4D, +- [ 2656] = 0x922B, [ 2657] = 0xE7B4, [ 2658] = 0x65D4, [ 2659] = 0x7129, +- [ 2660] = 0x70C4, [ 2661] = 0x21845, [ 2662] = 0x9D6D, [ 2663] = 0x8C9F, +- [ 2664] = 0x8CE9, [ 2665] = 0x27DDC, [ 2666] = 0x599A, [ 2667] = 0x77C3, +- [ 2668] = 0x59F0, [ 2669] = 0x436E, [ 2670] = 0x36D4, [ 2671] = 0x8E2A, +- [ 2672] = 0x8EA7, [ 2673] = 0x24C09, [ 2674] = 0x8F30, [ 2675] = 0x8F4A, +- [ 2676] = 0x42F4, [ 2677] = 0x6C58, [ 2678] = 0x6FBB, [ 2679] = 0x22321, +- [ 2680] = 0x489B, [ 2681] = 0x6F79, [ 2682] = 0x6E8B, [ 2683] = 0x217DA, +- [ 2684] = 0x9BE9, [ 2685] = 0x36B5, [ 2686] = 0x2492F, [ 2687] = 0x90BB, +- [ 2689] = 0x5571, [ 2690] = 0x4906, [ 2691] = 0x91BB, [ 2692] = 0x9404, +- [ 2693] = 0x28A4B, [ 2694] = 0x4062, [ 2695] = 0xE7DA, [ 2696] = 0x9427, +- [ 2697] = 0x28C1D, [ 2698] = 0xE7DD, [ 2699] = 0x84E5, [ 2700] = 0x8A2B, +- [ 2701] = 0x9599, [ 2702] = 0x95A7, [ 2703] = 0x9597, [ 2704] = 0x9596, +- [ 2705] = 0x28D34, [ 2706] = 0x7445, [ 2707] = 0x3EC2, [ 2708] = 0x248FF, +- [ 2709] = 0xE7E8, [ 2710] = 0xE7E9, [ 2711] = 0x3EE7, [ 2712] = 0x23225, +- [ 2713] = 0x968F, [ 2714] = 0xE7ED, [ 2715] = 0x28E66, [ 2716] = 0x28E65, +- [ 2717] = 0x3ECC, [ 2718] = 0xE7F1, [ 2719] = 0x24A78, [ 2720] = 0x23FEE, +- [ 2721] = 0x7412, [ 2722] = 0x746B, [ 2723] = 0x3EFC, [ 2724] = 0x9741, +- [ 2725] = 0x290B0, [ 2730] = 0x6847, [ 2731] = 0x4A1D, [ 2732] = 0xE7FB, +- [ 2733] = 0xE7FC, [ 2735] = 0x9368, [ 2736] = 0x28989, [ 2737] = 0xE800, +- [ 2738] = 0x28B2F, [ 2739] = 0x263BE, [ 2740] = 0x92BA, [ 2741] = 0x5B11, +- [ 2742] = 0x8B69, [ 2743] = 0x493C, [ 2744] = 0x73F9, [ 2745] = 0x2421B, +- [ 2746] = 0x979B, [ 2747] = 0x9771, [ 2748] = 0x9938, [ 2749] = 0xE80C, +- [ 2750] = 0x5DC1, [ 2751] = 0x28BC5, [ 2752] = 0x24AB2, [ 2753] = 0x981F, +- [ 2754] = 0x294DA, [ 2755] = 0x92F6, [ 2756] = 0xE813, [ 2757] = 0x91E5, +- [ 2758] = 0x44C0, [ 2759] = 0x28B50, [ 2760] = 0x24A67, [ 2761] = 0x28B64, +- [ 2762] = 0x98DC, [ 2763] = 0x28A45, [ 2764] = 0x3F00, [ 2765] = 0x922A, +- [ 2766] = 0x4925, [ 2767] = 0x8414, [ 2768] = 0x993B, [ 2769] = 0x994D, +- [ 2770] = 0xE821, [ 2771] = 0x3DFD, [ 2772] = 0x999B, [ 2773] = 0x4B6F, +- [ 2774] = 0x99AA, [ 2775] = 0x9A5C, [ 2776] = 0x28B65, [ 2777] = 0xE828, +- [ 2778] = 0x6A8F, [ 2779] = 0x9A21, [ 2780] = 0x5AFE, [ 2781] = 0x9A2F, +- [ 2782] = 0xE82D, [ 2783] = 0x4B90, [ 2784] = 0xE82F, [ 2785] = 0x99BC, +- [ 2786] = 0x4BBD, [ 2787] = 0x4B97, [ 2788] = 0x937D, [ 2789] = 0x5872, +- [ 2790] = 0x21302, [ 2791] = 0x5822, [ 2792] = 0x249B8, [ 2827] = 0x214E8, +- [ 2828] = 0x7844, [ 2829] = 0x2271F, [ 2830] = 0x23DB8, [ 2831] = 0x68C5, +- [ 2832] = 0x3D7D, [ 2833] = 0x9458, [ 2834] = 0x3927, [ 2835] = 0x6150, +- [ 2836] = 0x22781, [ 2837] = 0x2296B, [ 2838] = 0x6107, [ 2839] = 0x9C4F, +- [ 2840] = 0x9C53, [ 2841] = 0x9C7B, [ 2842] = 0x9C35, [ 2843] = 0x9C10, +- [ 2844] = 0x9B7F, [ 2845] = 0x9BCF, [ 2846] = 0x29E2D, [ 2847] = 0x9B9F, +- [ 2848] = 0xE84D, [ 2849] = 0x2A0FE, [ 2850] = 0x9D21, [ 2851] = 0x4CAE, +- [ 2852] = 0x24104, [ 2853] = 0x9E18, [ 2854] = 0x4CB0, [ 2855] = 0x9D0C, +- [ 2856] = 0xE855, [ 2857] = 0xE856, [ 2858] = 0x2A0F3, [ 2859] = 0x2992F, +- [ 2860] = 0x9DA5, [ 2861] = 0x84BD, [ 2862] = 0xE85B, [ 2863] = 0x26FDF, +- [ 2864] = 0xE85D, [ 2865] = 0x85FC, [ 2866] = 0x4533, [ 2867] = 0x26DA4, +- [ 2868] = 0x26E84, [ 2869] = 0x26DF0, [ 2870] = 0x8420, [ 2871] = 0x85EE, +- [ 2872] = 0xE865, [ 2873] = 0x237D7, [ 2874] = 0x26064, [ 2875] = 0x79E2, +- [ 2876] = 0x2359C, [ 2877] = 0x23640, [ 2878] = 0x492D, [ 2879] = 0x249DE, +- [ 2880] = 0x3D62, [ 2881] = 0x93DB, [ 2882] = 0x92BE, [ 2883] = 0x9348, +- [ 2884] = 0x202BF, [ 2885] = 0x78B9, [ 2886] = 0x9277, [ 2887] = 0x944D, +- [ 2888] = 0x4FE4, [ 2889] = 0x3440, [ 2890] = 0x9064, [ 2891] = 0x2555D, +- [ 2892] = 0x783D, [ 2893] = 0x7854, [ 2894] = 0x78B6, [ 2895] = 0x784B, +- [ 2896] = 0x21757, [ 2897] = 0x231C9, [ 2898] = 0x24941, [ 2899] = 0x369A, +- [ 2900] = 0x4F72, [ 2901] = 0x6FDA, [ 2902] = 0x6FD9, [ 2904] = 0x701E, +- [ 2905] = 0x5414, [ 2906] = 0xE887, [ 2907] = 0x57BB, [ 2908] = 0x58F3, +- [ 2909] = 0x578A, [ 2910] = 0x9D16, [ 2911] = 0x57D7, [ 2912] = 0x7134, +- [ 2913] = 0x34AF, [ 2914] = 0xE88F, [ 2915] = 0x71EB, [ 2916] = 0xE891, +- [ 2917] = 0x24F97, [ 2919] = 0x217B5, [ 2920] = 0x28A49, [ 2925] = 0x610C, +- [ 2926] = 0x5ACE, [ 2927] = 0x5A0B, [ 2928] = 0x42BC, [ 2929] = 0x24488, +- [ 2930] = 0x372C, [ 2931] = 0x4B7B, [ 2932] = 0x289FC, [ 2933] = 0x93BB, +- [ 2934] = 0x93B8, [ 2935] = 0x218D6, [ 2936] = 0xE8A1, [ 2937] = 0x8472, +- [ 2938] = 0x26CC0, [ 2939] = 0xE8A4, [ 2940] = 0x242FA, [ 2941] = 0x22C26, +- [ 2942] = 0x243C1, [ 2943] = 0x5994, [ 2944] = 0x23DB7, [ 2945] = 0x26741, +- [ 2946] = 0x7DA8, [ 2947] = 0x2615B, [ 2948] = 0x260A4, [ 2949] = 0x249B9, +- [ 2950] = 0x2498B, [ 2951] = 0x289FA, [ 2952] = 0x92E5, [ 2953] = 0x73E2, +- [ 2954] = 0x3EE9, [ 2955] = 0x74B4, [ 2956] = 0x28B63, [ 2957] = 0x2189F, +- [ 2958] = 0x3EE1, [ 2959] = 0x24AB3, [ 2960] = 0x6AD8, [ 2961] = 0x73F3, +- [ 2962] = 0x73FB, [ 2963] = 0x3ED6, [ 2964] = 0x24A3E, [ 2965] = 0x24A94, +- [ 2966] = 0x217D9, [ 2967] = 0x24A66, [ 2968] = 0x203A7, [ 2969] = 0xE8C2, +- [ 2970] = 0xE8C3, [ 2971] = 0x7448, [ 2972] = 0x24916, [ 2973] = 0x70A5, +- [ 2974] = 0x24976, [ 2975] = 0x9284, [ 2976] = 0x73E6, [ 2977] = 0x935F, +- [ 2978] = 0x204FE, [ 2979] = 0x9331, [ 2980] = 0xE8CD, [ 2981] = 0x28A16, +- [ 2982] = 0x9386, [ 2983] = 0x28BE7, [ 2984] = 0x255D5, [ 2985] = 0x4935, +- [ 2986] = 0x28A82, [ 2987] = 0x716B, [ 3022] = 0xE8D5, [ 3023] = 0xE8D6, +- [ 3024] = 0x56A4, [ 3025] = 0x2061A, [ 3026] = 0xE8D9, [ 3027] = 0xE8DA, +- [ 3028] = 0x5502, [ 3029] = 0x79C4, [ 3030] = 0x217FA, [ 3031] = 0x7DFE, +- [ 3032] = 0x216C2, [ 3033] = 0x24A50, [ 3034] = 0xE8E1, [ 3035] = 0x452E, +- [ 3036] = 0x9401, [ 3037] = 0x370A, [ 3038] = 0xE8E5, [ 3039] = 0x249AD, +- [ 3040] = 0x59B0, [ 3041] = 0x218BF, [ 3042] = 0x21883, [ 3043] = 0x27484, +- [ 3044] = 0x5AA1, [ 3045] = 0x36E2, [ 3046] = 0x23D5B, [ 3047] = 0x36B0, +- [ 3048] = 0x925F, [ 3049] = 0x5A79, [ 3050] = 0x28A81, [ 3051] = 0x21862, +- [ 3052] = 0x9374, [ 3053] = 0x3CCD, [ 3054] = 0x20AB4, [ 3055] = 0x4A96, +- [ 3056] = 0x398A, [ 3057] = 0x50F4, [ 3058] = 0x3D69, [ 3059] = 0x3D4C, +- [ 3060] = 0x2139C, [ 3061] = 0x7175, [ 3062] = 0x42FB, [ 3063] = 0xE8FE, +- [ 3064] = 0x6E0F, [ 3065] = 0x290E4, [ 3066] = 0x44EB, [ 3067] = 0x6D57, +- [ 3068] = 0x27E4F, [ 3069] = 0x7067, [ 3070] = 0x6CAF, [ 3071] = 0x3CD6, +- [ 3072] = 0x23FED, [ 3073] = 0x23E2D, [ 3074] = 0x6E02, [ 3075] = 0x6F0C, +- [ 3076] = 0x3D6F, [ 3077] = 0x203F5, [ 3078] = 0x7551, [ 3079] = 0x36BC, +- [ 3080] = 0x34C8, [ 3081] = 0x4680, [ 3082] = 0x3EDA, [ 3083] = 0x4871, +- [ 3084] = 0x59C4, [ 3085] = 0x926E, [ 3086] = 0x493E, [ 3087] = 0x8F41, +- [ 3088] = 0xE917, [ 3089] = 0xE918, [ 3090] = 0x5812, [ 3091] = 0x57C8, +- [ 3092] = 0x36D6, [ 3093] = 0x21452, [ 3094] = 0x70FE, [ 3095] = 0x24362, +- [ 3096] = 0xE91F, [ 3097] = 0x22FE3, [ 3098] = 0x212B0, [ 3099] = 0x223BD, +- [ 3100] = 0x68B9, [ 3101] = 0x6967, [ 3102] = 0xE925, [ 3103] = 0x234E5, +- [ 3104] = 0x27BF4, [ 3105] = 0x236DF, [ 3106] = 0x28A83, [ 3107] = 0x237D6, +- [ 3108] = 0xE92B, [ 3109] = 0x24C9F, [ 3110] = 0x6A1A, [ 3111] = 0x236AD, +- [ 3112] = 0x26CB7, [ 3113] = 0x843E, [ 3114] = 0x44DF, [ 3115] = 0x44CE, +- [ 3120] = 0x26D26, [ 3121] = 0xE934, [ 3122] = 0x26C82, [ 3123] = 0x26FDE, +- [ 3124] = 0x6F17, [ 3125] = 0x27109, [ 3126] = 0x833D, [ 3127] = 0x2173A, +- [ 3128] = 0x83ED, [ 3129] = 0x26C80, [ 3130] = 0x27053, [ 3131] = 0x217DB, +- [ 3132] = 0x5989, [ 3133] = 0x5A82, [ 3134] = 0x217B3, [ 3135] = 0x5A61, +- [ 3136] = 0x5A71, [ 3137] = 0x21905, [ 3138] = 0x241FC, [ 3139] = 0x372D, +- [ 3140] = 0x59EF, [ 3141] = 0x2173C, [ 3142] = 0x36C7, [ 3143] = 0x718E, +- [ 3144] = 0x9390, [ 3145] = 0x669A, [ 3146] = 0x242A5, [ 3147] = 0x5A6E, +- [ 3148] = 0x5A2B, [ 3149] = 0xE950, [ 3150] = 0x6A2B, [ 3151] = 0x23EF9, +- [ 3152] = 0x27736, [ 3153] = 0x2445B, [ 3154] = 0x242CA, [ 3155] = 0x711D, +- [ 3156] = 0x24259, [ 3157] = 0x289E1, [ 3158] = 0x4FB0, [ 3159] = 0x26D28, +- [ 3160] = 0x5CC2, [ 3161] = 0x244CE, [ 3162] = 0x27E4D, [ 3163] = 0x243BD, +- [ 3164] = 0x6A0C, [ 3165] = 0x24256, [ 3166] = 0x21304, [ 3167] = 0x70A6, +- [ 3168] = 0x7133, [ 3169] = 0x243E9, [ 3170] = 0x3DA5, [ 3171] = 0x6CDF, +- [ 3172] = 0xE967, [ 3173] = 0x24A4F, [ 3174] = 0x7E65, [ 3175] = 0x59EB, +- [ 3176] = 0x5D2F, [ 3177] = 0x3DF3, [ 3178] = 0x5F5C, [ 3179] = 0xE96E, +- [ 3180] = 0xE96F, [ 3181] = 0x7DA4, [ 3182] = 0x8426, [ 3217] = 0x5485, +- [ 3218] = 0xE973, [ 3219] = 0x23300, [ 3220] = 0x20214, [ 3221] = 0x577E, +- [ 3222] = 0xE977, [ 3223] = 0x20619, [ 3224] = 0x3FE5, [ 3225] = 0xE97A, +- [ 3226] = 0xE97B, [ 3227] = 0x7003, [ 3228] = 0xE97D, [ 3229] = 0x5D70, +- [ 3230] = 0x738F, [ 3231] = 0x7CD3, [ 3232] = 0x28A59, [ 3233] = 0xE982, +- [ 3234] = 0x4FC8, [ 3235] = 0x7FE7, [ 3236] = 0x72CD, [ 3237] = 0x7310, +- [ 3238] = 0x27AF4, [ 3239] = 0x7338, [ 3240] = 0x7339, [ 3241] = 0x256F6, +- [ 3242] = 0x7341, [ 3243] = 0x7348, [ 3244] = 0x3EA9, [ 3245] = 0x27B18, +- [ 3246] = 0x906C, [ 3247] = 0x71F5, [ 3248] = 0xE991, [ 3249] = 0x73E1, +- [ 3250] = 0x81F6, [ 3251] = 0x3ECA, [ 3252] = 0x770C, [ 3253] = 0x3ED1, +- [ 3254] = 0x6CA2, [ 3255] = 0x56FD, [ 3256] = 0x7419, [ 3257] = 0x741E, +- [ 3258] = 0x741F, [ 3259] = 0x3EE2, [ 3260] = 0x3EF0, [ 3261] = 0x3EF4, +- [ 3262] = 0x3EFA, [ 3263] = 0x74D3, [ 3264] = 0x3F0E, [ 3265] = 0x3F53, +- [ 3266] = 0x7542, [ 3267] = 0x756D, [ 3268] = 0x7572, [ 3269] = 0x758D, +- [ 3270] = 0x3F7C, [ 3271] = 0x75C8, [ 3272] = 0x75DC, [ 3273] = 0x3FC0, +- [ 3274] = 0x764D, [ 3275] = 0x3FD7, [ 3276] = 0x7674, [ 3277] = 0x3FDC, +- [ 3278] = 0x767A, [ 3279] = 0x24F5C, [ 3280] = 0x7188, [ 3281] = 0x5623, +- [ 3282] = 0x8980, [ 3283] = 0x5869, [ 3284] = 0x401D, [ 3285] = 0x7743, +- [ 3286] = 0x4039, [ 3287] = 0x6761, [ 3288] = 0x4045, [ 3289] = 0x35DB, +- [ 3290] = 0x7798, [ 3291] = 0x406A, [ 3292] = 0x406F, [ 3293] = 0x5C5E, +- [ 3294] = 0x77BE, [ 3295] = 0x77CB, [ 3296] = 0x58F2, [ 3297] = 0x7818, +- [ 3298] = 0x70B9, [ 3299] = 0x781C, [ 3300] = 0x40A8, [ 3301] = 0x7839, +- [ 3302] = 0x7847, [ 3303] = 0x7851, [ 3304] = 0x7866, [ 3305] = 0x8448, +- [ 3306] = 0xE9CB, [ 3307] = 0x7933, [ 3308] = 0x6803, [ 3309] = 0x7932, +- [ 3310] = 0x4103, [ 3315] = 0x4109, [ 3316] = 0x7991, [ 3317] = 0x7999, +- [ 3318] = 0x8FBB, [ 3319] = 0x7A06, [ 3320] = 0x8FBC, [ 3321] = 0x4167, +- [ 3322] = 0x7A91, [ 3323] = 0x41B2, [ 3324] = 0x7ABC, [ 3325] = 0x8279, +- [ 3326] = 0x41C4, [ 3327] = 0x7ACF, [ 3328] = 0x7ADB, [ 3329] = 0x41CF, +- [ 3330] = 0x4E21, [ 3331] = 0x7B62, [ 3332] = 0x7B6C, [ 3333] = 0x7B7B, +- [ 3334] = 0x7C12, [ 3335] = 0x7C1B, [ 3336] = 0x4260, [ 3337] = 0x427A, +- [ 3338] = 0x7C7B, [ 3339] = 0x7C9C, [ 3340] = 0x428C, [ 3341] = 0x7CB8, +- [ 3342] = 0x4294, [ 3343] = 0x7CED, [ 3344] = 0x8F93, [ 3345] = 0x70C0, +- [ 3346] = 0x20CCF, [ 3347] = 0x7DCF, [ 3348] = 0x7DD4, [ 3349] = 0x7DD0, +- [ 3350] = 0x7DFD, [ 3351] = 0x7FAE, [ 3352] = 0x7FB4, [ 3353] = 0x729F, +- [ 3354] = 0x4397, [ 3355] = 0x8020, [ 3356] = 0x8025, [ 3357] = 0x7B39, +- [ 3358] = 0x802E, [ 3359] = 0x8031, [ 3360] = 0x8054, [ 3361] = 0x3DCC, +- [ 3362] = 0x57B4, [ 3363] = 0x70A0, [ 3364] = 0x80B7, [ 3365] = 0x80E9, +- [ 3366] = 0x43ED, [ 3367] = 0x810C, [ 3368] = 0x732A, [ 3369] = 0x810E, +- [ 3370] = 0x8112, [ 3371] = 0x7560, [ 3372] = 0x8114, [ 3373] = 0x4401, +- [ 3374] = 0x3B39, [ 3375] = 0x8156, [ 3376] = 0x8159, [ 3377] = 0x815A, +- [ 3412] = 0x4413, [ 3413] = 0x583A, [ 3414] = 0x817C, [ 3415] = 0x8184, +- [ 3416] = 0x4425, [ 3417] = 0x8193, [ 3418] = 0x442D, [ 3419] = 0x81A5, +- [ 3420] = 0x57EF, [ 3421] = 0x81C1, [ 3422] = 0x81E4, [ 3423] = 0x8254, +- [ 3424] = 0x448F, [ 3425] = 0x82A6, [ 3426] = 0x8276, [ 3427] = 0x82CA, +- [ 3428] = 0x82D8, [ 3429] = 0x82FF, [ 3430] = 0x44B0, [ 3431] = 0x8357, +- [ 3432] = 0x9669, [ 3433] = 0x698A, [ 3434] = 0x8405, [ 3435] = 0x70F5, +- [ 3436] = 0x8464, [ 3437] = 0x60E3, [ 3438] = 0x8488, [ 3439] = 0x4504, +- [ 3440] = 0x84BE, [ 3441] = 0x84E1, [ 3442] = 0x84F8, [ 3443] = 0x8510, +- [ 3444] = 0x8538, [ 3445] = 0x8552, [ 3446] = 0x453B, [ 3447] = 0x856F, +- [ 3448] = 0x8570, [ 3449] = 0x85E0, [ 3450] = 0x4577, [ 3451] = 0x8672, +- [ 3452] = 0x8692, [ 3453] = 0x86B2, [ 3454] = 0x86EF, [ 3455] = 0x9645, +- [ 3456] = 0x878B, [ 3457] = 0x4606, [ 3458] = 0x4617, [ 3459] = 0x88AE, +- [ 3460] = 0x88FF, [ 3461] = 0x8924, [ 3462] = 0x8947, [ 3463] = 0x8991, +- [ 3464] = 0x27967, [ 3465] = 0x8A29, [ 3466] = 0x8A38, [ 3467] = 0x8A94, +- [ 3468] = 0x8AB4, [ 3469] = 0x8C51, [ 3470] = 0x8CD4, [ 3471] = 0x8CF2, +- [ 3472] = 0x8D1C, [ 3473] = 0x4798, [ 3474] = 0x585F, [ 3475] = 0x8DC3, +- [ 3476] = 0x47ED, [ 3477] = 0x4EEE, [ 3478] = 0x8E3A, [ 3479] = 0x55D8, +- [ 3480] = 0x5754, [ 3481] = 0x8E71, [ 3482] = 0x55F5, [ 3483] = 0x8EB0, +- [ 3484] = 0x4837, [ 3485] = 0x8ECE, [ 3486] = 0x8EE2, [ 3487] = 0x8EE4, +- [ 3488] = 0x8EED, [ 3489] = 0x8EF2, [ 3490] = 0x8FB7, [ 3491] = 0x8FC1, +- [ 3492] = 0x8FCA, [ 3493] = 0x8FCC, [ 3494] = 0x9033, [ 3495] = 0x99C4, +- [ 3496] = 0x48AD, [ 3497] = 0x98E0, [ 3498] = 0x9213, [ 3499] = 0x491E, +- [ 3500] = 0x9228, [ 3501] = 0x9258, [ 3502] = 0x926B, [ 3503] = 0x92B1, +- [ 3504] = 0x92AE, [ 3505] = 0x92BF, [ 3510] = 0x92E3, [ 3511] = 0x92EB, +- [ 3512] = 0x92F3, [ 3513] = 0x92F4, [ 3514] = 0x92FD, [ 3515] = 0x9343, +- [ 3516] = 0x9384, [ 3517] = 0x93AD, [ 3518] = 0x4945, [ 3519] = 0x4951, +- [ 3520] = 0x9EBF, [ 3521] = 0x9417, [ 3522] = 0x5301, [ 3523] = 0x941D, +- [ 3524] = 0x942D, [ 3525] = 0x943E, [ 3526] = 0x496A, [ 3527] = 0x9454, +- [ 3528] = 0x9479, [ 3529] = 0x952D, [ 3530] = 0x95A2, [ 3531] = 0x49A7, +- [ 3532] = 0x95F4, [ 3533] = 0x9633, [ 3534] = 0x49E5, [ 3535] = 0x67A0, +- [ 3536] = 0x4A24, [ 3537] = 0x9740, [ 3538] = 0x4A35, [ 3539] = 0x97B2, +- [ 3540] = 0x97C2, [ 3541] = 0x5654, [ 3542] = 0x4AE4, [ 3543] = 0x60E8, +- [ 3544] = 0x98B9, [ 3545] = 0x4B19, [ 3546] = 0x98F1, [ 3547] = 0x5844, +- [ 3548] = 0x990E, [ 3549] = 0x9919, [ 3550] = 0x51B4, [ 3551] = 0x991C, +- [ 3552] = 0x9937, [ 3553] = 0x9942, [ 3554] = 0x995D, [ 3555] = 0x9962, +- [ 3556] = 0x4B70, [ 3557] = 0x99C5, [ 3558] = 0x4B9D, [ 3559] = 0x9A3C, +- [ 3560] = 0x9B0F, [ 3561] = 0x7A83, [ 3562] = 0x9B69, [ 3563] = 0x9B81, +- [ 3564] = 0x9BDD, [ 3565] = 0x9BF1, [ 3566] = 0x9BF4, [ 3567] = 0x4C6D, +- [ 3568] = 0x9C20, [ 3569] = 0x376F, [ 3570] = 0xEAA9, [ 3571] = 0x9D49, +- [ 3572] = 0x9C3A, [ 3607] = 0x9EFE, [ 3608] = 0x5650, [ 3609] = 0x9D93, +- [ 3610] = 0x9DBD, [ 3611] = 0x9DC0, [ 3612] = 0x9DFC, [ 3613] = 0x94F6, +- [ 3614] = 0x8FB6, [ 3615] = 0x9E7B, [ 3616] = 0x9EAC, [ 3617] = 0x9EB1, +- [ 3618] = 0x9EBD, [ 3619] = 0x9EC6, [ 3620] = 0x94DC, [ 3621] = 0x9EE2, +- [ 3622] = 0x9EF1, [ 3623] = 0x9EF8, [ 3624] = 0x7AC8, [ 3625] = 0x9F44, +- [ 3626] = 0xEABF, [ 3627] = 0xEAC0, [ 3628] = 0xEAC1, [ 3629] = 0x691A, +- [ 3630] = 0x94C3, [ 3631] = 0x59AC, [ 3632] = 0xEAC5, [ 3633] = 0x5840, +- [ 3634] = 0x94C1, [ 3635] = 0x37B9, [ 3636] = 0xEAC9, [ 3637] = 0xEACA, +- [ 3638] = 0xEACB, [ 3639] = 0xEACC, [ 3640] = 0x5757, [ 3641] = 0x7173, +- [ 3642] = 0xEACF, [ 3643] = 0xEAD0, [ 3644] = 0xEAD1, [ 3645] = 0x546A, +- [ 3646] = 0xEAD3, [ 3647] = 0xEAD4, [ 3648] = 0x549E, [ 3649] = 0xEAD6, +- [ 3650] = 0xEAD7, [ 3651] = 0x20C53, [ 3652] = 0xEAD9, [ 3653] = 0xEADA, +- [ 3654] = 0x60E7, [ 3655] = 0xEADC, [ 3656] = 0x567A, [ 3657] = 0xEADE, +- [ 3658] = 0xEADF, [ 3659] = 0xEAE0, [ 3660] = 0xEAE1, [ 3661] = 0xEAE2, +- [ 3662] = 0xEAE3, [ 3663] = 0x6955, [ 3664] = 0x9C2F, [ 3665] = 0x87A5, +- [ 3666] = 0xEAE7, [ 3667] = 0x20E0E, [ 3668] = 0xEAE9, [ 3669] = 0xEAEA, +- [ 3670] = 0x20F2D, [ 3671] = 0xEAEC, [ 3672] = 0x5C20, [ 3673] = 0xEAEE, +- [ 3674] = 0x5E0B, [ 3675] = 0xEAF0, [ 3676] = 0xEAF1, [ 3677] = 0x21076, +- [ 3678] = 0x671E, [ 3679] = 0x2107B, [ 3680] = 0xEAF5, [ 3681] = 0xEAF6, +- [ 3682] = 0x3647, [ 3683] = 0xEAF8, [ 3684] = 0xEAF9, [ 3685] = 0xEAFA, +- [ 3686] = 0xEAFB, [ 3687] = 0x5364, [ 3688] = 0x84AD, [ 3689] = 0x212E3, +- [ 3690] = 0xEAFF, [ 3691] = 0xEB00, [ 3692] = 0x8B81, [ 3693] = 0xEB02, +- [ 3694] = 0xEB03, [ 3695] = 0xEB04, [ 3696] = 0xEB05, [ 3697] = 0x4E78, +- [ 3698] = 0x70BB, [ 3699] = 0xEB08, [ 3700] = 0xEB09, [ 3705] = 0xEB0A, +- [ 3706] = 0xEB0B, [ 3707] = 0xEB0C, [ 3708] = 0xEB0D, [ 3709] = 0xEB0E, +- [ 3710] = 0xEB0F, [ 3711] = 0x62C3, [ 3712] = 0x21ED5, [ 3713] = 0xEB12, +- [ 3714] = 0x7198, [ 3715] = 0x6855, [ 3716] = 0xEB15, [ 3717] = 0x69E9, +- [ 3718] = 0x36C8, [ 3719] = 0x2227C, [ 3720] = 0xEB19, [ 3721] = 0xEB1A, +- [ 3722] = 0xEB1B, [ 3723] = 0xEB1C, [ 3724] = 0xEB1D, [ 3725] = 0x82FD, +- [ 3726] = 0xEB1F, [ 3727] = 0xEB20, [ 3728] = 0x22AD5, [ 3729] = 0x89A5, +- [ 3730] = 0xEB23, [ 3731] = 0x8FA0, [ 3732] = 0xEB25, [ 3733] = 0x97B8, +- [ 3734] = 0xEB27, [ 3735] = 0x9847, [ 3736] = 0x9ABD, [ 3737] = 0xEB2A, +- [ 3739] = 0xEB2C, [ 3740] = 0xEB2D, [ 3741] = 0xEB2E, [ 3742] = 0x22D08, +- [ 3743] = 0xEB30, [ 3744] = 0xEB31, [ 3745] = 0xEB32, [ 3746] = 0xEB33, +- [ 3747] = 0xEB34, [ 3748] = 0xEB35, [ 3749] = 0xEB36, [ 3750] = 0xEB37, +- [ 3751] = 0xEB38, [ 3752] = 0xEB39, [ 3753] = 0x5FB1, [ 3754] = 0x6648, +- [ 3755] = 0x66BF, [ 3756] = 0xEB3D, [ 3757] = 0xEB3E, [ 3758] = 0xEB3F, +- [ 3760] = 0x249BA, [ 3762] = 0xEB43, [ 3763] = 0xEB44, [ 3765] = 0x20346, +- [ 3766] = 0x58B5, [ 3767] = 0x670E, [ 3802] = 0x6918, [ 3803] = 0xEB4A, +- [ 3804] = 0x27657, [ 3805] = 0x25FE2, [ 3806] = 0xEB4D, [ 3807] = 0xEB4E, +- [ 3808] = 0x275FE, [ 3809] = 0x2209A, [ 3810] = 0x48D0, [ 3811] = 0x4AB8, +- [ 3812] = 0xEB53, [ 3813] = 0x28A9A, [ 3814] = 0xEB55, [ 3815] = 0xEB56, +- [ 3816] = 0x2403B, [ 3817] = 0xEB58, [ 3818] = 0x24396, [ 3819] = 0xEB5A, +- [ 3820] = 0xEB5B, [ 3821] = 0x51D2, [ 3822] = 0x20611, [ 3823] = 0x599F, +- [ 3824] = 0x21EA8, [ 3825] = 0x3BBE, [ 3826] = 0x23CFF, [ 3827] = 0xEB62, +- [ 3828] = 0xEB63, [ 3829] = 0x5788, [ 3830] = 0xEB65, [ 3831] = 0x399B, +- [ 3832] = 0xEB67, [ 3833] = 0xEB68, [ 3834] = 0xEB69, [ 3835] = 0x3762, +- [ 3836] = 0x221C3, [ 3837] = 0x8B5E, [ 3838] = 0x28B4E, [ 3840] = 0xEB6F, +- [ 3841] = 0xEB70, [ 3842] = 0xEB71, [ 3843] = 0x7209, [ 3844] = 0xEB73, +- [ 3845] = 0x20C78, [ 3846] = 0x5965, [ 3847] = 0xEB76, [ 3848] = 0xEB77, +- [ 3849] = 0x20779, [ 3850] = 0x8EDA, [ 3851] = 0xEB7A, [ 3852] = 0x528F, +- [ 3853] = 0x573F, [ 3854] = 0x7171, [ 3855] = 0xEB7E, [ 3856] = 0xEB7F, +- [ 3857] = 0xEB80, [ 3858] = 0x24AA7, [ 3859] = 0x55BC, [ 3860] = 0xEB83, +- [ 3861] = 0x2546E, [ 3862] = 0x26B52, [ 3864] = 0x3473, [ 3865] = 0xEB88, +- [ 3866] = 0x27632, [ 3867] = 0xEB8A, [ 3868] = 0x4718, [ 3869] = 0xEB8C, +- [ 3870] = 0x25566, [ 3871] = 0x257C7, [ 3872] = 0x2493F, [ 3873] = 0xEB90, +- [ 3874] = 0x5066, [ 3875] = 0x34FB, [ 3876] = 0xEB93, [ 3878] = 0xEB95, +- [ 3879] = 0x477C, [ 3880] = 0x28948, [ 3881] = 0x25AAE, [ 3882] = 0xEB99, +- [ 3883] = 0x25C06, [ 3884] = 0xEB9B, [ 3885] = 0x57A1, [ 3886] = 0x7151, +- [ 3888] = 0xEB9F, [ 3889] = 0x27C12, [ 3890] = 0x9056, [ 3891] = 0xEBA2, +- [ 3892] = 0x24F9A, [ 3893] = 0x8B62, [ 3894] = 0xEBA5, [ 3895] = 0xEBA6, +- [ 3900] = 0x5D5B, [ 3901] = 0x26BF7, [ 3903] = 0xEBAA, [ 3904] = 0xEBAB, +- [ 3905] = 0x8AEA, [ 3906] = 0x249F6, [ 3907] = 0xEBAE, [ 3908] = 0x23FEF, +- [ 3909] = 0x26512, [ 3910] = 0x4BC0, [ 3911] = 0xEBB2, [ 3912] = 0xEBB3, +- [ 3913] = 0x2271B, [ 3914] = 0x9465, [ 3915] = 0x257E1, [ 3916] = 0x6195, +- [ 3917] = 0x5A27, [ 3918] = 0x2F8CD, [ 3920] = 0x56B9, [ 3921] = 0x24521, +- [ 3922] = 0xEBBD, [ 3923] = 0x4E6A, [ 3924] = 0xEBBF, [ 3925] = 0x9656, +- [ 3926] = 0x6D8F, [ 3927] = 0x26CBD, [ 3928] = 0x3618, [ 3929] = 0x8977, +- [ 3930] = 0xEBC5, [ 3931] = 0x2686E, [ 3932] = 0x26411, [ 3933] = 0x2685E, +- [ 3935] = 0xEBCA, [ 3936] = 0x7B42, [ 3937] = 0xEBCC, [ 3938] = 0x20A11, +- [ 3939] = 0xEBCE, [ 3941] = 0xEBD0, [ 3942] = 0x7A45, [ 3944] = 0x269FA, +- [ 3945] = 0x9A26, [ 3946] = 0xEBD5, [ 3947] = 0x365F, [ 3948] = 0xEBD7, +- [ 3949] = 0xEBD8, [ 3950] = 0x7983, [ 3951] = 0xEBDA, [ 3952] = 0xEBDB, +- [ 3953] = 0x5D2C, [ 3954] = 0xEBDD, [ 3956] = 0xEBDF, [ 3957] = 0x46D0, +- [ 3958] = 0xEBE1, [ 3959] = 0x753B, [ 3960] = 0x8865, [ 3961] = 0xEBE4, +- [ 3962] = 0x58B6, [ 3997] = 0x371C, [ 3998] = 0x2258D, [ 3999] = 0xEBE8, +- [ 4000] = 0xEBE9, [ 4001] = 0x3C54, [ 4002] = 0xEBEB, [ 4003] = 0xEBEC, +- [ 4004] = 0x9281, [ 4005] = 0x2217A, [ 4006] = 0xEBEF, [ 4007] = 0x9330, +- [ 4008] = 0x272E6, [ 4009] = 0xEBF2, [ 4010] = 0x6C39, [ 4011] = 0x949F, +- [ 4012] = 0xEBF5, [ 4013] = 0x20EF8, [ 4014] = 0x8827, [ 4015] = 0x88F5, +- [ 4016] = 0xEBF9, [ 4017] = 0xEBFA, [ 4018] = 0x217B1, [ 4019] = 0x6EB8, +- [ 4020] = 0x24A2A, [ 4021] = 0xEBFE, [ 4022] = 0x39A4, [ 4023] = 0x36B9, +- [ 4026] = 0x453F, [ 4027] = 0x66B6, [ 4028] = 0x29CAD, [ 4029] = 0x298A4, +- [ 4030] = 0x8943, [ 4031] = 0xEC08, [ 4032] = 0xEC09, [ 4033] = 0x56D6, +- [ 4034] = 0x40DF, [ 4035] = 0x2160A, [ 4036] = 0x39A1, [ 4037] = 0x2372F, +- [ 4038] = 0xEC0F, [ 4039] = 0x213C5, [ 4040] = 0x71AD, [ 4041] = 0x8366, +- [ 4042] = 0xEC13, [ 4043] = 0x291A8, [ 4045] = 0x4CB7, [ 4046] = 0x270AF, +- [ 4047] = 0x289AB, [ 4048] = 0xEC19, [ 4049] = 0xEC1A, [ 4050] = 0xEC1B, +- [ 4051] = 0xEC1C, [ 4052] = 0x2417A, [ 4053] = 0x7B43, [ 4054] = 0x797E, +- [ 4055] = 0x28009, [ 4056] = 0x6FB5, [ 4057] = 0x2A2DF, [ 4058] = 0x6A03, +- [ 4059] = 0xEC24, [ 4060] = 0x53A2, [ 4061] = 0xEC26, [ 4062] = 0x93BF, +- [ 4063] = 0x6836, [ 4064] = 0x975D, [ 4065] = 0x2816F, [ 4066] = 0xEC2B, +- [ 4067] = 0x269B5, [ 4068] = 0x213ED, [ 4069] = 0x2322F, [ 4070] = 0xEC2F, +- [ 4071] = 0x5D85, [ 4072] = 0x28C30, [ 4073] = 0xEC32, [ 4074] = 0x5715, +- [ 4075] = 0x9823, [ 4076] = 0x28949, [ 4077] = 0x5DAB, [ 4078] = 0x24988, +- [ 4079] = 0x65BE, [ 4080] = 0x69D5, [ 4081] = 0x53D2, [ 4082] = 0x24AA5, +- [ 4083] = 0x23F81, [ 4084] = 0x3C11, [ 4085] = 0x6736, [ 4086] = 0xEC3F, +- [ 4087] = 0x280F4, [ 4088] = 0x2812E, [ 4089] = 0x21FA1, [ 4090] = 0xEC43, +- [ 4095] = 0xEC44, [ 4096] = 0xEC45, [ 4097] = 0xEC46, [ 4098] = 0xEC47, +- [ 4099] = 0xEC48, [ 4100] = 0xEC49, [ 4101] = 0x35CA, [ 4102] = 0xEC4B, +- [ 4103] = 0x286AA, [ 4104] = 0x48FA, [ 4105] = 0x63E6, [ 4106] = 0xEC4F, +- [ 4107] = 0x7808, [ 4108] = 0x9255, [ 4109] = 0xEC52, [ 4110] = 0x43F2, +- [ 4111] = 0xEC54, [ 4112] = 0x43DF, [ 4113] = 0xEC56, [ 4114] = 0xEC57, +- [ 4115] = 0xEC58, [ 4116] = 0x59F8, [ 4117] = 0xEC5A, [ 4119] = 0xEC5C, +- [ 4120] = 0xEC5D, [ 4122] = 0x29110, [ 4123] = 0xEC60, [ 4124] = 0x3DF7, +- [ 4125] = 0xEC62, [ 4126] = 0xEC63, [ 4127] = 0x8FD0, [ 4128] = 0x728F, +- [ 4129] = 0x568B, [ 4130] = 0xEC67, [ 4131] = 0x295E9, [ 4132] = 0xEC69, +- [ 4133] = 0xEC6A, [ 4134] = 0xEC6B, [ 4135] = 0xEC6C, [ 4136] = 0xEC6D, +- [ 4137] = 0x2996A, [ 4138] = 0xEC6F, [ 4139] = 0xEC70, [ 4140] = 0x29B0E, +- [ 4141] = 0xEC72, [ 4142] = 0xEC73, [ 4143] = 0x7E9F, [ 4144] = 0xEC75, +- [ 4145] = 0x29F23, [ 4146] = 0x4CA4, [ 4147] = 0x9547, [ 4148] = 0xEC79, +- [ 4149] = 0x71A2, [ 4150] = 0xEC7B, [ 4151] = 0x4D91, [ 4152] = 0x9012, +- [ 4153] = 0xEC7E, [ 4154] = 0x4D9C, [ 4155] = 0x20C9C, [ 4156] = 0x8FBE, +- [ 4157] = 0x55C1, [ 4192] = 0x8FBA, [ 4193] = 0xEC84, [ 4194] = 0x8FB9, +- [ 4195] = 0x24A93, [ 4196] = 0x4509, [ 4197] = 0x7E7F, [ 4198] = 0x6F56, +- [ 4199] = 0x6AB1, [ 4200] = 0x4EEA, [ 4201] = 0x34E4, [ 4202] = 0x28B2C, +- [ 4203] = 0xEC8E, [ 4204] = 0x373A, [ 4205] = 0x8E80, [ 4206] = 0x217F5, +- [ 4207] = 0xEC92, [ 4208] = 0x28B6C, [ 4209] = 0x28B99, [ 4210] = 0xEC95, +- [ 4211] = 0x266AF, [ 4212] = 0x3DEB, [ 4213] = 0x27655, [ 4214] = 0x23CB7, +- [ 4215] = 0x25635, [ 4216] = 0x25956, [ 4217] = 0x4E9A, [ 4218] = 0x25E81, +- [ 4219] = 0x26258, [ 4220] = 0x56BF, [ 4221] = 0x20E6D, [ 4222] = 0x8E0E, +- [ 4223] = 0x5B6D, [ 4224] = 0x23E88, [ 4225] = 0x24C9E, [ 4226] = 0x63DE, +- [ 4228] = 0x217F6, [ 4229] = 0x2187B, [ 4230] = 0x6530, [ 4231] = 0x562D, +- [ 4232] = 0x25C4A, [ 4233] = 0x541A, [ 4234] = 0x25311, [ 4235] = 0x3DC6, +- [ 4236] = 0xECAF, [ 4237] = 0x4C7D, [ 4238] = 0x5622, [ 4239] = 0x561E, +- [ 4240] = 0x7F49, [ 4241] = 0x25ED8, [ 4242] = 0x5975, [ 4243] = 0xECB6, +- [ 4244] = 0x8770, [ 4245] = 0x4E1C, [ 4246] = 0x20FEA, [ 4247] = 0x20D49, +- [ 4248] = 0x236BA, [ 4249] = 0x8117, [ 4250] = 0x9D5E, [ 4251] = 0x8D18, +- [ 4252] = 0x763B, [ 4253] = 0x9C45, [ 4254] = 0x764E, [ 4255] = 0x77B9, +- [ 4256] = 0x9345, [ 4257] = 0x5432, [ 4258] = 0x8148, [ 4259] = 0x82F7, +- [ 4260] = 0x5625, [ 4261] = 0x8132, [ 4262] = 0x8418, [ 4263] = 0x80BD, +- [ 4264] = 0x55EA, [ 4265] = 0x7962, [ 4266] = 0x5643, [ 4267] = 0x5416, +- [ 4268] = 0xECCF, [ 4269] = 0x35CE, [ 4270] = 0x5605, [ 4271] = 0x55F1, +- [ 4272] = 0x66F1, [ 4273] = 0x282E2, [ 4274] = 0x362D, [ 4275] = 0x7534, +- [ 4276] = 0x55F0, [ 4277] = 0x55BA, [ 4278] = 0x5497, [ 4279] = 0x5572, +- [ 4280] = 0x20C41, [ 4281] = 0xECDC, [ 4282] = 0x5ED0, [ 4283] = 0x25148, +- [ 4284] = 0x20E76, [ 4285] = 0xECE0, [ 4290] = 0xECE1, [ 4291] = 0x9EAB, +- [ 4292] = 0x7D5A, [ 4293] = 0x55DE, [ 4294] = 0x21075, [ 4295] = 0x629D, +- [ 4296] = 0x976D, [ 4297] = 0x5494, [ 4298] = 0x8CCD, [ 4299] = 0x71F6, +- [ 4300] = 0x9176, [ 4301] = 0x63FC, [ 4302] = 0x63B9, [ 4303] = 0x63FE, +- [ 4304] = 0x5569, [ 4305] = 0xECF0, [ 4306] = 0x9C72, [ 4307] = 0xECF2, +- [ 4308] = 0x519A, [ 4309] = 0x34DF, [ 4310] = 0x20DA7, [ 4311] = 0x51A7, +- [ 4312] = 0x544D, [ 4313] = 0x551E, [ 4314] = 0x5513, [ 4315] = 0x7666, +- [ 4316] = 0x8E2D, [ 4317] = 0xECFC, [ 4318] = 0x75B1, [ 4319] = 0x80B6, +- [ 4320] = 0x8804, [ 4321] = 0x8786, [ 4322] = 0x88C7, [ 4323] = 0x81B6, +- [ 4324] = 0x841C, [ 4325] = 0x210C1, [ 4326] = 0x44EC, [ 4327] = 0x7304, +- [ 4328] = 0x24706, [ 4329] = 0x5B90, [ 4330] = 0x830B, [ 4331] = 0x26893, +- [ 4332] = 0x567B, [ 4333] = 0x226F4, [ 4334] = 0x27D2F, [ 4335] = 0x241A3, +- [ 4336] = 0x27D73, [ 4337] = 0x26ED0, [ 4338] = 0xED11, [ 4339] = 0x9170, +- [ 4340] = 0x211D9, [ 4341] = 0x9208, [ 4342] = 0x23CFC, [ 4343] = 0x2A6A9, +- [ 4344] = 0x20EAC, [ 4345] = 0x20EF9, [ 4346] = 0x7266, [ 4347] = 0x21CA2, +- [ 4348] = 0x474E, [ 4349] = 0x24FC2, [ 4350] = 0xED1D, [ 4351] = 0x20FEB, +- [ 4352] = 0x40FA, [ 4387] = 0x9C5D, [ 4388] = 0x651F, [ 4389] = 0x22DA0, +- [ 4390] = 0x48F3, [ 4391] = 0xED24, [ 4392] = 0x29D7C, [ 4393] = 0x20FEC, +- [ 4394] = 0x20E0A, [ 4396] = 0xED29, [ 4397] = 0x20FED, [ 4399] = 0xED2C, +- [ 4400] = 0x21187, [ 4401] = 0x71A3, [ 4402] = 0x7E8E, [ 4403] = 0x9D50, +- [ 4404] = 0x4E1A, [ 4405] = 0x4E04, [ 4406] = 0x3577, [ 4407] = 0x5B0D, +- [ 4408] = 0x6CB2, [ 4409] = 0x5367, [ 4410] = 0x36AC, [ 4411] = 0x39DC, +- [ 4412] = 0x537D, [ 4413] = 0x36A5, [ 4414] = 0xED3B, [ 4415] = 0x589A, +- [ 4416] = 0x24B6E, [ 4417] = 0x822D, [ 4418] = 0x544B, [ 4419] = 0x57AA, +- [ 4420] = 0xED41, [ 4421] = 0x20979, [ 4423] = 0x3A52, [ 4424] = 0x22465, +- [ 4425] = 0x7374, [ 4426] = 0x29EAC, [ 4427] = 0x4D09, [ 4428] = 0x9BED, +- [ 4429] = 0x23CFE, [ 4430] = 0x29F30, [ 4431] = 0x4C5B, [ 4432] = 0x24FA9, +- [ 4433] = 0x2959E, [ 4434] = 0xED4F, [ 4435] = 0x845C, [ 4436] = 0x23DB6, +- [ 4437] = 0xED52, [ 4438] = 0x267B3, [ 4439] = 0x23720, [ 4440] = 0x632E, +- [ 4441] = 0x7D25, [ 4442] = 0x23EF7, [ 4443] = 0x23E2C, [ 4444] = 0x3A2A, +- [ 4445] = 0x9008, [ 4446] = 0x52CC, [ 4447] = 0x3E74, [ 4448] = 0x367A, +- [ 4449] = 0x45E9, [ 4450] = 0xED5F, [ 4451] = 0x7640, [ 4452] = 0x5AF0, +- [ 4453] = 0x20EB6, [ 4454] = 0x787A, [ 4455] = 0x47B6, [ 4456] = 0x58A7, +- [ 4457] = 0x40BF, [ 4458] = 0x567C, [ 4459] = 0x9B8B, [ 4460] = 0x5D74, +- [ 4461] = 0x7654, [ 4462] = 0xED6B, [ 4463] = 0x9E85, [ 4464] = 0x4CE1, +- [ 4466] = 0x37FB, [ 4467] = 0x6119, [ 4468] = 0x230DA, [ 4469] = 0x243F2, +- [ 4471] = 0x565D, [ 4472] = 0x212A9, [ 4473] = 0x57A7, [ 4474] = 0x24963, +- [ 4475] = 0xED78, [ 4476] = 0x5234, [ 4477] = 0x270AE, [ 4478] = 0x35AD, +- [ 4480] = 0x9D7C, [ 4485] = 0x7C56, [ 4486] = 0x9B39, [ 4487] = 0x57DE, +- [ 4488] = 0x2176C, [ 4489] = 0x5C53, [ 4490] = 0x64D3, [ 4491] = 0xED84, +- [ 4492] = 0xED85, [ 4493] = 0x27164, [ 4494] = 0x86AD, [ 4495] = 0xED88, +- [ 4496] = 0x26D22, [ 4497] = 0x24AE2, [ 4498] = 0xED8B, [ 4500] = 0x51FE, +- [ 4501] = 0xED8E, [ 4502] = 0x5D8E, [ 4503] = 0x9703, [ 4504] = 0x21DD1, +- [ 4505] = 0x9E81, [ 4506] = 0x904C, [ 4507] = 0x7B1F, [ 4508] = 0x9B02, +- [ 4509] = 0x5CD1, [ 4510] = 0x7BA3, [ 4511] = 0x6268, [ 4512] = 0x6335, +- [ 4513] = 0x9AFF, [ 4514] = 0x7BCF, [ 4515] = 0x9B2A, [ 4516] = 0x7C7E, +- [ 4518] = 0x7C42, [ 4519] = 0x7C86, [ 4520] = 0x9C15, [ 4521] = 0x7BFC, +- [ 4522] = 0x9B09, [ 4524] = 0x9C1B, [ 4525] = 0x2493E, [ 4526] = 0x9F5A, +- [ 4527] = 0x5573, [ 4528] = 0x5BC3, [ 4529] = 0x4FFD, [ 4530] = 0x9E98, +- [ 4531] = 0x4FF2, [ 4532] = 0x5260, [ 4533] = 0x3E06, [ 4534] = 0x52D1, +- [ 4535] = 0x5767, [ 4536] = 0x5056, [ 4537] = 0x59B7, [ 4538] = 0x5E12, +- [ 4539] = 0x97C8, [ 4540] = 0x9DAB, [ 4541] = 0x8F5C, [ 4542] = 0x5469, +- [ 4543] = 0x97B4, [ 4544] = 0x9940, [ 4545] = 0x97BA, [ 4546] = 0x532C, +- [ 4547] = 0x6130, [ 4582] = 0x692C, [ 4583] = 0x53DA, [ 4584] = 0x9C0A, +- [ 4585] = 0x9D02, [ 4586] = 0x4C3B, [ 4587] = 0x9641, [ 4588] = 0x6980, +- [ 4589] = 0x50A6, [ 4590] = 0x7546, [ 4591] = 0x2176D, [ 4592] = 0x99DA, +- [ 4593] = 0x5273, [ 4595] = 0x9159, [ 4596] = 0x9681, [ 4597] = 0x915C, +- [ 4599] = 0x9151, [ 4600] = 0xEDCF, [ 4601] = 0x637F, [ 4602] = 0x26D23, +- [ 4603] = 0x6ACA, [ 4604] = 0x5611, [ 4605] = 0x918E, [ 4606] = 0x757A, +- [ 4607] = 0x6285, [ 4608] = 0x203FC, [ 4609] = 0x734F, [ 4610] = 0x7C70, +- [ 4611] = 0xEDDA, [ 4612] = 0x23CFD, [ 4614] = 0x24919, [ 4615] = 0x76D6, +- [ 4616] = 0x9B9D, [ 4617] = 0x4E2A, [ 4618] = 0x20CD4, [ 4619] = 0x83BE, +- [ 4620] = 0x8842, [ 4622] = 0x5C4A, [ 4623] = 0x69C0, [ 4625] = 0x577A, +- [ 4626] = 0x521F, [ 4627] = 0x5DF5, [ 4628] = 0x4ECE, [ 4629] = 0x6C31, +- [ 4630] = 0xEDED, [ 4631] = 0x4F39, [ 4632] = 0x549C, [ 4633] = 0x54DA, +- [ 4634] = 0x529A, [ 4635] = 0x8D82, [ 4636] = 0x35FE, [ 4638] = 0x35F3, +- [ 4640] = 0x6B52, [ 4641] = 0x917C, [ 4642] = 0x9FA5, [ 4643] = 0x9B97, +- [ 4644] = 0x982E, [ 4645] = 0x98B4, [ 4646] = 0x9ABA, [ 4647] = 0x9EA8, +- [ 4648] = 0x9E84, [ 4649] = 0x717A, [ 4650] = 0x7B14, [ 4652] = 0x6BFA, +- [ 4653] = 0x8818, [ 4654] = 0x7F78, [ 4656] = 0x5620, [ 4657] = 0xEE08, +- [ 4658] = 0x8E77, [ 4659] = 0x9F53, [ 4661] = 0x8DD4, [ 4662] = 0x8E4F, +- [ 4663] = 0x9E1C, [ 4664] = 0x8E01, [ 4665] = 0x6282, [ 4666] = 0x2837D, +- [ 4667] = 0x8E28, [ 4668] = 0x8E75, [ 4669] = 0x7AD3, [ 4670] = 0x24A77, +- [ 4671] = 0x7A3E, [ 4672] = 0x78D8, [ 4673] = 0x6CEA, [ 4674] = 0x8A67, +- [ 4675] = 0x7607, [ 4680] = 0x28A5A, [ 4681] = 0x9F26, [ 4682] = 0x6CCE, +- [ 4683] = 0x87D6, [ 4684] = 0x75C3, [ 4685] = 0x2A2B2, [ 4686] = 0x7853, +- [ 4687] = 0x2F840, [ 4688] = 0x8D0C, [ 4689] = 0x72E2, [ 4690] = 0x7371, +- [ 4691] = 0x8B2D, [ 4692] = 0x7302, [ 4693] = 0x74F1, [ 4694] = 0x8CEB, +- [ 4695] = 0x24ABB, [ 4696] = 0x862F, [ 4697] = 0x5FBA, [ 4698] = 0x88A0, +- [ 4699] = 0x44B7, [ 4701] = 0x2183B, [ 4702] = 0x26E05, [ 4704] = 0x8A7E, +- [ 4705] = 0x2251B, [ 4707] = 0x60FD, [ 4708] = 0x7667, [ 4709] = 0x9AD7, +- [ 4710] = 0x9D44, [ 4711] = 0x936E, [ 4712] = 0x9B8F, [ 4713] = 0x87F5, +- [ 4716] = 0x8CF7, [ 4717] = 0x732C, [ 4718] = 0x9721, [ 4719] = 0x9BB0, +- [ 4720] = 0x35D6, [ 4721] = 0x72B2, [ 4722] = 0x4C07, [ 4723] = 0x7C51, +- [ 4724] = 0x994A, [ 4725] = 0x26159, [ 4726] = 0x6159, [ 4727] = 0x4C04, +- [ 4728] = 0x9E96, [ 4729] = 0x617D, [ 4731] = 0x575F, [ 4732] = 0x616F, +- [ 4733] = 0x62A6, [ 4734] = 0x6239, [ 4736] = 0x3A5C, [ 4737] = 0x61E2, +- [ 4738] = 0x53AA, [ 4739] = 0x233F5, [ 4740] = 0x6364, [ 4741] = 0x6802, +- [ 4742] = 0x35D2, [ 4777] = 0x5D57, [ 4778] = 0x28BC2, [ 4779] = 0x8FDA, +- [ 4780] = 0xEE5D, [ 4782] = 0x50D9, [ 4783] = 0x21D46, [ 4784] = 0x7906, +- [ 4785] = 0x5332, [ 4786] = 0x9638, [ 4787] = 0x20F3B, [ 4788] = 0x4065, +- [ 4790] = 0x77FE, [ 4792] = 0x7CC2, [ 4793] = 0xEE6A, [ 4794] = 0x7CDA, +- [ 4795] = 0x7A2D, [ 4796] = 0x8066, [ 4797] = 0x8063, [ 4798] = 0x7D4D, +- [ 4799] = 0x7505, [ 4800] = 0x74F2, [ 4801] = 0x8994, [ 4802] = 0x821A, +- [ 4803] = 0x670C, [ 4804] = 0x8062, [ 4805] = 0x27486, [ 4806] = 0x805B, +- [ 4807] = 0x74F0, [ 4808] = 0x8103, [ 4809] = 0x7724, [ 4810] = 0x8989, +- [ 4811] = 0x267CC, [ 4812] = 0x7553, [ 4813] = 0x26ED1, [ 4814] = 0x87A9, +- [ 4815] = 0x87CE, [ 4816] = 0x81C8, [ 4817] = 0x878C, [ 4818] = 0x8A49, +- [ 4819] = 0x8CAD, [ 4820] = 0x8B43, [ 4821] = 0x772B, [ 4822] = 0x74F8, +- [ 4823] = 0x84DA, [ 4824] = 0x3635, [ 4825] = 0x69B2, [ 4826] = 0x8DA6, +- [ 4828] = 0x89A9, [ 4830] = 0x6DB9, [ 4831] = 0x87C1, [ 4832] = 0x24011, +- [ 4833] = 0x74E7, [ 4834] = 0x3DDB, [ 4835] = 0x7176, [ 4836] = 0x60A4, +- [ 4837] = 0x619C, [ 4838] = 0x3CD1, [ 4840] = 0x6077, [ 4842] = 0x7F71, +- [ 4843] = 0x28B2D, [ 4845] = 0x60E9, [ 4846] = 0x4B7E, [ 4847] = 0x5220, +- [ 4848] = 0x3C18, [ 4849] = 0x23CC7, [ 4850] = 0x25ED7, [ 4851] = 0x27656, +- [ 4852] = 0xEEA5, [ 4853] = 0x21944, [ 4854] = 0x212FE, [ 4855] = 0x29903, +- [ 4856] = 0x26DDC, [ 4857] = 0x270AD, [ 4858] = 0x5CC1, [ 4859] = 0x261AD, +- [ 4860] = 0x28A0F, [ 4861] = 0x23677, [ 4862] = 0x200EE, [ 4863] = 0xEEB0, +- [ 4864] = 0x24F0E, [ 4865] = 0x4562, [ 4866] = 0x5B1F, [ 4867] = 0xEEB4, +- [ 4868] = 0x9F50, [ 4869] = 0x9EA6, [ 4870] = 0xEEB7, [ 4875] = 0x3000, +- [ 4876] = 0xFF0C, [ 4877] = 0x3001, [ 4878] = 0x3002, [ 4879] = 0xFF0E, +- [ 4880] = 0x2022, [ 4881] = 0xFF1B, [ 4882] = 0xFF1A, [ 4883] = 0xFF1F, +- [ 4884] = 0xFF01, [ 4885] = 0xFE30, [ 4886] = 0x2026, [ 4887] = 0x2025, +- [ 4888] = 0xFE50, [ 4889] = 0xFF64, [ 4890] = 0xFE52, [ 4891] = 0x00B7, +- [ 4892] = 0xFE54, [ 4893] = 0xFE55, [ 4894] = 0xFE56, [ 4895] = 0xFE57, +- [ 4896] = 0xFF5C, [ 4897] = 0x2013, [ 4898] = 0xFE31, [ 4899] = 0x2014, +- [ 4900] = 0xFE33, [ 4902] = 0xFE34, [ 4903] = 0xFE4F, [ 4904] = 0xFF08, +- [ 4905] = 0xFF09, [ 4906] = 0xFE35, [ 4907] = 0xFE36, [ 4908] = 0xFF5B, +- [ 4909] = 0xFF5D, [ 4910] = 0xFE37, [ 4911] = 0xFE38, [ 4912] = 0x3014, +- [ 4913] = 0x3015, [ 4914] = 0xFE39, [ 4915] = 0xFE3A, [ 4916] = 0x3010, +- [ 4917] = 0x3011, [ 4918] = 0xFE3B, [ 4919] = 0xFE3C, [ 4920] = 0x300A, +- [ 4921] = 0x300B, [ 4922] = 0xFE3D, [ 4923] = 0xFE3E, [ 4924] = 0x3008, +- [ 4925] = 0x3009, [ 4926] = 0xFE3F, [ 4927] = 0xFE40, [ 4928] = 0x300C, +- [ 4929] = 0x300D, [ 4930] = 0xFE41, [ 4931] = 0xFE42, [ 4932] = 0x300E, +- [ 4933] = 0x300F, [ 4934] = 0xFE43, [ 4935] = 0xFE44, [ 4936] = 0xFE59, +- [ 4937] = 0xFE5A, [ 4972] = 0xFE5B, [ 4973] = 0xFE5C, [ 4974] = 0xFE5D, +- [ 4975] = 0xFE5E, [ 4976] = 0x2018, [ 4977] = 0x2019, [ 4978] = 0x201C, +- [ 4979] = 0x201D, [ 4980] = 0x301D, [ 4981] = 0x301E, [ 4982] = 0x2035, +- [ 4983] = 0x2032, [ 4984] = 0xFF03, [ 4985] = 0xFF06, [ 4986] = 0xFF0A, +- [ 4987] = 0x203B, [ 4988] = 0x00A7, [ 4989] = 0x3003, [ 4990] = 0x25CB, +- [ 4991] = 0x25CF, [ 4992] = 0x25B3, [ 4993] = 0x25B2, [ 4994] = 0x25CE, +- [ 4995] = 0x2606, [ 4996] = 0x2605, [ 4997] = 0x25C7, [ 4998] = 0x25C6, +- [ 4999] = 0x25A1, [ 5000] = 0x25A0, [ 5001] = 0x25BD, [ 5002] = 0x25BC, +- [ 5003] = 0x32A3, [ 5004] = 0x2105, [ 5005] = 0x203E, [ 5007] = 0xFF3F, +- [ 5009] = 0xFE49, [ 5010] = 0xFE4A, [ 5011] = 0xFE4D, [ 5012] = 0xFE4E, +- [ 5013] = 0xFE4B, [ 5014] = 0xFE4C, [ 5015] = 0xFE5F, [ 5016] = 0xFE60, +- [ 5017] = 0xFE61, [ 5018] = 0xFF0B, [ 5019] = 0xFF0D, [ 5020] = 0x00D7, +- [ 5021] = 0x00F7, [ 5022] = 0x00B1, [ 5023] = 0x221A, [ 5024] = 0xFF1C, +- [ 5025] = 0xFF1E, [ 5026] = 0xFF1D, [ 5027] = 0x2266, [ 5028] = 0x2267, +- [ 5029] = 0x2260, [ 5030] = 0x221E, [ 5031] = 0x2252, [ 5032] = 0x2261, +- [ 5033] = 0xFE62, [ 5034] = 0xFE63, [ 5035] = 0xFE64, [ 5036] = 0xFE65, +- [ 5037] = 0xFE66, [ 5038] = 0x223C, [ 5039] = 0x2229, [ 5040] = 0x222A, +- [ 5041] = 0x22A5, [ 5042] = 0x2220, [ 5043] = 0x221F, [ 5044] = 0x22BF, +- [ 5045] = 0x33D2, [ 5046] = 0x33D1, [ 5047] = 0x222B, [ 5048] = 0x222E, +- [ 5049] = 0x2235, [ 5050] = 0x2234, [ 5051] = 0x2640, [ 5052] = 0x2642, +- [ 5053] = 0x2641, [ 5054] = 0x2609, [ 5055] = 0x2191, [ 5056] = 0x2193, +- [ 5057] = 0x2190, [ 5058] = 0x2192, [ 5059] = 0x2196, [ 5060] = 0x2197, +- [ 5061] = 0x2199, [ 5062] = 0x2198, [ 5063] = 0x2225, [ 5064] = 0x2223, +- [ 5071] = 0xFF0F, [ 5072] = 0xFF3C, [ 5073] = 0xFF04, [ 5074] = 0x00A5, +- [ 5075] = 0x3012, [ 5076] = 0x00A2, [ 5077] = 0x00A3, [ 5078] = 0xFF05, +- [ 5079] = 0xFF20, [ 5080] = 0x2103, [ 5081] = 0x2109, [ 5082] = 0xFE69, +- [ 5083] = 0xFE6A, [ 5084] = 0xFE6B, [ 5085] = 0x33D5, [ 5086] = 0x339C, +- [ 5087] = 0x339D, [ 5088] = 0x339E, [ 5089] = 0x33CE, [ 5090] = 0x33A1, +- [ 5091] = 0x338E, [ 5092] = 0x338F, [ 5093] = 0x33C4, [ 5094] = 0x00B0, +- [ 5095] = 0x5159, [ 5096] = 0x515B, [ 5097] = 0x515E, [ 5098] = 0x515D, +- [ 5099] = 0x5161, [ 5100] = 0x5163, [ 5101] = 0x55E7, [ 5102] = 0x74E9, +- [ 5103] = 0x7CCE, [ 5104] = 0x2581, [ 5105] = 0x2582, [ 5106] = 0x2583, +- [ 5107] = 0x2584, [ 5108] = 0x2585, [ 5109] = 0x2586, [ 5110] = 0x2587, +- [ 5111] = 0x2588, [ 5112] = 0x258F, [ 5113] = 0x258E, [ 5114] = 0x258D, +- [ 5115] = 0x258C, [ 5116] = 0x258B, [ 5117] = 0x258A, [ 5118] = 0x2589, +- [ 5119] = 0x253C, [ 5120] = 0x2534, [ 5121] = 0x252C, [ 5122] = 0x2524, +- [ 5123] = 0x251C, [ 5124] = 0x2594, [ 5125] = 0x2500, [ 5126] = 0x2502, +- [ 5127] = 0x2595, [ 5128] = 0x250C, [ 5129] = 0x2510, [ 5130] = 0x2514, +- [ 5131] = 0x2518, [ 5132] = 0x256D, [ 5167] = 0x256E, [ 5168] = 0x2570, +- [ 5169] = 0x256F, [ 5170] = 0x2550, [ 5171] = 0x255E, [ 5172] = 0x256A, +- [ 5173] = 0x2561, [ 5174] = 0x25E2, [ 5175] = 0x25E3, [ 5176] = 0x25E5, +- [ 5177] = 0x25E4, [ 5178] = 0x2571, [ 5179] = 0x2572, [ 5180] = 0x2573, +- [ 5181] = 0xFF10, [ 5182] = 0xFF11, [ 5183] = 0xFF12, [ 5184] = 0xFF13, +- [ 5185] = 0xFF14, [ 5186] = 0xFF15, [ 5187] = 0xFF16, [ 5188] = 0xFF17, +- [ 5189] = 0xFF18, [ 5190] = 0xFF19, [ 5191] = 0x2160, [ 5192] = 0x2161, +- [ 5193] = 0x2162, [ 5194] = 0x2163, [ 5195] = 0x2164, [ 5196] = 0x2165, +- [ 5197] = 0x2166, [ 5198] = 0x2167, [ 5199] = 0x2168, [ 5200] = 0x2169, +- [ 5201] = 0x3021, [ 5202] = 0x3022, [ 5203] = 0x3023, [ 5204] = 0x3024, +- [ 5205] = 0x3025, [ 5206] = 0x3026, [ 5207] = 0x3027, [ 5208] = 0x3028, +- [ 5209] = 0x3029, [ 5211] = 0x5344, [ 5213] = 0xFF21, [ 5214] = 0xFF22, +- [ 5215] = 0xFF23, [ 5216] = 0xFF24, [ 5217] = 0xFF25, [ 5218] = 0xFF26, +- [ 5219] = 0xFF27, [ 5220] = 0xFF28, [ 5221] = 0xFF29, [ 5222] = 0xFF2A, +- [ 5223] = 0xFF2B, [ 5224] = 0xFF2C, [ 5225] = 0xFF2D, [ 5226] = 0xFF2E, +- [ 5227] = 0xFF2F, [ 5228] = 0xFF30, [ 5229] = 0xFF31, [ 5230] = 0xFF32, +- [ 5231] = 0xFF33, [ 5232] = 0xFF34, [ 5233] = 0xFF35, [ 5234] = 0xFF36, +- [ 5235] = 0xFF37, [ 5236] = 0xFF38, [ 5237] = 0xFF39, [ 5238] = 0xFF3A, +- [ 5239] = 0xFF41, [ 5240] = 0xFF42, [ 5241] = 0xFF43, [ 5242] = 0xFF44, +- [ 5243] = 0xFF45, [ 5244] = 0xFF46, [ 5245] = 0xFF47, [ 5246] = 0xFF48, +- [ 5247] = 0xFF49, [ 5248] = 0xFF4A, [ 5249] = 0xFF4B, [ 5250] = 0xFF4C, +- [ 5251] = 0xFF4D, [ 5252] = 0xFF4E, [ 5253] = 0xFF4F, [ 5254] = 0xFF50, +- [ 5255] = 0xFF51, [ 5256] = 0xFF52, [ 5257] = 0xFF53, [ 5258] = 0xFF54, +- [ 5259] = 0xFF55, [ 5260] = 0xFF56, [ 5265] = 0xFF57, [ 5266] = 0xFF58, +- [ 5267] = 0xFF59, [ 5268] = 0xFF5A, [ 5269] = 0x0391, [ 5270] = 0x0392, +- [ 5271] = 0x0393, [ 5272] = 0x0394, [ 5273] = 0x0395, [ 5274] = 0x0396, +- [ 5275] = 0x0397, [ 5276] = 0x0398, [ 5277] = 0x0399, [ 5278] = 0x039A, +- [ 5279] = 0x039B, [ 5280] = 0x039C, [ 5281] = 0x039D, [ 5282] = 0x039E, +- [ 5283] = 0x039F, [ 5284] = 0x03A0, [ 5285] = 0x03A1, [ 5286] = 0x03A3, +- [ 5287] = 0x03A4, [ 5288] = 0x03A5, [ 5289] = 0x03A6, [ 5290] = 0x03A7, +- [ 5291] = 0x03A8, [ 5292] = 0x03A9, [ 5293] = 0x03B1, [ 5294] = 0x03B2, +- [ 5295] = 0x03B3, [ 5296] = 0x03B4, [ 5297] = 0x03B5, [ 5298] = 0x03B6, +- [ 5299] = 0x03B7, [ 5300] = 0x03B8, [ 5301] = 0x03B9, [ 5302] = 0x03BA, +- [ 5303] = 0x03BB, [ 5304] = 0x03BC, [ 5305] = 0x03BD, [ 5306] = 0x03BE, +- [ 5307] = 0x03BF, [ 5308] = 0x03C0, [ 5309] = 0x03C1, [ 5310] = 0x03C3, +- [ 5311] = 0x03C4, [ 5312] = 0x03C5, [ 5313] = 0x03C6, [ 5314] = 0x03C7, +- [ 5315] = 0x03C8, [ 5316] = 0x03C9, [ 5317] = 0x3105, [ 5318] = 0x3106, +- [ 5319] = 0x3107, [ 5320] = 0x3108, [ 5321] = 0x3109, [ 5322] = 0x310A, +- [ 5323] = 0x310B, [ 5324] = 0x310C, [ 5325] = 0x310D, [ 5326] = 0x310E, +- [ 5327] = 0x310F, [ 5362] = 0x3110, [ 5363] = 0x3111, [ 5364] = 0x3112, +- [ 5365] = 0x3113, [ 5366] = 0x3114, [ 5367] = 0x3115, [ 5368] = 0x3116, +- [ 5369] = 0x3117, [ 5370] = 0x3118, [ 5371] = 0x3119, [ 5372] = 0x311A, +- [ 5373] = 0x311B, [ 5374] = 0x311C, [ 5375] = 0x311D, [ 5376] = 0x311E, +- [ 5377] = 0x311F, [ 5378] = 0x3120, [ 5379] = 0x3121, [ 5380] = 0x3122, +- [ 5381] = 0x3123, [ 5382] = 0x3124, [ 5383] = 0x3125, [ 5384] = 0x3126, +- [ 5385] = 0x3127, [ 5386] = 0x3128, [ 5387] = 0x3129, [ 5388] = 0x02D9, +- [ 5389] = 0x02C9, [ 5390] = 0x02CA, [ 5391] = 0x02C7, [ 5392] = 0x02CB, +- [ 5460] = 0x4E00, [ 5461] = 0x4E59, [ 5462] = 0x4E01, [ 5463] = 0x4E03, +- [ 5464] = 0x4E43, [ 5465] = 0x4E5D, [ 5466] = 0x4E86, [ 5467] = 0x4E8C, +- [ 5468] = 0x4EBA, [ 5469] = 0x513F, [ 5470] = 0x5165, [ 5471] = 0x516B, +- [ 5472] = 0x51E0, [ 5473] = 0x5200, [ 5474] = 0x5201, [ 5475] = 0x529B, +- [ 5476] = 0x5315, [ 5477] = 0x5341, [ 5478] = 0x535C, [ 5479] = 0x53C8, +- [ 5480] = 0x4E09, [ 5481] = 0x4E0B, [ 5482] = 0x4E08, [ 5483] = 0x4E0A, +- [ 5484] = 0x4E2B, [ 5485] = 0x4E38, [ 5486] = 0x51E1, [ 5487] = 0x4E45, +- [ 5488] = 0x4E48, [ 5489] = 0x4E5F, [ 5490] = 0x4E5E, [ 5491] = 0x4E8E, +- [ 5492] = 0x4EA1, [ 5493] = 0x5140, [ 5494] = 0x5203, [ 5495] = 0x52FA, +- [ 5496] = 0x5343, [ 5497] = 0x53C9, [ 5498] = 0x53E3, [ 5499] = 0x571F, +- [ 5500] = 0x58EB, [ 5501] = 0x5915, [ 5502] = 0x5927, [ 5503] = 0x5973, +- [ 5504] = 0x5B50, [ 5505] = 0x5B51, [ 5506] = 0x5B53, [ 5507] = 0x5BF8, +- [ 5508] = 0x5C0F, [ 5509] = 0x5C22, [ 5510] = 0x5C38, [ 5511] = 0x5C71, +- [ 5512] = 0x5DDD, [ 5513] = 0x5DE5, [ 5514] = 0x5DF1, [ 5515] = 0x5DF2, +- [ 5516] = 0x5DF3, [ 5517] = 0x5DFE, [ 5518] = 0x5E72, [ 5519] = 0x5EFE, +- [ 5520] = 0x5F0B, [ 5521] = 0x5F13, [ 5522] = 0x624D, [ 5557] = 0x4E11, +- [ 5558] = 0x4E10, [ 5559] = 0x4E0D, [ 5560] = 0x4E2D, [ 5561] = 0x4E30, +- [ 5562] = 0x4E39, [ 5563] = 0x4E4B, [ 5564] = 0x5C39, [ 5565] = 0x4E88, +- [ 5566] = 0x4E91, [ 5567] = 0x4E95, [ 5568] = 0x4E92, [ 5569] = 0x4E94, +- [ 5570] = 0x4EA2, [ 5571] = 0x4EC1, [ 5572] = 0x4EC0, [ 5573] = 0x4EC3, +- [ 5574] = 0x4EC6, [ 5575] = 0x4EC7, [ 5576] = 0x4ECD, [ 5577] = 0x4ECA, +- [ 5578] = 0x4ECB, [ 5579] = 0x4EC4, [ 5580] = 0x5143, [ 5581] = 0x5141, +- [ 5582] = 0x5167, [ 5583] = 0x516D, [ 5584] = 0x516E, [ 5585] = 0x516C, +- [ 5586] = 0x5197, [ 5587] = 0x51F6, [ 5588] = 0x5206, [ 5589] = 0x5207, +- [ 5590] = 0x5208, [ 5591] = 0x52FB, [ 5592] = 0x52FE, [ 5593] = 0x52FF, +- [ 5594] = 0x5316, [ 5595] = 0x5339, [ 5596] = 0x5348, [ 5597] = 0x5347, +- [ 5598] = 0x5345, [ 5599] = 0x535E, [ 5600] = 0x5384, [ 5601] = 0x53CB, +- [ 5602] = 0x53CA, [ 5603] = 0x53CD, [ 5604] = 0x58EC, [ 5605] = 0x5929, +- [ 5606] = 0x592B, [ 5607] = 0x592A, [ 5608] = 0x592D, [ 5609] = 0x5B54, +- [ 5610] = 0x5C11, [ 5611] = 0x5C24, [ 5612] = 0x5C3A, [ 5613] = 0x5C6F, +- [ 5614] = 0x5DF4, [ 5615] = 0x5E7B, [ 5616] = 0x5EFF, [ 5617] = 0x5F14, +- [ 5618] = 0x5F15, [ 5619] = 0x5FC3, [ 5620] = 0x6208, [ 5621] = 0x6236, +- [ 5622] = 0x624B, [ 5623] = 0x624E, [ 5624] = 0x652F, [ 5625] = 0x6587, +- [ 5626] = 0x6597, [ 5627] = 0x65A4, [ 5628] = 0x65B9, [ 5629] = 0x65E5, +- [ 5630] = 0x66F0, [ 5631] = 0x6708, [ 5632] = 0x6728, [ 5633] = 0x6B20, +- [ 5634] = 0x6B62, [ 5635] = 0x6B79, [ 5636] = 0x6BCB, [ 5637] = 0x6BD4, +- [ 5638] = 0x6BDB, [ 5639] = 0x6C0F, [ 5640] = 0x6C34, [ 5641] = 0x706B, +- [ 5642] = 0x722A, [ 5643] = 0x7236, [ 5644] = 0x723B, [ 5645] = 0x7247, +- [ 5646] = 0x7259, [ 5647] = 0x725B, [ 5648] = 0x72AC, [ 5649] = 0x738B, +- [ 5650] = 0x4E19, [ 5655] = 0x4E16, [ 5656] = 0x4E15, [ 5657] = 0x4E14, +- [ 5658] = 0x4E18, [ 5659] = 0x4E3B, [ 5660] = 0x4E4D, [ 5661] = 0x4E4F, +- [ 5662] = 0x4E4E, [ 5663] = 0x4EE5, [ 5664] = 0x4ED8, [ 5665] = 0x4ED4, +- [ 5666] = 0x4ED5, [ 5667] = 0x4ED6, [ 5668] = 0x4ED7, [ 5669] = 0x4EE3, +- [ 5670] = 0x4EE4, [ 5671] = 0x4ED9, [ 5672] = 0x4EDE, [ 5673] = 0x5145, +- [ 5674] = 0x5144, [ 5675] = 0x5189, [ 5676] = 0x518A, [ 5677] = 0x51AC, +- [ 5678] = 0x51F9, [ 5679] = 0x51FA, [ 5680] = 0x51F8, [ 5681] = 0x520A, +- [ 5682] = 0x52A0, [ 5683] = 0x529F, [ 5684] = 0x5305, [ 5685] = 0x5306, +- [ 5686] = 0x5317, [ 5687] = 0x531D, [ 5688] = 0x4EDF, [ 5689] = 0x534A, +- [ 5690] = 0x5349, [ 5691] = 0x5361, [ 5692] = 0x5360, [ 5693] = 0x536F, +- [ 5694] = 0x536E, [ 5695] = 0x53BB, [ 5696] = 0x53EF, [ 5697] = 0x53E4, +- [ 5698] = 0x53F3, [ 5699] = 0x53EC, [ 5700] = 0x53EE, [ 5701] = 0x53E9, +- [ 5702] = 0x53E8, [ 5703] = 0x53FC, [ 5704] = 0x53F8, [ 5705] = 0x53F5, +- [ 5706] = 0x53EB, [ 5707] = 0x53E6, [ 5708] = 0x53EA, [ 5709] = 0x53F2, +- [ 5710] = 0x53F1, [ 5711] = 0x53F0, [ 5712] = 0x53E5, [ 5713] = 0x53ED, +- [ 5714] = 0x53FB, [ 5715] = 0x56DB, [ 5716] = 0x56DA, [ 5717] = 0x5916, +- [ 5752] = 0x592E, [ 5753] = 0x5931, [ 5754] = 0x5974, [ 5755] = 0x5976, +- [ 5756] = 0x5B55, [ 5757] = 0x5B83, [ 5758] = 0x5C3C, [ 5759] = 0x5DE8, +- [ 5760] = 0x5DE7, [ 5761] = 0x5DE6, [ 5762] = 0x5E02, [ 5763] = 0x5E03, +- [ 5764] = 0x5E73, [ 5765] = 0x5E7C, [ 5766] = 0x5F01, [ 5767] = 0x5F18, +- [ 5768] = 0x5F17, [ 5769] = 0x5FC5, [ 5770] = 0x620A, [ 5771] = 0x6253, +- [ 5772] = 0x6254, [ 5773] = 0x6252, [ 5774] = 0x6251, [ 5775] = 0x65A5, +- [ 5776] = 0x65E6, [ 5777] = 0x672E, [ 5778] = 0x672C, [ 5779] = 0x672A, +- [ 5780] = 0x672B, [ 5781] = 0x672D, [ 5782] = 0x6B63, [ 5783] = 0x6BCD, +- [ 5784] = 0x6C11, [ 5785] = 0x6C10, [ 5786] = 0x6C38, [ 5787] = 0x6C41, +- [ 5788] = 0x6C40, [ 5789] = 0x6C3E, [ 5790] = 0x72AF, [ 5791] = 0x7384, +- [ 5792] = 0x7389, [ 5793] = 0x74DC, [ 5794] = 0x74E6, [ 5795] = 0x7518, +- [ 5796] = 0x751F, [ 5797] = 0x7528, [ 5798] = 0x7529, [ 5799] = 0x7530, +- [ 5800] = 0x7531, [ 5801] = 0x7532, [ 5802] = 0x7533, [ 5803] = 0x758B, +- [ 5804] = 0x767D, [ 5805] = 0x76AE, [ 5806] = 0x76BF, [ 5807] = 0x76EE, +- [ 5808] = 0x77DB, [ 5809] = 0x77E2, [ 5810] = 0x77F3, [ 5811] = 0x793A, +- [ 5812] = 0x79BE, [ 5813] = 0x7A74, [ 5814] = 0x7ACB, [ 5815] = 0x4E1E, +- [ 5816] = 0x4E1F, [ 5817] = 0x4E52, [ 5818] = 0x4E53, [ 5819] = 0x4E69, +- [ 5820] = 0x4E99, [ 5821] = 0x4EA4, [ 5822] = 0x4EA6, [ 5823] = 0x4EA5, +- [ 5824] = 0x4EFF, [ 5825] = 0x4F09, [ 5826] = 0x4F19, [ 5827] = 0x4F0A, +- [ 5828] = 0x4F15, [ 5829] = 0x4F0D, [ 5830] = 0x4F10, [ 5831] = 0x4F11, +- [ 5832] = 0x4F0F, [ 5833] = 0x4EF2, [ 5834] = 0x4EF6, [ 5835] = 0x4EFB, +- [ 5836] = 0x4EF0, [ 5837] = 0x4EF3, [ 5838] = 0x4EFD, [ 5839] = 0x4F01, +- [ 5840] = 0x4F0B, [ 5841] = 0x5149, [ 5842] = 0x5147, [ 5843] = 0x5146, +- [ 5844] = 0x5148, [ 5845] = 0x5168, [ 5850] = 0x5171, [ 5851] = 0x518D, +- [ 5852] = 0x51B0, [ 5853] = 0x5217, [ 5854] = 0x5211, [ 5855] = 0x5212, +- [ 5856] = 0x520E, [ 5857] = 0x5216, [ 5858] = 0x52A3, [ 5859] = 0x5308, +- [ 5860] = 0x5321, [ 5861] = 0x5320, [ 5862] = 0x5370, [ 5863] = 0x5371, +- [ 5864] = 0x5409, [ 5865] = 0x540F, [ 5866] = 0x540C, [ 5867] = 0x540A, +- [ 5868] = 0x5410, [ 5869] = 0x5401, [ 5870] = 0x540B, [ 5871] = 0x5404, +- [ 5872] = 0x5411, [ 5873] = 0x540D, [ 5874] = 0x5408, [ 5875] = 0x5403, +- [ 5876] = 0x540E, [ 5877] = 0x5406, [ 5878] = 0x5412, [ 5879] = 0x56E0, +- [ 5880] = 0x56DE, [ 5881] = 0x56DD, [ 5882] = 0x5733, [ 5883] = 0x5730, +- [ 5884] = 0x5728, [ 5885] = 0x572D, [ 5886] = 0x572C, [ 5887] = 0x572F, +- [ 5888] = 0x5729, [ 5889] = 0x5919, [ 5890] = 0x591A, [ 5891] = 0x5937, +- [ 5892] = 0x5938, [ 5893] = 0x5984, [ 5894] = 0x5978, [ 5895] = 0x5983, +- [ 5896] = 0x597D, [ 5897] = 0x5979, [ 5898] = 0x5982, [ 5899] = 0x5981, +- [ 5900] = 0x5B57, [ 5901] = 0x5B58, [ 5902] = 0x5B87, [ 5903] = 0x5B88, +- [ 5904] = 0x5B85, [ 5905] = 0x5B89, [ 5906] = 0x5BFA, [ 5907] = 0x5C16, +- [ 5908] = 0x5C79, [ 5909] = 0x5DDE, [ 5910] = 0x5E06, [ 5911] = 0x5E76, +- [ 5912] = 0x5E74, [ 5947] = 0x5F0F, [ 5948] = 0x5F1B, [ 5949] = 0x5FD9, +- [ 5950] = 0x5FD6, [ 5951] = 0x620E, [ 5952] = 0x620C, [ 5953] = 0x620D, +- [ 5954] = 0x6210, [ 5955] = 0x6263, [ 5956] = 0x625B, [ 5957] = 0x6258, +- [ 5958] = 0x6536, [ 5959] = 0x65E9, [ 5960] = 0x65E8, [ 5961] = 0x65EC, +- [ 5962] = 0x65ED, [ 5963] = 0x66F2, [ 5964] = 0x66F3, [ 5965] = 0x6709, +- [ 5966] = 0x673D, [ 5967] = 0x6734, [ 5968] = 0x6731, [ 5969] = 0x6735, +- [ 5970] = 0x6B21, [ 5971] = 0x6B64, [ 5972] = 0x6B7B, [ 5973] = 0x6C16, +- [ 5974] = 0x6C5D, [ 5975] = 0x6C57, [ 5976] = 0x6C59, [ 5977] = 0x6C5F, +- [ 5978] = 0x6C60, [ 5979] = 0x6C50, [ 5980] = 0x6C55, [ 5981] = 0x6C61, +- [ 5982] = 0x6C5B, [ 5983] = 0x6C4D, [ 5984] = 0x6C4E, [ 5985] = 0x7070, +- [ 5986] = 0x725F, [ 5987] = 0x725D, [ 5988] = 0x767E, [ 5989] = 0x7AF9, +- [ 5990] = 0x7C73, [ 5991] = 0x7CF8, [ 5992] = 0x7F36, [ 5993] = 0x7F8A, +- [ 5994] = 0x7FBD, [ 5995] = 0x8001, [ 5996] = 0x8003, [ 5997] = 0x800C, +- [ 5998] = 0x8012, [ 5999] = 0x8033, [ 6000] = 0x807F, [ 6001] = 0x8089, +- [ 6002] = 0x808B, [ 6003] = 0x808C, [ 6004] = 0x81E3, [ 6005] = 0x81EA, +- [ 6006] = 0x81F3, [ 6007] = 0x81FC, [ 6008] = 0x820C, [ 6009] = 0x821B, +- [ 6010] = 0x821F, [ 6011] = 0x826E, [ 6012] = 0x8272, [ 6013] = 0x827E, +- [ 6014] = 0x866B, [ 6015] = 0x8840, [ 6016] = 0x884C, [ 6017] = 0x8863, +- [ 6018] = 0x897F, [ 6019] = 0x9621, [ 6020] = 0x4E32, [ 6021] = 0x4EA8, +- [ 6022] = 0x4F4D, [ 6023] = 0x4F4F, [ 6024] = 0x4F47, [ 6025] = 0x4F57, +- [ 6026] = 0x4F5E, [ 6027] = 0x4F34, [ 6028] = 0x4F5B, [ 6029] = 0x4F55, +- [ 6030] = 0x4F30, [ 6031] = 0x4F50, [ 6032] = 0x4F51, [ 6033] = 0x4F3D, +- [ 6034] = 0x4F3A, [ 6035] = 0x4F38, [ 6036] = 0x4F43, [ 6037] = 0x4F54, +- [ 6038] = 0x4F3C, [ 6039] = 0x4F46, [ 6040] = 0x4F63, [ 6045] = 0x4F5C, +- [ 6046] = 0x4F60, [ 6047] = 0x4F2F, [ 6048] = 0x4F4E, [ 6049] = 0x4F36, +- [ 6050] = 0x4F59, [ 6051] = 0x4F5D, [ 6052] = 0x4F48, [ 6053] = 0x4F5A, +- [ 6054] = 0x514C, [ 6055] = 0x514B, [ 6056] = 0x514D, [ 6057] = 0x5175, +- [ 6058] = 0x51B6, [ 6059] = 0x51B7, [ 6060] = 0x5225, [ 6061] = 0x5224, +- [ 6062] = 0x5229, [ 6063] = 0x522A, [ 6064] = 0x5228, [ 6065] = 0x52AB, +- [ 6066] = 0x52A9, [ 6067] = 0x52AA, [ 6068] = 0x52AC, [ 6069] = 0x5323, +- [ 6070] = 0x5373, [ 6071] = 0x5375, [ 6072] = 0x541D, [ 6073] = 0x542D, +- [ 6074] = 0x541E, [ 6075] = 0x543E, [ 6076] = 0x5426, [ 6077] = 0x544E, +- [ 6078] = 0x5427, [ 6079] = 0x5446, [ 6080] = 0x5443, [ 6081] = 0x5433, +- [ 6082] = 0x5448, [ 6083] = 0x5442, [ 6084] = 0x541B, [ 6085] = 0x5429, +- [ 6086] = 0x544A, [ 6087] = 0x5439, [ 6088] = 0x543B, [ 6089] = 0x5438, +- [ 6090] = 0x542E, [ 6091] = 0x5435, [ 6092] = 0x5436, [ 6093] = 0x5420, +- [ 6094] = 0x543C, [ 6095] = 0x5440, [ 6096] = 0x5431, [ 6097] = 0x542B, +- [ 6098] = 0x541F, [ 6099] = 0x542C, [ 6100] = 0x56EA, [ 6101] = 0x56F0, +- [ 6102] = 0x56E4, [ 6103] = 0x56EB, [ 6104] = 0x574A, [ 6105] = 0x5751, +- [ 6106] = 0x5740, [ 6107] = 0x574D, [ 6142] = 0x5747, [ 6143] = 0x574E, +- [ 6144] = 0x573E, [ 6145] = 0x5750, [ 6146] = 0x574F, [ 6147] = 0x573B, +- [ 6148] = 0x58EF, [ 6149] = 0x593E, [ 6150] = 0x599D, [ 6151] = 0x5992, +- [ 6152] = 0x59A8, [ 6153] = 0x599E, [ 6154] = 0x59A3, [ 6155] = 0x5999, +- [ 6156] = 0x5996, [ 6157] = 0x598D, [ 6158] = 0x59A4, [ 6159] = 0x5993, +- [ 6160] = 0x598A, [ 6161] = 0x59A5, [ 6162] = 0x5B5D, [ 6163] = 0x5B5C, +- [ 6164] = 0x5B5A, [ 6165] = 0x5B5B, [ 6166] = 0x5B8C, [ 6167] = 0x5B8B, +- [ 6168] = 0x5B8F, [ 6169] = 0x5C2C, [ 6170] = 0x5C40, [ 6171] = 0x5C41, +- [ 6172] = 0x5C3F, [ 6173] = 0x5C3E, [ 6174] = 0x5C90, [ 6175] = 0x5C91, +- [ 6176] = 0x5C94, [ 6177] = 0x5C8C, [ 6178] = 0x5DEB, [ 6179] = 0x5E0C, +- [ 6180] = 0x5E8F, [ 6181] = 0x5E87, [ 6182] = 0x5E8A, [ 6183] = 0x5EF7, +- [ 6184] = 0x5F04, [ 6185] = 0x5F1F, [ 6186] = 0x5F64, [ 6187] = 0x5F62, +- [ 6188] = 0x5F77, [ 6189] = 0x5F79, [ 6190] = 0x5FD8, [ 6191] = 0x5FCC, +- [ 6192] = 0x5FD7, [ 6193] = 0x5FCD, [ 6194] = 0x5FF1, [ 6195] = 0x5FEB, +- [ 6196] = 0x5FF8, [ 6197] = 0x5FEA, [ 6198] = 0x6212, [ 6199] = 0x6211, +- [ 6200] = 0x6284, [ 6201] = 0x6297, [ 6202] = 0x6296, [ 6203] = 0x6280, +- [ 6204] = 0x6276, [ 6205] = 0x6289, [ 6206] = 0x626D, [ 6207] = 0x628A, +- [ 6208] = 0x627C, [ 6209] = 0x627E, [ 6210] = 0x6279, [ 6211] = 0x6273, +- [ 6212] = 0x6292, [ 6213] = 0x626F, [ 6214] = 0x6298, [ 6215] = 0x626E, +- [ 6216] = 0x6295, [ 6217] = 0x6293, [ 6218] = 0x6291, [ 6219] = 0x6286, +- [ 6220] = 0x6539, [ 6221] = 0x653B, [ 6222] = 0x6538, [ 6223] = 0x65F1, +- [ 6224] = 0x66F4, [ 6225] = 0x675F, [ 6226] = 0x674E, [ 6227] = 0x674F, +- [ 6228] = 0x6750, [ 6229] = 0x6751, [ 6230] = 0x675C, [ 6231] = 0x6756, +- [ 6232] = 0x675E, [ 6233] = 0x6749, [ 6234] = 0x6746, [ 6235] = 0x6760, +- [ 6240] = 0x6753, [ 6241] = 0x6757, [ 6242] = 0x6B65, [ 6243] = 0x6BCF, +- [ 6244] = 0x6C42, [ 6245] = 0x6C5E, [ 6246] = 0x6C99, [ 6247] = 0x6C81, +- [ 6248] = 0x6C88, [ 6249] = 0x6C89, [ 6250] = 0x6C85, [ 6251] = 0x6C9B, +- [ 6252] = 0x6C6A, [ 6253] = 0x6C7A, [ 6254] = 0x6C90, [ 6255] = 0x6C70, +- [ 6256] = 0x6C8C, [ 6257] = 0x6C68, [ 6258] = 0x6C96, [ 6259] = 0x6C92, +- [ 6260] = 0x6C7D, [ 6261] = 0x6C83, [ 6262] = 0x6C72, [ 6263] = 0x6C7E, +- [ 6264] = 0x6C74, [ 6265] = 0x6C86, [ 6266] = 0x6C76, [ 6267] = 0x6C8D, +- [ 6268] = 0x6C94, [ 6269] = 0x6C98, [ 6270] = 0x6C82, [ 6271] = 0x7076, +- [ 6272] = 0x707C, [ 6273] = 0x707D, [ 6274] = 0x7078, [ 6275] = 0x7262, +- [ 6276] = 0x7261, [ 6277] = 0x7260, [ 6278] = 0x72C4, [ 6279] = 0x72C2, +- [ 6280] = 0x7396, [ 6281] = 0x752C, [ 6282] = 0x752B, [ 6283] = 0x7537, +- [ 6284] = 0x7538, [ 6285] = 0x7682, [ 6286] = 0x76EF, [ 6287] = 0x77E3, +- [ 6288] = 0x79C1, [ 6289] = 0x79C0, [ 6290] = 0x79BF, [ 6291] = 0x7A76, +- [ 6292] = 0x7CFB, [ 6293] = 0x7F55, [ 6294] = 0x8096, [ 6295] = 0x8093, +- [ 6296] = 0x809D, [ 6297] = 0x8098, [ 6298] = 0x809B, [ 6299] = 0x809A, +- [ 6300] = 0x80B2, [ 6301] = 0x826F, [ 6302] = 0x8292, [ 6337] = 0x828B, +- [ 6338] = 0x828D, [ 6339] = 0x898B, [ 6340] = 0x89D2, [ 6341] = 0x8A00, +- [ 6342] = 0x8C37, [ 6343] = 0x8C46, [ 6344] = 0x8C55, [ 6345] = 0x8C9D, +- [ 6346] = 0x8D64, [ 6347] = 0x8D70, [ 6348] = 0x8DB3, [ 6349] = 0x8EAB, +- [ 6350] = 0x8ECA, [ 6351] = 0x8F9B, [ 6352] = 0x8FB0, [ 6353] = 0x8FC2, +- [ 6354] = 0x8FC6, [ 6355] = 0x8FC5, [ 6356] = 0x8FC4, [ 6357] = 0x5DE1, +- [ 6358] = 0x9091, [ 6359] = 0x90A2, [ 6360] = 0x90AA, [ 6361] = 0x90A6, +- [ 6362] = 0x90A3, [ 6363] = 0x9149, [ 6364] = 0x91C6, [ 6365] = 0x91CC, +- [ 6366] = 0x9632, [ 6367] = 0x962E, [ 6368] = 0x9631, [ 6369] = 0x962A, +- [ 6370] = 0x962C, [ 6371] = 0x4E26, [ 6372] = 0x4E56, [ 6373] = 0x4E73, +- [ 6374] = 0x4E8B, [ 6375] = 0x4E9B, [ 6376] = 0x4E9E, [ 6377] = 0x4EAB, +- [ 6378] = 0x4EAC, [ 6379] = 0x4F6F, [ 6380] = 0x4F9D, [ 6381] = 0x4F8D, +- [ 6382] = 0x4F73, [ 6383] = 0x4F7F, [ 6384] = 0x4F6C, [ 6385] = 0x4F9B, +- [ 6386] = 0x4F8B, [ 6387] = 0x4F86, [ 6388] = 0x4F83, [ 6389] = 0x4F70, +- [ 6390] = 0x4F75, [ 6391] = 0x4F88, [ 6392] = 0x4F69, [ 6393] = 0x4F7B, +- [ 6394] = 0x4F96, [ 6395] = 0x4F7E, [ 6396] = 0x4F8F, [ 6397] = 0x4F91, +- [ 6398] = 0x4F7A, [ 6399] = 0x5154, [ 6400] = 0x5152, [ 6401] = 0x5155, +- [ 6402] = 0x5169, [ 6403] = 0x5177, [ 6404] = 0x5176, [ 6405] = 0x5178, +- [ 6406] = 0x51BD, [ 6407] = 0x51FD, [ 6408] = 0x523B, [ 6409] = 0x5238, +- [ 6410] = 0x5237, [ 6411] = 0x523A, [ 6412] = 0x5230, [ 6413] = 0x522E, +- [ 6414] = 0x5236, [ 6415] = 0x5241, [ 6416] = 0x52BE, [ 6417] = 0x52BB, +- [ 6418] = 0x5352, [ 6419] = 0x5354, [ 6420] = 0x5353, [ 6421] = 0x5351, +- [ 6422] = 0x5366, [ 6423] = 0x5377, [ 6424] = 0x5378, [ 6425] = 0x5379, +- [ 6426] = 0x53D6, [ 6427] = 0x53D4, [ 6428] = 0x53D7, [ 6429] = 0x5473, +- [ 6430] = 0x5475, [ 6435] = 0x5496, [ 6436] = 0x5478, [ 6437] = 0x5495, +- [ 6438] = 0x5480, [ 6439] = 0x547B, [ 6440] = 0x5477, [ 6441] = 0x5484, +- [ 6442] = 0x5492, [ 6443] = 0x5486, [ 6444] = 0x547C, [ 6445] = 0x5490, +- [ 6446] = 0x5471, [ 6447] = 0x5476, [ 6448] = 0x548C, [ 6449] = 0x549A, +- [ 6450] = 0x5462, [ 6451] = 0x5468, [ 6452] = 0x548B, [ 6453] = 0x547D, +- [ 6454] = 0x548E, [ 6455] = 0x56FA, [ 6456] = 0x5783, [ 6457] = 0x5777, +- [ 6458] = 0x576A, [ 6459] = 0x5769, [ 6460] = 0x5761, [ 6461] = 0x5766, +- [ 6462] = 0x5764, [ 6463] = 0x577C, [ 6464] = 0x591C, [ 6465] = 0x5949, +- [ 6466] = 0x5947, [ 6467] = 0x5948, [ 6468] = 0x5944, [ 6469] = 0x5954, +- [ 6470] = 0x59BE, [ 6471] = 0x59BB, [ 6472] = 0x59D4, [ 6473] = 0x59B9, +- [ 6474] = 0x59AE, [ 6475] = 0x59D1, [ 6476] = 0x59C6, [ 6477] = 0x59D0, +- [ 6478] = 0x59CD, [ 6479] = 0x59CB, [ 6480] = 0x59D3, [ 6481] = 0x59CA, +- [ 6482] = 0x59AF, [ 6483] = 0x59B3, [ 6484] = 0x59D2, [ 6485] = 0x59C5, +- [ 6486] = 0x5B5F, [ 6487] = 0x5B64, [ 6488] = 0x5B63, [ 6489] = 0x5B97, +- [ 6490] = 0x5B9A, [ 6491] = 0x5B98, [ 6492] = 0x5B9C, [ 6493] = 0x5B99, +- [ 6494] = 0x5B9B, [ 6495] = 0x5C1A, [ 6496] = 0x5C48, [ 6497] = 0x5C45, +- [ 6532] = 0x5C46, [ 6533] = 0x5CB7, [ 6534] = 0x5CA1, [ 6535] = 0x5CB8, +- [ 6536] = 0x5CA9, [ 6537] = 0x5CAB, [ 6538] = 0x5CB1, [ 6539] = 0x5CB3, +- [ 6540] = 0x5E18, [ 6541] = 0x5E1A, [ 6542] = 0x5E16, [ 6543] = 0x5E15, +- [ 6544] = 0x5E1B, [ 6545] = 0x5E11, [ 6546] = 0x5E78, [ 6547] = 0x5E9A, +- [ 6548] = 0x5E97, [ 6549] = 0x5E9C, [ 6550] = 0x5E95, [ 6551] = 0x5E96, +- [ 6552] = 0x5EF6, [ 6553] = 0x5F26, [ 6554] = 0x5F27, [ 6555] = 0x5F29, +- [ 6556] = 0x5F80, [ 6557] = 0x5F81, [ 6558] = 0x5F7F, [ 6559] = 0x5F7C, +- [ 6560] = 0x5FDD, [ 6561] = 0x5FE0, [ 6562] = 0x5FFD, [ 6563] = 0x5FF5, +- [ 6564] = 0x5FFF, [ 6565] = 0x600F, [ 6566] = 0x6014, [ 6567] = 0x602F, +- [ 6568] = 0x6035, [ 6569] = 0x6016, [ 6570] = 0x602A, [ 6571] = 0x6015, +- [ 6572] = 0x6021, [ 6573] = 0x6027, [ 6574] = 0x6029, [ 6575] = 0x602B, +- [ 6576] = 0x601B, [ 6577] = 0x6216, [ 6578] = 0x6215, [ 6579] = 0x623F, +- [ 6580] = 0x623E, [ 6581] = 0x6240, [ 6582] = 0x627F, [ 6583] = 0x62C9, +- [ 6584] = 0x62CC, [ 6585] = 0x62C4, [ 6586] = 0x62BF, [ 6587] = 0x62C2, +- [ 6588] = 0x62B9, [ 6589] = 0x62D2, [ 6590] = 0x62DB, [ 6591] = 0x62AB, +- [ 6592] = 0x62D3, [ 6593] = 0x62D4, [ 6594] = 0x62CB, [ 6595] = 0x62C8, +- [ 6596] = 0x62A8, [ 6597] = 0x62BD, [ 6598] = 0x62BC, [ 6599] = 0x62D0, +- [ 6600] = 0x62D9, [ 6601] = 0x62C7, [ 6602] = 0x62CD, [ 6603] = 0x62B5, +- [ 6604] = 0x62DA, [ 6605] = 0x62B1, [ 6606] = 0x62D8, [ 6607] = 0x62D6, +- [ 6608] = 0x62D7, [ 6609] = 0x62C6, [ 6610] = 0x62AC, [ 6611] = 0x62CE, +- [ 6612] = 0x653E, [ 6613] = 0x65A7, [ 6614] = 0x65BC, [ 6615] = 0x65FA, +- [ 6616] = 0x6614, [ 6617] = 0x6613, [ 6618] = 0x660C, [ 6619] = 0x6606, +- [ 6620] = 0x6602, [ 6621] = 0x660E, [ 6622] = 0x6600, [ 6623] = 0x660F, +- [ 6624] = 0x6615, [ 6625] = 0x660A, [ 6630] = 0x6607, [ 6631] = 0x670D, +- [ 6632] = 0x670B, [ 6633] = 0x676D, [ 6634] = 0x678B, [ 6635] = 0x6795, +- [ 6636] = 0x6771, [ 6637] = 0x679C, [ 6638] = 0x6773, [ 6639] = 0x6777, +- [ 6640] = 0x6787, [ 6641] = 0x679D, [ 6642] = 0x6797, [ 6643] = 0x676F, +- [ 6644] = 0x6770, [ 6645] = 0x677F, [ 6646] = 0x6789, [ 6647] = 0x677E, +- [ 6648] = 0x6790, [ 6649] = 0x6775, [ 6650] = 0x679A, [ 6651] = 0x6793, +- [ 6652] = 0x677C, [ 6653] = 0x676A, [ 6654] = 0x6772, [ 6655] = 0x6B23, +- [ 6656] = 0x6B66, [ 6657] = 0x6B67, [ 6658] = 0x6B7F, [ 6659] = 0x6C13, +- [ 6660] = 0x6C1B, [ 6661] = 0x6CE3, [ 6662] = 0x6CE8, [ 6663] = 0x6CF3, +- [ 6664] = 0x6CB1, [ 6665] = 0x6CCC, [ 6666] = 0x6CE5, [ 6667] = 0x6CB3, +- [ 6668] = 0x6CBD, [ 6669] = 0x6CBE, [ 6670] = 0x6CBC, [ 6671] = 0x6CE2, +- [ 6672] = 0x6CAB, [ 6673] = 0x6CD5, [ 6674] = 0x6CD3, [ 6675] = 0x6CB8, +- [ 6676] = 0x6CC4, [ 6677] = 0x6CB9, [ 6678] = 0x6CC1, [ 6679] = 0x6CAE, +- [ 6680] = 0x6CD7, [ 6681] = 0x6CC5, [ 6682] = 0x6CF1, [ 6683] = 0x6CBF, +- [ 6684] = 0x6CBB, [ 6685] = 0x6CE1, [ 6686] = 0x6CDB, [ 6687] = 0x6CCA, +- [ 6688] = 0x6CAC, [ 6689] = 0x6CEF, [ 6690] = 0x6CDC, [ 6691] = 0x6CD6, +- [ 6692] = 0x6CE0, [ 6727] = 0x7095, [ 6728] = 0x708E, [ 6729] = 0x7092, +- [ 6730] = 0x708A, [ 6731] = 0x7099, [ 6732] = 0x722C, [ 6733] = 0x722D, +- [ 6734] = 0x7238, [ 6735] = 0x7248, [ 6736] = 0x7267, [ 6737] = 0x7269, +- [ 6738] = 0x72C0, [ 6739] = 0x72CE, [ 6740] = 0x72D9, [ 6741] = 0x72D7, +- [ 6742] = 0x72D0, [ 6743] = 0x73A9, [ 6744] = 0x73A8, [ 6745] = 0x739F, +- [ 6746] = 0x73AB, [ 6747] = 0x73A5, [ 6748] = 0x753D, [ 6749] = 0x759D, +- [ 6750] = 0x7599, [ 6751] = 0x759A, [ 6752] = 0x7684, [ 6753] = 0x76C2, +- [ 6754] = 0x76F2, [ 6755] = 0x76F4, [ 6756] = 0x77E5, [ 6757] = 0x77FD, +- [ 6758] = 0x793E, [ 6759] = 0x7940, [ 6760] = 0x7941, [ 6761] = 0x79C9, +- [ 6762] = 0x79C8, [ 6763] = 0x7A7A, [ 6764] = 0x7A79, [ 6765] = 0x7AFA, +- [ 6766] = 0x7CFE, [ 6767] = 0x7F54, [ 6768] = 0x7F8C, [ 6769] = 0x7F8B, +- [ 6770] = 0x8005, [ 6771] = 0x80BA, [ 6772] = 0x80A5, [ 6773] = 0x80A2, +- [ 6774] = 0x80B1, [ 6775] = 0x80A1, [ 6776] = 0x80AB, [ 6777] = 0x80A9, +- [ 6778] = 0x80B4, [ 6779] = 0x80AA, [ 6780] = 0x80AF, [ 6781] = 0x81E5, +- [ 6782] = 0x81FE, [ 6783] = 0x820D, [ 6784] = 0x82B3, [ 6785] = 0x829D, +- [ 6786] = 0x8299, [ 6787] = 0x82AD, [ 6788] = 0x82BD, [ 6789] = 0x829F, +- [ 6790] = 0x82B9, [ 6791] = 0x82B1, [ 6792] = 0x82AC, [ 6793] = 0x82A5, +- [ 6794] = 0x82AF, [ 6795] = 0x82B8, [ 6796] = 0x82A3, [ 6797] = 0x82B0, +- [ 6798] = 0x82BE, [ 6799] = 0x82B7, [ 6800] = 0x864E, [ 6801] = 0x8671, +- [ 6802] = 0x521D, [ 6803] = 0x8868, [ 6804] = 0x8ECB, [ 6805] = 0x8FCE, +- [ 6806] = 0x8FD4, [ 6807] = 0x8FD1, [ 6808] = 0x90B5, [ 6809] = 0x90B8, +- [ 6810] = 0x90B1, [ 6811] = 0x90B6, [ 6812] = 0x91C7, [ 6813] = 0x91D1, +- [ 6814] = 0x9577, [ 6815] = 0x9580, [ 6816] = 0x961C, [ 6817] = 0x9640, +- [ 6818] = 0x963F, [ 6819] = 0x963B, [ 6820] = 0x9644, [ 6825] = 0x9642, +- [ 6826] = 0x96B9, [ 6827] = 0x96E8, [ 6828] = 0x9752, [ 6829] = 0x975E, +- [ 6830] = 0x4E9F, [ 6831] = 0x4EAD, [ 6832] = 0x4EAE, [ 6833] = 0x4FE1, +- [ 6834] = 0x4FB5, [ 6835] = 0x4FAF, [ 6836] = 0x4FBF, [ 6837] = 0x4FE0, +- [ 6838] = 0x4FD1, [ 6839] = 0x4FCF, [ 6840] = 0x4FDD, [ 6841] = 0x4FC3, +- [ 6842] = 0x4FB6, [ 6843] = 0x4FD8, [ 6844] = 0x4FDF, [ 6845] = 0x4FCA, +- [ 6846] = 0x4FD7, [ 6847] = 0x4FAE, [ 6848] = 0x4FD0, [ 6849] = 0x4FC4, +- [ 6850] = 0x4FC2, [ 6851] = 0x4FDA, [ 6852] = 0x4FCE, [ 6853] = 0x4FDE, +- [ 6854] = 0x4FB7, [ 6855] = 0x5157, [ 6856] = 0x5192, [ 6857] = 0x5191, +- [ 6858] = 0x51A0, [ 6859] = 0x524E, [ 6860] = 0x5243, [ 6861] = 0x524A, +- [ 6862] = 0x524D, [ 6863] = 0x524C, [ 6864] = 0x524B, [ 6865] = 0x5247, +- [ 6866] = 0x52C7, [ 6867] = 0x52C9, [ 6868] = 0x52C3, [ 6869] = 0x52C1, +- [ 6870] = 0x530D, [ 6871] = 0x5357, [ 6872] = 0x537B, [ 6873] = 0x539A, +- [ 6874] = 0x53DB, [ 6875] = 0x54AC, [ 6876] = 0x54C0, [ 6877] = 0x54A8, +- [ 6878] = 0x54CE, [ 6879] = 0x54C9, [ 6880] = 0x54B8, [ 6881] = 0x54A6, +- [ 6882] = 0x54B3, [ 6883] = 0x54C7, [ 6884] = 0x54C2, [ 6885] = 0x54BD, +- [ 6886] = 0x54AA, [ 6887] = 0x54C1, [ 6922] = 0x54C4, [ 6923] = 0x54C8, +- [ 6924] = 0x54AF, [ 6925] = 0x54AB, [ 6926] = 0x54B1, [ 6927] = 0x54BB, +- [ 6928] = 0x54A9, [ 6929] = 0x54A7, [ 6930] = 0x54BF, [ 6931] = 0x56FF, +- [ 6932] = 0x5782, [ 6933] = 0x578B, [ 6934] = 0x57A0, [ 6935] = 0x57A3, +- [ 6936] = 0x57A2, [ 6937] = 0x57CE, [ 6938] = 0x57AE, [ 6939] = 0x5793, +- [ 6940] = 0x5955, [ 6941] = 0x5951, [ 6942] = 0x594F, [ 6943] = 0x594E, +- [ 6944] = 0x5950, [ 6945] = 0x59DC, [ 6946] = 0x59D8, [ 6947] = 0x59FF, +- [ 6948] = 0x59E3, [ 6949] = 0x59E8, [ 6950] = 0x5A03, [ 6951] = 0x59E5, +- [ 6952] = 0x59EA, [ 6953] = 0x59DA, [ 6954] = 0x59E6, [ 6955] = 0x5A01, +- [ 6956] = 0x59FB, [ 6957] = 0x5B69, [ 6958] = 0x5BA3, [ 6959] = 0x5BA6, +- [ 6960] = 0x5BA4, [ 6961] = 0x5BA2, [ 6962] = 0x5BA5, [ 6963] = 0x5C01, +- [ 6964] = 0x5C4E, [ 6965] = 0x5C4F, [ 6966] = 0x5C4D, [ 6967] = 0x5C4B, +- [ 6968] = 0x5CD9, [ 6969] = 0x5CD2, [ 6970] = 0x5DF7, [ 6971] = 0x5E1D, +- [ 6972] = 0x5E25, [ 6973] = 0x5E1F, [ 6974] = 0x5E7D, [ 6975] = 0x5EA0, +- [ 6976] = 0x5EA6, [ 6977] = 0x5EFA, [ 6978] = 0x5F08, [ 6979] = 0x5F2D, +- [ 6980] = 0x5F65, [ 6981] = 0x5F88, [ 6982] = 0x5F85, [ 6983] = 0x5F8A, +- [ 6984] = 0x5F8B, [ 6985] = 0x5F87, [ 6986] = 0x5F8C, [ 6987] = 0x5F89, +- [ 6988] = 0x6012, [ 6989] = 0x601D, [ 6990] = 0x6020, [ 6991] = 0x6025, +- [ 6992] = 0x600E, [ 6993] = 0x6028, [ 6994] = 0x604D, [ 6995] = 0x6070, +- [ 6996] = 0x6068, [ 6997] = 0x6062, [ 6998] = 0x6046, [ 6999] = 0x6043, +- [ 7000] = 0x606C, [ 7001] = 0x606B, [ 7002] = 0x606A, [ 7003] = 0x6064, +- [ 7004] = 0x6241, [ 7005] = 0x62DC, [ 7006] = 0x6316, [ 7007] = 0x6309, +- [ 7008] = 0x62FC, [ 7009] = 0x62ED, [ 7010] = 0x6301, [ 7011] = 0x62EE, +- [ 7012] = 0x62FD, [ 7013] = 0x6307, [ 7014] = 0x62F1, [ 7015] = 0x62F7, +- [ 7020] = 0x62EF, [ 7021] = 0x62EC, [ 7022] = 0x62FE, [ 7023] = 0x62F4, +- [ 7024] = 0x6311, [ 7025] = 0x6302, [ 7026] = 0x653F, [ 7027] = 0x6545, +- [ 7028] = 0x65AB, [ 7029] = 0x65BD, [ 7030] = 0x65E2, [ 7031] = 0x6625, +- [ 7032] = 0x662D, [ 7033] = 0x6620, [ 7034] = 0x6627, [ 7035] = 0x662F, +- [ 7036] = 0x661F, [ 7037] = 0x6628, [ 7038] = 0x6631, [ 7039] = 0x6624, +- [ 7040] = 0x66F7, [ 7041] = 0x67FF, [ 7042] = 0x67D3, [ 7043] = 0x67F1, +- [ 7044] = 0x67D4, [ 7045] = 0x67D0, [ 7046] = 0x67EC, [ 7047] = 0x67B6, +- [ 7048] = 0x67AF, [ 7049] = 0x67F5, [ 7050] = 0x67E9, [ 7051] = 0x67EF, +- [ 7052] = 0x67C4, [ 7053] = 0x67D1, [ 7054] = 0x67B4, [ 7055] = 0x67DA, +- [ 7056] = 0x67E5, [ 7057] = 0x67B8, [ 7058] = 0x67CF, [ 7059] = 0x67DE, +- [ 7060] = 0x67F3, [ 7061] = 0x67B0, [ 7062] = 0x67D9, [ 7063] = 0x67E2, +- [ 7064] = 0x67DD, [ 7065] = 0x67D2, [ 7066] = 0x6B6A, [ 7067] = 0x6B83, +- [ 7068] = 0x6B86, [ 7069] = 0x6BB5, [ 7070] = 0x6BD2, [ 7071] = 0x6BD7, +- [ 7072] = 0x6C1F, [ 7073] = 0x6CC9, [ 7074] = 0x6D0B, [ 7075] = 0x6D32, +- [ 7076] = 0x6D2A, [ 7077] = 0x6D41, [ 7078] = 0x6D25, [ 7079] = 0x6D0C, +- [ 7080] = 0x6D31, [ 7081] = 0x6D1E, [ 7082] = 0x6D17, [ 7117] = 0x6D3B, +- [ 7118] = 0x6D3D, [ 7119] = 0x6D3E, [ 7120] = 0x6D36, [ 7121] = 0x6D1B, +- [ 7122] = 0x6CF5, [ 7123] = 0x6D39, [ 7124] = 0x6D27, [ 7125] = 0x6D38, +- [ 7126] = 0x6D29, [ 7127] = 0x6D2E, [ 7128] = 0x6D35, [ 7129] = 0x6D0E, +- [ 7130] = 0x6D2B, [ 7131] = 0x70AB, [ 7132] = 0x70BA, [ 7133] = 0x70B3, +- [ 7134] = 0x70AC, [ 7135] = 0x70AF, [ 7136] = 0x70AD, [ 7137] = 0x70B8, +- [ 7138] = 0x70AE, [ 7139] = 0x70A4, [ 7140] = 0x7230, [ 7141] = 0x7272, +- [ 7142] = 0x726F, [ 7143] = 0x7274, [ 7144] = 0x72E9, [ 7145] = 0x72E0, +- [ 7146] = 0x72E1, [ 7147] = 0x73B7, [ 7148] = 0x73CA, [ 7149] = 0x73BB, +- [ 7150] = 0x73B2, [ 7151] = 0x73CD, [ 7152] = 0x73C0, [ 7153] = 0x73B3, +- [ 7154] = 0x751A, [ 7155] = 0x752D, [ 7156] = 0x754F, [ 7157] = 0x754C, +- [ 7158] = 0x754E, [ 7159] = 0x754B, [ 7160] = 0x75AB, [ 7161] = 0x75A4, +- [ 7162] = 0x75A5, [ 7163] = 0x75A2, [ 7164] = 0x75A3, [ 7165] = 0x7678, +- [ 7166] = 0x7686, [ 7167] = 0x7687, [ 7168] = 0x7688, [ 7169] = 0x76C8, +- [ 7170] = 0x76C6, [ 7171] = 0x76C3, [ 7172] = 0x76C5, [ 7173] = 0x7701, +- [ 7174] = 0x76F9, [ 7175] = 0x76F8, [ 7176] = 0x7709, [ 7177] = 0x770B, +- [ 7178] = 0x76FE, [ 7179] = 0x76FC, [ 7180] = 0x7707, [ 7181] = 0x77DC, +- [ 7182] = 0x7802, [ 7183] = 0x7814, [ 7184] = 0x780C, [ 7185] = 0x780D, +- [ 7186] = 0x7946, [ 7187] = 0x7949, [ 7188] = 0x7948, [ 7189] = 0x7947, +- [ 7190] = 0x79B9, [ 7191] = 0x79BA, [ 7192] = 0x79D1, [ 7193] = 0x79D2, +- [ 7194] = 0x79CB, [ 7195] = 0x7A7F, [ 7196] = 0x7A81, [ 7197] = 0x7AFF, +- [ 7198] = 0x7AFD, [ 7199] = 0x7C7D, [ 7200] = 0x7D02, [ 7201] = 0x7D05, +- [ 7202] = 0x7D00, [ 7203] = 0x7D09, [ 7204] = 0x7D07, [ 7205] = 0x7D04, +- [ 7206] = 0x7D06, [ 7207] = 0x7F38, [ 7208] = 0x7F8E, [ 7209] = 0x7FBF, +- [ 7210] = 0x8004, [ 7215] = 0x8010, [ 7216] = 0x800D, [ 7217] = 0x8011, +- [ 7218] = 0x8036, [ 7219] = 0x80D6, [ 7220] = 0x80E5, [ 7221] = 0x80DA, +- [ 7222] = 0x80C3, [ 7223] = 0x80C4, [ 7224] = 0x80CC, [ 7225] = 0x80E1, +- [ 7226] = 0x80DB, [ 7227] = 0x80CE, [ 7228] = 0x80DE, [ 7229] = 0x80E4, +- [ 7230] = 0x80DD, [ 7231] = 0x81F4, [ 7232] = 0x8222, [ 7233] = 0x82E7, +- [ 7234] = 0x8303, [ 7235] = 0x8305, [ 7236] = 0x82E3, [ 7237] = 0x82DB, +- [ 7238] = 0x82E6, [ 7239] = 0x8304, [ 7240] = 0x82E5, [ 7241] = 0x8302, +- [ 7242] = 0x8309, [ 7243] = 0x82D2, [ 7244] = 0x82D7, [ 7245] = 0x82F1, +- [ 7246] = 0x8301, [ 7247] = 0x82DC, [ 7248] = 0x82D4, [ 7249] = 0x82D1, +- [ 7250] = 0x82DE, [ 7251] = 0x82D3, [ 7252] = 0x82DF, [ 7253] = 0x82EF, +- [ 7254] = 0x8306, [ 7255] = 0x8650, [ 7256] = 0x8679, [ 7257] = 0x867B, +- [ 7258] = 0x867A, [ 7259] = 0x884D, [ 7260] = 0x886B, [ 7261] = 0x8981, +- [ 7262] = 0x89D4, [ 7263] = 0x8A08, [ 7264] = 0x8A02, [ 7265] = 0x8A03, +- [ 7266] = 0x8C9E, [ 7267] = 0x8CA0, [ 7268] = 0x8D74, [ 7269] = 0x8D73, +- [ 7270] = 0x8DB4, [ 7271] = 0x8ECD, [ 7272] = 0x8ECC, [ 7273] = 0x8FF0, +- [ 7274] = 0x8FE6, [ 7275] = 0x8FE2, [ 7276] = 0x8FEA, [ 7277] = 0x8FE5, +- [ 7312] = 0x8FED, [ 7313] = 0x8FEB, [ 7314] = 0x8FE4, [ 7315] = 0x8FE8, +- [ 7316] = 0x90CA, [ 7317] = 0x90CE, [ 7318] = 0x90C1, [ 7319] = 0x90C3, +- [ 7320] = 0x914B, [ 7321] = 0x914A, [ 7322] = 0x91CD, [ 7323] = 0x9582, +- [ 7324] = 0x9650, [ 7325] = 0x964B, [ 7326] = 0x964C, [ 7327] = 0x964D, +- [ 7328] = 0x9762, [ 7329] = 0x9769, [ 7330] = 0x97CB, [ 7331] = 0x97ED, +- [ 7332] = 0x97F3, [ 7333] = 0x9801, [ 7334] = 0x98A8, [ 7335] = 0x98DB, +- [ 7336] = 0x98DF, [ 7337] = 0x9996, [ 7338] = 0x9999, [ 7339] = 0x4E58, +- [ 7340] = 0x4EB3, [ 7341] = 0x500C, [ 7342] = 0x500D, [ 7343] = 0x5023, +- [ 7344] = 0x4FEF, [ 7345] = 0x5026, [ 7346] = 0x5025, [ 7347] = 0x4FF8, +- [ 7348] = 0x5029, [ 7349] = 0x5016, [ 7350] = 0x5006, [ 7351] = 0x503C, +- [ 7352] = 0x501F, [ 7353] = 0x501A, [ 7354] = 0x5012, [ 7355] = 0x5011, +- [ 7356] = 0x4FFA, [ 7357] = 0x5000, [ 7358] = 0x5014, [ 7359] = 0x5028, +- [ 7360] = 0x4FF1, [ 7361] = 0x5021, [ 7362] = 0x500B, [ 7363] = 0x5019, +- [ 7364] = 0x5018, [ 7365] = 0x4FF3, [ 7366] = 0x4FEE, [ 7367] = 0x502D, +- [ 7368] = 0x502A, [ 7369] = 0x4FFE, [ 7370] = 0x502B, [ 7371] = 0x5009, +- [ 7372] = 0x517C, [ 7373] = 0x51A4, [ 7374] = 0x51A5, [ 7375] = 0x51A2, +- [ 7376] = 0x51CD, [ 7377] = 0x51CC, [ 7378] = 0x51C6, [ 7379] = 0x51CB, +- [ 7380] = 0x5256, [ 7381] = 0x525C, [ 7382] = 0x5254, [ 7383] = 0x525B, +- [ 7384] = 0x525D, [ 7385] = 0x532A, [ 7386] = 0x537F, [ 7387] = 0x539F, +- [ 7388] = 0x539D, [ 7389] = 0x53DF, [ 7390] = 0x54E8, [ 7391] = 0x5510, +- [ 7392] = 0x5501, [ 7393] = 0x5537, [ 7394] = 0x54FC, [ 7395] = 0x54E5, +- [ 7396] = 0x54F2, [ 7397] = 0x5506, [ 7398] = 0x54FA, [ 7399] = 0x5514, +- [ 7400] = 0x54E9, [ 7401] = 0x54ED, [ 7402] = 0x54E1, [ 7403] = 0x5509, +- [ 7404] = 0x54EE, [ 7405] = 0x54EA, [ 7410] = 0x54E6, [ 7411] = 0x5527, +- [ 7412] = 0x5507, [ 7413] = 0x54FD, [ 7414] = 0x550F, [ 7415] = 0x5703, +- [ 7416] = 0x5704, [ 7417] = 0x57C2, [ 7418] = 0x57D4, [ 7419] = 0x57CB, +- [ 7420] = 0x57C3, [ 7421] = 0x5809, [ 7422] = 0x590F, [ 7423] = 0x5957, +- [ 7424] = 0x5958, [ 7425] = 0x595A, [ 7426] = 0x5A11, [ 7427] = 0x5A18, +- [ 7428] = 0x5A1C, [ 7429] = 0x5A1F, [ 7430] = 0x5A1B, [ 7431] = 0x5A13, +- [ 7432] = 0x59EC, [ 7433] = 0x5A20, [ 7434] = 0x5A23, [ 7435] = 0x5A29, +- [ 7436] = 0x5A25, [ 7437] = 0x5A0C, [ 7438] = 0x5A09, [ 7439] = 0x5B6B, +- [ 7440] = 0x5C58, [ 7441] = 0x5BB0, [ 7442] = 0x5BB3, [ 7443] = 0x5BB6, +- [ 7444] = 0x5BB4, [ 7445] = 0x5BAE, [ 7446] = 0x5BB5, [ 7447] = 0x5BB9, +- [ 7448] = 0x5BB8, [ 7449] = 0x5C04, [ 7450] = 0x5C51, [ 7451] = 0x5C55, +- [ 7452] = 0x5C50, [ 7453] = 0x5CED, [ 7454] = 0x5CFD, [ 7455] = 0x5CFB, +- [ 7456] = 0x5CEA, [ 7457] = 0x5CE8, [ 7458] = 0x5CF0, [ 7459] = 0x5CF6, +- [ 7460] = 0x5D01, [ 7461] = 0x5CF4, [ 7462] = 0x5DEE, [ 7463] = 0x5E2D, +- [ 7464] = 0x5E2B, [ 7465] = 0x5EAB, [ 7466] = 0x5EAD, [ 7467] = 0x5EA7, +- [ 7468] = 0x5F31, [ 7469] = 0x5F92, [ 7470] = 0x5F91, [ 7471] = 0x5F90, +- [ 7472] = 0x6059, [ 7507] = 0x6063, [ 7508] = 0x6065, [ 7509] = 0x6050, +- [ 7510] = 0x6055, [ 7511] = 0x606D, [ 7512] = 0x6069, [ 7513] = 0x606F, +- [ 7514] = 0x6084, [ 7515] = 0x609F, [ 7516] = 0x609A, [ 7517] = 0x608D, +- [ 7518] = 0x6094, [ 7519] = 0x608C, [ 7520] = 0x6085, [ 7521] = 0x6096, +- [ 7522] = 0x6247, [ 7523] = 0x62F3, [ 7524] = 0x6308, [ 7525] = 0x62FF, +- [ 7526] = 0x634E, [ 7527] = 0x633E, [ 7528] = 0x632F, [ 7529] = 0x6355, +- [ 7530] = 0x6342, [ 7531] = 0x6346, [ 7532] = 0x634F, [ 7533] = 0x6349, +- [ 7534] = 0x633A, [ 7535] = 0x6350, [ 7536] = 0x633D, [ 7537] = 0x632A, +- [ 7538] = 0x632B, [ 7539] = 0x6328, [ 7540] = 0x634D, [ 7541] = 0x634C, +- [ 7542] = 0x6548, [ 7543] = 0x6549, [ 7544] = 0x6599, [ 7545] = 0x65C1, +- [ 7546] = 0x65C5, [ 7547] = 0x6642, [ 7548] = 0x6649, [ 7549] = 0x664F, +- [ 7550] = 0x6643, [ 7551] = 0x6652, [ 7552] = 0x664C, [ 7553] = 0x6645, +- [ 7554] = 0x6641, [ 7555] = 0x66F8, [ 7556] = 0x6714, [ 7557] = 0x6715, +- [ 7558] = 0x6717, [ 7559] = 0x6821, [ 7560] = 0x6838, [ 7561] = 0x6848, +- [ 7562] = 0x6846, [ 7563] = 0x6853, [ 7564] = 0x6839, [ 7565] = 0x6842, +- [ 7566] = 0x6854, [ 7567] = 0x6829, [ 7568] = 0x68B3, [ 7569] = 0x6817, +- [ 7570] = 0x684C, [ 7571] = 0x6851, [ 7572] = 0x683D, [ 7573] = 0x67F4, +- [ 7574] = 0x6850, [ 7575] = 0x6840, [ 7576] = 0x683C, [ 7577] = 0x6843, +- [ 7578] = 0x682A, [ 7579] = 0x6845, [ 7580] = 0x6813, [ 7581] = 0x6818, +- [ 7582] = 0x6841, [ 7583] = 0x6B8A, [ 7584] = 0x6B89, [ 7585] = 0x6BB7, +- [ 7586] = 0x6C23, [ 7587] = 0x6C27, [ 7588] = 0x6C28, [ 7589] = 0x6C26, +- [ 7590] = 0x6C24, [ 7591] = 0x6CF0, [ 7592] = 0x6D6A, [ 7593] = 0x6D95, +- [ 7594] = 0x6D88, [ 7595] = 0x6D87, [ 7596] = 0x6D66, [ 7597] = 0x6D78, +- [ 7598] = 0x6D77, [ 7599] = 0x6D59, [ 7600] = 0x6D93, [ 7605] = 0x6D6C, +- [ 7606] = 0x6D89, [ 7607] = 0x6D6E, [ 7608] = 0x6D5A, [ 7609] = 0x6D74, +- [ 7610] = 0x6D69, [ 7611] = 0x6D8C, [ 7612] = 0x6D8A, [ 7613] = 0x6D79, +- [ 7614] = 0x6D85, [ 7615] = 0x6D65, [ 7616] = 0x6D94, [ 7617] = 0x70CA, +- [ 7618] = 0x70D8, [ 7619] = 0x70E4, [ 7620] = 0x70D9, [ 7621] = 0x70C8, +- [ 7622] = 0x70CF, [ 7623] = 0x7239, [ 7624] = 0x7279, [ 7625] = 0x72FC, +- [ 7626] = 0x72F9, [ 7627] = 0x72FD, [ 7628] = 0x72F8, [ 7629] = 0x72F7, +- [ 7630] = 0x7386, [ 7631] = 0x73ED, [ 7632] = 0x7409, [ 7633] = 0x73EE, +- [ 7634] = 0x73E0, [ 7635] = 0x73EA, [ 7636] = 0x73DE, [ 7637] = 0x7554, +- [ 7638] = 0x755D, [ 7639] = 0x755C, [ 7640] = 0x755A, [ 7641] = 0x7559, +- [ 7642] = 0x75BE, [ 7643] = 0x75C5, [ 7644] = 0x75C7, [ 7645] = 0x75B2, +- [ 7646] = 0x75B3, [ 7647] = 0x75BD, [ 7648] = 0x75BC, [ 7649] = 0x75B9, +- [ 7650] = 0x75C2, [ 7651] = 0x75B8, [ 7652] = 0x768B, [ 7653] = 0x76B0, +- [ 7654] = 0x76CA, [ 7655] = 0x76CD, [ 7656] = 0x76CE, [ 7657] = 0x7729, +- [ 7658] = 0x771F, [ 7659] = 0x7720, [ 7660] = 0x7728, [ 7661] = 0x77E9, +- [ 7662] = 0x7830, [ 7663] = 0x7827, [ 7664] = 0x7838, [ 7665] = 0x781D, +- [ 7666] = 0x7834, [ 7667] = 0x7837, [ 7702] = 0x7825, [ 7703] = 0x782D, +- [ 7704] = 0x7820, [ 7705] = 0x781F, [ 7706] = 0x7832, [ 7707] = 0x7955, +- [ 7708] = 0x7950, [ 7709] = 0x7960, [ 7710] = 0x795F, [ 7711] = 0x7956, +- [ 7712] = 0x795E, [ 7713] = 0x795D, [ 7714] = 0x7957, [ 7715] = 0x795A, +- [ 7716] = 0x79E4, [ 7717] = 0x79E3, [ 7718] = 0x79E7, [ 7719] = 0x79DF, +- [ 7720] = 0x79E6, [ 7721] = 0x79E9, [ 7722] = 0x79D8, [ 7723] = 0x7A84, +- [ 7724] = 0x7A88, [ 7725] = 0x7AD9, [ 7726] = 0x7B06, [ 7727] = 0x7B11, +- [ 7728] = 0x7C89, [ 7729] = 0x7D21, [ 7730] = 0x7D17, [ 7731] = 0x7D0B, +- [ 7732] = 0x7D0A, [ 7733] = 0x7D20, [ 7734] = 0x7D22, [ 7735] = 0x7D14, +- [ 7736] = 0x7D10, [ 7737] = 0x7D15, [ 7738] = 0x7D1A, [ 7739] = 0x7D1C, +- [ 7740] = 0x7D0D, [ 7741] = 0x7D19, [ 7742] = 0x7D1B, [ 7743] = 0x7F3A, +- [ 7744] = 0x7F5F, [ 7745] = 0x7F94, [ 7746] = 0x7FC5, [ 7747] = 0x7FC1, +- [ 7748] = 0x8006, [ 7749] = 0x8018, [ 7750] = 0x8015, [ 7751] = 0x8019, +- [ 7752] = 0x8017, [ 7753] = 0x803D, [ 7754] = 0x803F, [ 7755] = 0x80F1, +- [ 7756] = 0x8102, [ 7757] = 0x80F0, [ 7758] = 0x8105, [ 7759] = 0x80ED, +- [ 7760] = 0x80F4, [ 7761] = 0x8106, [ 7762] = 0x80F8, [ 7763] = 0x80F3, +- [ 7764] = 0x8108, [ 7765] = 0x80FD, [ 7766] = 0x810A, [ 7767] = 0x80FC, +- [ 7768] = 0x80EF, [ 7769] = 0x81ED, [ 7770] = 0x81EC, [ 7771] = 0x8200, +- [ 7772] = 0x8210, [ 7773] = 0x822A, [ 7774] = 0x822B, [ 7775] = 0x8228, +- [ 7776] = 0x822C, [ 7777] = 0x82BB, [ 7778] = 0x832B, [ 7779] = 0x8352, +- [ 7780] = 0x8354, [ 7781] = 0x834A, [ 7782] = 0x8338, [ 7783] = 0x8350, +- [ 7784] = 0x8349, [ 7785] = 0x8335, [ 7786] = 0x8334, [ 7787] = 0x834F, +- [ 7788] = 0x8332, [ 7789] = 0x8339, [ 7790] = 0x8336, [ 7791] = 0x8317, +- [ 7792] = 0x8340, [ 7793] = 0x8331, [ 7794] = 0x8328, [ 7795] = 0x8343, +- [ 7800] = 0x8654, [ 7801] = 0x868A, [ 7802] = 0x86AA, [ 7803] = 0x8693, +- [ 7804] = 0x86A4, [ 7805] = 0x86A9, [ 7806] = 0x868C, [ 7807] = 0x86A3, +- [ 7808] = 0x869C, [ 7809] = 0x8870, [ 7810] = 0x8877, [ 7811] = 0x8881, +- [ 7812] = 0x8882, [ 7813] = 0x887D, [ 7814] = 0x8879, [ 7815] = 0x8A18, +- [ 7816] = 0x8A10, [ 7817] = 0x8A0E, [ 7818] = 0x8A0C, [ 7819] = 0x8A15, +- [ 7820] = 0x8A0A, [ 7821] = 0x8A17, [ 7822] = 0x8A13, [ 7823] = 0x8A16, +- [ 7824] = 0x8A0F, [ 7825] = 0x8A11, [ 7826] = 0x8C48, [ 7827] = 0x8C7A, +- [ 7828] = 0x8C79, [ 7829] = 0x8CA1, [ 7830] = 0x8CA2, [ 7831] = 0x8D77, +- [ 7832] = 0x8EAC, [ 7833] = 0x8ED2, [ 7834] = 0x8ED4, [ 7835] = 0x8ECF, +- [ 7836] = 0x8FB1, [ 7837] = 0x9001, [ 7838] = 0x9006, [ 7839] = 0x8FF7, +- [ 7840] = 0x9000, [ 7841] = 0x8FFA, [ 7842] = 0x8FF4, [ 7843] = 0x9003, +- [ 7844] = 0x8FFD, [ 7845] = 0x9005, [ 7846] = 0x8FF8, [ 7847] = 0x9095, +- [ 7848] = 0x90E1, [ 7849] = 0x90DD, [ 7850] = 0x90E2, [ 7851] = 0x9152, +- [ 7852] = 0x914D, [ 7853] = 0x914C, [ 7854] = 0x91D8, [ 7855] = 0x91DD, +- [ 7856] = 0x91D7, [ 7857] = 0x91DC, [ 7858] = 0x91D9, [ 7859] = 0x9583, +- [ 7860] = 0x9662, [ 7861] = 0x9663, [ 7862] = 0x9661, [ 7897] = 0x965B, +- [ 7898] = 0x965D, [ 7899] = 0x9664, [ 7900] = 0x9658, [ 7901] = 0x965E, +- [ 7902] = 0x96BB, [ 7903] = 0x98E2, [ 7904] = 0x99AC, [ 7905] = 0x9AA8, +- [ 7906] = 0x9AD8, [ 7907] = 0x9B25, [ 7908] = 0x9B32, [ 7909] = 0x9B3C, +- [ 7910] = 0x4E7E, [ 7911] = 0x507A, [ 7912] = 0x507D, [ 7913] = 0x505C, +- [ 7914] = 0x5047, [ 7915] = 0x5043, [ 7916] = 0x504C, [ 7917] = 0x505A, +- [ 7918] = 0x5049, [ 7919] = 0x5065, [ 7920] = 0x5076, [ 7921] = 0x504E, +- [ 7922] = 0x5055, [ 7923] = 0x5075, [ 7924] = 0x5074, [ 7925] = 0x5077, +- [ 7926] = 0x504F, [ 7927] = 0x500F, [ 7928] = 0x506F, [ 7929] = 0x506D, +- [ 7930] = 0x515C, [ 7931] = 0x5195, [ 7932] = 0x51F0, [ 7933] = 0x526A, +- [ 7934] = 0x526F, [ 7935] = 0x52D2, [ 7936] = 0x52D9, [ 7937] = 0x52D8, +- [ 7938] = 0x52D5, [ 7939] = 0x5310, [ 7940] = 0x530F, [ 7941] = 0x5319, +- [ 7942] = 0x533F, [ 7943] = 0x5340, [ 7944] = 0x533E, [ 7945] = 0x53C3, +- [ 7946] = 0x66FC, [ 7947] = 0x5546, [ 7948] = 0x556A, [ 7949] = 0x5566, +- [ 7950] = 0x5544, [ 7951] = 0x555E, [ 7952] = 0x5561, [ 7953] = 0x5543, +- [ 7954] = 0x554A, [ 7955] = 0x5531, [ 7956] = 0x5556, [ 7957] = 0x554F, +- [ 7958] = 0x5555, [ 7959] = 0x552F, [ 7960] = 0x5564, [ 7961] = 0x5538, +- [ 7962] = 0x552E, [ 7963] = 0x555C, [ 7964] = 0x552C, [ 7965] = 0x5563, +- [ 7966] = 0x5533, [ 7967] = 0x5541, [ 7968] = 0x5557, [ 7969] = 0x5708, +- [ 7970] = 0x570B, [ 7971] = 0x5709, [ 7972] = 0x57DF, [ 7973] = 0x5805, +- [ 7974] = 0x580A, [ 7975] = 0x5806, [ 7976] = 0x57E0, [ 7977] = 0x57E4, +- [ 7978] = 0x57FA, [ 7979] = 0x5802, [ 7980] = 0x5835, [ 7981] = 0x57F7, +- [ 7982] = 0x57F9, [ 7983] = 0x5920, [ 7984] = 0x5962, [ 7985] = 0x5A36, +- [ 7986] = 0x5A41, [ 7987] = 0x5A49, [ 7988] = 0x5A66, [ 7989] = 0x5A6A, +- [ 7990] = 0x5A40, [ 7995] = 0x5A3C, [ 7996] = 0x5A62, [ 7997] = 0x5A5A, +- [ 7998] = 0x5A46, [ 7999] = 0x5A4A, [ 8000] = 0x5B70, [ 8001] = 0x5BC7, +- [ 8002] = 0x5BC5, [ 8003] = 0x5BC4, [ 8004] = 0x5BC2, [ 8005] = 0x5BBF, +- [ 8006] = 0x5BC6, [ 8007] = 0x5C09, [ 8008] = 0x5C08, [ 8009] = 0x5C07, +- [ 8010] = 0x5C60, [ 8011] = 0x5C5C, [ 8012] = 0x5C5D, [ 8013] = 0x5D07, +- [ 8014] = 0x5D06, [ 8015] = 0x5D0E, [ 8016] = 0x5D1B, [ 8017] = 0x5D16, +- [ 8018] = 0x5D22, [ 8019] = 0x5D11, [ 8020] = 0x5D29, [ 8021] = 0x5D14, +- [ 8022] = 0x5D19, [ 8023] = 0x5D24, [ 8024] = 0x5D27, [ 8025] = 0x5D17, +- [ 8026] = 0x5DE2, [ 8027] = 0x5E38, [ 8028] = 0x5E36, [ 8029] = 0x5E33, +- [ 8030] = 0x5E37, [ 8031] = 0x5EB7, [ 8032] = 0x5EB8, [ 8033] = 0x5EB6, +- [ 8034] = 0x5EB5, [ 8035] = 0x5EBE, [ 8036] = 0x5F35, [ 8037] = 0x5F37, +- [ 8038] = 0x5F57, [ 8039] = 0x5F6C, [ 8040] = 0x5F69, [ 8041] = 0x5F6B, +- [ 8042] = 0x5F97, [ 8043] = 0x5F99, [ 8044] = 0x5F9E, [ 8045] = 0x5F98, +- [ 8046] = 0x5FA1, [ 8047] = 0x5FA0, [ 8048] = 0x5F9C, [ 8049] = 0x607F, +- [ 8050] = 0x60A3, [ 8051] = 0x6089, [ 8052] = 0x60A0, [ 8053] = 0x60A8, +- [ 8054] = 0x60CB, [ 8055] = 0x60B4, [ 8056] = 0x60E6, [ 8057] = 0x60BD, +- [ 8092] = 0x60C5, [ 8093] = 0x60BB, [ 8094] = 0x60B5, [ 8095] = 0x60DC, +- [ 8096] = 0x60BC, [ 8097] = 0x60D8, [ 8098] = 0x60D5, [ 8099] = 0x60C6, +- [ 8100] = 0x60DF, [ 8101] = 0x60B8, [ 8102] = 0x60DA, [ 8103] = 0x60C7, +- [ 8104] = 0x621A, [ 8105] = 0x621B, [ 8106] = 0x6248, [ 8107] = 0x63A0, +- [ 8108] = 0x63A7, [ 8109] = 0x6372, [ 8110] = 0x6396, [ 8111] = 0x63A2, +- [ 8112] = 0x63A5, [ 8113] = 0x6377, [ 8114] = 0x6367, [ 8115] = 0x6398, +- [ 8116] = 0x63AA, [ 8117] = 0x6371, [ 8118] = 0x63A9, [ 8119] = 0x6389, +- [ 8120] = 0x6383, [ 8121] = 0x639B, [ 8122] = 0x636B, [ 8123] = 0x63A8, +- [ 8124] = 0x6384, [ 8125] = 0x6388, [ 8126] = 0x6399, [ 8127] = 0x63A1, +- [ 8128] = 0x63AC, [ 8129] = 0x6392, [ 8130] = 0x638F, [ 8131] = 0x6380, +- [ 8132] = 0x637B, [ 8133] = 0x6369, [ 8134] = 0x6368, [ 8135] = 0x637A, +- [ 8136] = 0x655D, [ 8137] = 0x6556, [ 8138] = 0x6551, [ 8139] = 0x6559, +- [ 8140] = 0x6557, [ 8141] = 0x555F, [ 8142] = 0x654F, [ 8143] = 0x6558, +- [ 8144] = 0x6555, [ 8145] = 0x6554, [ 8146] = 0x659C, [ 8147] = 0x659B, +- [ 8148] = 0x65AC, [ 8149] = 0x65CF, [ 8150] = 0x65CB, [ 8151] = 0x65CC, +- [ 8152] = 0x65CE, [ 8153] = 0x665D, [ 8154] = 0x665A, [ 8155] = 0x6664, +- [ 8156] = 0x6668, [ 8157] = 0x6666, [ 8158] = 0x665E, [ 8159] = 0x66F9, +- [ 8160] = 0x52D7, [ 8161] = 0x671B, [ 8162] = 0x6881, [ 8163] = 0x68AF, +- [ 8164] = 0x68A2, [ 8165] = 0x6893, [ 8166] = 0x68B5, [ 8167] = 0x687F, +- [ 8168] = 0x6876, [ 8169] = 0x68B1, [ 8170] = 0x68A7, [ 8171] = 0x6897, +- [ 8172] = 0x68B0, [ 8173] = 0x6883, [ 8174] = 0x68C4, [ 8175] = 0x68AD, +- [ 8176] = 0x6886, [ 8177] = 0x6885, [ 8178] = 0x6894, [ 8179] = 0x689D, +- [ 8180] = 0x68A8, [ 8181] = 0x689F, [ 8182] = 0x68A1, [ 8183] = 0x6882, +- [ 8184] = 0x6B32, [ 8185] = 0x6BBA, [ 8190] = 0x6BEB, [ 8191] = 0x6BEC, +- [ 8192] = 0x6C2B, [ 8193] = 0x6D8E, [ 8194] = 0x6DBC, [ 8195] = 0x6DF3, +- [ 8196] = 0x6DD9, [ 8197] = 0x6DB2, [ 8198] = 0x6DE1, [ 8199] = 0x6DCC, +- [ 8200] = 0x6DE4, [ 8201] = 0x6DFB, [ 8202] = 0x6DFA, [ 8203] = 0x6E05, +- [ 8204] = 0x6DC7, [ 8205] = 0x6DCB, [ 8206] = 0x6DAF, [ 8207] = 0x6DD1, +- [ 8208] = 0x6DAE, [ 8209] = 0x6DDE, [ 8210] = 0x6DF9, [ 8211] = 0x6DB8, +- [ 8212] = 0x6DF7, [ 8213] = 0x6DF5, [ 8214] = 0x6DC5, [ 8215] = 0x6DD2, +- [ 8216] = 0x6E1A, [ 8217] = 0x6DB5, [ 8218] = 0x6DDA, [ 8219] = 0x6DEB, +- [ 8220] = 0x6DD8, [ 8221] = 0x6DEA, [ 8222] = 0x6DF1, [ 8223] = 0x6DEE, +- [ 8224] = 0x6DE8, [ 8225] = 0x6DC6, [ 8226] = 0x6DC4, [ 8227] = 0x6DAA, +- [ 8228] = 0x6DEC, [ 8229] = 0x6DBF, [ 8230] = 0x6DE6, [ 8231] = 0x70F9, +- [ 8232] = 0x7109, [ 8233] = 0x710A, [ 8234] = 0x70FD, [ 8235] = 0x70EF, +- [ 8236] = 0x723D, [ 8237] = 0x727D, [ 8238] = 0x7281, [ 8239] = 0x731C, +- [ 8240] = 0x731B, [ 8241] = 0x7316, [ 8242] = 0x7313, [ 8243] = 0x7319, +- [ 8244] = 0x7387, [ 8245] = 0x7405, [ 8246] = 0x740A, [ 8247] = 0x7403, +- [ 8248] = 0x7406, [ 8249] = 0x73FE, [ 8250] = 0x740D, [ 8251] = 0x74E0, +- [ 8252] = 0x74F6, [ 8287] = 0x74F7, [ 8288] = 0x751C, [ 8289] = 0x7522, +- [ 8290] = 0x7565, [ 8291] = 0x7566, [ 8292] = 0x7562, [ 8293] = 0x7570, +- [ 8294] = 0x758F, [ 8295] = 0x75D4, [ 8296] = 0x75D5, [ 8297] = 0x75B5, +- [ 8298] = 0x75CA, [ 8299] = 0x75CD, [ 8300] = 0x768E, [ 8301] = 0x76D4, +- [ 8302] = 0x76D2, [ 8303] = 0x76DB, [ 8304] = 0x7737, [ 8305] = 0x773E, +- [ 8306] = 0x773C, [ 8307] = 0x7736, [ 8308] = 0x7738, [ 8309] = 0x773A, +- [ 8310] = 0x786B, [ 8311] = 0x7843, [ 8312] = 0x784E, [ 8313] = 0x7965, +- [ 8314] = 0x7968, [ 8315] = 0x796D, [ 8316] = 0x79FB, [ 8317] = 0x7A92, +- [ 8318] = 0x7A95, [ 8319] = 0x7B20, [ 8320] = 0x7B28, [ 8321] = 0x7B1B, +- [ 8322] = 0x7B2C, [ 8323] = 0x7B26, [ 8324] = 0x7B19, [ 8325] = 0x7B1E, +- [ 8326] = 0x7B2E, [ 8327] = 0x7C92, [ 8328] = 0x7C97, [ 8329] = 0x7C95, +- [ 8330] = 0x7D46, [ 8331] = 0x7D43, [ 8332] = 0x7D71, [ 8333] = 0x7D2E, +- [ 8334] = 0x7D39, [ 8335] = 0x7D3C, [ 8336] = 0x7D40, [ 8337] = 0x7D30, +- [ 8338] = 0x7D33, [ 8339] = 0x7D44, [ 8340] = 0x7D2F, [ 8341] = 0x7D42, +- [ 8342] = 0x7D32, [ 8343] = 0x7D31, [ 8344] = 0x7F3D, [ 8345] = 0x7F9E, +- [ 8346] = 0x7F9A, [ 8347] = 0x7FCC, [ 8348] = 0x7FCE, [ 8349] = 0x7FD2, +- [ 8350] = 0x801C, [ 8351] = 0x804A, [ 8352] = 0x8046, [ 8353] = 0x812F, +- [ 8354] = 0x8116, [ 8355] = 0x8123, [ 8356] = 0x812B, [ 8357] = 0x8129, +- [ 8358] = 0x8130, [ 8359] = 0x8124, [ 8360] = 0x8202, [ 8361] = 0x8235, +- [ 8362] = 0x8237, [ 8363] = 0x8236, [ 8364] = 0x8239, [ 8365] = 0x838E, +- [ 8366] = 0x839E, [ 8367] = 0x8398, [ 8368] = 0x8378, [ 8369] = 0x83A2, +- [ 8370] = 0x8396, [ 8371] = 0x83BD, [ 8372] = 0x83AB, [ 8373] = 0x8392, +- [ 8374] = 0x838A, [ 8375] = 0x8393, [ 8376] = 0x8389, [ 8377] = 0x83A0, +- [ 8378] = 0x8377, [ 8379] = 0x837B, [ 8380] = 0x837C, [ 8385] = 0x8386, +- [ 8386] = 0x83A7, [ 8387] = 0x8655, [ 8388] = 0x5F6A, [ 8389] = 0x86C7, +- [ 8390] = 0x86C0, [ 8391] = 0x86B6, [ 8392] = 0x86C4, [ 8393] = 0x86B5, +- [ 8394] = 0x86C6, [ 8395] = 0x86CB, [ 8396] = 0x86B1, [ 8397] = 0x86AF, +- [ 8398] = 0x86C9, [ 8399] = 0x8853, [ 8400] = 0x889E, [ 8401] = 0x8888, +- [ 8402] = 0x88AB, [ 8403] = 0x8892, [ 8404] = 0x8896, [ 8405] = 0x888D, +- [ 8406] = 0x888B, [ 8407] = 0x8993, [ 8408] = 0x898F, [ 8409] = 0x8A2A, +- [ 8410] = 0x8A1D, [ 8411] = 0x8A23, [ 8412] = 0x8A25, [ 8413] = 0x8A31, +- [ 8414] = 0x8A2D, [ 8415] = 0x8A1F, [ 8416] = 0x8A1B, [ 8417] = 0x8A22, +- [ 8418] = 0x8C49, [ 8419] = 0x8C5A, [ 8420] = 0x8CA9, [ 8421] = 0x8CAC, +- [ 8422] = 0x8CAB, [ 8423] = 0x8CA8, [ 8424] = 0x8CAA, [ 8425] = 0x8CA7, +- [ 8426] = 0x8D67, [ 8427] = 0x8D66, [ 8428] = 0x8DBE, [ 8429] = 0x8DBA, +- [ 8430] = 0x8EDB, [ 8431] = 0x8EDF, [ 8432] = 0x9019, [ 8433] = 0x900D, +- [ 8434] = 0x901A, [ 8435] = 0x9017, [ 8436] = 0x9023, [ 8437] = 0x901F, +- [ 8438] = 0x901D, [ 8439] = 0x9010, [ 8440] = 0x9015, [ 8441] = 0x901E, +- [ 8442] = 0x9020, [ 8443] = 0x900F, [ 8444] = 0x9022, [ 8445] = 0x9016, +- [ 8446] = 0x901B, [ 8447] = 0x9014, [ 8482] = 0x90E8, [ 8483] = 0x90ED, +- [ 8484] = 0x90FD, [ 8485] = 0x9157, [ 8486] = 0x91CE, [ 8487] = 0x91F5, +- [ 8488] = 0x91E6, [ 8489] = 0x91E3, [ 8490] = 0x91E7, [ 8491] = 0x91ED, +- [ 8492] = 0x91E9, [ 8493] = 0x9589, [ 8494] = 0x966A, [ 8495] = 0x9675, +- [ 8496] = 0x9673, [ 8497] = 0x9678, [ 8498] = 0x9670, [ 8499] = 0x9674, +- [ 8500] = 0x9676, [ 8501] = 0x9677, [ 8502] = 0x966C, [ 8503] = 0x96C0, +- [ 8504] = 0x96EA, [ 8505] = 0x96E9, [ 8506] = 0x7AE0, [ 8507] = 0x7ADF, +- [ 8508] = 0x9802, [ 8509] = 0x9803, [ 8510] = 0x9B5A, [ 8511] = 0x9CE5, +- [ 8512] = 0x9E75, [ 8513] = 0x9E7F, [ 8514] = 0x9EA5, [ 8515] = 0x9EBB, +- [ 8516] = 0x50A2, [ 8517] = 0x508D, [ 8518] = 0x5085, [ 8519] = 0x5099, +- [ 8520] = 0x5091, [ 8521] = 0x5080, [ 8522] = 0x5096, [ 8523] = 0x5098, +- [ 8524] = 0x509A, [ 8525] = 0x6700, [ 8526] = 0x51F1, [ 8527] = 0x5272, +- [ 8528] = 0x5274, [ 8529] = 0x5275, [ 8530] = 0x5269, [ 8531] = 0x52DE, +- [ 8532] = 0x52DD, [ 8533] = 0x52DB, [ 8534] = 0x535A, [ 8535] = 0x53A5, +- [ 8536] = 0x557B, [ 8537] = 0x5580, [ 8538] = 0x55A7, [ 8539] = 0x557C, +- [ 8540] = 0x558A, [ 8541] = 0x559D, [ 8542] = 0x5598, [ 8543] = 0x5582, +- [ 8544] = 0x559C, [ 8545] = 0x55AA, [ 8546] = 0x5594, [ 8547] = 0x5587, +- [ 8548] = 0x558B, [ 8549] = 0x5583, [ 8550] = 0x55B3, [ 8551] = 0x55AE, +- [ 8552] = 0x559F, [ 8553] = 0x553E, [ 8554] = 0x55B2, [ 8555] = 0x559A, +- [ 8556] = 0x55BB, [ 8557] = 0x55AC, [ 8558] = 0x55B1, [ 8559] = 0x557E, +- [ 8560] = 0x5589, [ 8561] = 0x55AB, [ 8562] = 0x5599, [ 8563] = 0x570D, +- [ 8564] = 0x582F, [ 8565] = 0x582A, [ 8566] = 0x5834, [ 8567] = 0x5824, +- [ 8568] = 0x5830, [ 8569] = 0x5831, [ 8570] = 0x5821, [ 8571] = 0x581D, +- [ 8572] = 0x5820, [ 8573] = 0x58F9, [ 8574] = 0x58FA, [ 8575] = 0x5960, +- [ 8580] = 0x5A77, [ 8581] = 0x5A9A, [ 8582] = 0x5A7F, [ 8583] = 0x5A92, +- [ 8584] = 0x5A9B, [ 8585] = 0x5AA7, [ 8586] = 0x5B73, [ 8587] = 0x5B71, +- [ 8588] = 0x5BD2, [ 8589] = 0x5BCC, [ 8590] = 0x5BD3, [ 8591] = 0x5BD0, +- [ 8592] = 0x5C0A, [ 8593] = 0x5C0B, [ 8594] = 0x5C31, [ 8595] = 0x5D4C, +- [ 8596] = 0x5D50, [ 8597] = 0x5D34, [ 8598] = 0x5D47, [ 8599] = 0x5DFD, +- [ 8600] = 0x5E45, [ 8601] = 0x5E3D, [ 8602] = 0x5E40, [ 8603] = 0x5E43, +- [ 8604] = 0x5E7E, [ 8605] = 0x5ECA, [ 8606] = 0x5EC1, [ 8607] = 0x5EC2, +- [ 8608] = 0x5EC4, [ 8609] = 0x5F3C, [ 8610] = 0x5F6D, [ 8611] = 0x5FA9, +- [ 8612] = 0x5FAA, [ 8613] = 0x5FA8, [ 8614] = 0x60D1, [ 8615] = 0x60E1, +- [ 8616] = 0x60B2, [ 8617] = 0x60B6, [ 8618] = 0x60E0, [ 8619] = 0x611C, +- [ 8620] = 0x6123, [ 8621] = 0x60FA, [ 8622] = 0x6115, [ 8623] = 0x60F0, +- [ 8624] = 0x60FB, [ 8625] = 0x60F4, [ 8626] = 0x6168, [ 8627] = 0x60F1, +- [ 8628] = 0x610E, [ 8629] = 0x60F6, [ 8630] = 0x6109, [ 8631] = 0x6100, +- [ 8632] = 0x6112, [ 8633] = 0x621F, [ 8634] = 0x6249, [ 8635] = 0x63A3, +- [ 8636] = 0x638C, [ 8637] = 0x63CF, [ 8638] = 0x63C0, [ 8639] = 0x63E9, +- [ 8640] = 0x63C9, [ 8641] = 0x63C6, [ 8642] = 0x63CD, [ 8677] = 0x63D2, +- [ 8678] = 0x63E3, [ 8679] = 0x63D0, [ 8680] = 0x63E1, [ 8681] = 0x63D6, +- [ 8682] = 0x63ED, [ 8683] = 0x63EE, [ 8684] = 0x6376, [ 8685] = 0x63F4, +- [ 8686] = 0x63EA, [ 8687] = 0x63DB, [ 8688] = 0x6452, [ 8689] = 0x63DA, +- [ 8690] = 0x63F9, [ 8691] = 0x655E, [ 8692] = 0x6566, [ 8693] = 0x6562, +- [ 8694] = 0x6563, [ 8695] = 0x6591, [ 8696] = 0x6590, [ 8697] = 0x65AF, +- [ 8698] = 0x666E, [ 8699] = 0x6670, [ 8700] = 0x6674, [ 8701] = 0x6676, +- [ 8702] = 0x666F, [ 8703] = 0x6691, [ 8704] = 0x667A, [ 8705] = 0x667E, +- [ 8706] = 0x6677, [ 8707] = 0x66FE, [ 8708] = 0x66FF, [ 8709] = 0x671F, +- [ 8710] = 0x671D, [ 8711] = 0x68FA, [ 8712] = 0x68D5, [ 8713] = 0x68E0, +- [ 8714] = 0x68D8, [ 8715] = 0x68D7, [ 8716] = 0x6905, [ 8717] = 0x68DF, +- [ 8718] = 0x68F5, [ 8719] = 0x68EE, [ 8720] = 0x68E7, [ 8721] = 0x68F9, +- [ 8722] = 0x68D2, [ 8723] = 0x68F2, [ 8724] = 0x68E3, [ 8725] = 0x68CB, +- [ 8726] = 0x68CD, [ 8727] = 0x690D, [ 8728] = 0x6912, [ 8729] = 0x690E, +- [ 8730] = 0x68C9, [ 8731] = 0x68DA, [ 8732] = 0x696E, [ 8733] = 0x68FB, +- [ 8734] = 0x6B3E, [ 8735] = 0x6B3A, [ 8736] = 0x6B3D, [ 8737] = 0x6B98, +- [ 8738] = 0x6B96, [ 8739] = 0x6BBC, [ 8740] = 0x6BEF, [ 8741] = 0x6C2E, +- [ 8742] = 0x6C2F, [ 8743] = 0x6C2C, [ 8744] = 0x6E2F, [ 8745] = 0x6E38, +- [ 8746] = 0x6E54, [ 8747] = 0x6E21, [ 8748] = 0x6E32, [ 8749] = 0x6E67, +- [ 8750] = 0x6E4A, [ 8751] = 0x6E20, [ 8752] = 0x6E25, [ 8753] = 0x6E23, +- [ 8754] = 0x6E1B, [ 8755] = 0x6E5B, [ 8756] = 0x6E58, [ 8757] = 0x6E24, +- [ 8758] = 0x6E56, [ 8759] = 0x6E6E, [ 8760] = 0x6E2D, [ 8761] = 0x6E26, +- [ 8762] = 0x6E6F, [ 8763] = 0x6E34, [ 8764] = 0x6E4D, [ 8765] = 0x6E3A, +- [ 8766] = 0x6E2C, [ 8767] = 0x6E43, [ 8768] = 0x6E1D, [ 8769] = 0x6E3E, +- [ 8770] = 0x6ECB, [ 8775] = 0x6E89, [ 8776] = 0x6E19, [ 8777] = 0x6E4E, +- [ 8778] = 0x6E63, [ 8779] = 0x6E44, [ 8780] = 0x6E72, [ 8781] = 0x6E69, +- [ 8782] = 0x6E5F, [ 8783] = 0x7119, [ 8784] = 0x711A, [ 8785] = 0x7126, +- [ 8786] = 0x7130, [ 8787] = 0x7121, [ 8788] = 0x7136, [ 8789] = 0x716E, +- [ 8790] = 0x711C, [ 8791] = 0x724C, [ 8792] = 0x7284, [ 8793] = 0x7280, +- [ 8794] = 0x7336, [ 8795] = 0x7325, [ 8796] = 0x7334, [ 8797] = 0x7329, +- [ 8798] = 0x743A, [ 8799] = 0x742A, [ 8800] = 0x7433, [ 8801] = 0x7422, +- [ 8802] = 0x7425, [ 8803] = 0x7435, [ 8804] = 0x7436, [ 8805] = 0x7434, +- [ 8806] = 0x742F, [ 8807] = 0x741B, [ 8808] = 0x7426, [ 8809] = 0x7428, +- [ 8810] = 0x7525, [ 8811] = 0x7526, [ 8812] = 0x756B, [ 8813] = 0x756A, +- [ 8814] = 0x75E2, [ 8815] = 0x75DB, [ 8816] = 0x75E3, [ 8817] = 0x75D9, +- [ 8818] = 0x75D8, [ 8819] = 0x75DE, [ 8820] = 0x75E0, [ 8821] = 0x767B, +- [ 8822] = 0x767C, [ 8823] = 0x7696, [ 8824] = 0x7693, [ 8825] = 0x76B4, +- [ 8826] = 0x76DC, [ 8827] = 0x774F, [ 8828] = 0x77ED, [ 8829] = 0x785D, +- [ 8830] = 0x786C, [ 8831] = 0x786F, [ 8832] = 0x7A0D, [ 8833] = 0x7A08, +- [ 8834] = 0x7A0B, [ 8835] = 0x7A05, [ 8836] = 0x7A00, [ 8837] = 0x7A98, +- [ 8872] = 0x7A97, [ 8873] = 0x7A96, [ 8874] = 0x7AE5, [ 8875] = 0x7AE3, +- [ 8876] = 0x7B49, [ 8877] = 0x7B56, [ 8878] = 0x7B46, [ 8879] = 0x7B50, +- [ 8880] = 0x7B52, [ 8881] = 0x7B54, [ 8882] = 0x7B4D, [ 8883] = 0x7B4B, +- [ 8884] = 0x7B4F, [ 8885] = 0x7B51, [ 8886] = 0x7C9F, [ 8887] = 0x7CA5, +- [ 8888] = 0x7D5E, [ 8889] = 0x7D50, [ 8890] = 0x7D68, [ 8891] = 0x7D55, +- [ 8892] = 0x7D2B, [ 8893] = 0x7D6E, [ 8894] = 0x7D72, [ 8895] = 0x7D61, +- [ 8896] = 0x7D66, [ 8897] = 0x7D62, [ 8898] = 0x7D70, [ 8899] = 0x7D73, +- [ 8900] = 0x5584, [ 8901] = 0x7FD4, [ 8902] = 0x7FD5, [ 8903] = 0x800B, +- [ 8904] = 0x8052, [ 8905] = 0x8085, [ 8906] = 0x8155, [ 8907] = 0x8154, +- [ 8908] = 0x814B, [ 8909] = 0x8151, [ 8910] = 0x814E, [ 8911] = 0x8139, +- [ 8912] = 0x8146, [ 8913] = 0x813E, [ 8914] = 0x814C, [ 8915] = 0x8153, +- [ 8916] = 0x8174, [ 8917] = 0x8212, [ 8918] = 0x821C, [ 8919] = 0x83E9, +- [ 8920] = 0x8403, [ 8921] = 0x83F8, [ 8922] = 0x840D, [ 8923] = 0x83E0, +- [ 8924] = 0x83C5, [ 8925] = 0x840B, [ 8926] = 0x83C1, [ 8927] = 0x83EF, +- [ 8928] = 0x83F1, [ 8929] = 0x83F4, [ 8930] = 0x8457, [ 8931] = 0x840A, +- [ 8932] = 0x83F0, [ 8933] = 0x840C, [ 8934] = 0x83CC, [ 8935] = 0x83FD, +- [ 8936] = 0x83F2, [ 8937] = 0x83CA, [ 8938] = 0x8438, [ 8939] = 0x840E, +- [ 8940] = 0x8404, [ 8941] = 0x83DC, [ 8942] = 0x8407, [ 8943] = 0x83D4, +- [ 8944] = 0x83DF, [ 8945] = 0x865B, [ 8946] = 0x86DF, [ 8947] = 0x86D9, +- [ 8948] = 0x86ED, [ 8949] = 0x86D4, [ 8950] = 0x86DB, [ 8951] = 0x86E4, +- [ 8952] = 0x86D0, [ 8953] = 0x86DE, [ 8954] = 0x8857, [ 8955] = 0x88C1, +- [ 8956] = 0x88C2, [ 8957] = 0x88B1, [ 8958] = 0x8983, [ 8959] = 0x8996, +- [ 8960] = 0x8A3B, [ 8961] = 0x8A60, [ 8962] = 0x8A55, [ 8963] = 0x8A5E, +- [ 8964] = 0x8A3C, [ 8965] = 0x8A41, [ 8970] = 0x8A54, [ 8971] = 0x8A5B, +- [ 8972] = 0x8A50, [ 8973] = 0x8A46, [ 8974] = 0x8A34, [ 8975] = 0x8A3A, +- [ 8976] = 0x8A36, [ 8977] = 0x8A56, [ 8978] = 0x8C61, [ 8979] = 0x8C82, +- [ 8980] = 0x8CAF, [ 8981] = 0x8CBC, [ 8982] = 0x8CB3, [ 8983] = 0x8CBD, +- [ 8984] = 0x8CC1, [ 8985] = 0x8CBB, [ 8986] = 0x8CC0, [ 8987] = 0x8CB4, +- [ 8988] = 0x8CB7, [ 8989] = 0x8CB6, [ 8990] = 0x8CBF, [ 8991] = 0x8CB8, +- [ 8992] = 0x8D8A, [ 8993] = 0x8D85, [ 8994] = 0x8D81, [ 8995] = 0x8DCE, +- [ 8996] = 0x8DDD, [ 8997] = 0x8DCB, [ 8998] = 0x8DDA, [ 8999] = 0x8DD1, +- [ 9000] = 0x8DCC, [ 9001] = 0x8DDB, [ 9002] = 0x8DC6, [ 9003] = 0x8EFB, +- [ 9004] = 0x8EF8, [ 9005] = 0x8EFC, [ 9006] = 0x8F9C, [ 9007] = 0x902E, +- [ 9008] = 0x9035, [ 9009] = 0x9031, [ 9010] = 0x9038, [ 9011] = 0x9032, +- [ 9012] = 0x9036, [ 9013] = 0x9102, [ 9014] = 0x90F5, [ 9015] = 0x9109, +- [ 9016] = 0x90FE, [ 9017] = 0x9163, [ 9018] = 0x9165, [ 9019] = 0x91CF, +- [ 9020] = 0x9214, [ 9021] = 0x9215, [ 9022] = 0x9223, [ 9023] = 0x9209, +- [ 9024] = 0x921E, [ 9025] = 0x920D, [ 9026] = 0x9210, [ 9027] = 0x9207, +- [ 9028] = 0x9211, [ 9029] = 0x9594, [ 9030] = 0x958F, [ 9031] = 0x958B, +- [ 9032] = 0x9591, [ 9067] = 0x9593, [ 9068] = 0x9592, [ 9069] = 0x958E, +- [ 9070] = 0x968A, [ 9071] = 0x968E, [ 9072] = 0x968B, [ 9073] = 0x967D, +- [ 9074] = 0x9685, [ 9075] = 0x9686, [ 9076] = 0x968D, [ 9077] = 0x9672, +- [ 9078] = 0x9684, [ 9079] = 0x96C1, [ 9080] = 0x96C5, [ 9081] = 0x96C4, +- [ 9082] = 0x96C6, [ 9083] = 0x96C7, [ 9084] = 0x96EF, [ 9085] = 0x96F2, +- [ 9086] = 0x97CC, [ 9087] = 0x9805, [ 9088] = 0x9806, [ 9089] = 0x9808, +- [ 9090] = 0x98E7, [ 9091] = 0x98EA, [ 9092] = 0x98EF, [ 9093] = 0x98E9, +- [ 9094] = 0x98F2, [ 9095] = 0x98ED, [ 9096] = 0x99AE, [ 9097] = 0x99AD, +- [ 9098] = 0x9EC3, [ 9099] = 0x9ECD, [ 9100] = 0x9ED1, [ 9101] = 0x4E82, +- [ 9102] = 0x50AD, [ 9103] = 0x50B5, [ 9104] = 0x50B2, [ 9105] = 0x50B3, +- [ 9106] = 0x50C5, [ 9107] = 0x50BE, [ 9108] = 0x50AC, [ 9109] = 0x50B7, +- [ 9110] = 0x50BB, [ 9111] = 0x50AF, [ 9112] = 0x50C7, [ 9113] = 0x527F, +- [ 9114] = 0x5277, [ 9115] = 0x527D, [ 9116] = 0x52DF, [ 9117] = 0x52E6, +- [ 9118] = 0x52E4, [ 9119] = 0x52E2, [ 9120] = 0x52E3, [ 9121] = 0x532F, +- [ 9122] = 0x55DF, [ 9123] = 0x55E8, [ 9124] = 0x55D3, [ 9125] = 0x55E6, +- [ 9126] = 0x55CE, [ 9127] = 0x55DC, [ 9128] = 0x55C7, [ 9129] = 0x55D1, +- [ 9130] = 0x55E3, [ 9131] = 0x55E4, [ 9132] = 0x55EF, [ 9133] = 0x55DA, +- [ 9134] = 0x55E1, [ 9135] = 0x55C5, [ 9136] = 0x55C6, [ 9137] = 0x55E5, +- [ 9138] = 0x55C9, [ 9139] = 0x5712, [ 9140] = 0x5713, [ 9141] = 0x585E, +- [ 9142] = 0x5851, [ 9143] = 0x5858, [ 9144] = 0x5857, [ 9145] = 0x585A, +- [ 9146] = 0x5854, [ 9147] = 0x586B, [ 9148] = 0x584C, [ 9149] = 0x586D, +- [ 9150] = 0x584A, [ 9151] = 0x5862, [ 9152] = 0x5852, [ 9153] = 0x584B, +- [ 9154] = 0x5967, [ 9155] = 0x5AC1, [ 9156] = 0x5AC9, [ 9157] = 0x5ACC, +- [ 9158] = 0x5ABE, [ 9159] = 0x5ABD, [ 9160] = 0x5ABC, [ 9165] = 0x5AB3, +- [ 9166] = 0x5AC2, [ 9167] = 0x5AB2, [ 9168] = 0x5D69, [ 9169] = 0x5D6F, +- [ 9170] = 0x5E4C, [ 9171] = 0x5E79, [ 9172] = 0x5EC9, [ 9173] = 0x5EC8, +- [ 9174] = 0x5F12, [ 9175] = 0x5F59, [ 9176] = 0x5FAC, [ 9177] = 0x5FAE, +- [ 9178] = 0x611A, [ 9179] = 0x610F, [ 9180] = 0x6148, [ 9181] = 0x611F, +- [ 9182] = 0x60F3, [ 9183] = 0x611B, [ 9184] = 0x60F9, [ 9185] = 0x6101, +- [ 9186] = 0x6108, [ 9187] = 0x614E, [ 9188] = 0x614C, [ 9189] = 0x6144, +- [ 9190] = 0x614D, [ 9191] = 0x613E, [ 9192] = 0x6134, [ 9193] = 0x6127, +- [ 9194] = 0x610D, [ 9195] = 0x6106, [ 9196] = 0x6137, [ 9197] = 0x6221, +- [ 9198] = 0x6222, [ 9199] = 0x6413, [ 9200] = 0x643E, [ 9201] = 0x641E, +- [ 9202] = 0x642A, [ 9203] = 0x642D, [ 9204] = 0x643D, [ 9205] = 0x642C, +- [ 9206] = 0x640F, [ 9207] = 0x641C, [ 9208] = 0x6414, [ 9209] = 0x640D, +- [ 9210] = 0x6436, [ 9211] = 0x6416, [ 9212] = 0x6417, [ 9213] = 0x6406, +- [ 9214] = 0x656C, [ 9215] = 0x659F, [ 9216] = 0x65B0, [ 9217] = 0x6697, +- [ 9218] = 0x6689, [ 9219] = 0x6687, [ 9220] = 0x6688, [ 9221] = 0x6696, +- [ 9222] = 0x6684, [ 9223] = 0x6698, [ 9224] = 0x668D, [ 9225] = 0x6703, +- [ 9226] = 0x6994, [ 9227] = 0x696D, [ 9262] = 0x695A, [ 9263] = 0x6977, +- [ 9264] = 0x6960, [ 9265] = 0x6954, [ 9266] = 0x6975, [ 9267] = 0x6930, +- [ 9268] = 0x6982, [ 9269] = 0x694A, [ 9270] = 0x6968, [ 9271] = 0x696B, +- [ 9272] = 0x695E, [ 9273] = 0x6953, [ 9274] = 0x6979, [ 9275] = 0x6986, +- [ 9276] = 0x695D, [ 9277] = 0x6963, [ 9278] = 0x695B, [ 9279] = 0x6B47, +- [ 9280] = 0x6B72, [ 9281] = 0x6BC0, [ 9282] = 0x6BBF, [ 9283] = 0x6BD3, +- [ 9284] = 0x6BFD, [ 9285] = 0x6EA2, [ 9286] = 0x6EAF, [ 9287] = 0x6ED3, +- [ 9288] = 0x6EB6, [ 9289] = 0x6EC2, [ 9290] = 0x6E90, [ 9291] = 0x6E9D, +- [ 9292] = 0x6EC7, [ 9293] = 0x6EC5, [ 9294] = 0x6EA5, [ 9295] = 0x6E98, +- [ 9296] = 0x6EBC, [ 9297] = 0x6EBA, [ 9298] = 0x6EAB, [ 9299] = 0x6ED1, +- [ 9300] = 0x6E96, [ 9301] = 0x6E9C, [ 9302] = 0x6EC4, [ 9303] = 0x6ED4, +- [ 9304] = 0x6EAA, [ 9305] = 0x6EA7, [ 9306] = 0x6EB4, [ 9307] = 0x714E, +- [ 9308] = 0x7159, [ 9309] = 0x7169, [ 9310] = 0x7164, [ 9311] = 0x7149, +- [ 9312] = 0x7167, [ 9313] = 0x715C, [ 9314] = 0x716C, [ 9315] = 0x7166, +- [ 9316] = 0x714C, [ 9317] = 0x7165, [ 9318] = 0x715E, [ 9319] = 0x7146, +- [ 9320] = 0x7168, [ 9321] = 0x7156, [ 9322] = 0x723A, [ 9323] = 0x7252, +- [ 9324] = 0x7337, [ 9325] = 0x7345, [ 9326] = 0x733F, [ 9327] = 0x733E, +- [ 9328] = 0x746F, [ 9329] = 0x745A, [ 9330] = 0x7455, [ 9331] = 0x745F, +- [ 9332] = 0x745E, [ 9333] = 0x7441, [ 9334] = 0x743F, [ 9335] = 0x7459, +- [ 9336] = 0x745B, [ 9337] = 0x745C, [ 9338] = 0x7576, [ 9339] = 0x7578, +- [ 9340] = 0x7600, [ 9341] = 0x75F0, [ 9342] = 0x7601, [ 9343] = 0x75F2, +- [ 9344] = 0x75F1, [ 9345] = 0x75FA, [ 9346] = 0x75FF, [ 9347] = 0x75F4, +- [ 9348] = 0x75F3, [ 9349] = 0x76DE, [ 9350] = 0x76DF, [ 9351] = 0x775B, +- [ 9352] = 0x776B, [ 9353] = 0x7766, [ 9354] = 0x775E, [ 9355] = 0x7763, +- [ 9360] = 0x7779, [ 9361] = 0x776A, [ 9362] = 0x776C, [ 9363] = 0x775C, +- [ 9364] = 0x7765, [ 9365] = 0x7768, [ 9366] = 0x7762, [ 9367] = 0x77EE, +- [ 9368] = 0x788E, [ 9369] = 0x78B0, [ 9370] = 0x7897, [ 9371] = 0x7898, +- [ 9372] = 0x788C, [ 9373] = 0x7889, [ 9374] = 0x787C, [ 9375] = 0x7891, +- [ 9376] = 0x7893, [ 9377] = 0x787F, [ 9378] = 0x797A, [ 9379] = 0x797F, +- [ 9380] = 0x7981, [ 9381] = 0x842C, [ 9382] = 0x79BD, [ 9383] = 0x7A1C, +- [ 9384] = 0x7A1A, [ 9385] = 0x7A20, [ 9386] = 0x7A14, [ 9387] = 0x7A1F, +- [ 9388] = 0x7A1E, [ 9389] = 0x7A9F, [ 9390] = 0x7AA0, [ 9391] = 0x7B77, +- [ 9392] = 0x7BC0, [ 9393] = 0x7B60, [ 9394] = 0x7B6E, [ 9395] = 0x7B67, +- [ 9396] = 0x7CB1, [ 9397] = 0x7CB3, [ 9398] = 0x7CB5, [ 9399] = 0x7D93, +- [ 9400] = 0x7D79, [ 9401] = 0x7D91, [ 9402] = 0x7D81, [ 9403] = 0x7D8F, +- [ 9404] = 0x7D5B, [ 9405] = 0x7F6E, [ 9406] = 0x7F69, [ 9407] = 0x7F6A, +- [ 9408] = 0x7F72, [ 9409] = 0x7FA9, [ 9410] = 0x7FA8, [ 9411] = 0x7FA4, +- [ 9412] = 0x8056, [ 9413] = 0x8058, [ 9414] = 0x8086, [ 9415] = 0x8084, +- [ 9416] = 0x8171, [ 9417] = 0x8170, [ 9418] = 0x8178, [ 9419] = 0x8165, +- [ 9420] = 0x816E, [ 9421] = 0x8173, [ 9422] = 0x816B, [ 9457] = 0x8179, +- [ 9458] = 0x817A, [ 9459] = 0x8166, [ 9460] = 0x8205, [ 9461] = 0x8247, +- [ 9462] = 0x8482, [ 9463] = 0x8477, [ 9464] = 0x843D, [ 9465] = 0x8431, +- [ 9466] = 0x8475, [ 9467] = 0x8466, [ 9468] = 0x846B, [ 9469] = 0x8449, +- [ 9470] = 0x846C, [ 9471] = 0x845B, [ 9472] = 0x843C, [ 9473] = 0x8435, +- [ 9474] = 0x8461, [ 9475] = 0x8463, [ 9476] = 0x8469, [ 9477] = 0x846D, +- [ 9478] = 0x8446, [ 9479] = 0x865E, [ 9480] = 0x865C, [ 9481] = 0x865F, +- [ 9482] = 0x86F9, [ 9483] = 0x8713, [ 9484] = 0x8708, [ 9485] = 0x8707, +- [ 9486] = 0x8700, [ 9487] = 0x86FE, [ 9488] = 0x86FB, [ 9489] = 0x8702, +- [ 9490] = 0x8703, [ 9491] = 0x8706, [ 9492] = 0x870A, [ 9493] = 0x8859, +- [ 9494] = 0x88DF, [ 9495] = 0x88D4, [ 9496] = 0x88D9, [ 9497] = 0x88DC, +- [ 9498] = 0x88D8, [ 9499] = 0x88DD, [ 9500] = 0x88E1, [ 9501] = 0x88CA, +- [ 9502] = 0x88D5, [ 9503] = 0x88D2, [ 9504] = 0x899C, [ 9505] = 0x89E3, +- [ 9506] = 0x8A6B, [ 9507] = 0x8A72, [ 9508] = 0x8A73, [ 9509] = 0x8A66, +- [ 9510] = 0x8A69, [ 9511] = 0x8A70, [ 9512] = 0x8A87, [ 9513] = 0x8A7C, +- [ 9514] = 0x8A63, [ 9515] = 0x8AA0, [ 9516] = 0x8A71, [ 9517] = 0x8A85, +- [ 9518] = 0x8A6D, [ 9519] = 0x8A62, [ 9520] = 0x8A6E, [ 9521] = 0x8A6C, +- [ 9522] = 0x8A79, [ 9523] = 0x8A7B, [ 9524] = 0x8A3E, [ 9525] = 0x8A68, +- [ 9526] = 0x8C62, [ 9527] = 0x8C8A, [ 9528] = 0x8C89, [ 9529] = 0x8CCA, +- [ 9530] = 0x8CC7, [ 9531] = 0x8CC8, [ 9532] = 0x8CC4, [ 9533] = 0x8CB2, +- [ 9534] = 0x8CC3, [ 9535] = 0x8CC2, [ 9536] = 0x8CC5, [ 9537] = 0x8DE1, +- [ 9538] = 0x8DDF, [ 9539] = 0x8DE8, [ 9540] = 0x8DEF, [ 9541] = 0x8DF3, +- [ 9542] = 0x8DFA, [ 9543] = 0x8DEA, [ 9544] = 0x8DE4, [ 9545] = 0x8DE6, +- [ 9546] = 0x8EB2, [ 9547] = 0x8F03, [ 9548] = 0x8F09, [ 9549] = 0x8EFE, +- [ 9550] = 0x8F0A, [ 9555] = 0x8F9F, [ 9556] = 0x8FB2, [ 9557] = 0x904B, +- [ 9558] = 0x904A, [ 9559] = 0x9053, [ 9560] = 0x9042, [ 9561] = 0x9054, +- [ 9562] = 0x903C, [ 9563] = 0x9055, [ 9564] = 0x9050, [ 9565] = 0x9047, +- [ 9566] = 0x904F, [ 9567] = 0x904E, [ 9568] = 0x904D, [ 9569] = 0x9051, +- [ 9570] = 0x903E, [ 9571] = 0x9041, [ 9572] = 0x9112, [ 9573] = 0x9117, +- [ 9574] = 0x916C, [ 9575] = 0x916A, [ 9576] = 0x9169, [ 9577] = 0x91C9, +- [ 9578] = 0x9237, [ 9579] = 0x9257, [ 9580] = 0x9238, [ 9581] = 0x923D, +- [ 9582] = 0x9240, [ 9583] = 0x923E, [ 9584] = 0x925B, [ 9585] = 0x924B, +- [ 9586] = 0x9264, [ 9587] = 0x9251, [ 9588] = 0x9234, [ 9589] = 0x9249, +- [ 9590] = 0x924D, [ 9591] = 0x9245, [ 9592] = 0x9239, [ 9593] = 0x923F, +- [ 9594] = 0x925A, [ 9595] = 0x9598, [ 9596] = 0x9698, [ 9597] = 0x9694, +- [ 9598] = 0x9695, [ 9599] = 0x96CD, [ 9600] = 0x96CB, [ 9601] = 0x96C9, +- [ 9602] = 0x96CA, [ 9603] = 0x96F7, [ 9604] = 0x96FB, [ 9605] = 0x96F9, +- [ 9606] = 0x96F6, [ 9607] = 0x9756, [ 9608] = 0x9774, [ 9609] = 0x9776, +- [ 9610] = 0x9810, [ 9611] = 0x9811, [ 9612] = 0x9813, [ 9613] = 0x980A, +- [ 9614] = 0x9812, [ 9615] = 0x980C, [ 9616] = 0x98FC, [ 9617] = 0x98F4, +- [ 9652] = 0x98FD, [ 9653] = 0x98FE, [ 9654] = 0x99B3, [ 9655] = 0x99B1, +- [ 9656] = 0x99B4, [ 9657] = 0x9AE1, [ 9658] = 0x9CE9, [ 9659] = 0x9E82, +- [ 9660] = 0x9F0E, [ 9661] = 0x9F13, [ 9662] = 0x9F20, [ 9663] = 0x50E7, +- [ 9664] = 0x50EE, [ 9665] = 0x50E5, [ 9666] = 0x50D6, [ 9667] = 0x50ED, +- [ 9668] = 0x50DA, [ 9669] = 0x50D5, [ 9670] = 0x50CF, [ 9671] = 0x50D1, +- [ 9672] = 0x50F1, [ 9673] = 0x50CE, [ 9674] = 0x50E9, [ 9675] = 0x5162, +- [ 9676] = 0x51F3, [ 9677] = 0x5283, [ 9678] = 0x5282, [ 9679] = 0x5331, +- [ 9680] = 0x53AD, [ 9681] = 0x55FE, [ 9682] = 0x5600, [ 9683] = 0x561B, +- [ 9684] = 0x5617, [ 9685] = 0x55FD, [ 9686] = 0x5614, [ 9687] = 0x5606, +- [ 9688] = 0x5609, [ 9689] = 0x560D, [ 9690] = 0x560E, [ 9691] = 0x55F7, +- [ 9692] = 0x5616, [ 9693] = 0x561F, [ 9694] = 0x5608, [ 9695] = 0x5610, +- [ 9696] = 0x55F6, [ 9697] = 0x5718, [ 9698] = 0x5716, [ 9699] = 0x5875, +- [ 9700] = 0x587E, [ 9701] = 0x5883, [ 9702] = 0x5893, [ 9703] = 0x588A, +- [ 9704] = 0x5879, [ 9705] = 0x5885, [ 9706] = 0x587D, [ 9707] = 0x58FD, +- [ 9708] = 0x5925, [ 9709] = 0x5922, [ 9710] = 0x5924, [ 9711] = 0x596A, +- [ 9712] = 0x5969, [ 9713] = 0x5AE1, [ 9714] = 0x5AE6, [ 9715] = 0x5AE9, +- [ 9716] = 0x5AD7, [ 9717] = 0x5AD6, [ 9718] = 0x5AD8, [ 9719] = 0x5AE3, +- [ 9720] = 0x5B75, [ 9721] = 0x5BDE, [ 9722] = 0x5BE7, [ 9723] = 0x5BE1, +- [ 9724] = 0x5BE5, [ 9725] = 0x5BE6, [ 9726] = 0x5BE8, [ 9727] = 0x5BE2, +- [ 9728] = 0x5BE4, [ 9729] = 0x5BDF, [ 9730] = 0x5C0D, [ 9731] = 0x5C62, +- [ 9732] = 0x5D84, [ 9733] = 0x5D87, [ 9734] = 0x5E5B, [ 9735] = 0x5E63, +- [ 9736] = 0x5E55, [ 9737] = 0x5E57, [ 9738] = 0x5E54, [ 9739] = 0x5ED3, +- [ 9740] = 0x5ED6, [ 9741] = 0x5F0A, [ 9742] = 0x5F46, [ 9743] = 0x5F70, +- [ 9744] = 0x5FB9, [ 9745] = 0x6147, [ 9750] = 0x613F, [ 9751] = 0x614B, +- [ 9752] = 0x6177, [ 9753] = 0x6162, [ 9754] = 0x6163, [ 9755] = 0x615F, +- [ 9756] = 0x615A, [ 9757] = 0x6158, [ 9758] = 0x6175, [ 9759] = 0x622A, +- [ 9760] = 0x6487, [ 9761] = 0x6458, [ 9762] = 0x6454, [ 9763] = 0x64A4, +- [ 9764] = 0x6478, [ 9765] = 0x645F, [ 9766] = 0x647A, [ 9767] = 0x6451, +- [ 9768] = 0x6467, [ 9769] = 0x6434, [ 9770] = 0x646D, [ 9771] = 0x647B, +- [ 9772] = 0x6572, [ 9773] = 0x65A1, [ 9774] = 0x65D7, [ 9775] = 0x65D6, +- [ 9776] = 0x66A2, [ 9777] = 0x66A8, [ 9778] = 0x669D, [ 9779] = 0x699C, +- [ 9780] = 0x69A8, [ 9781] = 0x6995, [ 9782] = 0x69C1, [ 9783] = 0x69AE, +- [ 9784] = 0x69D3, [ 9785] = 0x69CB, [ 9786] = 0x699B, [ 9787] = 0x69B7, +- [ 9788] = 0x69BB, [ 9789] = 0x69AB, [ 9790] = 0x69B4, [ 9791] = 0x69D0, +- [ 9792] = 0x69CD, [ 9793] = 0x69AD, [ 9794] = 0x69CC, [ 9795] = 0x69A6, +- [ 9796] = 0x69C3, [ 9797] = 0x69A3, [ 9798] = 0x6B49, [ 9799] = 0x6B4C, +- [ 9800] = 0x6C33, [ 9801] = 0x6F33, [ 9802] = 0x6F14, [ 9803] = 0x6EFE, +- [ 9804] = 0x6F13, [ 9805] = 0x6EF4, [ 9806] = 0x6F29, [ 9807] = 0x6F3E, +- [ 9808] = 0x6F20, [ 9809] = 0x6F2C, [ 9810] = 0x6F0F, [ 9811] = 0x6F02, +- [ 9812] = 0x6F22, [ 9847] = 0x6EFF, [ 9848] = 0x6EEF, [ 9849] = 0x6F06, +- [ 9850] = 0x6F31, [ 9851] = 0x6F38, [ 9852] = 0x6F32, [ 9853] = 0x6F23, +- [ 9854] = 0x6F15, [ 9855] = 0x6F2B, [ 9856] = 0x6F2F, [ 9857] = 0x6F88, +- [ 9858] = 0x6F2A, [ 9859] = 0x6EEC, [ 9860] = 0x6F01, [ 9861] = 0x6EF2, +- [ 9862] = 0x6ECC, [ 9863] = 0x6EF7, [ 9864] = 0x7194, [ 9865] = 0x7199, +- [ 9866] = 0x717D, [ 9867] = 0x718A, [ 9868] = 0x7184, [ 9869] = 0x7192, +- [ 9870] = 0x723E, [ 9871] = 0x7292, [ 9872] = 0x7296, [ 9873] = 0x7344, +- [ 9874] = 0x7350, [ 9875] = 0x7464, [ 9876] = 0x7463, [ 9877] = 0x746A, +- [ 9878] = 0x7470, [ 9879] = 0x746D, [ 9880] = 0x7504, [ 9881] = 0x7591, +- [ 9882] = 0x7627, [ 9883] = 0x760D, [ 9884] = 0x760B, [ 9885] = 0x7609, +- [ 9886] = 0x7613, [ 9887] = 0x76E1, [ 9888] = 0x76E3, [ 9889] = 0x7784, +- [ 9890] = 0x777D, [ 9891] = 0x777F, [ 9892] = 0x7761, [ 9893] = 0x78C1, +- [ 9894] = 0x789F, [ 9895] = 0x78A7, [ 9896] = 0x78B3, [ 9897] = 0x78A9, +- [ 9898] = 0x78A3, [ 9899] = 0x798E, [ 9900] = 0x798F, [ 9901] = 0x798D, +- [ 9902] = 0x7A2E, [ 9903] = 0x7A31, [ 9904] = 0x7AAA, [ 9905] = 0x7AA9, +- [ 9906] = 0x7AED, [ 9907] = 0x7AEF, [ 9908] = 0x7BA1, [ 9909] = 0x7B95, +- [ 9910] = 0x7B8B, [ 9911] = 0x7B75, [ 9912] = 0x7B97, [ 9913] = 0x7B9D, +- [ 9914] = 0x7B94, [ 9915] = 0x7B8F, [ 9916] = 0x7BB8, [ 9917] = 0x7B87, +- [ 9918] = 0x7B84, [ 9919] = 0x7CB9, [ 9920] = 0x7CBD, [ 9921] = 0x7CBE, +- [ 9922] = 0x7DBB, [ 9923] = 0x7DB0, [ 9924] = 0x7D9C, [ 9925] = 0x7DBD, +- [ 9926] = 0x7DBE, [ 9927] = 0x7DA0, [ 9928] = 0x7DCA, [ 9929] = 0x7DB4, +- [ 9930] = 0x7DB2, [ 9931] = 0x7DB1, [ 9932] = 0x7DBA, [ 9933] = 0x7DA2, +- [ 9934] = 0x7DBF, [ 9935] = 0x7DB5, [ 9936] = 0x7DB8, [ 9937] = 0x7DAD, +- [ 9938] = 0x7DD2, [ 9939] = 0x7DC7, [ 9940] = 0x7DAC, [ 9945] = 0x7F70, +- [ 9946] = 0x7FE0, [ 9947] = 0x7FE1, [ 9948] = 0x7FDF, [ 9949] = 0x805E, +- [ 9950] = 0x805A, [ 9951] = 0x8087, [ 9952] = 0x8150, [ 9953] = 0x8180, +- [ 9954] = 0x818F, [ 9955] = 0x8188, [ 9956] = 0x818A, [ 9957] = 0x817F, +- [ 9958] = 0x8182, [ 9959] = 0x81E7, [ 9960] = 0x81FA, [ 9961] = 0x8207, +- [ 9962] = 0x8214, [ 9963] = 0x821E, [ 9964] = 0x824B, [ 9965] = 0x84C9, +- [ 9966] = 0x84BF, [ 9967] = 0x84C6, [ 9968] = 0x84C4, [ 9969] = 0x8499, +- [ 9970] = 0x849E, [ 9971] = 0x84B2, [ 9972] = 0x849C, [ 9973] = 0x84CB, +- [ 9974] = 0x84B8, [ 9975] = 0x84C0, [ 9976] = 0x84D3, [ 9977] = 0x8490, +- [ 9978] = 0x84BC, [ 9979] = 0x84D1, [ 9980] = 0x84CA, [ 9981] = 0x873F, +- [ 9982] = 0x871C, [ 9983] = 0x873B, [ 9984] = 0x8722, [ 9985] = 0x8725, +- [ 9986] = 0x8734, [ 9987] = 0x8718, [ 9988] = 0x8755, [ 9989] = 0x8737, +- [ 9990] = 0x8729, [ 9991] = 0x88F3, [ 9992] = 0x8902, [ 9993] = 0x88F4, +- [ 9994] = 0x88F9, [ 9995] = 0x88F8, [ 9996] = 0x88FD, [ 9997] = 0x88E8, +- [ 9998] = 0x891A, [ 9999] = 0x88EF, [10000] = 0x8AA6, [10001] = 0x8A8C, +- [10002] = 0x8A9E, [10003] = 0x8AA3, [10004] = 0x8A8D, [10005] = 0x8AA1, +- [10006] = 0x8A93, [10007] = 0x8AA4, [10042] = 0x8AAA, [10043] = 0x8AA5, +- [10044] = 0x8AA8, [10045] = 0x8A98, [10046] = 0x8A91, [10047] = 0x8A9A, +- [10048] = 0x8AA7, [10049] = 0x8C6A, [10050] = 0x8C8D, [10051] = 0x8C8C, +- [10052] = 0x8CD3, [10053] = 0x8CD1, [10054] = 0x8CD2, [10055] = 0x8D6B, +- [10056] = 0x8D99, [10057] = 0x8D95, [10058] = 0x8DFC, [10059] = 0x8F14, +- [10060] = 0x8F12, [10061] = 0x8F15, [10062] = 0x8F13, [10063] = 0x8FA3, +- [10064] = 0x9060, [10065] = 0x9058, [10066] = 0x905C, [10067] = 0x9063, +- [10068] = 0x9059, [10069] = 0x905E, [10070] = 0x9062, [10071] = 0x905D, +- [10072] = 0x905B, [10073] = 0x9119, [10074] = 0x9118, [10075] = 0x911E, +- [10076] = 0x9175, [10077] = 0x9178, [10078] = 0x9177, [10079] = 0x9174, +- [10080] = 0x9278, [10081] = 0x9280, [10082] = 0x9285, [10083] = 0x9298, +- [10084] = 0x9296, [10085] = 0x927B, [10086] = 0x9293, [10087] = 0x929C, +- [10088] = 0x92A8, [10089] = 0x927C, [10090] = 0x9291, [10091] = 0x95A1, +- [10092] = 0x95A8, [10093] = 0x95A9, [10094] = 0x95A3, [10095] = 0x95A5, +- [10096] = 0x95A4, [10097] = 0x9699, [10098] = 0x969C, [10099] = 0x969B, +- [10100] = 0x96CC, [10101] = 0x96D2, [10102] = 0x9700, [10103] = 0x977C, +- [10104] = 0x9785, [10105] = 0x97F6, [10106] = 0x9817, [10107] = 0x9818, +- [10108] = 0x98AF, [10109] = 0x98B1, [10110] = 0x9903, [10111] = 0x9905, +- [10112] = 0x990C, [10113] = 0x9909, [10114] = 0x99C1, [10115] = 0x9AAF, +- [10116] = 0x9AB0, [10117] = 0x9AE6, [10118] = 0x9B41, [10119] = 0x9B42, +- [10120] = 0x9CF4, [10121] = 0x9CF6, [10122] = 0x9CF3, [10123] = 0x9EBC, +- [10124] = 0x9F3B, [10125] = 0x9F4A, [10126] = 0x5104, [10127] = 0x5100, +- [10128] = 0x50FB, [10129] = 0x50F5, [10130] = 0x50F9, [10131] = 0x5102, +- [10132] = 0x5108, [10133] = 0x5109, [10134] = 0x5105, [10135] = 0x51DC, +- [10140] = 0x5287, [10141] = 0x5288, [10142] = 0x5289, [10143] = 0x528D, +- [10144] = 0x528A, [10145] = 0x52F0, [10146] = 0x53B2, [10147] = 0x562E, +- [10148] = 0x563B, [10149] = 0x5639, [10150] = 0x5632, [10151] = 0x563F, +- [10152] = 0x5634, [10153] = 0x5629, [10154] = 0x5653, [10155] = 0x564E, +- [10156] = 0x5657, [10157] = 0x5674, [10158] = 0x5636, [10159] = 0x562F, +- [10160] = 0x5630, [10161] = 0x5880, [10162] = 0x589F, [10163] = 0x589E, +- [10164] = 0x58B3, [10165] = 0x589C, [10166] = 0x58AE, [10167] = 0x58A9, +- [10168] = 0x58A6, [10169] = 0x596D, [10170] = 0x5B09, [10171] = 0x5AFB, +- [10172] = 0x5B0B, [10173] = 0x5AF5, [10174] = 0x5B0C, [10175] = 0x5B08, +- [10176] = 0x5BEE, [10177] = 0x5BEC, [10178] = 0x5BE9, [10179] = 0x5BEB, +- [10180] = 0x5C64, [10181] = 0x5C65, [10182] = 0x5D9D, [10183] = 0x5D94, +- [10184] = 0x5E62, [10185] = 0x5E5F, [10186] = 0x5E61, [10187] = 0x5EE2, +- [10188] = 0x5EDA, [10189] = 0x5EDF, [10190] = 0x5EDD, [10191] = 0x5EE3, +- [10192] = 0x5EE0, [10193] = 0x5F48, [10194] = 0x5F71, [10195] = 0x5FB7, +- [10196] = 0x5FB5, [10197] = 0x6176, [10198] = 0x6167, [10199] = 0x616E, +- [10200] = 0x615D, [10201] = 0x6155, [10202] = 0x6182, [10237] = 0x617C, +- [10238] = 0x6170, [10239] = 0x616B, [10240] = 0x617E, [10241] = 0x61A7, +- [10242] = 0x6190, [10243] = 0x61AB, [10244] = 0x618E, [10245] = 0x61AC, +- [10246] = 0x619A, [10247] = 0x61A4, [10248] = 0x6194, [10249] = 0x61AE, +- [10250] = 0x622E, [10251] = 0x6469, [10252] = 0x646F, [10253] = 0x6479, +- [10254] = 0x649E, [10255] = 0x64B2, [10256] = 0x6488, [10257] = 0x6490, +- [10258] = 0x64B0, [10259] = 0x64A5, [10260] = 0x6493, [10261] = 0x6495, +- [10262] = 0x64A9, [10263] = 0x6492, [10264] = 0x64AE, [10265] = 0x64AD, +- [10266] = 0x64AB, [10267] = 0x649A, [10268] = 0x64AC, [10269] = 0x6499, +- [10270] = 0x64A2, [10271] = 0x64B3, [10272] = 0x6575, [10273] = 0x6577, +- [10274] = 0x6578, [10275] = 0x66AE, [10276] = 0x66AB, [10277] = 0x66B4, +- [10278] = 0x66B1, [10279] = 0x6A23, [10280] = 0x6A1F, [10281] = 0x69E8, +- [10282] = 0x6A01, [10283] = 0x6A1E, [10284] = 0x6A19, [10285] = 0x69FD, +- [10286] = 0x6A21, [10287] = 0x6A13, [10288] = 0x6A0A, [10289] = 0x69F3, +- [10290] = 0x6A02, [10291] = 0x6A05, [10292] = 0x69ED, [10293] = 0x6A11, +- [10294] = 0x6B50, [10295] = 0x6B4E, [10296] = 0x6BA4, [10297] = 0x6BC5, +- [10298] = 0x6BC6, [10299] = 0x6F3F, [10300] = 0x6F7C, [10301] = 0x6F84, +- [10302] = 0x6F51, [10303] = 0x6F66, [10304] = 0x6F54, [10305] = 0x6F86, +- [10306] = 0x6F6D, [10307] = 0x6F5B, [10308] = 0x6F78, [10309] = 0x6F6E, +- [10310] = 0x6F8E, [10311] = 0x6F7A, [10312] = 0x6F70, [10313] = 0x6F64, +- [10314] = 0x6F97, [10315] = 0x6F58, [10316] = 0x6ED5, [10317] = 0x6F6F, +- [10318] = 0x6F60, [10319] = 0x6F5F, [10320] = 0x719F, [10321] = 0x71AC, +- [10322] = 0x71B1, [10323] = 0x71A8, [10324] = 0x7256, [10325] = 0x729B, +- [10326] = 0x734E, [10327] = 0x7357, [10328] = 0x7469, [10329] = 0x748B, +- [10330] = 0x7483, [10335] = 0x747E, [10336] = 0x7480, [10337] = 0x757F, +- [10338] = 0x7620, [10339] = 0x7629, [10340] = 0x761F, [10341] = 0x7624, +- [10342] = 0x7626, [10343] = 0x7621, [10344] = 0x7622, [10345] = 0x769A, +- [10346] = 0x76BA, [10347] = 0x76E4, [10348] = 0x778E, [10349] = 0x7787, +- [10350] = 0x778C, [10351] = 0x7791, [10352] = 0x778B, [10353] = 0x78CB, +- [10354] = 0x78C5, [10355] = 0x78BA, [10356] = 0x78CA, [10357] = 0x78BE, +- [10358] = 0x78D5, [10359] = 0x78BC, [10360] = 0x78D0, [10361] = 0x7A3F, +- [10362] = 0x7A3C, [10363] = 0x7A40, [10364] = 0x7A3D, [10365] = 0x7A37, +- [10366] = 0x7A3B, [10367] = 0x7AAF, [10368] = 0x7AAE, [10369] = 0x7BAD, +- [10370] = 0x7BB1, [10371] = 0x7BC4, [10372] = 0x7BB4, [10373] = 0x7BC6, +- [10374] = 0x7BC7, [10375] = 0x7BC1, [10376] = 0x7BA0, [10377] = 0x7BCC, +- [10378] = 0x7CCA, [10379] = 0x7DE0, [10380] = 0x7DF4, [10381] = 0x7DEF, +- [10382] = 0x7DFB, [10383] = 0x7DD8, [10384] = 0x7DEC, [10385] = 0x7DDD, +- [10386] = 0x7DE8, [10387] = 0x7DE3, [10388] = 0x7DDA, [10389] = 0x7DDE, +- [10390] = 0x7DE9, [10391] = 0x7D9E, [10392] = 0x7DD9, [10393] = 0x7DF2, +- [10394] = 0x7DF9, [10395] = 0x7F75, [10396] = 0x7F77, [10397] = 0x7FAF, +- [10432] = 0x7FE9, [10433] = 0x8026, [10434] = 0x819B, [10435] = 0x819C, +- [10436] = 0x819D, [10437] = 0x81A0, [10438] = 0x819A, [10439] = 0x8198, +- [10440] = 0x8517, [10441] = 0x853D, [10442] = 0x851A, [10443] = 0x84EE, +- [10444] = 0x852C, [10445] = 0x852D, [10446] = 0x8513, [10447] = 0x8511, +- [10448] = 0x8523, [10449] = 0x8521, [10450] = 0x8514, [10451] = 0x84EC, +- [10452] = 0x8525, [10453] = 0x84FF, [10454] = 0x8506, [10455] = 0x8782, +- [10456] = 0x8774, [10457] = 0x8776, [10458] = 0x8760, [10459] = 0x8766, +- [10460] = 0x8778, [10461] = 0x8768, [10462] = 0x8759, [10463] = 0x8757, +- [10464] = 0x874C, [10465] = 0x8753, [10466] = 0x885B, [10467] = 0x885D, +- [10468] = 0x8910, [10469] = 0x8907, [10470] = 0x8912, [10471] = 0x8913, +- [10472] = 0x8915, [10473] = 0x890A, [10474] = 0x8ABC, [10475] = 0x8AD2, +- [10476] = 0x8AC7, [10477] = 0x8AC4, [10478] = 0x8A95, [10479] = 0x8ACB, +- [10480] = 0x8AF8, [10481] = 0x8AB2, [10482] = 0x8AC9, [10483] = 0x8AC2, +- [10484] = 0x8ABF, [10485] = 0x8AB0, [10486] = 0x8AD6, [10487] = 0x8ACD, +- [10488] = 0x8AB6, [10489] = 0x8AB9, [10490] = 0x8ADB, [10491] = 0x8C4C, +- [10492] = 0x8C4E, [10493] = 0x8C6C, [10494] = 0x8CE0, [10495] = 0x8CDE, +- [10496] = 0x8CE6, [10497] = 0x8CE4, [10498] = 0x8CEC, [10499] = 0x8CED, +- [10500] = 0x8CE2, [10501] = 0x8CE3, [10502] = 0x8CDC, [10503] = 0x8CEA, +- [10504] = 0x8CE1, [10505] = 0x8D6D, [10506] = 0x8D9F, [10507] = 0x8DA3, +- [10508] = 0x8E2B, [10509] = 0x8E10, [10510] = 0x8E1D, [10511] = 0x8E22, +- [10512] = 0x8E0F, [10513] = 0x8E29, [10514] = 0x8E1F, [10515] = 0x8E21, +- [10516] = 0x8E1E, [10517] = 0x8EBA, [10518] = 0x8F1D, [10519] = 0x8F1B, +- [10520] = 0x8F1F, [10521] = 0x8F29, [10522] = 0x8F26, [10523] = 0x8F2A, +- [10524] = 0x8F1C, [10525] = 0x8F1E, [10530] = 0x8F25, [10531] = 0x9069, +- [10532] = 0x906E, [10533] = 0x9068, [10534] = 0x906D, [10535] = 0x9077, +- [10536] = 0x9130, [10537] = 0x912D, [10538] = 0x9127, [10539] = 0x9131, +- [10540] = 0x9187, [10541] = 0x9189, [10542] = 0x918B, [10543] = 0x9183, +- [10544] = 0x92C5, [10545] = 0x92BB, [10546] = 0x92B7, [10547] = 0x92EA, +- [10548] = 0x92AC, [10549] = 0x92E4, [10550] = 0x92C1, [10551] = 0x92B3, +- [10552] = 0x92BC, [10553] = 0x92D2, [10554] = 0x92C7, [10555] = 0x92F0, +- [10556] = 0x92B2, [10557] = 0x95AD, [10558] = 0x95B1, [10559] = 0x9704, +- [10560] = 0x9706, [10561] = 0x9707, [10562] = 0x9709, [10563] = 0x9760, +- [10564] = 0x978D, [10565] = 0x978B, [10566] = 0x978F, [10567] = 0x9821, +- [10568] = 0x982B, [10569] = 0x981C, [10570] = 0x98B3, [10571] = 0x990A, +- [10572] = 0x9913, [10573] = 0x9912, [10574] = 0x9918, [10575] = 0x99DD, +- [10576] = 0x99D0, [10577] = 0x99DF, [10578] = 0x99DB, [10579] = 0x99D1, +- [10580] = 0x99D5, [10581] = 0x99D2, [10582] = 0x99D9, [10583] = 0x9AB7, +- [10584] = 0x9AEE, [10585] = 0x9AEF, [10586] = 0x9B27, [10587] = 0x9B45, +- [10588] = 0x9B44, [10589] = 0x9B77, [10590] = 0x9B6F, [10591] = 0x9D06, +- [10592] = 0x9D09, [10627] = 0x9D03, [10628] = 0x9EA9, [10629] = 0x9EBE, +- [10630] = 0x9ECE, [10631] = 0x58A8, [10632] = 0x9F52, [10633] = 0x5112, +- [10634] = 0x5118, [10635] = 0x5114, [10636] = 0x5110, [10637] = 0x5115, +- [10638] = 0x5180, [10639] = 0x51AA, [10640] = 0x51DD, [10641] = 0x5291, +- [10642] = 0x5293, [10643] = 0x52F3, [10644] = 0x5659, [10645] = 0x566B, +- [10646] = 0x5679, [10647] = 0x5669, [10648] = 0x5664, [10649] = 0x5678, +- [10650] = 0x566A, [10651] = 0x5668, [10652] = 0x5665, [10653] = 0x5671, +- [10654] = 0x566F, [10655] = 0x566C, [10656] = 0x5662, [10657] = 0x5676, +- [10658] = 0x58C1, [10659] = 0x58BE, [10660] = 0x58C7, [10661] = 0x58C5, +- [10662] = 0x596E, [10663] = 0x5B1D, [10664] = 0x5B34, [10665] = 0x5B78, +- [10666] = 0x5BF0, [10667] = 0x5C0E, [10668] = 0x5F4A, [10669] = 0x61B2, +- [10670] = 0x6191, [10671] = 0x61A9, [10672] = 0x618A, [10673] = 0x61CD, +- [10674] = 0x61B6, [10675] = 0x61BE, [10676] = 0x61CA, [10677] = 0x61C8, +- [10678] = 0x6230, [10679] = 0x64C5, [10680] = 0x64C1, [10681] = 0x64CB, +- [10682] = 0x64BB, [10683] = 0x64BC, [10684] = 0x64DA, [10685] = 0x64C4, +- [10686] = 0x64C7, [10687] = 0x64C2, [10688] = 0x64CD, [10689] = 0x64BF, +- [10690] = 0x64D2, [10691] = 0x64D4, [10692] = 0x64BE, [10693] = 0x6574, +- [10694] = 0x66C6, [10695] = 0x66C9, [10696] = 0x66B9, [10697] = 0x66C4, +- [10698] = 0x66C7, [10699] = 0x66B8, [10700] = 0x6A3D, [10701] = 0x6A38, +- [10702] = 0x6A3A, [10703] = 0x6A59, [10704] = 0x6A6B, [10705] = 0x6A58, +- [10706] = 0x6A39, [10707] = 0x6A44, [10708] = 0x6A62, [10709] = 0x6A61, +- [10710] = 0x6A4B, [10711] = 0x6A47, [10712] = 0x6A35, [10713] = 0x6A5F, +- [10714] = 0x6A48, [10715] = 0x6B59, [10716] = 0x6B77, [10717] = 0x6C05, +- [10718] = 0x6FC2, [10719] = 0x6FB1, [10720] = 0x6FA1, [10725] = 0x6FC3, +- [10726] = 0x6FA4, [10727] = 0x6FC1, [10728] = 0x6FA7, [10729] = 0x6FB3, +- [10730] = 0x6FC0, [10731] = 0x6FB9, [10732] = 0x6FB6, [10733] = 0x6FA6, +- [10734] = 0x6FA0, [10735] = 0x6FB4, [10736] = 0x71BE, [10737] = 0x71C9, +- [10738] = 0x71D0, [10739] = 0x71D2, [10740] = 0x71C8, [10741] = 0x71D5, +- [10742] = 0x71B9, [10743] = 0x71CE, [10744] = 0x71D9, [10745] = 0x71DC, +- [10746] = 0x71C3, [10747] = 0x71C4, [10748] = 0x7368, [10749] = 0x749C, +- [10750] = 0x74A3, [10751] = 0x7498, [10752] = 0x749F, [10753] = 0x749E, +- [10754] = 0x74E2, [10755] = 0x750C, [10756] = 0x750D, [10757] = 0x7634, +- [10758] = 0x7638, [10759] = 0x763A, [10760] = 0x76E7, [10761] = 0x76E5, +- [10762] = 0x77A0, [10763] = 0x779E, [10764] = 0x779F, [10765] = 0x77A5, +- [10766] = 0x78E8, [10767] = 0x78DA, [10768] = 0x78EC, [10769] = 0x78E7, +- [10770] = 0x79A6, [10771] = 0x7A4D, [10772] = 0x7A4E, [10773] = 0x7A46, +- [10774] = 0x7A4C, [10775] = 0x7A4B, [10776] = 0x7ABA, [10777] = 0x7BD9, +- [10778] = 0x7C11, [10779] = 0x7BC9, [10780] = 0x7BE4, [10781] = 0x7BDB, +- [10782] = 0x7BE1, [10783] = 0x7BE9, [10784] = 0x7BE6, [10785] = 0x7CD5, +- [10786] = 0x7CD6, [10787] = 0x7E0A, [10822] = 0x7E11, [10823] = 0x7E08, +- [10824] = 0x7E1B, [10825] = 0x7E23, [10826] = 0x7E1E, [10827] = 0x7E1D, +- [10828] = 0x7E09, [10829] = 0x7E10, [10830] = 0x7F79, [10831] = 0x7FB2, +- [10832] = 0x7FF0, [10833] = 0x7FF1, [10834] = 0x7FEE, [10835] = 0x8028, +- [10836] = 0x81B3, [10837] = 0x81A9, [10838] = 0x81A8, [10839] = 0x81FB, +- [10840] = 0x8208, [10841] = 0x8258, [10842] = 0x8259, [10843] = 0x854A, +- [10844] = 0x8559, [10845] = 0x8548, [10846] = 0x8568, [10847] = 0x8569, +- [10848] = 0x8543, [10849] = 0x8549, [10850] = 0x856D, [10851] = 0x856A, +- [10852] = 0x855E, [10853] = 0x8783, [10854] = 0x879F, [10855] = 0x879E, +- [10856] = 0x87A2, [10857] = 0x878D, [10858] = 0x8861, [10859] = 0x892A, +- [10860] = 0x8932, [10861] = 0x8925, [10862] = 0x892B, [10863] = 0x8921, +- [10864] = 0x89AA, [10865] = 0x89A6, [10866] = 0x8AE6, [10867] = 0x8AFA, +- [10868] = 0x8AEB, [10869] = 0x8AF1, [10870] = 0x8B00, [10871] = 0x8ADC, +- [10872] = 0x8AE7, [10873] = 0x8AEE, [10874] = 0x8AFE, [10875] = 0x8B01, +- [10876] = 0x8B02, [10877] = 0x8AF7, [10878] = 0x8AED, [10879] = 0x8AF3, +- [10880] = 0x8AF6, [10881] = 0x8AFC, [10882] = 0x8C6B, [10883] = 0x8C6D, +- [10884] = 0x8C93, [10885] = 0x8CF4, [10886] = 0x8E44, [10887] = 0x8E31, +- [10888] = 0x8E34, [10889] = 0x8E42, [10890] = 0x8E39, [10891] = 0x8E35, +- [10892] = 0x8F3B, [10893] = 0x8F2F, [10894] = 0x8F38, [10895] = 0x8F33, +- [10896] = 0x8FA8, [10897] = 0x8FA6, [10898] = 0x9075, [10899] = 0x9074, +- [10900] = 0x9078, [10901] = 0x9072, [10902] = 0x907C, [10903] = 0x907A, +- [10904] = 0x9134, [10905] = 0x9192, [10906] = 0x9320, [10907] = 0x9336, +- [10908] = 0x92F8, [10909] = 0x9333, [10910] = 0x932F, [10911] = 0x9322, +- [10912] = 0x92FC, [10913] = 0x932B, [10914] = 0x9304, [10915] = 0x931A, +- [10920] = 0x9310, [10921] = 0x9326, [10922] = 0x9321, [10923] = 0x9315, +- [10924] = 0x932E, [10925] = 0x9319, [10926] = 0x95BB, [10927] = 0x96A7, +- [10928] = 0x96A8, [10929] = 0x96AA, [10930] = 0x96D5, [10931] = 0x970E, +- [10932] = 0x9711, [10933] = 0x9716, [10934] = 0x970D, [10935] = 0x9713, +- [10936] = 0x970F, [10937] = 0x975B, [10938] = 0x975C, [10939] = 0x9766, +- [10940] = 0x9798, [10941] = 0x9830, [10942] = 0x9838, [10943] = 0x983B, +- [10944] = 0x9837, [10945] = 0x982D, [10946] = 0x9839, [10947] = 0x9824, +- [10948] = 0x9910, [10949] = 0x9928, [10950] = 0x991E, [10951] = 0x991B, +- [10952] = 0x9921, [10953] = 0x991A, [10954] = 0x99ED, [10955] = 0x99E2, +- [10956] = 0x99F1, [10957] = 0x9AB8, [10958] = 0x9ABC, [10959] = 0x9AFB, +- [10960] = 0x9AED, [10961] = 0x9B28, [10962] = 0x9B91, [10963] = 0x9D15, +- [10964] = 0x9D23, [10965] = 0x9D26, [10966] = 0x9D28, [10967] = 0x9D12, +- [10968] = 0x9D1B, [10969] = 0x9ED8, [10970] = 0x9ED4, [10971] = 0x9F8D, +- [10972] = 0x9F9C, [10973] = 0x512A, [10974] = 0x511F, [10975] = 0x5121, +- [10976] = 0x5132, [10977] = 0x52F5, [10978] = 0x568E, [10979] = 0x5680, +- [10980] = 0x5690, [10981] = 0x5685, [10982] = 0x5687, [11017] = 0x568F, +- [11018] = 0x58D5, [11019] = 0x58D3, [11020] = 0x58D1, [11021] = 0x58CE, +- [11022] = 0x5B30, [11023] = 0x5B2A, [11024] = 0x5B24, [11025] = 0x5B7A, +- [11026] = 0x5C37, [11027] = 0x5C68, [11028] = 0x5DBC, [11029] = 0x5DBA, +- [11030] = 0x5DBD, [11031] = 0x5DB8, [11032] = 0x5E6B, [11033] = 0x5F4C, +- [11034] = 0x5FBD, [11035] = 0x61C9, [11036] = 0x61C2, [11037] = 0x61C7, +- [11038] = 0x61E6, [11039] = 0x61CB, [11040] = 0x6232, [11041] = 0x6234, +- [11042] = 0x64CE, [11043] = 0x64CA, [11044] = 0x64D8, [11045] = 0x64E0, +- [11046] = 0x64F0, [11047] = 0x64E6, [11048] = 0x64EC, [11049] = 0x64F1, +- [11050] = 0x64E2, [11051] = 0x64ED, [11052] = 0x6582, [11053] = 0x6583, +- [11054] = 0x66D9, [11055] = 0x66D6, [11056] = 0x6A80, [11057] = 0x6A94, +- [11058] = 0x6A84, [11059] = 0x6AA2, [11060] = 0x6A9C, [11061] = 0x6ADB, +- [11062] = 0x6AA3, [11063] = 0x6A7E, [11064] = 0x6A97, [11065] = 0x6A90, +- [11066] = 0x6AA0, [11067] = 0x6B5C, [11068] = 0x6BAE, [11069] = 0x6BDA, +- [11070] = 0x6C08, [11071] = 0x6FD8, [11072] = 0x6FF1, [11073] = 0x6FDF, +- [11074] = 0x6FE0, [11075] = 0x6FDB, [11076] = 0x6FE4, [11077] = 0x6FEB, +- [11078] = 0x6FEF, [11079] = 0x6F80, [11080] = 0x6FEC, [11081] = 0x6FE1, +- [11082] = 0x6FE9, [11083] = 0x6FD5, [11084] = 0x6FEE, [11085] = 0x6FF0, +- [11086] = 0x71E7, [11087] = 0x71DF, [11088] = 0x71EE, [11089] = 0x71E6, +- [11090] = 0x71E5, [11091] = 0x71ED, [11092] = 0x71EC, [11093] = 0x71F4, +- [11094] = 0x71E0, [11095] = 0x7235, [11096] = 0x7246, [11097] = 0x7370, +- [11098] = 0x7372, [11099] = 0x74A9, [11100] = 0x74B0, [11101] = 0x74A6, +- [11102] = 0x74A8, [11103] = 0x7646, [11104] = 0x7642, [11105] = 0x764C, +- [11106] = 0x76EA, [11107] = 0x77B3, [11108] = 0x77AA, [11109] = 0x77B0, +- [11110] = 0x77AC, [11115] = 0x77A7, [11116] = 0x77AD, [11117] = 0x77EF, +- [11118] = 0x78F7, [11119] = 0x78FA, [11120] = 0x78F4, [11121] = 0x78EF, +- [11122] = 0x7901, [11123] = 0x79A7, [11124] = 0x79AA, [11125] = 0x7A57, +- [11126] = 0x7ABF, [11127] = 0x7C07, [11128] = 0x7C0D, [11129] = 0x7BFE, +- [11130] = 0x7BF7, [11131] = 0x7C0C, [11132] = 0x7BE0, [11133] = 0x7CE0, +- [11134] = 0x7CDC, [11135] = 0x7CDE, [11136] = 0x7CE2, [11137] = 0x7CDF, +- [11138] = 0x7CD9, [11139] = 0x7CDD, [11140] = 0x7E2E, [11141] = 0x7E3E, +- [11142] = 0x7E46, [11143] = 0x7E37, [11144] = 0x7E32, [11145] = 0x7E43, +- [11146] = 0x7E2B, [11147] = 0x7E3D, [11148] = 0x7E31, [11149] = 0x7E45, +- [11150] = 0x7E41, [11151] = 0x7E34, [11152] = 0x7E39, [11153] = 0x7E48, +- [11154] = 0x7E35, [11155] = 0x7E3F, [11156] = 0x7E2F, [11157] = 0x7F44, +- [11158] = 0x7FF3, [11159] = 0x7FFC, [11160] = 0x8071, [11161] = 0x8072, +- [11162] = 0x8070, [11163] = 0x806F, [11164] = 0x8073, [11165] = 0x81C6, +- [11166] = 0x81C3, [11167] = 0x81BA, [11168] = 0x81C2, [11169] = 0x81C0, +- [11170] = 0x81BF, [11171] = 0x81BD, [11172] = 0x81C9, [11173] = 0x81BE, +- [11174] = 0x81E8, [11175] = 0x8209, [11176] = 0x8271, [11177] = 0x85AA, +- [11212] = 0x8584, [11213] = 0x857E, [11214] = 0x859C, [11215] = 0x8591, +- [11216] = 0x8594, [11217] = 0x85AF, [11218] = 0x859B, [11219] = 0x8587, +- [11220] = 0x85A8, [11221] = 0x858A, [11222] = 0x8667, [11223] = 0x87C0, +- [11224] = 0x87D1, [11225] = 0x87B3, [11226] = 0x87D2, [11227] = 0x87C6, +- [11228] = 0x87AB, [11229] = 0x87BB, [11230] = 0x87BA, [11231] = 0x87C8, +- [11232] = 0x87CB, [11233] = 0x893B, [11234] = 0x8936, [11235] = 0x8944, +- [11236] = 0x8938, [11237] = 0x893D, [11238] = 0x89AC, [11239] = 0x8B0E, +- [11240] = 0x8B17, [11241] = 0x8B19, [11242] = 0x8B1B, [11243] = 0x8B0A, +- [11244] = 0x8B20, [11245] = 0x8B1D, [11246] = 0x8B04, [11247] = 0x8B10, +- [11248] = 0x8C41, [11249] = 0x8C3F, [11250] = 0x8C73, [11251] = 0x8CFA, +- [11252] = 0x8CFD, [11253] = 0x8CFC, [11254] = 0x8CF8, [11255] = 0x8CFB, +- [11256] = 0x8DA8, [11257] = 0x8E49, [11258] = 0x8E4B, [11259] = 0x8E48, +- [11260] = 0x8E4A, [11261] = 0x8F44, [11262] = 0x8F3E, [11263] = 0x8F42, +- [11264] = 0x8F45, [11265] = 0x8F3F, [11266] = 0x907F, [11267] = 0x907D, +- [11268] = 0x9084, [11269] = 0x9081, [11270] = 0x9082, [11271] = 0x9080, +- [11272] = 0x9139, [11273] = 0x91A3, [11274] = 0x919E, [11275] = 0x919C, +- [11276] = 0x934D, [11277] = 0x9382, [11278] = 0x9328, [11279] = 0x9375, +- [11280] = 0x934A, [11281] = 0x9365, [11282] = 0x934B, [11283] = 0x9318, +- [11284] = 0x937E, [11285] = 0x936C, [11286] = 0x935B, [11287] = 0x9370, +- [11288] = 0x935A, [11289] = 0x9354, [11290] = 0x95CA, [11291] = 0x95CB, +- [11292] = 0x95CC, [11293] = 0x95C8, [11294] = 0x95C6, [11295] = 0x96B1, +- [11296] = 0x96B8, [11297] = 0x96D6, [11298] = 0x971C, [11299] = 0x971E, +- [11300] = 0x97A0, [11301] = 0x97D3, [11302] = 0x9846, [11303] = 0x98B6, +- [11304] = 0x9935, [11305] = 0x9A01, [11310] = 0x99FF, [11311] = 0x9BAE, +- [11312] = 0x9BAB, [11313] = 0x9BAA, [11314] = 0x9BAD, [11315] = 0x9D3B, +- [11316] = 0x9D3F, [11317] = 0x9E8B, [11318] = 0x9ECF, [11319] = 0x9EDE, +- [11320] = 0x9EDC, [11321] = 0x9EDD, [11322] = 0x9EDB, [11323] = 0x9F3E, +- [11324] = 0x9F4B, [11325] = 0x53E2, [11326] = 0x5695, [11327] = 0x56AE, +- [11328] = 0x58D9, [11329] = 0x58D8, [11330] = 0x5B38, [11331] = 0x5F5D, +- [11332] = 0x61E3, [11333] = 0x6233, [11334] = 0x64F4, [11335] = 0x64F2, +- [11336] = 0x64FE, [11337] = 0x6506, [11338] = 0x64FA, [11339] = 0x64FB, +- [11340] = 0x64F7, [11341] = 0x65B7, [11342] = 0x66DC, [11343] = 0x6726, +- [11344] = 0x6AB3, [11345] = 0x6AAC, [11346] = 0x6AC3, [11347] = 0x6ABB, +- [11348] = 0x6AB8, [11349] = 0x6AC2, [11350] = 0x6AAE, [11351] = 0x6AAF, +- [11352] = 0x6B5F, [11353] = 0x6B78, [11354] = 0x6BAF, [11355] = 0x7009, +- [11356] = 0x700B, [11357] = 0x6FFE, [11358] = 0x7006, [11359] = 0x6FFA, +- [11360] = 0x7011, [11361] = 0x700F, [11362] = 0x71FB, [11363] = 0x71FC, +- [11364] = 0x71FE, [11365] = 0x71F8, [11366] = 0x7377, [11367] = 0x7375, +- [11368] = 0x74A7, [11369] = 0x74BF, [11370] = 0x7515, [11371] = 0x7656, +- [11372] = 0x7658, [11407] = 0x7652, [11408] = 0x77BD, [11409] = 0x77BF, +- [11410] = 0x77BB, [11411] = 0x77BC, [11412] = 0x790E, [11413] = 0x79AE, +- [11414] = 0x7A61, [11415] = 0x7A62, [11416] = 0x7A60, [11417] = 0x7AC4, +- [11418] = 0x7AC5, [11419] = 0x7C2B, [11420] = 0x7C27, [11421] = 0x7C2A, +- [11422] = 0x7C1E, [11423] = 0x7C23, [11424] = 0x7C21, [11425] = 0x7CE7, +- [11426] = 0x7E54, [11427] = 0x7E55, [11428] = 0x7E5E, [11429] = 0x7E5A, +- [11430] = 0x7E61, [11431] = 0x7E52, [11432] = 0x7E59, [11433] = 0x7F48, +- [11434] = 0x7FF9, [11435] = 0x7FFB, [11436] = 0x8077, [11437] = 0x8076, +- [11438] = 0x81CD, [11439] = 0x81CF, [11440] = 0x820A, [11441] = 0x85CF, +- [11442] = 0x85A9, [11443] = 0x85CD, [11444] = 0x85D0, [11445] = 0x85C9, +- [11446] = 0x85B0, [11447] = 0x85BA, [11448] = 0x85B9, [11449] = 0x85A6, +- [11450] = 0x87EF, [11451] = 0x87EC, [11452] = 0x87F2, [11453] = 0x87E0, +- [11454] = 0x8986, [11455] = 0x89B2, [11456] = 0x89F4, [11457] = 0x8B28, +- [11458] = 0x8B39, [11459] = 0x8B2C, [11460] = 0x8B2B, [11461] = 0x8C50, +- [11462] = 0x8D05, [11463] = 0x8E59, [11464] = 0x8E63, [11465] = 0x8E66, +- [11466] = 0x8E64, [11467] = 0x8E5F, [11468] = 0x8E55, [11469] = 0x8EC0, +- [11470] = 0x8F49, [11471] = 0x8F4D, [11472] = 0x9087, [11473] = 0x9083, +- [11474] = 0x9088, [11475] = 0x91AB, [11476] = 0x91AC, [11477] = 0x91D0, +- [11478] = 0x9394, [11479] = 0x938A, [11480] = 0x9396, [11481] = 0x93A2, +- [11482] = 0x93B3, [11483] = 0x93AE, [11484] = 0x93AC, [11485] = 0x93B0, +- [11486] = 0x9398, [11487] = 0x939A, [11488] = 0x9397, [11489] = 0x95D4, +- [11490] = 0x95D6, [11491] = 0x95D0, [11492] = 0x95D5, [11493] = 0x96E2, +- [11494] = 0x96DC, [11495] = 0x96D9, [11496] = 0x96DB, [11497] = 0x96DE, +- [11498] = 0x9724, [11499] = 0x97A3, [11500] = 0x97A6, [11505] = 0x97AD, +- [11506] = 0x97F9, [11507] = 0x984D, [11508] = 0x984F, [11509] = 0x984C, +- [11510] = 0x984E, [11511] = 0x9853, [11512] = 0x98BA, [11513] = 0x993E, +- [11514] = 0x993F, [11515] = 0x993D, [11516] = 0x992E, [11517] = 0x99A5, +- [11518] = 0x9A0E, [11519] = 0x9AC1, [11520] = 0x9B03, [11521] = 0x9B06, +- [11522] = 0x9B4F, [11523] = 0x9B4E, [11524] = 0x9B4D, [11525] = 0x9BCA, +- [11526] = 0x9BC9, [11527] = 0x9BFD, [11528] = 0x9BC8, [11529] = 0x9BC0, +- [11530] = 0x9D51, [11531] = 0x9D5D, [11532] = 0x9D60, [11533] = 0x9EE0, +- [11534] = 0x9F15, [11535] = 0x9F2C, [11536] = 0x5133, [11537] = 0x56A5, +- [11538] = 0x58DE, [11539] = 0x58DF, [11540] = 0x58E2, [11541] = 0x5BF5, +- [11542] = 0x9F90, [11543] = 0x5EEC, [11544] = 0x61F2, [11545] = 0x61F7, +- [11546] = 0x61F6, [11547] = 0x61F5, [11548] = 0x6500, [11549] = 0x650F, +- [11550] = 0x66E0, [11551] = 0x66DD, [11552] = 0x6AE5, [11553] = 0x6ADD, +- [11554] = 0x6ADA, [11555] = 0x6AD3, [11556] = 0x701B, [11557] = 0x701F, +- [11558] = 0x7028, [11559] = 0x701A, [11560] = 0x701D, [11561] = 0x7015, +- [11562] = 0x7018, [11563] = 0x7206, [11564] = 0x720D, [11565] = 0x7258, +- [11566] = 0x72A2, [11567] = 0x7378, [11602] = 0x737A, [11603] = 0x74BD, +- [11604] = 0x74CA, [11605] = 0x74E3, [11606] = 0x7587, [11607] = 0x7586, +- [11608] = 0x765F, [11609] = 0x7661, [11610] = 0x77C7, [11611] = 0x7919, +- [11612] = 0x79B1, [11613] = 0x7A6B, [11614] = 0x7A69, [11615] = 0x7C3E, +- [11616] = 0x7C3F, [11617] = 0x7C38, [11618] = 0x7C3D, [11619] = 0x7C37, +- [11620] = 0x7C40, [11621] = 0x7E6B, [11622] = 0x7E6D, [11623] = 0x7E79, +- [11624] = 0x7E69, [11625] = 0x7E6A, [11626] = 0x7F85, [11627] = 0x7E73, +- [11628] = 0x7FB6, [11629] = 0x7FB9, [11630] = 0x7FB8, [11631] = 0x81D8, +- [11632] = 0x85E9, [11633] = 0x85DD, [11634] = 0x85EA, [11635] = 0x85D5, +- [11636] = 0x85E4, [11637] = 0x85E5, [11638] = 0x85F7, [11639] = 0x87FB, +- [11640] = 0x8805, [11641] = 0x880D, [11642] = 0x87F9, [11643] = 0x87FE, +- [11644] = 0x8960, [11645] = 0x895F, [11646] = 0x8956, [11647] = 0x895E, +- [11648] = 0x8B41, [11649] = 0x8B5C, [11650] = 0x8B58, [11651] = 0x8B49, +- [11652] = 0x8B5A, [11653] = 0x8B4E, [11654] = 0x8B4F, [11655] = 0x8B46, +- [11656] = 0x8B59, [11657] = 0x8D08, [11658] = 0x8D0A, [11659] = 0x8E7C, +- [11660] = 0x8E72, [11661] = 0x8E87, [11662] = 0x8E76, [11663] = 0x8E6C, +- [11664] = 0x8E7A, [11665] = 0x8E74, [11666] = 0x8F54, [11667] = 0x8F4E, +- [11668] = 0x8FAD, [11669] = 0x908A, [11670] = 0x908B, [11671] = 0x91B1, +- [11672] = 0x91AE, [11673] = 0x93E1, [11674] = 0x93D1, [11675] = 0x93DF, +- [11676] = 0x93C3, [11677] = 0x93C8, [11678] = 0x93DC, [11679] = 0x93DD, +- [11680] = 0x93D6, [11681] = 0x93E2, [11682] = 0x93CD, [11683] = 0x93D8, +- [11684] = 0x93E4, [11685] = 0x93D7, [11686] = 0x93E8, [11687] = 0x95DC, +- [11688] = 0x96B4, [11689] = 0x96E3, [11690] = 0x972A, [11691] = 0x9727, +- [11692] = 0x9761, [11693] = 0x97DC, [11694] = 0x97FB, [11695] = 0x985E, +- [11700] = 0x9858, [11701] = 0x985B, [11702] = 0x98BC, [11703] = 0x9945, +- [11704] = 0x9949, [11705] = 0x9A16, [11706] = 0x9A19, [11707] = 0x9B0D, +- [11708] = 0x9BE8, [11709] = 0x9BE7, [11710] = 0x9BD6, [11711] = 0x9BDB, +- [11712] = 0x9D89, [11713] = 0x9D61, [11714] = 0x9D72, [11715] = 0x9D6A, +- [11716] = 0x9D6C, [11717] = 0x9E92, [11718] = 0x9E97, [11719] = 0x9E93, +- [11720] = 0x9EB4, [11721] = 0x52F8, [11722] = 0x56A8, [11723] = 0x56B7, +- [11724] = 0x56B6, [11725] = 0x56B4, [11726] = 0x56BC, [11727] = 0x58E4, +- [11728] = 0x5B40, [11729] = 0x5B43, [11730] = 0x5B7D, [11731] = 0x5BF6, +- [11732] = 0x5DC9, [11733] = 0x61F8, [11734] = 0x61FA, [11735] = 0x6518, +- [11736] = 0x6514, [11737] = 0x6519, [11738] = 0x66E6, [11739] = 0x6727, +- [11740] = 0x6AEC, [11741] = 0x703E, [11742] = 0x7030, [11743] = 0x7032, +- [11744] = 0x7210, [11745] = 0x737B, [11746] = 0x74CF, [11747] = 0x7662, +- [11748] = 0x7665, [11749] = 0x7926, [11750] = 0x792A, [11751] = 0x792C, +- [11752] = 0x792B, [11753] = 0x7AC7, [11754] = 0x7AF6, [11755] = 0x7C4C, +- [11756] = 0x7C43, [11757] = 0x7C4D, [11758] = 0x7CEF, [11759] = 0x7CF0, +- [11760] = 0x8FAE, [11761] = 0x7E7D, [11762] = 0x7E7C, [11797] = 0x7E82, +- [11798] = 0x7F4C, [11799] = 0x8000, [11800] = 0x81DA, [11801] = 0x8266, +- [11802] = 0x85FB, [11803] = 0x85F9, [11804] = 0x8611, [11805] = 0x85FA, +- [11806] = 0x8606, [11807] = 0x860B, [11808] = 0x8607, [11809] = 0x860A, +- [11810] = 0x8814, [11811] = 0x8815, [11812] = 0x8964, [11813] = 0x89BA, +- [11814] = 0x89F8, [11815] = 0x8B70, [11816] = 0x8B6C, [11817] = 0x8B66, +- [11818] = 0x8B6F, [11819] = 0x8B5F, [11820] = 0x8B6B, [11821] = 0x8D0F, +- [11822] = 0x8D0D, [11823] = 0x8E89, [11824] = 0x8E81, [11825] = 0x8E85, +- [11826] = 0x8E82, [11827] = 0x91B4, [11828] = 0x91CB, [11829] = 0x9418, +- [11830] = 0x9403, [11831] = 0x93FD, [11832] = 0x95E1, [11833] = 0x9730, +- [11834] = 0x98C4, [11835] = 0x9952, [11836] = 0x9951, [11837] = 0x99A8, +- [11838] = 0x9A2B, [11839] = 0x9A30, [11840] = 0x9A37, [11841] = 0x9A35, +- [11842] = 0x9C13, [11843] = 0x9C0D, [11844] = 0x9E79, [11845] = 0x9EB5, +- [11846] = 0x9EE8, [11847] = 0x9F2F, [11848] = 0x9F5F, [11849] = 0x9F63, +- [11850] = 0x9F61, [11851] = 0x5137, [11852] = 0x5138, [11853] = 0x56C1, +- [11854] = 0x56C0, [11855] = 0x56C2, [11856] = 0x5914, [11857] = 0x5C6C, +- [11858] = 0x5DCD, [11859] = 0x61FC, [11860] = 0x61FE, [11861] = 0x651D, +- [11862] = 0x651C, [11863] = 0x6595, [11864] = 0x66E9, [11865] = 0x6AFB, +- [11866] = 0x6B04, [11867] = 0x6AFA, [11868] = 0x6BB2, [11869] = 0x704C, +- [11870] = 0x721B, [11871] = 0x72A7, [11872] = 0x74D6, [11873] = 0x74D4, +- [11874] = 0x7669, [11875] = 0x77D3, [11876] = 0x7C50, [11877] = 0x7E8F, +- [11878] = 0x7E8C, [11879] = 0x7FBC, [11880] = 0x8617, [11881] = 0x862D, +- [11882] = 0x861A, [11883] = 0x8823, [11884] = 0x8822, [11885] = 0x8821, +- [11886] = 0x881F, [11887] = 0x896A, [11888] = 0x896C, [11889] = 0x89BD, +- [11890] = 0x8B74, [11895] = 0x8B77, [11896] = 0x8B7D, [11897] = 0x8D13, +- [11898] = 0x8E8A, [11899] = 0x8E8D, [11900] = 0x8E8B, [11901] = 0x8F5F, +- [11902] = 0x8FAF, [11903] = 0x91BA, [11904] = 0x942E, [11905] = 0x9433, +- [11906] = 0x9435, [11907] = 0x943A, [11908] = 0x9438, [11909] = 0x9432, +- [11910] = 0x942B, [11911] = 0x95E2, [11912] = 0x9738, [11913] = 0x9739, +- [11914] = 0x9732, [11915] = 0x97FF, [11916] = 0x9867, [11917] = 0x9865, +- [11918] = 0x9957, [11919] = 0x9A45, [11920] = 0x9A43, [11921] = 0x9A40, +- [11922] = 0x9A3E, [11923] = 0x9ACF, [11924] = 0x9B54, [11925] = 0x9B51, +- [11926] = 0x9C2D, [11927] = 0x9C25, [11928] = 0x9DAF, [11929] = 0x9DB4, +- [11930] = 0x9DC2, [11931] = 0x9DB8, [11932] = 0x9E9D, [11933] = 0x9EEF, +- [11934] = 0x9F19, [11935] = 0x9F5C, [11936] = 0x9F66, [11937] = 0x9F67, +- [11938] = 0x513C, [11939] = 0x513B, [11940] = 0x56C8, [11941] = 0x56CA, +- [11942] = 0x56C9, [11943] = 0x5B7F, [11944] = 0x5DD4, [11945] = 0x5DD2, +- [11946] = 0x5F4E, [11947] = 0x61FF, [11948] = 0x6524, [11949] = 0x6B0A, +- [11950] = 0x6B61, [11951] = 0x7051, [11952] = 0x7058, [11953] = 0x7380, +- [11954] = 0x74E4, [11955] = 0x758A, [11956] = 0x766E, [11957] = 0x766C, +- [11992] = 0x79B3, [11993] = 0x7C60, [11994] = 0x7C5F, [11995] = 0x807E, +- [11996] = 0x807D, [11997] = 0x81DF, [11998] = 0x8972, [11999] = 0x896F, +- [12000] = 0x89FC, [12001] = 0x8B80, [12002] = 0x8D16, [12003] = 0x8D17, +- [12004] = 0x8E91, [12005] = 0x8E93, [12006] = 0x8F61, [12007] = 0x9148, +- [12008] = 0x9444, [12009] = 0x9451, [12010] = 0x9452, [12011] = 0x973D, +- [12012] = 0x973E, [12013] = 0x97C3, [12014] = 0x97C1, [12015] = 0x986B, +- [12016] = 0x9955, [12017] = 0x9A55, [12018] = 0x9A4D, [12019] = 0x9AD2, +- [12020] = 0x9B1A, [12021] = 0x9C49, [12022] = 0x9C31, [12023] = 0x9C3E, +- [12024] = 0x9C3B, [12025] = 0x9DD3, [12026] = 0x9DD7, [12027] = 0x9F34, +- [12028] = 0x9F6C, [12029] = 0x9F6A, [12030] = 0x9F94, [12031] = 0x56CC, +- [12032] = 0x5DD6, [12033] = 0x6200, [12034] = 0x6523, [12035] = 0x652B, +- [12036] = 0x652A, [12037] = 0x66EC, [12038] = 0x6B10, [12039] = 0x74DA, +- [12040] = 0x7ACA, [12041] = 0x7C64, [12042] = 0x7C63, [12043] = 0x7C65, +- [12044] = 0x7E93, [12045] = 0x7E96, [12046] = 0x7E94, [12047] = 0x81E2, +- [12048] = 0x8638, [12049] = 0x863F, [12050] = 0x8831, [12051] = 0x8B8A, +- [12052] = 0x9090, [12053] = 0x908F, [12054] = 0x9463, [12055] = 0x9460, +- [12056] = 0x9464, [12057] = 0x9768, [12058] = 0x986F, [12059] = 0x995C, +- [12060] = 0x9A5A, [12061] = 0x9A5B, [12062] = 0x9A57, [12063] = 0x9AD3, +- [12064] = 0x9AD4, [12065] = 0x9AD1, [12066] = 0x9C54, [12067] = 0x9C57, +- [12068] = 0x9C56, [12069] = 0x9DE5, [12070] = 0x9E9F, [12071] = 0x9EF4, +- [12072] = 0x56D1, [12073] = 0x58E9, [12074] = 0x652C, [12075] = 0x705E, +- [12076] = 0x7671, [12077] = 0x7672, [12078] = 0x77D7, [12079] = 0x7F50, +- [12080] = 0x7F88, [12081] = 0x8836, [12082] = 0x8839, [12083] = 0x8862, +- [12084] = 0x8B93, [12085] = 0x8B92, [12090] = 0x8B96, [12091] = 0x8277, +- [12092] = 0x8D1B, [12093] = 0x91C0, [12094] = 0x946A, [12095] = 0x9742, +- [12096] = 0x9748, [12097] = 0x9744, [12098] = 0x97C6, [12099] = 0x9870, +- [12100] = 0x9A5F, [12101] = 0x9B22, [12102] = 0x9B58, [12103] = 0x9C5F, +- [12104] = 0x9DF9, [12105] = 0x9DFA, [12106] = 0x9E7C, [12107] = 0x9E7D, +- [12108] = 0x9F07, [12109] = 0x9F77, [12110] = 0x9F72, [12111] = 0x5EF3, +- [12112] = 0x6B16, [12113] = 0x7063, [12114] = 0x7C6C, [12115] = 0x7C6E, +- [12116] = 0x883B, [12117] = 0x89C0, [12118] = 0x8EA1, [12119] = 0x91C1, +- [12120] = 0x9472, [12121] = 0x9470, [12122] = 0x9871, [12123] = 0x995E, +- [12124] = 0x9AD6, [12125] = 0x9B23, [12126] = 0x9ECC, [12127] = 0x7064, +- [12128] = 0x77DA, [12129] = 0x8B9A, [12130] = 0x9477, [12131] = 0x97C9, +- [12132] = 0x9A62, [12133] = 0x9A65, [12134] = 0x7E9C, [12135] = 0x8B9C, +- [12136] = 0x8EAA, [12137] = 0x91C5, [12138] = 0x947D, [12139] = 0x947E, +- [12140] = 0x947C, [12141] = 0x9C77, [12142] = 0x9C78, [12143] = 0x9EF7, +- [12144] = 0x8C54, [12145] = 0x947F, [12146] = 0x9E1A, [12147] = 0x7228, +- [12148] = 0x9A6A, [12149] = 0x9B31, [12150] = 0x9E1B, [12151] = 0x9E1E, +- [12152] = 0x7C72, [12187] = 0x2460, [12188] = 0x2461, [12189] = 0x2462, +- [12190] = 0x2463, [12191] = 0x2464, [12192] = 0x2465, [12193] = 0x2466, +- [12194] = 0x2467, [12195] = 0x2468, [12196] = 0x2469, [12197] = 0x2474, +- [12198] = 0x2475, [12199] = 0x2476, [12200] = 0x2477, [12201] = 0x2478, +- [12202] = 0x2479, [12203] = 0x247A, [12204] = 0x247B, [12205] = 0x247C, +- [12206] = 0x247D, [12207] = 0x2170, [12208] = 0x2171, [12209] = 0x2172, +- [12210] = 0x2173, [12211] = 0x2174, [12212] = 0x2175, [12213] = 0x2176, +- [12214] = 0x2177, [12215] = 0x2178, [12216] = 0x2179, [12217] = 0x4E36, +- [12218] = 0x4E3F, [12219] = 0x4E85, [12220] = 0x4EA0, [12221] = 0x5182, +- [12222] = 0x5196, [12223] = 0x51AB, [12224] = 0x52F9, [12225] = 0x5338, +- [12226] = 0x5369, [12227] = 0x53B6, [12228] = 0x590A, [12229] = 0x5B80, +- [12230] = 0x5DDB, [12231] = 0x2F33, [12232] = 0x5E7F, [12234] = 0x5F50, +- [12235] = 0x5F61, [12236] = 0x6534, [12238] = 0x7592, [12240] = 0x8FB5, +- [12242] = 0x00A8, [12243] = 0x02C6, [12244] = 0x30FD, [12245] = 0x30FE, +- [12246] = 0x309D, [12247] = 0x309E, [12250] = 0x3005, [12251] = 0x3006, +- [12252] = 0x3007, [12253] = 0x30FC, [12254] = 0xFF3B, [12255] = 0xFF3D, +- [12256] = 0x273D, [12257] = 0x3041, [12258] = 0x3042, [12259] = 0x3043, +- [12260] = 0x3044, [12261] = 0x3045, [12262] = 0x3046, [12263] = 0x3047, +- [12264] = 0x3048, [12265] = 0x3049, [12266] = 0x304A, [12267] = 0x304B, +- [12268] = 0x304C, [12269] = 0x304D, [12270] = 0x304E, [12271] = 0x304F, +- [12272] = 0x3050, [12273] = 0x3051, [12274] = 0x3052, [12275] = 0x3053, +- [12276] = 0x3054, [12277] = 0x3055, [12278] = 0x3056, [12279] = 0x3057, +- [12280] = 0x3058, [12285] = 0x3059, [12286] = 0x305A, [12287] = 0x305B, +- [12288] = 0x305C, [12289] = 0x305D, [12290] = 0x305E, [12291] = 0x305F, +- [12292] = 0x3060, [12293] = 0x3061, [12294] = 0x3062, [12295] = 0x3063, +- [12296] = 0x3064, [12297] = 0x3065, [12298] = 0x3066, [12299] = 0x3067, +- [12300] = 0x3068, [12301] = 0x3069, [12302] = 0x306A, [12303] = 0x306B, +- [12304] = 0x306C, [12305] = 0x306D, [12306] = 0x306E, [12307] = 0x306F, +- [12308] = 0x3070, [12309] = 0x3071, [12310] = 0x3072, [12311] = 0x3073, +- [12312] = 0x3074, [12313] = 0x3075, [12314] = 0x3076, [12315] = 0x3077, +- [12316] = 0x3078, [12317] = 0x3079, [12318] = 0x307A, [12319] = 0x307B, +- [12320] = 0x307C, [12321] = 0x307D, [12322] = 0x307E, [12323] = 0x307F, +- [12324] = 0x3080, [12325] = 0x3081, [12326] = 0x3082, [12327] = 0x3083, +- [12328] = 0x3084, [12329] = 0x3085, [12330] = 0x3086, [12331] = 0x3087, +- [12332] = 0x3088, [12333] = 0x3089, [12334] = 0x308A, [12335] = 0x308B, +- [12336] = 0x308C, [12337] = 0x308D, [12338] = 0x308E, [12339] = 0x308F, +- [12340] = 0x3090, [12341] = 0x3091, [12342] = 0x3092, [12343] = 0x3093, +- [12344] = 0x30A1, [12345] = 0x30A2, [12346] = 0x30A3, [12347] = 0x30A4, +- [12382] = 0x30A5, [12383] = 0x30A6, [12384] = 0x30A7, [12385] = 0x30A8, +- [12386] = 0x30A9, [12387] = 0x30AA, [12388] = 0x30AB, [12389] = 0x30AC, +- [12390] = 0x30AD, [12391] = 0x30AE, [12392] = 0x30AF, [12393] = 0x30B0, +- [12394] = 0x30B1, [12395] = 0x30B2, [12396] = 0x30B3, [12397] = 0x30B4, +- [12398] = 0x30B5, [12399] = 0x30B6, [12400] = 0x30B7, [12401] = 0x30B8, +- [12402] = 0x30B9, [12403] = 0x30BA, [12404] = 0x30BB, [12405] = 0x30BC, +- [12406] = 0x30BD, [12407] = 0x30BE, [12408] = 0x30BF, [12409] = 0x30C0, +- [12410] = 0x30C1, [12411] = 0x30C2, [12412] = 0x30C3, [12413] = 0x30C4, +- [12414] = 0x30C5, [12415] = 0x30C6, [12416] = 0x30C7, [12417] = 0x30C8, +- [12418] = 0x30C9, [12419] = 0x30CA, [12420] = 0x30CB, [12421] = 0x30CC, +- [12422] = 0x30CD, [12423] = 0x30CE, [12424] = 0x30CF, [12425] = 0x30D0, +- [12426] = 0x30D1, [12427] = 0x30D2, [12428] = 0x30D3, [12429] = 0x30D4, +- [12430] = 0x30D5, [12431] = 0x30D6, [12432] = 0x30D7, [12433] = 0x30D8, +- [12434] = 0x30D9, [12435] = 0x30DA, [12436] = 0x30DB, [12437] = 0x30DC, +- [12438] = 0x30DD, [12439] = 0x30DE, [12440] = 0x30DF, [12441] = 0x30E0, +- [12442] = 0x30E1, [12443] = 0x30E2, [12444] = 0x30E3, [12445] = 0x30E4, +- [12446] = 0x30E5, [12447] = 0x30E6, [12448] = 0x30E7, [12449] = 0x30E8, +- [12450] = 0x30E9, [12451] = 0x30EA, [12452] = 0x30EB, [12453] = 0x30EC, +- [12454] = 0x30ED, [12455] = 0x30EE, [12456] = 0x30EF, [12457] = 0x30F0, +- [12458] = 0x30F1, [12459] = 0x30F2, [12460] = 0x30F3, [12461] = 0x30F4, +- [12462] = 0x30F5, [12463] = 0x30F6, [12464] = 0x0410, [12465] = 0x0411, +- [12466] = 0x0412, [12467] = 0x0413, [12468] = 0x0414, [12469] = 0x0415, +- [12470] = 0x0401, [12471] = 0x0416, [12472] = 0x0417, [12473] = 0x0418, +- [12474] = 0x0419, [12475] = 0x041A, [12480] = 0x041B, [12481] = 0x041C, +- [12482] = 0x041D, [12483] = 0x041E, [12484] = 0x041F, [12485] = 0x0420, +- [12486] = 0x0421, [12487] = 0x0422, [12488] = 0x0423, [12489] = 0x0424, +- [12490] = 0x0425, [12491] = 0x0426, [12492] = 0x0427, [12493] = 0x0428, +- [12494] = 0x0429, [12495] = 0x042A, [12496] = 0x042B, [12497] = 0x042C, +- [12498] = 0x042D, [12499] = 0x042E, [12500] = 0x042F, [12501] = 0x0430, +- [12502] = 0x0431, [12503] = 0x0432, [12504] = 0x0433, [12505] = 0x0434, +- [12506] = 0x0435, [12507] = 0x0451, [12508] = 0x0436, [12509] = 0x0437, +- [12510] = 0x0438, [12511] = 0x0439, [12512] = 0x043A, [12513] = 0x043B, +- [12514] = 0x043C, [12515] = 0x043D, [12516] = 0x043E, [12517] = 0x043F, +- [12518] = 0x0440, [12519] = 0x0441, [12520] = 0x0442, [12521] = 0x0443, +- [12522] = 0x0444, [12523] = 0x0445, [12524] = 0x0446, [12525] = 0x0447, +- [12526] = 0x0448, [12527] = 0x0449, [12528] = 0x044A, [12529] = 0x044B, +- [12530] = 0x044C, [12531] = 0x044D, [12532] = 0x044E, [12533] = 0x044F, +- [12534] = 0x21E7, [12535] = 0x21B8, [12536] = 0x21B9, [12537] = 0xF7E5, +- [12538] = 0xF7E6, [12539] = 0x4E5A, [12540] = 0xF7E8, [12541] = 0x5202, +- [12542] = 0xF7EA, [12577] = 0xF7EB, [12578] = 0x5188, [12579] = 0xF7ED, +- [12580] = 0xF7EE, [12621] = 0xFFE2, [12622] = 0xFFE4, [12623] = 0xFF07, +- [12624] = 0xFF02, [12625] = 0x3231, [12626] = 0x2116, [12627] = 0x2121, +- [12628] = 0x309B, [12629] = 0x309C, [12630] = 0x2E80, [12631] = 0x2E84, +- [12632] = 0x2E86, [12633] = 0x2E87, [12634] = 0x2E88, [12635] = 0x2E8A, +- [12636] = 0x2E8C, [12637] = 0x2E8D, [12638] = 0x2E95, [12639] = 0x2E9C, +- [12640] = 0x2E9D, [12641] = 0x2EA5, [12642] = 0x2EA7, [12643] = 0x2EAA, +- [12644] = 0x2EAC, [12645] = 0x2EAE, [12646] = 0x2EB6, [12647] = 0x2EBC, +- [12648] = 0x2EBE, [12649] = 0x2EC6, [12650] = 0x2ECA, [12651] = 0x2ECC, +- [12652] = 0x2ECD, [12653] = 0x2ECF, [12654] = 0x2ED6, [12655] = 0x2ED7, +- [12656] = 0x2EDE, [12657] = 0x2EE3, [12661] = 0x0283, [12662] = 0x0250, +- [12663] = 0x025B, [12664] = 0x0254, [12665] = 0x0275, [12666] = 0x0153, +- [12667] = 0x00F8, [12668] = 0x014B, [12669] = 0x028A, [12670] = 0x026A, +- [12675] = 0x4E42, [12676] = 0x4E5C, [12677] = 0x51F5, [12678] = 0x531A, +- [12679] = 0x5382, [12680] = 0x4E07, [12681] = 0x4E0C, [12682] = 0x4E47, +- [12683] = 0x4E8D, [12684] = 0x56D7, [12685] = 0xFA0C, [12686] = 0x5C6E, +- [12687] = 0x5F73, [12688] = 0x4E0F, [12689] = 0x5187, [12690] = 0x4E0E, +- [12691] = 0x4E2E, [12692] = 0x4E93, [12693] = 0x4EC2, [12694] = 0x4EC9, +- [12695] = 0x4EC8, [12696] = 0x5198, [12697] = 0x52FC, [12698] = 0x536C, +- [12699] = 0x53B9, [12700] = 0x5720, [12701] = 0x5903, [12702] = 0x592C, +- [12703] = 0x5C10, [12704] = 0x5DFF, [12705] = 0x65E1, [12706] = 0x6BB3, +- [12707] = 0x6BCC, [12708] = 0x6C14, [12709] = 0x723F, [12710] = 0x4E31, +- [12711] = 0x4E3C, [12712] = 0x4EE8, [12713] = 0x4EDC, [12714] = 0x4EE9, +- [12715] = 0x4EE1, [12716] = 0x4EDD, [12717] = 0x4EDA, [12718] = 0x520C, +- [12719] = 0x531C, [12720] = 0x534C, [12721] = 0x5722, [12722] = 0x5723, +- [12723] = 0x5917, [12724] = 0x592F, [12725] = 0x5B81, [12726] = 0x5B84, +- [12727] = 0x5C12, [12728] = 0x5C3B, [12729] = 0x5C74, [12730] = 0x5C73, +- [12731] = 0x5E04, [12732] = 0x5E80, [12733] = 0x5E82, [12734] = 0x5FC9, +- [12735] = 0x6209, [12736] = 0x6250, [12737] = 0x6C15, [12772] = 0x6C36, +- [12773] = 0x6C43, [12774] = 0x6C3F, [12775] = 0x6C3B, [12776] = 0x72AE, +- [12777] = 0x72B0, [12778] = 0x738A, [12779] = 0x79B8, [12780] = 0x808A, +- [12781] = 0x961E, [12782] = 0x4F0E, [12783] = 0x4F18, [12784] = 0x4F2C, +- [12785] = 0x4EF5, [12786] = 0x4F14, [12787] = 0x4EF1, [12788] = 0x4F00, +- [12789] = 0x4EF7, [12790] = 0x4F08, [12791] = 0x4F1D, [12792] = 0x4F02, +- [12793] = 0x4F05, [12794] = 0x4F22, [12795] = 0x4F13, [12796] = 0x4F04, +- [12797] = 0x4EF4, [12798] = 0x4F12, [12799] = 0x51B1, [12800] = 0x5213, +- [12801] = 0x5209, [12802] = 0x5210, [12803] = 0x52A6, [12804] = 0x5322, +- [12805] = 0x531F, [12806] = 0x534D, [12807] = 0x538A, [12808] = 0x5407, +- [12809] = 0x56E1, [12810] = 0x56DF, [12811] = 0x572E, [12812] = 0x572A, +- [12813] = 0x5734, [12814] = 0x593C, [12815] = 0x5980, [12816] = 0x597C, +- [12817] = 0x5985, [12818] = 0x597B, [12819] = 0x597E, [12820] = 0x5977, +- [12821] = 0x597F, [12822] = 0x5B56, [12823] = 0x5C15, [12824] = 0x5C25, +- [12825] = 0x5C7C, [12826] = 0x5C7A, [12827] = 0x5C7B, [12828] = 0x5C7E, +- [12829] = 0x5DDF, [12830] = 0x5E75, [12831] = 0x5E84, [12832] = 0x5F02, +- [12833] = 0x5F1A, [12834] = 0x5F74, [12835] = 0x5FD5, [12836] = 0x5FD4, +- [12837] = 0x5FCF, [12838] = 0x625C, [12839] = 0x625E, [12840] = 0x6264, +- [12841] = 0x6261, [12842] = 0x6266, [12843] = 0x6262, [12844] = 0x6259, +- [12845] = 0x6260, [12846] = 0x625A, [12847] = 0x6265, [12848] = 0x65EF, +- [12849] = 0x65EE, [12850] = 0x673E, [12851] = 0x6739, [12852] = 0x6738, +- [12853] = 0x673B, [12854] = 0x673A, [12855] = 0x673F, [12856] = 0x673C, +- [12857] = 0x6733, [12858] = 0x6C18, [12859] = 0x6C46, [12860] = 0x6C52, +- [12861] = 0x6C5C, [12862] = 0x6C4F, [12863] = 0x6C4A, [12864] = 0x6C54, +- [12865] = 0x6C4B, [12870] = 0x6C4C, [12871] = 0x7071, [12872] = 0x725E, +- [12873] = 0x72B4, [12874] = 0x72B5, [12875] = 0x738E, [12876] = 0x752A, +- [12877] = 0x767F, [12878] = 0x7A75, [12879] = 0x7F51, [12880] = 0x8278, +- [12881] = 0x827C, [12882] = 0x8280, [12883] = 0x827D, [12884] = 0x827F, +- [12885] = 0x864D, [12886] = 0x897E, [12887] = 0x9099, [12888] = 0x9097, +- [12889] = 0x9098, [12890] = 0x909B, [12891] = 0x9094, [12892] = 0x9622, +- [12893] = 0x9624, [12894] = 0x9620, [12895] = 0x9623, [12896] = 0x4F56, +- [12897] = 0x4F3B, [12898] = 0x4F62, [12899] = 0x4F49, [12900] = 0x4F53, +- [12901] = 0x4F64, [12902] = 0x4F3E, [12903] = 0x4F67, [12904] = 0x4F52, +- [12905] = 0x4F5F, [12906] = 0x4F41, [12907] = 0x4F58, [12908] = 0x4F2D, +- [12909] = 0x4F33, [12910] = 0x4F3F, [12911] = 0x4F61, [12912] = 0x518F, +- [12913] = 0x51B9, [12914] = 0x521C, [12915] = 0x521E, [12916] = 0x5221, +- [12917] = 0x52AD, [12918] = 0x52AE, [12919] = 0x5309, [12920] = 0x5363, +- [12921] = 0x5372, [12922] = 0x538E, [12923] = 0x538F, [12924] = 0x5430, +- [12925] = 0x5437, [12926] = 0x542A, [12927] = 0x5454, [12928] = 0x5445, +- [12929] = 0x5419, [12930] = 0x541C, [12931] = 0x5425, [12932] = 0x5418, +- [12967] = 0x543D, [12968] = 0x544F, [12969] = 0x5441, [12970] = 0x5428, +- [12971] = 0x5424, [12972] = 0x5447, [12973] = 0x56EE, [12974] = 0x56E7, +- [12975] = 0x56E5, [12976] = 0x5741, [12977] = 0x5745, [12978] = 0x574C, +- [12979] = 0x5749, [12980] = 0x574B, [12981] = 0x5752, [12982] = 0x5906, +- [12983] = 0x5940, [12984] = 0x59A6, [12985] = 0x5998, [12986] = 0x59A0, +- [12987] = 0x5997, [12988] = 0x598E, [12989] = 0x59A2, [12990] = 0x5990, +- [12991] = 0x598F, [12992] = 0x59A7, [12993] = 0x59A1, [12994] = 0x5B8E, +- [12995] = 0x5B92, [12996] = 0x5C28, [12997] = 0x5C2A, [12998] = 0x5C8D, +- [12999] = 0x5C8F, [13000] = 0x5C88, [13001] = 0x5C8B, [13002] = 0x5C89, +- [13003] = 0x5C92, [13004] = 0x5C8A, [13005] = 0x5C86, [13006] = 0x5C93, +- [13007] = 0x5C95, [13008] = 0x5DE0, [13009] = 0x5E0A, [13010] = 0x5E0E, +- [13011] = 0x5E8B, [13012] = 0x5E89, [13013] = 0x5E8C, [13014] = 0x5E88, +- [13015] = 0x5E8D, [13016] = 0x5F05, [13017] = 0x5F1D, [13018] = 0x5F78, +- [13019] = 0x5F76, [13020] = 0x5FD2, [13021] = 0x5FD1, [13022] = 0x5FD0, +- [13023] = 0x5FED, [13024] = 0x5FE8, [13025] = 0x5FEE, [13026] = 0x5FF3, +- [13027] = 0x5FE1, [13028] = 0x5FE4, [13029] = 0x5FE3, [13030] = 0x5FFA, +- [13031] = 0x5FEF, [13032] = 0x5FF7, [13033] = 0x5FFB, [13034] = 0x6000, +- [13035] = 0x5FF4, [13036] = 0x623A, [13037] = 0x6283, [13038] = 0x628C, +- [13039] = 0x628E, [13040] = 0x628F, [13041] = 0x6294, [13042] = 0x6287, +- [13043] = 0x6271, [13044] = 0x627B, [13045] = 0x627A, [13046] = 0x6270, +- [13047] = 0x6281, [13048] = 0x6288, [13049] = 0x6277, [13050] = 0x627D, +- [13051] = 0x6272, [13052] = 0x6274, [13053] = 0x6537, [13054] = 0x65F0, +- [13055] = 0x65F4, [13056] = 0x65F3, [13057] = 0x65F2, [13058] = 0x65F5, +- [13059] = 0x6745, [13060] = 0x6747, [13065] = 0x6759, [13066] = 0x6755, +- [13067] = 0x674C, [13068] = 0x6748, [13069] = 0x675D, [13070] = 0x674D, +- [13071] = 0x675A, [13072] = 0x674B, [13073] = 0x6BD0, [13074] = 0x6C19, +- [13075] = 0x6C1A, [13076] = 0x6C78, [13077] = 0x6C67, [13078] = 0x6C6B, +- [13079] = 0x6C84, [13080] = 0x6C8B, [13081] = 0x6C8F, [13082] = 0x6C71, +- [13083] = 0x6C6F, [13084] = 0x6C69, [13085] = 0x6C9A, [13086] = 0x6C6D, +- [13087] = 0x6C87, [13088] = 0x6C95, [13089] = 0x6C9C, [13090] = 0x6C66, +- [13091] = 0x6C73, [13092] = 0x6C65, [13093] = 0x6C7B, [13094] = 0x6C8E, +- [13095] = 0x7074, [13096] = 0x707A, [13097] = 0x7263, [13098] = 0x72BF, +- [13099] = 0x72BD, [13100] = 0x72C3, [13101] = 0x72C6, [13102] = 0x72C1, +- [13103] = 0x72BA, [13104] = 0x72C5, [13105] = 0x7395, [13106] = 0x7397, +- [13107] = 0x7393, [13108] = 0x7394, [13109] = 0x7392, [13110] = 0x753A, +- [13111] = 0x7539, [13112] = 0x7594, [13113] = 0x7595, [13114] = 0x7681, +- [13115] = 0x793D, [13116] = 0x8034, [13117] = 0x8095, [13118] = 0x8099, +- [13119] = 0x8090, [13120] = 0x8092, [13121] = 0x809C, [13122] = 0x8290, +- [13123] = 0x828F, [13124] = 0x8285, [13125] = 0x828E, [13126] = 0x8291, +- [13127] = 0x8293, [13162] = 0x828A, [13163] = 0x8283, [13164] = 0x8284, +- [13165] = 0x8C78, [13166] = 0x8FC9, [13167] = 0x8FBF, [13168] = 0x909F, +- [13169] = 0x90A1, [13170] = 0x90A5, [13171] = 0x909E, [13172] = 0x90A7, +- [13173] = 0x90A0, [13174] = 0x9630, [13175] = 0x9628, [13176] = 0x962F, +- [13177] = 0x962D, [13178] = 0x4E33, [13179] = 0x4F98, [13180] = 0x4F7C, +- [13181] = 0x4F85, [13182] = 0x4F7D, [13183] = 0x4F80, [13184] = 0x4F87, +- [13185] = 0x4F76, [13186] = 0x4F74, [13187] = 0x4F89, [13188] = 0x4F84, +- [13189] = 0x4F77, [13190] = 0x4F4C, [13191] = 0x4F97, [13192] = 0x4F6A, +- [13193] = 0x4F9A, [13194] = 0x4F79, [13195] = 0x4F81, [13196] = 0x4F78, +- [13197] = 0x4F90, [13198] = 0x4F9C, [13199] = 0x4F94, [13200] = 0x4F9E, +- [13201] = 0x4F92, [13202] = 0x4F82, [13203] = 0x4F95, [13204] = 0x4F6B, +- [13205] = 0x4F6E, [13206] = 0x519E, [13207] = 0x51BC, [13208] = 0x51BE, +- [13209] = 0x5235, [13210] = 0x5232, [13211] = 0x5233, [13212] = 0x5246, +- [13213] = 0x5231, [13214] = 0x52BC, [13215] = 0x530A, [13216] = 0x530B, +- [13217] = 0x533C, [13218] = 0x5392, [13219] = 0x5394, [13220] = 0x5487, +- [13221] = 0x547F, [13222] = 0x5481, [13223] = 0x5491, [13224] = 0x5482, +- [13225] = 0x5488, [13226] = 0x546B, [13227] = 0x547A, [13228] = 0x547E, +- [13229] = 0x5465, [13230] = 0x546C, [13231] = 0x5474, [13232] = 0x5466, +- [13233] = 0x548D, [13234] = 0x546F, [13235] = 0x5461, [13236] = 0x5460, +- [13237] = 0x5498, [13238] = 0x5463, [13239] = 0x5467, [13240] = 0x5464, +- [13241] = 0x56F7, [13242] = 0x56F9, [13243] = 0x576F, [13244] = 0x5772, +- [13245] = 0x576D, [13246] = 0x576B, [13247] = 0x5771, [13248] = 0x5770, +- [13249] = 0x5776, [13250] = 0x5780, [13251] = 0x5775, [13252] = 0x577B, +- [13253] = 0x5773, [13254] = 0x5774, [13255] = 0x5762, [13260] = 0x5768, +- [13261] = 0x577D, [13262] = 0x590C, [13263] = 0x5945, [13264] = 0x59B5, +- [13265] = 0x59BA, [13266] = 0x59CF, [13267] = 0x59CE, [13268] = 0x59B2, +- [13269] = 0x59CC, [13270] = 0x59C1, [13271] = 0x59B6, [13272] = 0x59BC, +- [13273] = 0x59C3, [13274] = 0x59D6, [13275] = 0x59B1, [13276] = 0x59BD, +- [13277] = 0x59C0, [13278] = 0x59C8, [13279] = 0x59B4, [13280] = 0x59C7, +- [13281] = 0x5B62, [13282] = 0x5B65, [13283] = 0x5B93, [13284] = 0x5B95, +- [13285] = 0x5C44, [13286] = 0x5C47, [13287] = 0x5CAE, [13288] = 0x5CA4, +- [13289] = 0x5CA0, [13290] = 0x5CB5, [13291] = 0x5CAF, [13292] = 0x5CA8, +- [13293] = 0x5CAC, [13294] = 0x5C9F, [13295] = 0x5CA3, [13296] = 0x5CAD, +- [13297] = 0x5CA2, [13298] = 0x5CAA, [13299] = 0x5CA7, [13300] = 0x5C9D, +- [13301] = 0x5CA5, [13302] = 0x5CB6, [13303] = 0x5CB0, [13304] = 0x5CA6, +- [13305] = 0x5E17, [13306] = 0x5E14, [13307] = 0x5E19, [13308] = 0x5F28, +- [13309] = 0x5F22, [13310] = 0x5F23, [13311] = 0x5F24, [13312] = 0x5F54, +- [13313] = 0x5F82, [13314] = 0x5F7E, [13315] = 0x5F7D, [13316] = 0x5FDE, +- [13317] = 0x5FE5, [13318] = 0x602D, [13319] = 0x6026, [13320] = 0x6019, +- [13321] = 0x6032, [13322] = 0x600B, [13357] = 0x6034, [13358] = 0x600A, +- [13359] = 0x6017, [13360] = 0x6033, [13361] = 0x601A, [13362] = 0x601E, +- [13363] = 0x602C, [13364] = 0x6022, [13365] = 0x600D, [13366] = 0x6010, +- [13367] = 0x602E, [13368] = 0x6013, [13369] = 0x6011, [13370] = 0x600C, +- [13371] = 0x6009, [13372] = 0x601C, [13373] = 0x6214, [13374] = 0x623D, +- [13375] = 0x62AD, [13376] = 0x62B4, [13377] = 0x62D1, [13378] = 0x62BE, +- [13379] = 0x62AA, [13380] = 0x62B6, [13381] = 0x62CA, [13382] = 0x62AE, +- [13383] = 0x62B3, [13384] = 0x62AF, [13385] = 0x62BB, [13386] = 0x62A9, +- [13387] = 0x62B0, [13388] = 0x62B8, [13389] = 0x653D, [13390] = 0x65A8, +- [13391] = 0x65BB, [13392] = 0x6609, [13393] = 0x65FC, [13394] = 0x6604, +- [13395] = 0x6612, [13396] = 0x6608, [13397] = 0x65FB, [13398] = 0x6603, +- [13399] = 0x660B, [13400] = 0x660D, [13401] = 0x6605, [13402] = 0x65FD, +- [13403] = 0x6611, [13404] = 0x6610, [13405] = 0x66F6, [13406] = 0x670A, +- [13407] = 0x6785, [13408] = 0x676C, [13409] = 0x678E, [13410] = 0x6792, +- [13411] = 0x6776, [13412] = 0x677B, [13413] = 0x6798, [13414] = 0x6786, +- [13415] = 0x6784, [13416] = 0x6774, [13417] = 0x678D, [13418] = 0x678C, +- [13419] = 0x677A, [13420] = 0x679F, [13421] = 0x6791, [13422] = 0x6799, +- [13423] = 0x6783, [13424] = 0x677D, [13425] = 0x6781, [13426] = 0x6778, +- [13427] = 0x6779, [13428] = 0x6794, [13429] = 0x6B25, [13430] = 0x6B80, +- [13431] = 0x6B7E, [13432] = 0x6BDE, [13433] = 0x6C1D, [13434] = 0x6C93, +- [13435] = 0x6CEC, [13436] = 0x6CEB, [13437] = 0x6CEE, [13438] = 0x6CD9, +- [13439] = 0x6CB6, [13440] = 0x6CD4, [13441] = 0x6CAD, [13442] = 0x6CE7, +- [13443] = 0x6CB7, [13444] = 0x6CD0, [13445] = 0x6CC2, [13446] = 0x6CBA, +- [13447] = 0x6CC3, [13448] = 0x6CC6, [13449] = 0x6CED, [13450] = 0x6CF2, +- [13455] = 0x6CD2, [13456] = 0x6CDD, [13457] = 0x6CB4, [13458] = 0x6C8A, +- [13459] = 0x6C9D, [13460] = 0x6C80, [13461] = 0x6CDE, [13462] = 0x6CC0, +- [13463] = 0x6D30, [13464] = 0x6CCD, [13465] = 0x6CC7, [13466] = 0x6CB0, +- [13467] = 0x6CF9, [13468] = 0x6CCF, [13469] = 0x6CE9, [13470] = 0x6CD1, +- [13471] = 0x7094, [13472] = 0x7098, [13473] = 0x7085, [13474] = 0x7093, +- [13475] = 0x7086, [13476] = 0x7084, [13477] = 0x7091, [13478] = 0x7096, +- [13479] = 0x7082, [13480] = 0x709A, [13481] = 0x7083, [13482] = 0x726A, +- [13483] = 0x72D6, [13484] = 0x72CB, [13485] = 0x72D8, [13486] = 0x72C9, +- [13487] = 0x72DC, [13488] = 0x72D2, [13489] = 0x72D4, [13490] = 0x72DA, +- [13491] = 0x72CC, [13492] = 0x72D1, [13493] = 0x73A4, [13494] = 0x73A1, +- [13495] = 0x73AD, [13496] = 0x73A6, [13497] = 0x73A2, [13498] = 0x73A0, +- [13499] = 0x73AC, [13500] = 0x739D, [13501] = 0x74DD, [13502] = 0x74E8, +- [13503] = 0x753F, [13504] = 0x7540, [13505] = 0x753E, [13506] = 0x758C, +- [13507] = 0x7598, [13508] = 0x76AF, [13509] = 0x76F3, [13510] = 0x76F1, +- [13511] = 0x76F0, [13512] = 0x76F5, [13513] = 0x77F8, [13514] = 0x77FC, +- [13515] = 0x77F9, [13516] = 0x77FB, [13517] = 0x77FA, [13552] = 0x77F7, +- [13553] = 0x7942, [13554] = 0x793F, [13555] = 0x79C5, [13556] = 0x7A78, +- [13557] = 0x7A7B, [13558] = 0x7AFB, [13559] = 0x7C75, [13560] = 0x7CFD, +- [13561] = 0x8035, [13562] = 0x808F, [13563] = 0x80AE, [13564] = 0x80A3, +- [13565] = 0x80B8, [13566] = 0x80B5, [13567] = 0x80AD, [13568] = 0x8220, +- [13569] = 0x82A0, [13570] = 0x82C0, [13571] = 0x82AB, [13572] = 0x829A, +- [13573] = 0x8298, [13574] = 0x829B, [13575] = 0x82B5, [13576] = 0x82A7, +- [13577] = 0x82AE, [13578] = 0x82BC, [13579] = 0x829E, [13580] = 0x82BA, +- [13581] = 0x82B4, [13582] = 0x82A8, [13583] = 0x82A1, [13584] = 0x82A9, +- [13585] = 0x82C2, [13586] = 0x82A4, [13587] = 0x82C3, [13588] = 0x82B6, +- [13589] = 0x82A2, [13590] = 0x8670, [13591] = 0x866F, [13592] = 0x866D, +- [13593] = 0x866E, [13594] = 0x8C56, [13595] = 0x8FD2, [13596] = 0x8FCB, +- [13597] = 0x8FD3, [13598] = 0x8FCD, [13599] = 0x8FD6, [13600] = 0x8FD5, +- [13601] = 0x8FD7, [13602] = 0x90B2, [13603] = 0x90B4, [13604] = 0x90AF, +- [13605] = 0x90B3, [13606] = 0x90B0, [13607] = 0x9639, [13608] = 0x963D, +- [13609] = 0x963C, [13610] = 0x963A, [13611] = 0x9643, [13612] = 0x4FCD, +- [13613] = 0x4FC5, [13614] = 0x4FD3, [13615] = 0x4FB2, [13616] = 0x4FC9, +- [13617] = 0x4FCB, [13618] = 0x4FC1, [13619] = 0x4FD4, [13620] = 0x4FDC, +- [13621] = 0x4FD9, [13622] = 0x4FBB, [13623] = 0x4FB3, [13624] = 0x4FDB, +- [13625] = 0x4FC7, [13626] = 0x4FD6, [13627] = 0x4FBA, [13628] = 0x4FC0, +- [13629] = 0x4FB9, [13630] = 0x4FEC, [13631] = 0x5244, [13632] = 0x5249, +- [13633] = 0x52C0, [13634] = 0x52C2, [13635] = 0x533D, [13636] = 0x537C, +- [13637] = 0x5397, [13638] = 0x5396, [13639] = 0x5399, [13640] = 0x5398, +- [13641] = 0x54BA, [13642] = 0x54A1, [13643] = 0x54AD, [13644] = 0x54A5, +- [13645] = 0x54CF, [13650] = 0x54C3, [13651] = 0x830D, [13652] = 0x54B7, +- [13653] = 0x54AE, [13654] = 0x54D6, [13655] = 0x54B6, [13656] = 0x54C5, +- [13657] = 0x54C6, [13658] = 0x54A0, [13659] = 0x5470, [13660] = 0x54BC, +- [13661] = 0x54A2, [13662] = 0x54BE, [13663] = 0x5472, [13664] = 0x54DE, +- [13665] = 0x54B0, [13666] = 0x57B5, [13667] = 0x579E, [13668] = 0x579F, +- [13669] = 0x57A4, [13670] = 0x578C, [13671] = 0x5797, [13672] = 0x579D, +- [13673] = 0x579B, [13674] = 0x5794, [13675] = 0x5798, [13676] = 0x578F, +- [13677] = 0x5799, [13678] = 0x57A5, [13679] = 0x579A, [13680] = 0x5795, +- [13681] = 0x58F4, [13682] = 0x590D, [13683] = 0x5953, [13684] = 0x59E1, +- [13685] = 0x59DE, [13686] = 0x59EE, [13687] = 0x5A00, [13688] = 0x59F1, +- [13689] = 0x59DD, [13690] = 0x59FA, [13691] = 0x59FD, [13692] = 0x59FC, +- [13693] = 0x59F6, [13694] = 0x59E4, [13695] = 0x59F2, [13696] = 0x59F7, +- [13697] = 0x59DB, [13698] = 0x59E9, [13699] = 0x59F3, [13700] = 0x59F5, +- [13701] = 0x59E0, [13702] = 0x59FE, [13703] = 0x59F4, [13704] = 0x59ED, +- [13705] = 0x5BA8, [13706] = 0x5C4C, [13707] = 0x5CD0, [13708] = 0x5CD8, +- [13709] = 0x5CCC, [13710] = 0x5CD7, [13711] = 0x5CCB, [13712] = 0x5CDB, +- [13747] = 0x5CDE, [13748] = 0x5CDA, [13749] = 0x5CC9, [13750] = 0x5CC7, +- [13751] = 0x5CCA, [13752] = 0x5CD6, [13753] = 0x5CD3, [13754] = 0x5CD4, +- [13755] = 0x5CCF, [13756] = 0x5CC8, [13757] = 0x5CC6, [13758] = 0x5CCE, +- [13759] = 0x5CDF, [13760] = 0x5CF8, [13761] = 0x5DF9, [13762] = 0x5E21, +- [13763] = 0x5E22, [13764] = 0x5E23, [13765] = 0x5E20, [13766] = 0x5E24, +- [13767] = 0x5EB0, [13768] = 0x5EA4, [13769] = 0x5EA2, [13770] = 0x5E9B, +- [13771] = 0x5EA3, [13772] = 0x5EA5, [13773] = 0x5F07, [13774] = 0x5F2E, +- [13775] = 0x5F56, [13776] = 0x5F86, [13777] = 0x6037, [13778] = 0x6039, +- [13779] = 0x6054, [13780] = 0x6072, [13781] = 0x605E, [13782] = 0x6045, +- [13783] = 0x6053, [13784] = 0x6047, [13785] = 0x6049, [13786] = 0x605B, +- [13787] = 0x604C, [13788] = 0x6040, [13789] = 0x6042, [13790] = 0x605F, +- [13791] = 0x6024, [13792] = 0x6044, [13793] = 0x6058, [13794] = 0x6066, +- [13795] = 0x606E, [13796] = 0x6242, [13797] = 0x6243, [13798] = 0x62CF, +- [13799] = 0x630D, [13800] = 0x630B, [13801] = 0x62F5, [13802] = 0x630E, +- [13803] = 0x6303, [13804] = 0x62EB, [13805] = 0x62F9, [13806] = 0x630F, +- [13807] = 0x630C, [13808] = 0x62F8, [13809] = 0x62F6, [13810] = 0x6300, +- [13811] = 0x6313, [13812] = 0x6314, [13813] = 0x62FA, [13814] = 0x6315, +- [13815] = 0x62FB, [13816] = 0x62F0, [13817] = 0x6541, [13818] = 0x6543, +- [13819] = 0x65AA, [13820] = 0x65BF, [13821] = 0x6636, [13822] = 0x6621, +- [13823] = 0x6632, [13824] = 0x6635, [13825] = 0x661C, [13826] = 0x6626, +- [13827] = 0x6622, [13828] = 0x6633, [13829] = 0x662B, [13830] = 0x663A, +- [13831] = 0x661D, [13832] = 0x6634, [13833] = 0x6639, [13834] = 0x662E, +- [13835] = 0x670F, [13836] = 0x6710, [13837] = 0x67C1, [13838] = 0x67F2, +- [13839] = 0x67C8, [13840] = 0x67BA, [13845] = 0x67DC, [13846] = 0x67BB, +- [13847] = 0x67F8, [13848] = 0x67D8, [13849] = 0x67C0, [13850] = 0x67B7, +- [13851] = 0x67C5, [13852] = 0x67EB, [13853] = 0x67E4, [13854] = 0x67DF, +- [13855] = 0x67B5, [13856] = 0x67CD, [13857] = 0x67B3, [13858] = 0x67F7, +- [13859] = 0x67F6, [13860] = 0x67EE, [13861] = 0x67E3, [13862] = 0x67C2, +- [13863] = 0x67B9, [13864] = 0x67CE, [13865] = 0x67E7, [13866] = 0x67F0, +- [13867] = 0x67B2, [13868] = 0x67FC, [13869] = 0x67C6, [13870] = 0x67ED, +- [13871] = 0x67CC, [13872] = 0x67AE, [13873] = 0x67E6, [13874] = 0x67DB, +- [13875] = 0x67FA, [13876] = 0x67C9, [13877] = 0x67CA, [13878] = 0x67C3, +- [13879] = 0x67EA, [13880] = 0x67CB, [13881] = 0x6B28, [13882] = 0x6B82, +- [13883] = 0x6B84, [13884] = 0x6BB6, [13885] = 0x6BD6, [13886] = 0x6BD8, +- [13887] = 0x6BE0, [13888] = 0x6C20, [13889] = 0x6C21, [13890] = 0x6D28, +- [13891] = 0x6D34, [13892] = 0x6D2D, [13893] = 0x6D1F, [13894] = 0x6D3C, +- [13895] = 0x6D3F, [13896] = 0x6D12, [13897] = 0x6D0A, [13898] = 0x6CDA, +- [13899] = 0x6D33, [13900] = 0x6D04, [13901] = 0x6D19, [13902] = 0x6D3A, +- [13903] = 0x6D1A, [13904] = 0x6D11, [13905] = 0x6D00, [13906] = 0x6D1D, +- [13907] = 0x6D42, [13942] = 0x6D01, [13943] = 0x6D18, [13944] = 0x6D37, +- [13945] = 0x6D03, [13946] = 0x6D0F, [13947] = 0x6D40, [13948] = 0x6D07, +- [13949] = 0x6D20, [13950] = 0x6D2C, [13951] = 0x6D08, [13952] = 0x6D22, +- [13953] = 0x6D09, [13954] = 0x6D10, [13955] = 0x70B7, [13956] = 0x709F, +- [13957] = 0x70BE, [13958] = 0x70B1, [13959] = 0x70B0, [13960] = 0x70A1, +- [13961] = 0x70B4, [13962] = 0x70B5, [13963] = 0x70A9, [13964] = 0x7241, +- [13965] = 0x7249, [13966] = 0x724A, [13967] = 0x726C, [13968] = 0x7270, +- [13969] = 0x7273, [13970] = 0x726E, [13971] = 0x72CA, [13972] = 0x72E4, +- [13973] = 0x72E8, [13974] = 0x72EB, [13975] = 0x72DF, [13976] = 0x72EA, +- [13977] = 0x72E6, [13978] = 0x72E3, [13979] = 0x7385, [13980] = 0x73CC, +- [13981] = 0x73C2, [13982] = 0x73C8, [13983] = 0x73C5, [13984] = 0x73B9, +- [13985] = 0x73B6, [13986] = 0x73B5, [13987] = 0x73B4, [13988] = 0x73EB, +- [13989] = 0x73BF, [13990] = 0x73C7, [13991] = 0x73BE, [13992] = 0x73C3, +- [13993] = 0x73C6, [13994] = 0x73B8, [13995] = 0x73CB, [13996] = 0x74EC, +- [13997] = 0x74EE, [13998] = 0x752E, [13999] = 0x7547, [14000] = 0x7548, +- [14001] = 0x75A7, [14002] = 0x75AA, [14003] = 0x7679, [14004] = 0x76C4, +- [14005] = 0x7708, [14006] = 0x7703, [14007] = 0x7704, [14008] = 0x7705, +- [14009] = 0x770A, [14010] = 0x76F7, [14011] = 0x76FB, [14012] = 0x76FA, +- [14013] = 0x77E7, [14014] = 0x77E8, [14015] = 0x7806, [14016] = 0x7811, +- [14017] = 0x7812, [14018] = 0x7805, [14019] = 0x7810, [14020] = 0x780F, +- [14021] = 0x780E, [14022] = 0x7809, [14023] = 0x7803, [14024] = 0x7813, +- [14025] = 0x794A, [14026] = 0x794C, [14027] = 0x794B, [14028] = 0x7945, +- [14029] = 0x7944, [14030] = 0x79D5, [14031] = 0x79CD, [14032] = 0x79CF, +- [14033] = 0x79D6, [14034] = 0x79CE, [14035] = 0x7A80, [14040] = 0x7A7E, +- [14041] = 0x7AD1, [14042] = 0x7B00, [14043] = 0x7B01, [14044] = 0x7C7A, +- [14045] = 0x7C78, [14046] = 0x7C79, [14047] = 0x7C7F, [14048] = 0x7C80, +- [14049] = 0x7C81, [14050] = 0x7D03, [14051] = 0x7D08, [14052] = 0x7D01, +- [14053] = 0x7F58, [14054] = 0x7F91, [14055] = 0x7F8D, [14056] = 0x7FBE, +- [14057] = 0x8007, [14058] = 0x800E, [14059] = 0x800F, [14060] = 0x8014, +- [14061] = 0x8037, [14062] = 0x80D8, [14063] = 0x80C7, [14064] = 0x80E0, +- [14065] = 0x80D1, [14066] = 0x80C8, [14067] = 0x80C2, [14068] = 0x80D0, +- [14069] = 0x80C5, [14070] = 0x80E3, [14071] = 0x80D9, [14072] = 0x80DC, +- [14073] = 0x80CA, [14074] = 0x80D5, [14075] = 0x80C9, [14076] = 0x80CF, +- [14077] = 0x80D7, [14078] = 0x80E6, [14079] = 0x80CD, [14080] = 0x81FF, +- [14081] = 0x8221, [14082] = 0x8294, [14083] = 0x82D9, [14084] = 0x82FE, +- [14085] = 0x82F9, [14086] = 0x8307, [14087] = 0x82E8, [14088] = 0x8300, +- [14089] = 0x82D5, [14090] = 0x833A, [14091] = 0x82EB, [14092] = 0x82D6, +- [14093] = 0x82F4, [14094] = 0x82EC, [14095] = 0x82E1, [14096] = 0x82F2, +- [14097] = 0x82F5, [14098] = 0x830C, [14099] = 0x82FB, [14100] = 0x82F6, +- [14101] = 0x82F0, [14102] = 0x82EA, [14137] = 0x82E4, [14138] = 0x82E0, +- [14139] = 0x82FA, [14140] = 0x82F3, [14141] = 0x82ED, [14142] = 0x8677, +- [14143] = 0x8674, [14144] = 0x867C, [14145] = 0x8673, [14146] = 0x8841, +- [14147] = 0x884E, [14148] = 0x8867, [14149] = 0x886A, [14150] = 0x8869, +- [14151] = 0x89D3, [14152] = 0x8A04, [14153] = 0x8A07, [14154] = 0x8D72, +- [14155] = 0x8FE3, [14156] = 0x8FE1, [14157] = 0x8FEE, [14158] = 0x8FE0, +- [14159] = 0x90F1, [14160] = 0x90BD, [14161] = 0x90BF, [14162] = 0x90D5, +- [14163] = 0x90C5, [14164] = 0x90BE, [14165] = 0x90C7, [14166] = 0x90CB, +- [14167] = 0x90C8, [14168] = 0x91D4, [14169] = 0x91D3, [14170] = 0x9654, +- [14171] = 0x964F, [14172] = 0x9651, [14173] = 0x9653, [14174] = 0x964A, +- [14175] = 0x964E, [14176] = 0x501E, [14177] = 0x5005, [14178] = 0x5007, +- [14179] = 0x5013, [14180] = 0x5022, [14181] = 0x5030, [14182] = 0x501B, +- [14183] = 0x4FF5, [14184] = 0x4FF4, [14185] = 0x5033, [14186] = 0x5037, +- [14187] = 0x502C, [14188] = 0x4FF6, [14189] = 0x4FF7, [14190] = 0x5017, +- [14191] = 0x501C, [14192] = 0x5020, [14193] = 0x5027, [14194] = 0x5035, +- [14195] = 0x502F, [14196] = 0x5031, [14197] = 0x500E, [14198] = 0x515A, +- [14199] = 0x5194, [14200] = 0x5193, [14201] = 0x51CA, [14202] = 0x51C4, +- [14203] = 0x51C5, [14204] = 0x51C8, [14205] = 0x51CE, [14206] = 0x5261, +- [14207] = 0x525A, [14208] = 0x5252, [14209] = 0x525E, [14210] = 0x525F, +- [14211] = 0x5255, [14212] = 0x5262, [14213] = 0x52CD, [14214] = 0x530E, +- [14215] = 0x539E, [14216] = 0x5526, [14217] = 0x54E2, [14218] = 0x5517, +- [14219] = 0x5512, [14220] = 0x54E7, [14221] = 0x54F3, [14222] = 0x54E4, +- [14223] = 0x551A, [14224] = 0x54FF, [14225] = 0x5504, [14226] = 0x5508, +- [14227] = 0x54EB, [14228] = 0x5511, [14229] = 0x5505, [14230] = 0x54F1, +- [14235] = 0x550A, [14236] = 0x54FB, [14237] = 0x54F7, [14238] = 0x54F8, +- [14239] = 0x54E0, [14240] = 0x550E, [14241] = 0x5503, [14242] = 0x550B, +- [14243] = 0x5701, [14244] = 0x5702, [14245] = 0x57CC, [14246] = 0x5832, +- [14247] = 0x57D5, [14248] = 0x57D2, [14249] = 0x57BA, [14250] = 0x57C6, +- [14251] = 0x57BD, [14252] = 0x57BC, [14253] = 0x57B8, [14254] = 0x57B6, +- [14255] = 0x57BF, [14256] = 0x57C7, [14257] = 0x57D0, [14258] = 0x57B9, +- [14259] = 0x57C1, [14260] = 0x590E, [14261] = 0x594A, [14262] = 0x5A19, +- [14263] = 0x5A16, [14264] = 0x5A2D, [14265] = 0x5A2E, [14266] = 0x5A15, +- [14267] = 0x5A0F, [14268] = 0x5A17, [14269] = 0x5A0A, [14270] = 0x5A1E, +- [14271] = 0x5A33, [14272] = 0x5B6C, [14273] = 0x5BA7, [14274] = 0x5BAD, +- [14275] = 0x5BAC, [14276] = 0x5C03, [14277] = 0x5C56, [14278] = 0x5C54, +- [14279] = 0x5CEC, [14280] = 0x5CFF, [14281] = 0x5CEE, [14282] = 0x5CF1, +- [14283] = 0x5CF7, [14284] = 0x5D00, [14285] = 0x5CF9, [14286] = 0x5E29, +- [14287] = 0x5E28, [14288] = 0x5EA8, [14289] = 0x5EAE, [14290] = 0x5EAA, +- [14291] = 0x5EAC, [14292] = 0x5F33, [14293] = 0x5F30, [14294] = 0x5F67, +- [14295] = 0x605D, [14296] = 0x605A, [14297] = 0x6067, [14332] = 0x6041, +- [14333] = 0x60A2, [14334] = 0x6088, [14335] = 0x6080, [14336] = 0x6092, +- [14337] = 0x6081, [14338] = 0x609D, [14339] = 0x6083, [14340] = 0x6095, +- [14341] = 0x609B, [14342] = 0x6097, [14343] = 0x6087, [14344] = 0x609C, +- [14345] = 0x608E, [14346] = 0x6219, [14347] = 0x6246, [14348] = 0x62F2, +- [14349] = 0x6310, [14350] = 0x6356, [14351] = 0x632C, [14352] = 0x6344, +- [14353] = 0x6345, [14354] = 0x6336, [14355] = 0x6343, [14356] = 0x63E4, +- [14357] = 0x6339, [14358] = 0x634B, [14359] = 0x634A, [14360] = 0x633C, +- [14361] = 0x6329, [14362] = 0x6341, [14363] = 0x6334, [14364] = 0x6358, +- [14365] = 0x6354, [14366] = 0x6359, [14367] = 0x632D, [14368] = 0x6347, +- [14369] = 0x6333, [14370] = 0x635A, [14371] = 0x6351, [14372] = 0x6338, +- [14373] = 0x6357, [14374] = 0x6340, [14375] = 0x6348, [14376] = 0x654A, +- [14377] = 0x6546, [14378] = 0x65C6, [14379] = 0x65C3, [14380] = 0x65C4, +- [14381] = 0x65C2, [14382] = 0x664A, [14383] = 0x665F, [14384] = 0x6647, +- [14385] = 0x6651, [14386] = 0x6712, [14387] = 0x6713, [14388] = 0x681F, +- [14389] = 0x681A, [14390] = 0x6849, [14391] = 0x6832, [14392] = 0x6833, +- [14393] = 0x683B, [14394] = 0x684B, [14395] = 0x684F, [14396] = 0x6816, +- [14397] = 0x6831, [14398] = 0x681C, [14399] = 0x6835, [14400] = 0x682B, +- [14401] = 0x682D, [14402] = 0x682F, [14403] = 0x684E, [14404] = 0x6844, +- [14405] = 0x6834, [14406] = 0x681D, [14407] = 0x6812, [14408] = 0x6814, +- [14409] = 0x6826, [14410] = 0x6828, [14411] = 0x682E, [14412] = 0x684D, +- [14413] = 0x683A, [14414] = 0x6825, [14415] = 0x6820, [14416] = 0x6B2C, +- [14417] = 0x6B2F, [14418] = 0x6B2D, [14419] = 0x6B31, [14420] = 0x6B34, +- [14421] = 0x6B6D, [14422] = 0x8082, [14423] = 0x6B88, [14424] = 0x6BE6, +- [14425] = 0x6BE4, [14430] = 0x6BE8, [14431] = 0x6BE3, [14432] = 0x6BE2, +- [14433] = 0x6BE7, [14434] = 0x6C25, [14435] = 0x6D7A, [14436] = 0x6D63, +- [14437] = 0x6D64, [14438] = 0x6D76, [14439] = 0x6D0D, [14440] = 0x6D61, +- [14441] = 0x6D92, [14442] = 0x6D58, [14443] = 0x6D62, [14444] = 0x6D6D, +- [14445] = 0x6D6F, [14446] = 0x6D91, [14447] = 0x6D8D, [14448] = 0x6DEF, +- [14449] = 0x6D7F, [14450] = 0x6D86, [14451] = 0x6D5E, [14452] = 0x6D67, +- [14453] = 0x6D60, [14454] = 0x6D97, [14455] = 0x6D70, [14456] = 0x6D7C, +- [14457] = 0x6D5F, [14458] = 0x6D82, [14459] = 0x6D98, [14460] = 0x6D2F, +- [14461] = 0x6D68, [14462] = 0x6D8B, [14463] = 0x6D7E, [14464] = 0x6D80, +- [14465] = 0x6D84, [14466] = 0x6D16, [14467] = 0x6D83, [14468] = 0x6D7B, +- [14469] = 0x6D7D, [14470] = 0x6D75, [14471] = 0x6D90, [14472] = 0x70DC, +- [14473] = 0x70D3, [14474] = 0x70D1, [14475] = 0x70DD, [14476] = 0x70CB, +- [14477] = 0x7F39, [14478] = 0x70E2, [14479] = 0x70D7, [14480] = 0x70D2, +- [14481] = 0x70DE, [14482] = 0x70E0, [14483] = 0x70D4, [14484] = 0x70CD, +- [14485] = 0x70C5, [14486] = 0x70C6, [14487] = 0x70C7, [14488] = 0x70DA, +- [14489] = 0x70CE, [14490] = 0x70E1, [14491] = 0x7242, [14492] = 0x7278, +- [14527] = 0x7277, [14528] = 0x7276, [14529] = 0x7300, [14530] = 0x72FA, +- [14531] = 0x72F4, [14532] = 0x72FE, [14533] = 0x72F6, [14534] = 0x72F3, +- [14535] = 0x72FB, [14536] = 0x7301, [14537] = 0x73D3, [14538] = 0x73D9, +- [14539] = 0x73E5, [14540] = 0x73D6, [14541] = 0x73BC, [14542] = 0x73E7, +- [14543] = 0x73E3, [14544] = 0x73E9, [14545] = 0x73DC, [14546] = 0x73D2, +- [14547] = 0x73DB, [14548] = 0x73D4, [14549] = 0x73DD, [14550] = 0x73DA, +- [14551] = 0x73D7, [14552] = 0x73D8, [14553] = 0x73E8, [14554] = 0x74DE, +- [14555] = 0x74DF, [14556] = 0x74F4, [14557] = 0x74F5, [14558] = 0x7521, +- [14559] = 0x755B, [14560] = 0x755F, [14561] = 0x75B0, [14562] = 0x75C1, +- [14563] = 0x75BB, [14564] = 0x75C4, [14565] = 0x75C0, [14566] = 0x75BF, +- [14567] = 0x75B6, [14568] = 0x75BA, [14569] = 0x768A, [14570] = 0x76C9, +- [14571] = 0x771D, [14572] = 0x771B, [14573] = 0x7710, [14574] = 0x7713, +- [14575] = 0x7712, [14576] = 0x7723, [14577] = 0x7711, [14578] = 0x7715, +- [14579] = 0x7719, [14580] = 0x771A, [14581] = 0x7722, [14582] = 0x7727, +- [14583] = 0x7823, [14584] = 0x782C, [14585] = 0x7822, [14586] = 0x7835, +- [14587] = 0x782F, [14588] = 0x7828, [14589] = 0x782E, [14590] = 0x782B, +- [14591] = 0x7821, [14592] = 0x7829, [14593] = 0x7833, [14594] = 0x782A, +- [14595] = 0x7831, [14596] = 0x7954, [14597] = 0x795B, [14598] = 0x794F, +- [14599] = 0x795C, [14600] = 0x7953, [14601] = 0x7952, [14602] = 0x7951, +- [14603] = 0x79EB, [14604] = 0x79EC, [14605] = 0x79E0, [14606] = 0x79EE, +- [14607] = 0x79ED, [14608] = 0x79EA, [14609] = 0x79DC, [14610] = 0x79DE, +- [14611] = 0x79DD, [14612] = 0x7A86, [14613] = 0x7A89, [14614] = 0x7A85, +- [14615] = 0x7A8B, [14616] = 0x7A8C, [14617] = 0x7A8A, [14618] = 0x7A87, +- [14619] = 0x7AD8, [14620] = 0x7B10, [14625] = 0x7B04, [14626] = 0x7B13, +- [14627] = 0x7B05, [14628] = 0x7B0F, [14629] = 0x7B08, [14630] = 0x7B0A, +- [14631] = 0x7B0E, [14632] = 0x7B09, [14633] = 0x7B12, [14634] = 0x7C84, +- [14635] = 0x7C91, [14636] = 0x7C8A, [14637] = 0x7C8C, [14638] = 0x7C88, +- [14639] = 0x7C8D, [14640] = 0x7C85, [14641] = 0x7D1E, [14642] = 0x7D1D, +- [14643] = 0x7D11, [14644] = 0x7D0E, [14645] = 0x7D18, [14646] = 0x7D16, +- [14647] = 0x7D13, [14648] = 0x7D1F, [14649] = 0x7D12, [14650] = 0x7D0F, +- [14651] = 0x7D0C, [14652] = 0x7F5C, [14653] = 0x7F61, [14654] = 0x7F5E, +- [14655] = 0x7F60, [14656] = 0x7F5D, [14657] = 0x7F5B, [14658] = 0x7F96, +- [14659] = 0x7F92, [14660] = 0x7FC3, [14661] = 0x7FC2, [14662] = 0x7FC0, +- [14663] = 0x8016, [14664] = 0x803E, [14665] = 0x8039, [14666] = 0x80FA, +- [14667] = 0x80F2, [14668] = 0x80F9, [14669] = 0x80F5, [14670] = 0x8101, +- [14671] = 0x80FB, [14672] = 0x8100, [14673] = 0x8201, [14674] = 0x822F, +- [14675] = 0x8225, [14676] = 0x8333, [14677] = 0x832D, [14678] = 0x8344, +- [14679] = 0x8319, [14680] = 0x8351, [14681] = 0x8325, [14682] = 0x8356, +- [14683] = 0x833F, [14684] = 0x8341, [14685] = 0x8326, [14686] = 0x831C, +- [14687] = 0x8322, [14722] = 0x8342, [14723] = 0x834E, [14724] = 0x831B, +- [14725] = 0x832A, [14726] = 0x8308, [14727] = 0x833C, [14728] = 0x834D, +- [14729] = 0x8316, [14730] = 0x8324, [14731] = 0x8320, [14732] = 0x8337, +- [14733] = 0x832F, [14734] = 0x8329, [14735] = 0x8347, [14736] = 0x8345, +- [14737] = 0x834C, [14738] = 0x8353, [14739] = 0x831E, [14740] = 0x832C, +- [14741] = 0x834B, [14742] = 0x8327, [14743] = 0x8348, [14744] = 0x8653, +- [14745] = 0x8652, [14746] = 0x86A2, [14747] = 0x86A8, [14748] = 0x8696, +- [14749] = 0x868D, [14750] = 0x8691, [14751] = 0x869E, [14752] = 0x8687, +- [14753] = 0x8697, [14754] = 0x8686, [14755] = 0x868B, [14756] = 0x869A, +- [14757] = 0x8685, [14758] = 0x86A5, [14759] = 0x8699, [14760] = 0x86A1, +- [14761] = 0x86A7, [14762] = 0x8695, [14763] = 0x8698, [14764] = 0x868E, +- [14765] = 0x869D, [14766] = 0x8690, [14767] = 0x8694, [14768] = 0x8843, +- [14769] = 0x8844, [14770] = 0x886D, [14771] = 0x8875, [14772] = 0x8876, +- [14773] = 0x8872, [14774] = 0x8880, [14775] = 0x8871, [14776] = 0x887F, +- [14777] = 0x886F, [14778] = 0x8883, [14779] = 0x887E, [14780] = 0x8874, +- [14781] = 0x887C, [14782] = 0x8A12, [14783] = 0x8C47, [14784] = 0x8C57, +- [14785] = 0x8C7B, [14786] = 0x8CA4, [14787] = 0x8CA3, [14788] = 0x8D76, +- [14789] = 0x8D78, [14790] = 0x8DB5, [14791] = 0x8DB7, [14792] = 0x8DB6, +- [14793] = 0x8ED1, [14794] = 0x8ED3, [14795] = 0x8FFE, [14796] = 0x8FF5, +- [14797] = 0x9002, [14798] = 0x8FFF, [14799] = 0x8FFB, [14800] = 0x9004, +- [14801] = 0x8FFC, [14802] = 0x8FF6, [14803] = 0x90D6, [14804] = 0x90E0, +- [14805] = 0x90D9, [14806] = 0x90DA, [14807] = 0x90E3, [14808] = 0x90DF, +- [14809] = 0x90E5, [14810] = 0x90D8, [14811] = 0x90DB, [14812] = 0x90D7, +- [14813] = 0x90DC, [14814] = 0x90E4, [14815] = 0x9150, [14820] = 0x914E, +- [14821] = 0x914F, [14822] = 0x91D5, [14823] = 0x91E2, [14824] = 0x91DA, +- [14825] = 0x965C, [14826] = 0x965F, [14827] = 0x96BC, [14828] = 0x98E3, +- [14829] = 0x9ADF, [14830] = 0x9B2F, [14831] = 0x4E7F, [14832] = 0x5070, +- [14833] = 0x506A, [14834] = 0x5061, [14835] = 0x505E, [14836] = 0x5060, +- [14837] = 0x5053, [14838] = 0x504B, [14839] = 0x505D, [14840] = 0x5072, +- [14841] = 0x5048, [14842] = 0x504D, [14843] = 0x5041, [14844] = 0x505B, +- [14845] = 0x504A, [14846] = 0x5062, [14847] = 0x5015, [14848] = 0x5045, +- [14849] = 0x505F, [14850] = 0x5069, [14851] = 0x506B, [14852] = 0x5063, +- [14853] = 0x5064, [14854] = 0x5046, [14855] = 0x5040, [14856] = 0x506E, +- [14857] = 0x5073, [14858] = 0x5057, [14859] = 0x5051, [14860] = 0x51D0, +- [14861] = 0x526B, [14862] = 0x526D, [14863] = 0x526C, [14864] = 0x526E, +- [14865] = 0x52D6, [14866] = 0x52D3, [14867] = 0x532D, [14868] = 0x539C, +- [14869] = 0x5575, [14870] = 0x5576, [14871] = 0x553C, [14872] = 0x554D, +- [14873] = 0x5550, [14874] = 0x5534, [14875] = 0x552A, [14876] = 0x5551, +- [14877] = 0x5562, [14878] = 0x5536, [14879] = 0x5535, [14880] = 0x5530, +- [14881] = 0x5552, [14882] = 0x5545, [14917] = 0x550C, [14918] = 0x5532, +- [14919] = 0x5565, [14920] = 0x554E, [14921] = 0x5539, [14922] = 0x5548, +- [14923] = 0x552D, [14924] = 0x553B, [14925] = 0x5540, [14926] = 0x554B, +- [14927] = 0x570A, [14928] = 0x5707, [14929] = 0x57FB, [14930] = 0x5814, +- [14931] = 0x57E2, [14932] = 0x57F6, [14933] = 0x57DC, [14934] = 0x57F4, +- [14935] = 0x5800, [14936] = 0x57ED, [14937] = 0x57FD, [14938] = 0x5808, +- [14939] = 0x57F8, [14940] = 0x580B, [14941] = 0x57F3, [14942] = 0x57CF, +- [14943] = 0x5807, [14944] = 0x57EE, [14945] = 0x57E3, [14946] = 0x57F2, +- [14947] = 0x57E5, [14948] = 0x57EC, [14949] = 0x57E1, [14950] = 0x580E, +- [14951] = 0x57FC, [14952] = 0x5810, [14953] = 0x57E7, [14954] = 0x5801, +- [14955] = 0x580C, [14956] = 0x57F1, [14957] = 0x57E9, [14958] = 0x57F0, +- [14959] = 0x580D, [14960] = 0x5804, [14961] = 0x595C, [14962] = 0x5A60, +- [14963] = 0x5A58, [14964] = 0x5A55, [14965] = 0x5A67, [14966] = 0x5A5E, +- [14967] = 0x5A38, [14968] = 0x5A35, [14969] = 0x5A6D, [14970] = 0x5A50, +- [14971] = 0x5A5F, [14972] = 0x5A65, [14973] = 0x5A6C, [14974] = 0x5A53, +- [14975] = 0x5A64, [14976] = 0x5A57, [14977] = 0x5A43, [14978] = 0x5A5D, +- [14979] = 0x5A52, [14980] = 0x5A44, [14981] = 0x5A5B, [14982] = 0x5A48, +- [14983] = 0x5A8E, [14984] = 0x5A3E, [14985] = 0x5A4D, [14986] = 0x5A39, +- [14987] = 0x5A4C, [14988] = 0x5A70, [14989] = 0x5A69, [14990] = 0x5A47, +- [14991] = 0x5A51, [14992] = 0x5A56, [14993] = 0x5A42, [14994] = 0x5A5C, +- [14995] = 0x5B72, [14996] = 0x5B6E, [14997] = 0x5BC1, [14998] = 0x5BC0, +- [14999] = 0x5C59, [15000] = 0x5D1E, [15001] = 0x5D0B, [15002] = 0x5D1D, +- [15003] = 0x5D1A, [15004] = 0x5D20, [15005] = 0x5D0C, [15006] = 0x5D28, +- [15007] = 0x5D0D, [15008] = 0x5D26, [15009] = 0x5D25, [15010] = 0x5D0F, +- [15015] = 0x5D30, [15016] = 0x5D12, [15017] = 0x5D23, [15018] = 0x5D1F, +- [15019] = 0x5D2E, [15020] = 0x5E3E, [15021] = 0x5E34, [15022] = 0x5EB1, +- [15023] = 0x5EB4, [15024] = 0x5EB9, [15025] = 0x5EB2, [15026] = 0x5EB3, +- [15027] = 0x5F36, [15028] = 0x5F38, [15029] = 0x5F9B, [15030] = 0x5F96, +- [15031] = 0x5F9F, [15032] = 0x608A, [15033] = 0x6090, [15034] = 0x6086, +- [15035] = 0x60BE, [15036] = 0x60B0, [15037] = 0x60BA, [15038] = 0x60D3, +- [15039] = 0x60D4, [15040] = 0x60CF, [15041] = 0x60E4, [15042] = 0x60D9, +- [15043] = 0x60DD, [15044] = 0x60C8, [15045] = 0x60B1, [15046] = 0x60DB, +- [15047] = 0x60B7, [15048] = 0x60CA, [15049] = 0x60BF, [15050] = 0x60C3, +- [15051] = 0x60CD, [15052] = 0x60C0, [15053] = 0x6332, [15054] = 0x6365, +- [15055] = 0x638A, [15056] = 0x6382, [15057] = 0x637D, [15058] = 0x63BD, +- [15059] = 0x639E, [15060] = 0x63AD, [15061] = 0x639D, [15062] = 0x6397, +- [15063] = 0x63AB, [15064] = 0x638E, [15065] = 0x636F, [15066] = 0x6387, +- [15067] = 0x6390, [15068] = 0x636E, [15069] = 0x63AF, [15070] = 0x6375, +- [15071] = 0x639C, [15072] = 0x636D, [15073] = 0x63AE, [15074] = 0x637C, +- [15075] = 0x63A4, [15076] = 0x633B, [15077] = 0x639F, [15112] = 0x6378, +- [15113] = 0x6385, [15114] = 0x6381, [15115] = 0x6391, [15116] = 0x638D, +- [15117] = 0x6370, [15118] = 0x6553, [15119] = 0x65CD, [15120] = 0x6665, +- [15121] = 0x6661, [15122] = 0x665B, [15123] = 0x6659, [15124] = 0x665C, +- [15125] = 0x6662, [15126] = 0x6718, [15127] = 0x6879, [15128] = 0x6887, +- [15129] = 0x6890, [15130] = 0x689C, [15131] = 0x686D, [15132] = 0x686E, +- [15133] = 0x68AE, [15134] = 0x68AB, [15135] = 0x6956, [15136] = 0x686F, +- [15137] = 0x68A3, [15138] = 0x68AC, [15139] = 0x68A9, [15140] = 0x6875, +- [15141] = 0x6874, [15142] = 0x68B2, [15143] = 0x688F, [15144] = 0x6877, +- [15145] = 0x6892, [15146] = 0x687C, [15147] = 0x686B, [15148] = 0x6872, +- [15149] = 0x68AA, [15150] = 0x6880, [15151] = 0x6871, [15152] = 0x687E, +- [15153] = 0x689B, [15154] = 0x6896, [15155] = 0x688B, [15156] = 0x68A0, +- [15157] = 0x6889, [15158] = 0x68A4, [15159] = 0x6878, [15160] = 0x687B, +- [15161] = 0x6891, [15162] = 0x688C, [15163] = 0x688A, [15164] = 0x687D, +- [15165] = 0x6B36, [15166] = 0x6B33, [15167] = 0x6B37, [15168] = 0x6B38, +- [15169] = 0x6B91, [15170] = 0x6B8F, [15171] = 0x6B8D, [15172] = 0x6B8E, +- [15173] = 0x6B8C, [15174] = 0x6C2A, [15175] = 0x6DC0, [15176] = 0x6DAB, +- [15177] = 0x6DB4, [15178] = 0x6DB3, [15179] = 0x6E74, [15180] = 0x6DAC, +- [15181] = 0x6DE9, [15182] = 0x6DE2, [15183] = 0x6DB7, [15184] = 0x6DF6, +- [15185] = 0x6DD4, [15186] = 0x6E00, [15187] = 0x6DC8, [15188] = 0x6DE0, +- [15189] = 0x6DDF, [15190] = 0x6DD6, [15191] = 0x6DBE, [15192] = 0x6DE5, +- [15193] = 0x6DDC, [15194] = 0x6DDD, [15195] = 0x6DDB, [15196] = 0x6DF4, +- [15197] = 0x6DCA, [15198] = 0x6DBD, [15199] = 0x6DED, [15200] = 0x6DF0, +- [15201] = 0x6DBA, [15202] = 0x6DD5, [15203] = 0x6DC2, [15204] = 0x6DCF, +- [15205] = 0x6DC9, [15210] = 0x6DD0, [15211] = 0x6DF2, [15212] = 0x6DD3, +- [15213] = 0x6DFD, [15214] = 0x6DD7, [15215] = 0x6DCD, [15216] = 0x6DE3, +- [15217] = 0x6DBB, [15218] = 0x70FA, [15219] = 0x710D, [15220] = 0x70F7, +- [15221] = 0x7117, [15222] = 0x70F4, [15223] = 0x710C, [15224] = 0x70F0, +- [15225] = 0x7104, [15226] = 0x70F3, [15227] = 0x7110, [15228] = 0x70FC, +- [15229] = 0x70FF, [15230] = 0x7106, [15231] = 0x7113, [15232] = 0x7100, +- [15233] = 0x70F8, [15234] = 0x70F6, [15235] = 0x710B, [15236] = 0x7102, +- [15237] = 0x710E, [15238] = 0x727E, [15239] = 0x727B, [15240] = 0x727C, +- [15241] = 0x727F, [15242] = 0x731D, [15243] = 0x7317, [15244] = 0x7307, +- [15245] = 0x7311, [15246] = 0x7318, [15247] = 0x730A, [15248] = 0x7308, +- [15249] = 0x72FF, [15250] = 0x730F, [15251] = 0x731E, [15252] = 0x7388, +- [15253] = 0x73F6, [15254] = 0x73F8, [15255] = 0x73F5, [15256] = 0x7404, +- [15257] = 0x7401, [15258] = 0x73FD, [15259] = 0x7407, [15260] = 0x7400, +- [15261] = 0x73FA, [15262] = 0x73FC, [15263] = 0x73FF, [15264] = 0x740C, +- [15265] = 0x740B, [15266] = 0x73F4, [15267] = 0x7408, [15268] = 0x7564, +- [15269] = 0x7563, [15270] = 0x75CE, [15271] = 0x75D2, [15272] = 0x75CF, +- [15307] = 0x75CB, [15308] = 0x75CC, [15309] = 0x75D1, [15310] = 0x75D0, +- [15311] = 0x768F, [15312] = 0x7689, [15313] = 0x76D3, [15314] = 0x7739, +- [15315] = 0x772F, [15316] = 0x772D, [15317] = 0x7731, [15318] = 0x7732, +- [15319] = 0x7734, [15320] = 0x7733, [15321] = 0x773D, [15322] = 0x7725, +- [15323] = 0x773B, [15324] = 0x7735, [15325] = 0x7848, [15326] = 0x7852, +- [15327] = 0x7849, [15328] = 0x784D, [15329] = 0x784A, [15330] = 0x784C, +- [15331] = 0x7826, [15332] = 0x7845, [15333] = 0x7850, [15334] = 0x7964, +- [15335] = 0x7967, [15336] = 0x7969, [15337] = 0x796A, [15338] = 0x7963, +- [15339] = 0x796B, [15340] = 0x7961, [15341] = 0x79BB, [15342] = 0x79FA, +- [15343] = 0x79F8, [15344] = 0x79F6, [15345] = 0x79F7, [15346] = 0x7A8F, +- [15347] = 0x7A94, [15348] = 0x7A90, [15349] = 0x7B35, [15350] = 0x7B47, +- [15351] = 0x7B34, [15352] = 0x7B25, [15353] = 0x7B30, [15354] = 0x7B22, +- [15355] = 0x7B24, [15356] = 0x7B33, [15357] = 0x7B18, [15358] = 0x7B2A, +- [15359] = 0x7B1D, [15360] = 0x7B31, [15361] = 0x7B2B, [15362] = 0x7B2D, +- [15363] = 0x7B2F, [15364] = 0x7B32, [15365] = 0x7B38, [15366] = 0x7B1A, +- [15367] = 0x7B23, [15368] = 0x7C94, [15369] = 0x7C98, [15370] = 0x7C96, +- [15371] = 0x7CA3, [15372] = 0x7D35, [15373] = 0x7D3D, [15374] = 0x7D38, +- [15375] = 0x7D36, [15376] = 0x7D3A, [15377] = 0x7D45, [15378] = 0x7D2C, +- [15379] = 0x7D29, [15380] = 0x7D41, [15381] = 0x7D47, [15382] = 0x7D3E, +- [15383] = 0x7D3F, [15384] = 0x7D4A, [15385] = 0x7D3B, [15386] = 0x7D28, +- [15387] = 0x7F63, [15388] = 0x7F95, [15389] = 0x7F9C, [15390] = 0x7F9D, +- [15391] = 0x7F9B, [15392] = 0x7FCA, [15393] = 0x7FCB, [15394] = 0x7FCD, +- [15395] = 0x7FD0, [15396] = 0x7FD1, [15397] = 0x7FC7, [15398] = 0x7FCF, +- [15399] = 0x7FC9, [15400] = 0x801F, [15405] = 0x801E, [15406] = 0x801B, +- [15407] = 0x8047, [15408] = 0x8043, [15409] = 0x8048, [15410] = 0x8118, +- [15411] = 0x8125, [15412] = 0x8119, [15413] = 0x811B, [15414] = 0x812D, +- [15415] = 0x811F, [15416] = 0x812C, [15417] = 0x811E, [15418] = 0x8121, +- [15419] = 0x8115, [15420] = 0x8127, [15421] = 0x811D, [15422] = 0x8122, +- [15423] = 0x8211, [15424] = 0x8238, [15425] = 0x8233, [15426] = 0x823A, +- [15427] = 0x8234, [15428] = 0x8232, [15429] = 0x8274, [15430] = 0x8390, +- [15431] = 0x83A3, [15432] = 0x83A8, [15433] = 0x838D, [15434] = 0x837A, +- [15435] = 0x8373, [15436] = 0x83A4, [15437] = 0x8374, [15438] = 0x838F, +- [15439] = 0x8381, [15440] = 0x8395, [15441] = 0x8399, [15442] = 0x8375, +- [15443] = 0x8394, [15444] = 0x83A9, [15445] = 0x837D, [15446] = 0x8383, +- [15447] = 0x838C, [15448] = 0x839D, [15449] = 0x839B, [15450] = 0x83AA, +- [15451] = 0x838B, [15452] = 0x837E, [15453] = 0x83A5, [15454] = 0x83AF, +- [15455] = 0x8388, [15456] = 0x8397, [15457] = 0x83B0, [15458] = 0x837F, +- [15459] = 0x83A6, [15460] = 0x8387, [15461] = 0x83AE, [15462] = 0x8376, +- [15463] = 0x839A, [15464] = 0x8659, [15465] = 0x8656, [15466] = 0x86BF, +- [15467] = 0x86B7, [15502] = 0x86C2, [15503] = 0x86C1, [15504] = 0x86C5, +- [15505] = 0x86BA, [15506] = 0x86B0, [15507] = 0x86C8, [15508] = 0x86B9, +- [15509] = 0x86B3, [15510] = 0x86B8, [15511] = 0x86CC, [15512] = 0x86B4, +- [15513] = 0x86BB, [15514] = 0x86BC, [15515] = 0x86C3, [15516] = 0x86BD, +- [15517] = 0x86BE, [15518] = 0x8852, [15519] = 0x8889, [15520] = 0x8895, +- [15521] = 0x88A8, [15522] = 0x88A2, [15523] = 0x88AA, [15524] = 0x889A, +- [15525] = 0x8891, [15526] = 0x88A1, [15527] = 0x889F, [15528] = 0x8898, +- [15529] = 0x88A7, [15530] = 0x8899, [15531] = 0x889B, [15532] = 0x8897, +- [15533] = 0x88A4, [15534] = 0x88AC, [15535] = 0x888C, [15536] = 0x8893, +- [15537] = 0x888E, [15538] = 0x8982, [15539] = 0x89D6, [15540] = 0x89D9, +- [15541] = 0x89D5, [15542] = 0x8A30, [15543] = 0x8A27, [15544] = 0x8A2C, +- [15545] = 0x8A1E, [15546] = 0x8C39, [15547] = 0x8C3B, [15548] = 0x8C5C, +- [15549] = 0x8C5D, [15550] = 0x8C7D, [15551] = 0x8CA5, [15552] = 0x8D7D, +- [15553] = 0x8D7B, [15554] = 0x8D79, [15555] = 0x8DBC, [15556] = 0x8DC2, +- [15557] = 0x8DB9, [15558] = 0x8DBF, [15559] = 0x8DC1, [15560] = 0x8ED8, +- [15561] = 0x8EDE, [15562] = 0x8EDD, [15563] = 0x8EDC, [15564] = 0x8ED7, +- [15565] = 0x8EE0, [15566] = 0x8EE1, [15567] = 0x9024, [15568] = 0x900B, +- [15569] = 0x9011, [15570] = 0x901C, [15571] = 0x900C, [15572] = 0x9021, +- [15573] = 0x90EF, [15574] = 0x90EA, [15575] = 0x90F0, [15576] = 0x90F4, +- [15577] = 0x90F2, [15578] = 0x90F3, [15579] = 0x90D4, [15580] = 0x90EB, +- [15581] = 0x90EC, [15582] = 0x90E9, [15583] = 0x9156, [15584] = 0x9158, +- [15585] = 0x915A, [15586] = 0x9153, [15587] = 0x9155, [15588] = 0x91EC, +- [15589] = 0x91F4, [15590] = 0x91F1, [15591] = 0x91F3, [15592] = 0x91F8, +- [15593] = 0x91E4, [15594] = 0x91F9, [15595] = 0x91EA, [15600] = 0x91EB, +- [15601] = 0x91F7, [15602] = 0x91E8, [15603] = 0x91EE, [15604] = 0x957A, +- [15605] = 0x9586, [15606] = 0x9588, [15607] = 0x967C, [15608] = 0x966D, +- [15609] = 0x966B, [15610] = 0x9671, [15611] = 0x966F, [15612] = 0x96BF, +- [15613] = 0x976A, [15614] = 0x9804, [15615] = 0x98E5, [15616] = 0x9997, +- [15617] = 0x509B, [15618] = 0x5095, [15619] = 0x5094, [15620] = 0x509E, +- [15621] = 0x508B, [15622] = 0x50A3, [15623] = 0x5083, [15624] = 0x508C, +- [15625] = 0x508E, [15626] = 0x509D, [15627] = 0x5068, [15628] = 0x509C, +- [15629] = 0x5092, [15630] = 0x5082, [15631] = 0x5087, [15632] = 0x515F, +- [15633] = 0x51D4, [15634] = 0x5312, [15635] = 0x5311, [15636] = 0x53A4, +- [15637] = 0x53A7, [15638] = 0x5591, [15639] = 0x55A8, [15640] = 0x55A5, +- [15641] = 0x55AD, [15642] = 0x5577, [15643] = 0x5645, [15644] = 0x55A2, +- [15645] = 0x5593, [15646] = 0x5588, [15647] = 0x558F, [15648] = 0x55B5, +- [15649] = 0x5581, [15650] = 0x55A3, [15651] = 0x5592, [15652] = 0x55A4, +- [15653] = 0x557D, [15654] = 0x558C, [15655] = 0x55A6, [15656] = 0x557F, +- [15657] = 0x5595, [15658] = 0x55A1, [15659] = 0x558E, [15660] = 0x570C, +- [15661] = 0x5829, [15662] = 0x5837, [15697] = 0x5819, [15698] = 0x581E, +- [15699] = 0x5827, [15700] = 0x5823, [15701] = 0x5828, [15702] = 0x57F5, +- [15703] = 0x5848, [15704] = 0x5825, [15705] = 0x581C, [15706] = 0x581B, +- [15707] = 0x5833, [15708] = 0x583F, [15709] = 0x5836, [15710] = 0x582E, +- [15711] = 0x5839, [15712] = 0x5838, [15713] = 0x582D, [15714] = 0x582C, +- [15715] = 0x583B, [15716] = 0x5961, [15717] = 0x5AAF, [15718] = 0x5A94, +- [15719] = 0x5A9F, [15720] = 0x5A7A, [15721] = 0x5AA2, [15722] = 0x5A9E, +- [15723] = 0x5A78, [15724] = 0x5AA6, [15725] = 0x5A7C, [15726] = 0x5AA5, +- [15727] = 0x5AAC, [15728] = 0x5A95, [15729] = 0x5AAE, [15730] = 0x5A37, +- [15731] = 0x5A84, [15732] = 0x5A8A, [15733] = 0x5A97, [15734] = 0x5A83, +- [15735] = 0x5A8B, [15736] = 0x5AA9, [15737] = 0x5A7B, [15738] = 0x5A7D, +- [15739] = 0x5A8C, [15740] = 0x5A9C, [15741] = 0x5A8F, [15742] = 0x5A93, +- [15743] = 0x5A9D, [15744] = 0x5BEA, [15745] = 0x5BCD, [15746] = 0x5BCB, +- [15747] = 0x5BD4, [15748] = 0x5BD1, [15749] = 0x5BCA, [15750] = 0x5BCE, +- [15751] = 0x5C0C, [15752] = 0x5C30, [15753] = 0x5D37, [15754] = 0x5D43, +- [15755] = 0x5D6B, [15756] = 0x5D41, [15757] = 0x5D4B, [15758] = 0x5D3F, +- [15759] = 0x5D35, [15760] = 0x5D51, [15761] = 0x5D4E, [15762] = 0x5D55, +- [15763] = 0x5D33, [15764] = 0x5D3A, [15765] = 0x5D52, [15766] = 0x5D3D, +- [15767] = 0x5D31, [15768] = 0x5D59, [15769] = 0x5D42, [15770] = 0x5D39, +- [15771] = 0x5D49, [15772] = 0x5D38, [15773] = 0x5D3C, [15774] = 0x5D32, +- [15775] = 0x5D36, [15776] = 0x5D40, [15777] = 0x5D45, [15778] = 0x5E44, +- [15779] = 0x5E41, [15780] = 0x5F58, [15781] = 0x5FA6, [15782] = 0x5FA5, +- [15783] = 0x5FAB, [15784] = 0x60C9, [15785] = 0x60B9, [15786] = 0x60CC, +- [15787] = 0x60E2, [15788] = 0x60CE, [15789] = 0x60C4, [15790] = 0x6114, +- [15795] = 0x60F2, [15796] = 0x610A, [15797] = 0x6116, [15798] = 0x6105, +- [15799] = 0x60F5, [15800] = 0x6113, [15801] = 0x60F8, [15802] = 0x60FC, +- [15803] = 0x60FE, [15804] = 0x60C1, [15805] = 0x6103, [15806] = 0x6118, +- [15807] = 0x611D, [15808] = 0x6110, [15809] = 0x60FF, [15810] = 0x6104, +- [15811] = 0x610B, [15812] = 0x624A, [15813] = 0x6394, [15814] = 0x63B1, +- [15815] = 0x63B0, [15816] = 0x63CE, [15817] = 0x63E5, [15818] = 0x63E8, +- [15819] = 0x63EF, [15820] = 0x63C3, [15821] = 0x649D, [15822] = 0x63F3, +- [15823] = 0x63CA, [15824] = 0x63E0, [15825] = 0x63F6, [15826] = 0x63D5, +- [15827] = 0x63F2, [15828] = 0x63F5, [15829] = 0x6461, [15830] = 0x63DF, +- [15831] = 0x63BE, [15832] = 0x63DD, [15833] = 0x63DC, [15834] = 0x63C4, +- [15835] = 0x63D8, [15836] = 0x63D3, [15837] = 0x63C2, [15838] = 0x63C7, +- [15839] = 0x63CC, [15840] = 0x63CB, [15841] = 0x63C8, [15842] = 0x63F0, +- [15843] = 0x63D7, [15844] = 0x63D9, [15845] = 0x6532, [15846] = 0x6567, +- [15847] = 0x656A, [15848] = 0x6564, [15849] = 0x655C, [15850] = 0x6568, +- [15851] = 0x6565, [15852] = 0x658C, [15853] = 0x659D, [15854] = 0x659E, +- [15855] = 0x65AE, [15856] = 0x65D0, [15857] = 0x65D2, [15892] = 0x667C, +- [15893] = 0x666C, [15894] = 0x667B, [15895] = 0x6680, [15896] = 0x6671, +- [15897] = 0x6679, [15898] = 0x666A, [15899] = 0x6672, [15900] = 0x6701, +- [15901] = 0x690C, [15902] = 0x68D3, [15903] = 0x6904, [15904] = 0x68DC, +- [15905] = 0x692A, [15906] = 0x68EC, [15907] = 0x68EA, [15908] = 0x68F1, +- [15909] = 0x690F, [15910] = 0x68D6, [15911] = 0x68F7, [15912] = 0x68EB, +- [15913] = 0x68E4, [15914] = 0x68F6, [15915] = 0x6913, [15916] = 0x6910, +- [15917] = 0x68F3, [15918] = 0x68E1, [15919] = 0x6907, [15920] = 0x68CC, +- [15921] = 0x6908, [15922] = 0x6970, [15923] = 0x68B4, [15924] = 0x6911, +- [15925] = 0x68EF, [15926] = 0x68C6, [15927] = 0x6914, [15928] = 0x68F8, +- [15929] = 0x68D0, [15930] = 0x68FD, [15931] = 0x68FC, [15932] = 0x68E8, +- [15933] = 0x690B, [15934] = 0x690A, [15935] = 0x6917, [15936] = 0x68CE, +- [15937] = 0x68C8, [15938] = 0x68DD, [15939] = 0x68DE, [15940] = 0x68E6, +- [15941] = 0x68F4, [15942] = 0x68D1, [15943] = 0x6906, [15944] = 0x68D4, +- [15945] = 0x68E9, [15946] = 0x6915, [15947] = 0x6925, [15948] = 0x68C7, +- [15949] = 0x6B39, [15950] = 0x6B3B, [15951] = 0x6B3F, [15952] = 0x6B3C, +- [15953] = 0x6B94, [15954] = 0x6B97, [15955] = 0x6B99, [15956] = 0x6B95, +- [15957] = 0x6BBD, [15958] = 0x6BF0, [15959] = 0x6BF2, [15960] = 0x6BF3, +- [15961] = 0x6C30, [15962] = 0x6DFC, [15963] = 0x6E46, [15964] = 0x6E47, +- [15965] = 0x6E1F, [15966] = 0x6E49, [15967] = 0x6E88, [15968] = 0x6E3C, +- [15969] = 0x6E3D, [15970] = 0x6E45, [15971] = 0x6E62, [15972] = 0x6E2B, +- [15973] = 0x6E3F, [15974] = 0x6E41, [15975] = 0x6E5D, [15976] = 0x6E73, +- [15977] = 0x6E1C, [15978] = 0x6E33, [15979] = 0x6E4B, [15980] = 0x6E40, +- [15981] = 0x6E51, [15982] = 0x6E3B, [15983] = 0x6E03, [15984] = 0x6E2E, +- [15985] = 0x6E5E, [15990] = 0x6E68, [15991] = 0x6E5C, [15992] = 0x6E61, +- [15993] = 0x6E31, [15994] = 0x6E28, [15995] = 0x6E60, [15996] = 0x6E71, +- [15997] = 0x6E6B, [15998] = 0x6E39, [15999] = 0x6E22, [16000] = 0x6E30, +- [16001] = 0x6E53, [16002] = 0x6E65, [16003] = 0x6E27, [16004] = 0x6E78, +- [16005] = 0x6E64, [16006] = 0x6E77, [16007] = 0x6E55, [16008] = 0x6E79, +- [16009] = 0x6E52, [16010] = 0x6E66, [16011] = 0x6E35, [16012] = 0x6E36, +- [16013] = 0x6E5A, [16014] = 0x7120, [16015] = 0x711E, [16016] = 0x712F, +- [16017] = 0x70FB, [16018] = 0x712E, [16019] = 0x7131, [16020] = 0x7123, +- [16021] = 0x7125, [16022] = 0x7122, [16023] = 0x7132, [16024] = 0x711F, +- [16025] = 0x7128, [16026] = 0x713A, [16027] = 0x711B, [16028] = 0x724B, +- [16029] = 0x725A, [16030] = 0x7288, [16031] = 0x7289, [16032] = 0x7286, +- [16033] = 0x7285, [16034] = 0x728B, [16035] = 0x7312, [16036] = 0x730B, +- [16037] = 0x7330, [16038] = 0x7322, [16039] = 0x7331, [16040] = 0x7333, +- [16041] = 0x7327, [16042] = 0x7332, [16043] = 0x732D, [16044] = 0x7326, +- [16045] = 0x7323, [16046] = 0x7335, [16047] = 0x730C, [16048] = 0x742E, +- [16049] = 0x742C, [16050] = 0x7430, [16051] = 0x742B, [16052] = 0x7416, +- [16087] = 0x741A, [16088] = 0x7421, [16089] = 0x742D, [16090] = 0x7431, +- [16091] = 0x7424, [16092] = 0x7423, [16093] = 0x741D, [16094] = 0x7429, +- [16095] = 0x7420, [16096] = 0x7432, [16097] = 0x74FB, [16098] = 0x752F, +- [16099] = 0x756F, [16100] = 0x756C, [16101] = 0x75E7, [16102] = 0x75DA, +- [16103] = 0x75E1, [16104] = 0x75E6, [16105] = 0x75DD, [16106] = 0x75DF, +- [16107] = 0x75E4, [16108] = 0x75D7, [16109] = 0x7695, [16110] = 0x7692, +- [16111] = 0x76DA, [16112] = 0x7746, [16113] = 0x7747, [16114] = 0x7744, +- [16115] = 0x774D, [16116] = 0x7745, [16117] = 0x774A, [16118] = 0x774E, +- [16119] = 0x774B, [16120] = 0x774C, [16121] = 0x77DE, [16122] = 0x77EC, +- [16123] = 0x7860, [16124] = 0x7864, [16125] = 0x7865, [16126] = 0x785C, +- [16127] = 0x786D, [16128] = 0x7871, [16129] = 0x786A, [16130] = 0x786E, +- [16131] = 0x7870, [16132] = 0x7869, [16133] = 0x7868, [16134] = 0x785E, +- [16135] = 0x7862, [16136] = 0x7974, [16137] = 0x7973, [16138] = 0x7972, +- [16139] = 0x7970, [16140] = 0x7A02, [16141] = 0x7A0A, [16142] = 0x7A03, +- [16143] = 0x7A0C, [16144] = 0x7A04, [16145] = 0x7A99, [16146] = 0x7AE6, +- [16147] = 0x7AE4, [16148] = 0x7B4A, [16149] = 0x7B3B, [16150] = 0x7B44, +- [16151] = 0x7B48, [16152] = 0x7B4C, [16153] = 0x7B4E, [16154] = 0x7B40, +- [16155] = 0x7B58, [16156] = 0x7B45, [16157] = 0x7CA2, [16158] = 0x7C9E, +- [16159] = 0x7CA8, [16160] = 0x7CA1, [16161] = 0x7D58, [16162] = 0x7D6F, +- [16163] = 0x7D63, [16164] = 0x7D53, [16165] = 0x7D56, [16166] = 0x7D67, +- [16167] = 0x7D6A, [16168] = 0x7D4F, [16169] = 0x7D6D, [16170] = 0x7D5C, +- [16171] = 0x7D6B, [16172] = 0x7D52, [16173] = 0x7D54, [16174] = 0x7D69, +- [16175] = 0x7D51, [16176] = 0x7D5F, [16177] = 0x7D4E, [16178] = 0x7F3E, +- [16179] = 0x7F3F, [16180] = 0x7F65, [16185] = 0x7F66, [16186] = 0x7FA2, +- [16187] = 0x7FA0, [16188] = 0x7FA1, [16189] = 0x7FD7, [16190] = 0x8051, +- [16191] = 0x804F, [16192] = 0x8050, [16193] = 0x80FE, [16194] = 0x80D4, +- [16195] = 0x8143, [16196] = 0x814A, [16197] = 0x8152, [16198] = 0x814F, +- [16199] = 0x8147, [16200] = 0x813D, [16201] = 0x814D, [16202] = 0x813A, +- [16203] = 0x81E6, [16204] = 0x81EE, [16205] = 0x81F7, [16206] = 0x81F8, +- [16207] = 0x81F9, [16208] = 0x8204, [16209] = 0x823C, [16210] = 0x823D, +- [16211] = 0x823F, [16212] = 0x8275, [16213] = 0x833B, [16214] = 0x83CF, +- [16215] = 0x83F9, [16216] = 0x8423, [16217] = 0x83C0, [16218] = 0x83E8, +- [16219] = 0x8412, [16220] = 0x83E7, [16221] = 0x83E4, [16222] = 0x83FC, +- [16223] = 0x83F6, [16224] = 0x8410, [16225] = 0x83C6, [16226] = 0x83C8, +- [16227] = 0x83EB, [16228] = 0x83E3, [16229] = 0x83BF, [16230] = 0x8401, +- [16231] = 0x83DD, [16232] = 0x83E5, [16233] = 0x83D8, [16234] = 0x83FF, +- [16235] = 0x83E1, [16236] = 0x83CB, [16237] = 0x83CE, [16238] = 0x83D6, +- [16239] = 0x83F5, [16240] = 0x83C9, [16241] = 0x8409, [16242] = 0x840F, +- [16243] = 0x83DE, [16244] = 0x8411, [16245] = 0x8406, [16246] = 0x83C2, +- [16247] = 0x83F3, [16282] = 0x83D5, [16283] = 0x83FA, [16284] = 0x83C7, +- [16285] = 0x83D1, [16286] = 0x83EA, [16287] = 0x8413, [16288] = 0x83C3, +- [16289] = 0x83EC, [16290] = 0x83EE, [16291] = 0x83C4, [16292] = 0x83FB, +- [16293] = 0x83D7, [16294] = 0x83E2, [16295] = 0x841B, [16296] = 0x83DB, +- [16297] = 0x83FE, [16298] = 0x86D8, [16299] = 0x86E2, [16300] = 0x86E6, +- [16301] = 0x86D3, [16302] = 0x86E3, [16303] = 0x86DA, [16304] = 0x86EA, +- [16305] = 0x86DD, [16306] = 0x86EB, [16307] = 0x86DC, [16308] = 0x86EC, +- [16309] = 0x86E9, [16310] = 0x86D7, [16311] = 0x86E8, [16312] = 0x86D1, +- [16313] = 0x8848, [16314] = 0x8856, [16315] = 0x8855, [16316] = 0x88BA, +- [16317] = 0x88D7, [16318] = 0x88B9, [16319] = 0x88B8, [16320] = 0x88C0, +- [16321] = 0x88BE, [16322] = 0x88B6, [16323] = 0x88BC, [16324] = 0x88B7, +- [16325] = 0x88BD, [16326] = 0x88B2, [16327] = 0x8901, [16328] = 0x88C9, +- [16329] = 0x8995, [16330] = 0x8998, [16331] = 0x8997, [16332] = 0x89DD, +- [16333] = 0x89DA, [16334] = 0x89DB, [16335] = 0x8A4E, [16336] = 0x8A4D, +- [16337] = 0x8A39, [16338] = 0x8A59, [16339] = 0x8A40, [16340] = 0x8A57, +- [16341] = 0x8A58, [16342] = 0x8A44, [16343] = 0x8A45, [16344] = 0x8A52, +- [16345] = 0x8A48, [16346] = 0x8A51, [16347] = 0x8A4A, [16348] = 0x8A4C, +- [16349] = 0x8A4F, [16350] = 0x8C5F, [16351] = 0x8C81, [16352] = 0x8C80, +- [16353] = 0x8CBA, [16354] = 0x8CBE, [16355] = 0x8CB0, [16356] = 0x8CB9, +- [16357] = 0x8CB5, [16358] = 0x8D84, [16359] = 0x8D80, [16360] = 0x8D89, +- [16361] = 0x8DD8, [16362] = 0x8DD3, [16363] = 0x8DCD, [16364] = 0x8DC7, +- [16365] = 0x8DD6, [16366] = 0x8DDC, [16367] = 0x8DCF, [16368] = 0x8DD5, +- [16369] = 0x8DD9, [16370] = 0x8DC8, [16371] = 0x8DD7, [16372] = 0x8DC5, +- [16373] = 0x8EEF, [16374] = 0x8EF7, [16375] = 0x8EFA, [16380] = 0x8EF9, +- [16381] = 0x8EE6, [16382] = 0x8EEE, [16383] = 0x8EE5, [16384] = 0x8EF5, +- [16385] = 0x8EE7, [16386] = 0x8EE8, [16387] = 0x8EF6, [16388] = 0x8EEB, +- [16389] = 0x8EF1, [16390] = 0x8EEC, [16391] = 0x8EF4, [16392] = 0x8EE9, +- [16393] = 0x902D, [16394] = 0x9034, [16395] = 0x902F, [16396] = 0x9106, +- [16397] = 0x912C, [16398] = 0x9104, [16399] = 0x90FF, [16400] = 0x90FC, +- [16401] = 0x9108, [16402] = 0x90F9, [16403] = 0x90FB, [16404] = 0x9101, +- [16405] = 0x9100, [16406] = 0x9107, [16407] = 0x9105, [16408] = 0x9103, +- [16409] = 0x9161, [16410] = 0x9164, [16411] = 0x915F, [16412] = 0x9162, +- [16413] = 0x9160, [16414] = 0x9201, [16415] = 0x920A, [16416] = 0x9225, +- [16417] = 0x9203, [16418] = 0x921A, [16419] = 0x9226, [16420] = 0x920F, +- [16421] = 0x920C, [16422] = 0x9200, [16423] = 0x9212, [16424] = 0x91FF, +- [16425] = 0x91FD, [16426] = 0x9206, [16427] = 0x9204, [16428] = 0x9227, +- [16429] = 0x9202, [16430] = 0x921C, [16431] = 0x9224, [16432] = 0x9219, +- [16433] = 0x9217, [16434] = 0x9205, [16435] = 0x9216, [16436] = 0x957B, +- [16437] = 0x958D, [16438] = 0x958C, [16439] = 0x9590, [16440] = 0x9687, +- [16441] = 0x967E, [16442] = 0x9688, [16477] = 0x9689, [16478] = 0x9683, +- [16479] = 0x9680, [16480] = 0x96C2, [16481] = 0x96C8, [16482] = 0x96C3, +- [16483] = 0x96F1, [16484] = 0x96F0, [16485] = 0x976C, [16486] = 0x9770, +- [16487] = 0x976E, [16488] = 0x9807, [16489] = 0x98A9, [16490] = 0x98EB, +- [16491] = 0x9CE6, [16492] = 0x9EF9, [16493] = 0x4E83, [16494] = 0x4E84, +- [16495] = 0x4EB6, [16496] = 0x50BD, [16497] = 0x50BF, [16498] = 0x50C6, +- [16499] = 0x50AE, [16500] = 0x50C4, [16501] = 0x50CA, [16502] = 0x50B4, +- [16503] = 0x50C8, [16504] = 0x50C2, [16505] = 0x50B0, [16506] = 0x50C1, +- [16507] = 0x50BA, [16508] = 0x50B1, [16509] = 0x50CB, [16510] = 0x50C9, +- [16511] = 0x50B6, [16512] = 0x50B8, [16513] = 0x51D7, [16514] = 0x527A, +- [16515] = 0x5278, [16516] = 0x527B, [16517] = 0x527C, [16518] = 0x55C3, +- [16519] = 0x55DB, [16520] = 0x55CC, [16521] = 0x55D0, [16522] = 0x55CB, +- [16523] = 0x55CA, [16524] = 0x55DD, [16525] = 0x55C0, [16526] = 0x55D4, +- [16527] = 0x55C4, [16528] = 0x55E9, [16529] = 0x55BF, [16530] = 0x55D2, +- [16531] = 0x558D, [16532] = 0x55CF, [16533] = 0x55D5, [16534] = 0x55E2, +- [16535] = 0x55D6, [16536] = 0x55C8, [16537] = 0x55F2, [16538] = 0x55CD, +- [16539] = 0x55D9, [16540] = 0x55C2, [16541] = 0x5714, [16542] = 0x5853, +- [16543] = 0x5868, [16544] = 0x5864, [16545] = 0x584F, [16546] = 0x584D, +- [16547] = 0x5849, [16548] = 0x586F, [16549] = 0x5855, [16550] = 0x584E, +- [16551] = 0x585D, [16552] = 0x5859, [16553] = 0x5865, [16554] = 0x585B, +- [16555] = 0x583D, [16556] = 0x5863, [16557] = 0x5871, [16558] = 0x58FC, +- [16559] = 0x5AC7, [16560] = 0x5AC4, [16561] = 0x5ACB, [16562] = 0x5ABA, +- [16563] = 0x5AB8, [16564] = 0x5AB1, [16565] = 0x5AB5, [16566] = 0x5AB0, +- [16567] = 0x5ABF, [16568] = 0x5AC8, [16569] = 0x5ABB, [16570] = 0x5AC6, +- [16575] = 0x5AB7, [16576] = 0x5AC0, [16577] = 0x5ACA, [16578] = 0x5AB4, +- [16579] = 0x5AB6, [16580] = 0x5ACD, [16581] = 0x5AB9, [16582] = 0x5A90, +- [16583] = 0x5BD6, [16584] = 0x5BD8, [16585] = 0x5BD9, [16586] = 0x5C1F, +- [16587] = 0x5C33, [16588] = 0x5D71, [16589] = 0x5D63, [16590] = 0x5D4A, +- [16591] = 0x5D65, [16592] = 0x5D72, [16593] = 0x5D6C, [16594] = 0x5D5E, +- [16595] = 0x5D68, [16596] = 0x5D67, [16597] = 0x5D62, [16598] = 0x5DF0, +- [16599] = 0x5E4F, [16600] = 0x5E4E, [16601] = 0x5E4A, [16602] = 0x5E4D, +- [16603] = 0x5E4B, [16604] = 0x5EC5, [16605] = 0x5ECC, [16606] = 0x5EC6, +- [16607] = 0x5ECB, [16608] = 0x5EC7, [16609] = 0x5F40, [16610] = 0x5FAF, +- [16611] = 0x5FAD, [16612] = 0x60F7, [16613] = 0x6149, [16614] = 0x614A, +- [16615] = 0x612B, [16616] = 0x6145, [16617] = 0x6136, [16618] = 0x6132, +- [16619] = 0x612E, [16620] = 0x6146, [16621] = 0x612F, [16622] = 0x614F, +- [16623] = 0x6129, [16624] = 0x6140, [16625] = 0x6220, [16626] = 0x9168, +- [16627] = 0x6223, [16628] = 0x6225, [16629] = 0x6224, [16630] = 0x63C5, +- [16631] = 0x63F1, [16632] = 0x63EB, [16633] = 0x6410, [16634] = 0x6412, +- [16635] = 0x6409, [16636] = 0x6420, [16637] = 0x6424, [16672] = 0x6433, +- [16673] = 0x6443, [16674] = 0x641F, [16675] = 0x6415, [16676] = 0x6418, +- [16677] = 0x6439, [16678] = 0x6437, [16679] = 0x6422, [16680] = 0x6423, +- [16681] = 0x640C, [16682] = 0x6426, [16683] = 0x6430, [16684] = 0x6428, +- [16685] = 0x6441, [16686] = 0x6435, [16687] = 0x642F, [16688] = 0x640A, +- [16689] = 0x641A, [16690] = 0x6440, [16691] = 0x6425, [16692] = 0x6427, +- [16693] = 0x640B, [16694] = 0x63E7, [16695] = 0x641B, [16696] = 0x642E, +- [16697] = 0x6421, [16698] = 0x640E, [16699] = 0x656F, [16700] = 0x6592, +- [16701] = 0x65D3, [16702] = 0x6686, [16703] = 0x668C, [16704] = 0x6695, +- [16705] = 0x6690, [16706] = 0x668B, [16707] = 0x668A, [16708] = 0x6699, +- [16709] = 0x6694, [16710] = 0x6678, [16711] = 0x6720, [16712] = 0x6966, +- [16713] = 0x695F, [16714] = 0x6938, [16715] = 0x694E, [16716] = 0x6962, +- [16717] = 0x6971, [16718] = 0x693F, [16719] = 0x6945, [16720] = 0x696A, +- [16721] = 0x6939, [16722] = 0x6942, [16723] = 0x6957, [16724] = 0x6959, +- [16725] = 0x697A, [16726] = 0x6948, [16727] = 0x6949, [16728] = 0x6935, +- [16729] = 0x696C, [16730] = 0x6933, [16731] = 0x693D, [16732] = 0x6965, +- [16733] = 0x68F0, [16734] = 0x6978, [16735] = 0x6934, [16736] = 0x6969, +- [16737] = 0x6940, [16738] = 0x696F, [16739] = 0x6944, [16740] = 0x6976, +- [16741] = 0x6958, [16742] = 0x6941, [16743] = 0x6974, [16744] = 0x694C, +- [16745] = 0x693B, [16746] = 0x694B, [16747] = 0x6937, [16748] = 0x695C, +- [16749] = 0x694F, [16750] = 0x6951, [16751] = 0x6932, [16752] = 0x6952, +- [16753] = 0x692F, [16754] = 0x697B, [16755] = 0x693C, [16756] = 0x6B46, +- [16757] = 0x6B45, [16758] = 0x6B43, [16759] = 0x6B42, [16760] = 0x6B48, +- [16761] = 0x6B41, [16762] = 0x6B9B, [16763] = 0xFA0D, [16764] = 0x6BFB, +- [16765] = 0x6BFC, [16770] = 0x6BF9, [16771] = 0x6BF7, [16772] = 0x6BF8, +- [16773] = 0x6E9B, [16774] = 0x6ED6, [16775] = 0x6EC8, [16776] = 0x6E8F, +- [16777] = 0x6EC0, [16778] = 0x6E9F, [16779] = 0x6E93, [16780] = 0x6E94, +- [16781] = 0x6EA0, [16782] = 0x6EB1, [16783] = 0x6EB9, [16784] = 0x6EC6, +- [16785] = 0x6ED2, [16786] = 0x6EBD, [16787] = 0x6EC1, [16788] = 0x6E9E, +- [16789] = 0x6EC9, [16790] = 0x6EB7, [16791] = 0x6EB0, [16792] = 0x6ECD, +- [16793] = 0x6EA6, [16794] = 0x6ECF, [16795] = 0x6EB2, [16796] = 0x6EBE, +- [16797] = 0x6EC3, [16798] = 0x6EDC, [16799] = 0x6ED8, [16800] = 0x6E99, +- [16801] = 0x6E92, [16802] = 0x6E8E, [16803] = 0x6E8D, [16804] = 0x6EA4, +- [16805] = 0x6EA1, [16806] = 0x6EBF, [16807] = 0x6EB3, [16808] = 0x6ED0, +- [16809] = 0x6ECA, [16810] = 0x6E97, [16811] = 0x6EAE, [16812] = 0x6EA3, +- [16813] = 0x7147, [16814] = 0x7154, [16815] = 0x7152, [16816] = 0x7163, +- [16817] = 0x7160, [16818] = 0x7141, [16819] = 0x715D, [16820] = 0x7162, +- [16821] = 0x7172, [16822] = 0x7178, [16823] = 0x716A, [16824] = 0x7161, +- [16825] = 0x7142, [16826] = 0x7158, [16827] = 0x7143, [16828] = 0x714B, +- [16829] = 0x7170, [16830] = 0x715F, [16831] = 0x7150, [16832] = 0x7153, +- [16867] = 0x7144, [16868] = 0x714D, [16869] = 0x715A, [16870] = 0x724F, +- [16871] = 0x728D, [16872] = 0x728C, [16873] = 0x7291, [16874] = 0x7290, +- [16875] = 0x728E, [16876] = 0x733C, [16877] = 0x7342, [16878] = 0x733B, +- [16879] = 0x733A, [16880] = 0x7340, [16881] = 0x734A, [16882] = 0x7349, +- [16883] = 0x7444, [16884] = 0x744A, [16885] = 0x744B, [16886] = 0x7452, +- [16887] = 0x7451, [16888] = 0x7457, [16889] = 0x7440, [16890] = 0x744F, +- [16891] = 0x7450, [16892] = 0x744E, [16893] = 0x7442, [16894] = 0x7446, +- [16895] = 0x744D, [16896] = 0x7454, [16897] = 0x74E1, [16898] = 0x74FF, +- [16899] = 0x74FE, [16900] = 0x74FD, [16901] = 0x751D, [16902] = 0x7579, +- [16903] = 0x7577, [16904] = 0x6983, [16905] = 0x75EF, [16906] = 0x760F, +- [16907] = 0x7603, [16908] = 0x75F7, [16909] = 0x75FE, [16910] = 0x75FC, +- [16911] = 0x75F9, [16912] = 0x75F8, [16913] = 0x7610, [16914] = 0x75FB, +- [16915] = 0x75F6, [16916] = 0x75ED, [16917] = 0x75F5, [16918] = 0x75FD, +- [16919] = 0x7699, [16920] = 0x76B5, [16921] = 0x76DD, [16922] = 0x7755, +- [16923] = 0x775F, [16924] = 0x7760, [16925] = 0x7752, [16926] = 0x7756, +- [16927] = 0x775A, [16928] = 0x7769, [16929] = 0x7767, [16930] = 0x7754, +- [16931] = 0x7759, [16932] = 0x776D, [16933] = 0x77E0, [16934] = 0x7887, +- [16935] = 0x789A, [16936] = 0x7894, [16937] = 0x788F, [16938] = 0x7884, +- [16939] = 0x7895, [16940] = 0x7885, [16941] = 0x7886, [16942] = 0x78A1, +- [16943] = 0x7883, [16944] = 0x7879, [16945] = 0x7899, [16946] = 0x7880, +- [16947] = 0x7896, [16948] = 0x787B, [16949] = 0x797C, [16950] = 0x7982, +- [16951] = 0x797D, [16952] = 0x7979, [16953] = 0x7A11, [16954] = 0x7A18, +- [16955] = 0x7A19, [16956] = 0x7A12, [16957] = 0x7A17, [16958] = 0x7A15, +- [16959] = 0x7A22, [16960] = 0x7A13, [16965] = 0x7A1B, [16966] = 0x7A10, +- [16967] = 0x7AA3, [16968] = 0x7AA2, [16969] = 0x7A9E, [16970] = 0x7AEB, +- [16971] = 0x7B66, [16972] = 0x7B64, [16973] = 0x7B6D, [16974] = 0x7B74, +- [16975] = 0x7B69, [16976] = 0x7B72, [16977] = 0x7B65, [16978] = 0x7B73, +- [16979] = 0x7B71, [16980] = 0x7B70, [16981] = 0x7B61, [16982] = 0x7B78, +- [16983] = 0x7B76, [16984] = 0x7B63, [16985] = 0x7CB2, [16986] = 0x7CB4, +- [16987] = 0x7CAF, [16988] = 0x7D88, [16989] = 0x7D86, [16990] = 0x7D80, +- [16991] = 0x7D8D, [16992] = 0x7D7F, [16993] = 0x7D85, [16994] = 0x7D7A, +- [16995] = 0x7D8E, [16996] = 0x7D7B, [16997] = 0x7D83, [16998] = 0x7D7C, +- [16999] = 0x7D8C, [17000] = 0x7D94, [17001] = 0x7D84, [17002] = 0x7D7D, +- [17003] = 0x7D92, [17004] = 0x7F6D, [17005] = 0x7F6B, [17006] = 0x7F67, +- [17007] = 0x7F68, [17008] = 0x7F6C, [17009] = 0x7FA6, [17010] = 0x7FA5, +- [17011] = 0x7FA7, [17012] = 0x7FDB, [17013] = 0x7FDC, [17014] = 0x8021, +- [17015] = 0x8164, [17016] = 0x8160, [17017] = 0x8177, [17018] = 0x815C, +- [17019] = 0x8169, [17020] = 0x815B, [17021] = 0x8162, [17022] = 0x8172, +- [17023] = 0x6721, [17024] = 0x815E, [17025] = 0x8176, [17026] = 0x8167, +- [17027] = 0x816F, [17062] = 0x8144, [17063] = 0x8161, [17064] = 0x821D, +- [17065] = 0x8249, [17066] = 0x8244, [17067] = 0x8240, [17068] = 0x8242, +- [17069] = 0x8245, [17070] = 0x84F1, [17071] = 0x843F, [17072] = 0x8456, +- [17073] = 0x8476, [17074] = 0x8479, [17075] = 0x848F, [17076] = 0x848D, +- [17077] = 0x8465, [17078] = 0x8451, [17079] = 0x8440, [17080] = 0x8486, +- [17081] = 0x8467, [17082] = 0x8430, [17083] = 0x844D, [17084] = 0x847D, +- [17085] = 0x845A, [17086] = 0x8459, [17087] = 0x8474, [17088] = 0x8473, +- [17089] = 0x845D, [17090] = 0x8507, [17091] = 0x845E, [17092] = 0x8437, +- [17093] = 0x843A, [17094] = 0x8434, [17095] = 0x847A, [17096] = 0x8443, +- [17097] = 0x8478, [17098] = 0x8432, [17099] = 0x8445, [17100] = 0x8429, +- [17101] = 0x83D9, [17102] = 0x844B, [17103] = 0x842F, [17104] = 0x8442, +- [17105] = 0x842D, [17106] = 0x845F, [17107] = 0x8470, [17108] = 0x8439, +- [17109] = 0x844E, [17110] = 0x844C, [17111] = 0x8452, [17112] = 0x846F, +- [17113] = 0x84C5, [17114] = 0x848E, [17115] = 0x843B, [17116] = 0x8447, +- [17117] = 0x8436, [17118] = 0x8433, [17119] = 0x8468, [17120] = 0x847E, +- [17121] = 0x8444, [17122] = 0x842B, [17123] = 0x8460, [17124] = 0x8454, +- [17125] = 0x846E, [17126] = 0x8450, [17127] = 0x870B, [17128] = 0x8704, +- [17129] = 0x86F7, [17130] = 0x870C, [17131] = 0x86FA, [17132] = 0x86D6, +- [17133] = 0x86F5, [17134] = 0x874D, [17135] = 0x86F8, [17136] = 0x870E, +- [17137] = 0x8709, [17138] = 0x8701, [17139] = 0x86F6, [17140] = 0x870D, +- [17141] = 0x8705, [17142] = 0x88D6, [17143] = 0x88CB, [17144] = 0x88CD, +- [17145] = 0x88CE, [17146] = 0x88DE, [17147] = 0x88DB, [17148] = 0x88DA, +- [17149] = 0x88CC, [17150] = 0x88D0, [17151] = 0x8985, [17152] = 0x899B, +- [17153] = 0x89DF, [17154] = 0x89E5, [17155] = 0x89E4, [17160] = 0x89E1, +- [17161] = 0x89E0, [17162] = 0x89E2, [17163] = 0x89DC, [17164] = 0x89E6, +- [17165] = 0x8A76, [17166] = 0x8A86, [17167] = 0x8A7F, [17168] = 0x8A61, +- [17169] = 0x8A3F, [17170] = 0x8A77, [17171] = 0x8A82, [17172] = 0x8A84, +- [17173] = 0x8A75, [17174] = 0x8A83, [17175] = 0x8A81, [17176] = 0x8A74, +- [17177] = 0x8A7A, [17178] = 0x8C3C, [17179] = 0x8C4B, [17180] = 0x8C4A, +- [17181] = 0x8C65, [17182] = 0x8C64, [17183] = 0x8C66, [17184] = 0x8C86, +- [17185] = 0x8C84, [17186] = 0x8C85, [17187] = 0x8CCC, [17188] = 0x8D68, +- [17189] = 0x8D69, [17190] = 0x8D91, [17191] = 0x8D8C, [17192] = 0x8D8E, +- [17193] = 0x8D8F, [17194] = 0x8D8D, [17195] = 0x8D93, [17196] = 0x8D94, +- [17197] = 0x8D90, [17198] = 0x8D92, [17199] = 0x8DF0, [17200] = 0x8DE0, +- [17201] = 0x8DEC, [17202] = 0x8DF1, [17203] = 0x8DEE, [17204] = 0x8DD0, +- [17205] = 0x8DE9, [17206] = 0x8DE3, [17207] = 0x8DE2, [17208] = 0x8DE7, +- [17209] = 0x8DF2, [17210] = 0x8DEB, [17211] = 0x8DF4, [17212] = 0x8F06, +- [17213] = 0x8EFF, [17214] = 0x8F01, [17215] = 0x8F00, [17216] = 0x8F05, +- [17217] = 0x8F07, [17218] = 0x8F08, [17219] = 0x8F02, [17220] = 0x8F0B, +- [17221] = 0x9052, [17222] = 0x903F, [17257] = 0x9044, [17258] = 0x9049, +- [17259] = 0x903D, [17260] = 0x9110, [17261] = 0x910D, [17262] = 0x910F, +- [17263] = 0x9111, [17264] = 0x9116, [17265] = 0x9114, [17266] = 0x910B, +- [17267] = 0x910E, [17268] = 0x916E, [17269] = 0x916F, [17270] = 0x9248, +- [17271] = 0x9252, [17272] = 0x9230, [17273] = 0x923A, [17274] = 0x9266, +- [17275] = 0x9233, [17276] = 0x9265, [17277] = 0x925E, [17278] = 0x9283, +- [17279] = 0x922E, [17280] = 0x924A, [17281] = 0x9246, [17282] = 0x926D, +- [17283] = 0x926C, [17284] = 0x924F, [17285] = 0x9260, [17286] = 0x9267, +- [17287] = 0x926F, [17288] = 0x9236, [17289] = 0x9261, [17290] = 0x9270, +- [17291] = 0x9231, [17292] = 0x9254, [17293] = 0x9263, [17294] = 0x9250, +- [17295] = 0x9272, [17296] = 0x924E, [17297] = 0x9253, [17298] = 0x924C, +- [17299] = 0x9256, [17300] = 0x9232, [17301] = 0x959F, [17302] = 0x959C, +- [17303] = 0x959E, [17304] = 0x959B, [17305] = 0x9692, [17306] = 0x9693, +- [17307] = 0x9691, [17308] = 0x9697, [17309] = 0x96CE, [17310] = 0x96FA, +- [17311] = 0x96FD, [17312] = 0x96F8, [17313] = 0x96F5, [17314] = 0x9773, +- [17315] = 0x9777, [17316] = 0x9778, [17317] = 0x9772, [17318] = 0x980F, +- [17319] = 0x980D, [17320] = 0x980E, [17321] = 0x98AC, [17322] = 0x98F6, +- [17323] = 0x98F9, [17324] = 0x99AF, [17325] = 0x99B2, [17326] = 0x99B0, +- [17327] = 0x99B5, [17328] = 0x9AAD, [17329] = 0x9AAB, [17330] = 0x9B5B, +- [17331] = 0x9CEA, [17332] = 0x9CED, [17333] = 0x9CE7, [17334] = 0x9E80, +- [17335] = 0x9EFD, [17336] = 0x50E6, [17337] = 0x50D4, [17338] = 0x50D7, +- [17339] = 0x50E8, [17340] = 0x50F3, [17341] = 0x50DB, [17342] = 0x50EA, +- [17343] = 0x50DD, [17344] = 0x50E4, [17345] = 0x50D3, [17346] = 0x50EC, +- [17347] = 0x50F0, [17348] = 0x50EF, [17349] = 0x50E3, [17350] = 0x50E0, +- [17355] = 0x51D8, [17356] = 0x5280, [17357] = 0x5281, [17358] = 0x52E9, +- [17359] = 0x52EB, [17360] = 0x5330, [17361] = 0x53AC, [17362] = 0x5627, +- [17363] = 0x5615, [17364] = 0x560C, [17365] = 0x5612, [17366] = 0x55FC, +- [17367] = 0x560F, [17368] = 0x561C, [17369] = 0x5601, [17370] = 0x5613, +- [17371] = 0x5602, [17372] = 0x55FA, [17373] = 0x561D, [17374] = 0x5604, +- [17375] = 0x55FF, [17376] = 0x55F9, [17377] = 0x5889, [17378] = 0x587C, +- [17379] = 0x5890, [17380] = 0x5898, [17381] = 0x5886, [17382] = 0x5881, +- [17383] = 0x587F, [17384] = 0x5874, [17385] = 0x588B, [17386] = 0x587A, +- [17387] = 0x5887, [17388] = 0x5891, [17389] = 0x588E, [17390] = 0x5876, +- [17391] = 0x5882, [17392] = 0x5888, [17393] = 0x587B, [17394] = 0x5894, +- [17395] = 0x588F, [17396] = 0x58FE, [17397] = 0x596B, [17398] = 0x5ADC, +- [17399] = 0x5AEE, [17400] = 0x5AE5, [17401] = 0x5AD5, [17402] = 0x5AEA, +- [17403] = 0x5ADA, [17404] = 0x5AED, [17405] = 0x5AEB, [17406] = 0x5AF3, +- [17407] = 0x5AE2, [17408] = 0x5AE0, [17409] = 0x5ADB, [17410] = 0x5AEC, +- [17411] = 0x5ADE, [17412] = 0x5ADD, [17413] = 0x5AD9, [17414] = 0x5AE8, +- [17415] = 0x5ADF, [17416] = 0x5B77, [17417] = 0x5BE0, [17452] = 0x5BE3, +- [17453] = 0x5C63, [17454] = 0x5D82, [17455] = 0x5D80, [17456] = 0x5D7D, +- [17457] = 0x5D86, [17458] = 0x5D7A, [17459] = 0x5D81, [17460] = 0x5D77, +- [17461] = 0x5D8A, [17462] = 0x5D89, [17463] = 0x5D88, [17464] = 0x5D7E, +- [17465] = 0x5D7C, [17466] = 0x5D8D, [17467] = 0x5D79, [17468] = 0x5D7F, +- [17469] = 0x5E58, [17470] = 0x5E59, [17471] = 0x5E53, [17472] = 0x5ED8, +- [17473] = 0x5ED1, [17474] = 0x5ED7, [17475] = 0x5ECE, [17476] = 0x5EDC, +- [17477] = 0x5ED5, [17478] = 0x5ED9, [17479] = 0x5ED2, [17480] = 0x5ED4, +- [17481] = 0x5F44, [17482] = 0x5F43, [17483] = 0x5F6F, [17484] = 0x5FB6, +- [17485] = 0x612C, [17486] = 0x6128, [17487] = 0x6141, [17488] = 0x615E, +- [17489] = 0x6171, [17490] = 0x6173, [17491] = 0x6152, [17492] = 0x6153, +- [17493] = 0x6172, [17494] = 0x616C, [17495] = 0x6180, [17496] = 0x6174, +- [17497] = 0x6154, [17498] = 0x617A, [17499] = 0x615B, [17500] = 0x6165, +- [17501] = 0x613B, [17502] = 0x616A, [17503] = 0x6161, [17504] = 0x6156, +- [17505] = 0x6229, [17506] = 0x6227, [17507] = 0x622B, [17508] = 0x642B, +- [17509] = 0x644D, [17510] = 0x645B, [17511] = 0x645D, [17512] = 0x6474, +- [17513] = 0x6476, [17514] = 0x6472, [17515] = 0x6473, [17516] = 0x647D, +- [17517] = 0x6475, [17518] = 0x6466, [17519] = 0x64A6, [17520] = 0x644E, +- [17521] = 0x6482, [17522] = 0x645E, [17523] = 0x645C, [17524] = 0x644B, +- [17525] = 0x6453, [17526] = 0x6460, [17527] = 0x6450, [17528] = 0x647F, +- [17529] = 0x643F, [17530] = 0x646C, [17531] = 0x646B, [17532] = 0x6459, +- [17533] = 0x6465, [17534] = 0x6477, [17535] = 0x6573, [17536] = 0x65A0, +- [17537] = 0x66A1, [17538] = 0x66A0, [17539] = 0x669F, [17540] = 0x6705, +- [17541] = 0x6704, [17542] = 0x6722, [17543] = 0x69B1, [17544] = 0x69B6, +- [17545] = 0x69C9, [17550] = 0x69A0, [17551] = 0x69CE, [17552] = 0x6996, +- [17553] = 0x69B0, [17554] = 0x69AC, [17555] = 0x69BC, [17556] = 0x6991, +- [17557] = 0x6999, [17558] = 0x698E, [17559] = 0x69A7, [17560] = 0x698D, +- [17561] = 0x69A9, [17562] = 0x69BE, [17563] = 0x69AF, [17564] = 0x69BF, +- [17565] = 0x69C4, [17566] = 0x69BD, [17567] = 0x69A4, [17568] = 0x69D4, +- [17569] = 0x69B9, [17570] = 0x69CA, [17571] = 0x699A, [17572] = 0x69CF, +- [17573] = 0x69B3, [17574] = 0x6993, [17575] = 0x69AA, [17576] = 0x69A1, +- [17577] = 0x699E, [17578] = 0x69D9, [17579] = 0x6997, [17580] = 0x6990, +- [17581] = 0x69C2, [17582] = 0x69B5, [17583] = 0x69A5, [17584] = 0x69C6, +- [17585] = 0x6B4A, [17586] = 0x6B4D, [17587] = 0x6B4B, [17588] = 0x6B9E, +- [17589] = 0x6B9F, [17590] = 0x6BA0, [17591] = 0x6BC3, [17592] = 0x6BC4, +- [17593] = 0x6BFE, [17594] = 0x6ECE, [17595] = 0x6EF5, [17596] = 0x6EF1, +- [17597] = 0x6F03, [17598] = 0x6F25, [17599] = 0x6EF8, [17600] = 0x6F37, +- [17601] = 0x6EFB, [17602] = 0x6F2E, [17603] = 0x6F09, [17604] = 0x6F4E, +- [17605] = 0x6F19, [17606] = 0x6F1A, [17607] = 0x6F27, [17608] = 0x6F18, +- [17609] = 0x6F3B, [17610] = 0x6F12, [17611] = 0x6EED, [17612] = 0x6F0A, +- [17647] = 0x6F36, [17648] = 0x6F73, [17649] = 0x6EF9, [17650] = 0x6EEE, +- [17651] = 0x6F2D, [17652] = 0x6F40, [17653] = 0x6F30, [17654] = 0x6F3C, +- [17655] = 0x6F35, [17656] = 0x6EEB, [17657] = 0x6F07, [17658] = 0x6F0E, +- [17659] = 0x6F43, [17660] = 0x6F05, [17661] = 0x6EFD, [17662] = 0x6EF6, +- [17663] = 0x6F39, [17664] = 0x6F1C, [17665] = 0x6EFC, [17666] = 0x6F3A, +- [17667] = 0x6F1F, [17668] = 0x6F0D, [17669] = 0x6F1E, [17670] = 0x6F08, +- [17671] = 0x6F21, [17672] = 0x7187, [17673] = 0x7190, [17674] = 0x7189, +- [17675] = 0x7180, [17676] = 0x7185, [17677] = 0x7182, [17678] = 0x718F, +- [17679] = 0x717B, [17680] = 0x7186, [17681] = 0x7181, [17682] = 0x7197, +- [17683] = 0x7244, [17684] = 0x7253, [17685] = 0x7297, [17686] = 0x7295, +- [17687] = 0x7293, [17688] = 0x7343, [17689] = 0x734D, [17690] = 0x7351, +- [17691] = 0x734C, [17692] = 0x7462, [17693] = 0x7473, [17694] = 0x7471, +- [17695] = 0x7475, [17696] = 0x7472, [17697] = 0x7467, [17698] = 0x746E, +- [17699] = 0x7500, [17700] = 0x7502, [17701] = 0x7503, [17702] = 0x757D, +- [17703] = 0x7590, [17704] = 0x7616, [17705] = 0x7608, [17706] = 0x760C, +- [17707] = 0x7615, [17708] = 0x7611, [17709] = 0x760A, [17710] = 0x7614, +- [17711] = 0x76B8, [17712] = 0x7781, [17713] = 0x777C, [17714] = 0x7785, +- [17715] = 0x7782, [17716] = 0x776E, [17717] = 0x7780, [17718] = 0x776F, +- [17719] = 0x777E, [17720] = 0x7783, [17721] = 0x78B2, [17722] = 0x78AA, +- [17723] = 0x78B4, [17724] = 0x78AD, [17725] = 0x78A8, [17726] = 0x787E, +- [17727] = 0x78AB, [17728] = 0x789E, [17729] = 0x78A5, [17730] = 0x78A0, +- [17731] = 0x78AC, [17732] = 0x78A2, [17733] = 0x78A4, [17734] = 0x7998, +- [17735] = 0x798A, [17736] = 0x798B, [17737] = 0x7996, [17738] = 0x7995, +- [17739] = 0x7994, [17740] = 0x7993, [17745] = 0x7997, [17746] = 0x7988, +- [17747] = 0x7992, [17748] = 0x7990, [17749] = 0x7A2B, [17750] = 0x7A4A, +- [17751] = 0x7A30, [17752] = 0x7A2F, [17753] = 0x7A28, [17754] = 0x7A26, +- [17755] = 0x7AA8, [17756] = 0x7AAB, [17757] = 0x7AAC, [17758] = 0x7AEE, +- [17759] = 0x7B88, [17760] = 0x7B9C, [17761] = 0x7B8A, [17762] = 0x7B91, +- [17763] = 0x7B90, [17764] = 0x7B96, [17765] = 0x7B8D, [17766] = 0x7B8C, +- [17767] = 0x7B9B, [17768] = 0x7B8E, [17769] = 0x7B85, [17770] = 0x7B98, +- [17771] = 0x5284, [17772] = 0x7B99, [17773] = 0x7BA4, [17774] = 0x7B82, +- [17775] = 0x7CBB, [17776] = 0x7CBF, [17777] = 0x7CBC, [17778] = 0x7CBA, +- [17779] = 0x7DA7, [17780] = 0x7DB7, [17781] = 0x7DC2, [17782] = 0x7DA3, +- [17783] = 0x7DAA, [17784] = 0x7DC1, [17785] = 0x7DC0, [17786] = 0x7DC5, +- [17787] = 0x7D9D, [17788] = 0x7DCE, [17789] = 0x7DC4, [17790] = 0x7DC6, +- [17791] = 0x7DCB, [17792] = 0x7DCC, [17793] = 0x7DAF, [17794] = 0x7DB9, +- [17795] = 0x7D96, [17796] = 0x7DBC, [17797] = 0x7D9F, [17798] = 0x7DA6, +- [17799] = 0x7DAE, [17800] = 0x7DA9, [17801] = 0x7DA1, [17802] = 0x7DC9, +- [17803] = 0x7F73, [17804] = 0x7FE2, [17805] = 0x7FE3, [17806] = 0x7FE5, +- [17807] = 0x7FDE, [17842] = 0x8024, [17843] = 0x805D, [17844] = 0x805C, +- [17845] = 0x8189, [17846] = 0x8186, [17847] = 0x8183, [17848] = 0x8187, +- [17849] = 0x818D, [17850] = 0x818C, [17851] = 0x818B, [17852] = 0x8215, +- [17853] = 0x8497, [17854] = 0x84A4, [17855] = 0x84A1, [17856] = 0x849F, +- [17857] = 0x84BA, [17858] = 0x84CE, [17859] = 0x84C2, [17860] = 0x84AC, +- [17861] = 0x84AE, [17862] = 0x84AB, [17863] = 0x84B9, [17864] = 0x84B4, +- [17865] = 0x84C1, [17866] = 0x84CD, [17867] = 0x84AA, [17868] = 0x849A, +- [17869] = 0x84B1, [17870] = 0x84D0, [17871] = 0x849D, [17872] = 0x84A7, +- [17873] = 0x84BB, [17874] = 0x84A2, [17875] = 0x8494, [17876] = 0x84C7, +- [17877] = 0x84CC, [17878] = 0x849B, [17879] = 0x84A9, [17880] = 0x84AF, +- [17881] = 0x84A8, [17882] = 0x84D6, [17883] = 0x8498, [17884] = 0x84B6, +- [17885] = 0x84CF, [17886] = 0x84A0, [17887] = 0x84D7, [17888] = 0x84D4, +- [17889] = 0x84D2, [17890] = 0x84DB, [17891] = 0x84B0, [17892] = 0x8491, +- [17893] = 0x8661, [17894] = 0x8733, [17895] = 0x8723, [17896] = 0x8728, +- [17897] = 0x876B, [17898] = 0x8740, [17899] = 0x872E, [17900] = 0x871E, +- [17901] = 0x8721, [17902] = 0x8719, [17903] = 0x871B, [17904] = 0x8743, +- [17905] = 0x872C, [17906] = 0x8741, [17907] = 0x873E, [17908] = 0x8746, +- [17909] = 0x8720, [17910] = 0x8732, [17911] = 0x872A, [17912] = 0x872D, +- [17913] = 0x873C, [17914] = 0x8712, [17915] = 0x873A, [17916] = 0x8731, +- [17917] = 0x8735, [17918] = 0x8742, [17919] = 0x8726, [17920] = 0x8727, +- [17921] = 0x8738, [17922] = 0x8724, [17923] = 0x871A, [17924] = 0x8730, +- [17925] = 0x8711, [17926] = 0x88F7, [17927] = 0x88E7, [17928] = 0x88F1, +- [17929] = 0x88F2, [17930] = 0x88FA, [17931] = 0x88FE, [17932] = 0x88EE, +- [17933] = 0x88FC, [17934] = 0x88F6, [17935] = 0x88FB, [17940] = 0x88F0, +- [17941] = 0x88EC, [17942] = 0x88EB, [17943] = 0x899D, [17944] = 0x89A1, +- [17945] = 0x899F, [17946] = 0x899E, [17947] = 0x89E9, [17948] = 0x89EB, +- [17949] = 0x89E8, [17950] = 0x8AAB, [17951] = 0x8A99, [17952] = 0x8A8B, +- [17953] = 0x8A92, [17954] = 0x8A8F, [17955] = 0x8A96, [17956] = 0x8C3D, +- [17957] = 0x8C68, [17958] = 0x8C69, [17959] = 0x8CD5, [17960] = 0x8CCF, +- [17961] = 0x8CD7, [17962] = 0x8D96, [17963] = 0x8E09, [17964] = 0x8E02, +- [17965] = 0x8DFF, [17966] = 0x8E0D, [17967] = 0x8DFD, [17968] = 0x8E0A, +- [17969] = 0x8E03, [17970] = 0x8E07, [17971] = 0x8E06, [17972] = 0x8E05, +- [17973] = 0x8DFE, [17974] = 0x8E00, [17975] = 0x8E04, [17976] = 0x8F10, +- [17977] = 0x8F11, [17978] = 0x8F0E, [17979] = 0x8F0D, [17980] = 0x9123, +- [17981] = 0x911C, [17982] = 0x9120, [17983] = 0x9122, [17984] = 0x911F, +- [17985] = 0x911D, [17986] = 0x911A, [17987] = 0x9124, [17988] = 0x9121, +- [17989] = 0x911B, [17990] = 0x917A, [17991] = 0x9172, [17992] = 0x9179, +- [17993] = 0x9173, [17994] = 0x92A5, [17995] = 0x92A4, [17996] = 0x9276, +- [17997] = 0x929B, [17998] = 0x927A, [17999] = 0x92A0, [18000] = 0x9294, +- [18001] = 0x92AA, [18002] = 0x928D, [18037] = 0x92A6, [18038] = 0x929A, +- [18039] = 0x92AB, [18040] = 0x9279, [18041] = 0x9297, [18042] = 0x927F, +- [18043] = 0x92A3, [18044] = 0x92EE, [18045] = 0x928E, [18046] = 0x9282, +- [18047] = 0x9295, [18048] = 0x92A2, [18049] = 0x927D, [18050] = 0x9288, +- [18051] = 0x92A1, [18052] = 0x928A, [18053] = 0x9286, [18054] = 0x928C, +- [18055] = 0x9299, [18056] = 0x92A7, [18057] = 0x927E, [18058] = 0x9287, +- [18059] = 0x92A9, [18060] = 0x929D, [18061] = 0x928B, [18062] = 0x922D, +- [18063] = 0x969E, [18064] = 0x96A1, [18065] = 0x96FF, [18066] = 0x9758, +- [18067] = 0x977D, [18068] = 0x977A, [18069] = 0x977E, [18070] = 0x9783, +- [18071] = 0x9780, [18072] = 0x9782, [18073] = 0x977B, [18074] = 0x9784, +- [18075] = 0x9781, [18076] = 0x977F, [18077] = 0x97CE, [18078] = 0x97CD, +- [18079] = 0x9816, [18080] = 0x98AD, [18081] = 0x98AE, [18082] = 0x9902, +- [18083] = 0x9900, [18084] = 0x9907, [18085] = 0x999D, [18086] = 0x999C, +- [18087] = 0x99C3, [18088] = 0x99B9, [18089] = 0x99BB, [18090] = 0x99BA, +- [18091] = 0x99C2, [18092] = 0x99BD, [18093] = 0x99C7, [18094] = 0x9AB1, +- [18095] = 0x9AE3, [18096] = 0x9AE7, [18097] = 0x9B3E, [18098] = 0x9B3F, +- [18099] = 0x9B60, [18100] = 0x9B61, [18101] = 0x9B5F, [18102] = 0x9CF1, +- [18103] = 0x9CF2, [18104] = 0x9CF5, [18105] = 0x9EA7, [18106] = 0x50FF, +- [18107] = 0x5103, [18108] = 0x5130, [18109] = 0x50F8, [18110] = 0x5106, +- [18111] = 0x5107, [18112] = 0x50F6, [18113] = 0x50FE, [18114] = 0x510B, +- [18115] = 0x510C, [18116] = 0x50FD, [18117] = 0x510A, [18118] = 0x528B, +- [18119] = 0x528C, [18120] = 0x52F1, [18121] = 0x52EF, [18122] = 0x5648, +- [18123] = 0x5642, [18124] = 0x564C, [18125] = 0x5635, [18126] = 0x5641, +- [18127] = 0x564A, [18128] = 0x5649, [18129] = 0x5646, [18130] = 0x5658, +- [18135] = 0x565A, [18136] = 0x5640, [18137] = 0x5633, [18138] = 0x563D, +- [18139] = 0x562C, [18140] = 0x563E, [18141] = 0x5638, [18142] = 0x562A, +- [18143] = 0x563A, [18144] = 0x571A, [18145] = 0x58AB, [18146] = 0x589D, +- [18147] = 0x58B1, [18148] = 0x58A0, [18149] = 0x58A3, [18150] = 0x58AF, +- [18151] = 0x58AC, [18152] = 0x58A5, [18153] = 0x58A1, [18154] = 0x58FF, +- [18155] = 0x5AFF, [18156] = 0x5AF4, [18157] = 0x5AFD, [18158] = 0x5AF7, +- [18159] = 0x5AF6, [18160] = 0x5B03, [18161] = 0x5AF8, [18162] = 0x5B02, +- [18163] = 0x5AF9, [18164] = 0x5B01, [18165] = 0x5B07, [18166] = 0x5B05, +- [18167] = 0x5B0F, [18168] = 0x5C67, [18169] = 0x5D99, [18170] = 0x5D97, +- [18171] = 0x5D9F, [18172] = 0x5D92, [18173] = 0x5DA2, [18174] = 0x5D93, +- [18175] = 0x5D95, [18176] = 0x5DA0, [18177] = 0x5D9C, [18178] = 0x5DA1, +- [18179] = 0x5D9A, [18180] = 0x5D9E, [18181] = 0x5E69, [18182] = 0x5E5D, +- [18183] = 0x5E60, [18184] = 0x5E5C, [18185] = 0x7DF3, [18186] = 0x5EDB, +- [18187] = 0x5EDE, [18188] = 0x5EE1, [18189] = 0x5F49, [18190] = 0x5FB2, +- [18191] = 0x618B, [18192] = 0x6183, [18193] = 0x6179, [18194] = 0x61B1, +- [18195] = 0x61B0, [18196] = 0x61A2, [18197] = 0x6189, [18232] = 0x619B, +- [18233] = 0x6193, [18234] = 0x61AF, [18235] = 0x61AD, [18236] = 0x619F, +- [18237] = 0x6192, [18238] = 0x61AA, [18239] = 0x61A1, [18240] = 0x618D, +- [18241] = 0x6166, [18242] = 0x61B3, [18243] = 0x622D, [18244] = 0x646E, +- [18245] = 0x6470, [18246] = 0x6496, [18247] = 0x64A0, [18248] = 0x6485, +- [18249] = 0x6497, [18250] = 0x649C, [18251] = 0x648F, [18252] = 0x648B, +- [18253] = 0x648A, [18254] = 0x648C, [18255] = 0x64A3, [18256] = 0x649F, +- [18257] = 0x6468, [18258] = 0x64B1, [18259] = 0x6498, [18260] = 0x6576, +- [18261] = 0x657A, [18262] = 0x6579, [18263] = 0x657B, [18264] = 0x65B2, +- [18265] = 0x65B3, [18266] = 0x66B5, [18267] = 0x66B0, [18268] = 0x66A9, +- [18269] = 0x66B2, [18270] = 0x66B7, [18271] = 0x66AA, [18272] = 0x66AF, +- [18273] = 0x6A00, [18274] = 0x6A06, [18275] = 0x6A17, [18276] = 0x69E5, +- [18277] = 0x69F8, [18278] = 0x6A15, [18279] = 0x69F1, [18280] = 0x69E4, +- [18281] = 0x6A20, [18282] = 0x69FF, [18283] = 0x69EC, [18284] = 0x69E2, +- [18285] = 0x6A1B, [18286] = 0x6A1D, [18287] = 0x69FE, [18288] = 0x6A27, +- [18289] = 0x69F2, [18290] = 0x69EE, [18291] = 0x6A14, [18292] = 0x69F7, +- [18293] = 0x69E7, [18294] = 0x6A40, [18295] = 0x6A08, [18296] = 0x69E6, +- [18297] = 0x69FB, [18298] = 0x6A0D, [18299] = 0x69FC, [18300] = 0x69EB, +- [18301] = 0x6A09, [18302] = 0x6A04, [18303] = 0x6A18, [18304] = 0x6A25, +- [18305] = 0x6A0F, [18306] = 0x69F6, [18307] = 0x6A26, [18308] = 0x6A07, +- [18309] = 0x69F4, [18310] = 0x6A16, [18311] = 0x6B51, [18312] = 0x6BA5, +- [18313] = 0x6BA3, [18314] = 0x6BA2, [18315] = 0x6BA6, [18316] = 0x6C01, +- [18317] = 0x6C00, [18318] = 0x6BFF, [18319] = 0x6C02, [18320] = 0x6F41, +- [18321] = 0x6F26, [18322] = 0x6F7E, [18323] = 0x6F87, [18324] = 0x6FC6, +- [18325] = 0x6F92, [18330] = 0x6F8D, [18331] = 0x6F89, [18332] = 0x6F8C, +- [18333] = 0x6F62, [18334] = 0x6F4F, [18335] = 0x6F85, [18336] = 0x6F5A, +- [18337] = 0x6F96, [18338] = 0x6F76, [18339] = 0x6F6C, [18340] = 0x6F82, +- [18341] = 0x6F55, [18342] = 0x6F72, [18343] = 0x6F52, [18344] = 0x6F50, +- [18345] = 0x6F57, [18346] = 0x6F94, [18347] = 0x6F93, [18348] = 0x6F5D, +- [18349] = 0x6F00, [18350] = 0x6F61, [18351] = 0x6F6B, [18352] = 0x6F7D, +- [18353] = 0x6F67, [18354] = 0x6F90, [18355] = 0x6F53, [18356] = 0x6F8B, +- [18357] = 0x6F69, [18358] = 0x6F7F, [18359] = 0x6F95, [18360] = 0x6F63, +- [18361] = 0x6F77, [18362] = 0x6F6A, [18363] = 0x6F7B, [18364] = 0x71B2, +- [18365] = 0x71AF, [18366] = 0x719B, [18367] = 0x71B0, [18368] = 0x71A0, +- [18369] = 0x719A, [18370] = 0x71A9, [18371] = 0x71B5, [18372] = 0x719D, +- [18373] = 0x71A5, [18374] = 0x719E, [18375] = 0x71A4, [18376] = 0x71A1, +- [18377] = 0x71AA, [18378] = 0x719C, [18379] = 0x71A7, [18380] = 0x71B3, +- [18381] = 0x7298, [18382] = 0x729A, [18383] = 0x7358, [18384] = 0x7352, +- [18385] = 0x735E, [18386] = 0x735F, [18387] = 0x7360, [18388] = 0x735D, +- [18389] = 0x735B, [18390] = 0x7361, [18391] = 0x735A, [18392] = 0x7359, +- [18427] = 0x7362, [18428] = 0x7487, [18429] = 0x7489, [18430] = 0x748A, +- [18431] = 0x7486, [18432] = 0x7481, [18433] = 0x747D, [18434] = 0x7485, +- [18435] = 0x7488, [18436] = 0x747C, [18437] = 0x7479, [18438] = 0x7508, +- [18439] = 0x7507, [18440] = 0x757E, [18441] = 0x7625, [18442] = 0x761E, +- [18443] = 0x7619, [18444] = 0x761D, [18445] = 0x761C, [18446] = 0x7623, +- [18447] = 0x761A, [18448] = 0x7628, [18449] = 0x761B, [18450] = 0x769C, +- [18451] = 0x769D, [18452] = 0x769E, [18453] = 0x769B, [18454] = 0x778D, +- [18455] = 0x778F, [18456] = 0x7789, [18457] = 0x7788, [18458] = 0x78CD, +- [18459] = 0x78BB, [18460] = 0x78CF, [18461] = 0x78CC, [18462] = 0x78D1, +- [18463] = 0x78CE, [18464] = 0x78D4, [18465] = 0x78C8, [18466] = 0x78C3, +- [18467] = 0x78C4, [18468] = 0x78C9, [18469] = 0x799A, [18470] = 0x79A1, +- [18471] = 0x79A0, [18472] = 0x799C, [18473] = 0x79A2, [18474] = 0x799B, +- [18475] = 0x6B76, [18476] = 0x7A39, [18477] = 0x7AB2, [18478] = 0x7AB4, +- [18479] = 0x7AB3, [18480] = 0x7BB7, [18481] = 0x7BCB, [18482] = 0x7BBE, +- [18483] = 0x7BAC, [18484] = 0x7BCE, [18485] = 0x7BAF, [18486] = 0x7BB9, +- [18487] = 0x7BCA, [18488] = 0x7BB5, [18489] = 0x7CC5, [18490] = 0x7CC8, +- [18491] = 0x7CCC, [18492] = 0x7CCB, [18493] = 0x7DF7, [18494] = 0x7DDB, +- [18495] = 0x7DEA, [18496] = 0x7DE7, [18497] = 0x7DD7, [18498] = 0x7DE1, +- [18499] = 0x7E03, [18500] = 0x7DFA, [18501] = 0x7DE6, [18502] = 0x7DF6, +- [18503] = 0x7DF1, [18504] = 0x7DF0, [18505] = 0x7DEE, [18506] = 0x7DDF, +- [18507] = 0x7F76, [18508] = 0x7FAC, [18509] = 0x7FB0, [18510] = 0x7FAD, +- [18511] = 0x7FED, [18512] = 0x7FEB, [18513] = 0x7FEA, [18514] = 0x7FEC, +- [18515] = 0x7FE6, [18516] = 0x7FE8, [18517] = 0x8064, [18518] = 0x8067, +- [18519] = 0x81A3, [18520] = 0x819F, [18525] = 0x819E, [18526] = 0x8195, +- [18527] = 0x81A2, [18528] = 0x8199, [18529] = 0x8197, [18530] = 0x8216, +- [18531] = 0x824F, [18532] = 0x8253, [18533] = 0x8252, [18534] = 0x8250, +- [18535] = 0x824E, [18536] = 0x8251, [18537] = 0x8524, [18538] = 0x853B, +- [18539] = 0x850F, [18540] = 0x8500, [18541] = 0x8529, [18542] = 0x850E, +- [18543] = 0x8509, [18544] = 0x850D, [18545] = 0x851F, [18546] = 0x850A, +- [18547] = 0x8527, [18548] = 0x851C, [18549] = 0x84FB, [18550] = 0x852B, +- [18551] = 0x84FA, [18552] = 0x8508, [18553] = 0x850C, [18554] = 0x84F4, +- [18555] = 0x852A, [18556] = 0x84F2, [18557] = 0x8515, [18558] = 0x84F7, +- [18559] = 0x84EB, [18560] = 0x84F3, [18561] = 0x84FC, [18562] = 0x8512, +- [18563] = 0x84EA, [18564] = 0x84E9, [18565] = 0x8516, [18566] = 0x84FE, +- [18567] = 0x8528, [18568] = 0x851D, [18569] = 0x852E, [18570] = 0x8502, +- [18571] = 0x84FD, [18572] = 0x851E, [18573] = 0x84F6, [18574] = 0x8531, +- [18575] = 0x8526, [18576] = 0x84E7, [18577] = 0x84E8, [18578] = 0x84F0, +- [18579] = 0x84EF, [18580] = 0x84F9, [18581] = 0x8518, [18582] = 0x8520, +- [18583] = 0x8530, [18584] = 0x850B, [18585] = 0x8519, [18586] = 0x852F, +- [18587] = 0x8662, [18622] = 0x8756, [18623] = 0x8763, [18624] = 0x8764, +- [18625] = 0x8777, [18626] = 0x87E1, [18627] = 0x8773, [18628] = 0x8758, +- [18629] = 0x8754, [18630] = 0x875B, [18631] = 0x8752, [18632] = 0x8761, +- [18633] = 0x875A, [18634] = 0x8751, [18635] = 0x875E, [18636] = 0x876D, +- [18637] = 0x876A, [18638] = 0x8750, [18639] = 0x874E, [18640] = 0x875F, +- [18641] = 0x875D, [18642] = 0x876F, [18643] = 0x876C, [18644] = 0x877A, +- [18645] = 0x876E, [18646] = 0x875C, [18647] = 0x8765, [18648] = 0x874F, +- [18649] = 0x877B, [18650] = 0x8775, [18651] = 0x8762, [18652] = 0x8767, +- [18653] = 0x8769, [18654] = 0x885A, [18655] = 0x8905, [18656] = 0x890C, +- [18657] = 0x8914, [18658] = 0x890B, [18659] = 0x8917, [18660] = 0x8918, +- [18661] = 0x8919, [18662] = 0x8906, [18663] = 0x8916, [18664] = 0x8911, +- [18665] = 0x890E, [18666] = 0x8909, [18667] = 0x89A2, [18668] = 0x89A4, +- [18669] = 0x89A3, [18670] = 0x89ED, [18671] = 0x89F0, [18672] = 0x89EC, +- [18673] = 0x8ACF, [18674] = 0x8AC6, [18675] = 0x8AB8, [18676] = 0x8AD3, +- [18677] = 0x8AD1, [18678] = 0x8AD4, [18679] = 0x8AD5, [18680] = 0x8ABB, +- [18681] = 0x8AD7, [18682] = 0x8ABE, [18683] = 0x8AC0, [18684] = 0x8AC5, +- [18685] = 0x8AD8, [18686] = 0x8AC3, [18687] = 0x8ABA, [18688] = 0x8ABD, +- [18689] = 0x8AD9, [18690] = 0x8C3E, [18691] = 0x8C4D, [18692] = 0x8C8F, +- [18693] = 0x8CE5, [18694] = 0x8CDF, [18695] = 0x8CD9, [18696] = 0x8CE8, +- [18697] = 0x8CDA, [18698] = 0x8CDD, [18699] = 0x8CE7, [18700] = 0x8DA0, +- [18701] = 0x8D9C, [18702] = 0x8DA1, [18703] = 0x8D9B, [18704] = 0x8E20, +- [18705] = 0x8E23, [18706] = 0x8E25, [18707] = 0x8E24, [18708] = 0x8E2E, +- [18709] = 0x8E15, [18710] = 0x8E1B, [18711] = 0x8E16, [18712] = 0x8E11, +- [18713] = 0x8E19, [18714] = 0x8E26, [18715] = 0x8E27, [18720] = 0x8E14, +- [18721] = 0x8E12, [18722] = 0x8E18, [18723] = 0x8E13, [18724] = 0x8E1C, +- [18725] = 0x8E17, [18726] = 0x8E1A, [18727] = 0x8F2C, [18728] = 0x8F24, +- [18729] = 0x8F18, [18730] = 0x8F1A, [18731] = 0x8F20, [18732] = 0x8F23, +- [18733] = 0x8F16, [18734] = 0x8F17, [18735] = 0x9073, [18736] = 0x9070, +- [18737] = 0x906F, [18738] = 0x9067, [18739] = 0x906B, [18740] = 0x912F, +- [18741] = 0x912B, [18742] = 0x9129, [18743] = 0x912A, [18744] = 0x9132, +- [18745] = 0x9126, [18746] = 0x912E, [18747] = 0x9185, [18748] = 0x9186, +- [18749] = 0x918A, [18750] = 0x9181, [18751] = 0x9182, [18752] = 0x9184, +- [18753] = 0x9180, [18754] = 0x92D0, [18755] = 0x92C3, [18756] = 0x92C4, +- [18757] = 0x92C0, [18758] = 0x92D9, [18759] = 0x92B6, [18760] = 0x92CF, +- [18761] = 0x92F1, [18762] = 0x92DF, [18763] = 0x92D8, [18764] = 0x92E9, +- [18765] = 0x92D7, [18766] = 0x92DD, [18767] = 0x92CC, [18768] = 0x92EF, +- [18769] = 0x92C2, [18770] = 0x92E8, [18771] = 0x92CA, [18772] = 0x92C8, +- [18773] = 0x92CE, [18774] = 0x92E6, [18775] = 0x92CD, [18776] = 0x92D5, +- [18777] = 0x92C9, [18778] = 0x92E0, [18779] = 0x92DE, [18780] = 0x92E7, +- [18781] = 0x92D1, [18782] = 0x92D3, [18817] = 0x92B5, [18818] = 0x92E1, +- [18819] = 0x92C6, [18820] = 0x92B4, [18821] = 0x957C, [18822] = 0x95AC, +- [18823] = 0x95AB, [18824] = 0x95AE, [18825] = 0x95B0, [18826] = 0x96A4, +- [18827] = 0x96A2, [18828] = 0x96D3, [18829] = 0x9705, [18830] = 0x9708, +- [18831] = 0x9702, [18832] = 0x975A, [18833] = 0x978A, [18834] = 0x978E, +- [18835] = 0x9788, [18836] = 0x97D0, [18837] = 0x97CF, [18838] = 0x981E, +- [18839] = 0x981D, [18840] = 0x9826, [18841] = 0x9829, [18842] = 0x9828, +- [18843] = 0x9820, [18844] = 0x981B, [18845] = 0x9827, [18846] = 0x98B2, +- [18847] = 0x9908, [18848] = 0x98FA, [18849] = 0x9911, [18850] = 0x9914, +- [18851] = 0x9916, [18852] = 0x9917, [18853] = 0x9915, [18854] = 0x99DC, +- [18855] = 0x99CD, [18856] = 0x99CF, [18857] = 0x99D3, [18858] = 0x99D4, +- [18859] = 0x99CE, [18860] = 0x99C9, [18861] = 0x99D6, [18862] = 0x99D8, +- [18863] = 0x99CB, [18864] = 0x99D7, [18865] = 0x99CC, [18866] = 0x9AB3, +- [18867] = 0x9AEC, [18868] = 0x9AEB, [18869] = 0x9AF3, [18870] = 0x9AF2, +- [18871] = 0x9AF1, [18872] = 0x9B46, [18873] = 0x9B43, [18874] = 0x9B67, +- [18875] = 0x9B74, [18876] = 0x9B71, [18877] = 0x9B66, [18878] = 0x9B76, +- [18879] = 0x9B75, [18880] = 0x9B70, [18881] = 0x9B68, [18882] = 0x9B64, +- [18883] = 0x9B6C, [18884] = 0x9CFC, [18885] = 0x9CFA, [18886] = 0x9CFD, +- [18887] = 0x9CFF, [18888] = 0x9CF7, [18889] = 0x9D07, [18890] = 0x9D00, +- [18891] = 0x9CF9, [18892] = 0x9CFB, [18893] = 0x9D08, [18894] = 0x9D05, +- [18895] = 0x9D04, [18896] = 0x9E83, [18897] = 0x9ED3, [18898] = 0x9F0F, +- [18899] = 0x9F10, [18900] = 0x511C, [18901] = 0x5113, [18902] = 0x5117, +- [18903] = 0x511A, [18904] = 0x5111, [18905] = 0x51DE, [18906] = 0x5334, +- [18907] = 0x53E1, [18908] = 0x5670, [18909] = 0x5660, [18910] = 0x566E, +- [18915] = 0x5673, [18916] = 0x5666, [18917] = 0x5663, [18918] = 0x566D, +- [18919] = 0x5672, [18920] = 0x565E, [18921] = 0x5677, [18922] = 0x571C, +- [18923] = 0x571B, [18924] = 0x58C8, [18925] = 0x58BD, [18926] = 0x58C9, +- [18927] = 0x58BF, [18928] = 0x58BA, [18929] = 0x58C2, [18930] = 0x58BC, +- [18931] = 0x58C6, [18932] = 0x5B17, [18933] = 0x5B19, [18934] = 0x5B1B, +- [18935] = 0x5B21, [18936] = 0x5B14, [18937] = 0x5B13, [18938] = 0x5B10, +- [18939] = 0x5B16, [18940] = 0x5B28, [18941] = 0x5B1A, [18942] = 0x5B20, +- [18943] = 0x5B1E, [18944] = 0x5BEF, [18945] = 0x5DAC, [18946] = 0x5DB1, +- [18947] = 0x5DA9, [18948] = 0x5DA7, [18949] = 0x5DB5, [18950] = 0x5DB0, +- [18951] = 0x5DAE, [18952] = 0x5DAA, [18953] = 0x5DA8, [18954] = 0x5DB2, +- [18955] = 0x5DAD, [18956] = 0x5DAF, [18957] = 0x5DB4, [18958] = 0x5E67, +- [18959] = 0x5E68, [18960] = 0x5E66, [18961] = 0x5E6F, [18962] = 0x5EE9, +- [18963] = 0x5EE7, [18964] = 0x5EE6, [18965] = 0x5EE8, [18966] = 0x5EE5, +- [18967] = 0x5F4B, [18968] = 0x5FBC, [18969] = 0x619D, [18970] = 0x61A8, +- [18971] = 0x6196, [18972] = 0x61C5, [18973] = 0x61B4, [18974] = 0x61C6, +- [18975] = 0x61C1, [18976] = 0x61CC, [18977] = 0x61BA, [19012] = 0x61BF, +- [19013] = 0x61B8, [19014] = 0x618C, [19015] = 0x64D7, [19016] = 0x64D6, +- [19017] = 0x64D0, [19018] = 0x64CF, [19019] = 0x64C9, [19020] = 0x64BD, +- [19021] = 0x6489, [19022] = 0x64C3, [19023] = 0x64DB, [19024] = 0x64F3, +- [19025] = 0x64D9, [19026] = 0x6533, [19027] = 0x657F, [19028] = 0x657C, +- [19029] = 0x65A2, [19030] = 0x66C8, [19031] = 0x66BE, [19032] = 0x66C0, +- [19033] = 0x66CA, [19034] = 0x66CB, [19035] = 0x66CF, [19036] = 0x66BD, +- [19037] = 0x66BB, [19038] = 0x66BA, [19039] = 0x66CC, [19040] = 0x6723, +- [19041] = 0x6A34, [19042] = 0x6A66, [19043] = 0x6A49, [19044] = 0x6A67, +- [19045] = 0x6A32, [19046] = 0x6A68, [19047] = 0x6A3E, [19048] = 0x6A5D, +- [19049] = 0x6A6D, [19050] = 0x6A76, [19051] = 0x6A5B, [19052] = 0x6A51, +- [19053] = 0x6A28, [19054] = 0x6A5A, [19055] = 0x6A3B, [19056] = 0x6A3F, +- [19057] = 0x6A41, [19058] = 0x6A6A, [19059] = 0x6A64, [19060] = 0x6A50, +- [19061] = 0x6A4F, [19062] = 0x6A54, [19063] = 0x6A6F, [19064] = 0x6A69, +- [19065] = 0x6A60, [19066] = 0x6A3C, [19067] = 0x6A5E, [19068] = 0x6A56, +- [19069] = 0x6A55, [19070] = 0x6A4D, [19071] = 0x6A4E, [19072] = 0x6A46, +- [19073] = 0x6B55, [19074] = 0x6B54, [19075] = 0x6B56, [19076] = 0x6BA7, +- [19077] = 0x6BAA, [19078] = 0x6BAB, [19079] = 0x6BC8, [19080] = 0x6BC7, +- [19081] = 0x6C04, [19082] = 0x6C03, [19083] = 0x6C06, [19084] = 0x6FAD, +- [19085] = 0x6FCB, [19086] = 0x6FA3, [19087] = 0x6FC7, [19088] = 0x6FBC, +- [19089] = 0x6FCE, [19090] = 0x6FC8, [19091] = 0x6F5E, [19092] = 0x6FC4, +- [19093] = 0x6FBD, [19094] = 0x6F9E, [19095] = 0x6FCA, [19096] = 0x6FA8, +- [19097] = 0x7004, [19098] = 0x6FA5, [19099] = 0x6FAE, [19100] = 0x6FBA, +- [19101] = 0x6FAC, [19102] = 0x6FAA, [19103] = 0x6FCF, [19104] = 0x6FBF, +- [19105] = 0x6FB8, [19110] = 0x6FA2, [19111] = 0x6FC9, [19112] = 0x6FAB, +- [19113] = 0x6FCD, [19114] = 0x6FAF, [19115] = 0x6FB2, [19116] = 0x6FB0, +- [19117] = 0x71C5, [19118] = 0x71C2, [19119] = 0x71BF, [19120] = 0x71B8, +- [19121] = 0x71D6, [19122] = 0x71C0, [19123] = 0x71C1, [19124] = 0x71CB, +- [19125] = 0x71D4, [19126] = 0x71CA, [19127] = 0x71C7, [19128] = 0x71CF, +- [19129] = 0x71BD, [19130] = 0x71D8, [19131] = 0x71BC, [19132] = 0x71C6, +- [19133] = 0x71DA, [19134] = 0x71DB, [19135] = 0x729D, [19136] = 0x729E, +- [19137] = 0x7369, [19138] = 0x7366, [19139] = 0x7367, [19140] = 0x736C, +- [19141] = 0x7365, [19142] = 0x736B, [19143] = 0x736A, [19144] = 0x747F, +- [19145] = 0x749A, [19146] = 0x74A0, [19147] = 0x7494, [19148] = 0x7492, +- [19149] = 0x7495, [19150] = 0x74A1, [19151] = 0x750B, [19152] = 0x7580, +- [19153] = 0x762F, [19154] = 0x762D, [19155] = 0x7631, [19156] = 0x763D, +- [19157] = 0x7633, [19158] = 0x763C, [19159] = 0x7635, [19160] = 0x7632, +- [19161] = 0x7630, [19162] = 0x76BB, [19163] = 0x76E6, [19164] = 0x779A, +- [19165] = 0x779D, [19166] = 0x77A1, [19167] = 0x779C, [19168] = 0x779B, +- [19169] = 0x77A2, [19170] = 0x77A3, [19171] = 0x7795, [19172] = 0x7799, +- [19207] = 0x7797, [19208] = 0x78DD, [19209] = 0x78E9, [19210] = 0x78E5, +- [19211] = 0x78EA, [19212] = 0x78DE, [19213] = 0x78E3, [19214] = 0x78DB, +- [19215] = 0x78E1, [19216] = 0x78E2, [19217] = 0x78ED, [19218] = 0x78DF, +- [19219] = 0x78E0, [19220] = 0x79A4, [19221] = 0x7A44, [19222] = 0x7A48, +- [19223] = 0x7A47, [19224] = 0x7AB6, [19225] = 0x7AB8, [19226] = 0x7AB5, +- [19227] = 0x7AB1, [19228] = 0x7AB7, [19229] = 0x7BDE, [19230] = 0x7BE3, +- [19231] = 0x7BE7, [19232] = 0x7BDD, [19233] = 0x7BD5, [19234] = 0x7BE5, +- [19235] = 0x7BDA, [19236] = 0x7BE8, [19237] = 0x7BF9, [19238] = 0x7BD4, +- [19239] = 0x7BEA, [19240] = 0x7BE2, [19241] = 0x7BDC, [19242] = 0x7BEB, +- [19243] = 0x7BD8, [19244] = 0x7BDF, [19245] = 0x7CD2, [19246] = 0x7CD4, +- [19247] = 0x7CD7, [19248] = 0x7CD0, [19249] = 0x7CD1, [19250] = 0x7E12, +- [19251] = 0x7E21, [19252] = 0x7E17, [19253] = 0x7E0C, [19254] = 0x7E1F, +- [19255] = 0x7E20, [19256] = 0x7E13, [19257] = 0x7E0E, [19258] = 0x7E1C, +- [19259] = 0x7E15, [19260] = 0x7E1A, [19261] = 0x7E22, [19262] = 0x7E0B, +- [19263] = 0x7E0F, [19264] = 0x7E16, [19265] = 0x7E0D, [19266] = 0x7E14, +- [19267] = 0x7E25, [19268] = 0x7E24, [19269] = 0x7F43, [19270] = 0x7F7B, +- [19271] = 0x7F7C, [19272] = 0x7F7A, [19273] = 0x7FB1, [19274] = 0x7FEF, +- [19275] = 0x802A, [19276] = 0x8029, [19277] = 0x806C, [19278] = 0x81B1, +- [19279] = 0x81A6, [19280] = 0x81AE, [19281] = 0x81B9, [19282] = 0x81B5, +- [19283] = 0x81AB, [19284] = 0x81B0, [19285] = 0x81AC, [19286] = 0x81B4, +- [19287] = 0x81B2, [19288] = 0x81B7, [19289] = 0x81A7, [19290] = 0x81F2, +- [19291] = 0x8255, [19292] = 0x8256, [19293] = 0x8257, [19294] = 0x8556, +- [19295] = 0x8545, [19296] = 0x856B, [19297] = 0x854D, [19298] = 0x8553, +- [19299] = 0x8561, [19300] = 0x8558, [19305] = 0x8540, [19306] = 0x8546, +- [19307] = 0x8564, [19308] = 0x8541, [19309] = 0x8562, [19310] = 0x8544, +- [19311] = 0x8551, [19312] = 0x8547, [19313] = 0x8563, [19314] = 0x853E, +- [19315] = 0x855B, [19316] = 0x8571, [19317] = 0x854E, [19318] = 0x856E, +- [19319] = 0x8575, [19320] = 0x8555, [19321] = 0x8567, [19322] = 0x8560, +- [19323] = 0x858C, [19324] = 0x8566, [19325] = 0x855D, [19326] = 0x8554, +- [19327] = 0x8565, [19328] = 0x856C, [19329] = 0x8663, [19330] = 0x8665, +- [19331] = 0x8664, [19332] = 0x879B, [19333] = 0x878F, [19334] = 0x8797, +- [19335] = 0x8793, [19336] = 0x8792, [19337] = 0x8788, [19338] = 0x8781, +- [19339] = 0x8796, [19340] = 0x8798, [19341] = 0x8779, [19342] = 0x8787, +- [19343] = 0x87A3, [19344] = 0x8785, [19345] = 0x8790, [19346] = 0x8791, +- [19347] = 0x879D, [19348] = 0x8784, [19349] = 0x8794, [19350] = 0x879C, +- [19351] = 0x879A, [19352] = 0x8789, [19353] = 0x891E, [19354] = 0x8926, +- [19355] = 0x8930, [19356] = 0x892D, [19357] = 0x892E, [19358] = 0x8927, +- [19359] = 0x8931, [19360] = 0x8922, [19361] = 0x8929, [19362] = 0x8923, +- [19363] = 0x892F, [19364] = 0x892C, [19365] = 0x891F, [19366] = 0x89F1, +- [19367] = 0x8AE0, [19402] = 0x8AE2, [19403] = 0x8AF2, [19404] = 0x8AF4, +- [19405] = 0x8AF5, [19406] = 0x8ADD, [19407] = 0x8B14, [19408] = 0x8AE4, +- [19409] = 0x8ADF, [19410] = 0x8AF0, [19411] = 0x8AC8, [19412] = 0x8ADE, +- [19413] = 0x8AE1, [19414] = 0x8AE8, [19415] = 0x8AFF, [19416] = 0x8AEF, +- [19417] = 0x8AFB, [19418] = 0x8C91, [19419] = 0x8C92, [19420] = 0x8C90, +- [19421] = 0x8CF5, [19422] = 0x8CEE, [19423] = 0x8CF1, [19424] = 0x8CF0, +- [19425] = 0x8CF3, [19426] = 0x8D6C, [19427] = 0x8D6E, [19428] = 0x8DA5, +- [19429] = 0x8DA7, [19430] = 0x8E33, [19431] = 0x8E3E, [19432] = 0x8E38, +- [19433] = 0x8E40, [19434] = 0x8E45, [19435] = 0x8E36, [19436] = 0x8E3C, +- [19437] = 0x8E3D, [19438] = 0x8E41, [19439] = 0x8E30, [19440] = 0x8E3F, +- [19441] = 0x8EBD, [19442] = 0x8F36, [19443] = 0x8F2E, [19444] = 0x8F35, +- [19445] = 0x8F32, [19446] = 0x8F39, [19447] = 0x8F37, [19448] = 0x8F34, +- [19449] = 0x9076, [19450] = 0x9079, [19451] = 0x907B, [19452] = 0x9086, +- [19453] = 0x90FA, [19454] = 0x9133, [19455] = 0x9135, [19456] = 0x9136, +- [19457] = 0x9193, [19458] = 0x9190, [19459] = 0x9191, [19460] = 0x918D, +- [19461] = 0x918F, [19462] = 0x9327, [19463] = 0x931E, [19464] = 0x9308, +- [19465] = 0x931F, [19466] = 0x9306, [19467] = 0x930F, [19468] = 0x937A, +- [19469] = 0x9338, [19470] = 0x933C, [19471] = 0x931B, [19472] = 0x9323, +- [19473] = 0x9312, [19474] = 0x9301, [19475] = 0x9346, [19476] = 0x932D, +- [19477] = 0x930E, [19478] = 0x930D, [19479] = 0x92CB, [19480] = 0x931D, +- [19481] = 0x92FA, [19482] = 0x9325, [19483] = 0x9313, [19484] = 0x92F9, +- [19485] = 0x92F7, [19486] = 0x9334, [19487] = 0x9302, [19488] = 0x9324, +- [19489] = 0x92FF, [19490] = 0x9329, [19491] = 0x9339, [19492] = 0x9335, +- [19493] = 0x932A, [19494] = 0x9314, [19495] = 0x930C, [19500] = 0x930B, +- [19501] = 0x92FE, [19502] = 0x9309, [19503] = 0x9300, [19504] = 0x92FB, +- [19505] = 0x9316, [19506] = 0x95BC, [19507] = 0x95CD, [19508] = 0x95BE, +- [19509] = 0x95B9, [19510] = 0x95BA, [19511] = 0x95B6, [19512] = 0x95BF, +- [19513] = 0x95B5, [19514] = 0x95BD, [19515] = 0x96A9, [19516] = 0x96D4, +- [19517] = 0x970B, [19518] = 0x9712, [19519] = 0x9710, [19520] = 0x9799, +- [19521] = 0x9797, [19522] = 0x9794, [19523] = 0x97F0, [19524] = 0x97F8, +- [19525] = 0x9835, [19526] = 0x982F, [19527] = 0x9832, [19528] = 0x9924, +- [19529] = 0x991F, [19530] = 0x9927, [19531] = 0x9929, [19532] = 0x999E, +- [19533] = 0x99EE, [19534] = 0x99EC, [19535] = 0x99E5, [19536] = 0x99E4, +- [19537] = 0x99F0, [19538] = 0x99E3, [19539] = 0x99EA, [19540] = 0x99E9, +- [19541] = 0x99E7, [19542] = 0x9AB9, [19543] = 0x9ABF, [19544] = 0x9AB4, +- [19545] = 0x9ABB, [19546] = 0x9AF6, [19547] = 0x9AFA, [19548] = 0x9AF9, +- [19549] = 0x9AF7, [19550] = 0x9B33, [19551] = 0x9B80, [19552] = 0x9B85, +- [19553] = 0x9B87, [19554] = 0x9B7C, [19555] = 0x9B7E, [19556] = 0x9B7B, +- [19557] = 0x9B82, [19558] = 0x9B93, [19559] = 0x9B92, [19560] = 0x9B90, +- [19561] = 0x9B7A, [19562] = 0x9B95, [19597] = 0x9B7D, [19598] = 0x9B88, +- [19599] = 0x9D25, [19600] = 0x9D17, [19601] = 0x9D20, [19602] = 0x9D1E, +- [19603] = 0x9D14, [19604] = 0x9D29, [19605] = 0x9D1D, [19606] = 0x9D18, +- [19607] = 0x9D22, [19608] = 0x9D10, [19609] = 0x9D19, [19610] = 0x9D1F, +- [19611] = 0x9E88, [19612] = 0x9E86, [19613] = 0x9E87, [19614] = 0x9EAE, +- [19615] = 0x9EAD, [19616] = 0x9ED5, [19617] = 0x9ED6, [19618] = 0x9EFA, +- [19619] = 0x9F12, [19620] = 0x9F3D, [19621] = 0x5126, [19622] = 0x5125, +- [19623] = 0x5122, [19624] = 0x5124, [19625] = 0x5120, [19626] = 0x5129, +- [19627] = 0x52F4, [19628] = 0x5693, [19629] = 0x568C, [19630] = 0x568D, +- [19631] = 0x5686, [19632] = 0x5684, [19633] = 0x5683, [19634] = 0x567E, +- [19635] = 0x5682, [19636] = 0x567F, [19637] = 0x5681, [19638] = 0x58D6, +- [19639] = 0x58D4, [19640] = 0x58CF, [19641] = 0x58D2, [19642] = 0x5B2D, +- [19643] = 0x5B25, [19644] = 0x5B32, [19645] = 0x5B23, [19646] = 0x5B2C, +- [19647] = 0x5B27, [19648] = 0x5B26, [19649] = 0x5B2F, [19650] = 0x5B2E, +- [19651] = 0x5B7B, [19652] = 0x5BF1, [19653] = 0x5BF2, [19654] = 0x5DB7, +- [19655] = 0x5E6C, [19656] = 0x5E6A, [19657] = 0x5FBE, [19658] = 0x5FBB, +- [19659] = 0x61C3, [19660] = 0x61B5, [19661] = 0x61BC, [19662] = 0x61E7, +- [19663] = 0x61E0, [19664] = 0x61E5, [19665] = 0x61E4, [19666] = 0x61E8, +- [19667] = 0x61DE, [19668] = 0x64EF, [19669] = 0x64E9, [19670] = 0x64E3, +- [19671] = 0x64EB, [19672] = 0x64E4, [19673] = 0x64E8, [19674] = 0x6581, +- [19675] = 0x6580, [19676] = 0x65B6, [19677] = 0x65DA, [19678] = 0x66D2, +- [19679] = 0x6A8D, [19680] = 0x6A96, [19681] = 0x6A81, [19682] = 0x6AA5, +- [19683] = 0x6A89, [19684] = 0x6A9F, [19685] = 0x6A9B, [19686] = 0x6AA1, +- [19687] = 0x6A9E, [19688] = 0x6A87, [19689] = 0x6A93, [19690] = 0x6A8E, +- [19695] = 0x6A95, [19696] = 0x6A83, [19697] = 0x6AA8, [19698] = 0x6AA4, +- [19699] = 0x6A91, [19700] = 0x6A7F, [19701] = 0x6AA6, [19702] = 0x6A9A, +- [19703] = 0x6A85, [19704] = 0x6A8C, [19705] = 0x6A92, [19706] = 0x6B5B, +- [19707] = 0x6BAD, [19708] = 0x6C09, [19709] = 0x6FCC, [19710] = 0x6FA9, +- [19711] = 0x6FF4, [19712] = 0x6FD4, [19713] = 0x6FE3, [19714] = 0x6FDC, +- [19715] = 0x6FED, [19716] = 0x6FE7, [19717] = 0x6FE6, [19718] = 0x6FDE, +- [19719] = 0x6FF2, [19720] = 0x6FDD, [19721] = 0x6FE2, [19722] = 0x6FE8, +- [19723] = 0x71E1, [19724] = 0x71F1, [19725] = 0x71E8, [19726] = 0x71F2, +- [19727] = 0x71E4, [19728] = 0x71F0, [19729] = 0x71E2, [19730] = 0x7373, +- [19731] = 0x736E, [19732] = 0x736F, [19733] = 0x7497, [19734] = 0x74B2, +- [19735] = 0x74AB, [19736] = 0x7490, [19737] = 0x74AA, [19738] = 0x74AD, +- [19739] = 0x74B1, [19740] = 0x74A5, [19741] = 0x74AF, [19742] = 0x7510, +- [19743] = 0x7511, [19744] = 0x7512, [19745] = 0x750F, [19746] = 0x7584, +- [19747] = 0x7643, [19748] = 0x7648, [19749] = 0x7649, [19750] = 0x7647, +- [19751] = 0x76A4, [19752] = 0x76E9, [19753] = 0x77B5, [19754] = 0x77AB, +- [19755] = 0x77B2, [19756] = 0x77B7, [19757] = 0x77B6, [19792] = 0x77B4, +- [19793] = 0x77B1, [19794] = 0x77A8, [19795] = 0x77F0, [19796] = 0x78F3, +- [19797] = 0x78FD, [19798] = 0x7902, [19799] = 0x78FB, [19800] = 0x78FC, +- [19801] = 0x78F2, [19802] = 0x7905, [19803] = 0x78F9, [19804] = 0x78FE, +- [19805] = 0x7904, [19806] = 0x79AB, [19807] = 0x79A8, [19808] = 0x7A5C, +- [19809] = 0x7A5B, [19810] = 0x7A56, [19811] = 0x7A58, [19812] = 0x7A54, +- [19813] = 0x7A5A, [19814] = 0x7ABE, [19815] = 0x7AC0, [19816] = 0x7AC1, +- [19817] = 0x7C05, [19818] = 0x7C0F, [19819] = 0x7BF2, [19820] = 0x7C00, +- [19821] = 0x7BFF, [19822] = 0x7BFB, [19823] = 0x7C0E, [19824] = 0x7BF4, +- [19825] = 0x7C0B, [19826] = 0x7BF3, [19827] = 0x7C02, [19828] = 0x7C09, +- [19829] = 0x7C03, [19830] = 0x7C01, [19831] = 0x7BF8, [19832] = 0x7BFD, +- [19833] = 0x7C06, [19834] = 0x7BF0, [19835] = 0x7BF1, [19836] = 0x7C10, +- [19837] = 0x7C0A, [19838] = 0x7CE8, [19839] = 0x7E2D, [19840] = 0x7E3C, +- [19841] = 0x7E42, [19842] = 0x7E33, [19843] = 0x9848, [19844] = 0x7E38, +- [19845] = 0x7E2A, [19846] = 0x7E49, [19847] = 0x7E40, [19848] = 0x7E47, +- [19849] = 0x7E29, [19850] = 0x7E4C, [19851] = 0x7E30, [19852] = 0x7E3B, +- [19853] = 0x7E36, [19854] = 0x7E44, [19855] = 0x7E3A, [19856] = 0x7F45, +- [19857] = 0x7F7F, [19858] = 0x7F7E, [19859] = 0x7F7D, [19860] = 0x7FF4, +- [19861] = 0x7FF2, [19862] = 0x802C, [19863] = 0x81BB, [19864] = 0x81C4, +- [19865] = 0x81CC, [19866] = 0x81CA, [19867] = 0x81C5, [19868] = 0x81C7, +- [19869] = 0x81BC, [19870] = 0x81E9, [19871] = 0x825B, [19872] = 0x825A, +- [19873] = 0x825C, [19874] = 0x8583, [19875] = 0x8580, [19876] = 0x858F, +- [19877] = 0x85A7, [19878] = 0x8595, [19879] = 0x85A0, [19880] = 0x858B, +- [19881] = 0x85A3, [19882] = 0x857B, [19883] = 0x85A4, [19884] = 0x859A, +- [19885] = 0x859E, [19890] = 0x8577, [19891] = 0x857C, [19892] = 0x8589, +- [19893] = 0x85A1, [19894] = 0x857A, [19895] = 0x8578, [19896] = 0x8557, +- [19897] = 0x858E, [19898] = 0x8596, [19899] = 0x8586, [19900] = 0x858D, +- [19901] = 0x8599, [19902] = 0x859D, [19903] = 0x8581, [19904] = 0x85A2, +- [19905] = 0x8582, [19906] = 0x8588, [19907] = 0x8585, [19908] = 0x8579, +- [19909] = 0x8576, [19910] = 0x8598, [19911] = 0x8590, [19912] = 0x859F, +- [19913] = 0x8668, [19914] = 0x87BE, [19915] = 0x87AA, [19916] = 0x87AD, +- [19917] = 0x87C5, [19918] = 0x87B0, [19919] = 0x87AC, [19920] = 0x87B9, +- [19921] = 0x87B5, [19922] = 0x87BC, [19923] = 0x87AE, [19924] = 0x87C9, +- [19925] = 0x87C3, [19926] = 0x87C2, [19927] = 0x87CC, [19928] = 0x87B7, +- [19929] = 0x87AF, [19930] = 0x87C4, [19931] = 0x87CA, [19932] = 0x87B4, +- [19933] = 0x87B6, [19934] = 0x87BF, [19935] = 0x87B8, [19936] = 0x87BD, +- [19937] = 0x87DE, [19938] = 0x87B2, [19939] = 0x8935, [19940] = 0x8933, +- [19941] = 0x893C, [19942] = 0x893E, [19943] = 0x8941, [19944] = 0x8952, +- [19945] = 0x8937, [19946] = 0x8942, [19947] = 0x89AD, [19948] = 0x89AF, +- [19949] = 0x89AE, [19950] = 0x89F2, [19951] = 0x89F3, [19952] = 0x8B1E, +- [19987] = 0x8B18, [19988] = 0x8B16, [19989] = 0x8B11, [19990] = 0x8B05, +- [19991] = 0x8B0B, [19992] = 0x8B22, [19993] = 0x8B0F, [19994] = 0x8B12, +- [19995] = 0x8B15, [19996] = 0x8B07, [19997] = 0x8B0D, [19998] = 0x8B08, +- [19999] = 0x8B06, [20000] = 0x8B1C, [20001] = 0x8B13, [20002] = 0x8B1A, +- [20003] = 0x8C4F, [20004] = 0x8C70, [20005] = 0x8C72, [20006] = 0x8C71, +- [20007] = 0x8C6F, [20008] = 0x8C95, [20009] = 0x8C94, [20010] = 0x8CF9, +- [20011] = 0x8D6F, [20012] = 0x8E4E, [20013] = 0x8E4D, [20014] = 0x8E53, +- [20015] = 0x8E50, [20016] = 0x8E4C, [20017] = 0x8E47, [20018] = 0x8F43, +- [20019] = 0x8F40, [20020] = 0x9085, [20021] = 0x907E, [20022] = 0x9138, +- [20023] = 0x919A, [20024] = 0x91A2, [20025] = 0x919B, [20026] = 0x9199, +- [20027] = 0x919F, [20028] = 0x91A1, [20029] = 0x919D, [20030] = 0x91A0, +- [20031] = 0x93A1, [20032] = 0x9383, [20033] = 0x93AF, [20034] = 0x9364, +- [20035] = 0x9356, [20036] = 0x9347, [20037] = 0x937C, [20038] = 0x9358, +- [20039] = 0x935C, [20040] = 0x9376, [20041] = 0x9349, [20042] = 0x9350, +- [20043] = 0x9351, [20044] = 0x9360, [20045] = 0x936D, [20046] = 0x938F, +- [20047] = 0x934C, [20048] = 0x936A, [20049] = 0x9379, [20050] = 0x9357, +- [20051] = 0x9355, [20052] = 0x9352, [20053] = 0x934F, [20054] = 0x9371, +- [20055] = 0x9377, [20056] = 0x937B, [20057] = 0x9361, [20058] = 0x935E, +- [20059] = 0x9363, [20060] = 0x9367, [20061] = 0x9380, [20062] = 0x934E, +- [20063] = 0x9359, [20064] = 0x95C7, [20065] = 0x95C0, [20066] = 0x95C9, +- [20067] = 0x95C3, [20068] = 0x95C5, [20069] = 0x95B7, [20070] = 0x96AE, +- [20071] = 0x96B0, [20072] = 0x96AC, [20073] = 0x9720, [20074] = 0x971F, +- [20075] = 0x9718, [20076] = 0x971D, [20077] = 0x9719, [20078] = 0x979A, +- [20079] = 0x97A1, [20080] = 0x979C, [20085] = 0x979E, [20086] = 0x979D, +- [20087] = 0x97D5, [20088] = 0x97D4, [20089] = 0x97F1, [20090] = 0x9841, +- [20091] = 0x9844, [20092] = 0x984A, [20093] = 0x9849, [20094] = 0x9845, +- [20095] = 0x9843, [20096] = 0x9925, [20097] = 0x992B, [20098] = 0x992C, +- [20099] = 0x992A, [20100] = 0x9933, [20101] = 0x9932, [20102] = 0x992F, +- [20103] = 0x992D, [20104] = 0x9931, [20105] = 0x9930, [20106] = 0x9998, +- [20107] = 0x99A3, [20108] = 0x99A1, [20109] = 0x9A02, [20110] = 0x99FA, +- [20111] = 0x99F4, [20112] = 0x99F7, [20113] = 0x99F9, [20114] = 0x99F8, +- [20115] = 0x99F6, [20116] = 0x99FB, [20117] = 0x99FD, [20118] = 0x99FE, +- [20119] = 0x99FC, [20120] = 0x9A03, [20121] = 0x9ABE, [20122] = 0x9AFE, +- [20123] = 0x9AFD, [20124] = 0x9B01, [20125] = 0x9AFC, [20126] = 0x9B48, +- [20127] = 0x9B9A, [20128] = 0x9BA8, [20129] = 0x9B9E, [20130] = 0x9B9B, +- [20131] = 0x9BA6, [20132] = 0x9BA1, [20133] = 0x9BA5, [20134] = 0x9BA4, +- [20135] = 0x9B86, [20136] = 0x9BA2, [20137] = 0x9BA0, [20138] = 0x9BAF, +- [20139] = 0x9D33, [20140] = 0x9D41, [20141] = 0x9D67, [20142] = 0x9D36, +- [20143] = 0x9D2E, [20144] = 0x9D2F, [20145] = 0x9D31, [20146] = 0x9D38, +- [20147] = 0x9D30, [20182] = 0x9D45, [20183] = 0x9D42, [20184] = 0x9D43, +- [20185] = 0x9D3E, [20186] = 0x9D37, [20187] = 0x9D40, [20188] = 0x9D3D, +- [20189] = 0x7FF5, [20190] = 0x9D2D, [20191] = 0x9E8A, [20192] = 0x9E89, +- [20193] = 0x9E8D, [20194] = 0x9EB0, [20195] = 0x9EC8, [20196] = 0x9EDA, +- [20197] = 0x9EFB, [20198] = 0x9EFF, [20199] = 0x9F24, [20200] = 0x9F23, +- [20201] = 0x9F22, [20202] = 0x9F54, [20203] = 0x9FA0, [20204] = 0x5131, +- [20205] = 0x512D, [20206] = 0x512E, [20207] = 0x5698, [20208] = 0x569C, +- [20209] = 0x5697, [20210] = 0x569A, [20211] = 0x569D, [20212] = 0x5699, +- [20213] = 0x5970, [20214] = 0x5B3C, [20215] = 0x5C69, [20216] = 0x5C6A, +- [20217] = 0x5DC0, [20218] = 0x5E6D, [20219] = 0x5E6E, [20220] = 0x61D8, +- [20221] = 0x61DF, [20222] = 0x61ED, [20223] = 0x61EE, [20224] = 0x61F1, +- [20225] = 0x61EA, [20226] = 0x61F0, [20227] = 0x61EB, [20228] = 0x61D6, +- [20229] = 0x61E9, [20230] = 0x64FF, [20231] = 0x6504, [20232] = 0x64FD, +- [20233] = 0x64F8, [20234] = 0x6501, [20235] = 0x6503, [20236] = 0x64FC, +- [20237] = 0x6594, [20238] = 0x65DB, [20239] = 0x66DA, [20240] = 0x66DB, +- [20241] = 0x66D8, [20242] = 0x6AC5, [20243] = 0x6AB9, [20244] = 0x6ABD, +- [20245] = 0x6AE1, [20246] = 0x6AC6, [20247] = 0x6ABA, [20248] = 0x6AB6, +- [20249] = 0x6AB7, [20250] = 0x6AC7, [20251] = 0x6AB4, [20252] = 0x6AAD, +- [20253] = 0x6B5E, [20254] = 0x6BC9, [20255] = 0x6C0B, [20256] = 0x7007, +- [20257] = 0x700C, [20258] = 0x700D, [20259] = 0x7001, [20260] = 0x7005, +- [20261] = 0x7014, [20262] = 0x700E, [20263] = 0x6FFF, [20264] = 0x7000, +- [20265] = 0x6FFB, [20266] = 0x7026, [20267] = 0x6FFC, [20268] = 0x6FF7, +- [20269] = 0x700A, [20270] = 0x7201, [20271] = 0x71FF, [20272] = 0x71F9, +- [20273] = 0x7203, [20274] = 0x71FD, [20275] = 0x7376, [20280] = 0x74B8, +- [20281] = 0x74C0, [20282] = 0x74B5, [20283] = 0x74C1, [20284] = 0x74BE, +- [20285] = 0x74B6, [20286] = 0x74BB, [20287] = 0x74C2, [20288] = 0x7514, +- [20289] = 0x7513, [20290] = 0x765C, [20291] = 0x7664, [20292] = 0x7659, +- [20293] = 0x7650, [20294] = 0x7653, [20295] = 0x7657, [20296] = 0x765A, +- [20297] = 0x76A6, [20298] = 0x76BD, [20299] = 0x76EC, [20300] = 0x77C2, +- [20301] = 0x77BA, [20302] = 0x78FF, [20303] = 0x790C, [20304] = 0x7913, +- [20305] = 0x7914, [20306] = 0x7909, [20307] = 0x7910, [20308] = 0x7912, +- [20309] = 0x7911, [20310] = 0x79AD, [20311] = 0x79AC, [20312] = 0x7A5F, +- [20313] = 0x7C1C, [20314] = 0x7C29, [20315] = 0x7C19, [20316] = 0x7C20, +- [20317] = 0x7C1F, [20318] = 0x7C2D, [20319] = 0x7C1D, [20320] = 0x7C26, +- [20321] = 0x7C28, [20322] = 0x7C22, [20323] = 0x7C25, [20324] = 0x7C30, +- [20325] = 0x7E5C, [20326] = 0x7E50, [20327] = 0x7E56, [20328] = 0x7E63, +- [20329] = 0x7E58, [20330] = 0x7E62, [20331] = 0x7E5F, [20332] = 0x7E51, +- [20333] = 0x7E60, [20334] = 0x7E57, [20335] = 0x7E53, [20336] = 0x7FB5, +- [20337] = 0x7FB3, [20338] = 0x7FF7, [20339] = 0x7FF8, [20340] = 0x8075, +- [20341] = 0x81D1, [20342] = 0x81D2, [20377] = 0x81D0, [20378] = 0x825F, +- [20379] = 0x825E, [20380] = 0x85B4, [20381] = 0x85C6, [20382] = 0x85C0, +- [20383] = 0x85C3, [20384] = 0x85C2, [20385] = 0x85B3, [20386] = 0x85B5, +- [20387] = 0x85BD, [20388] = 0x85C7, [20389] = 0x85C4, [20390] = 0x85BF, +- [20391] = 0x85CB, [20392] = 0x85CE, [20393] = 0x85C8, [20394] = 0x85C5, +- [20395] = 0x85B1, [20396] = 0x85B6, [20397] = 0x85D2, [20398] = 0x8624, +- [20399] = 0x85B8, [20400] = 0x85B7, [20401] = 0x85BE, [20402] = 0x8669, +- [20403] = 0x87E7, [20404] = 0x87E6, [20405] = 0x87E2, [20406] = 0x87DB, +- [20407] = 0x87EB, [20408] = 0x87EA, [20409] = 0x87E5, [20410] = 0x87DF, +- [20411] = 0x87F3, [20412] = 0x87E4, [20413] = 0x87D4, [20414] = 0x87DC, +- [20415] = 0x87D3, [20416] = 0x87ED, [20417] = 0x87D8, [20418] = 0x87E3, +- [20419] = 0x87A4, [20420] = 0x87D7, [20421] = 0x87D9, [20422] = 0x8801, +- [20423] = 0x87F4, [20424] = 0x87E8, [20425] = 0x87DD, [20426] = 0x8953, +- [20427] = 0x894B, [20428] = 0x894F, [20429] = 0x894C, [20430] = 0x8946, +- [20431] = 0x8950, [20432] = 0x8951, [20433] = 0x8949, [20434] = 0x8B2A, +- [20435] = 0x8B27, [20436] = 0x8B23, [20437] = 0x8B33, [20438] = 0x8B30, +- [20439] = 0x8B35, [20440] = 0x8B47, [20441] = 0x8B2F, [20442] = 0x8B3C, +- [20443] = 0x8B3E, [20444] = 0x8B31, [20445] = 0x8B25, [20446] = 0x8B37, +- [20447] = 0x8B26, [20448] = 0x8B36, [20449] = 0x8B2E, [20450] = 0x8B24, +- [20451] = 0x8B3B, [20452] = 0x8B3D, [20453] = 0x8B3A, [20454] = 0x8C42, +- [20455] = 0x8C75, [20456] = 0x8C99, [20457] = 0x8C98, [20458] = 0x8C97, +- [20459] = 0x8CFE, [20460] = 0x8D04, [20461] = 0x8D02, [20462] = 0x8D00, +- [20463] = 0x8E5C, [20464] = 0x8E62, [20465] = 0x8E60, [20466] = 0x8E57, +- [20467] = 0x8E56, [20468] = 0x8E5E, [20469] = 0x8E65, [20470] = 0x8E67, +- [20475] = 0x8E5B, [20476] = 0x8E5A, [20477] = 0x8E61, [20478] = 0x8E5D, +- [20479] = 0x8E69, [20480] = 0x8E54, [20481] = 0x8F46, [20482] = 0x8F47, +- [20483] = 0x8F48, [20484] = 0x8F4B, [20485] = 0x9128, [20486] = 0x913A, +- [20487] = 0x913B, [20488] = 0x913E, [20489] = 0x91A8, [20490] = 0x91A5, +- [20491] = 0x91A7, [20492] = 0x91AF, [20493] = 0x91AA, [20494] = 0x93B5, +- [20495] = 0x938C, [20496] = 0x9392, [20497] = 0x93B7, [20498] = 0x939B, +- [20499] = 0x939D, [20500] = 0x9389, [20501] = 0x93A7, [20502] = 0x938E, +- [20503] = 0x93AA, [20504] = 0x939E, [20505] = 0x93A6, [20506] = 0x9395, +- [20507] = 0x9388, [20508] = 0x9399, [20509] = 0x939F, [20510] = 0x938D, +- [20511] = 0x93B1, [20512] = 0x9391, [20513] = 0x93B2, [20514] = 0x93A4, +- [20515] = 0x93A8, [20516] = 0x93B4, [20517] = 0x93A3, [20518] = 0x93A5, +- [20519] = 0x95D2, [20520] = 0x95D3, [20521] = 0x95D1, [20522] = 0x96B3, +- [20523] = 0x96D7, [20524] = 0x96DA, [20525] = 0x5DC2, [20526] = 0x96DF, +- [20527] = 0x96D8, [20528] = 0x96DD, [20529] = 0x9723, [20530] = 0x9722, +- [20531] = 0x9725, [20532] = 0x97AC, [20533] = 0x97AE, [20534] = 0x97A8, +- [20535] = 0x97AB, [20536] = 0x97A4, [20537] = 0x97AA, [20572] = 0x97A2, +- [20573] = 0x97A5, [20574] = 0x97D7, [20575] = 0x97D9, [20576] = 0x97D6, +- [20577] = 0x97D8, [20578] = 0x97FA, [20579] = 0x9850, [20580] = 0x9851, +- [20581] = 0x9852, [20582] = 0x98B8, [20583] = 0x9941, [20584] = 0x993C, +- [20585] = 0x993A, [20586] = 0x9A0F, [20587] = 0x9A0B, [20588] = 0x9A09, +- [20589] = 0x9A0D, [20590] = 0x9A04, [20591] = 0x9A11, [20592] = 0x9A0A, +- [20593] = 0x9A05, [20594] = 0x9A07, [20595] = 0x9A06, [20596] = 0x9AC0, +- [20597] = 0x9ADC, [20598] = 0x9B08, [20599] = 0x9B04, [20600] = 0x9B05, +- [20601] = 0x9B29, [20602] = 0x9B35, [20603] = 0x9B4A, [20604] = 0x9B4C, +- [20605] = 0x9B4B, [20606] = 0x9BC7, [20607] = 0x9BC6, [20608] = 0x9BC3, +- [20609] = 0x9BBF, [20610] = 0x9BC1, [20611] = 0x9BB5, [20612] = 0x9BB8, +- [20613] = 0x9BD3, [20614] = 0x9BB6, [20615] = 0x9BC4, [20616] = 0x9BB9, +- [20617] = 0x9BBD, [20618] = 0x9D5C, [20619] = 0x9D53, [20620] = 0x9D4F, +- [20621] = 0x9D4A, [20622] = 0x9D5B, [20623] = 0x9D4B, [20624] = 0x9D59, +- [20625] = 0x9D56, [20626] = 0x9D4C, [20627] = 0x9D57, [20628] = 0x9D52, +- [20629] = 0x9D54, [20630] = 0x9D5F, [20631] = 0x9D58, [20632] = 0x9D5A, +- [20633] = 0x9E8E, [20634] = 0x9E8C, [20635] = 0x9EDF, [20636] = 0x9F01, +- [20637] = 0x9F00, [20638] = 0x9F16, [20639] = 0x9F25, [20640] = 0x9F2B, +- [20641] = 0x9F2A, [20642] = 0x9F29, [20643] = 0x9F28, [20644] = 0x9F4C, +- [20645] = 0x9F55, [20646] = 0x5134, [20647] = 0x5135, [20648] = 0x5296, +- [20649] = 0x52F7, [20650] = 0x53B4, [20651] = 0x56AB, [20652] = 0x56AD, +- [20653] = 0x56A6, [20654] = 0x56A7, [20655] = 0x56AA, [20656] = 0x56AC, +- [20657] = 0x58DA, [20658] = 0x58DD, [20659] = 0x58DB, [20660] = 0x5912, +- [20661] = 0x5B3D, [20662] = 0x5B3E, [20663] = 0x5B3F, [20664] = 0x5DC3, +- [20665] = 0x5E70, [20670] = 0x5FBF, [20671] = 0x61FB, [20672] = 0x6507, +- [20673] = 0x6510, [20674] = 0x650D, [20675] = 0x6509, [20676] = 0x650C, +- [20677] = 0x650E, [20678] = 0x6584, [20679] = 0x65DE, [20680] = 0x65DD, +- [20681] = 0x66DE, [20682] = 0x6AE7, [20683] = 0x6AE0, [20684] = 0x6ACC, +- [20685] = 0x6AD1, [20686] = 0x6AD9, [20687] = 0x6ACB, [20688] = 0x6ADF, +- [20689] = 0x6ADC, [20690] = 0x6AD0, [20691] = 0x6AEB, [20692] = 0x6ACF, +- [20693] = 0x6ACD, [20694] = 0x6ADE, [20695] = 0x6B60, [20696] = 0x6BB0, +- [20697] = 0x6C0C, [20698] = 0x7019, [20699] = 0x7027, [20700] = 0x7020, +- [20701] = 0x7016, [20702] = 0x702B, [20703] = 0x7021, [20704] = 0x7022, +- [20705] = 0x7023, [20706] = 0x7029, [20707] = 0x7017, [20708] = 0x7024, +- [20709] = 0x701C, [20710] = 0x702A, [20711] = 0x720C, [20712] = 0x720A, +- [20713] = 0x7207, [20714] = 0x7202, [20715] = 0x7205, [20716] = 0x72A5, +- [20717] = 0x72A6, [20718] = 0x72A4, [20719] = 0x72A3, [20720] = 0x72A1, +- [20721] = 0x74CB, [20722] = 0x74C5, [20723] = 0x74B7, [20724] = 0x74C3, +- [20725] = 0x7516, [20726] = 0x7660, [20727] = 0x77C9, [20728] = 0x77CA, +- [20729] = 0x77C4, [20730] = 0x77F1, [20731] = 0x791D, [20732] = 0x791B, +- [20767] = 0x7921, [20768] = 0x791C, [20769] = 0x7917, [20770] = 0x791E, +- [20771] = 0x79B0, [20772] = 0x7A67, [20773] = 0x7A68, [20774] = 0x7C33, +- [20775] = 0x7C3C, [20776] = 0x7C39, [20777] = 0x7C2C, [20778] = 0x7C3B, +- [20779] = 0x7CEC, [20780] = 0x7CEA, [20781] = 0x7E76, [20782] = 0x7E75, +- [20783] = 0x7E78, [20784] = 0x7E70, [20785] = 0x7E77, [20786] = 0x7E6F, +- [20787] = 0x7E7A, [20788] = 0x7E72, [20789] = 0x7E74, [20790] = 0x7E68, +- [20791] = 0x7F4B, [20792] = 0x7F4A, [20793] = 0x7F83, [20794] = 0x7F86, +- [20795] = 0x7FB7, [20796] = 0x7FFD, [20797] = 0x7FFE, [20798] = 0x8078, +- [20799] = 0x81D7, [20800] = 0x81D5, [20801] = 0x8264, [20802] = 0x8261, +- [20803] = 0x8263, [20804] = 0x85EB, [20805] = 0x85F1, [20806] = 0x85ED, +- [20807] = 0x85D9, [20808] = 0x85E1, [20809] = 0x85E8, [20810] = 0x85DA, +- [20811] = 0x85D7, [20812] = 0x85EC, [20813] = 0x85F2, [20814] = 0x85F8, +- [20815] = 0x85D8, [20816] = 0x85DF, [20817] = 0x85E3, [20818] = 0x85DC, +- [20819] = 0x85D1, [20820] = 0x85F0, [20821] = 0x85E6, [20822] = 0x85EF, +- [20823] = 0x85DE, [20824] = 0x85E2, [20825] = 0x8800, [20826] = 0x87FA, +- [20827] = 0x8803, [20828] = 0x87F6, [20829] = 0x87F7, [20830] = 0x8809, +- [20831] = 0x880C, [20832] = 0x880B, [20833] = 0x8806, [20834] = 0x87FC, +- [20835] = 0x8808, [20836] = 0x87FF, [20837] = 0x880A, [20838] = 0x8802, +- [20839] = 0x8962, [20840] = 0x895A, [20841] = 0x895B, [20842] = 0x8957, +- [20843] = 0x8961, [20844] = 0x895C, [20845] = 0x8958, [20846] = 0x895D, +- [20847] = 0x8959, [20848] = 0x8988, [20849] = 0x89B7, [20850] = 0x89B6, +- [20851] = 0x89F6, [20852] = 0x8B50, [20853] = 0x8B48, [20854] = 0x8B4A, +- [20855] = 0x8B40, [20856] = 0x8B53, [20857] = 0x8B56, [20858] = 0x8B54, +- [20859] = 0x8B4B, [20860] = 0x8B55, [20865] = 0x8B51, [20866] = 0x8B42, +- [20867] = 0x8B52, [20868] = 0x8B57, [20869] = 0x8C43, [20870] = 0x8C77, +- [20871] = 0x8C76, [20872] = 0x8C9A, [20873] = 0x8D06, [20874] = 0x8D07, +- [20875] = 0x8D09, [20876] = 0x8DAC, [20877] = 0x8DAA, [20878] = 0x8DAD, +- [20879] = 0x8DAB, [20880] = 0x8E6D, [20881] = 0x8E78, [20882] = 0x8E73, +- [20883] = 0x8E6A, [20884] = 0x8E6F, [20885] = 0x8E7B, [20886] = 0x8EC2, +- [20887] = 0x8F52, [20888] = 0x8F51, [20889] = 0x8F4F, [20890] = 0x8F50, +- [20891] = 0x8F53, [20892] = 0x8FB4, [20893] = 0x9140, [20894] = 0x913F, +- [20895] = 0x91B0, [20896] = 0x91AD, [20897] = 0x93DE, [20898] = 0x93C7, +- [20899] = 0x93CF, [20900] = 0x93C2, [20901] = 0x93DA, [20902] = 0x93D0, +- [20903] = 0x93F9, [20904] = 0x93EC, [20905] = 0x93CC, [20906] = 0x93D9, +- [20907] = 0x93A9, [20908] = 0x93E6, [20909] = 0x93CA, [20910] = 0x93D4, +- [20911] = 0x93EE, [20912] = 0x93E3, [20913] = 0x93D5, [20914] = 0x93C4, +- [20915] = 0x93CE, [20916] = 0x93C0, [20917] = 0x93D2, [20918] = 0x93E7, +- [20919] = 0x957D, [20920] = 0x95DA, [20921] = 0x95DB, [20922] = 0x96E1, +- [20923] = 0x9729, [20924] = 0x972B, [20925] = 0x972C, [20926] = 0x9728, +- [20927] = 0x9726, [20962] = 0x97B3, [20963] = 0x97B7, [20964] = 0x97B6, +- [20965] = 0x97DD, [20966] = 0x97DE, [20967] = 0x97DF, [20968] = 0x985C, +- [20969] = 0x9859, [20970] = 0x985D, [20971] = 0x9857, [20972] = 0x98BF, +- [20973] = 0x98BD, [20974] = 0x98BB, [20975] = 0x98BE, [20976] = 0x9948, +- [20977] = 0x9947, [20978] = 0x9943, [20979] = 0x99A6, [20980] = 0x99A7, +- [20981] = 0x9A1A, [20982] = 0x9A15, [20983] = 0x9A25, [20984] = 0x9A1D, +- [20985] = 0x9A24, [20986] = 0x9A1B, [20987] = 0x9A22, [20988] = 0x9A20, +- [20989] = 0x9A27, [20990] = 0x9A23, [20991] = 0x9A1E, [20992] = 0x9A1C, +- [20993] = 0x9A14, [20994] = 0x9AC2, [20995] = 0x9B0B, [20996] = 0x9B0A, +- [20997] = 0x9B0E, [20998] = 0x9B0C, [20999] = 0x9B37, [21000] = 0x9BEA, +- [21001] = 0x9BEB, [21002] = 0x9BE0, [21003] = 0x9BDE, [21004] = 0x9BE4, +- [21005] = 0x9BE6, [21006] = 0x9BE2, [21007] = 0x9BF0, [21008] = 0x9BD4, +- [21009] = 0x9BD7, [21010] = 0x9BEC, [21011] = 0x9BDC, [21012] = 0x9BD9, +- [21013] = 0x9BE5, [21014] = 0x9BD5, [21015] = 0x9BE1, [21016] = 0x9BDA, +- [21017] = 0x9D77, [21018] = 0x9D81, [21019] = 0x9D8A, [21020] = 0x9D84, +- [21021] = 0x9D88, [21022] = 0x9D71, [21023] = 0x9D80, [21024] = 0x9D78, +- [21025] = 0x9D86, [21026] = 0x9D8B, [21027] = 0x9D8C, [21028] = 0x9D7D, +- [21029] = 0x9D6B, [21030] = 0x9D74, [21031] = 0x9D75, [21032] = 0x9D70, +- [21033] = 0x9D69, [21034] = 0x9D85, [21035] = 0x9D73, [21036] = 0x9D7B, +- [21037] = 0x9D82, [21038] = 0x9D6F, [21039] = 0x9D79, [21040] = 0x9D7F, +- [21041] = 0x9D87, [21042] = 0x9D68, [21043] = 0x9E94, [21044] = 0x9E91, +- [21045] = 0x9EC0, [21046] = 0x9EFC, [21047] = 0x9F2D, [21048] = 0x9F40, +- [21049] = 0x9F41, [21050] = 0x9F4D, [21051] = 0x9F56, [21052] = 0x9F57, +- [21053] = 0x9F58, [21054] = 0x5337, [21055] = 0x56B2, [21060] = 0x56B5, +- [21061] = 0x56B3, [21062] = 0x58E3, [21063] = 0x5B45, [21064] = 0x5DC6, +- [21065] = 0x5DC7, [21066] = 0x5EEE, [21067] = 0x5EEF, [21068] = 0x5FC0, +- [21069] = 0x5FC1, [21070] = 0x61F9, [21071] = 0x6517, [21072] = 0x6516, +- [21073] = 0x6515, [21074] = 0x6513, [21075] = 0x65DF, [21076] = 0x66E8, +- [21077] = 0x66E3, [21078] = 0x66E4, [21079] = 0x6AF3, [21080] = 0x6AF0, +- [21081] = 0x6AEA, [21082] = 0x6AE8, [21083] = 0x6AF9, [21084] = 0x6AF1, +- [21085] = 0x6AEE, [21086] = 0x6AEF, [21087] = 0x703C, [21088] = 0x7035, +- [21089] = 0x702F, [21090] = 0x7037, [21091] = 0x7034, [21092] = 0x7031, +- [21093] = 0x7042, [21094] = 0x7038, [21095] = 0x703F, [21096] = 0x703A, +- [21097] = 0x7039, [21098] = 0x7040, [21099] = 0x703B, [21100] = 0x7033, +- [21101] = 0x7041, [21102] = 0x7213, [21103] = 0x7214, [21104] = 0x72A8, +- [21105] = 0x737D, [21106] = 0x737C, [21107] = 0x74BA, [21108] = 0x76AB, +- [21109] = 0x76AA, [21110] = 0x76BE, [21111] = 0x76ED, [21112] = 0x77CC, +- [21113] = 0x77CE, [21114] = 0x77CF, [21115] = 0x77CD, [21116] = 0x77F2, +- [21117] = 0x7925, [21118] = 0x7923, [21119] = 0x7927, [21120] = 0x7928, +- [21121] = 0x7924, [21122] = 0x7929, [21157] = 0x79B2, [21158] = 0x7A6E, +- [21159] = 0x7A6C, [21160] = 0x7A6D, [21161] = 0x7AF7, [21162] = 0x7C49, +- [21163] = 0x7C48, [21164] = 0x7C4A, [21165] = 0x7C47, [21166] = 0x7C45, +- [21167] = 0x7CEE, [21168] = 0x7E7B, [21169] = 0x7E7E, [21170] = 0x7E81, +- [21171] = 0x7E80, [21172] = 0x7FBA, [21173] = 0x7FFF, [21174] = 0x8079, +- [21175] = 0x81DB, [21176] = 0x81D9, [21177] = 0x820B, [21178] = 0x8268, +- [21179] = 0x8269, [21180] = 0x8622, [21181] = 0x85FF, [21182] = 0x8601, +- [21183] = 0x85FE, [21184] = 0x861B, [21185] = 0x8600, [21186] = 0x85F6, +- [21187] = 0x8604, [21188] = 0x8609, [21189] = 0x8605, [21190] = 0x860C, +- [21191] = 0x85FD, [21192] = 0x8819, [21193] = 0x8810, [21194] = 0x8811, +- [21195] = 0x8817, [21196] = 0x8813, [21197] = 0x8816, [21198] = 0x8963, +- [21199] = 0x8966, [21200] = 0x89B9, [21201] = 0x89F7, [21202] = 0x8B60, +- [21203] = 0x8B6A, [21204] = 0x8B5D, [21205] = 0x8B68, [21206] = 0x8B63, +- [21207] = 0x8B65, [21208] = 0x8B67, [21209] = 0x8B6D, [21210] = 0x8DAE, +- [21211] = 0x8E86, [21212] = 0x8E88, [21213] = 0x8E84, [21214] = 0x8F59, +- [21215] = 0x8F56, [21216] = 0x8F57, [21217] = 0x8F55, [21218] = 0x8F58, +- [21219] = 0x8F5A, [21220] = 0x908D, [21221] = 0x9143, [21222] = 0x9141, +- [21223] = 0x91B7, [21224] = 0x91B5, [21225] = 0x91B2, [21226] = 0x91B3, +- [21227] = 0x940B, [21228] = 0x9413, [21229] = 0x93FB, [21230] = 0x9420, +- [21231] = 0x940F, [21232] = 0x9414, [21233] = 0x93FE, [21234] = 0x9415, +- [21235] = 0x9410, [21236] = 0x9428, [21237] = 0x9419, [21238] = 0x940D, +- [21239] = 0x93F5, [21240] = 0x9400, [21241] = 0x93F7, [21242] = 0x9407, +- [21243] = 0x940E, [21244] = 0x9416, [21245] = 0x9412, [21246] = 0x93FA, +- [21247] = 0x9409, [21248] = 0x93F8, [21249] = 0x940A, [21250] = 0x93FF, +- [21255] = 0x93FC, [21256] = 0x940C, [21257] = 0x93F6, [21258] = 0x9411, +- [21259] = 0x9406, [21260] = 0x95DE, [21261] = 0x95E0, [21262] = 0x95DF, +- [21263] = 0x972E, [21264] = 0x972F, [21265] = 0x97B9, [21266] = 0x97BB, +- [21267] = 0x97FD, [21268] = 0x97FE, [21269] = 0x9860, [21270] = 0x9862, +- [21271] = 0x9863, [21272] = 0x985F, [21273] = 0x98C1, [21274] = 0x98C2, +- [21275] = 0x9950, [21276] = 0x994E, [21277] = 0x9959, [21278] = 0x994C, +- [21279] = 0x994B, [21280] = 0x9953, [21281] = 0x9A32, [21282] = 0x9A34, +- [21283] = 0x9A31, [21284] = 0x9A2C, [21285] = 0x9A2A, [21286] = 0x9A36, +- [21287] = 0x9A29, [21288] = 0x9A2E, [21289] = 0x9A38, [21290] = 0x9A2D, +- [21291] = 0x9AC7, [21292] = 0x9ACA, [21293] = 0x9AC6, [21294] = 0x9B10, +- [21295] = 0x9B12, [21296] = 0x9B11, [21297] = 0x9C0B, [21298] = 0x9C08, +- [21299] = 0x9BF7, [21300] = 0x9C05, [21301] = 0x9C12, [21302] = 0x9BF8, +- [21303] = 0x9C40, [21304] = 0x9C07, [21305] = 0x9C0E, [21306] = 0x9C06, +- [21307] = 0x9C17, [21308] = 0x9C14, [21309] = 0x9C09, [21310] = 0x9D9F, +- [21311] = 0x9D99, [21312] = 0x9DA4, [21313] = 0x9D9D, [21314] = 0x9D92, +- [21315] = 0x9D98, [21316] = 0x9D90, [21317] = 0x9D9B, [21352] = 0x9DA0, +- [21353] = 0x9D94, [21354] = 0x9D9C, [21355] = 0x9DAA, [21356] = 0x9D97, +- [21357] = 0x9DA1, [21358] = 0x9D9A, [21359] = 0x9DA2, [21360] = 0x9DA8, +- [21361] = 0x9D9E, [21362] = 0x9DA3, [21363] = 0x9DBF, [21364] = 0x9DA9, +- [21365] = 0x9D96, [21366] = 0x9DA6, [21367] = 0x9DA7, [21368] = 0x9E99, +- [21369] = 0x9E9B, [21370] = 0x9E9A, [21371] = 0x9EE5, [21372] = 0x9EE4, +- [21373] = 0x9EE7, [21374] = 0x9EE6, [21375] = 0x9F30, [21376] = 0x9F2E, +- [21377] = 0x9F5B, [21378] = 0x9F60, [21379] = 0x9F5E, [21380] = 0x9F5D, +- [21381] = 0x9F59, [21382] = 0x9F91, [21383] = 0x513A, [21384] = 0x5139, +- [21385] = 0x5298, [21386] = 0x5297, [21387] = 0x56C3, [21388] = 0x56BD, +- [21389] = 0x56BE, [21390] = 0x5B48, [21391] = 0x5B47, [21392] = 0x5DCB, +- [21393] = 0x5DCF, [21394] = 0x5EF1, [21395] = 0x61FD, [21396] = 0x651B, +- [21397] = 0x6B02, [21398] = 0x6AFC, [21399] = 0x6B03, [21400] = 0x6AF8, +- [21401] = 0x6B00, [21402] = 0x7043, [21403] = 0x7044, [21404] = 0x704A, +- [21405] = 0x7048, [21406] = 0x7049, [21407] = 0x7045, [21408] = 0x7046, +- [21409] = 0x721D, [21410] = 0x721A, [21411] = 0x7219, [21412] = 0x737E, +- [21413] = 0x7517, [21414] = 0x766A, [21415] = 0x77D0, [21416] = 0x792D, +- [21417] = 0x7931, [21418] = 0x792F, [21419] = 0x7C54, [21420] = 0x7C53, +- [21421] = 0x7CF2, [21422] = 0x7E8A, [21423] = 0x7E87, [21424] = 0x7E88, +- [21425] = 0x7E8B, [21426] = 0x7E86, [21427] = 0x7E8D, [21428] = 0x7F4D, +- [21429] = 0x7FBB, [21430] = 0x8030, [21431] = 0x81DD, [21432] = 0x8618, +- [21433] = 0x862A, [21434] = 0x8626, [21435] = 0x861F, [21436] = 0x8623, +- [21437] = 0x861C, [21438] = 0x8619, [21439] = 0x8627, [21440] = 0x862E, +- [21441] = 0x8621, [21442] = 0x8620, [21443] = 0x8629, [21444] = 0x861E, +- [21445] = 0x8625, [21450] = 0x8829, [21451] = 0x881D, [21452] = 0x881B, +- [21453] = 0x8820, [21454] = 0x8824, [21455] = 0x881C, [21456] = 0x882B, +- [21457] = 0x884A, [21458] = 0x896D, [21459] = 0x8969, [21460] = 0x896E, +- [21461] = 0x896B, [21462] = 0x89FA, [21463] = 0x8B79, [21464] = 0x8B78, +- [21465] = 0x8B45, [21466] = 0x8B7A, [21467] = 0x8B7B, [21468] = 0x8D10, +- [21469] = 0x8D14, [21470] = 0x8DAF, [21471] = 0x8E8E, [21472] = 0x8E8C, +- [21473] = 0x8F5E, [21474] = 0x8F5B, [21475] = 0x8F5D, [21476] = 0x9146, +- [21477] = 0x9144, [21478] = 0x9145, [21479] = 0x91B9, [21480] = 0x943F, +- [21481] = 0x943B, [21482] = 0x9436, [21483] = 0x9429, [21484] = 0x943D, +- [21485] = 0x943C, [21486] = 0x9430, [21487] = 0x9439, [21488] = 0x942A, +- [21489] = 0x9437, [21490] = 0x942C, [21491] = 0x9440, [21492] = 0x9431, +- [21493] = 0x95E5, [21494] = 0x95E4, [21495] = 0x95E3, [21496] = 0x9735, +- [21497] = 0x973A, [21498] = 0x97BF, [21499] = 0x97E1, [21500] = 0x9864, +- [21501] = 0x98C9, [21502] = 0x98C6, [21503] = 0x98C0, [21504] = 0x9958, +- [21505] = 0x9956, [21506] = 0x9A39, [21507] = 0x9A3D, [21508] = 0x9A46, +- [21509] = 0x9A44, [21510] = 0x9A42, [21511] = 0x9A41, [21512] = 0x9A3A, +- [21547] = 0x9A3F, [21548] = 0x9ACD, [21549] = 0x9B15, [21550] = 0x9B17, +- [21551] = 0x9B18, [21552] = 0x9B16, [21553] = 0x9B3A, [21554] = 0x9B52, +- [21555] = 0x9C2B, [21556] = 0x9C1D, [21557] = 0x9C1C, [21558] = 0x9C2C, +- [21559] = 0x9C23, [21560] = 0x9C28, [21561] = 0x9C29, [21562] = 0x9C24, +- [21563] = 0x9C21, [21564] = 0x9DB7, [21565] = 0x9DB6, [21566] = 0x9DBC, +- [21567] = 0x9DC1, [21568] = 0x9DC7, [21569] = 0x9DCA, [21570] = 0x9DCF, +- [21571] = 0x9DBE, [21572] = 0x9DC5, [21573] = 0x9DC3, [21574] = 0x9DBB, +- [21575] = 0x9DB5, [21576] = 0x9DCE, [21577] = 0x9DB9, [21578] = 0x9DBA, +- [21579] = 0x9DAC, [21580] = 0x9DC8, [21581] = 0x9DB1, [21582] = 0x9DAD, +- [21583] = 0x9DCC, [21584] = 0x9DB3, [21585] = 0x9DCD, [21586] = 0x9DB2, +- [21587] = 0x9E7A, [21588] = 0x9E9C, [21589] = 0x9EEB, [21590] = 0x9EEE, +- [21591] = 0x9EED, [21592] = 0x9F1B, [21593] = 0x9F18, [21594] = 0x9F1A, +- [21595] = 0x9F31, [21596] = 0x9F4E, [21597] = 0x9F65, [21598] = 0x9F64, +- [21599] = 0x9F92, [21600] = 0x4EB9, [21601] = 0x56C6, [21602] = 0x56C5, +- [21603] = 0x56CB, [21604] = 0x5971, [21605] = 0x5B4B, [21606] = 0x5B4C, +- [21607] = 0x5DD5, [21608] = 0x5DD1, [21609] = 0x5EF2, [21610] = 0x6521, +- [21611] = 0x6520, [21612] = 0x6526, [21613] = 0x6522, [21614] = 0x6B0B, +- [21615] = 0x6B08, [21616] = 0x6B09, [21617] = 0x6C0D, [21618] = 0x7055, +- [21619] = 0x7056, [21620] = 0x7057, [21621] = 0x7052, [21622] = 0x721E, +- [21623] = 0x721F, [21624] = 0x72A9, [21625] = 0x737F, [21626] = 0x74D8, +- [21627] = 0x74D5, [21628] = 0x74D9, [21629] = 0x74D7, [21630] = 0x766D, +- [21631] = 0x76AD, [21632] = 0x7935, [21633] = 0x79B4, [21634] = 0x7A70, +- [21635] = 0x7A71, [21636] = 0x7C57, [21637] = 0x7C5C, [21638] = 0x7C59, +- [21639] = 0x7C5B, [21640] = 0x7C5A, [21645] = 0x7CF4, [21646] = 0x7CF1, +- [21647] = 0x7E91, [21648] = 0x7F4F, [21649] = 0x7F87, [21650] = 0x81DE, +- [21651] = 0x826B, [21652] = 0x8634, [21653] = 0x8635, [21654] = 0x8633, +- [21655] = 0x862C, [21656] = 0x8632, [21657] = 0x8636, [21658] = 0x882C, +- [21659] = 0x8828, [21660] = 0x8826, [21661] = 0x882A, [21662] = 0x8825, +- [21663] = 0x8971, [21664] = 0x89BF, [21665] = 0x89BE, [21666] = 0x89FB, +- [21667] = 0x8B7E, [21668] = 0x8B84, [21669] = 0x8B82, [21670] = 0x8B86, +- [21671] = 0x8B85, [21672] = 0x8B7F, [21673] = 0x8D15, [21674] = 0x8E95, +- [21675] = 0x8E94, [21676] = 0x8E9A, [21677] = 0x8E92, [21678] = 0x8E90, +- [21679] = 0x8E96, [21680] = 0x8E97, [21681] = 0x8F60, [21682] = 0x8F62, +- [21683] = 0x9147, [21684] = 0x944C, [21685] = 0x9450, [21686] = 0x944A, +- [21687] = 0x944B, [21688] = 0x944F, [21689] = 0x9447, [21690] = 0x9445, +- [21691] = 0x9448, [21692] = 0x9449, [21693] = 0x9446, [21694] = 0x973F, +- [21695] = 0x97E3, [21696] = 0x986A, [21697] = 0x9869, [21698] = 0x98CB, +- [21699] = 0x9954, [21700] = 0x995B, [21701] = 0x9A4E, [21702] = 0x9A53, +- [21703] = 0x9A54, [21704] = 0x9A4C, [21705] = 0x9A4F, [21706] = 0x9A48, +- [21707] = 0x9A4A, [21742] = 0x9A49, [21743] = 0x9A52, [21744] = 0x9A50, +- [21745] = 0x9AD0, [21746] = 0x9B19, [21747] = 0x9B2B, [21748] = 0x9B3B, +- [21749] = 0x9B56, [21750] = 0x9B55, [21751] = 0x9C46, [21752] = 0x9C48, +- [21753] = 0x9C3F, [21754] = 0x9C44, [21755] = 0x9C39, [21756] = 0x9C33, +- [21757] = 0x9C41, [21758] = 0x9C3C, [21759] = 0x9C37, [21760] = 0x9C34, +- [21761] = 0x9C32, [21762] = 0x9C3D, [21763] = 0x9C36, [21764] = 0x9DDB, +- [21765] = 0x9DD2, [21766] = 0x9DDE, [21767] = 0x9DDA, [21768] = 0x9DCB, +- [21769] = 0x9DD0, [21770] = 0x9DDC, [21771] = 0x9DD1, [21772] = 0x9DDF, +- [21773] = 0x9DE9, [21774] = 0x9DD9, [21775] = 0x9DD8, [21776] = 0x9DD6, +- [21777] = 0x9DF5, [21778] = 0x9DD5, [21779] = 0x9DDD, [21780] = 0x9EB6, +- [21781] = 0x9EF0, [21782] = 0x9F35, [21783] = 0x9F33, [21784] = 0x9F32, +- [21785] = 0x9F42, [21786] = 0x9F6B, [21787] = 0x9F95, [21788] = 0x9FA2, +- [21789] = 0x513D, [21790] = 0x5299, [21791] = 0x58E8, [21792] = 0x58E7, +- [21793] = 0x5972, [21794] = 0x5B4D, [21795] = 0x5DD8, [21796] = 0x882F, +- [21797] = 0x5F4F, [21798] = 0x6201, [21799] = 0x6203, [21800] = 0x6204, +- [21801] = 0x6529, [21802] = 0x6525, [21803] = 0x6596, [21804] = 0x66EB, +- [21805] = 0x6B11, [21806] = 0x6B12, [21807] = 0x6B0F, [21808] = 0x6BCA, +- [21809] = 0x705B, [21810] = 0x705A, [21811] = 0x7222, [21812] = 0x7382, +- [21813] = 0x7381, [21814] = 0x7383, [21815] = 0x7670, [21816] = 0x77D4, +- [21817] = 0x7C67, [21818] = 0x7C66, [21819] = 0x7E95, [21820] = 0x826C, +- [21821] = 0x863A, [21822] = 0x8640, [21823] = 0x8639, [21824] = 0x863C, +- [21825] = 0x8631, [21826] = 0x863B, [21827] = 0x863E, [21828] = 0x8830, +- [21829] = 0x8832, [21830] = 0x882E, [21831] = 0x8833, [21832] = 0x8976, +- [21833] = 0x8974, [21834] = 0x8973, [21835] = 0x89FE, [21840] = 0x8B8C, +- [21841] = 0x8B8E, [21842] = 0x8B8B, [21843] = 0x8B88, [21844] = 0x8C45, +- [21845] = 0x8D19, [21846] = 0x8E98, [21847] = 0x8F64, [21848] = 0x8F63, +- [21849] = 0x91BC, [21850] = 0x9462, [21851] = 0x9455, [21852] = 0x945D, +- [21853] = 0x9457, [21854] = 0x945E, [21855] = 0x97C4, [21856] = 0x97C5, +- [21857] = 0x9800, [21858] = 0x9A56, [21859] = 0x9A59, [21860] = 0x9B1E, +- [21861] = 0x9B1F, [21862] = 0x9B20, [21863] = 0x9C52, [21864] = 0x9C58, +- [21865] = 0x9C50, [21866] = 0x9C4A, [21867] = 0x9C4D, [21868] = 0x9C4B, +- [21869] = 0x9C55, [21870] = 0x9C59, [21871] = 0x9C4C, [21872] = 0x9C4E, +- [21873] = 0x9DFB, [21874] = 0x9DF7, [21875] = 0x9DEF, [21876] = 0x9DE3, +- [21877] = 0x9DEB, [21878] = 0x9DF8, [21879] = 0x9DE4, [21880] = 0x9DF6, +- [21881] = 0x9DE1, [21882] = 0x9DEE, [21883] = 0x9DE6, [21884] = 0x9DF2, +- [21885] = 0x9DF0, [21886] = 0x9DE2, [21887] = 0x9DEC, [21888] = 0x9DF4, +- [21889] = 0x9DF3, [21890] = 0x9DE8, [21891] = 0x9DED, [21892] = 0x9EC2, +- [21893] = 0x9ED0, [21894] = 0x9EF2, [21895] = 0x9EF3, [21896] = 0x9F06, +- [21897] = 0x9F1C, [21898] = 0x9F38, [21899] = 0x9F37, [21900] = 0x9F36, +- [21901] = 0x9F43, [21902] = 0x9F4F, [21937] = 0x9F71, [21938] = 0x9F70, +- [21939] = 0x9F6E, [21940] = 0x9F6F, [21941] = 0x56D3, [21942] = 0x56CD, +- [21943] = 0x5B4E, [21944] = 0x5C6D, [21945] = 0x652D, [21946] = 0x66ED, +- [21947] = 0x66EE, [21948] = 0x6B13, [21949] = 0x705F, [21950] = 0x7061, +- [21951] = 0x705D, [21952] = 0x7060, [21953] = 0x7223, [21954] = 0x74DB, +- [21955] = 0x74E5, [21956] = 0x77D5, [21957] = 0x7938, [21958] = 0x79B7, +- [21959] = 0x79B6, [21960] = 0x7C6A, [21961] = 0x7E97, [21962] = 0x7F89, +- [21963] = 0x826D, [21964] = 0x8643, [21965] = 0x8838, [21966] = 0x8837, +- [21967] = 0x8835, [21968] = 0x884B, [21969] = 0x8B94, [21970] = 0x8B95, +- [21971] = 0x8E9E, [21972] = 0x8E9F, [21973] = 0x8EA0, [21974] = 0x8E9D, +- [21975] = 0x91BE, [21976] = 0x91BD, [21977] = 0x91C2, [21978] = 0x946B, +- [21979] = 0x9468, [21980] = 0x9469, [21981] = 0x96E5, [21982] = 0x9746, +- [21983] = 0x9743, [21984] = 0x9747, [21985] = 0x97C7, [21986] = 0x97E5, +- [21987] = 0x9A5E, [21988] = 0x9AD5, [21989] = 0x9B59, [21990] = 0x9C63, +- [21991] = 0x9C67, [21992] = 0x9C66, [21993] = 0x9C62, [21994] = 0x9C5E, +- [21995] = 0x9C60, [21996] = 0x9E02, [21997] = 0x9DFE, [21998] = 0x9E07, +- [21999] = 0x9E03, [22000] = 0x9E06, [22001] = 0x9E05, [22002] = 0x9E00, +- [22003] = 0x9E01, [22004] = 0x9E09, [22005] = 0x9DFF, [22006] = 0x9DFD, +- [22007] = 0x9E04, [22008] = 0x9EA0, [22009] = 0x9F1E, [22010] = 0x9F46, +- [22011] = 0x9F74, [22012] = 0x9F75, [22013] = 0x9F76, [22014] = 0x56D4, +- [22015] = 0x652E, [22016] = 0x65B8, [22017] = 0x6B18, [22018] = 0x6B19, +- [22019] = 0x6B17, [22020] = 0x6B1A, [22021] = 0x7062, [22022] = 0x7226, +- [22023] = 0x72AA, [22024] = 0x77D8, [22025] = 0x77D9, [22026] = 0x7939, +- [22027] = 0x7C69, [22028] = 0x7C6B, [22029] = 0x7CF6, [22030] = 0x7E9A, +- [22035] = 0x7E98, [22036] = 0x7E9B, [22037] = 0x7E99, [22038] = 0x81E0, +- [22039] = 0x81E1, [22040] = 0x8646, [22041] = 0x8647, [22042] = 0x8648, +- [22043] = 0x8979, [22044] = 0x897A, [22045] = 0x897C, [22046] = 0x897B, +- [22047] = 0x89FF, [22048] = 0x8B98, [22049] = 0x8B99, [22050] = 0x8EA5, +- [22051] = 0x8EA4, [22052] = 0x8EA3, [22053] = 0x946E, [22054] = 0x946D, +- [22055] = 0x946F, [22056] = 0x9471, [22057] = 0x9473, [22058] = 0x9749, +- [22059] = 0x9872, [22060] = 0x995F, [22061] = 0x9C68, [22062] = 0x9C6E, +- [22063] = 0x9C6D, [22064] = 0x9E0B, [22065] = 0x9E0D, [22066] = 0x9E10, +- [22067] = 0x9E0F, [22068] = 0x9E12, [22069] = 0x9E11, [22070] = 0x9EA1, +- [22071] = 0x9EF5, [22072] = 0x9F09, [22073] = 0x9F47, [22074] = 0x9F78, +- [22075] = 0x9F7B, [22076] = 0x9F7A, [22077] = 0x9F79, [22078] = 0x571E, +- [22079] = 0x7066, [22080] = 0x7C6F, [22081] = 0x883C, [22082] = 0x8DB2, +- [22083] = 0x8EA6, [22084] = 0x91C3, [22085] = 0x9474, [22086] = 0x9478, +- [22087] = 0x9476, [22088] = 0x9475, [22089] = 0x9A60, [22090] = 0x9C74, +- [22091] = 0x9C73, [22092] = 0x9C71, [22093] = 0x9C75, [22094] = 0x9E14, +- [22095] = 0x9E13, [22096] = 0x9EF6, [22097] = 0x9F0A, [22132] = 0x9FA4, +- [22133] = 0x7068, [22134] = 0x7065, [22135] = 0x7CF7, [22136] = 0x866A, +- [22137] = 0x883E, [22138] = 0x883D, [22139] = 0x883F, [22140] = 0x8B9E, +- [22141] = 0x8C9C, [22142] = 0x8EA9, [22143] = 0x8EC9, [22144] = 0x974B, +- [22145] = 0x9873, [22146] = 0x9874, [22147] = 0x98CC, [22148] = 0x9961, +- [22149] = 0x99AB, [22150] = 0x9A64, [22151] = 0x9A66, [22152] = 0x9A67, +- [22153] = 0x9B24, [22154] = 0x9E15, [22155] = 0x9E17, [22156] = 0x9F48, +- [22157] = 0x6207, [22158] = 0x6B1E, [22159] = 0x7227, [22160] = 0x864C, +- [22161] = 0x8EA8, [22162] = 0x9482, [22163] = 0x9480, [22164] = 0x9481, +- [22165] = 0x9A69, [22166] = 0x9A68, [22167] = 0x9B2E, [22168] = 0x9E19, +- [22169] = 0x7229, [22170] = 0x864B, [22171] = 0x8B9F, [22172] = 0x9483, +- [22173] = 0x9C79, [22174] = 0x9EB7, [22175] = 0x7675, [22176] = 0x9A6B, +- [22177] = 0x9C7A, [22178] = 0x9E1D, [22179] = 0x7069, [22180] = 0x706A, +- [22181] = 0x9EA4, [22182] = 0x9F7E, [22183] = 0x9F49, [22184] = 0x9F98, +- [22185] = 0x7881, [22186] = 0x92B9, [22187] = 0x88CF, [22188] = 0x58BB, +- [22189] = 0x6052, [22190] = 0x7CA7, [22191] = 0x5AFA, [22192] = 0x2554, +- [22193] = 0x2566, [22194] = 0x2557, [22195] = 0x2560, [22196] = 0x256C, +- [22197] = 0x2563, [22198] = 0x255A, [22199] = 0x2569, [22200] = 0x255D, +- [22201] = 0x2552, [22202] = 0x2564, [22203] = 0x2555, [22204] = 0x255E, +- [22205] = 0x256A, [22206] = 0x2561, [22207] = 0x2558, [22208] = 0x2567, +- [22209] = 0x255B, [22210] = 0x2553, [22211] = 0x2565, [22212] = 0x2556, +- [22213] = 0x255F, [22214] = 0x256B, [22215] = 0x2562, [22216] = 0x2559, +- [22217] = 0x2568, [22218] = 0x255C, [22219] = 0x2551, [22220] = 0x2550, +- [22221] = 0x256D, [22222] = 0x256E, [22223] = 0x2570, [22224] = 0x256F, +- [22225] = 0xFFED, [22230] = 0x20547, [22231] = 0x92DB, [22232] = 0x205DF, +- [22233] = 0xE003, [22234] = 0x854C, [22235] = 0x42B5, [22236] = 0x73EF, +- [22237] = 0x51B5, [22238] = 0x3649, [22239] = 0x24942, [22240] = 0x289E4, +- [22241] = 0x9344, [22242] = 0x219DB, [22243] = 0x82EE, [22244] = 0x23CC8, +- [22245] = 0x783C, [22246] = 0x6744, [22247] = 0x62DF, [22248] = 0x24933, +- [22249] = 0x289AA, [22250] = 0x202A0, [22251] = 0x26BB3, [22252] = 0x21305, +- [22253] = 0x4FAB, [22254] = 0xE018, [22255] = 0x5008, [22256] = 0x26D29, +- [22257] = 0xE01B, [22258] = 0x23600, [22259] = 0x24AB1, [22260] = 0x22513, +- [22262] = 0x2037E, [22263] = 0x5FA4, [22264] = 0x20380, [22265] = 0x20347, +- [22266] = 0x6EDB, [22267] = 0x2041F, [22269] = 0x5101, [22270] = 0x347A, +- [22271] = 0x510E, [22272] = 0x986C, [22273] = 0x3743, [22274] = 0x8416, +- [22275] = 0xE02D, [22276] = 0x20487, [22277] = 0x5160, [22278] = 0x233B4, +- [22279] = 0x516A, [22280] = 0x20BFF, [22281] = 0x220FC, [22282] = 0x202E5, +- [22283] = 0x22530, [22284] = 0x2058E, [22285] = 0x23233, [22286] = 0xE038, +- [22287] = 0x5B82, [22288] = 0x877D, [22289] = 0x205B3, [22290] = 0x23C99, +- [22291] = 0x51B2, [22292] = 0x51B8, [22327] = 0x9D34, [22328] = 0x51C9, +- [22329] = 0x51CF, [22330] = 0x51D1, [22331] = 0x3CDC, [22332] = 0x51D3, +- [22333] = 0x24AA6, [22334] = 0x51B3, [22335] = 0x51E2, [22336] = 0x5342, +- [22337] = 0x51ED, [22338] = 0x83CD, [22339] = 0x693E, [22340] = 0xE04C, +- [22341] = 0x5F7B, [22342] = 0x520B, [22343] = 0x5226, [22344] = 0x523C, +- [22345] = 0x52B5, [22346] = 0x5257, [22347] = 0x5294, [22348] = 0x52B9, +- [22349] = 0x52C5, [22350] = 0x7C15, [22351] = 0x8542, [22352] = 0x52E0, +- [22353] = 0x860D, [22354] = 0xE05A, [22356] = 0x28ADE, [22357] = 0x5549, +- [22358] = 0x6ED9, [22359] = 0x23F80, [22360] = 0x20954, [22361] = 0x23FEC, +- [22362] = 0x5333, [22364] = 0x20BE2, [22365] = 0x6CCB, [22366] = 0x21726, +- [22367] = 0x681B, [22368] = 0x73D5, [22369] = 0x604A, [22370] = 0x3EAA, +- [22371] = 0x38CC, [22372] = 0x216E8, [22373] = 0x71DD, [22374] = 0x44A2, +- [22375] = 0x536D, [22376] = 0x5374, [22377] = 0x286AB, [22378] = 0x537E, +- [22380] = 0x21596, [22381] = 0x21613, [22382] = 0x77E6, [22383] = 0x5393, +- [22384] = 0x28A9B, [22385] = 0x53A0, [22386] = 0x53AB, [22387] = 0x53AE, +- [22388] = 0x73A7, [22389] = 0x25772, [22390] = 0x3F59, [22391] = 0x739C, +- [22392] = 0x53C1, [22393] = 0x53C5, [22394] = 0x6C49, [22395] = 0x4E49, +- [22396] = 0x57FE, [22397] = 0x53D9, [22398] = 0x3AAB, [22399] = 0x20B8F, +- [22400] = 0x53E0, [22401] = 0x23FEB, [22402] = 0x22DA3, [22403] = 0x53F6, +- [22404] = 0x20C77, [22405] = 0x5413, [22406] = 0x7079, [22407] = 0x552B, +- [22408] = 0x6657, [22409] = 0x6D5B, [22410] = 0x546D, [22411] = 0x26B53, +- [22412] = 0xE094, [22413] = 0x555D, [22414] = 0x548F, [22415] = 0x54A4, +- [22416] = 0x47A6, [22417] = 0xE099, [22418] = 0xE09A, [22419] = 0x3DB4, +- [22420] = 0x20D4D, [22425] = 0x289BC, [22426] = 0x22698, [22427] = 0x5547, +- [22428] = 0x4CED, [22429] = 0x542F, [22430] = 0x7417, [22431] = 0x5586, +- [22432] = 0x55A9, [22434] = 0x218D7, [22435] = 0x2403A, [22436] = 0x4552, +- [22437] = 0x24435, [22438] = 0x66B3, [22439] = 0x210B4, [22440] = 0x5637, +- [22441] = 0x66CD, [22442] = 0x2328A, [22443] = 0x66A4, [22444] = 0x66AD, +- [22445] = 0x564D, [22446] = 0x564F, [22447] = 0x78F1, [22448] = 0x56F1, +- [22449] = 0x9787, [22450] = 0x53FE, [22451] = 0x5700, [22452] = 0x56EF, +- [22453] = 0x56ED, [22454] = 0x28B66, [22455] = 0x3623, [22456] = 0x2124F, +- [22457] = 0x5746, [22458] = 0x241A5, [22459] = 0x6C6E, [22460] = 0x708B, +- [22461] = 0x5742, [22462] = 0x36B1, [22463] = 0x26C7E, [22464] = 0x57E6, +- [22465] = 0xE0C5, [22466] = 0x5803, [22467] = 0x21454, [22468] = 0x24363, +- [22469] = 0x5826, [22470] = 0x24BF5, [22471] = 0x585C, [22472] = 0x58AA, +- [22473] = 0x3561, [22474] = 0x58E0, [22475] = 0x58DC, [22476] = 0xE0D0, +- [22477] = 0x58FB, [22478] = 0x5BFF, [22479] = 0x5743, [22480] = 0x2A150, +- [22481] = 0x24278, [22482] = 0x93D3, [22483] = 0x35A1, [22484] = 0x591F, +- [22485] = 0x68A6, [22486] = 0x36C3, [22487] = 0x6E59, [22522] = 0x2163E, +- [22523] = 0x5A24, [22524] = 0x5553, [22525] = 0x21692, [22526] = 0x8505, +- [22527] = 0x59C9, [22528] = 0x20D4E, [22529] = 0x26C81, [22530] = 0x26D2A, +- [22531] = 0x217DC, [22532] = 0x59D9, [22533] = 0x217FB, [22534] = 0x217B2, +- [22535] = 0x26DA6, [22536] = 0x6D71, [22537] = 0x21828, [22538] = 0x216D5, +- [22539] = 0x59F9, [22540] = 0x26E45, [22541] = 0x5AAB, [22542] = 0x5A63, +- [22543] = 0x36E6, [22544] = 0xE0F2, [22546] = 0x3708, [22547] = 0x5A96, +- [22548] = 0x7465, [22549] = 0x5AD3, [22550] = 0x26FA1, [22551] = 0xE0F9, +- [22552] = 0x3D85, [22553] = 0x21911, [22554] = 0x3732, [22555] = 0xE0FD, +- [22556] = 0x5E83, [22557] = 0x52D0, [22558] = 0x5B76, [22559] = 0x6588, +- [22560] = 0x5B7C, [22561] = 0x27A0E, [22562] = 0x4004, [22563] = 0x485D, +- [22564] = 0xE106, [22565] = 0x5BD5, [22566] = 0x6160, [22567] = 0xE109, +- [22568] = 0xE10A, [22569] = 0x205A5, [22570] = 0x5BF3, [22571] = 0x5B9D, +- [22572] = 0x4D10, [22573] = 0x5C05, [22574] = 0x21B44, [22575] = 0x5C13, +- [22576] = 0x73CE, [22577] = 0x5C14, [22578] = 0x21CA5, [22579] = 0x26B28, +- [22580] = 0x5C49, [22581] = 0x48DD, [22582] = 0x5C85, [22583] = 0x5CE9, +- [22584] = 0x5CEF, [22585] = 0x5D8B, [22586] = 0x21DF9, [22587] = 0x21E37, +- [22588] = 0x5D10, [22589] = 0x5D18, [22590] = 0x5D46, [22591] = 0x21EA4, +- [22592] = 0x5CBA, [22593] = 0x5DD7, [22594] = 0x82FC, [22595] = 0x382D, +- [22596] = 0x24901, [22597] = 0x22049, [22598] = 0x22173, [22599] = 0x8287, +- [22600] = 0x3836, [22601] = 0x3BC2, [22602] = 0x5E2E, [22603] = 0x6A8A, +- [22605] = 0x5E7A, [22606] = 0xE130, [22607] = 0x20CD3, [22608] = 0x53A6, +- [22609] = 0x4EB7, [22611] = 0x53A8, [22612] = 0x21771, [22613] = 0x5E09, +- [22614] = 0x5EF4, [22615] = 0x28482, [22620] = 0x5EF9, [22621] = 0x5EFB, +- [22622] = 0x38A0, [22623] = 0x5EFC, [22624] = 0x683E, [22625] = 0x941B, +- [22626] = 0x5F0D, [22627] = 0x201C1, [22628] = 0x2F894, [22629] = 0x3ADE, +- [22630] = 0x48AE, [22631] = 0x2133A, [22632] = 0x5F3A, [22633] = 0x26888, +- [22634] = 0x223D0, [22636] = 0x22471, [22637] = 0x5F63, [22638] = 0x97BD, +- [22639] = 0x26E6E, [22640] = 0x5F72, [22641] = 0x9340, [22642] = 0xE150, +- [22643] = 0x5FA7, [22644] = 0x5DB6, [22645] = 0x3D5F, [22646] = 0xE154, +- [22647] = 0x21F6A, [22648] = 0x270F8, [22649] = 0x22668, [22650] = 0x91D6, +- [22651] = 0x2029E, [22652] = 0x28A29, [22653] = 0x6031, [22654] = 0x6685, +- [22655] = 0xE15D, [22656] = 0x3963, [22657] = 0x3DC7, [22658] = 0x3639, +- [22659] = 0x5790, [22660] = 0x227B4, [22661] = 0x7971, [22662] = 0x3E40, +- [22663] = 0x609E, [22665] = 0x60B3, [22666] = 0xE168, [22667] = 0x2498F, +- [22668] = 0xE16A, [22669] = 0x74A4, [22670] = 0x50E1, [22671] = 0x5AA0, +- [22672] = 0x6164, [22673] = 0x8424, [22674] = 0x6142, [22675] = 0xE171, +- [22676] = 0x26ED2, [22677] = 0x6181, [22678] = 0x51F4, [22679] = 0xE175, +- [22680] = 0x6187, [22681] = 0x5BAA, [22682] = 0x23FB7, [22717] = 0x2285F, +- [22718] = 0x61D3, [22719] = 0x28B9D, [22720] = 0x2995D, [22721] = 0x61D0, +- [22722] = 0x3932, [22723] = 0x22980, [22724] = 0x228C1, [22725] = 0x6023, +- [22726] = 0x615C, [22727] = 0x651E, [22728] = 0x638B, [22729] = 0x20118, +- [22730] = 0x62C5, [22731] = 0x21770, [22732] = 0x62D5, [22733] = 0x22E0D, +- [22734] = 0x636C, [22735] = 0x249DF, [22736] = 0x3A17, [22737] = 0x6438, +- [22738] = 0x63F8, [22739] = 0xE18F, [22740] = 0x217FC, [22742] = 0x6F8A, +- [22743] = 0x22E36, [22744] = 0x9814, [22745] = 0x2408C, [22746] = 0x2571D, +- [22747] = 0x64E1, [22748] = 0x64E5, [22749] = 0x947B, [22750] = 0x3A66, +- [22751] = 0x643A, [22752] = 0x3A57, [22753] = 0x654D, [22754] = 0x6F16, +- [22755] = 0x24A28, [22756] = 0x24A23, [22757] = 0x6585, [22758] = 0x656D, +- [22759] = 0x655F, [22760] = 0x2307E, [22761] = 0x65B5, [22762] = 0x24940, +- [22763] = 0x4B37, [22764] = 0x65D1, [22765] = 0x40D8, [22766] = 0x21829, +- [22767] = 0x65E0, [22768] = 0x65E3, [22769] = 0x5FDF, [22770] = 0x23400, +- [22771] = 0x6618, [22772] = 0x231F7, [22773] = 0x231F8, [22774] = 0x6644, +- [22775] = 0x231A4, [22776] = 0x231A5, [22777] = 0x664B, [22778] = 0x20E75, +- [22779] = 0x6667, [22780] = 0x251E6, [22781] = 0x6673, [22783] = 0xE1BB, +- [22784] = 0x23231, [22785] = 0x285F4, [22786] = 0x231C8, [22787] = 0x25313, +- [22788] = 0x77C5, [22789] = 0x228F7, [22790] = 0x99A4, [22791] = 0x6702, +- [22792] = 0x2439C, [22793] = 0x24A21, [22794] = 0x3B2B, [22795] = 0x69FA, +- [22796] = 0x237C2, [22798] = 0x6767, [22799] = 0x6762, [22800] = 0xE1CC, +- [22801] = 0xE1CD, [22802] = 0x67D7, [22803] = 0x44E9, [22804] = 0x6822, +- [22805] = 0x6E50, [22806] = 0x923C, [22807] = 0x6801, [22808] = 0x233E6, +- [22809] = 0x26DA0, [22810] = 0x685D, [22815] = 0xE1D7, [22816] = 0x69E1, +- [22817] = 0x6A0B, [22818] = 0x28ADF, [22819] = 0x6973, [22820] = 0x68C3, +- [22821] = 0x235CD, [22822] = 0x6901, [22823] = 0x6900, [22824] = 0x3D32, +- [22825] = 0x3A01, [22826] = 0x2363C, [22827] = 0x3B80, [22828] = 0x67AC, +- [22829] = 0x6961, [22830] = 0x28A4A, [22831] = 0x42FC, [22832] = 0x6936, +- [22833] = 0x6998, [22834] = 0x3BA1, [22835] = 0x203C9, [22836] = 0x8363, +- [22837] = 0x5090, [22838] = 0x69F9, [22839] = 0xE1EF, [22840] = 0x2212A, +- [22841] = 0x6A45, [22842] = 0xE1F2, [22843] = 0x6A9D, [22844] = 0x3BF3, +- [22845] = 0x67B1, [22846] = 0x6AC8, [22847] = 0x2919C, [22848] = 0x3C0D, +- [22849] = 0x6B1D, [22850] = 0xE1FA, [22851] = 0x60DE, [22852] = 0x6B35, +- [22853] = 0x6B74, [22854] = 0xE1FE, [22855] = 0x6EB5, [22856] = 0x23ADB, +- [22857] = 0x203B5, [22858] = 0xE202, [22859] = 0x3740, [22860] = 0x5421, +- [22861] = 0x23B5A, [22862] = 0x6BE1, [22863] = 0x23EFC, [22864] = 0x6BDC, +- [22865] = 0x6C37, [22866] = 0x2248B, [22867] = 0xE20B, [22868] = 0x26B51, +- [22869] = 0x6C5A, [22870] = 0x8226, [22871] = 0x6C79, [22872] = 0x23DBC, +- [22873] = 0x44C5, [22874] = 0x23DBD, [22875] = 0x241A4, [22876] = 0x2490C, +- [22877] = 0x24900, [22912] = 0x23CC9, [22913] = 0x36E5, [22914] = 0x3CEB, +- [22915] = 0xE219, [22916] = 0x9B83, [22917] = 0x231F9, [22918] = 0xE21C, +- [22919] = 0x7F8F, [22920] = 0x6837, [22921] = 0x26D25, [22922] = 0x26DA1, +- [22923] = 0x26DEB, [22924] = 0x6D96, [22925] = 0x6D5C, [22926] = 0x6E7C, +- [22927] = 0x6F04, [22928] = 0x2497F, [22929] = 0xE227, [22930] = 0x26E72, +- [22931] = 0x8533, [22932] = 0x26F74, [22933] = 0x51C7, [22936] = 0x842E, +- [22937] = 0x28B21, [22939] = 0x23E2F, [22940] = 0x7453, [22941] = 0x23F82, +- [22942] = 0x79CC, [22943] = 0x6E4F, [22944] = 0x5A91, [22945] = 0x2304B, +- [22946] = 0x6FF8, [22947] = 0x370D, [22948] = 0x6F9D, [22949] = 0x23E30, +- [22950] = 0x6EFA, [22951] = 0x21497, [22952] = 0x2403D, [22953] = 0x4555, +- [22954] = 0x93F0, [22955] = 0x6F44, [22956] = 0x6F5C, [22957] = 0x3D4E, +- [22958] = 0x6F74, [22959] = 0xE245, [22960] = 0x3D3B, [22961] = 0x6F9F, +- [22962] = 0x24144, [22963] = 0x6FD3, [22964] = 0xE24A, [22965] = 0x24155, +- [22966] = 0x24039, [22967] = 0x25D20, [22968] = 0xE24E, [22969] = 0x2413F, +- [22970] = 0x51DF, [22971] = 0x24156, [22972] = 0x24157, [22973] = 0x24140, +- [22974] = 0x261DD, [22975] = 0x704B, [22976] = 0x707E, [22977] = 0x70A7, +- [22978] = 0x7081, [22979] = 0x70CC, [22980] = 0x70D5, [22981] = 0x70D6, +- [22982] = 0x70DF, [22983] = 0x4104, [22984] = 0x3DE8, [22985] = 0x71B4, +- [22986] = 0x7196, [22987] = 0x24277, [22988] = 0x712B, [22989] = 0x7145, +- [22990] = 0x5A88, [22991] = 0x714A, [22993] = 0x5C9C, [22994] = 0x24365, +- [22995] = 0x714F, [22996] = 0x9362, [22997] = 0xE26B, [22998] = 0x712C, +- [22999] = 0x2445A, [23000] = 0x24A27, [23001] = 0x24A22, [23002] = 0x71BA, +- [23003] = 0x28BE8, [23004] = 0x70BD, [23005] = 0x720E, [23010] = 0x9442, +- [23011] = 0x7215, [23012] = 0x5911, [23013] = 0x9443, [23014] = 0x7224, +- [23015] = 0x9341, [23016] = 0xE27A, [23017] = 0x722E, [23018] = 0x7240, +- [23019] = 0x24974, [23020] = 0x68BD, [23021] = 0x7255, [23022] = 0x7257, +- [23023] = 0x3E55, [23024] = 0xE282, [23025] = 0x680D, [23026] = 0x6F3D, +- [23027] = 0x7282, [23029] = 0x732B, [23030] = 0x24823, [23031] = 0x2882B, +- [23032] = 0x48ED, [23033] = 0x28804, [23034] = 0x7328, [23035] = 0x732E, +- [23036] = 0x73CF, [23037] = 0x73AA, [23038] = 0xE290, [23039] = 0x26A2E, +- [23040] = 0x73C9, [23041] = 0x7449, [23042] = 0x241E2, [23043] = 0x216E7, +- [23044] = 0x24A24, [23045] = 0x6623, [23046] = 0x36C5, [23047] = 0x249B7, +- [23048] = 0x2498D, [23049] = 0xE29B, [23050] = 0x73F7, [23051] = 0x7415, +- [23052] = 0x6903, [23053] = 0x24A26, [23054] = 0x7439, [23055] = 0xE2A1, +- [23056] = 0x3ED7, [23058] = 0x228AD, [23059] = 0x7460, [23060] = 0x28EB2, +- [23061] = 0x7447, [23062] = 0x73E4, [23063] = 0x7476, [23064] = 0x83B9, +- [23065] = 0x746C, [23066] = 0x3730, [23067] = 0x7474, [23068] = 0x93F1, +- [23069] = 0x6A2C, [23070] = 0x7482, [23071] = 0x4953, [23072] = 0xE2B2, +- [23107] = 0x2415F, [23108] = 0x24A79, [23109] = 0x28B8F, [23110] = 0x5B46, +- [23111] = 0xE2B7, [23112] = 0x2189E, [23113] = 0x74C8, [23114] = 0x21988, +- [23115] = 0x750E, [23117] = 0x751E, [23118] = 0x28ED9, [23119] = 0x21A4B, +- [23120] = 0x5BD7, [23121] = 0xE2C1, [23122] = 0x9385, [23123] = 0x754D, +- [23124] = 0x754A, [23125] = 0x7567, [23126] = 0x756E, [23127] = 0x24F82, +- [23128] = 0x3F04, [23129] = 0xE2C9, [23130] = 0x758E, [23131] = 0x745D, +- [23132] = 0x759E, [23133] = 0x75B4, [23134] = 0x7602, [23135] = 0x762C, +- [23136] = 0x7651, [23137] = 0x764F, [23138] = 0x766F, [23139] = 0x7676, +- [23140] = 0xE2D4, [23141] = 0x7690, [23142] = 0x81EF, [23143] = 0x37F8, +- [23144] = 0x26911, [23145] = 0x2690E, [23146] = 0x76A1, [23147] = 0x76A5, +- [23148] = 0x76B7, [23149] = 0x76CC, [23150] = 0x26F9F, [23151] = 0x8462, +- [23152] = 0x2509D, [23153] = 0x2517D, [23154] = 0xE2E2, [23155] = 0x771E, +- [23156] = 0x7726, [23157] = 0x7740, [23158] = 0x64AF, [23159] = 0x25220, +- [23160] = 0x7758, [23161] = 0x232AC, [23162] = 0x77AF, [23163] = 0xE2EB, +- [23164] = 0xE2EC, [23165] = 0x216C1, [23166] = 0x77F4, [23168] = 0xE2F0, +- [23169] = 0xE2F1, [23170] = 0x68CA, [23171] = 0x78AF, [23172] = 0x78C7, +- [23173] = 0x78D3, [23174] = 0x96A5, [23175] = 0x792E, [23176] = 0x255E0, +- [23177] = 0x78D7, [23178] = 0x7934, [23179] = 0x78B1, [23180] = 0x2760C, +- [23181] = 0x8FB8, [23182] = 0x8884, [23183] = 0x28B2B, [23184] = 0xE300, +- [23185] = 0x2261C, [23186] = 0x7986, [23187] = 0x8900, [23188] = 0x6902, +- [23189] = 0x7980, [23190] = 0x25857, [23191] = 0x799D, [23192] = 0x27B39, +- [23193] = 0x793C, [23194] = 0x79A9, [23195] = 0x6E2A, [23196] = 0x27126, +- [23197] = 0x3EA8, [23198] = 0x79C6, [23199] = 0x2910D, [23200] = 0x79D4 ++ [ 0] = 0x43F0, [ 1] = 0x4C32, [ 2] = 0x4603, [ 3] = 0x45A6, ++ [ 4] = 0x4578, [ 5] = 0x27267, [ 6] = 0x4D77, [ 7] = 0x45B3, ++ [ 8] = 0x27CB1, [ 9] = 0x4CE2, [ 10] = 0x27CC5, [ 11] = 0x3B95, ++ [ 12] = 0x4736, [ 13] = 0x4744, [ 14] = 0x4C47, [ 15] = 0x4C40, ++ [ 16] = 0x242BF, [ 17] = 0x23617, [ 18] = 0x27352, [ 19] = 0x26E8B, ++ [ 20] = 0x270D2, [ 21] = 0x4C57, [ 22] = 0x2A351, [ 23] = 0x474F, ++ [ 24] = 0x45DA, [ 25] = 0x4C85, [ 26] = 0x27C6C, [ 27] = 0x4D07, ++ [ 28] = 0x4AA4, [ 29] = 0x46A1, [ 30] = 0x26B23, [ 31] = 0x7225, ++ [ 32] = 0x25A54, [ 33] = 0x21A63, [ 34] = 0x23E06, [ 35] = 0x23F61, ++ [ 36] = 0x664D, [ 37] = 0x56FB, [ 39] = 0x7D95, [ 40] = 0x591D, ++ [ 41] = 0x28BB9, [ 42] = 0x3DF4, [ 43] = 0x9734, [ 44] = 0x27BEF, ++ [ 45] = 0x5BDB, [ 46] = 0x21D5E, [ 47] = 0x5AA4, [ 48] = 0x3625, ++ [ 49] = 0x29EB0, [ 50] = 0x5AD1, [ 51] = 0x5BB7, [ 52] = 0x5CFC, ++ [ 53] = 0x676E, [ 54] = 0x8593, [ 55] = 0x29945, [ 56] = 0x7461, ++ [ 57] = 0x749D, [ 58] = 0x3875, [ 59] = 0x21D53, [ 60] = 0x2369E, ++ [ 61] = 0x26021, [ 62] = 0x3EEC, [ 97] = 0x258DE, [ 98] = 0x3AF5, ++ [ 99] = 0x7AFC, [ 100] = 0x9F97, [ 101] = 0x24161, [ 102] = 0x2890D, ++ [ 103] = 0x231EA, [ 104] = 0x20A8A, [ 105] = 0x2325E, [ 106] = 0x430A, ++ [ 107] = 0x8484, [ 108] = 0x9F96, [ 109] = 0x942F, [ 110] = 0x4930, ++ [ 111] = 0x8613, [ 112] = 0x5896, [ 113] = 0x974A, [ 114] = 0x9218, ++ [ 115] = 0x79D0, [ 116] = 0x7A32, [ 117] = 0x6660, [ 118] = 0x6A29, ++ [ 119] = 0x889D, [ 120] = 0x744C, [ 121] = 0x7BC5, [ 122] = 0x6782, ++ [ 123] = 0x7A2C, [ 124] = 0x524F, [ 125] = 0x9046, [ 126] = 0x34E6, ++ [ 127] = 0x73C4, [ 128] = 0x25DB9, [ 129] = 0x74C6, [ 130] = 0x9FC7, ++ [ 131] = 0x57B3, [ 132] = 0x492F, [ 133] = 0x544C, [ 134] = 0x4131, ++ [ 135] = 0x2368E, [ 136] = 0x5818, [ 137] = 0x7A72, [ 138] = 0x27B65, ++ [ 139] = 0x8B8F, [ 140] = 0x46AE, [ 141] = 0x26E88, [ 142] = 0x4181, ++ [ 143] = 0x25D99, [ 144] = 0x7BAE, [ 145] = 0x224BC, [ 146] = 0x9FC8, ++ [ 147] = 0x224C1, [ 148] = 0x224C9, [ 149] = 0x224CC, [ 150] = 0x9FC9, ++ [ 151] = 0x8504, [ 152] = 0x235BB, [ 153] = 0x40B4, [ 154] = 0x9FCA, ++ [ 155] = 0x44E1, [ 156] = 0x2ADFF, [ 157] = 0x62C1, [ 158] = 0x706E, ++ [ 159] = 0x9FCB, [ 195] = 0x31C0, [ 196] = 0x31C1, [ 197] = 0x31C2, ++ [ 198] = 0x31C3, [ 199] = 0x31C4, [ 200] = 0x2010C, [ 201] = 0x31C5, ++ [ 202] = 0x200D1, [ 203] = 0x200CD, [ 204] = 0x31C6, [ 205] = 0x31C7, ++ [ 206] = 0x200CB, [ 207] = 0x21FE8, [ 208] = 0x31C8, [ 209] = 0x200CA, ++ [ 210] = 0x31C9, [ 211] = 0x31CA, [ 212] = 0x31CB, [ 213] = 0x31CC, ++ [ 214] = 0x2010E, [ 215] = 0x31CD, [ 216] = 0x31CE, [ 217] = 0x0100, ++ [ 218] = 0x00C1, [ 219] = 0x01CD, [ 220] = 0x00C0, [ 221] = 0x0112, ++ [ 222] = 0x00C9, [ 223] = 0x011A, [ 224] = 0x00C8, [ 225] = 0x014C, ++ [ 226] = 0x00D3, [ 227] = 0x01D1, [ 228] = 0x00D2, [ 230] = 0x1EBE, ++ [ 232] = 0x1EC0, [ 233] = 0x00CA, [ 234] = 0x0101, [ 235] = 0x00E1, ++ [ 236] = 0x01CE, [ 237] = 0x00E0, [ 238] = 0x0251, [ 239] = 0x0113, ++ [ 240] = 0x00E9, [ 241] = 0x011B, [ 242] = 0x00E8, [ 243] = 0x012B, ++ [ 244] = 0x00ED, [ 245] = 0x01D0, [ 246] = 0x00EC, [ 247] = 0x014D, ++ [ 248] = 0x00F3, [ 249] = 0x01D2, [ 250] = 0x00F2, [ 251] = 0x016B, ++ [ 252] = 0x00FA, [ 253] = 0x01D4, [ 254] = 0x00F9, [ 255] = 0x01D6, ++ [ 256] = 0x01D8, [ 257] = 0x01DA, [ 292] = 0x01DC, [ 293] = 0x00FC, ++ [ 295] = 0x1EBF, [ 297] = 0x1EC1, [ 298] = 0x00EA, [ 299] = 0x0261, ++ [ 300] = 0x23DA, [ 301] = 0x23DB, [ 390] = 0x2A3A9, [ 391] = 0x21145, ++ [ 393] = 0x650A, [ 396] = 0x4E3D, [ 397] = 0x6EDD, [ 398] = 0x9D4E, ++ [ 399] = 0x91DF, [ 402] = 0x27735, [ 403] = 0x6491, [ 404] = 0x4F1A, ++ [ 405] = 0x4F28, [ 406] = 0x4FA8, [ 407] = 0x5156, [ 408] = 0x5174, ++ [ 409] = 0x519C, [ 410] = 0x51E4, [ 411] = 0x52A1, [ 412] = 0x52A8, ++ [ 413] = 0x533B, [ 414] = 0x534E, [ 415] = 0x53D1, [ 416] = 0x53D8, ++ [ 417] = 0x56E2, [ 418] = 0x58F0, [ 419] = 0x5904, [ 420] = 0x5907, ++ [ 421] = 0x5932, [ 422] = 0x5934, [ 423] = 0x5B66, [ 424] = 0x5B9E, ++ [ 425] = 0x5B9F, [ 426] = 0x5C9A, [ 427] = 0x5E86, [ 428] = 0x603B, ++ [ 429] = 0x6589, [ 430] = 0x67FE, [ 431] = 0x6804, [ 432] = 0x6865, ++ [ 433] = 0x6D4E, [ 434] = 0x70BC, [ 435] = 0x7535, [ 436] = 0x7EA4, ++ [ 437] = 0x7EAC, [ 438] = 0x7EBA, [ 439] = 0x7EC7, [ 440] = 0x7ECF, ++ [ 441] = 0x7EDF, [ 442] = 0x7F06, [ 443] = 0x7F37, [ 444] = 0x827A, ++ [ 445] = 0x82CF, [ 446] = 0x836F, [ 447] = 0x89C6, [ 448] = 0x8BBE, ++ [ 449] = 0x8BE2, [ 450] = 0x8F66, [ 451] = 0x8F67, [ 452] = 0x8F6E, ++ [ 487] = 0x7411, [ 488] = 0x7CFC, [ 489] = 0x7DCD, [ 490] = 0x6946, ++ [ 491] = 0x7AC9, [ 492] = 0x5227, [ 497] = 0x918C, [ 498] = 0x78B8, ++ [ 499] = 0x915E, [ 500] = 0x80BC, [ 502] = 0x8D0B, [ 503] = 0x80F6, ++ [ 504] = 0x209E7, [ 507] = 0x809F, [ 508] = 0x9EC7, [ 509] = 0x4CCD, ++ [ 510] = 0x9DC9, [ 511] = 0x9E0C, [ 512] = 0x4C3E, [ 513] = 0x29DF6, ++ [ 514] = 0x2700E, [ 515] = 0x9E0A, [ 516] = 0x2A133, [ 517] = 0x35C1, ++ [ 519] = 0x6E9A, [ 520] = 0x823E, [ 521] = 0x7519, [ 523] = 0x4911, ++ [ 524] = 0x9A6C, [ 525] = 0x9A8F, [ 526] = 0x9F99, [ 527] = 0x7987, ++ [ 528] = 0x2846C, [ 529] = 0x21DCA, [ 530] = 0x205D0, [ 531] = 0x22AE6, ++ [ 532] = 0x4E24, [ 533] = 0x4E81, [ 534] = 0x4E80, [ 535] = 0x4E87, ++ [ 536] = 0x4EBF, [ 537] = 0x4EEB, [ 538] = 0x4F37, [ 539] = 0x344C, ++ [ 540] = 0x4FBD, [ 541] = 0x3E48, [ 542] = 0x5003, [ 543] = 0x5088, ++ [ 544] = 0x347D, [ 545] = 0x3493, [ 546] = 0x34A5, [ 547] = 0x5186, ++ [ 548] = 0x5905, [ 549] = 0x51DB, [ 550] = 0x51FC, [ 551] = 0x5205, ++ [ 552] = 0x4E89, [ 553] = 0x5279, [ 554] = 0x5290, [ 555] = 0x5327, ++ [ 556] = 0x35C7, [ 557] = 0x53A9, [ 558] = 0x3551, [ 559] = 0x53B0, ++ [ 560] = 0x3553, [ 561] = 0x53C2, [ 562] = 0x5423, [ 563] = 0x356D, ++ [ 564] = 0x3572, [ 565] = 0x3681, [ 566] = 0x5493, [ 567] = 0x54A3, ++ [ 568] = 0x54B4, [ 569] = 0x54B9, [ 570] = 0x54D0, [ 571] = 0x54EF, ++ [ 572] = 0x5518, [ 573] = 0x5523, [ 574] = 0x5528, [ 575] = 0x3598, ++ [ 576] = 0x553F, [ 577] = 0x35A5, [ 578] = 0x35BF, [ 579] = 0x55D7, ++ [ 580] = 0x35C5, [ 585] = 0x27D84, [ 586] = 0x5525, [ 588] = 0x20C42, ++ [ 589] = 0x20D15, [ 590] = 0x2512B, [ 591] = 0x5590, [ 592] = 0x22CC6, ++ [ 593] = 0x39EC, [ 594] = 0x20341, [ 595] = 0x8E46, [ 596] = 0x24DB8, ++ [ 597] = 0x294E5, [ 598] = 0x4053, [ 599] = 0x280BE, [ 600] = 0x777A, ++ [ 601] = 0x22C38, [ 602] = 0x3A34, [ 603] = 0x47D5, [ 604] = 0x2815D, ++ [ 605] = 0x269F2, [ 606] = 0x24DEA, [ 607] = 0x64DD, [ 608] = 0x20D7C, ++ [ 609] = 0x20FB4, [ 610] = 0x20CD5, [ 611] = 0x210F4, [ 612] = 0x648D, ++ [ 613] = 0x8E7E, [ 614] = 0x20E96, [ 615] = 0x20C0B, [ 616] = 0x20F64, ++ [ 617] = 0x22CA9, [ 618] = 0x28256, [ 619] = 0x244D3, [ 621] = 0x20D46, ++ [ 622] = 0x29A4D, [ 623] = 0x280E9, [ 624] = 0x47F4, [ 625] = 0x24EA7, ++ [ 626] = 0x22CC2, [ 627] = 0x9AB2, [ 628] = 0x3A67, [ 629] = 0x295F4, ++ [ 630] = 0x3FED, [ 631] = 0x3506, [ 632] = 0x252C7, [ 633] = 0x297D4, ++ [ 634] = 0x278C8, [ 635] = 0x22D44, [ 636] = 0x9D6E, [ 637] = 0x9815, ++ [ 639] = 0x43D9, [ 640] = 0x260A5, [ 641] = 0x64B4, [ 642] = 0x54E3, ++ [ 643] = 0x22D4C, [ 644] = 0x22BCA, [ 645] = 0x21077, [ 646] = 0x39FB, ++ [ 647] = 0x2106F, [ 682] = 0x266DA, [ 683] = 0x26716, [ 684] = 0x279A0, ++ [ 685] = 0x64EA, [ 686] = 0x25052, [ 687] = 0x20C43, [ 688] = 0x8E68, ++ [ 689] = 0x221A1, [ 690] = 0x28B4C, [ 691] = 0x20731, [ 693] = 0x480B, ++ [ 694] = 0x201A9, [ 695] = 0x3FFA, [ 696] = 0x5873, [ 697] = 0x22D8D, ++ [ 699] = 0x245C8, [ 700] = 0x204FC, [ 701] = 0x26097, [ 702] = 0x20F4C, ++ [ 703] = 0x20D96, [ 704] = 0x5579, [ 705] = 0x40BB, [ 706] = 0x43BA, ++ [ 708] = 0x4AB4, [ 709] = 0x22A66, [ 710] = 0x2109D, [ 711] = 0x81AA, ++ [ 712] = 0x98F5, [ 713] = 0x20D9C, [ 714] = 0x6379, [ 715] = 0x39FE, ++ [ 716] = 0x22775, [ 717] = 0x8DC0, [ 718] = 0x56A1, [ 719] = 0x647C, ++ [ 720] = 0x3E43, [ 722] = 0x2A601, [ 723] = 0x20E09, [ 724] = 0x22ACF, ++ [ 725] = 0x22CC9, [ 727] = 0x210C8, [ 728] = 0x239C2, [ 729] = 0x3992, ++ [ 730] = 0x3A06, [ 731] = 0x2829B, [ 732] = 0x3578, [ 733] = 0x25E49, ++ [ 734] = 0x220C7, [ 735] = 0x5652, [ 736] = 0x20F31, [ 737] = 0x22CB2, ++ [ 738] = 0x29720, [ 739] = 0x34BC, [ 740] = 0x6C3D, [ 741] = 0x24E3B, ++ [ 744] = 0x27574, [ 745] = 0x22E8B, [ 746] = 0x22208, [ 747] = 0x2A65B, ++ [ 748] = 0x28CCD, [ 749] = 0x20E7A, [ 750] = 0x20C34, [ 751] = 0x2681C, ++ [ 752] = 0x7F93, [ 753] = 0x210CF, [ 754] = 0x22803, [ 755] = 0x22939, ++ [ 756] = 0x35FB, [ 757] = 0x251E3, [ 758] = 0x20E8C, [ 759] = 0x20F8D, ++ [ 760] = 0x20EAA, [ 761] = 0x3F93, [ 762] = 0x20F30, [ 763] = 0x20D47, ++ [ 764] = 0x2114F, [ 765] = 0x20E4C, [ 767] = 0x20EAB, [ 768] = 0x20BA9, ++ [ 769] = 0x20D48, [ 770] = 0x210C0, [ 771] = 0x2113D, [ 772] = 0x3FF9, ++ [ 773] = 0x22696, [ 774] = 0x6432, [ 775] = 0x20FAD, [ 780] = 0x233F4, ++ [ 781] = 0x27639, [ 782] = 0x22BCE, [ 783] = 0x20D7E, [ 784] = 0x20D7F, ++ [ 785] = 0x22C51, [ 786] = 0x22C55, [ 787] = 0x3A18, [ 788] = 0x20E98, ++ [ 789] = 0x210C7, [ 790] = 0x20F2E, [ 791] = 0x2A632, [ 792] = 0x26B50, ++ [ 793] = 0x28CD2, [ 794] = 0x28D99, [ 795] = 0x28CCA, [ 796] = 0x95AA, ++ [ 797] = 0x54CC, [ 798] = 0x82C4, [ 799] = 0x55B9, [ 801] = 0x29EC3, ++ [ 802] = 0x9C26, [ 803] = 0x9AB6, [ 804] = 0x2775E, [ 805] = 0x22DEE, ++ [ 806] = 0x7140, [ 807] = 0x816D, [ 808] = 0x80EC, [ 809] = 0x5C1C, ++ [ 810] = 0x26572, [ 811] = 0x8134, [ 812] = 0x3797, [ 813] = 0x535F, ++ [ 814] = 0x280BD, [ 815] = 0x91B6, [ 816] = 0x20EFA, [ 817] = 0x20E0F, ++ [ 818] = 0x20E77, [ 819] = 0x20EFB, [ 820] = 0x35DD, [ 821] = 0x24DEB, ++ [ 822] = 0x3609, [ 823] = 0x20CD6, [ 824] = 0x56AF, [ 825] = 0x227B5, ++ [ 826] = 0x210C9, [ 827] = 0x20E10, [ 828] = 0x20E78, [ 829] = 0x21078, ++ [ 830] = 0x21148, [ 831] = 0x28207, [ 832] = 0x21455, [ 833] = 0x20E79, ++ [ 834] = 0x24E50, [ 835] = 0x22DA4, [ 836] = 0x5A54, [ 837] = 0x2101D, ++ [ 838] = 0x2101E, [ 839] = 0x210F5, [ 840] = 0x210F6, [ 841] = 0x579C, ++ [ 842] = 0x20E11, [ 877] = 0x27694, [ 878] = 0x282CD, [ 879] = 0x20FB5, ++ [ 880] = 0x20E7B, [ 881] = 0x2517E, [ 882] = 0x3703, [ 883] = 0x20FB6, ++ [ 884] = 0x21180, [ 885] = 0x252D8, [ 886] = 0x2A2BD, [ 887] = 0x249DA, ++ [ 888] = 0x2183A, [ 889] = 0x24177, [ 890] = 0x2827C, [ 891] = 0x5899, ++ [ 892] = 0x5268, [ 893] = 0x361A, [ 894] = 0x2573D, [ 895] = 0x7BB2, ++ [ 896] = 0x5B68, [ 897] = 0x4800, [ 898] = 0x4B2C, [ 899] = 0x9F27, ++ [ 900] = 0x49E7, [ 901] = 0x9C1F, [ 902] = 0x9B8D, [ 903] = 0x25B74, ++ [ 904] = 0x2313D, [ 905] = 0x55FB, [ 906] = 0x35F2, [ 907] = 0x5689, ++ [ 908] = 0x4E28, [ 909] = 0x5902, [ 910] = 0x21BC1, [ 911] = 0x2F878, ++ [ 912] = 0x9751, [ 913] = 0x20086, [ 914] = 0x4E5B, [ 915] = 0x4EBB, ++ [ 916] = 0x353E, [ 917] = 0x5C23, [ 918] = 0x5F51, [ 919] = 0x5FC4, ++ [ 920] = 0x38FA, [ 921] = 0x624C, [ 922] = 0x6535, [ 923] = 0x6B7A, ++ [ 924] = 0x6C35, [ 925] = 0x6C3A, [ 926] = 0x706C, [ 927] = 0x722B, ++ [ 928] = 0x4E2C, [ 929] = 0x72AD, [ 930] = 0x248E9, [ 931] = 0x7F52, ++ [ 932] = 0x793B, [ 933] = 0x7CF9, [ 934] = 0x7F53, [ 935] = 0x2626A, ++ [ 936] = 0x34C1, [ 938] = 0x2634B, [ 939] = 0x8002, [ 940] = 0x8080, ++ [ 941] = 0x26612, [ 942] = 0x26951, [ 943] = 0x535D, [ 944] = 0x8864, ++ [ 945] = 0x89C1, [ 946] = 0x278B2, [ 947] = 0x8BA0, [ 948] = 0x8D1D, ++ [ 949] = 0x9485, [ 950] = 0x9578, [ 951] = 0x957F, [ 952] = 0x95E8, ++ [ 953] = 0x28E0F, [ 954] = 0x97E6, [ 955] = 0x9875, [ 956] = 0x98CE, ++ [ 957] = 0x98DE, [ 958] = 0x9963, [ 959] = 0x29810, [ 960] = 0x9C7C, ++ [ 961] = 0x9E1F, [ 962] = 0x9EC4, [ 963] = 0x6B6F, [ 964] = 0xF907, ++ [ 965] = 0x4E37, [ 966] = 0x20087, [ 967] = 0x961D, [ 968] = 0x6237, ++ [ 969] = 0x94A2, [ 975] = 0x503B, [ 976] = 0x6DFE, [ 977] = 0x29C73, ++ [ 978] = 0x9FA6, [ 979] = 0x3DC9, [ 980] = 0x888F, [ 981] = 0x2414E, ++ [ 982] = 0x7077, [ 983] = 0x5CF5, [ 984] = 0x4B20, [ 985] = 0x251CD, ++ [ 986] = 0x3559, [ 987] = 0x25D30, [ 988] = 0x6122, [ 989] = 0x28A32, ++ [ 990] = 0x8FA7, [ 991] = 0x91F6, [ 992] = 0x7191, [ 993] = 0x6719, ++ [ 994] = 0x73BA, [ 995] = 0x23281, [ 996] = 0x2A107, [ 997] = 0x3C8B, ++ [ 998] = 0x21980, [ 999] = 0x4B10, [ 1000] = 0x78E4, [ 1001] = 0x7402, ++ [ 1002] = 0x51AE, [ 1003] = 0x2870F, [ 1004] = 0x4009, [ 1005] = 0x6A63, ++ [ 1006] = 0x2A2BA, [ 1007] = 0x4223, [ 1008] = 0x860F, [ 1009] = 0x20A6F, ++ [ 1010] = 0x7A2A, [ 1011] = 0x29947, [ 1012] = 0x28AEA, [ 1013] = 0x9755, ++ [ 1014] = 0x704D, [ 1015] = 0x5324, [ 1016] = 0x2207E, [ 1017] = 0x93F4, ++ [ 1018] = 0x76D9, [ 1019] = 0x289E3, [ 1020] = 0x9FA7, [ 1021] = 0x77DD, ++ [ 1022] = 0x4EA3, [ 1023] = 0x4FF0, [ 1024] = 0x50BC, [ 1025] = 0x4E2F, ++ [ 1026] = 0x4F17, [ 1027] = 0x9FA8, [ 1028] = 0x5434, [ 1029] = 0x7D8B, ++ [ 1030] = 0x5892, [ 1031] = 0x58D0, [ 1032] = 0x21DB6, [ 1033] = 0x5E92, ++ [ 1034] = 0x5E99, [ 1035] = 0x5FC2, [ 1036] = 0x22712, [ 1037] = 0x658B, ++ [ 1072] = 0x233F9, [ 1073] = 0x6919, [ 1074] = 0x6A43, [ 1075] = 0x23C63, ++ [ 1076] = 0x6CFF, [ 1078] = 0x7200, [ 1079] = 0x24505, [ 1080] = 0x738C, ++ [ 1081] = 0x3EDB, [ 1082] = 0x24A13, [ 1083] = 0x5B15, [ 1084] = 0x74B9, ++ [ 1085] = 0x8B83, [ 1086] = 0x25CA4, [ 1087] = 0x25695, [ 1088] = 0x7A93, ++ [ 1089] = 0x7BEC, [ 1090] = 0x7CC3, [ 1091] = 0x7E6C, [ 1092] = 0x82F8, ++ [ 1093] = 0x8597, [ 1094] = 0x9FA9, [ 1095] = 0x8890, [ 1096] = 0x9FAA, ++ [ 1097] = 0x8EB9, [ 1098] = 0x9FAB, [ 1099] = 0x8FCF, [ 1100] = 0x855F, ++ [ 1101] = 0x99E0, [ 1102] = 0x9221, [ 1103] = 0x9FAC, [ 1104] = 0x28DB9, ++ [ 1105] = 0x2143F, [ 1106] = 0x4071, [ 1107] = 0x42A2, [ 1108] = 0x5A1A, ++ [ 1112] = 0x9868, [ 1113] = 0x676B, [ 1114] = 0x4276, [ 1115] = 0x573D, ++ [ 1117] = 0x85D6, [ 1118] = 0x2497B, [ 1119] = 0x82BF, [ 1120] = 0x2710D, ++ [ 1121] = 0x4C81, [ 1122] = 0x26D74, [ 1123] = 0x5D7B, [ 1124] = 0x26B15, ++ [ 1125] = 0x26FBE, [ 1126] = 0x9FAD, [ 1127] = 0x9FAE, [ 1128] = 0x5B96, ++ [ 1129] = 0x9FAF, [ 1130] = 0x66E7, [ 1131] = 0x7E5B, [ 1132] = 0x6E57, ++ [ 1133] = 0x79CA, [ 1134] = 0x3D88, [ 1135] = 0x44C3, [ 1136] = 0x23256, ++ [ 1137] = 0x22796, [ 1138] = 0x439A, [ 1139] = 0x4536, [ 1141] = 0x5CD5, ++ [ 1142] = 0x23B1A, [ 1143] = 0x8AF9, [ 1144] = 0x5C78, [ 1145] = 0x3D12, ++ [ 1146] = 0x23551, [ 1147] = 0x5D78, [ 1148] = 0x9FB2, [ 1149] = 0x7157, ++ [ 1150] = 0x4558, [ 1151] = 0x240EC, [ 1152] = 0x21E23, [ 1153] = 0x4C77, ++ [ 1154] = 0x3978, [ 1155] = 0x344A, [ 1156] = 0x201A4, [ 1157] = 0x26C41, ++ [ 1158] = 0x8ACC, [ 1159] = 0x4FB4, [ 1160] = 0x20239, [ 1161] = 0x59BF, ++ [ 1162] = 0x816C, [ 1163] = 0x9856, [ 1164] = 0x298FA, [ 1165] = 0x5F3B, ++ [ 1170] = 0x20B9F, [ 1172] = 0x221C1, [ 1173] = 0x2896D, [ 1174] = 0x4102, ++ [ 1175] = 0x46BB, [ 1176] = 0x29079, [ 1177] = 0x3F07, [ 1178] = 0x9FB3, ++ [ 1179] = 0x2A1B5, [ 1180] = 0x40F8, [ 1181] = 0x37D6, [ 1182] = 0x46F7, ++ [ 1183] = 0x26C46, [ 1184] = 0x417C, [ 1185] = 0x286B2, [ 1186] = 0x273FF, ++ [ 1187] = 0x456D, [ 1188] = 0x38D4, [ 1189] = 0x2549A, [ 1190] = 0x4561, ++ [ 1191] = 0x451B, [ 1192] = 0x4D89, [ 1193] = 0x4C7B, [ 1194] = 0x4D76, ++ [ 1195] = 0x45EA, [ 1196] = 0x3FC8, [ 1197] = 0x24B0F, [ 1198] = 0x3661, ++ [ 1199] = 0x44DE, [ 1200] = 0x44BD, [ 1201] = 0x41ED, [ 1202] = 0x5D3E, ++ [ 1203] = 0x5D48, [ 1204] = 0x5D56, [ 1205] = 0x3DFC, [ 1206] = 0x380F, ++ [ 1207] = 0x5DA4, [ 1208] = 0x5DB9, [ 1209] = 0x3820, [ 1210] = 0x3838, ++ [ 1211] = 0x5E42, [ 1212] = 0x5EBD, [ 1213] = 0x5F25, [ 1214] = 0x5F83, ++ [ 1215] = 0x3908, [ 1216] = 0x3914, [ 1217] = 0x393F, [ 1218] = 0x394D, ++ [ 1219] = 0x60D7, [ 1220] = 0x613D, [ 1221] = 0x5CE5, [ 1222] = 0x3989, ++ [ 1223] = 0x61B7, [ 1224] = 0x61B9, [ 1225] = 0x61CF, [ 1226] = 0x39B8, ++ [ 1227] = 0x622C, [ 1228] = 0x6290, [ 1229] = 0x62E5, [ 1230] = 0x6318, ++ [ 1231] = 0x39F8, [ 1232] = 0x56B1, [ 1267] = 0x3A03, [ 1268] = 0x63E2, ++ [ 1269] = 0x63FB, [ 1270] = 0x6407, [ 1271] = 0x645A, [ 1272] = 0x3A4B, ++ [ 1273] = 0x64C0, [ 1274] = 0x5D15, [ 1275] = 0x5621, [ 1276] = 0x9F9F, ++ [ 1277] = 0x3A97, [ 1278] = 0x6586, [ 1279] = 0x3ABD, [ 1280] = 0x65FF, ++ [ 1281] = 0x6653, [ 1282] = 0x3AF2, [ 1283] = 0x6692, [ 1284] = 0x3B22, ++ [ 1285] = 0x6716, [ 1286] = 0x3B42, [ 1287] = 0x67A4, [ 1288] = 0x6800, ++ [ 1289] = 0x3B58, [ 1290] = 0x684A, [ 1291] = 0x6884, [ 1292] = 0x3B72, ++ [ 1293] = 0x3B71, [ 1294] = 0x3B7B, [ 1295] = 0x6909, [ 1296] = 0x6943, ++ [ 1297] = 0x725C, [ 1298] = 0x6964, [ 1299] = 0x699F, [ 1300] = 0x6985, ++ [ 1301] = 0x3BBC, [ 1302] = 0x69D6, [ 1303] = 0x3BDD, [ 1304] = 0x6A65, ++ [ 1305] = 0x6A74, [ 1306] = 0x6A71, [ 1307] = 0x6A82, [ 1308] = 0x3BEC, ++ [ 1309] = 0x6A99, [ 1310] = 0x3BF2, [ 1311] = 0x6AAB, [ 1312] = 0x6AB5, ++ [ 1313] = 0x6AD4, [ 1314] = 0x6AF6, [ 1315] = 0x6B81, [ 1316] = 0x6BC1, ++ [ 1317] = 0x6BEA, [ 1318] = 0x6C75, [ 1319] = 0x6CAA, [ 1320] = 0x3CCB, ++ [ 1321] = 0x6D02, [ 1322] = 0x6D06, [ 1323] = 0x6D26, [ 1324] = 0x6D81, ++ [ 1325] = 0x3CEF, [ 1326] = 0x6DA4, [ 1327] = 0x6DB1, [ 1328] = 0x6E15, ++ [ 1329] = 0x6E18, [ 1330] = 0x6E29, [ 1331] = 0x6E86, [ 1332] = 0x289C0, ++ [ 1333] = 0x6EBB, [ 1334] = 0x6EE2, [ 1335] = 0x6EDA, [ 1336] = 0x9F7F, ++ [ 1337] = 0x6EE8, [ 1338] = 0x6EE9, [ 1339] = 0x6F24, [ 1340] = 0x6F34, ++ [ 1341] = 0x3D46, [ 1342] = 0x23F41, [ 1343] = 0x6F81, [ 1344] = 0x6FBE, ++ [ 1345] = 0x3D6A, [ 1346] = 0x3D75, [ 1347] = 0x71B7, [ 1348] = 0x5C99, ++ [ 1349] = 0x3D8A, [ 1350] = 0x702C, [ 1351] = 0x3D91, [ 1352] = 0x7050, ++ [ 1353] = 0x7054, [ 1354] = 0x706F, [ 1355] = 0x707F, [ 1356] = 0x7089, ++ [ 1357] = 0x20325, [ 1358] = 0x43C1, [ 1359] = 0x35F1, [ 1360] = 0x20ED8, ++ [ 1365] = 0x23ED7, [ 1366] = 0x57BE, [ 1367] = 0x26ED3, [ 1368] = 0x713E, ++ [ 1369] = 0x257E0, [ 1370] = 0x364E, [ 1371] = 0x69A2, [ 1372] = 0x28BE9, ++ [ 1373] = 0x5B74, [ 1374] = 0x7A49, [ 1375] = 0x258E1, [ 1376] = 0x294D9, ++ [ 1377] = 0x7A65, [ 1378] = 0x7A7D, [ 1379] = 0x259AC, [ 1380] = 0x7ABB, ++ [ 1381] = 0x7AB0, [ 1382] = 0x7AC2, [ 1383] = 0x7AC3, [ 1384] = 0x71D1, ++ [ 1385] = 0x2648D, [ 1386] = 0x41CA, [ 1387] = 0x7ADA, [ 1388] = 0x7ADD, ++ [ 1389] = 0x7AEA, [ 1390] = 0x41EF, [ 1391] = 0x54B2, [ 1392] = 0x25C01, ++ [ 1393] = 0x7B0B, [ 1394] = 0x7B55, [ 1395] = 0x7B29, [ 1396] = 0x2530E, ++ [ 1397] = 0x25CFE, [ 1398] = 0x7BA2, [ 1399] = 0x7B6F, [ 1400] = 0x839C, ++ [ 1401] = 0x25BB4, [ 1402] = 0x26C7F, [ 1403] = 0x7BD0, [ 1404] = 0x8421, ++ [ 1405] = 0x7B92, [ 1407] = 0x25D20, [ 1408] = 0x3DAD, [ 1409] = 0x25C65, ++ [ 1410] = 0x8492, [ 1411] = 0x7BFA, [ 1413] = 0x7C35, [ 1414] = 0x25CC1, ++ [ 1415] = 0x7C44, [ 1416] = 0x7C83, [ 1417] = 0x24882, [ 1418] = 0x7CA6, ++ [ 1419] = 0x667D, [ 1420] = 0x24578, [ 1421] = 0x7CC9, [ 1422] = 0x7CC7, ++ [ 1423] = 0x7CE6, [ 1424] = 0x7C74, [ 1425] = 0x7CF3, [ 1426] = 0x7CF5, ++ [ 1462] = 0x7E67, [ 1463] = 0x451D, [ 1464] = 0x26E44, [ 1465] = 0x7D5D, ++ [ 1466] = 0x26ED6, [ 1467] = 0x748D, [ 1468] = 0x7D89, [ 1469] = 0x7DAB, ++ [ 1470] = 0x7135, [ 1471] = 0x7DB3, [ 1473] = 0x24057, [ 1474] = 0x26029, ++ [ 1475] = 0x7DE4, [ 1476] = 0x3D13, [ 1477] = 0x7DF5, [ 1478] = 0x217F9, ++ [ 1479] = 0x7DE5, [ 1480] = 0x2836D, [ 1482] = 0x26121, [ 1483] = 0x2615A, ++ [ 1484] = 0x7E6E, [ 1485] = 0x7E92, [ 1486] = 0x432B, [ 1487] = 0x946C, ++ [ 1488] = 0x7E27, [ 1489] = 0x7F40, [ 1490] = 0x7F41, [ 1491] = 0x7F47, ++ [ 1492] = 0x7936, [ 1493] = 0x262D0, [ 1494] = 0x99E1, [ 1495] = 0x7F97, ++ [ 1496] = 0x26351, [ 1497] = 0x7FA3, [ 1498] = 0x21661, [ 1499] = 0x20068, ++ [ 1500] = 0x455C, [ 1501] = 0x23766, [ 1502] = 0x4503, [ 1503] = 0x2833A, ++ [ 1504] = 0x7FFA, [ 1505] = 0x26489, [ 1507] = 0x8008, [ 1508] = 0x801D, ++ [ 1510] = 0x802F, [ 1511] = 0x2A087, [ 1512] = 0x26CC3, [ 1513] = 0x803B, ++ [ 1514] = 0x803C, [ 1515] = 0x8061, [ 1516] = 0x22714, [ 1517] = 0x4989, ++ [ 1518] = 0x26626, [ 1519] = 0x23DE3, [ 1520] = 0x266E8, [ 1521] = 0x6725, ++ [ 1522] = 0x80A7, [ 1523] = 0x28A48, [ 1524] = 0x8107, [ 1525] = 0x811A, ++ [ 1526] = 0x58B0, [ 1527] = 0x226F6, [ 1528] = 0x6C7F, [ 1529] = 0x26498, ++ [ 1530] = 0x24FB8, [ 1531] = 0x64E7, [ 1532] = 0x2148A, [ 1533] = 0x8218, ++ [ 1534] = 0x2185E, [ 1535] = 0x6A53, [ 1536] = 0x24A65, [ 1537] = 0x24A95, ++ [ 1538] = 0x447A, [ 1539] = 0x8229, [ 1540] = 0x20B0D, [ 1541] = 0x26A52, ++ [ 1542] = 0x23D7E, [ 1543] = 0x4FF9, [ 1544] = 0x214FD, [ 1545] = 0x84E2, ++ [ 1546] = 0x8362, [ 1547] = 0x26B0A, [ 1548] = 0x249A7, [ 1549] = 0x23530, ++ [ 1550] = 0x21773, [ 1551] = 0x23DF8, [ 1552] = 0x82AA, [ 1553] = 0x691B, ++ [ 1554] = 0x2F994, [ 1555] = 0x41DB, [ 1560] = 0x854B, [ 1561] = 0x82D0, ++ [ 1562] = 0x831A, [ 1563] = 0x20E16, [ 1564] = 0x217B4, [ 1565] = 0x36C1, ++ [ 1566] = 0x2317D, [ 1567] = 0x2355A, [ 1568] = 0x827B, [ 1569] = 0x82E2, ++ [ 1570] = 0x8318, [ 1571] = 0x23E8B, [ 1572] = 0x26DA3, [ 1573] = 0x26B05, ++ [ 1574] = 0x26B97, [ 1575] = 0x235CE, [ 1576] = 0x3DBF, [ 1577] = 0x831D, ++ [ 1578] = 0x55EC, [ 1579] = 0x8385, [ 1580] = 0x450B, [ 1581] = 0x26DA5, ++ [ 1582] = 0x83AC, [ 1584] = 0x83D3, [ 1585] = 0x347E, [ 1586] = 0x26ED4, ++ [ 1587] = 0x6A57, [ 1588] = 0x855A, [ 1589] = 0x3496, [ 1590] = 0x26E42, ++ [ 1591] = 0x22EEF, [ 1592] = 0x8458, [ 1593] = 0x25BE4, [ 1594] = 0x8471, ++ [ 1595] = 0x3DD3, [ 1596] = 0x44E4, [ 1597] = 0x6AA7, [ 1598] = 0x844A, ++ [ 1599] = 0x23CB5, [ 1600] = 0x7958, [ 1602] = 0x26B96, [ 1603] = 0x26E77, ++ [ 1604] = 0x26E43, [ 1605] = 0x84DE, [ 1607] = 0x8391, [ 1608] = 0x44A0, ++ [ 1609] = 0x8493, [ 1610] = 0x84E4, [ 1611] = 0x25C91, [ 1612] = 0x4240, ++ [ 1613] = 0x25CC0, [ 1614] = 0x4543, [ 1615] = 0x8534, [ 1616] = 0x5AF2, ++ [ 1617] = 0x26E99, [ 1618] = 0x4527, [ 1619] = 0x8573, [ 1620] = 0x4516, ++ [ 1621] = 0x67BF, [ 1622] = 0x8616, [ 1657] = 0x28625, [ 1658] = 0x2863B, ++ [ 1659] = 0x85C1, [ 1660] = 0x27088, [ 1661] = 0x8602, [ 1662] = 0x21582, ++ [ 1663] = 0x270CD, [ 1664] = 0x2F9B2, [ 1665] = 0x456A, [ 1666] = 0x8628, ++ [ 1667] = 0x3648, [ 1668] = 0x218A2, [ 1669] = 0x53F7, [ 1670] = 0x2739A, ++ [ 1671] = 0x867E, [ 1672] = 0x8771, [ 1673] = 0x2A0F8, [ 1674] = 0x87EE, ++ [ 1675] = 0x22C27, [ 1676] = 0x87B1, [ 1677] = 0x87DA, [ 1678] = 0x880F, ++ [ 1679] = 0x5661, [ 1680] = 0x866C, [ 1681] = 0x6856, [ 1682] = 0x460F, ++ [ 1683] = 0x8845, [ 1684] = 0x8846, [ 1685] = 0x275E0, [ 1686] = 0x23DB9, ++ [ 1687] = 0x275E4, [ 1688] = 0x885E, [ 1689] = 0x889C, [ 1690] = 0x465B, ++ [ 1691] = 0x88B4, [ 1692] = 0x88B5, [ 1693] = 0x63C1, [ 1694] = 0x88C5, ++ [ 1695] = 0x7777, [ 1696] = 0x2770F, [ 1697] = 0x8987, [ 1698] = 0x898A, ++ [ 1701] = 0x89A7, [ 1702] = 0x89BC, [ 1703] = 0x28A25, [ 1704] = 0x89E7, ++ [ 1705] = 0x27924, [ 1706] = 0x27ABD, [ 1707] = 0x8A9C, [ 1708] = 0x7793, ++ [ 1709] = 0x91FE, [ 1710] = 0x8A90, [ 1711] = 0x27A59, [ 1712] = 0x7AE9, ++ [ 1713] = 0x27B3A, [ 1714] = 0x23F8F, [ 1715] = 0x4713, [ 1716] = 0x27B38, ++ [ 1717] = 0x717C, [ 1718] = 0x8B0C, [ 1719] = 0x8B1F, [ 1720] = 0x25430, ++ [ 1721] = 0x25565, [ 1722] = 0x8B3F, [ 1723] = 0x8B4C, [ 1724] = 0x8B4D, ++ [ 1725] = 0x8AA9, [ 1726] = 0x24A7A, [ 1727] = 0x8B90, [ 1728] = 0x8B9B, ++ [ 1729] = 0x8AAF, [ 1730] = 0x216DF, [ 1731] = 0x4615, [ 1732] = 0x884F, ++ [ 1733] = 0x8C9B, [ 1734] = 0x27D54, [ 1735] = 0x27D8F, [ 1736] = 0x2F9D4, ++ [ 1737] = 0x3725, [ 1738] = 0x27D53, [ 1739] = 0x8CD6, [ 1740] = 0x27D98, ++ [ 1741] = 0x27DBD, [ 1742] = 0x8D12, [ 1743] = 0x8D03, [ 1744] = 0x21910, ++ [ 1745] = 0x8CDB, [ 1746] = 0x705C, [ 1747] = 0x8D11, [ 1748] = 0x24CC9, ++ [ 1749] = 0x3ED0, [ 1755] = 0x8DA9, [ 1756] = 0x28002, [ 1757] = 0x21014, ++ [ 1758] = 0x2498A, [ 1759] = 0x3B7C, [ 1760] = 0x281BC, [ 1761] = 0x2710C, ++ [ 1762] = 0x7AE7, [ 1763] = 0x8EAD, [ 1764] = 0x8EB6, [ 1765] = 0x8EC3, ++ [ 1766] = 0x92D4, [ 1767] = 0x8F19, [ 1768] = 0x8F2D, [ 1769] = 0x28365, ++ [ 1770] = 0x28412, [ 1771] = 0x8FA5, [ 1772] = 0x9303, [ 1773] = 0x2A29F, ++ [ 1774] = 0x20A50, [ 1775] = 0x8FB3, [ 1776] = 0x492A, [ 1777] = 0x289DE, ++ [ 1778] = 0x2853D, [ 1779] = 0x23DBB, [ 1780] = 0x5EF8, [ 1781] = 0x23262, ++ [ 1782] = 0x8FF9, [ 1783] = 0x2A014, [ 1784] = 0x286BC, [ 1785] = 0x28501, ++ [ 1786] = 0x22325, [ 1787] = 0x3980, [ 1788] = 0x26ED7, [ 1789] = 0x9037, ++ [ 1790] = 0x2853C, [ 1791] = 0x27ABE, [ 1792] = 0x9061, [ 1793] = 0x2856C, ++ [ 1794] = 0x2860B, [ 1795] = 0x90A8, [ 1796] = 0x28713, [ 1797] = 0x90C4, ++ [ 1798] = 0x286E6, [ 1799] = 0x90AE, [ 1801] = 0x9167, [ 1802] = 0x3AF0, ++ [ 1803] = 0x91A9, [ 1804] = 0x91C4, [ 1805] = 0x7CAC, [ 1806] = 0x28933, ++ [ 1807] = 0x21E89, [ 1808] = 0x920E, [ 1809] = 0x6C9F, [ 1810] = 0x9241, ++ [ 1811] = 0x9262, [ 1812] = 0x255B9, [ 1814] = 0x28AC6, [ 1815] = 0x23C9B, ++ [ 1816] = 0x28B0C, [ 1817] = 0x255DB, [ 1852] = 0x20D31, [ 1853] = 0x932C, ++ [ 1854] = 0x936B, [ 1855] = 0x28AE1, [ 1856] = 0x28BEB, [ 1857] = 0x708F, ++ [ 1858] = 0x5AC3, [ 1859] = 0x28AE2, [ 1860] = 0x28AE5, [ 1861] = 0x4965, ++ [ 1862] = 0x9244, [ 1863] = 0x28BEC, [ 1864] = 0x28C39, [ 1865] = 0x28BFF, ++ [ 1866] = 0x9373, [ 1867] = 0x945B, [ 1868] = 0x8EBC, [ 1869] = 0x9585, ++ [ 1870] = 0x95A6, [ 1871] = 0x9426, [ 1872] = 0x95A0, [ 1873] = 0x6FF6, ++ [ 1874] = 0x42B9, [ 1875] = 0x2267A, [ 1876] = 0x286D8, [ 1877] = 0x2127C, ++ [ 1878] = 0x23E2E, [ 1879] = 0x49DF, [ 1880] = 0x6C1C, [ 1881] = 0x967B, ++ [ 1882] = 0x9696, [ 1883] = 0x416C, [ 1884] = 0x96A3, [ 1885] = 0x26ED5, ++ [ 1886] = 0x61DA, [ 1887] = 0x96B6, [ 1888] = 0x78F5, [ 1889] = 0x28AE0, ++ [ 1890] = 0x96BD, [ 1891] = 0x53CC, [ 1892] = 0x49A1, [ 1893] = 0x26CB8, ++ [ 1894] = 0x20274, [ 1895] = 0x26410, [ 1896] = 0x290AF, [ 1897] = 0x290E5, ++ [ 1898] = 0x24AD1, [ 1899] = 0x21915, [ 1900] = 0x2330A, [ 1901] = 0x9731, ++ [ 1902] = 0x8642, [ 1903] = 0x9736, [ 1904] = 0x4A0F, [ 1905] = 0x453D, ++ [ 1906] = 0x4585, [ 1907] = 0x24AE9, [ 1908] = 0x7075, [ 1909] = 0x5B41, ++ [ 1910] = 0x971B, [ 1912] = 0x291D5, [ 1913] = 0x9757, [ 1914] = 0x5B4A, ++ [ 1915] = 0x291EB, [ 1916] = 0x975F, [ 1917] = 0x9425, [ 1918] = 0x50D0, ++ [ 1919] = 0x230B7, [ 1920] = 0x230BC, [ 1921] = 0x9789, [ 1922] = 0x979F, ++ [ 1923] = 0x97B1, [ 1924] = 0x97BE, [ 1925] = 0x97C0, [ 1926] = 0x97D2, ++ [ 1927] = 0x97E0, [ 1928] = 0x2546C, [ 1929] = 0x97EE, [ 1930] = 0x741C, ++ [ 1931] = 0x29433, [ 1933] = 0x97F5, [ 1934] = 0x2941D, [ 1935] = 0x2797A, ++ [ 1936] = 0x4AD1, [ 1937] = 0x9834, [ 1938] = 0x9833, [ 1939] = 0x984B, ++ [ 1940] = 0x9866, [ 1941] = 0x3B0E, [ 1942] = 0x27175, [ 1943] = 0x3D51, ++ [ 1944] = 0x20630, [ 1945] = 0x2415C, [ 1950] = 0x25706, [ 1951] = 0x98CA, ++ [ 1952] = 0x98B7, [ 1953] = 0x98C8, [ 1954] = 0x98C7, [ 1955] = 0x4AFF, ++ [ 1956] = 0x26D27, [ 1957] = 0x216D3, [ 1958] = 0x55B0, [ 1959] = 0x98E1, ++ [ 1960] = 0x98E6, [ 1961] = 0x98EC, [ 1962] = 0x9378, [ 1963] = 0x9939, ++ [ 1964] = 0x24A29, [ 1965] = 0x4B72, [ 1966] = 0x29857, [ 1967] = 0x29905, ++ [ 1968] = 0x99F5, [ 1969] = 0x9A0C, [ 1970] = 0x9A3B, [ 1971] = 0x9A10, ++ [ 1972] = 0x9A58, [ 1973] = 0x25725, [ 1974] = 0x36C4, [ 1975] = 0x290B1, ++ [ 1976] = 0x29BD5, [ 1977] = 0x9AE0, [ 1978] = 0x9AE2, [ 1979] = 0x29B05, ++ [ 1980] = 0x9AF4, [ 1981] = 0x4C0E, [ 1982] = 0x9B14, [ 1983] = 0x9B2D, ++ [ 1984] = 0x28600, [ 1985] = 0x5034, [ 1986] = 0x9B34, [ 1987] = 0x269A8, ++ [ 1988] = 0x38C3, [ 1989] = 0x2307D, [ 1990] = 0x9B50, [ 1991] = 0x9B40, ++ [ 1992] = 0x29D3E, [ 1993] = 0x5A45, [ 1994] = 0x21863, [ 1995] = 0x9B8E, ++ [ 1996] = 0x2424B, [ 1997] = 0x9C02, [ 1998] = 0x9BFF, [ 1999] = 0x9C0C, ++ [ 2000] = 0x29E68, [ 2001] = 0x9DD4, [ 2002] = 0x29FB7, [ 2003] = 0x2A192, ++ [ 2004] = 0x2A1AB, [ 2005] = 0x2A0E1, [ 2006] = 0x2A123, [ 2007] = 0x2A1DF, ++ [ 2008] = 0x9D7E, [ 2009] = 0x9D83, [ 2010] = 0x2A134, [ 2011] = 0x9E0E, ++ [ 2012] = 0x6888, [ 2047] = 0x9DC4, [ 2048] = 0x2215B, [ 2049] = 0x2A193, ++ [ 2050] = 0x2A220, [ 2051] = 0x2193B, [ 2052] = 0x2A233, [ 2053] = 0x9D39, ++ [ 2054] = 0x2A0B9, [ 2055] = 0x2A2B4, [ 2056] = 0x9E90, [ 2057] = 0x9E95, ++ [ 2058] = 0x9E9E, [ 2059] = 0x9EA2, [ 2060] = 0x4D34, [ 2061] = 0x9EAA, ++ [ 2062] = 0x9EAF, [ 2063] = 0x24364, [ 2064] = 0x9EC1, [ 2065] = 0x3B60, ++ [ 2066] = 0x39E5, [ 2067] = 0x3D1D, [ 2068] = 0x4F32, [ 2069] = 0x37BE, ++ [ 2070] = 0x28C2B, [ 2071] = 0x9F02, [ 2072] = 0x9F08, [ 2073] = 0x4B96, ++ [ 2074] = 0x9424, [ 2075] = 0x26DA2, [ 2076] = 0x9F17, [ 2078] = 0x9F39, ++ [ 2079] = 0x569F, [ 2080] = 0x568A, [ 2081] = 0x9F45, [ 2082] = 0x99B8, ++ [ 2083] = 0x2908B, [ 2084] = 0x97F2, [ 2085] = 0x847F, [ 2086] = 0x9F62, ++ [ 2087] = 0x9F69, [ 2088] = 0x7ADC, [ 2089] = 0x9F8E, [ 2090] = 0x7216, ++ [ 2091] = 0x4BBE, [ 2092] = 0x24975, [ 2093] = 0x249BB, [ 2094] = 0x7177, ++ [ 2095] = 0x249F8, [ 2096] = 0x24348, [ 2097] = 0x24A51, [ 2098] = 0x739E, ++ [ 2099] = 0x28BDA, [ 2100] = 0x218FA, [ 2101] = 0x799F, [ 2102] = 0x2897E, ++ [ 2103] = 0x28E36, [ 2104] = 0x9369, [ 2105] = 0x93F3, [ 2106] = 0x28A44, ++ [ 2107] = 0x92EC, [ 2108] = 0x9381, [ 2109] = 0x93CB, [ 2110] = 0x2896C, ++ [ 2111] = 0x244B9, [ 2112] = 0x7217, [ 2113] = 0x3EEB, [ 2114] = 0x7772, ++ [ 2115] = 0x7A43, [ 2116] = 0x70D0, [ 2117] = 0x24473, [ 2118] = 0x243F8, ++ [ 2119] = 0x717E, [ 2120] = 0x217EF, [ 2121] = 0x70A3, [ 2122] = 0x218BE, ++ [ 2123] = 0x23599, [ 2124] = 0x3EC7, [ 2125] = 0x21885, [ 2126] = 0x2542F, ++ [ 2127] = 0x217F8, [ 2128] = 0x3722, [ 2129] = 0x216FB, [ 2130] = 0x21839, ++ [ 2131] = 0x36E1, [ 2132] = 0x21774, [ 2133] = 0x218D1, [ 2134] = 0x25F4B, ++ [ 2135] = 0x3723, [ 2136] = 0x216C0, [ 2137] = 0x575B, [ 2138] = 0x24A25, ++ [ 2139] = 0x213FE, [ 2140] = 0x212A8, [ 2145] = 0x213C6, [ 2146] = 0x214B6, ++ [ 2147] = 0x8503, [ 2148] = 0x236A6, [ 2150] = 0x8455, [ 2151] = 0x24994, ++ [ 2152] = 0x27165, [ 2153] = 0x23E31, [ 2154] = 0x2555C, [ 2155] = 0x23EFB, ++ [ 2156] = 0x27052, [ 2157] = 0x44F4, [ 2158] = 0x236EE, [ 2159] = 0x2999D, ++ [ 2160] = 0x26F26, [ 2161] = 0x67F9, [ 2162] = 0x3733, [ 2163] = 0x3C15, ++ [ 2164] = 0x3DE7, [ 2165] = 0x586C, [ 2166] = 0x21922, [ 2167] = 0x6810, ++ [ 2168] = 0x4057, [ 2169] = 0x2373F, [ 2170] = 0x240E1, [ 2171] = 0x2408B, ++ [ 2172] = 0x2410F, [ 2173] = 0x26C21, [ 2174] = 0x54CB, [ 2175] = 0x569E, ++ [ 2176] = 0x266B1, [ 2177] = 0x5692, [ 2178] = 0x20FDF, [ 2179] = 0x20BA8, ++ [ 2180] = 0x20E0D, [ 2181] = 0x93C6, [ 2182] = 0x28B13, [ 2183] = 0x939C, ++ [ 2184] = 0x4EF8, [ 2185] = 0x512B, [ 2186] = 0x3819, [ 2187] = 0x24436, ++ [ 2188] = 0x4EBC, [ 2189] = 0x20465, [ 2190] = 0x2037F, [ 2191] = 0x4F4B, ++ [ 2192] = 0x4F8A, [ 2193] = 0x25651, [ 2194] = 0x5A68, [ 2195] = 0x201AB, ++ [ 2196] = 0x203CB, [ 2197] = 0x3999, [ 2198] = 0x2030A, [ 2199] = 0x20414, ++ [ 2200] = 0x3435, [ 2201] = 0x4F29, [ 2202] = 0x202C0, [ 2203] = 0x28EB3, ++ [ 2204] = 0x20275, [ 2205] = 0x8ADA, [ 2206] = 0x2020C, [ 2207] = 0x4E98, ++ [ 2242] = 0x50CD, [ 2243] = 0x510D, [ 2244] = 0x4FA2, [ 2245] = 0x4F03, ++ [ 2246] = 0x24A0E, [ 2247] = 0x23E8A, [ 2248] = 0x4F42, [ 2249] = 0x502E, ++ [ 2250] = 0x506C, [ 2251] = 0x5081, [ 2252] = 0x4FCC, [ 2253] = 0x4FE5, ++ [ 2254] = 0x5058, [ 2255] = 0x50FC, [ 2260] = 0x6E76, [ 2261] = 0x23595, ++ [ 2262] = 0x23E39, [ 2263] = 0x23EBF, [ 2264] = 0x6D72, [ 2265] = 0x21884, ++ [ 2266] = 0x23E89, [ 2267] = 0x51A8, [ 2268] = 0x51C3, [ 2269] = 0x205E0, ++ [ 2270] = 0x44DD, [ 2271] = 0x204A3, [ 2272] = 0x20492, [ 2273] = 0x20491, ++ [ 2274] = 0x8D7A, [ 2275] = 0x28A9C, [ 2276] = 0x2070E, [ 2277] = 0x5259, ++ [ 2278] = 0x52A4, [ 2279] = 0x20873, [ 2280] = 0x52E1, [ 2282] = 0x467A, ++ [ 2283] = 0x718C, [ 2284] = 0x2438C, [ 2285] = 0x20C20, [ 2286] = 0x249AC, ++ [ 2287] = 0x210E4, [ 2288] = 0x69D1, [ 2289] = 0x20E1D, [ 2291] = 0x3EDE, ++ [ 2292] = 0x7499, [ 2293] = 0x7414, [ 2294] = 0x7456, [ 2295] = 0x7398, ++ [ 2296] = 0x4B8E, [ 2297] = 0x24ABC, [ 2298] = 0x2408D, [ 2299] = 0x53D0, ++ [ 2300] = 0x3584, [ 2301] = 0x720F, [ 2302] = 0x240C9, [ 2303] = 0x55B4, ++ [ 2304] = 0x20345, [ 2305] = 0x54CD, [ 2306] = 0x20BC6, [ 2307] = 0x571D, ++ [ 2308] = 0x925D, [ 2309] = 0x96F4, [ 2310] = 0x9366, [ 2311] = 0x57DD, ++ [ 2312] = 0x578D, [ 2313] = 0x577F, [ 2314] = 0x363E, [ 2315] = 0x58CB, ++ [ 2316] = 0x5A99, [ 2317] = 0x28A46, [ 2318] = 0x216FA, [ 2319] = 0x2176F, ++ [ 2320] = 0x21710, [ 2321] = 0x5A2C, [ 2322] = 0x59B8, [ 2323] = 0x928F, ++ [ 2324] = 0x5A7E, [ 2325] = 0x5ACF, [ 2326] = 0x5A12, [ 2327] = 0x25946, ++ [ 2328] = 0x219F3, [ 2329] = 0x21861, [ 2330] = 0x24295, [ 2331] = 0x36F5, ++ [ 2332] = 0x6D05, [ 2333] = 0x7443, [ 2334] = 0x5A21, [ 2335] = 0x25E83, ++ [ 2340] = 0x5A81, [ 2341] = 0x28BD7, [ 2342] = 0x20413, [ 2343] = 0x93E0, ++ [ 2344] = 0x748C, [ 2345] = 0x21303, [ 2346] = 0x7105, [ 2347] = 0x4972, ++ [ 2348] = 0x9408, [ 2349] = 0x289FB, [ 2350] = 0x93BD, [ 2351] = 0x37A0, ++ [ 2352] = 0x5C1E, [ 2353] = 0x5C9E, [ 2354] = 0x5E5E, [ 2355] = 0x5E48, ++ [ 2356] = 0x21996, [ 2357] = 0x2197C, [ 2358] = 0x23AEE, [ 2359] = 0x5ECD, ++ [ 2360] = 0x5B4F, [ 2361] = 0x21903, [ 2362] = 0x21904, [ 2363] = 0x3701, ++ [ 2364] = 0x218A0, [ 2365] = 0x36DD, [ 2366] = 0x216FE, [ 2367] = 0x36D3, ++ [ 2368] = 0x812A, [ 2369] = 0x28A47, [ 2370] = 0x21DBA, [ 2371] = 0x23472, ++ [ 2372] = 0x289A8, [ 2373] = 0x5F0C, [ 2374] = 0x5F0E, [ 2375] = 0x21927, ++ [ 2376] = 0x217AB, [ 2377] = 0x5A6B, [ 2378] = 0x2173B, [ 2379] = 0x5B44, ++ [ 2380] = 0x8614, [ 2381] = 0x275FD, [ 2382] = 0x8860, [ 2383] = 0x607E, ++ [ 2384] = 0x22860, [ 2385] = 0x2262B, [ 2386] = 0x5FDB, [ 2387] = 0x3EB8, ++ [ 2388] = 0x225AF, [ 2389] = 0x225BE, [ 2390] = 0x29088, [ 2391] = 0x26F73, ++ [ 2392] = 0x61C0, [ 2393] = 0x2003E, [ 2394] = 0x20046, [ 2395] = 0x2261B, ++ [ 2396] = 0x6199, [ 2397] = 0x6198, [ 2398] = 0x6075, [ 2399] = 0x22C9B, ++ [ 2400] = 0x22D07, [ 2401] = 0x246D4, [ 2402] = 0x2914D, [ 2437] = 0x6471, ++ [ 2438] = 0x24665, [ 2439] = 0x22B6A, [ 2440] = 0x3A29, [ 2441] = 0x22B22, ++ [ 2442] = 0x23450, [ 2443] = 0x298EA, [ 2444] = 0x22E78, [ 2445] = 0x6337, ++ [ 2446] = 0x2A45B, [ 2447] = 0x64B6, [ 2448] = 0x6331, [ 2449] = 0x63D1, ++ [ 2450] = 0x249E3, [ 2451] = 0x22D67, [ 2452] = 0x62A4, [ 2453] = 0x22CA1, ++ [ 2454] = 0x643B, [ 2455] = 0x656B, [ 2456] = 0x6972, [ 2457] = 0x3BF4, ++ [ 2458] = 0x2308E, [ 2459] = 0x232AD, [ 2460] = 0x24989, [ 2461] = 0x232AB, ++ [ 2462] = 0x550D, [ 2463] = 0x232E0, [ 2464] = 0x218D9, [ 2465] = 0x2943F, ++ [ 2466] = 0x66CE, [ 2467] = 0x23289, [ 2468] = 0x231B3, [ 2469] = 0x3AE0, ++ [ 2470] = 0x4190, [ 2471] = 0x25584, [ 2472] = 0x28B22, [ 2473] = 0x2558F, ++ [ 2474] = 0x216FC, [ 2475] = 0x2555B, [ 2476] = 0x25425, [ 2477] = 0x78EE, ++ [ 2478] = 0x23103, [ 2479] = 0x2182A, [ 2480] = 0x23234, [ 2481] = 0x3464, ++ [ 2482] = 0x2320F, [ 2483] = 0x23182, [ 2484] = 0x242C9, [ 2485] = 0x668E, ++ [ 2486] = 0x26D24, [ 2487] = 0x666B, [ 2488] = 0x4B93, [ 2489] = 0x6630, ++ [ 2490] = 0x27870, [ 2491] = 0x21DEB, [ 2492] = 0x6663, [ 2493] = 0x232D2, ++ [ 2494] = 0x232E1, [ 2495] = 0x661E, [ 2496] = 0x25872, [ 2497] = 0x38D1, ++ [ 2498] = 0x2383A, [ 2499] = 0x237BC, [ 2500] = 0x3B99, [ 2501] = 0x237A2, ++ [ 2502] = 0x233FE, [ 2503] = 0x74D0, [ 2504] = 0x3B96, [ 2505] = 0x678F, ++ [ 2506] = 0x2462A, [ 2507] = 0x68B6, [ 2508] = 0x681E, [ 2509] = 0x3BC4, ++ [ 2510] = 0x6ABE, [ 2511] = 0x3863, [ 2512] = 0x237D5, [ 2513] = 0x24487, ++ [ 2514] = 0x6A33, [ 2515] = 0x6A52, [ 2516] = 0x6AC9, [ 2517] = 0x6B05, ++ [ 2518] = 0x21912, [ 2519] = 0x6511, [ 2520] = 0x6898, [ 2521] = 0x6A4C, ++ [ 2522] = 0x3BD7, [ 2523] = 0x6A7A, [ 2524] = 0x6B57, [ 2525] = 0x23FC0, ++ [ 2526] = 0x23C9A, [ 2527] = 0x93A0, [ 2528] = 0x92F2, [ 2529] = 0x28BEA, ++ [ 2530] = 0x28ACB, [ 2535] = 0x9289, [ 2536] = 0x2801E, [ 2537] = 0x289DC, ++ [ 2538] = 0x9467, [ 2539] = 0x6DA5, [ 2540] = 0x6F0B, [ 2541] = 0x249EC, ++ [ 2543] = 0x23F7F, [ 2544] = 0x3D8F, [ 2545] = 0x6E04, [ 2546] = 0x2403C, ++ [ 2547] = 0x5A3D, [ 2548] = 0x6E0A, [ 2549] = 0x5847, [ 2550] = 0x6D24, ++ [ 2551] = 0x7842, [ 2552] = 0x713B, [ 2553] = 0x2431A, [ 2554] = 0x24276, ++ [ 2555] = 0x70F1, [ 2556] = 0x7250, [ 2557] = 0x7287, [ 2558] = 0x7294, ++ [ 2559] = 0x2478F, [ 2560] = 0x24725, [ 2561] = 0x5179, [ 2562] = 0x24AA4, ++ [ 2563] = 0x205EB, [ 2564] = 0x747A, [ 2565] = 0x23EF8, [ 2566] = 0x2365F, ++ [ 2567] = 0x24A4A, [ 2568] = 0x24917, [ 2569] = 0x25FE1, [ 2570] = 0x3F06, ++ [ 2571] = 0x3EB1, [ 2572] = 0x24ADF, [ 2573] = 0x28C23, [ 2574] = 0x23F35, ++ [ 2575] = 0x60A7, [ 2576] = 0x3EF3, [ 2577] = 0x74CC, [ 2578] = 0x743C, ++ [ 2579] = 0x9387, [ 2580] = 0x7437, [ 2581] = 0x449F, [ 2582] = 0x26DEA, ++ [ 2583] = 0x4551, [ 2584] = 0x7583, [ 2585] = 0x3F63, [ 2586] = 0x24CD9, ++ [ 2587] = 0x24D06, [ 2588] = 0x3F58, [ 2589] = 0x7555, [ 2590] = 0x7673, ++ [ 2591] = 0x2A5C6, [ 2592] = 0x3B19, [ 2593] = 0x7468, [ 2594] = 0x28ACC, ++ [ 2595] = 0x249AB, [ 2596] = 0x2498E, [ 2597] = 0x3AFB, [ 2632] = 0x3DCD, ++ [ 2633] = 0x24A4E, [ 2634] = 0x3EFF, [ 2635] = 0x249C5, [ 2636] = 0x248F3, ++ [ 2637] = 0x91FA, [ 2638] = 0x5732, [ 2639] = 0x9342, [ 2640] = 0x28AE3, ++ [ 2641] = 0x21864, [ 2642] = 0x50DF, [ 2643] = 0x25221, [ 2644] = 0x251E7, ++ [ 2645] = 0x7778, [ 2646] = 0x23232, [ 2647] = 0x770E, [ 2648] = 0x770F, ++ [ 2649] = 0x777B, [ 2650] = 0x24697, [ 2651] = 0x23781, [ 2652] = 0x3A5E, ++ [ 2653] = 0x248F0, [ 2654] = 0x7438, [ 2655] = 0x749B, [ 2656] = 0x3EBF, ++ [ 2657] = 0x24ABA, [ 2658] = 0x24AC7, [ 2659] = 0x40C8, [ 2660] = 0x24A96, ++ [ 2661] = 0x261AE, [ 2662] = 0x9307, [ 2663] = 0x25581, [ 2664] = 0x781E, ++ [ 2665] = 0x788D, [ 2666] = 0x7888, [ 2667] = 0x78D2, [ 2668] = 0x73D0, ++ [ 2669] = 0x7959, [ 2670] = 0x27741, [ 2671] = 0x256E3, [ 2672] = 0x410E, ++ [ 2674] = 0x8496, [ 2675] = 0x79A5, [ 2676] = 0x6A2D, [ 2677] = 0x23EFA, ++ [ 2678] = 0x7A3A, [ 2679] = 0x79F4, [ 2680] = 0x416E, [ 2681] = 0x216E6, ++ [ 2682] = 0x4132, [ 2683] = 0x9235, [ 2684] = 0x79F1, [ 2685] = 0x20D4C, ++ [ 2686] = 0x2498C, [ 2687] = 0x20299, [ 2688] = 0x23DBA, [ 2689] = 0x2176E, ++ [ 2690] = 0x3597, [ 2691] = 0x556B, [ 2692] = 0x3570, [ 2693] = 0x36AA, ++ [ 2694] = 0x201D4, [ 2695] = 0x20C0D, [ 2696] = 0x7AE2, [ 2697] = 0x5A59, ++ [ 2698] = 0x226F5, [ 2699] = 0x25AAF, [ 2700] = 0x25A9C, [ 2701] = 0x5A0D, ++ [ 2702] = 0x2025B, [ 2703] = 0x78F0, [ 2704] = 0x5A2A, [ 2705] = 0x25BC6, ++ [ 2706] = 0x7AFE, [ 2707] = 0x41F9, [ 2708] = 0x7C5D, [ 2709] = 0x7C6D, ++ [ 2710] = 0x4211, [ 2711] = 0x25BB3, [ 2712] = 0x25EBC, [ 2713] = 0x25EA6, ++ [ 2714] = 0x7CCD, [ 2715] = 0x249F9, [ 2716] = 0x217B0, [ 2717] = 0x7C8E, ++ [ 2718] = 0x7C7C, [ 2719] = 0x7CAE, [ 2720] = 0x6AB2, [ 2721] = 0x7DDC, ++ [ 2722] = 0x7E07, [ 2723] = 0x7DD3, [ 2724] = 0x7F4E, [ 2725] = 0x26261, ++ [ 2730] = 0x2615C, [ 2731] = 0x27B48, [ 2732] = 0x7D97, [ 2733] = 0x25E82, ++ [ 2734] = 0x426A, [ 2735] = 0x26B75, [ 2736] = 0x20916, [ 2737] = 0x67D6, ++ [ 2738] = 0x2004E, [ 2739] = 0x235CF, [ 2740] = 0x57C4, [ 2741] = 0x26412, ++ [ 2742] = 0x263F8, [ 2743] = 0x24962, [ 2744] = 0x7FDD, [ 2745] = 0x7B27, ++ [ 2746] = 0x2082C, [ 2747] = 0x25AE9, [ 2748] = 0x25D43, [ 2749] = 0x7B0C, ++ [ 2750] = 0x25E0E, [ 2751] = 0x99E6, [ 2752] = 0x8645, [ 2753] = 0x9A63, ++ [ 2754] = 0x6A1C, [ 2755] = 0x2343F, [ 2756] = 0x39E2, [ 2757] = 0x249F7, ++ [ 2758] = 0x265AD, [ 2759] = 0x9A1F, [ 2760] = 0x265A0, [ 2761] = 0x8480, ++ [ 2762] = 0x27127, [ 2763] = 0x26CD1, [ 2764] = 0x44EA, [ 2765] = 0x8137, ++ [ 2766] = 0x4402, [ 2767] = 0x80C6, [ 2768] = 0x8109, [ 2769] = 0x8142, ++ [ 2770] = 0x267B4, [ 2771] = 0x98C3, [ 2772] = 0x26A42, [ 2773] = 0x8262, ++ [ 2774] = 0x8265, [ 2775] = 0x26A51, [ 2776] = 0x8453, [ 2777] = 0x26DA7, ++ [ 2778] = 0x8610, [ 2779] = 0x2721B, [ 2780] = 0x5A86, [ 2781] = 0x417F, ++ [ 2782] = 0x21840, [ 2783] = 0x5B2B, [ 2784] = 0x218A1, [ 2785] = 0x5AE4, ++ [ 2786] = 0x218D8, [ 2787] = 0x86A0, [ 2788] = 0x2F9BC, [ 2789] = 0x23D8F, ++ [ 2790] = 0x882D, [ 2791] = 0x27422, [ 2792] = 0x5A02, [ 2827] = 0x886E, ++ [ 2828] = 0x4F45, [ 2829] = 0x8887, [ 2830] = 0x88BF, [ 2831] = 0x88E6, ++ [ 2832] = 0x8965, [ 2833] = 0x894D, [ 2834] = 0x25683, [ 2835] = 0x8954, ++ [ 2836] = 0x27785, [ 2837] = 0x27784, [ 2838] = 0x28BF5, [ 2839] = 0x28BD9, ++ [ 2840] = 0x28B9C, [ 2841] = 0x289F9, [ 2842] = 0x3EAD, [ 2843] = 0x84A3, ++ [ 2844] = 0x46F5, [ 2845] = 0x46CF, [ 2846] = 0x37F2, [ 2847] = 0x8A3D, ++ [ 2848] = 0x8A1C, [ 2849] = 0x29448, [ 2850] = 0x5F4D, [ 2851] = 0x922B, ++ [ 2852] = 0x24284, [ 2853] = 0x65D4, [ 2854] = 0x7129, [ 2855] = 0x70C4, ++ [ 2856] = 0x21845, [ 2857] = 0x9D6D, [ 2858] = 0x8C9F, [ 2859] = 0x8CE9, ++ [ 2860] = 0x27DDC, [ 2861] = 0x599A, [ 2862] = 0x77C3, [ 2863] = 0x59F0, ++ [ 2864] = 0x436E, [ 2865] = 0x36D4, [ 2866] = 0x8E2A, [ 2867] = 0x8EA7, ++ [ 2868] = 0x24C09, [ 2869] = 0x8F30, [ 2870] = 0x8F4A, [ 2871] = 0x42F4, ++ [ 2872] = 0x6C58, [ 2873] = 0x6FBB, [ 2874] = 0x22321, [ 2875] = 0x489B, ++ [ 2876] = 0x6F79, [ 2877] = 0x6E8B, [ 2878] = 0x217DA, [ 2879] = 0x9BE9, ++ [ 2880] = 0x36B5, [ 2881] = 0x2492F, [ 2882] = 0x90BB, [ 2884] = 0x5571, ++ [ 2885] = 0x4906, [ 2886] = 0x91BB, [ 2887] = 0x9404, [ 2888] = 0x28A4B, ++ [ 2889] = 0x4062, [ 2890] = 0x28AFC, [ 2891] = 0x9427, [ 2892] = 0x28C1D, ++ [ 2893] = 0x28C3B, [ 2894] = 0x84E5, [ 2895] = 0x8A2B, [ 2896] = 0x9599, ++ [ 2897] = 0x95A7, [ 2898] = 0x9597, [ 2899] = 0x9596, [ 2900] = 0x28D34, ++ [ 2901] = 0x7445, [ 2902] = 0x3EC2, [ 2903] = 0x248FF, [ 2904] = 0x24A42, ++ [ 2905] = 0x243EA, [ 2906] = 0x3EE7, [ 2907] = 0x23225, [ 2908] = 0x968F, ++ [ 2909] = 0x28EE7, [ 2910] = 0x28E66, [ 2911] = 0x28E65, [ 2912] = 0x3ECC, ++ [ 2913] = 0x249ED, [ 2914] = 0x24A78, [ 2915] = 0x23FEE, [ 2916] = 0x7412, ++ [ 2917] = 0x746B, [ 2918] = 0x3EFC, [ 2919] = 0x9741, [ 2920] = 0x290B0, ++ [ 2925] = 0x6847, [ 2926] = 0x4A1D, [ 2927] = 0x29093, [ 2928] = 0x257DF, ++ [ 2930] = 0x9368, [ 2931] = 0x28989, [ 2932] = 0x28C26, [ 2933] = 0x28B2F, ++ [ 2934] = 0x263BE, [ 2935] = 0x92BA, [ 2936] = 0x5B11, [ 2937] = 0x8B69, ++ [ 2938] = 0x493C, [ 2939] = 0x73F9, [ 2940] = 0x2421B, [ 2941] = 0x979B, ++ [ 2942] = 0x9771, [ 2943] = 0x9938, [ 2944] = 0x20F26, [ 2945] = 0x5DC1, ++ [ 2946] = 0x28BC5, [ 2947] = 0x24AB2, [ 2948] = 0x981F, [ 2949] = 0x294DA, ++ [ 2950] = 0x92F6, [ 2951] = 0x295D7, [ 2952] = 0x91E5, [ 2953] = 0x44C0, ++ [ 2954] = 0x28B50, [ 2955] = 0x24A67, [ 2956] = 0x28B64, [ 2957] = 0x98DC, ++ [ 2958] = 0x28A45, [ 2959] = 0x3F00, [ 2960] = 0x922A, [ 2961] = 0x4925, ++ [ 2962] = 0x8414, [ 2963] = 0x993B, [ 2964] = 0x994D, [ 2965] = 0x27B06, ++ [ 2966] = 0x3DFD, [ 2967] = 0x999B, [ 2968] = 0x4B6F, [ 2969] = 0x99AA, ++ [ 2970] = 0x9A5C, [ 2971] = 0x28B65, [ 2972] = 0x258C8, [ 2973] = 0x6A8F, ++ [ 2974] = 0x9A21, [ 2975] = 0x5AFE, [ 2976] = 0x9A2F, [ 2977] = 0x298F1, ++ [ 2978] = 0x4B90, [ 2979] = 0x29948, [ 2980] = 0x99BC, [ 2981] = 0x4BBD, ++ [ 2982] = 0x4B97, [ 2983] = 0x937D, [ 2984] = 0x5872, [ 2985] = 0x21302, ++ [ 2986] = 0x5822, [ 2987] = 0x249B8, [ 3022] = 0x214E8, [ 3023] = 0x7844, ++ [ 3024] = 0x2271F, [ 3025] = 0x23DB8, [ 3026] = 0x68C5, [ 3027] = 0x3D7D, ++ [ 3028] = 0x9458, [ 3029] = 0x3927, [ 3030] = 0x6150, [ 3031] = 0x22781, ++ [ 3032] = 0x2296B, [ 3033] = 0x6107, [ 3034] = 0x9C4F, [ 3035] = 0x9C53, ++ [ 3036] = 0x9C7B, [ 3037] = 0x9C35, [ 3038] = 0x9C10, [ 3039] = 0x9B7F, ++ [ 3040] = 0x9BCF, [ 3041] = 0x29E2D, [ 3042] = 0x9B9F, [ 3043] = 0x2A1F5, ++ [ 3044] = 0x2A0FE, [ 3045] = 0x9D21, [ 3046] = 0x4CAE, [ 3047] = 0x24104, ++ [ 3048] = 0x9E18, [ 3049] = 0x4CB0, [ 3050] = 0x9D0C, [ 3051] = 0x2A1B4, ++ [ 3052] = 0x2A0ED, [ 3053] = 0x2A0F3, [ 3054] = 0x2992F, [ 3055] = 0x9DA5, ++ [ 3056] = 0x84BD, [ 3057] = 0x26E12, [ 3058] = 0x26FDF, [ 3059] = 0x26B82, ++ [ 3060] = 0x85FC, [ 3061] = 0x4533, [ 3062] = 0x26DA4, [ 3063] = 0x26E84, ++ [ 3064] = 0x26DF0, [ 3065] = 0x8420, [ 3066] = 0x85EE, [ 3067] = 0x26E00, ++ [ 3068] = 0x237D7, [ 3069] = 0x26064, [ 3070] = 0x79E2, [ 3071] = 0x2359C, ++ [ 3072] = 0x23640, [ 3073] = 0x492D, [ 3074] = 0x249DE, [ 3075] = 0x3D62, ++ [ 3076] = 0x93DB, [ 3077] = 0x92BE, [ 3078] = 0x9348, [ 3079] = 0x202BF, ++ [ 3080] = 0x78B9, [ 3081] = 0x9277, [ 3082] = 0x944D, [ 3083] = 0x4FE4, ++ [ 3084] = 0x3440, [ 3085] = 0x9064, [ 3086] = 0x2555D, [ 3087] = 0x783D, ++ [ 3088] = 0x7854, [ 3089] = 0x78B6, [ 3090] = 0x784B, [ 3091] = 0x21757, ++ [ 3092] = 0x231C9, [ 3093] = 0x24941, [ 3094] = 0x369A, [ 3095] = 0x4F72, ++ [ 3096] = 0x6FDA, [ 3097] = 0x6FD9, [ 3099] = 0x701E, [ 3100] = 0x5414, ++ [ 3101] = 0x241B5, [ 3102] = 0x57BB, [ 3103] = 0x58F3, [ 3104] = 0x578A, ++ [ 3105] = 0x9D16, [ 3106] = 0x57D7, [ 3107] = 0x7134, [ 3108] = 0x34AF, ++ [ 3109] = 0x241AC, [ 3110] = 0x71EB, [ 3111] = 0x26C40, [ 3112] = 0x24F97, ++ [ 3114] = 0x217B5, [ 3115] = 0x28A49, [ 3120] = 0x610C, [ 3121] = 0x5ACE, ++ [ 3122] = 0x5A0B, [ 3123] = 0x42BC, [ 3124] = 0x24488, [ 3125] = 0x372C, ++ [ 3126] = 0x4B7B, [ 3127] = 0x289FC, [ 3128] = 0x93BB, [ 3129] = 0x93B8, ++ [ 3130] = 0x218D6, [ 3131] = 0x20F1D, [ 3132] = 0x8472, [ 3133] = 0x26CC0, ++ [ 3134] = 0x21413, [ 3135] = 0x242FA, [ 3136] = 0x22C26, [ 3137] = 0x243C1, ++ [ 3138] = 0x5994, [ 3139] = 0x23DB7, [ 3140] = 0x26741, [ 3141] = 0x7DA8, ++ [ 3142] = 0x2615B, [ 3143] = 0x260A4, [ 3144] = 0x249B9, [ 3145] = 0x2498B, ++ [ 3146] = 0x289FA, [ 3147] = 0x92E5, [ 3148] = 0x73E2, [ 3149] = 0x3EE9, ++ [ 3150] = 0x74B4, [ 3151] = 0x28B63, [ 3152] = 0x2189F, [ 3153] = 0x3EE1, ++ [ 3154] = 0x24AB3, [ 3155] = 0x6AD8, [ 3156] = 0x73F3, [ 3157] = 0x73FB, ++ [ 3158] = 0x3ED6, [ 3159] = 0x24A3E, [ 3160] = 0x24A94, [ 3161] = 0x217D9, ++ [ 3162] = 0x24A66, [ 3163] = 0x203A7, [ 3164] = 0x21424, [ 3165] = 0x249E5, ++ [ 3166] = 0x7448, [ 3167] = 0x24916, [ 3168] = 0x70A5, [ 3169] = 0x24976, ++ [ 3170] = 0x9284, [ 3171] = 0x73E6, [ 3172] = 0x935F, [ 3173] = 0x204FE, ++ [ 3174] = 0x9331, [ 3175] = 0x28ACE, [ 3176] = 0x28A16, [ 3177] = 0x9386, ++ [ 3178] = 0x28BE7, [ 3179] = 0x255D5, [ 3180] = 0x4935, [ 3181] = 0x28A82, ++ [ 3182] = 0x716B, [ 3217] = 0x24943, [ 3218] = 0x20CFF, [ 3219] = 0x56A4, ++ [ 3220] = 0x2061A, [ 3221] = 0x20BEB, [ 3222] = 0x20CB8, [ 3223] = 0x5502, ++ [ 3224] = 0x79C4, [ 3225] = 0x217FA, [ 3226] = 0x7DFE, [ 3227] = 0x216C2, ++ [ 3228] = 0x24A50, [ 3229] = 0x21852, [ 3230] = 0x452E, [ 3231] = 0x9401, ++ [ 3232] = 0x370A, [ 3233] = 0x28AC0, [ 3234] = 0x249AD, [ 3235] = 0x59B0, ++ [ 3236] = 0x218BF, [ 3237] = 0x21883, [ 3238] = 0x27484, [ 3239] = 0x5AA1, ++ [ 3240] = 0x36E2, [ 3241] = 0x23D5B, [ 3242] = 0x36B0, [ 3243] = 0x925F, ++ [ 3244] = 0x5A79, [ 3245] = 0x28A81, [ 3246] = 0x21862, [ 3247] = 0x9374, ++ [ 3248] = 0x3CCD, [ 3249] = 0x20AB4, [ 3250] = 0x4A96, [ 3251] = 0x398A, ++ [ 3252] = 0x50F4, [ 3253] = 0x3D69, [ 3254] = 0x3D4C, [ 3255] = 0x2139C, ++ [ 3256] = 0x7175, [ 3257] = 0x42FB, [ 3258] = 0x28218, [ 3259] = 0x6E0F, ++ [ 3260] = 0x290E4, [ 3261] = 0x44EB, [ 3262] = 0x6D57, [ 3263] = 0x27E4F, ++ [ 3264] = 0x7067, [ 3265] = 0x6CAF, [ 3266] = 0x3CD6, [ 3267] = 0x23FED, ++ [ 3268] = 0x23E2D, [ 3269] = 0x6E02, [ 3270] = 0x6F0C, [ 3271] = 0x3D6F, ++ [ 3272] = 0x203F5, [ 3273] = 0x7551, [ 3274] = 0x36BC, [ 3275] = 0x34C8, ++ [ 3276] = 0x4680, [ 3277] = 0x3EDA, [ 3278] = 0x4871, [ 3279] = 0x59C4, ++ [ 3280] = 0x926E, [ 3281] = 0x493E, [ 3282] = 0x8F41, [ 3283] = 0x28C1C, ++ [ 3284] = 0x26BC0, [ 3285] = 0x5812, [ 3286] = 0x57C8, [ 3287] = 0x36D6, ++ [ 3288] = 0x21452, [ 3289] = 0x70FE, [ 3290] = 0x24362, [ 3291] = 0x24A71, ++ [ 3292] = 0x22FE3, [ 3293] = 0x212B0, [ 3294] = 0x223BD, [ 3295] = 0x68B9, ++ [ 3296] = 0x6967, [ 3297] = 0x21398, [ 3298] = 0x234E5, [ 3299] = 0x27BF4, ++ [ 3300] = 0x236DF, [ 3301] = 0x28A83, [ 3302] = 0x237D6, [ 3303] = 0x233FA, ++ [ 3304] = 0x24C9F, [ 3305] = 0x6A1A, [ 3306] = 0x236AD, [ 3307] = 0x26CB7, ++ [ 3308] = 0x843E, [ 3309] = 0x44DF, [ 3310] = 0x44CE, [ 3315] = 0x26D26, ++ [ 3316] = 0x26D51, [ 3317] = 0x26C82, [ 3318] = 0x26FDE, [ 3319] = 0x6F17, ++ [ 3320] = 0x27109, [ 3321] = 0x833D, [ 3322] = 0x2173A, [ 3323] = 0x83ED, ++ [ 3324] = 0x26C80, [ 3325] = 0x27053, [ 3326] = 0x217DB, [ 3327] = 0x5989, ++ [ 3328] = 0x5A82, [ 3329] = 0x217B3, [ 3330] = 0x5A61, [ 3331] = 0x5A71, ++ [ 3332] = 0x21905, [ 3333] = 0x241FC, [ 3334] = 0x372D, [ 3335] = 0x59EF, ++ [ 3336] = 0x2173C, [ 3337] = 0x36C7, [ 3338] = 0x718E, [ 3339] = 0x9390, ++ [ 3340] = 0x669A, [ 3341] = 0x242A5, [ 3342] = 0x5A6E, [ 3343] = 0x5A2B, ++ [ 3344] = 0x24293, [ 3345] = 0x6A2B, [ 3346] = 0x23EF9, [ 3347] = 0x27736, ++ [ 3348] = 0x2445B, [ 3349] = 0x242CA, [ 3350] = 0x711D, [ 3351] = 0x24259, ++ [ 3352] = 0x289E1, [ 3353] = 0x4FB0, [ 3354] = 0x26D28, [ 3355] = 0x5CC2, ++ [ 3356] = 0x244CE, [ 3357] = 0x27E4D, [ 3358] = 0x243BD, [ 3359] = 0x6A0C, ++ [ 3360] = 0x24256, [ 3361] = 0x21304, [ 3362] = 0x70A6, [ 3363] = 0x7133, ++ [ 3364] = 0x243E9, [ 3365] = 0x3DA5, [ 3366] = 0x6CDF, [ 3367] = 0x2F825, ++ [ 3368] = 0x24A4F, [ 3369] = 0x7E65, [ 3370] = 0x59EB, [ 3371] = 0x5D2F, ++ [ 3372] = 0x3DF3, [ 3373] = 0x5F5C, [ 3374] = 0x24A5D, [ 3375] = 0x217DF, ++ [ 3376] = 0x7DA4, [ 3377] = 0x8426, [ 3412] = 0x5485, [ 3413] = 0x23AFA, ++ [ 3414] = 0x23300, [ 3415] = 0x20214, [ 3416] = 0x577E, [ 3417] = 0x208D5, ++ [ 3418] = 0x20619, [ 3419] = 0x3FE5, [ 3420] = 0x21F9E, [ 3421] = 0x2A2B6, ++ [ 3422] = 0x7003, [ 3423] = 0x2915B, [ 3424] = 0x5D70, [ 3425] = 0x738F, ++ [ 3426] = 0x7CD3, [ 3427] = 0x28A59, [ 3428] = 0x29420, [ 3429] = 0x4FC8, ++ [ 3430] = 0x7FE7, [ 3431] = 0x72CD, [ 3432] = 0x7310, [ 3433] = 0x27AF4, ++ [ 3434] = 0x7338, [ 3435] = 0x7339, [ 3436] = 0x256F6, [ 3437] = 0x7341, ++ [ 3438] = 0x7348, [ 3439] = 0x3EA9, [ 3440] = 0x27B18, [ 3441] = 0x906C, ++ [ 3442] = 0x71F5, [ 3443] = 0x248F2, [ 3444] = 0x73E1, [ 3445] = 0x81F6, ++ [ 3446] = 0x3ECA, [ 3447] = 0x770C, [ 3448] = 0x3ED1, [ 3449] = 0x6CA2, ++ [ 3450] = 0x56FD, [ 3451] = 0x7419, [ 3452] = 0x741E, [ 3453] = 0x741F, ++ [ 3454] = 0x3EE2, [ 3455] = 0x3EF0, [ 3456] = 0x3EF4, [ 3457] = 0x3EFA, ++ [ 3458] = 0x74D3, [ 3459] = 0x3F0E, [ 3460] = 0x3F53, [ 3461] = 0x7542, ++ [ 3462] = 0x756D, [ 3463] = 0x7572, [ 3464] = 0x758D, [ 3465] = 0x3F7C, ++ [ 3466] = 0x75C8, [ 3467] = 0x75DC, [ 3468] = 0x3FC0, [ 3469] = 0x764D, ++ [ 3470] = 0x3FD7, [ 3471] = 0x7674, [ 3472] = 0x3FDC, [ 3473] = 0x767A, ++ [ 3474] = 0x24F5C, [ 3475] = 0x7188, [ 3476] = 0x5623, [ 3477] = 0x8980, ++ [ 3478] = 0x5869, [ 3479] = 0x401D, [ 3480] = 0x7743, [ 3481] = 0x4039, ++ [ 3482] = 0x6761, [ 3483] = 0x4045, [ 3484] = 0x35DB, [ 3485] = 0x7798, ++ [ 3486] = 0x406A, [ 3487] = 0x406F, [ 3488] = 0x5C5E, [ 3489] = 0x77BE, ++ [ 3490] = 0x77CB, [ 3491] = 0x58F2, [ 3492] = 0x7818, [ 3493] = 0x70B9, ++ [ 3494] = 0x781C, [ 3495] = 0x40A8, [ 3496] = 0x7839, [ 3497] = 0x7847, ++ [ 3498] = 0x7851, [ 3499] = 0x7866, [ 3500] = 0x8448, [ 3501] = 0x25535, ++ [ 3502] = 0x7933, [ 3503] = 0x6803, [ 3504] = 0x7932, [ 3505] = 0x4103, ++ [ 3510] = 0x4109, [ 3511] = 0x7991, [ 3512] = 0x7999, [ 3513] = 0x8FBB, ++ [ 3514] = 0x7A06, [ 3515] = 0x8FBC, [ 3516] = 0x4167, [ 3517] = 0x7A91, ++ [ 3518] = 0x41B2, [ 3519] = 0x7ABC, [ 3520] = 0x8279, [ 3521] = 0x41C4, ++ [ 3522] = 0x7ACF, [ 3523] = 0x7ADB, [ 3524] = 0x41CF, [ 3525] = 0x4E21, ++ [ 3526] = 0x7B62, [ 3527] = 0x7B6C, [ 3528] = 0x7B7B, [ 3529] = 0x7C12, ++ [ 3530] = 0x7C1B, [ 3531] = 0x4260, [ 3532] = 0x427A, [ 3533] = 0x7C7B, ++ [ 3534] = 0x7C9C, [ 3535] = 0x428C, [ 3536] = 0x7CB8, [ 3537] = 0x4294, ++ [ 3538] = 0x7CED, [ 3539] = 0x8F93, [ 3540] = 0x70C0, [ 3541] = 0x20CCF, ++ [ 3542] = 0x7DCF, [ 3543] = 0x7DD4, [ 3544] = 0x7DD0, [ 3545] = 0x7DFD, ++ [ 3546] = 0x7FAE, [ 3547] = 0x7FB4, [ 3548] = 0x729F, [ 3549] = 0x4397, ++ [ 3550] = 0x8020, [ 3551] = 0x8025, [ 3552] = 0x7B39, [ 3553] = 0x802E, ++ [ 3554] = 0x8031, [ 3555] = 0x8054, [ 3556] = 0x3DCC, [ 3557] = 0x57B4, ++ [ 3558] = 0x70A0, [ 3559] = 0x80B7, [ 3560] = 0x80E9, [ 3561] = 0x43ED, ++ [ 3562] = 0x810C, [ 3563] = 0x732A, [ 3564] = 0x810E, [ 3565] = 0x8112, ++ [ 3566] = 0x7560, [ 3567] = 0x8114, [ 3568] = 0x4401, [ 3569] = 0x3B39, ++ [ 3570] = 0x8156, [ 3571] = 0x8159, [ 3572] = 0x815A, [ 3607] = 0x4413, ++ [ 3608] = 0x583A, [ 3609] = 0x817C, [ 3610] = 0x8184, [ 3611] = 0x4425, ++ [ 3612] = 0x8193, [ 3613] = 0x442D, [ 3614] = 0x81A5, [ 3615] = 0x57EF, ++ [ 3616] = 0x81C1, [ 3617] = 0x81E4, [ 3618] = 0x8254, [ 3619] = 0x448F, ++ [ 3620] = 0x82A6, [ 3621] = 0x8276, [ 3622] = 0x82CA, [ 3623] = 0x82D8, ++ [ 3624] = 0x82FF, [ 3625] = 0x44B0, [ 3626] = 0x8357, [ 3627] = 0x9669, ++ [ 3628] = 0x698A, [ 3629] = 0x8405, [ 3630] = 0x70F5, [ 3631] = 0x8464, ++ [ 3632] = 0x60E3, [ 3633] = 0x8488, [ 3634] = 0x4504, [ 3635] = 0x84BE, ++ [ 3636] = 0x84E1, [ 3637] = 0x84F8, [ 3638] = 0x8510, [ 3639] = 0x8538, ++ [ 3640] = 0x8552, [ 3641] = 0x453B, [ 3642] = 0x856F, [ 3643] = 0x8570, ++ [ 3644] = 0x85E0, [ 3645] = 0x4577, [ 3646] = 0x8672, [ 3647] = 0x8692, ++ [ 3648] = 0x86B2, [ 3649] = 0x86EF, [ 3650] = 0x9645, [ 3651] = 0x878B, ++ [ 3652] = 0x4606, [ 3653] = 0x4617, [ 3654] = 0x88AE, [ 3655] = 0x88FF, ++ [ 3656] = 0x8924, [ 3657] = 0x8947, [ 3658] = 0x8991, [ 3659] = 0x27967, ++ [ 3660] = 0x8A29, [ 3661] = 0x8A38, [ 3662] = 0x8A94, [ 3663] = 0x8AB4, ++ [ 3664] = 0x8C51, [ 3665] = 0x8CD4, [ 3666] = 0x8CF2, [ 3667] = 0x8D1C, ++ [ 3668] = 0x4798, [ 3669] = 0x585F, [ 3670] = 0x8DC3, [ 3671] = 0x47ED, ++ [ 3672] = 0x4EEE, [ 3673] = 0x8E3A, [ 3674] = 0x55D8, [ 3675] = 0x5754, ++ [ 3676] = 0x8E71, [ 3677] = 0x55F5, [ 3678] = 0x8EB0, [ 3679] = 0x4837, ++ [ 3680] = 0x8ECE, [ 3681] = 0x8EE2, [ 3682] = 0x8EE4, [ 3683] = 0x8EED, ++ [ 3684] = 0x8EF2, [ 3685] = 0x8FB7, [ 3686] = 0x8FC1, [ 3687] = 0x8FCA, ++ [ 3688] = 0x8FCC, [ 3689] = 0x9033, [ 3690] = 0x99C4, [ 3691] = 0x48AD, ++ [ 3692] = 0x98E0, [ 3693] = 0x9213, [ 3694] = 0x491E, [ 3695] = 0x9228, ++ [ 3696] = 0x9258, [ 3697] = 0x926B, [ 3698] = 0x92B1, [ 3699] = 0x92AE, ++ [ 3700] = 0x92BF, [ 3705] = 0x92E3, [ 3706] = 0x92EB, [ 3707] = 0x92F3, ++ [ 3708] = 0x92F4, [ 3709] = 0x92FD, [ 3710] = 0x9343, [ 3711] = 0x9384, ++ [ 3712] = 0x93AD, [ 3713] = 0x4945, [ 3714] = 0x4951, [ 3715] = 0x9EBF, ++ [ 3716] = 0x9417, [ 3717] = 0x5301, [ 3718] = 0x941D, [ 3719] = 0x942D, ++ [ 3720] = 0x943E, [ 3721] = 0x496A, [ 3722] = 0x9454, [ 3723] = 0x9479, ++ [ 3724] = 0x952D, [ 3725] = 0x95A2, [ 3726] = 0x49A7, [ 3727] = 0x95F4, ++ [ 3728] = 0x9633, [ 3729] = 0x49E5, [ 3730] = 0x67A0, [ 3731] = 0x4A24, ++ [ 3732] = 0x9740, [ 3733] = 0x4A35, [ 3734] = 0x97B2, [ 3735] = 0x97C2, ++ [ 3736] = 0x5654, [ 3737] = 0x4AE4, [ 3738] = 0x60E8, [ 3739] = 0x98B9, ++ [ 3740] = 0x4B19, [ 3741] = 0x98F1, [ 3742] = 0x5844, [ 3743] = 0x990E, ++ [ 3744] = 0x9919, [ 3745] = 0x51B4, [ 3746] = 0x991C, [ 3747] = 0x9937, ++ [ 3748] = 0x9942, [ 3749] = 0x995D, [ 3750] = 0x9962, [ 3751] = 0x4B70, ++ [ 3752] = 0x99C5, [ 3753] = 0x4B9D, [ 3754] = 0x9A3C, [ 3755] = 0x9B0F, ++ [ 3756] = 0x7A83, [ 3757] = 0x9B69, [ 3758] = 0x9B81, [ 3759] = 0x9BDD, ++ [ 3760] = 0x9BF1, [ 3761] = 0x9BF4, [ 3762] = 0x4C6D, [ 3763] = 0x9C20, ++ [ 3764] = 0x376F, [ 3765] = 0x21BC2, [ 3766] = 0x9D49, [ 3767] = 0x9C3A, ++ [ 3802] = 0x9EFE, [ 3803] = 0x5650, [ 3804] = 0x9D93, [ 3805] = 0x9DBD, ++ [ 3806] = 0x9DC0, [ 3807] = 0x9DFC, [ 3808] = 0x94F6, [ 3809] = 0x8FB6, ++ [ 3810] = 0x9E7B, [ 3811] = 0x9EAC, [ 3812] = 0x9EB1, [ 3813] = 0x9EBD, ++ [ 3814] = 0x9EC6, [ 3815] = 0x94DC, [ 3816] = 0x9EE2, [ 3817] = 0x9EF1, ++ [ 3818] = 0x9EF8, [ 3819] = 0x7AC8, [ 3820] = 0x9F44, [ 3821] = 0x20094, ++ [ 3822] = 0x202B7, [ 3823] = 0x203A0, [ 3824] = 0x691A, [ 3825] = 0x94C3, ++ [ 3826] = 0x59AC, [ 3827] = 0x204D7, [ 3828] = 0x5840, [ 3829] = 0x94C1, ++ [ 3830] = 0x37B9, [ 3831] = 0x205D5, [ 3832] = 0x20615, [ 3833] = 0x20676, ++ [ 3834] = 0x216BA, [ 3835] = 0x5757, [ 3836] = 0x7173, [ 3837] = 0x20AC2, ++ [ 3838] = 0x20ACD, [ 3839] = 0x20BBF, [ 3840] = 0x546A, [ 3841] = 0x2F83B, ++ [ 3842] = 0x20BCB, [ 3843] = 0x549E, [ 3844] = 0x20BFB, [ 3845] = 0x20C3B, ++ [ 3846] = 0x20C53, [ 3847] = 0x20C65, [ 3848] = 0x20C7C, [ 3849] = 0x60E7, ++ [ 3850] = 0x20C8D, [ 3851] = 0x567A, [ 3852] = 0x20CB5, [ 3853] = 0x20CDD, ++ [ 3854] = 0x20CED, [ 3855] = 0x20D6F, [ 3856] = 0x20DB2, [ 3857] = 0x20DC8, ++ [ 3858] = 0x6955, [ 3859] = 0x9C2F, [ 3860] = 0x87A5, [ 3861] = 0x20E04, ++ [ 3862] = 0x20E0E, [ 3863] = 0x20ED7, [ 3864] = 0x20F90, [ 3865] = 0x20F2D, ++ [ 3866] = 0x20E73, [ 3867] = 0x5C20, [ 3868] = 0x20FBC, [ 3869] = 0x5E0B, ++ [ 3870] = 0x2105C, [ 3871] = 0x2104F, [ 3872] = 0x21076, [ 3873] = 0x671E, ++ [ 3874] = 0x2107B, [ 3875] = 0x21088, [ 3876] = 0x21096, [ 3877] = 0x3647, ++ [ 3878] = 0x210BF, [ 3879] = 0x210D3, [ 3880] = 0x2112F, [ 3881] = 0x2113B, ++ [ 3882] = 0x5364, [ 3883] = 0x84AD, [ 3884] = 0x212E3, [ 3885] = 0x21375, ++ [ 3886] = 0x21336, [ 3887] = 0x8B81, [ 3888] = 0x21577, [ 3889] = 0x21619, ++ [ 3890] = 0x217C3, [ 3891] = 0x217C7, [ 3892] = 0x4E78, [ 3893] = 0x70BB, ++ [ 3894] = 0x2182D, [ 3895] = 0x2196A, [ 3900] = 0x21A2D, [ 3901] = 0x21A45, ++ [ 3902] = 0x21C2A, [ 3903] = 0x21C70, [ 3904] = 0x21CAC, [ 3905] = 0x21EC8, ++ [ 3906] = 0x62C3, [ 3907] = 0x21ED5, [ 3908] = 0x21F15, [ 3909] = 0x7198, ++ [ 3910] = 0x6855, [ 3911] = 0x22045, [ 3912] = 0x69E9, [ 3913] = 0x36C8, ++ [ 3914] = 0x2227C, [ 3915] = 0x223D7, [ 3916] = 0x223FA, [ 3917] = 0x2272A, ++ [ 3918] = 0x22871, [ 3919] = 0x2294F, [ 3920] = 0x82FD, [ 3921] = 0x22967, ++ [ 3922] = 0x22993, [ 3923] = 0x22AD5, [ 3924] = 0x89A5, [ 3925] = 0x22AE8, ++ [ 3926] = 0x8FA0, [ 3927] = 0x22B0E, [ 3928] = 0x97B8, [ 3929] = 0x22B3F, ++ [ 3930] = 0x9847, [ 3931] = 0x9ABD, [ 3932] = 0x22C4C, [ 3934] = 0x22C88, ++ [ 3935] = 0x22CB7, [ 3936] = 0x25BE8, [ 3937] = 0x22D08, [ 3938] = 0x22D12, ++ [ 3939] = 0x22DB7, [ 3940] = 0x22D95, [ 3941] = 0x22E42, [ 3942] = 0x22F74, ++ [ 3943] = 0x22FCC, [ 3944] = 0x23033, [ 3945] = 0x23066, [ 3946] = 0x2331F, ++ [ 3947] = 0x233DE, [ 3948] = 0x5FB1, [ 3949] = 0x6648, [ 3950] = 0x66BF, ++ [ 3951] = 0x27A79, [ 3952] = 0x23567, [ 3953] = 0x235F3, [ 3955] = 0x249BA, ++ [ 3957] = 0x2361A, [ 3958] = 0x23716, [ 3960] = 0x20346, [ 3961] = 0x58B5, ++ [ 3962] = 0x670E, [ 3997] = 0x6918, [ 3998] = 0x23AA7, [ 3999] = 0x27657, ++ [ 4000] = 0x25FE2, [ 4001] = 0x23E11, [ 4002] = 0x23EB9, [ 4003] = 0x275FE, ++ [ 4004] = 0x2209A, [ 4005] = 0x48D0, [ 4006] = 0x4AB8, [ 4007] = 0x24119, ++ [ 4008] = 0x28A9A, [ 4009] = 0x242EE, [ 4010] = 0x2430D, [ 4011] = 0x2403B, ++ [ 4012] = 0x24334, [ 4013] = 0x24396, [ 4014] = 0x24A45, [ 4015] = 0x205CA, ++ [ 4016] = 0x51D2, [ 4017] = 0x20611, [ 4018] = 0x599F, [ 4019] = 0x21EA8, ++ [ 4020] = 0x3BBE, [ 4021] = 0x23CFF, [ 4022] = 0x24404, [ 4023] = 0x244D6, ++ [ 4024] = 0x5788, [ 4025] = 0x24674, [ 4026] = 0x399B, [ 4027] = 0x2472F, ++ [ 4028] = 0x285E8, [ 4029] = 0x299C9, [ 4030] = 0x3762, [ 4031] = 0x221C3, ++ [ 4032] = 0x8B5E, [ 4033] = 0x28B4E, [ 4035] = 0x24812, [ 4036] = 0x248FB, ++ [ 4037] = 0x24A15, [ 4038] = 0x7209, [ 4039] = 0x24AC0, [ 4040] = 0x20C78, ++ [ 4041] = 0x5965, [ 4042] = 0x24EA5, [ 4043] = 0x24F86, [ 4044] = 0x20779, ++ [ 4045] = 0x8EDA, [ 4046] = 0x2502C, [ 4047] = 0x528F, [ 4048] = 0x573F, ++ [ 4049] = 0x7171, [ 4050] = 0x25299, [ 4051] = 0x25419, [ 4052] = 0x23F4A, ++ [ 4053] = 0x24AA7, [ 4054] = 0x55BC, [ 4055] = 0x25446, [ 4056] = 0x2546E, ++ [ 4057] = 0x26B52, [ 4059] = 0x3473, [ 4060] = 0x2553F, [ 4061] = 0x27632, ++ [ 4062] = 0x2555E, [ 4063] = 0x4718, [ 4064] = 0x25562, [ 4065] = 0x25566, ++ [ 4066] = 0x257C7, [ 4067] = 0x2493F, [ 4068] = 0x2585D, [ 4069] = 0x5066, ++ [ 4070] = 0x34FB, [ 4071] = 0x233CC, [ 4073] = 0x25903, [ 4074] = 0x477C, ++ [ 4075] = 0x28948, [ 4076] = 0x25AAE, [ 4077] = 0x25B89, [ 4078] = 0x25C06, ++ [ 4079] = 0x21D90, [ 4080] = 0x57A1, [ 4081] = 0x7151, [ 4083] = 0x26102, ++ [ 4084] = 0x27C12, [ 4085] = 0x9056, [ 4086] = 0x261B2, [ 4087] = 0x24F9A, ++ [ 4088] = 0x8B62, [ 4089] = 0x26402, [ 4090] = 0x2644A, [ 4095] = 0x5D5B, ++ [ 4096] = 0x26BF7, [ 4098] = 0x26484, [ 4099] = 0x2191C, [ 4100] = 0x8AEA, ++ [ 4101] = 0x249F6, [ 4102] = 0x26488, [ 4103] = 0x23FEF, [ 4104] = 0x26512, ++ [ 4105] = 0x4BC0, [ 4106] = 0x265BF, [ 4107] = 0x266B5, [ 4108] = 0x2271B, ++ [ 4109] = 0x9465, [ 4110] = 0x257E1, [ 4111] = 0x6195, [ 4112] = 0x5A27, ++ [ 4113] = 0x2F8CD, [ 4115] = 0x56B9, [ 4116] = 0x24521, [ 4117] = 0x266FC, ++ [ 4118] = 0x4E6A, [ 4119] = 0x24934, [ 4120] = 0x9656, [ 4121] = 0x6D8F, ++ [ 4122] = 0x26CBD, [ 4123] = 0x3618, [ 4124] = 0x8977, [ 4125] = 0x26799, ++ [ 4126] = 0x2686E, [ 4127] = 0x26411, [ 4128] = 0x2685E, [ 4130] = 0x268C7, ++ [ 4131] = 0x7B42, [ 4132] = 0x290C0, [ 4133] = 0x20A11, [ 4134] = 0x26926, ++ [ 4136] = 0x26939, [ 4137] = 0x7A45, [ 4139] = 0x269FA, [ 4140] = 0x9A26, ++ [ 4141] = 0x26A2D, [ 4142] = 0x365F, [ 4143] = 0x26469, [ 4144] = 0x20021, ++ [ 4145] = 0x7983, [ 4146] = 0x26A34, [ 4147] = 0x26B5B, [ 4148] = 0x5D2C, ++ [ 4149] = 0x23519, [ 4151] = 0x26B9D, [ 4152] = 0x46D0, [ 4153] = 0x26CA4, ++ [ 4154] = 0x753B, [ 4155] = 0x8865, [ 4156] = 0x26DAE, [ 4157] = 0x58B6, ++ [ 4192] = 0x371C, [ 4193] = 0x2258D, [ 4194] = 0x2704B, [ 4195] = 0x271CD, ++ [ 4196] = 0x3C54, [ 4197] = 0x27280, [ 4198] = 0x27285, [ 4199] = 0x9281, ++ [ 4200] = 0x2217A, [ 4201] = 0x2728B, [ 4202] = 0x9330, [ 4203] = 0x272E6, ++ [ 4204] = 0x249D0, [ 4205] = 0x6C39, [ 4206] = 0x949F, [ 4207] = 0x27450, ++ [ 4208] = 0x20EF8, [ 4209] = 0x8827, [ 4210] = 0x88F5, [ 4211] = 0x22926, ++ [ 4212] = 0x28473, [ 4213] = 0x217B1, [ 4214] = 0x6EB8, [ 4215] = 0x24A2A, ++ [ 4216] = 0x21820, [ 4217] = 0x39A4, [ 4218] = 0x36B9, [ 4221] = 0x453F, ++ [ 4222] = 0x66B6, [ 4223] = 0x29CAD, [ 4224] = 0x298A4, [ 4225] = 0x8943, ++ [ 4226] = 0x277CC, [ 4227] = 0x27858, [ 4228] = 0x56D6, [ 4229] = 0x40DF, ++ [ 4230] = 0x2160A, [ 4231] = 0x39A1, [ 4232] = 0x2372F, [ 4233] = 0x280E8, ++ [ 4234] = 0x213C5, [ 4235] = 0x71AD, [ 4236] = 0x8366, [ 4237] = 0x279DD, ++ [ 4238] = 0x291A8, [ 4240] = 0x4CB7, [ 4241] = 0x270AF, [ 4242] = 0x289AB, ++ [ 4243] = 0x279FD, [ 4244] = 0x27A0A, [ 4245] = 0x27B0B, [ 4246] = 0x27D66, ++ [ 4247] = 0x2417A, [ 4248] = 0x7B43, [ 4249] = 0x797E, [ 4250] = 0x28009, ++ [ 4251] = 0x6FB5, [ 4252] = 0x2A2DF, [ 4253] = 0x6A03, [ 4254] = 0x28318, ++ [ 4255] = 0x53A2, [ 4256] = 0x26E07, [ 4257] = 0x93BF, [ 4258] = 0x6836, ++ [ 4259] = 0x975D, [ 4260] = 0x2816F, [ 4261] = 0x28023, [ 4262] = 0x269B5, ++ [ 4263] = 0x213ED, [ 4264] = 0x2322F, [ 4265] = 0x28048, [ 4266] = 0x5D85, ++ [ 4267] = 0x28C30, [ 4268] = 0x28083, [ 4269] = 0x5715, [ 4270] = 0x9823, ++ [ 4271] = 0x28949, [ 4272] = 0x5DAB, [ 4273] = 0x24988, [ 4274] = 0x65BE, ++ [ 4275] = 0x69D5, [ 4276] = 0x53D2, [ 4277] = 0x24AA5, [ 4278] = 0x23F81, ++ [ 4279] = 0x3C11, [ 4280] = 0x6736, [ 4281] = 0x28090, [ 4282] = 0x280F4, ++ [ 4283] = 0x2812E, [ 4284] = 0x21FA1, [ 4285] = 0x2814F, [ 4290] = 0x28189, ++ [ 4291] = 0x281AF, [ 4292] = 0x2821A, [ 4293] = 0x28306, [ 4294] = 0x2832F, ++ [ 4295] = 0x2838A, [ 4296] = 0x35CA, [ 4297] = 0x28468, [ 4298] = 0x286AA, ++ [ 4299] = 0x48FA, [ 4300] = 0x63E6, [ 4301] = 0x28956, [ 4302] = 0x7808, ++ [ 4303] = 0x9255, [ 4304] = 0x289B8, [ 4305] = 0x43F2, [ 4306] = 0x289E7, ++ [ 4307] = 0x43DF, [ 4308] = 0x289E8, [ 4309] = 0x28B46, [ 4310] = 0x28BD4, ++ [ 4311] = 0x59F8, [ 4312] = 0x28C09, [ 4314] = 0x28FC5, [ 4315] = 0x290EC, ++ [ 4317] = 0x29110, [ 4318] = 0x2913C, [ 4319] = 0x3DF7, [ 4320] = 0x2915E, ++ [ 4321] = 0x24ACA, [ 4322] = 0x8FD0, [ 4323] = 0x728F, [ 4324] = 0x568B, ++ [ 4325] = 0x294E7, [ 4326] = 0x295E9, [ 4327] = 0x295B0, [ 4328] = 0x295B8, ++ [ 4329] = 0x29732, [ 4330] = 0x298D1, [ 4331] = 0x29949, [ 4332] = 0x2996A, ++ [ 4333] = 0x299C3, [ 4334] = 0x29A28, [ 4335] = 0x29B0E, [ 4336] = 0x29D5A, ++ [ 4337] = 0x29D9B, [ 4338] = 0x7E9F, [ 4339] = 0x29EF8, [ 4340] = 0x29F23, ++ [ 4341] = 0x4CA4, [ 4342] = 0x9547, [ 4343] = 0x2A293, [ 4344] = 0x71A2, ++ [ 4345] = 0x2A2FF, [ 4346] = 0x4D91, [ 4347] = 0x9012, [ 4348] = 0x2A5CB, ++ [ 4349] = 0x4D9C, [ 4350] = 0x20C9C, [ 4351] = 0x8FBE, [ 4352] = 0x55C1, ++ [ 4387] = 0x8FBA, [ 4388] = 0x224B0, [ 4389] = 0x8FB9, [ 4390] = 0x24A93, ++ [ 4391] = 0x4509, [ 4392] = 0x7E7F, [ 4393] = 0x6F56, [ 4394] = 0x6AB1, ++ [ 4395] = 0x4EEA, [ 4396] = 0x34E4, [ 4397] = 0x28B2C, [ 4398] = 0x2789D, ++ [ 4399] = 0x373A, [ 4400] = 0x8E80, [ 4401] = 0x217F5, [ 4402] = 0x28024, ++ [ 4403] = 0x28B6C, [ 4404] = 0x28B99, [ 4405] = 0x27A3E, [ 4406] = 0x266AF, ++ [ 4407] = 0x3DEB, [ 4408] = 0x27655, [ 4409] = 0x23CB7, [ 4410] = 0x25635, ++ [ 4411] = 0x25956, [ 4412] = 0x4E9A, [ 4413] = 0x25E81, [ 4414] = 0x26258, ++ [ 4415] = 0x56BF, [ 4416] = 0x20E6D, [ 4417] = 0x8E0E, [ 4418] = 0x5B6D, ++ [ 4419] = 0x23E88, [ 4420] = 0x24C9E, [ 4421] = 0x63DE, [ 4423] = 0x217F6, ++ [ 4424] = 0x2187B, [ 4425] = 0x6530, [ 4426] = 0x562D, [ 4427] = 0x25C4A, ++ [ 4428] = 0x541A, [ 4429] = 0x25311, [ 4430] = 0x3DC6, [ 4431] = 0x29D98, ++ [ 4432] = 0x4C7D, [ 4433] = 0x5622, [ 4434] = 0x561E, [ 4435] = 0x7F49, ++ [ 4436] = 0x25ED8, [ 4437] = 0x5975, [ 4438] = 0x23D40, [ 4439] = 0x8770, ++ [ 4440] = 0x4E1C, [ 4441] = 0x20FEA, [ 4442] = 0x20D49, [ 4443] = 0x236BA, ++ [ 4444] = 0x8117, [ 4445] = 0x9D5E, [ 4446] = 0x8D18, [ 4447] = 0x763B, ++ [ 4448] = 0x9C45, [ 4449] = 0x764E, [ 4450] = 0x77B9, [ 4451] = 0x9345, ++ [ 4452] = 0x5432, [ 4453] = 0x8148, [ 4454] = 0x82F7, [ 4455] = 0x5625, ++ [ 4456] = 0x8132, [ 4457] = 0x8418, [ 4458] = 0x80BD, [ 4459] = 0x55EA, ++ [ 4460] = 0x7962, [ 4461] = 0x5643, [ 4462] = 0x5416, [ 4463] = 0x20E9D, ++ [ 4464] = 0x35CE, [ 4465] = 0x5605, [ 4466] = 0x55F1, [ 4467] = 0x66F1, ++ [ 4468] = 0x282E2, [ 4469] = 0x362D, [ 4470] = 0x7534, [ 4471] = 0x55F0, ++ [ 4472] = 0x55BA, [ 4473] = 0x5497, [ 4474] = 0x5572, [ 4475] = 0x20C41, ++ [ 4476] = 0x20C96, [ 4477] = 0x5ED0, [ 4478] = 0x25148, [ 4479] = 0x20E76, ++ [ 4480] = 0x22C62, [ 4485] = 0x20EA2, [ 4486] = 0x9EAB, [ 4487] = 0x7D5A, ++ [ 4488] = 0x55DE, [ 4489] = 0x21075, [ 4490] = 0x629D, [ 4491] = 0x976D, ++ [ 4492] = 0x5494, [ 4493] = 0x8CCD, [ 4494] = 0x71F6, [ 4495] = 0x9176, ++ [ 4496] = 0x63FC, [ 4497] = 0x63B9, [ 4498] = 0x63FE, [ 4499] = 0x5569, ++ [ 4500] = 0x22B43, [ 4501] = 0x9C72, [ 4502] = 0x22EB3, [ 4503] = 0x519A, ++ [ 4504] = 0x34DF, [ 4505] = 0x20DA7, [ 4506] = 0x51A7, [ 4507] = 0x544D, ++ [ 4508] = 0x551E, [ 4509] = 0x5513, [ 4510] = 0x7666, [ 4511] = 0x8E2D, ++ [ 4512] = 0x2688A, [ 4513] = 0x75B1, [ 4514] = 0x80B6, [ 4515] = 0x8804, ++ [ 4516] = 0x8786, [ 4517] = 0x88C7, [ 4518] = 0x81B6, [ 4519] = 0x841C, ++ [ 4520] = 0x210C1, [ 4521] = 0x44EC, [ 4522] = 0x7304, [ 4523] = 0x24706, ++ [ 4524] = 0x5B90, [ 4525] = 0x830B, [ 4526] = 0x26893, [ 4527] = 0x567B, ++ [ 4528] = 0x226F4, [ 4529] = 0x27D2F, [ 4530] = 0x241A3, [ 4531] = 0x27D73, ++ [ 4532] = 0x26ED0, [ 4533] = 0x272B6, [ 4534] = 0x9170, [ 4535] = 0x211D9, ++ [ 4536] = 0x9208, [ 4537] = 0x23CFC, [ 4538] = 0x2A6A9, [ 4539] = 0x20EAC, ++ [ 4540] = 0x20EF9, [ 4541] = 0x7266, [ 4542] = 0x21CA2, [ 4543] = 0x474E, ++ [ 4544] = 0x24FC2, [ 4545] = 0x27FF9, [ 4546] = 0x20FEB, [ 4547] = 0x40FA, ++ [ 4582] = 0x9C5D, [ 4583] = 0x651F, [ 4584] = 0x22DA0, [ 4585] = 0x48F3, ++ [ 4586] = 0x247E0, [ 4587] = 0x29D7C, [ 4588] = 0x20FEC, [ 4589] = 0x20E0A, ++ [ 4591] = 0x275A3, [ 4592] = 0x20FED, [ 4594] = 0x26048, [ 4595] = 0x21187, ++ [ 4596] = 0x71A3, [ 4597] = 0x7E8E, [ 4598] = 0x9D50, [ 4599] = 0x4E1A, ++ [ 4600] = 0x4E04, [ 4601] = 0x3577, [ 4602] = 0x5B0D, [ 4603] = 0x6CB2, ++ [ 4604] = 0x5367, [ 4605] = 0x36AC, [ 4606] = 0x39DC, [ 4607] = 0x537D, ++ [ 4608] = 0x36A5, [ 4609] = 0x24618, [ 4610] = 0x589A, [ 4611] = 0x24B6E, ++ [ 4612] = 0x822D, [ 4613] = 0x544B, [ 4614] = 0x57AA, [ 4615] = 0x25A95, ++ [ 4616] = 0x20979, [ 4618] = 0x3A52, [ 4619] = 0x22465, [ 4620] = 0x7374, ++ [ 4621] = 0x29EAC, [ 4622] = 0x4D09, [ 4623] = 0x9BED, [ 4624] = 0x23CFE, ++ [ 4625] = 0x29F30, [ 4626] = 0x4C5B, [ 4627] = 0x24FA9, [ 4628] = 0x2959E, ++ [ 4629] = 0x29FDE, [ 4630] = 0x845C, [ 4631] = 0x23DB6, [ 4632] = 0x272B2, ++ [ 4633] = 0x267B3, [ 4634] = 0x23720, [ 4635] = 0x632E, [ 4636] = 0x7D25, ++ [ 4637] = 0x23EF7, [ 4638] = 0x23E2C, [ 4639] = 0x3A2A, [ 4640] = 0x9008, ++ [ 4641] = 0x52CC, [ 4642] = 0x3E74, [ 4643] = 0x367A, [ 4644] = 0x45E9, ++ [ 4645] = 0x2048E, [ 4646] = 0x7640, [ 4647] = 0x5AF0, [ 4648] = 0x20EB6, ++ [ 4649] = 0x787A, [ 4650] = 0x27F2E, [ 4651] = 0x58A7, [ 4652] = 0x40BF, ++ [ 4653] = 0x567C, [ 4654] = 0x9B8B, [ 4655] = 0x5D74, [ 4656] = 0x7654, ++ [ 4657] = 0x2A434, [ 4658] = 0x9E85, [ 4659] = 0x4CE1, [ 4661] = 0x37FB, ++ [ 4662] = 0x6119, [ 4663] = 0x230DA, [ 4664] = 0x243F2, [ 4666] = 0x565D, ++ [ 4667] = 0x212A9, [ 4668] = 0x57A7, [ 4669] = 0x24963, [ 4670] = 0x29E06, ++ [ 4671] = 0x5234, [ 4672] = 0x270AE, [ 4673] = 0x35AD, [ 4675] = 0x9D7C, ++ [ 4680] = 0x7C56, [ 4681] = 0x9B39, [ 4682] = 0x57DE, [ 4683] = 0x2176C, ++ [ 4684] = 0x5C53, [ 4685] = 0x64D3, [ 4686] = 0x294D0, [ 4687] = 0x26335, ++ [ 4688] = 0x27164, [ 4689] = 0x86AD, [ 4690] = 0x20D28, [ 4691] = 0x26D22, ++ [ 4692] = 0x24AE2, [ 4693] = 0x20D71, [ 4695] = 0x51FE, [ 4696] = 0x21F0F, ++ [ 4697] = 0x5D8E, [ 4698] = 0x9703, [ 4699] = 0x21DD1, [ 4700] = 0x9E81, ++ [ 4701] = 0x904C, [ 4702] = 0x7B1F, [ 4703] = 0x9B02, [ 4704] = 0x5CD1, ++ [ 4705] = 0x7BA3, [ 4706] = 0x6268, [ 4707] = 0x6335, [ 4708] = 0x9AFF, ++ [ 4709] = 0x7BCF, [ 4710] = 0x9B2A, [ 4711] = 0x7C7E, [ 4713] = 0x7C42, ++ [ 4714] = 0x7C86, [ 4715] = 0x9C15, [ 4716] = 0x7BFC, [ 4717] = 0x9B09, ++ [ 4719] = 0x9C1B, [ 4720] = 0x2493E, [ 4721] = 0x9F5A, [ 4722] = 0x5573, ++ [ 4723] = 0x5BC3, [ 4724] = 0x4FFD, [ 4725] = 0x9E98, [ 4726] = 0x4FF2, ++ [ 4727] = 0x5260, [ 4728] = 0x3E06, [ 4729] = 0x52D1, [ 4730] = 0x5767, ++ [ 4731] = 0x5056, [ 4732] = 0x59B7, [ 4733] = 0x5E12, [ 4734] = 0x97C8, ++ [ 4735] = 0x9DAB, [ 4736] = 0x8F5C, [ 4737] = 0x5469, [ 4738] = 0x97B4, ++ [ 4739] = 0x9940, [ 4740] = 0x97BA, [ 4741] = 0x532C, [ 4742] = 0x6130, ++ [ 4777] = 0x692C, [ 4778] = 0x53DA, [ 4779] = 0x9C0A, [ 4780] = 0x9D02, ++ [ 4781] = 0x4C3B, [ 4782] = 0x9641, [ 4783] = 0x6980, [ 4784] = 0x50A6, ++ [ 4785] = 0x7546, [ 4786] = 0x2176D, [ 4787] = 0x99DA, [ 4788] = 0x5273, ++ [ 4790] = 0x9159, [ 4791] = 0x9681, [ 4792] = 0x915C, [ 4794] = 0x9151, ++ [ 4795] = 0x28E97, [ 4796] = 0x637F, [ 4797] = 0x26D23, [ 4798] = 0x6ACA, ++ [ 4799] = 0x5611, [ 4800] = 0x918E, [ 4801] = 0x757A, [ 4802] = 0x6285, ++ [ 4803] = 0x203FC, [ 4804] = 0x734F, [ 4805] = 0x7C70, [ 4806] = 0x25C21, ++ [ 4807] = 0x23CFD, [ 4809] = 0x24919, [ 4810] = 0x76D6, [ 4811] = 0x9B9D, ++ [ 4812] = 0x4E2A, [ 4813] = 0x20CD4, [ 4814] = 0x83BE, [ 4815] = 0x8842, ++ [ 4817] = 0x5C4A, [ 4818] = 0x69C0, [ 4820] = 0x577A, [ 4821] = 0x521F, ++ [ 4822] = 0x5DF5, [ 4823] = 0x4ECE, [ 4824] = 0x6C31, [ 4825] = 0x201F2, ++ [ 4826] = 0x4F39, [ 4827] = 0x549C, [ 4828] = 0x54DA, [ 4829] = 0x529A, ++ [ 4830] = 0x8D82, [ 4831] = 0x35FE, [ 4833] = 0x35F3, [ 4835] = 0x6B52, ++ [ 4836] = 0x917C, [ 4837] = 0x9FA5, [ 4838] = 0x9B97, [ 4839] = 0x982E, ++ [ 4840] = 0x98B4, [ 4841] = 0x9ABA, [ 4842] = 0x9EA8, [ 4843] = 0x9E84, ++ [ 4844] = 0x717A, [ 4845] = 0x7B14, [ 4847] = 0x6BFA, [ 4848] = 0x8818, ++ [ 4849] = 0x7F78, [ 4851] = 0x5620, [ 4852] = 0x2A64A, [ 4853] = 0x8E77, ++ [ 4854] = 0x9F53, [ 4856] = 0x8DD4, [ 4857] = 0x8E4F, [ 4858] = 0x9E1C, ++ [ 4859] = 0x8E01, [ 4860] = 0x6282, [ 4861] = 0x2837D, [ 4862] = 0x8E28, ++ [ 4863] = 0x8E75, [ 4864] = 0x7AD3, [ 4865] = 0x24A77, [ 4866] = 0x7A3E, ++ [ 4867] = 0x78D8, [ 4868] = 0x6CEA, [ 4869] = 0x8A67, [ 4870] = 0x7607, ++ [ 4875] = 0x28A5A, [ 4876] = 0x9F26, [ 4877] = 0x6CCE, [ 4878] = 0x87D6, ++ [ 4879] = 0x75C3, [ 4880] = 0x2A2B2, [ 4881] = 0x7853, [ 4882] = 0x2F840, ++ [ 4883] = 0x8D0C, [ 4884] = 0x72E2, [ 4885] = 0x7371, [ 4886] = 0x8B2D, ++ [ 4887] = 0x7302, [ 4888] = 0x74F1, [ 4889] = 0x8CEB, [ 4890] = 0x24ABB, ++ [ 4891] = 0x862F, [ 4892] = 0x5FBA, [ 4893] = 0x88A0, [ 4894] = 0x44B7, ++ [ 4896] = 0x2183B, [ 4897] = 0x26E05, [ 4899] = 0x8A7E, [ 4900] = 0x2251B, ++ [ 4902] = 0x60FD, [ 4903] = 0x7667, [ 4904] = 0x9AD7, [ 4905] = 0x9D44, ++ [ 4906] = 0x936E, [ 4907] = 0x9B8F, [ 4908] = 0x87F5, [ 4911] = 0x8CF7, ++ [ 4912] = 0x732C, [ 4913] = 0x9721, [ 4914] = 0x9BB0, [ 4915] = 0x35D6, ++ [ 4916] = 0x72B2, [ 4917] = 0x4C07, [ 4918] = 0x7C51, [ 4919] = 0x994A, ++ [ 4920] = 0x26159, [ 4921] = 0x6159, [ 4922] = 0x4C04, [ 4923] = 0x9E96, ++ [ 4924] = 0x617D, [ 4926] = 0x575F, [ 4927] = 0x616F, [ 4928] = 0x62A6, ++ [ 4929] = 0x6239, [ 4931] = 0x3A5C, [ 4932] = 0x61E2, [ 4933] = 0x53AA, ++ [ 4934] = 0x233F5, [ 4935] = 0x6364, [ 4936] = 0x6802, [ 4937] = 0x35D2, ++ [ 4972] = 0x5D57, [ 4973] = 0x28BC2, [ 4974] = 0x8FDA, [ 4975] = 0x28E39, ++ [ 4977] = 0x50D9, [ 4978] = 0x21D46, [ 4979] = 0x7906, [ 4980] = 0x5332, ++ [ 4981] = 0x9638, [ 4982] = 0x20F3B, [ 4983] = 0x4065, [ 4985] = 0x77FE, ++ [ 4987] = 0x7CC2, [ 4988] = 0x25F1A, [ 4989] = 0x7CDA, [ 4990] = 0x7A2D, ++ [ 4991] = 0x8066, [ 4992] = 0x8063, [ 4993] = 0x7D4D, [ 4994] = 0x7505, ++ [ 4995] = 0x74F2, [ 4996] = 0x8994, [ 4997] = 0x821A, [ 4998] = 0x670C, ++ [ 4999] = 0x8062, [ 5000] = 0x27486, [ 5001] = 0x805B, [ 5002] = 0x74F0, ++ [ 5003] = 0x8103, [ 5004] = 0x7724, [ 5005] = 0x8989, [ 5006] = 0x267CC, ++ [ 5007] = 0x7553, [ 5008] = 0x26ED1, [ 5009] = 0x87A9, [ 5010] = 0x87CE, ++ [ 5011] = 0x81C8, [ 5012] = 0x878C, [ 5013] = 0x8A49, [ 5014] = 0x8CAD, ++ [ 5015] = 0x8B43, [ 5016] = 0x772B, [ 5017] = 0x74F8, [ 5018] = 0x84DA, ++ [ 5019] = 0x3635, [ 5020] = 0x69B2, [ 5021] = 0x8DA6, [ 5023] = 0x89A9, ++ [ 5025] = 0x6DB9, [ 5026] = 0x87C1, [ 5027] = 0x24011, [ 5028] = 0x74E7, ++ [ 5029] = 0x3DDB, [ 5030] = 0x7176, [ 5031] = 0x60A4, [ 5032] = 0x619C, ++ [ 5033] = 0x3CD1, [ 5035] = 0x6077, [ 5037] = 0x7F71, [ 5038] = 0x28B2D, ++ [ 5040] = 0x60E9, [ 5041] = 0x4B7E, [ 5042] = 0x5220, [ 5043] = 0x3C18, ++ [ 5044] = 0x23CC7, [ 5045] = 0x25ED7, [ 5046] = 0x27656, [ 5047] = 0x25531, ++ [ 5048] = 0x21944, [ 5049] = 0x212FE, [ 5050] = 0x29903, [ 5051] = 0x26DDC, ++ [ 5052] = 0x270AD, [ 5053] = 0x5CC1, [ 5054] = 0x261AD, [ 5055] = 0x28A0F, ++ [ 5056] = 0x23677, [ 5057] = 0x200EE, [ 5058] = 0x26846, [ 5059] = 0x24F0E, ++ [ 5060] = 0x4562, [ 5061] = 0x5B1F, [ 5062] = 0x2634C, [ 5063] = 0x9F50, ++ [ 5064] = 0x9EA6, [ 5065] = 0x2626B, [ 5070] = 0x3000, [ 5071] = 0xFF0C, ++ [ 5072] = 0x3001, [ 5073] = 0x3002, [ 5074] = 0xFF0E, [ 5075] = 0x2022, ++ [ 5076] = 0xFF1B, [ 5077] = 0xFF1A, [ 5078] = 0xFF1F, [ 5079] = 0xFF01, ++ [ 5080] = 0xFE30, [ 5081] = 0x2026, [ 5082] = 0x2025, [ 5083] = 0xFE50, ++ [ 5084] = 0xFF64, [ 5085] = 0xFE52, [ 5086] = 0x00B7, [ 5087] = 0xFE54, ++ [ 5088] = 0xFE55, [ 5089] = 0xFE56, [ 5090] = 0xFE57, [ 5091] = 0xFF5C, ++ [ 5092] = 0x2013, [ 5093] = 0xFE31, [ 5094] = 0x2014, [ 5095] = 0xFE33, ++ [ 5097] = 0xFE34, [ 5098] = 0xFE4F, [ 5099] = 0xFF08, [ 5100] = 0xFF09, ++ [ 5101] = 0xFE35, [ 5102] = 0xFE36, [ 5103] = 0xFF5B, [ 5104] = 0xFF5D, ++ [ 5105] = 0xFE37, [ 5106] = 0xFE38, [ 5107] = 0x3014, [ 5108] = 0x3015, ++ [ 5109] = 0xFE39, [ 5110] = 0xFE3A, [ 5111] = 0x3010, [ 5112] = 0x3011, ++ [ 5113] = 0xFE3B, [ 5114] = 0xFE3C, [ 5115] = 0x300A, [ 5116] = 0x300B, ++ [ 5117] = 0xFE3D, [ 5118] = 0xFE3E, [ 5119] = 0x3008, [ 5120] = 0x3009, ++ [ 5121] = 0xFE3F, [ 5122] = 0xFE40, [ 5123] = 0x300C, [ 5124] = 0x300D, ++ [ 5125] = 0xFE41, [ 5126] = 0xFE42, [ 5127] = 0x300E, [ 5128] = 0x300F, ++ [ 5129] = 0xFE43, [ 5130] = 0xFE44, [ 5131] = 0xFE59, [ 5132] = 0xFE5A, ++ [ 5167] = 0xFE5B, [ 5168] = 0xFE5C, [ 5169] = 0xFE5D, [ 5170] = 0xFE5E, ++ [ 5171] = 0x2018, [ 5172] = 0x2019, [ 5173] = 0x201C, [ 5174] = 0x201D, ++ [ 5175] = 0x301D, [ 5176] = 0x301E, [ 5177] = 0x2035, [ 5178] = 0x2032, ++ [ 5179] = 0xFF03, [ 5180] = 0xFF06, [ 5181] = 0xFF0A, [ 5182] = 0x203B, ++ [ 5183] = 0x00A7, [ 5184] = 0x3003, [ 5185] = 0x25CB, [ 5186] = 0x25CF, ++ [ 5187] = 0x25B3, [ 5188] = 0x25B2, [ 5189] = 0x25CE, [ 5190] = 0x2606, ++ [ 5191] = 0x2605, [ 5192] = 0x25C7, [ 5193] = 0x25C6, [ 5194] = 0x25A1, ++ [ 5195] = 0x25A0, [ 5196] = 0x25BD, [ 5197] = 0x25BC, [ 5198] = 0x32A3, ++ [ 5199] = 0x2105, [ 5200] = 0x203E, [ 5202] = 0xFF3F, [ 5204] = 0xFE49, ++ [ 5205] = 0xFE4A, [ 5206] = 0xFE4D, [ 5207] = 0xFE4E, [ 5208] = 0xFE4B, ++ [ 5209] = 0xFE4C, [ 5210] = 0xFE5F, [ 5211] = 0xFE60, [ 5212] = 0xFE61, ++ [ 5213] = 0xFF0B, [ 5214] = 0xFF0D, [ 5215] = 0x00D7, [ 5216] = 0x00F7, ++ [ 5217] = 0x00B1, [ 5218] = 0x221A, [ 5219] = 0xFF1C, [ 5220] = 0xFF1E, ++ [ 5221] = 0xFF1D, [ 5222] = 0x2266, [ 5223] = 0x2267, [ 5224] = 0x2260, ++ [ 5225] = 0x221E, [ 5226] = 0x2252, [ 5227] = 0x2261, [ 5228] = 0xFE62, ++ [ 5229] = 0xFE63, [ 5230] = 0xFE64, [ 5231] = 0xFE65, [ 5232] = 0xFE66, ++ [ 5233] = 0x223C, [ 5234] = 0x2229, [ 5235] = 0x222A, [ 5236] = 0x22A5, ++ [ 5237] = 0x2220, [ 5238] = 0x221F, [ 5239] = 0x22BF, [ 5240] = 0x33D2, ++ [ 5241] = 0x33D1, [ 5242] = 0x222B, [ 5243] = 0x222E, [ 5244] = 0x2235, ++ [ 5245] = 0x2234, [ 5246] = 0x2640, [ 5247] = 0x2642, [ 5248] = 0x2641, ++ [ 5249] = 0x2609, [ 5250] = 0x2191, [ 5251] = 0x2193, [ 5252] = 0x2190, ++ [ 5253] = 0x2192, [ 5254] = 0x2196, [ 5255] = 0x2197, [ 5256] = 0x2199, ++ [ 5257] = 0x2198, [ 5258] = 0x2225, [ 5259] = 0x2223, [ 5266] = 0xFF0F, ++ [ 5267] = 0xFF3C, [ 5268] = 0xFF04, [ 5269] = 0x00A5, [ 5270] = 0x3012, ++ [ 5271] = 0x00A2, [ 5272] = 0x00A3, [ 5273] = 0xFF05, [ 5274] = 0xFF20, ++ [ 5275] = 0x2103, [ 5276] = 0x2109, [ 5277] = 0xFE69, [ 5278] = 0xFE6A, ++ [ 5279] = 0xFE6B, [ 5280] = 0x33D5, [ 5281] = 0x339C, [ 5282] = 0x339D, ++ [ 5283] = 0x339E, [ 5284] = 0x33CE, [ 5285] = 0x33A1, [ 5286] = 0x338E, ++ [ 5287] = 0x338F, [ 5288] = 0x33C4, [ 5289] = 0x00B0, [ 5290] = 0x5159, ++ [ 5291] = 0x515B, [ 5292] = 0x515E, [ 5293] = 0x515D, [ 5294] = 0x5161, ++ [ 5295] = 0x5163, [ 5296] = 0x55E7, [ 5297] = 0x74E9, [ 5298] = 0x7CCE, ++ [ 5299] = 0x2581, [ 5300] = 0x2582, [ 5301] = 0x2583, [ 5302] = 0x2584, ++ [ 5303] = 0x2585, [ 5304] = 0x2586, [ 5305] = 0x2587, [ 5306] = 0x2588, ++ [ 5307] = 0x258F, [ 5308] = 0x258E, [ 5309] = 0x258D, [ 5310] = 0x258C, ++ [ 5311] = 0x258B, [ 5312] = 0x258A, [ 5313] = 0x2589, [ 5314] = 0x253C, ++ [ 5315] = 0x2534, [ 5316] = 0x252C, [ 5317] = 0x2524, [ 5318] = 0x251C, ++ [ 5319] = 0x2594, [ 5320] = 0x2500, [ 5321] = 0x2502, [ 5322] = 0x2595, ++ [ 5323] = 0x250C, [ 5324] = 0x2510, [ 5325] = 0x2514, [ 5326] = 0x2518, ++ [ 5327] = 0x256D, [ 5362] = 0x256E, [ 5363] = 0x2570, [ 5364] = 0x256F, ++ [ 5365] = 0x2550, [ 5366] = 0x255E, [ 5367] = 0x256A, [ 5368] = 0x2561, ++ [ 5369] = 0x25E2, [ 5370] = 0x25E3, [ 5371] = 0x25E5, [ 5372] = 0x25E4, ++ [ 5373] = 0x2571, [ 5374] = 0x2572, [ 5375] = 0x2573, [ 5376] = 0xFF10, ++ [ 5377] = 0xFF11, [ 5378] = 0xFF12, [ 5379] = 0xFF13, [ 5380] = 0xFF14, ++ [ 5381] = 0xFF15, [ 5382] = 0xFF16, [ 5383] = 0xFF17, [ 5384] = 0xFF18, ++ [ 5385] = 0xFF19, [ 5386] = 0x2160, [ 5387] = 0x2161, [ 5388] = 0x2162, ++ [ 5389] = 0x2163, [ 5390] = 0x2164, [ 5391] = 0x2165, [ 5392] = 0x2166, ++ [ 5393] = 0x2167, [ 5394] = 0x2168, [ 5395] = 0x2169, [ 5396] = 0x3021, ++ [ 5397] = 0x3022, [ 5398] = 0x3023, [ 5399] = 0x3024, [ 5400] = 0x3025, ++ [ 5401] = 0x3026, [ 5402] = 0x3027, [ 5403] = 0x3028, [ 5404] = 0x3029, ++ [ 5406] = 0x5344, [ 5408] = 0xFF21, [ 5409] = 0xFF22, [ 5410] = 0xFF23, ++ [ 5411] = 0xFF24, [ 5412] = 0xFF25, [ 5413] = 0xFF26, [ 5414] = 0xFF27, ++ [ 5415] = 0xFF28, [ 5416] = 0xFF29, [ 5417] = 0xFF2A, [ 5418] = 0xFF2B, ++ [ 5419] = 0xFF2C, [ 5420] = 0xFF2D, [ 5421] = 0xFF2E, [ 5422] = 0xFF2F, ++ [ 5423] = 0xFF30, [ 5424] = 0xFF31, [ 5425] = 0xFF32, [ 5426] = 0xFF33, ++ [ 5427] = 0xFF34, [ 5428] = 0xFF35, [ 5429] = 0xFF36, [ 5430] = 0xFF37, ++ [ 5431] = 0xFF38, [ 5432] = 0xFF39, [ 5433] = 0xFF3A, [ 5434] = 0xFF41, ++ [ 5435] = 0xFF42, [ 5436] = 0xFF43, [ 5437] = 0xFF44, [ 5438] = 0xFF45, ++ [ 5439] = 0xFF46, [ 5440] = 0xFF47, [ 5441] = 0xFF48, [ 5442] = 0xFF49, ++ [ 5443] = 0xFF4A, [ 5444] = 0xFF4B, [ 5445] = 0xFF4C, [ 5446] = 0xFF4D, ++ [ 5447] = 0xFF4E, [ 5448] = 0xFF4F, [ 5449] = 0xFF50, [ 5450] = 0xFF51, ++ [ 5451] = 0xFF52, [ 5452] = 0xFF53, [ 5453] = 0xFF54, [ 5454] = 0xFF55, ++ [ 5455] = 0xFF56, [ 5460] = 0xFF57, [ 5461] = 0xFF58, [ 5462] = 0xFF59, ++ [ 5463] = 0xFF5A, [ 5464] = 0x0391, [ 5465] = 0x0392, [ 5466] = 0x0393, ++ [ 5467] = 0x0394, [ 5468] = 0x0395, [ 5469] = 0x0396, [ 5470] = 0x0397, ++ [ 5471] = 0x0398, [ 5472] = 0x0399, [ 5473] = 0x039A, [ 5474] = 0x039B, ++ [ 5475] = 0x039C, [ 5476] = 0x039D, [ 5477] = 0x039E, [ 5478] = 0x039F, ++ [ 5479] = 0x03A0, [ 5480] = 0x03A1, [ 5481] = 0x03A3, [ 5482] = 0x03A4, ++ [ 5483] = 0x03A5, [ 5484] = 0x03A6, [ 5485] = 0x03A7, [ 5486] = 0x03A8, ++ [ 5487] = 0x03A9, [ 5488] = 0x03B1, [ 5489] = 0x03B2, [ 5490] = 0x03B3, ++ [ 5491] = 0x03B4, [ 5492] = 0x03B5, [ 5493] = 0x03B6, [ 5494] = 0x03B7, ++ [ 5495] = 0x03B8, [ 5496] = 0x03B9, [ 5497] = 0x03BA, [ 5498] = 0x03BB, ++ [ 5499] = 0x03BC, [ 5500] = 0x03BD, [ 5501] = 0x03BE, [ 5502] = 0x03BF, ++ [ 5503] = 0x03C0, [ 5504] = 0x03C1, [ 5505] = 0x03C3, [ 5506] = 0x03C4, ++ [ 5507] = 0x03C5, [ 5508] = 0x03C6, [ 5509] = 0x03C7, [ 5510] = 0x03C8, ++ [ 5511] = 0x03C9, [ 5512] = 0x3105, [ 5513] = 0x3106, [ 5514] = 0x3107, ++ [ 5515] = 0x3108, [ 5516] = 0x3109, [ 5517] = 0x310A, [ 5518] = 0x310B, ++ [ 5519] = 0x310C, [ 5520] = 0x310D, [ 5521] = 0x310E, [ 5522] = 0x310F, ++ [ 5557] = 0x3110, [ 5558] = 0x3111, [ 5559] = 0x3112, [ 5560] = 0x3113, ++ [ 5561] = 0x3114, [ 5562] = 0x3115, [ 5563] = 0x3116, [ 5564] = 0x3117, ++ [ 5565] = 0x3118, [ 5566] = 0x3119, [ 5567] = 0x311A, [ 5568] = 0x311B, ++ [ 5569] = 0x311C, [ 5570] = 0x311D, [ 5571] = 0x311E, [ 5572] = 0x311F, ++ [ 5573] = 0x3120, [ 5574] = 0x3121, [ 5575] = 0x3122, [ 5576] = 0x3123, ++ [ 5577] = 0x3124, [ 5578] = 0x3125, [ 5579] = 0x3126, [ 5580] = 0x3127, ++ [ 5581] = 0x3128, [ 5582] = 0x3129, [ 5583] = 0x02D9, [ 5584] = 0x02C9, ++ [ 5585] = 0x02CA, [ 5586] = 0x02C7, [ 5587] = 0x02CB, [ 5655] = 0x4E00, ++ [ 5656] = 0x4E59, [ 5657] = 0x4E01, [ 5658] = 0x4E03, [ 5659] = 0x4E43, ++ [ 5660] = 0x4E5D, [ 5661] = 0x4E86, [ 5662] = 0x4E8C, [ 5663] = 0x4EBA, ++ [ 5664] = 0x513F, [ 5665] = 0x5165, [ 5666] = 0x516B, [ 5667] = 0x51E0, ++ [ 5668] = 0x5200, [ 5669] = 0x5201, [ 5670] = 0x529B, [ 5671] = 0x5315, ++ [ 5672] = 0x5341, [ 5673] = 0x535C, [ 5674] = 0x53C8, [ 5675] = 0x4E09, ++ [ 5676] = 0x4E0B, [ 5677] = 0x4E08, [ 5678] = 0x4E0A, [ 5679] = 0x4E2B, ++ [ 5680] = 0x4E38, [ 5681] = 0x51E1, [ 5682] = 0x4E45, [ 5683] = 0x4E48, ++ [ 5684] = 0x4E5F, [ 5685] = 0x4E5E, [ 5686] = 0x4E8E, [ 5687] = 0x4EA1, ++ [ 5688] = 0x5140, [ 5689] = 0x5203, [ 5690] = 0x52FA, [ 5691] = 0x5343, ++ [ 5692] = 0x53C9, [ 5693] = 0x53E3, [ 5694] = 0x571F, [ 5695] = 0x58EB, ++ [ 5696] = 0x5915, [ 5697] = 0x5927, [ 5698] = 0x5973, [ 5699] = 0x5B50, ++ [ 5700] = 0x5B51, [ 5701] = 0x5B53, [ 5702] = 0x5BF8, [ 5703] = 0x5C0F, ++ [ 5704] = 0x5C22, [ 5705] = 0x5C38, [ 5706] = 0x5C71, [ 5707] = 0x5DDD, ++ [ 5708] = 0x5DE5, [ 5709] = 0x5DF1, [ 5710] = 0x5DF2, [ 5711] = 0x5DF3, ++ [ 5712] = 0x5DFE, [ 5713] = 0x5E72, [ 5714] = 0x5EFE, [ 5715] = 0x5F0B, ++ [ 5716] = 0x5F13, [ 5717] = 0x624D, [ 5752] = 0x4E11, [ 5753] = 0x4E10, ++ [ 5754] = 0x4E0D, [ 5755] = 0x4E2D, [ 5756] = 0x4E30, [ 5757] = 0x4E39, ++ [ 5758] = 0x4E4B, [ 5759] = 0x5C39, [ 5760] = 0x4E88, [ 5761] = 0x4E91, ++ [ 5762] = 0x4E95, [ 5763] = 0x4E92, [ 5764] = 0x4E94, [ 5765] = 0x4EA2, ++ [ 5766] = 0x4EC1, [ 5767] = 0x4EC0, [ 5768] = 0x4EC3, [ 5769] = 0x4EC6, ++ [ 5770] = 0x4EC7, [ 5771] = 0x4ECD, [ 5772] = 0x4ECA, [ 5773] = 0x4ECB, ++ [ 5774] = 0x4EC4, [ 5775] = 0x5143, [ 5776] = 0x5141, [ 5777] = 0x5167, ++ [ 5778] = 0x516D, [ 5779] = 0x516E, [ 5780] = 0x516C, [ 5781] = 0x5197, ++ [ 5782] = 0x51F6, [ 5783] = 0x5206, [ 5784] = 0x5207, [ 5785] = 0x5208, ++ [ 5786] = 0x52FB, [ 5787] = 0x52FE, [ 5788] = 0x52FF, [ 5789] = 0x5316, ++ [ 5790] = 0x5339, [ 5791] = 0x5348, [ 5792] = 0x5347, [ 5793] = 0x5345, ++ [ 5794] = 0x535E, [ 5795] = 0x5384, [ 5796] = 0x53CB, [ 5797] = 0x53CA, ++ [ 5798] = 0x53CD, [ 5799] = 0x58EC, [ 5800] = 0x5929, [ 5801] = 0x592B, ++ [ 5802] = 0x592A, [ 5803] = 0x592D, [ 5804] = 0x5B54, [ 5805] = 0x5C11, ++ [ 5806] = 0x5C24, [ 5807] = 0x5C3A, [ 5808] = 0x5C6F, [ 5809] = 0x5DF4, ++ [ 5810] = 0x5E7B, [ 5811] = 0x5EFF, [ 5812] = 0x5F14, [ 5813] = 0x5F15, ++ [ 5814] = 0x5FC3, [ 5815] = 0x6208, [ 5816] = 0x6236, [ 5817] = 0x624B, ++ [ 5818] = 0x624E, [ 5819] = 0x652F, [ 5820] = 0x6587, [ 5821] = 0x6597, ++ [ 5822] = 0x65A4, [ 5823] = 0x65B9, [ 5824] = 0x65E5, [ 5825] = 0x66F0, ++ [ 5826] = 0x6708, [ 5827] = 0x6728, [ 5828] = 0x6B20, [ 5829] = 0x6B62, ++ [ 5830] = 0x6B79, [ 5831] = 0x6BCB, [ 5832] = 0x6BD4, [ 5833] = 0x6BDB, ++ [ 5834] = 0x6C0F, [ 5835] = 0x6C34, [ 5836] = 0x706B, [ 5837] = 0x722A, ++ [ 5838] = 0x7236, [ 5839] = 0x723B, [ 5840] = 0x7247, [ 5841] = 0x7259, ++ [ 5842] = 0x725B, [ 5843] = 0x72AC, [ 5844] = 0x738B, [ 5845] = 0x4E19, ++ [ 5850] = 0x4E16, [ 5851] = 0x4E15, [ 5852] = 0x4E14, [ 5853] = 0x4E18, ++ [ 5854] = 0x4E3B, [ 5855] = 0x4E4D, [ 5856] = 0x4E4F, [ 5857] = 0x4E4E, ++ [ 5858] = 0x4EE5, [ 5859] = 0x4ED8, [ 5860] = 0x4ED4, [ 5861] = 0x4ED5, ++ [ 5862] = 0x4ED6, [ 5863] = 0x4ED7, [ 5864] = 0x4EE3, [ 5865] = 0x4EE4, ++ [ 5866] = 0x4ED9, [ 5867] = 0x4EDE, [ 5868] = 0x5145, [ 5869] = 0x5144, ++ [ 5870] = 0x5189, [ 5871] = 0x518A, [ 5872] = 0x51AC, [ 5873] = 0x51F9, ++ [ 5874] = 0x51FA, [ 5875] = 0x51F8, [ 5876] = 0x520A, [ 5877] = 0x52A0, ++ [ 5878] = 0x529F, [ 5879] = 0x5305, [ 5880] = 0x5306, [ 5881] = 0x5317, ++ [ 5882] = 0x531D, [ 5883] = 0x4EDF, [ 5884] = 0x534A, [ 5885] = 0x5349, ++ [ 5886] = 0x5361, [ 5887] = 0x5360, [ 5888] = 0x536F, [ 5889] = 0x536E, ++ [ 5890] = 0x53BB, [ 5891] = 0x53EF, [ 5892] = 0x53E4, [ 5893] = 0x53F3, ++ [ 5894] = 0x53EC, [ 5895] = 0x53EE, [ 5896] = 0x53E9, [ 5897] = 0x53E8, ++ [ 5898] = 0x53FC, [ 5899] = 0x53F8, [ 5900] = 0x53F5, [ 5901] = 0x53EB, ++ [ 5902] = 0x53E6, [ 5903] = 0x53EA, [ 5904] = 0x53F2, [ 5905] = 0x53F1, ++ [ 5906] = 0x53F0, [ 5907] = 0x53E5, [ 5908] = 0x53ED, [ 5909] = 0x53FB, ++ [ 5910] = 0x56DB, [ 5911] = 0x56DA, [ 5912] = 0x5916, [ 5947] = 0x592E, ++ [ 5948] = 0x5931, [ 5949] = 0x5974, [ 5950] = 0x5976, [ 5951] = 0x5B55, ++ [ 5952] = 0x5B83, [ 5953] = 0x5C3C, [ 5954] = 0x5DE8, [ 5955] = 0x5DE7, ++ [ 5956] = 0x5DE6, [ 5957] = 0x5E02, [ 5958] = 0x5E03, [ 5959] = 0x5E73, ++ [ 5960] = 0x5E7C, [ 5961] = 0x5F01, [ 5962] = 0x5F18, [ 5963] = 0x5F17, ++ [ 5964] = 0x5FC5, [ 5965] = 0x620A, [ 5966] = 0x6253, [ 5967] = 0x6254, ++ [ 5968] = 0x6252, [ 5969] = 0x6251, [ 5970] = 0x65A5, [ 5971] = 0x65E6, ++ [ 5972] = 0x672E, [ 5973] = 0x672C, [ 5974] = 0x672A, [ 5975] = 0x672B, ++ [ 5976] = 0x672D, [ 5977] = 0x6B63, [ 5978] = 0x6BCD, [ 5979] = 0x6C11, ++ [ 5980] = 0x6C10, [ 5981] = 0x6C38, [ 5982] = 0x6C41, [ 5983] = 0x6C40, ++ [ 5984] = 0x6C3E, [ 5985] = 0x72AF, [ 5986] = 0x7384, [ 5987] = 0x7389, ++ [ 5988] = 0x74DC, [ 5989] = 0x74E6, [ 5990] = 0x7518, [ 5991] = 0x751F, ++ [ 5992] = 0x7528, [ 5993] = 0x7529, [ 5994] = 0x7530, [ 5995] = 0x7531, ++ [ 5996] = 0x7532, [ 5997] = 0x7533, [ 5998] = 0x758B, [ 5999] = 0x767D, ++ [ 6000] = 0x76AE, [ 6001] = 0x76BF, [ 6002] = 0x76EE, [ 6003] = 0x77DB, ++ [ 6004] = 0x77E2, [ 6005] = 0x77F3, [ 6006] = 0x793A, [ 6007] = 0x79BE, ++ [ 6008] = 0x7A74, [ 6009] = 0x7ACB, [ 6010] = 0x4E1E, [ 6011] = 0x4E1F, ++ [ 6012] = 0x4E52, [ 6013] = 0x4E53, [ 6014] = 0x4E69, [ 6015] = 0x4E99, ++ [ 6016] = 0x4EA4, [ 6017] = 0x4EA6, [ 6018] = 0x4EA5, [ 6019] = 0x4EFF, ++ [ 6020] = 0x4F09, [ 6021] = 0x4F19, [ 6022] = 0x4F0A, [ 6023] = 0x4F15, ++ [ 6024] = 0x4F0D, [ 6025] = 0x4F10, [ 6026] = 0x4F11, [ 6027] = 0x4F0F, ++ [ 6028] = 0x4EF2, [ 6029] = 0x4EF6, [ 6030] = 0x4EFB, [ 6031] = 0x4EF0, ++ [ 6032] = 0x4EF3, [ 6033] = 0x4EFD, [ 6034] = 0x4F01, [ 6035] = 0x4F0B, ++ [ 6036] = 0x5149, [ 6037] = 0x5147, [ 6038] = 0x5146, [ 6039] = 0x5148, ++ [ 6040] = 0x5168, [ 6045] = 0x5171, [ 6046] = 0x518D, [ 6047] = 0x51B0, ++ [ 6048] = 0x5217, [ 6049] = 0x5211, [ 6050] = 0x5212, [ 6051] = 0x520E, ++ [ 6052] = 0x5216, [ 6053] = 0x52A3, [ 6054] = 0x5308, [ 6055] = 0x5321, ++ [ 6056] = 0x5320, [ 6057] = 0x5370, [ 6058] = 0x5371, [ 6059] = 0x5409, ++ [ 6060] = 0x540F, [ 6061] = 0x540C, [ 6062] = 0x540A, [ 6063] = 0x5410, ++ [ 6064] = 0x5401, [ 6065] = 0x540B, [ 6066] = 0x5404, [ 6067] = 0x5411, ++ [ 6068] = 0x540D, [ 6069] = 0x5408, [ 6070] = 0x5403, [ 6071] = 0x540E, ++ [ 6072] = 0x5406, [ 6073] = 0x5412, [ 6074] = 0x56E0, [ 6075] = 0x56DE, ++ [ 6076] = 0x56DD, [ 6077] = 0x5733, [ 6078] = 0x5730, [ 6079] = 0x5728, ++ [ 6080] = 0x572D, [ 6081] = 0x572C, [ 6082] = 0x572F, [ 6083] = 0x5729, ++ [ 6084] = 0x5919, [ 6085] = 0x591A, [ 6086] = 0x5937, [ 6087] = 0x5938, ++ [ 6088] = 0x5984, [ 6089] = 0x5978, [ 6090] = 0x5983, [ 6091] = 0x597D, ++ [ 6092] = 0x5979, [ 6093] = 0x5982, [ 6094] = 0x5981, [ 6095] = 0x5B57, ++ [ 6096] = 0x5B58, [ 6097] = 0x5B87, [ 6098] = 0x5B88, [ 6099] = 0x5B85, ++ [ 6100] = 0x5B89, [ 6101] = 0x5BFA, [ 6102] = 0x5C16, [ 6103] = 0x5C79, ++ [ 6104] = 0x5DDE, [ 6105] = 0x5E06, [ 6106] = 0x5E76, [ 6107] = 0x5E74, ++ [ 6142] = 0x5F0F, [ 6143] = 0x5F1B, [ 6144] = 0x5FD9, [ 6145] = 0x5FD6, ++ [ 6146] = 0x620E, [ 6147] = 0x620C, [ 6148] = 0x620D, [ 6149] = 0x6210, ++ [ 6150] = 0x6263, [ 6151] = 0x625B, [ 6152] = 0x6258, [ 6153] = 0x6536, ++ [ 6154] = 0x65E9, [ 6155] = 0x65E8, [ 6156] = 0x65EC, [ 6157] = 0x65ED, ++ [ 6158] = 0x66F2, [ 6159] = 0x66F3, [ 6160] = 0x6709, [ 6161] = 0x673D, ++ [ 6162] = 0x6734, [ 6163] = 0x6731, [ 6164] = 0x6735, [ 6165] = 0x6B21, ++ [ 6166] = 0x6B64, [ 6167] = 0x6B7B, [ 6168] = 0x6C16, [ 6169] = 0x6C5D, ++ [ 6170] = 0x6C57, [ 6171] = 0x6C59, [ 6172] = 0x6C5F, [ 6173] = 0x6C60, ++ [ 6174] = 0x6C50, [ 6175] = 0x6C55, [ 6176] = 0x6C61, [ 6177] = 0x6C5B, ++ [ 6178] = 0x6C4D, [ 6179] = 0x6C4E, [ 6180] = 0x7070, [ 6181] = 0x725F, ++ [ 6182] = 0x725D, [ 6183] = 0x767E, [ 6184] = 0x7AF9, [ 6185] = 0x7C73, ++ [ 6186] = 0x7CF8, [ 6187] = 0x7F36, [ 6188] = 0x7F8A, [ 6189] = 0x7FBD, ++ [ 6190] = 0x8001, [ 6191] = 0x8003, [ 6192] = 0x800C, [ 6193] = 0x8012, ++ [ 6194] = 0x8033, [ 6195] = 0x807F, [ 6196] = 0x8089, [ 6197] = 0x808B, ++ [ 6198] = 0x808C, [ 6199] = 0x81E3, [ 6200] = 0x81EA, [ 6201] = 0x81F3, ++ [ 6202] = 0x81FC, [ 6203] = 0x820C, [ 6204] = 0x821B, [ 6205] = 0x821F, ++ [ 6206] = 0x826E, [ 6207] = 0x8272, [ 6208] = 0x827E, [ 6209] = 0x866B, ++ [ 6210] = 0x8840, [ 6211] = 0x884C, [ 6212] = 0x8863, [ 6213] = 0x897F, ++ [ 6214] = 0x9621, [ 6215] = 0x4E32, [ 6216] = 0x4EA8, [ 6217] = 0x4F4D, ++ [ 6218] = 0x4F4F, [ 6219] = 0x4F47, [ 6220] = 0x4F57, [ 6221] = 0x4F5E, ++ [ 6222] = 0x4F34, [ 6223] = 0x4F5B, [ 6224] = 0x4F55, [ 6225] = 0x4F30, ++ [ 6226] = 0x4F50, [ 6227] = 0x4F51, [ 6228] = 0x4F3D, [ 6229] = 0x4F3A, ++ [ 6230] = 0x4F38, [ 6231] = 0x4F43, [ 6232] = 0x4F54, [ 6233] = 0x4F3C, ++ [ 6234] = 0x4F46, [ 6235] = 0x4F63, [ 6240] = 0x4F5C, [ 6241] = 0x4F60, ++ [ 6242] = 0x4F2F, [ 6243] = 0x4F4E, [ 6244] = 0x4F36, [ 6245] = 0x4F59, ++ [ 6246] = 0x4F5D, [ 6247] = 0x4F48, [ 6248] = 0x4F5A, [ 6249] = 0x514C, ++ [ 6250] = 0x514B, [ 6251] = 0x514D, [ 6252] = 0x5175, [ 6253] = 0x51B6, ++ [ 6254] = 0x51B7, [ 6255] = 0x5225, [ 6256] = 0x5224, [ 6257] = 0x5229, ++ [ 6258] = 0x522A, [ 6259] = 0x5228, [ 6260] = 0x52AB, [ 6261] = 0x52A9, ++ [ 6262] = 0x52AA, [ 6263] = 0x52AC, [ 6264] = 0x5323, [ 6265] = 0x5373, ++ [ 6266] = 0x5375, [ 6267] = 0x541D, [ 6268] = 0x542D, [ 6269] = 0x541E, ++ [ 6270] = 0x543E, [ 6271] = 0x5426, [ 6272] = 0x544E, [ 6273] = 0x5427, ++ [ 6274] = 0x5446, [ 6275] = 0x5443, [ 6276] = 0x5433, [ 6277] = 0x5448, ++ [ 6278] = 0x5442, [ 6279] = 0x541B, [ 6280] = 0x5429, [ 6281] = 0x544A, ++ [ 6282] = 0x5439, [ 6283] = 0x543B, [ 6284] = 0x5438, [ 6285] = 0x542E, ++ [ 6286] = 0x5435, [ 6287] = 0x5436, [ 6288] = 0x5420, [ 6289] = 0x543C, ++ [ 6290] = 0x5440, [ 6291] = 0x5431, [ 6292] = 0x542B, [ 6293] = 0x541F, ++ [ 6294] = 0x542C, [ 6295] = 0x56EA, [ 6296] = 0x56F0, [ 6297] = 0x56E4, ++ [ 6298] = 0x56EB, [ 6299] = 0x574A, [ 6300] = 0x5751, [ 6301] = 0x5740, ++ [ 6302] = 0x574D, [ 6337] = 0x5747, [ 6338] = 0x574E, [ 6339] = 0x573E, ++ [ 6340] = 0x5750, [ 6341] = 0x574F, [ 6342] = 0x573B, [ 6343] = 0x58EF, ++ [ 6344] = 0x593E, [ 6345] = 0x599D, [ 6346] = 0x5992, [ 6347] = 0x59A8, ++ [ 6348] = 0x599E, [ 6349] = 0x59A3, [ 6350] = 0x5999, [ 6351] = 0x5996, ++ [ 6352] = 0x598D, [ 6353] = 0x59A4, [ 6354] = 0x5993, [ 6355] = 0x598A, ++ [ 6356] = 0x59A5, [ 6357] = 0x5B5D, [ 6358] = 0x5B5C, [ 6359] = 0x5B5A, ++ [ 6360] = 0x5B5B, [ 6361] = 0x5B8C, [ 6362] = 0x5B8B, [ 6363] = 0x5B8F, ++ [ 6364] = 0x5C2C, [ 6365] = 0x5C40, [ 6366] = 0x5C41, [ 6367] = 0x5C3F, ++ [ 6368] = 0x5C3E, [ 6369] = 0x5C90, [ 6370] = 0x5C91, [ 6371] = 0x5C94, ++ [ 6372] = 0x5C8C, [ 6373] = 0x5DEB, [ 6374] = 0x5E0C, [ 6375] = 0x5E8F, ++ [ 6376] = 0x5E87, [ 6377] = 0x5E8A, [ 6378] = 0x5EF7, [ 6379] = 0x5F04, ++ [ 6380] = 0x5F1F, [ 6381] = 0x5F64, [ 6382] = 0x5F62, [ 6383] = 0x5F77, ++ [ 6384] = 0x5F79, [ 6385] = 0x5FD8, [ 6386] = 0x5FCC, [ 6387] = 0x5FD7, ++ [ 6388] = 0x5FCD, [ 6389] = 0x5FF1, [ 6390] = 0x5FEB, [ 6391] = 0x5FF8, ++ [ 6392] = 0x5FEA, [ 6393] = 0x6212, [ 6394] = 0x6211, [ 6395] = 0x6284, ++ [ 6396] = 0x6297, [ 6397] = 0x6296, [ 6398] = 0x6280, [ 6399] = 0x6276, ++ [ 6400] = 0x6289, [ 6401] = 0x626D, [ 6402] = 0x628A, [ 6403] = 0x627C, ++ [ 6404] = 0x627E, [ 6405] = 0x6279, [ 6406] = 0x6273, [ 6407] = 0x6292, ++ [ 6408] = 0x626F, [ 6409] = 0x6298, [ 6410] = 0x626E, [ 6411] = 0x6295, ++ [ 6412] = 0x6293, [ 6413] = 0x6291, [ 6414] = 0x6286, [ 6415] = 0x6539, ++ [ 6416] = 0x653B, [ 6417] = 0x6538, [ 6418] = 0x65F1, [ 6419] = 0x66F4, ++ [ 6420] = 0x675F, [ 6421] = 0x674E, [ 6422] = 0x674F, [ 6423] = 0x6750, ++ [ 6424] = 0x6751, [ 6425] = 0x675C, [ 6426] = 0x6756, [ 6427] = 0x675E, ++ [ 6428] = 0x6749, [ 6429] = 0x6746, [ 6430] = 0x6760, [ 6435] = 0x6753, ++ [ 6436] = 0x6757, [ 6437] = 0x6B65, [ 6438] = 0x6BCF, [ 6439] = 0x6C42, ++ [ 6440] = 0x6C5E, [ 6441] = 0x6C99, [ 6442] = 0x6C81, [ 6443] = 0x6C88, ++ [ 6444] = 0x6C89, [ 6445] = 0x6C85, [ 6446] = 0x6C9B, [ 6447] = 0x6C6A, ++ [ 6448] = 0x6C7A, [ 6449] = 0x6C90, [ 6450] = 0x6C70, [ 6451] = 0x6C8C, ++ [ 6452] = 0x6C68, [ 6453] = 0x6C96, [ 6454] = 0x6C92, [ 6455] = 0x6C7D, ++ [ 6456] = 0x6C83, [ 6457] = 0x6C72, [ 6458] = 0x6C7E, [ 6459] = 0x6C74, ++ [ 6460] = 0x6C86, [ 6461] = 0x6C76, [ 6462] = 0x6C8D, [ 6463] = 0x6C94, ++ [ 6464] = 0x6C98, [ 6465] = 0x6C82, [ 6466] = 0x7076, [ 6467] = 0x707C, ++ [ 6468] = 0x707D, [ 6469] = 0x7078, [ 6470] = 0x7262, [ 6471] = 0x7261, ++ [ 6472] = 0x7260, [ 6473] = 0x72C4, [ 6474] = 0x72C2, [ 6475] = 0x7396, ++ [ 6476] = 0x752C, [ 6477] = 0x752B, [ 6478] = 0x7537, [ 6479] = 0x7538, ++ [ 6480] = 0x7682, [ 6481] = 0x76EF, [ 6482] = 0x77E3, [ 6483] = 0x79C1, ++ [ 6484] = 0x79C0, [ 6485] = 0x79BF, [ 6486] = 0x7A76, [ 6487] = 0x7CFB, ++ [ 6488] = 0x7F55, [ 6489] = 0x8096, [ 6490] = 0x8093, [ 6491] = 0x809D, ++ [ 6492] = 0x8098, [ 6493] = 0x809B, [ 6494] = 0x809A, [ 6495] = 0x80B2, ++ [ 6496] = 0x826F, [ 6497] = 0x8292, [ 6532] = 0x828B, [ 6533] = 0x828D, ++ [ 6534] = 0x898B, [ 6535] = 0x89D2, [ 6536] = 0x8A00, [ 6537] = 0x8C37, ++ [ 6538] = 0x8C46, [ 6539] = 0x8C55, [ 6540] = 0x8C9D, [ 6541] = 0x8D64, ++ [ 6542] = 0x8D70, [ 6543] = 0x8DB3, [ 6544] = 0x8EAB, [ 6545] = 0x8ECA, ++ [ 6546] = 0x8F9B, [ 6547] = 0x8FB0, [ 6548] = 0x8FC2, [ 6549] = 0x8FC6, ++ [ 6550] = 0x8FC5, [ 6551] = 0x8FC4, [ 6552] = 0x5DE1, [ 6553] = 0x9091, ++ [ 6554] = 0x90A2, [ 6555] = 0x90AA, [ 6556] = 0x90A6, [ 6557] = 0x90A3, ++ [ 6558] = 0x9149, [ 6559] = 0x91C6, [ 6560] = 0x91CC, [ 6561] = 0x9632, ++ [ 6562] = 0x962E, [ 6563] = 0x9631, [ 6564] = 0x962A, [ 6565] = 0x962C, ++ [ 6566] = 0x4E26, [ 6567] = 0x4E56, [ 6568] = 0x4E73, [ 6569] = 0x4E8B, ++ [ 6570] = 0x4E9B, [ 6571] = 0x4E9E, [ 6572] = 0x4EAB, [ 6573] = 0x4EAC, ++ [ 6574] = 0x4F6F, [ 6575] = 0x4F9D, [ 6576] = 0x4F8D, [ 6577] = 0x4F73, ++ [ 6578] = 0x4F7F, [ 6579] = 0x4F6C, [ 6580] = 0x4F9B, [ 6581] = 0x4F8B, ++ [ 6582] = 0x4F86, [ 6583] = 0x4F83, [ 6584] = 0x4F70, [ 6585] = 0x4F75, ++ [ 6586] = 0x4F88, [ 6587] = 0x4F69, [ 6588] = 0x4F7B, [ 6589] = 0x4F96, ++ [ 6590] = 0x4F7E, [ 6591] = 0x4F8F, [ 6592] = 0x4F91, [ 6593] = 0x4F7A, ++ [ 6594] = 0x5154, [ 6595] = 0x5152, [ 6596] = 0x5155, [ 6597] = 0x5169, ++ [ 6598] = 0x5177, [ 6599] = 0x5176, [ 6600] = 0x5178, [ 6601] = 0x51BD, ++ [ 6602] = 0x51FD, [ 6603] = 0x523B, [ 6604] = 0x5238, [ 6605] = 0x5237, ++ [ 6606] = 0x523A, [ 6607] = 0x5230, [ 6608] = 0x522E, [ 6609] = 0x5236, ++ [ 6610] = 0x5241, [ 6611] = 0x52BE, [ 6612] = 0x52BB, [ 6613] = 0x5352, ++ [ 6614] = 0x5354, [ 6615] = 0x5353, [ 6616] = 0x5351, [ 6617] = 0x5366, ++ [ 6618] = 0x5377, [ 6619] = 0x5378, [ 6620] = 0x5379, [ 6621] = 0x53D6, ++ [ 6622] = 0x53D4, [ 6623] = 0x53D7, [ 6624] = 0x5473, [ 6625] = 0x5475, ++ [ 6630] = 0x5496, [ 6631] = 0x5478, [ 6632] = 0x5495, [ 6633] = 0x5480, ++ [ 6634] = 0x547B, [ 6635] = 0x5477, [ 6636] = 0x5484, [ 6637] = 0x5492, ++ [ 6638] = 0x5486, [ 6639] = 0x547C, [ 6640] = 0x5490, [ 6641] = 0x5471, ++ [ 6642] = 0x5476, [ 6643] = 0x548C, [ 6644] = 0x549A, [ 6645] = 0x5462, ++ [ 6646] = 0x5468, [ 6647] = 0x548B, [ 6648] = 0x547D, [ 6649] = 0x548E, ++ [ 6650] = 0x56FA, [ 6651] = 0x5783, [ 6652] = 0x5777, [ 6653] = 0x576A, ++ [ 6654] = 0x5769, [ 6655] = 0x5761, [ 6656] = 0x5766, [ 6657] = 0x5764, ++ [ 6658] = 0x577C, [ 6659] = 0x591C, [ 6660] = 0x5949, [ 6661] = 0x5947, ++ [ 6662] = 0x5948, [ 6663] = 0x5944, [ 6664] = 0x5954, [ 6665] = 0x59BE, ++ [ 6666] = 0x59BB, [ 6667] = 0x59D4, [ 6668] = 0x59B9, [ 6669] = 0x59AE, ++ [ 6670] = 0x59D1, [ 6671] = 0x59C6, [ 6672] = 0x59D0, [ 6673] = 0x59CD, ++ [ 6674] = 0x59CB, [ 6675] = 0x59D3, [ 6676] = 0x59CA, [ 6677] = 0x59AF, ++ [ 6678] = 0x59B3, [ 6679] = 0x59D2, [ 6680] = 0x59C5, [ 6681] = 0x5B5F, ++ [ 6682] = 0x5B64, [ 6683] = 0x5B63, [ 6684] = 0x5B97, [ 6685] = 0x5B9A, ++ [ 6686] = 0x5B98, [ 6687] = 0x5B9C, [ 6688] = 0x5B99, [ 6689] = 0x5B9B, ++ [ 6690] = 0x5C1A, [ 6691] = 0x5C48, [ 6692] = 0x5C45, [ 6727] = 0x5C46, ++ [ 6728] = 0x5CB7, [ 6729] = 0x5CA1, [ 6730] = 0x5CB8, [ 6731] = 0x5CA9, ++ [ 6732] = 0x5CAB, [ 6733] = 0x5CB1, [ 6734] = 0x5CB3, [ 6735] = 0x5E18, ++ [ 6736] = 0x5E1A, [ 6737] = 0x5E16, [ 6738] = 0x5E15, [ 6739] = 0x5E1B, ++ [ 6740] = 0x5E11, [ 6741] = 0x5E78, [ 6742] = 0x5E9A, [ 6743] = 0x5E97, ++ [ 6744] = 0x5E9C, [ 6745] = 0x5E95, [ 6746] = 0x5E96, [ 6747] = 0x5EF6, ++ [ 6748] = 0x5F26, [ 6749] = 0x5F27, [ 6750] = 0x5F29, [ 6751] = 0x5F80, ++ [ 6752] = 0x5F81, [ 6753] = 0x5F7F, [ 6754] = 0x5F7C, [ 6755] = 0x5FDD, ++ [ 6756] = 0x5FE0, [ 6757] = 0x5FFD, [ 6758] = 0x5FF5, [ 6759] = 0x5FFF, ++ [ 6760] = 0x600F, [ 6761] = 0x6014, [ 6762] = 0x602F, [ 6763] = 0x6035, ++ [ 6764] = 0x6016, [ 6765] = 0x602A, [ 6766] = 0x6015, [ 6767] = 0x6021, ++ [ 6768] = 0x6027, [ 6769] = 0x6029, [ 6770] = 0x602B, [ 6771] = 0x601B, ++ [ 6772] = 0x6216, [ 6773] = 0x6215, [ 6774] = 0x623F, [ 6775] = 0x623E, ++ [ 6776] = 0x6240, [ 6777] = 0x627F, [ 6778] = 0x62C9, [ 6779] = 0x62CC, ++ [ 6780] = 0x62C4, [ 6781] = 0x62BF, [ 6782] = 0x62C2, [ 6783] = 0x62B9, ++ [ 6784] = 0x62D2, [ 6785] = 0x62DB, [ 6786] = 0x62AB, [ 6787] = 0x62D3, ++ [ 6788] = 0x62D4, [ 6789] = 0x62CB, [ 6790] = 0x62C8, [ 6791] = 0x62A8, ++ [ 6792] = 0x62BD, [ 6793] = 0x62BC, [ 6794] = 0x62D0, [ 6795] = 0x62D9, ++ [ 6796] = 0x62C7, [ 6797] = 0x62CD, [ 6798] = 0x62B5, [ 6799] = 0x62DA, ++ [ 6800] = 0x62B1, [ 6801] = 0x62D8, [ 6802] = 0x62D6, [ 6803] = 0x62D7, ++ [ 6804] = 0x62C6, [ 6805] = 0x62AC, [ 6806] = 0x62CE, [ 6807] = 0x653E, ++ [ 6808] = 0x65A7, [ 6809] = 0x65BC, [ 6810] = 0x65FA, [ 6811] = 0x6614, ++ [ 6812] = 0x6613, [ 6813] = 0x660C, [ 6814] = 0x6606, [ 6815] = 0x6602, ++ [ 6816] = 0x660E, [ 6817] = 0x6600, [ 6818] = 0x660F, [ 6819] = 0x6615, ++ [ 6820] = 0x660A, [ 6825] = 0x6607, [ 6826] = 0x670D, [ 6827] = 0x670B, ++ [ 6828] = 0x676D, [ 6829] = 0x678B, [ 6830] = 0x6795, [ 6831] = 0x6771, ++ [ 6832] = 0x679C, [ 6833] = 0x6773, [ 6834] = 0x6777, [ 6835] = 0x6787, ++ [ 6836] = 0x679D, [ 6837] = 0x6797, [ 6838] = 0x676F, [ 6839] = 0x6770, ++ [ 6840] = 0x677F, [ 6841] = 0x6789, [ 6842] = 0x677E, [ 6843] = 0x6790, ++ [ 6844] = 0x6775, [ 6845] = 0x679A, [ 6846] = 0x6793, [ 6847] = 0x677C, ++ [ 6848] = 0x676A, [ 6849] = 0x6772, [ 6850] = 0x6B23, [ 6851] = 0x6B66, ++ [ 6852] = 0x6B67, [ 6853] = 0x6B7F, [ 6854] = 0x6C13, [ 6855] = 0x6C1B, ++ [ 6856] = 0x6CE3, [ 6857] = 0x6CE8, [ 6858] = 0x6CF3, [ 6859] = 0x6CB1, ++ [ 6860] = 0x6CCC, [ 6861] = 0x6CE5, [ 6862] = 0x6CB3, [ 6863] = 0x6CBD, ++ [ 6864] = 0x6CBE, [ 6865] = 0x6CBC, [ 6866] = 0x6CE2, [ 6867] = 0x6CAB, ++ [ 6868] = 0x6CD5, [ 6869] = 0x6CD3, [ 6870] = 0x6CB8, [ 6871] = 0x6CC4, ++ [ 6872] = 0x6CB9, [ 6873] = 0x6CC1, [ 6874] = 0x6CAE, [ 6875] = 0x6CD7, ++ [ 6876] = 0x6CC5, [ 6877] = 0x6CF1, [ 6878] = 0x6CBF, [ 6879] = 0x6CBB, ++ [ 6880] = 0x6CE1, [ 6881] = 0x6CDB, [ 6882] = 0x6CCA, [ 6883] = 0x6CAC, ++ [ 6884] = 0x6CEF, [ 6885] = 0x6CDC, [ 6886] = 0x6CD6, [ 6887] = 0x6CE0, ++ [ 6922] = 0x7095, [ 6923] = 0x708E, [ 6924] = 0x7092, [ 6925] = 0x708A, ++ [ 6926] = 0x7099, [ 6927] = 0x722C, [ 6928] = 0x722D, [ 6929] = 0x7238, ++ [ 6930] = 0x7248, [ 6931] = 0x7267, [ 6932] = 0x7269, [ 6933] = 0x72C0, ++ [ 6934] = 0x72CE, [ 6935] = 0x72D9, [ 6936] = 0x72D7, [ 6937] = 0x72D0, ++ [ 6938] = 0x73A9, [ 6939] = 0x73A8, [ 6940] = 0x739F, [ 6941] = 0x73AB, ++ [ 6942] = 0x73A5, [ 6943] = 0x753D, [ 6944] = 0x759D, [ 6945] = 0x7599, ++ [ 6946] = 0x759A, [ 6947] = 0x7684, [ 6948] = 0x76C2, [ 6949] = 0x76F2, ++ [ 6950] = 0x76F4, [ 6951] = 0x77E5, [ 6952] = 0x77FD, [ 6953] = 0x793E, ++ [ 6954] = 0x7940, [ 6955] = 0x7941, [ 6956] = 0x79C9, [ 6957] = 0x79C8, ++ [ 6958] = 0x7A7A, [ 6959] = 0x7A79, [ 6960] = 0x7AFA, [ 6961] = 0x7CFE, ++ [ 6962] = 0x7F54, [ 6963] = 0x7F8C, [ 6964] = 0x7F8B, [ 6965] = 0x8005, ++ [ 6966] = 0x80BA, [ 6967] = 0x80A5, [ 6968] = 0x80A2, [ 6969] = 0x80B1, ++ [ 6970] = 0x80A1, [ 6971] = 0x80AB, [ 6972] = 0x80A9, [ 6973] = 0x80B4, ++ [ 6974] = 0x80AA, [ 6975] = 0x80AF, [ 6976] = 0x81E5, [ 6977] = 0x81FE, ++ [ 6978] = 0x820D, [ 6979] = 0x82B3, [ 6980] = 0x829D, [ 6981] = 0x8299, ++ [ 6982] = 0x82AD, [ 6983] = 0x82BD, [ 6984] = 0x829F, [ 6985] = 0x82B9, ++ [ 6986] = 0x82B1, [ 6987] = 0x82AC, [ 6988] = 0x82A5, [ 6989] = 0x82AF, ++ [ 6990] = 0x82B8, [ 6991] = 0x82A3, [ 6992] = 0x82B0, [ 6993] = 0x82BE, ++ [ 6994] = 0x82B7, [ 6995] = 0x864E, [ 6996] = 0x8671, [ 6997] = 0x521D, ++ [ 6998] = 0x8868, [ 6999] = 0x8ECB, [ 7000] = 0x8FCE, [ 7001] = 0x8FD4, ++ [ 7002] = 0x8FD1, [ 7003] = 0x90B5, [ 7004] = 0x90B8, [ 7005] = 0x90B1, ++ [ 7006] = 0x90B6, [ 7007] = 0x91C7, [ 7008] = 0x91D1, [ 7009] = 0x9577, ++ [ 7010] = 0x9580, [ 7011] = 0x961C, [ 7012] = 0x9640, [ 7013] = 0x963F, ++ [ 7014] = 0x963B, [ 7015] = 0x9644, [ 7020] = 0x9642, [ 7021] = 0x96B9, ++ [ 7022] = 0x96E8, [ 7023] = 0x9752, [ 7024] = 0x975E, [ 7025] = 0x4E9F, ++ [ 7026] = 0x4EAD, [ 7027] = 0x4EAE, [ 7028] = 0x4FE1, [ 7029] = 0x4FB5, ++ [ 7030] = 0x4FAF, [ 7031] = 0x4FBF, [ 7032] = 0x4FE0, [ 7033] = 0x4FD1, ++ [ 7034] = 0x4FCF, [ 7035] = 0x4FDD, [ 7036] = 0x4FC3, [ 7037] = 0x4FB6, ++ [ 7038] = 0x4FD8, [ 7039] = 0x4FDF, [ 7040] = 0x4FCA, [ 7041] = 0x4FD7, ++ [ 7042] = 0x4FAE, [ 7043] = 0x4FD0, [ 7044] = 0x4FC4, [ 7045] = 0x4FC2, ++ [ 7046] = 0x4FDA, [ 7047] = 0x4FCE, [ 7048] = 0x4FDE, [ 7049] = 0x4FB7, ++ [ 7050] = 0x5157, [ 7051] = 0x5192, [ 7052] = 0x5191, [ 7053] = 0x51A0, ++ [ 7054] = 0x524E, [ 7055] = 0x5243, [ 7056] = 0x524A, [ 7057] = 0x524D, ++ [ 7058] = 0x524C, [ 7059] = 0x524B, [ 7060] = 0x5247, [ 7061] = 0x52C7, ++ [ 7062] = 0x52C9, [ 7063] = 0x52C3, [ 7064] = 0x52C1, [ 7065] = 0x530D, ++ [ 7066] = 0x5357, [ 7067] = 0x537B, [ 7068] = 0x539A, [ 7069] = 0x53DB, ++ [ 7070] = 0x54AC, [ 7071] = 0x54C0, [ 7072] = 0x54A8, [ 7073] = 0x54CE, ++ [ 7074] = 0x54C9, [ 7075] = 0x54B8, [ 7076] = 0x54A6, [ 7077] = 0x54B3, ++ [ 7078] = 0x54C7, [ 7079] = 0x54C2, [ 7080] = 0x54BD, [ 7081] = 0x54AA, ++ [ 7082] = 0x54C1, [ 7117] = 0x54C4, [ 7118] = 0x54C8, [ 7119] = 0x54AF, ++ [ 7120] = 0x54AB, [ 7121] = 0x54B1, [ 7122] = 0x54BB, [ 7123] = 0x54A9, ++ [ 7124] = 0x54A7, [ 7125] = 0x54BF, [ 7126] = 0x56FF, [ 7127] = 0x5782, ++ [ 7128] = 0x578B, [ 7129] = 0x57A0, [ 7130] = 0x57A3, [ 7131] = 0x57A2, ++ [ 7132] = 0x57CE, [ 7133] = 0x57AE, [ 7134] = 0x5793, [ 7135] = 0x5955, ++ [ 7136] = 0x5951, [ 7137] = 0x594F, [ 7138] = 0x594E, [ 7139] = 0x5950, ++ [ 7140] = 0x59DC, [ 7141] = 0x59D8, [ 7142] = 0x59FF, [ 7143] = 0x59E3, ++ [ 7144] = 0x59E8, [ 7145] = 0x5A03, [ 7146] = 0x59E5, [ 7147] = 0x59EA, ++ [ 7148] = 0x59DA, [ 7149] = 0x59E6, [ 7150] = 0x5A01, [ 7151] = 0x59FB, ++ [ 7152] = 0x5B69, [ 7153] = 0x5BA3, [ 7154] = 0x5BA6, [ 7155] = 0x5BA4, ++ [ 7156] = 0x5BA2, [ 7157] = 0x5BA5, [ 7158] = 0x5C01, [ 7159] = 0x5C4E, ++ [ 7160] = 0x5C4F, [ 7161] = 0x5C4D, [ 7162] = 0x5C4B, [ 7163] = 0x5CD9, ++ [ 7164] = 0x5CD2, [ 7165] = 0x5DF7, [ 7166] = 0x5E1D, [ 7167] = 0x5E25, ++ [ 7168] = 0x5E1F, [ 7169] = 0x5E7D, [ 7170] = 0x5EA0, [ 7171] = 0x5EA6, ++ [ 7172] = 0x5EFA, [ 7173] = 0x5F08, [ 7174] = 0x5F2D, [ 7175] = 0x5F65, ++ [ 7176] = 0x5F88, [ 7177] = 0x5F85, [ 7178] = 0x5F8A, [ 7179] = 0x5F8B, ++ [ 7180] = 0x5F87, [ 7181] = 0x5F8C, [ 7182] = 0x5F89, [ 7183] = 0x6012, ++ [ 7184] = 0x601D, [ 7185] = 0x6020, [ 7186] = 0x6025, [ 7187] = 0x600E, ++ [ 7188] = 0x6028, [ 7189] = 0x604D, [ 7190] = 0x6070, [ 7191] = 0x6068, ++ [ 7192] = 0x6062, [ 7193] = 0x6046, [ 7194] = 0x6043, [ 7195] = 0x606C, ++ [ 7196] = 0x606B, [ 7197] = 0x606A, [ 7198] = 0x6064, [ 7199] = 0x6241, ++ [ 7200] = 0x62DC, [ 7201] = 0x6316, [ 7202] = 0x6309, [ 7203] = 0x62FC, ++ [ 7204] = 0x62ED, [ 7205] = 0x6301, [ 7206] = 0x62EE, [ 7207] = 0x62FD, ++ [ 7208] = 0x6307, [ 7209] = 0x62F1, [ 7210] = 0x62F7, [ 7215] = 0x62EF, ++ [ 7216] = 0x62EC, [ 7217] = 0x62FE, [ 7218] = 0x62F4, [ 7219] = 0x6311, ++ [ 7220] = 0x6302, [ 7221] = 0x653F, [ 7222] = 0x6545, [ 7223] = 0x65AB, ++ [ 7224] = 0x65BD, [ 7225] = 0x65E2, [ 7226] = 0x6625, [ 7227] = 0x662D, ++ [ 7228] = 0x6620, [ 7229] = 0x6627, [ 7230] = 0x662F, [ 7231] = 0x661F, ++ [ 7232] = 0x6628, [ 7233] = 0x6631, [ 7234] = 0x6624, [ 7235] = 0x66F7, ++ [ 7236] = 0x67FF, [ 7237] = 0x67D3, [ 7238] = 0x67F1, [ 7239] = 0x67D4, ++ [ 7240] = 0x67D0, [ 7241] = 0x67EC, [ 7242] = 0x67B6, [ 7243] = 0x67AF, ++ [ 7244] = 0x67F5, [ 7245] = 0x67E9, [ 7246] = 0x67EF, [ 7247] = 0x67C4, ++ [ 7248] = 0x67D1, [ 7249] = 0x67B4, [ 7250] = 0x67DA, [ 7251] = 0x67E5, ++ [ 7252] = 0x67B8, [ 7253] = 0x67CF, [ 7254] = 0x67DE, [ 7255] = 0x67F3, ++ [ 7256] = 0x67B0, [ 7257] = 0x67D9, [ 7258] = 0x67E2, [ 7259] = 0x67DD, ++ [ 7260] = 0x67D2, [ 7261] = 0x6B6A, [ 7262] = 0x6B83, [ 7263] = 0x6B86, ++ [ 7264] = 0x6BB5, [ 7265] = 0x6BD2, [ 7266] = 0x6BD7, [ 7267] = 0x6C1F, ++ [ 7268] = 0x6CC9, [ 7269] = 0x6D0B, [ 7270] = 0x6D32, [ 7271] = 0x6D2A, ++ [ 7272] = 0x6D41, [ 7273] = 0x6D25, [ 7274] = 0x6D0C, [ 7275] = 0x6D31, ++ [ 7276] = 0x6D1E, [ 7277] = 0x6D17, [ 7312] = 0x6D3B, [ 7313] = 0x6D3D, ++ [ 7314] = 0x6D3E, [ 7315] = 0x6D36, [ 7316] = 0x6D1B, [ 7317] = 0x6CF5, ++ [ 7318] = 0x6D39, [ 7319] = 0x6D27, [ 7320] = 0x6D38, [ 7321] = 0x6D29, ++ [ 7322] = 0x6D2E, [ 7323] = 0x6D35, [ 7324] = 0x6D0E, [ 7325] = 0x6D2B, ++ [ 7326] = 0x70AB, [ 7327] = 0x70BA, [ 7328] = 0x70B3, [ 7329] = 0x70AC, ++ [ 7330] = 0x70AF, [ 7331] = 0x70AD, [ 7332] = 0x70B8, [ 7333] = 0x70AE, ++ [ 7334] = 0x70A4, [ 7335] = 0x7230, [ 7336] = 0x7272, [ 7337] = 0x726F, ++ [ 7338] = 0x7274, [ 7339] = 0x72E9, [ 7340] = 0x72E0, [ 7341] = 0x72E1, ++ [ 7342] = 0x73B7, [ 7343] = 0x73CA, [ 7344] = 0x73BB, [ 7345] = 0x73B2, ++ [ 7346] = 0x73CD, [ 7347] = 0x73C0, [ 7348] = 0x73B3, [ 7349] = 0x751A, ++ [ 7350] = 0x752D, [ 7351] = 0x754F, [ 7352] = 0x754C, [ 7353] = 0x754E, ++ [ 7354] = 0x754B, [ 7355] = 0x75AB, [ 7356] = 0x75A4, [ 7357] = 0x75A5, ++ [ 7358] = 0x75A2, [ 7359] = 0x75A3, [ 7360] = 0x7678, [ 7361] = 0x7686, ++ [ 7362] = 0x7687, [ 7363] = 0x7688, [ 7364] = 0x76C8, [ 7365] = 0x76C6, ++ [ 7366] = 0x76C3, [ 7367] = 0x76C5, [ 7368] = 0x7701, [ 7369] = 0x76F9, ++ [ 7370] = 0x76F8, [ 7371] = 0x7709, [ 7372] = 0x770B, [ 7373] = 0x76FE, ++ [ 7374] = 0x76FC, [ 7375] = 0x7707, [ 7376] = 0x77DC, [ 7377] = 0x7802, ++ [ 7378] = 0x7814, [ 7379] = 0x780C, [ 7380] = 0x780D, [ 7381] = 0x7946, ++ [ 7382] = 0x7949, [ 7383] = 0x7948, [ 7384] = 0x7947, [ 7385] = 0x79B9, ++ [ 7386] = 0x79BA, [ 7387] = 0x79D1, [ 7388] = 0x79D2, [ 7389] = 0x79CB, ++ [ 7390] = 0x7A7F, [ 7391] = 0x7A81, [ 7392] = 0x7AFF, [ 7393] = 0x7AFD, ++ [ 7394] = 0x7C7D, [ 7395] = 0x7D02, [ 7396] = 0x7D05, [ 7397] = 0x7D00, ++ [ 7398] = 0x7D09, [ 7399] = 0x7D07, [ 7400] = 0x7D04, [ 7401] = 0x7D06, ++ [ 7402] = 0x7F38, [ 7403] = 0x7F8E, [ 7404] = 0x7FBF, [ 7405] = 0x8004, ++ [ 7410] = 0x8010, [ 7411] = 0x800D, [ 7412] = 0x8011, [ 7413] = 0x8036, ++ [ 7414] = 0x80D6, [ 7415] = 0x80E5, [ 7416] = 0x80DA, [ 7417] = 0x80C3, ++ [ 7418] = 0x80C4, [ 7419] = 0x80CC, [ 7420] = 0x80E1, [ 7421] = 0x80DB, ++ [ 7422] = 0x80CE, [ 7423] = 0x80DE, [ 7424] = 0x80E4, [ 7425] = 0x80DD, ++ [ 7426] = 0x81F4, [ 7427] = 0x8222, [ 7428] = 0x82E7, [ 7429] = 0x8303, ++ [ 7430] = 0x8305, [ 7431] = 0x82E3, [ 7432] = 0x82DB, [ 7433] = 0x82E6, ++ [ 7434] = 0x8304, [ 7435] = 0x82E5, [ 7436] = 0x8302, [ 7437] = 0x8309, ++ [ 7438] = 0x82D2, [ 7439] = 0x82D7, [ 7440] = 0x82F1, [ 7441] = 0x8301, ++ [ 7442] = 0x82DC, [ 7443] = 0x82D4, [ 7444] = 0x82D1, [ 7445] = 0x82DE, ++ [ 7446] = 0x82D3, [ 7447] = 0x82DF, [ 7448] = 0x82EF, [ 7449] = 0x8306, ++ [ 7450] = 0x8650, [ 7451] = 0x8679, [ 7452] = 0x867B, [ 7453] = 0x867A, ++ [ 7454] = 0x884D, [ 7455] = 0x886B, [ 7456] = 0x8981, [ 7457] = 0x89D4, ++ [ 7458] = 0x8A08, [ 7459] = 0x8A02, [ 7460] = 0x8A03, [ 7461] = 0x8C9E, ++ [ 7462] = 0x8CA0, [ 7463] = 0x8D74, [ 7464] = 0x8D73, [ 7465] = 0x8DB4, ++ [ 7466] = 0x8ECD, [ 7467] = 0x8ECC, [ 7468] = 0x8FF0, [ 7469] = 0x8FE6, ++ [ 7470] = 0x8FE2, [ 7471] = 0x8FEA, [ 7472] = 0x8FE5, [ 7507] = 0x8FED, ++ [ 7508] = 0x8FEB, [ 7509] = 0x8FE4, [ 7510] = 0x8FE8, [ 7511] = 0x90CA, ++ [ 7512] = 0x90CE, [ 7513] = 0x90C1, [ 7514] = 0x90C3, [ 7515] = 0x914B, ++ [ 7516] = 0x914A, [ 7517] = 0x91CD, [ 7518] = 0x9582, [ 7519] = 0x9650, ++ [ 7520] = 0x964B, [ 7521] = 0x964C, [ 7522] = 0x964D, [ 7523] = 0x9762, ++ [ 7524] = 0x9769, [ 7525] = 0x97CB, [ 7526] = 0x97ED, [ 7527] = 0x97F3, ++ [ 7528] = 0x9801, [ 7529] = 0x98A8, [ 7530] = 0x98DB, [ 7531] = 0x98DF, ++ [ 7532] = 0x9996, [ 7533] = 0x9999, [ 7534] = 0x4E58, [ 7535] = 0x4EB3, ++ [ 7536] = 0x500C, [ 7537] = 0x500D, [ 7538] = 0x5023, [ 7539] = 0x4FEF, ++ [ 7540] = 0x5026, [ 7541] = 0x5025, [ 7542] = 0x4FF8, [ 7543] = 0x5029, ++ [ 7544] = 0x5016, [ 7545] = 0x5006, [ 7546] = 0x503C, [ 7547] = 0x501F, ++ [ 7548] = 0x501A, [ 7549] = 0x5012, [ 7550] = 0x5011, [ 7551] = 0x4FFA, ++ [ 7552] = 0x5000, [ 7553] = 0x5014, [ 7554] = 0x5028, [ 7555] = 0x4FF1, ++ [ 7556] = 0x5021, [ 7557] = 0x500B, [ 7558] = 0x5019, [ 7559] = 0x5018, ++ [ 7560] = 0x4FF3, [ 7561] = 0x4FEE, [ 7562] = 0x502D, [ 7563] = 0x502A, ++ [ 7564] = 0x4FFE, [ 7565] = 0x502B, [ 7566] = 0x5009, [ 7567] = 0x517C, ++ [ 7568] = 0x51A4, [ 7569] = 0x51A5, [ 7570] = 0x51A2, [ 7571] = 0x51CD, ++ [ 7572] = 0x51CC, [ 7573] = 0x51C6, [ 7574] = 0x51CB, [ 7575] = 0x5256, ++ [ 7576] = 0x525C, [ 7577] = 0x5254, [ 7578] = 0x525B, [ 7579] = 0x525D, ++ [ 7580] = 0x532A, [ 7581] = 0x537F, [ 7582] = 0x539F, [ 7583] = 0x539D, ++ [ 7584] = 0x53DF, [ 7585] = 0x54E8, [ 7586] = 0x5510, [ 7587] = 0x5501, ++ [ 7588] = 0x5537, [ 7589] = 0x54FC, [ 7590] = 0x54E5, [ 7591] = 0x54F2, ++ [ 7592] = 0x5506, [ 7593] = 0x54FA, [ 7594] = 0x5514, [ 7595] = 0x54E9, ++ [ 7596] = 0x54ED, [ 7597] = 0x54E1, [ 7598] = 0x5509, [ 7599] = 0x54EE, ++ [ 7600] = 0x54EA, [ 7605] = 0x54E6, [ 7606] = 0x5527, [ 7607] = 0x5507, ++ [ 7608] = 0x54FD, [ 7609] = 0x550F, [ 7610] = 0x5703, [ 7611] = 0x5704, ++ [ 7612] = 0x57C2, [ 7613] = 0x57D4, [ 7614] = 0x57CB, [ 7615] = 0x57C3, ++ [ 7616] = 0x5809, [ 7617] = 0x590F, [ 7618] = 0x5957, [ 7619] = 0x5958, ++ [ 7620] = 0x595A, [ 7621] = 0x5A11, [ 7622] = 0x5A18, [ 7623] = 0x5A1C, ++ [ 7624] = 0x5A1F, [ 7625] = 0x5A1B, [ 7626] = 0x5A13, [ 7627] = 0x59EC, ++ [ 7628] = 0x5A20, [ 7629] = 0x5A23, [ 7630] = 0x5A29, [ 7631] = 0x5A25, ++ [ 7632] = 0x5A0C, [ 7633] = 0x5A09, [ 7634] = 0x5B6B, [ 7635] = 0x5C58, ++ [ 7636] = 0x5BB0, [ 7637] = 0x5BB3, [ 7638] = 0x5BB6, [ 7639] = 0x5BB4, ++ [ 7640] = 0x5BAE, [ 7641] = 0x5BB5, [ 7642] = 0x5BB9, [ 7643] = 0x5BB8, ++ [ 7644] = 0x5C04, [ 7645] = 0x5C51, [ 7646] = 0x5C55, [ 7647] = 0x5C50, ++ [ 7648] = 0x5CED, [ 7649] = 0x5CFD, [ 7650] = 0x5CFB, [ 7651] = 0x5CEA, ++ [ 7652] = 0x5CE8, [ 7653] = 0x5CF0, [ 7654] = 0x5CF6, [ 7655] = 0x5D01, ++ [ 7656] = 0x5CF4, [ 7657] = 0x5DEE, [ 7658] = 0x5E2D, [ 7659] = 0x5E2B, ++ [ 7660] = 0x5EAB, [ 7661] = 0x5EAD, [ 7662] = 0x5EA7, [ 7663] = 0x5F31, ++ [ 7664] = 0x5F92, [ 7665] = 0x5F91, [ 7666] = 0x5F90, [ 7667] = 0x6059, ++ [ 7702] = 0x6063, [ 7703] = 0x6065, [ 7704] = 0x6050, [ 7705] = 0x6055, ++ [ 7706] = 0x606D, [ 7707] = 0x6069, [ 7708] = 0x606F, [ 7709] = 0x6084, ++ [ 7710] = 0x609F, [ 7711] = 0x609A, [ 7712] = 0x608D, [ 7713] = 0x6094, ++ [ 7714] = 0x608C, [ 7715] = 0x6085, [ 7716] = 0x6096, [ 7717] = 0x6247, ++ [ 7718] = 0x62F3, [ 7719] = 0x6308, [ 7720] = 0x62FF, [ 7721] = 0x634E, ++ [ 7722] = 0x633E, [ 7723] = 0x632F, [ 7724] = 0x6355, [ 7725] = 0x6342, ++ [ 7726] = 0x6346, [ 7727] = 0x634F, [ 7728] = 0x6349, [ 7729] = 0x633A, ++ [ 7730] = 0x6350, [ 7731] = 0x633D, [ 7732] = 0x632A, [ 7733] = 0x632B, ++ [ 7734] = 0x6328, [ 7735] = 0x634D, [ 7736] = 0x634C, [ 7737] = 0x6548, ++ [ 7738] = 0x6549, [ 7739] = 0x6599, [ 7740] = 0x65C1, [ 7741] = 0x65C5, ++ [ 7742] = 0x6642, [ 7743] = 0x6649, [ 7744] = 0x664F, [ 7745] = 0x6643, ++ [ 7746] = 0x6652, [ 7747] = 0x664C, [ 7748] = 0x6645, [ 7749] = 0x6641, ++ [ 7750] = 0x66F8, [ 7751] = 0x6714, [ 7752] = 0x6715, [ 7753] = 0x6717, ++ [ 7754] = 0x6821, [ 7755] = 0x6838, [ 7756] = 0x6848, [ 7757] = 0x6846, ++ [ 7758] = 0x6853, [ 7759] = 0x6839, [ 7760] = 0x6842, [ 7761] = 0x6854, ++ [ 7762] = 0x6829, [ 7763] = 0x68B3, [ 7764] = 0x6817, [ 7765] = 0x684C, ++ [ 7766] = 0x6851, [ 7767] = 0x683D, [ 7768] = 0x67F4, [ 7769] = 0x6850, ++ [ 7770] = 0x6840, [ 7771] = 0x683C, [ 7772] = 0x6843, [ 7773] = 0x682A, ++ [ 7774] = 0x6845, [ 7775] = 0x6813, [ 7776] = 0x6818, [ 7777] = 0x6841, ++ [ 7778] = 0x6B8A, [ 7779] = 0x6B89, [ 7780] = 0x6BB7, [ 7781] = 0x6C23, ++ [ 7782] = 0x6C27, [ 7783] = 0x6C28, [ 7784] = 0x6C26, [ 7785] = 0x6C24, ++ [ 7786] = 0x6CF0, [ 7787] = 0x6D6A, [ 7788] = 0x6D95, [ 7789] = 0x6D88, ++ [ 7790] = 0x6D87, [ 7791] = 0x6D66, [ 7792] = 0x6D78, [ 7793] = 0x6D77, ++ [ 7794] = 0x6D59, [ 7795] = 0x6D93, [ 7800] = 0x6D6C, [ 7801] = 0x6D89, ++ [ 7802] = 0x6D6E, [ 7803] = 0x6D5A, [ 7804] = 0x6D74, [ 7805] = 0x6D69, ++ [ 7806] = 0x6D8C, [ 7807] = 0x6D8A, [ 7808] = 0x6D79, [ 7809] = 0x6D85, ++ [ 7810] = 0x6D65, [ 7811] = 0x6D94, [ 7812] = 0x70CA, [ 7813] = 0x70D8, ++ [ 7814] = 0x70E4, [ 7815] = 0x70D9, [ 7816] = 0x70C8, [ 7817] = 0x70CF, ++ [ 7818] = 0x7239, [ 7819] = 0x7279, [ 7820] = 0x72FC, [ 7821] = 0x72F9, ++ [ 7822] = 0x72FD, [ 7823] = 0x72F8, [ 7824] = 0x72F7, [ 7825] = 0x7386, ++ [ 7826] = 0x73ED, [ 7827] = 0x7409, [ 7828] = 0x73EE, [ 7829] = 0x73E0, ++ [ 7830] = 0x73EA, [ 7831] = 0x73DE, [ 7832] = 0x7554, [ 7833] = 0x755D, ++ [ 7834] = 0x755C, [ 7835] = 0x755A, [ 7836] = 0x7559, [ 7837] = 0x75BE, ++ [ 7838] = 0x75C5, [ 7839] = 0x75C7, [ 7840] = 0x75B2, [ 7841] = 0x75B3, ++ [ 7842] = 0x75BD, [ 7843] = 0x75BC, [ 7844] = 0x75B9, [ 7845] = 0x75C2, ++ [ 7846] = 0x75B8, [ 7847] = 0x768B, [ 7848] = 0x76B0, [ 7849] = 0x76CA, ++ [ 7850] = 0x76CD, [ 7851] = 0x76CE, [ 7852] = 0x7729, [ 7853] = 0x771F, ++ [ 7854] = 0x7720, [ 7855] = 0x7728, [ 7856] = 0x77E9, [ 7857] = 0x7830, ++ [ 7858] = 0x7827, [ 7859] = 0x7838, [ 7860] = 0x781D, [ 7861] = 0x7834, ++ [ 7862] = 0x7837, [ 7897] = 0x7825, [ 7898] = 0x782D, [ 7899] = 0x7820, ++ [ 7900] = 0x781F, [ 7901] = 0x7832, [ 7902] = 0x7955, [ 7903] = 0x7950, ++ [ 7904] = 0x7960, [ 7905] = 0x795F, [ 7906] = 0x7956, [ 7907] = 0x795E, ++ [ 7908] = 0x795D, [ 7909] = 0x7957, [ 7910] = 0x795A, [ 7911] = 0x79E4, ++ [ 7912] = 0x79E3, [ 7913] = 0x79E7, [ 7914] = 0x79DF, [ 7915] = 0x79E6, ++ [ 7916] = 0x79E9, [ 7917] = 0x79D8, [ 7918] = 0x7A84, [ 7919] = 0x7A88, ++ [ 7920] = 0x7AD9, [ 7921] = 0x7B06, [ 7922] = 0x7B11, [ 7923] = 0x7C89, ++ [ 7924] = 0x7D21, [ 7925] = 0x7D17, [ 7926] = 0x7D0B, [ 7927] = 0x7D0A, ++ [ 7928] = 0x7D20, [ 7929] = 0x7D22, [ 7930] = 0x7D14, [ 7931] = 0x7D10, ++ [ 7932] = 0x7D15, [ 7933] = 0x7D1A, [ 7934] = 0x7D1C, [ 7935] = 0x7D0D, ++ [ 7936] = 0x7D19, [ 7937] = 0x7D1B, [ 7938] = 0x7F3A, [ 7939] = 0x7F5F, ++ [ 7940] = 0x7F94, [ 7941] = 0x7FC5, [ 7942] = 0x7FC1, [ 7943] = 0x8006, ++ [ 7944] = 0x8018, [ 7945] = 0x8015, [ 7946] = 0x8019, [ 7947] = 0x8017, ++ [ 7948] = 0x803D, [ 7949] = 0x803F, [ 7950] = 0x80F1, [ 7951] = 0x8102, ++ [ 7952] = 0x80F0, [ 7953] = 0x8105, [ 7954] = 0x80ED, [ 7955] = 0x80F4, ++ [ 7956] = 0x8106, [ 7957] = 0x80F8, [ 7958] = 0x80F3, [ 7959] = 0x8108, ++ [ 7960] = 0x80FD, [ 7961] = 0x810A, [ 7962] = 0x80FC, [ 7963] = 0x80EF, ++ [ 7964] = 0x81ED, [ 7965] = 0x81EC, [ 7966] = 0x8200, [ 7967] = 0x8210, ++ [ 7968] = 0x822A, [ 7969] = 0x822B, [ 7970] = 0x8228, [ 7971] = 0x822C, ++ [ 7972] = 0x82BB, [ 7973] = 0x832B, [ 7974] = 0x8352, [ 7975] = 0x8354, ++ [ 7976] = 0x834A, [ 7977] = 0x8338, [ 7978] = 0x8350, [ 7979] = 0x8349, ++ [ 7980] = 0x8335, [ 7981] = 0x8334, [ 7982] = 0x834F, [ 7983] = 0x8332, ++ [ 7984] = 0x8339, [ 7985] = 0x8336, [ 7986] = 0x8317, [ 7987] = 0x8340, ++ [ 7988] = 0x8331, [ 7989] = 0x8328, [ 7990] = 0x8343, [ 7995] = 0x8654, ++ [ 7996] = 0x868A, [ 7997] = 0x86AA, [ 7998] = 0x8693, [ 7999] = 0x86A4, ++ [ 8000] = 0x86A9, [ 8001] = 0x868C, [ 8002] = 0x86A3, [ 8003] = 0x869C, ++ [ 8004] = 0x8870, [ 8005] = 0x8877, [ 8006] = 0x8881, [ 8007] = 0x8882, ++ [ 8008] = 0x887D, [ 8009] = 0x8879, [ 8010] = 0x8A18, [ 8011] = 0x8A10, ++ [ 8012] = 0x8A0E, [ 8013] = 0x8A0C, [ 8014] = 0x8A15, [ 8015] = 0x8A0A, ++ [ 8016] = 0x8A17, [ 8017] = 0x8A13, [ 8018] = 0x8A16, [ 8019] = 0x8A0F, ++ [ 8020] = 0x8A11, [ 8021] = 0x8C48, [ 8022] = 0x8C7A, [ 8023] = 0x8C79, ++ [ 8024] = 0x8CA1, [ 8025] = 0x8CA2, [ 8026] = 0x8D77, [ 8027] = 0x8EAC, ++ [ 8028] = 0x8ED2, [ 8029] = 0x8ED4, [ 8030] = 0x8ECF, [ 8031] = 0x8FB1, ++ [ 8032] = 0x9001, [ 8033] = 0x9006, [ 8034] = 0x8FF7, [ 8035] = 0x9000, ++ [ 8036] = 0x8FFA, [ 8037] = 0x8FF4, [ 8038] = 0x9003, [ 8039] = 0x8FFD, ++ [ 8040] = 0x9005, [ 8041] = 0x8FF8, [ 8042] = 0x9095, [ 8043] = 0x90E1, ++ [ 8044] = 0x90DD, [ 8045] = 0x90E2, [ 8046] = 0x9152, [ 8047] = 0x914D, ++ [ 8048] = 0x914C, [ 8049] = 0x91D8, [ 8050] = 0x91DD, [ 8051] = 0x91D7, ++ [ 8052] = 0x91DC, [ 8053] = 0x91D9, [ 8054] = 0x9583, [ 8055] = 0x9662, ++ [ 8056] = 0x9663, [ 8057] = 0x9661, [ 8092] = 0x965B, [ 8093] = 0x965D, ++ [ 8094] = 0x9664, [ 8095] = 0x9658, [ 8096] = 0x965E, [ 8097] = 0x96BB, ++ [ 8098] = 0x98E2, [ 8099] = 0x99AC, [ 8100] = 0x9AA8, [ 8101] = 0x9AD8, ++ [ 8102] = 0x9B25, [ 8103] = 0x9B32, [ 8104] = 0x9B3C, [ 8105] = 0x4E7E, ++ [ 8106] = 0x507A, [ 8107] = 0x507D, [ 8108] = 0x505C, [ 8109] = 0x5047, ++ [ 8110] = 0x5043, [ 8111] = 0x504C, [ 8112] = 0x505A, [ 8113] = 0x5049, ++ [ 8114] = 0x5065, [ 8115] = 0x5076, [ 8116] = 0x504E, [ 8117] = 0x5055, ++ [ 8118] = 0x5075, [ 8119] = 0x5074, [ 8120] = 0x5077, [ 8121] = 0x504F, ++ [ 8122] = 0x500F, [ 8123] = 0x506F, [ 8124] = 0x506D, [ 8125] = 0x515C, ++ [ 8126] = 0x5195, [ 8127] = 0x51F0, [ 8128] = 0x526A, [ 8129] = 0x526F, ++ [ 8130] = 0x52D2, [ 8131] = 0x52D9, [ 8132] = 0x52D8, [ 8133] = 0x52D5, ++ [ 8134] = 0x5310, [ 8135] = 0x530F, [ 8136] = 0x5319, [ 8137] = 0x533F, ++ [ 8138] = 0x5340, [ 8139] = 0x533E, [ 8140] = 0x53C3, [ 8141] = 0x66FC, ++ [ 8142] = 0x5546, [ 8143] = 0x556A, [ 8144] = 0x5566, [ 8145] = 0x5544, ++ [ 8146] = 0x555E, [ 8147] = 0x5561, [ 8148] = 0x5543, [ 8149] = 0x554A, ++ [ 8150] = 0x5531, [ 8151] = 0x5556, [ 8152] = 0x554F, [ 8153] = 0x5555, ++ [ 8154] = 0x552F, [ 8155] = 0x5564, [ 8156] = 0x5538, [ 8157] = 0x552E, ++ [ 8158] = 0x555C, [ 8159] = 0x552C, [ 8160] = 0x5563, [ 8161] = 0x5533, ++ [ 8162] = 0x5541, [ 8163] = 0x5557, [ 8164] = 0x5708, [ 8165] = 0x570B, ++ [ 8166] = 0x5709, [ 8167] = 0x57DF, [ 8168] = 0x5805, [ 8169] = 0x580A, ++ [ 8170] = 0x5806, [ 8171] = 0x57E0, [ 8172] = 0x57E4, [ 8173] = 0x57FA, ++ [ 8174] = 0x5802, [ 8175] = 0x5835, [ 8176] = 0x57F7, [ 8177] = 0x57F9, ++ [ 8178] = 0x5920, [ 8179] = 0x5962, [ 8180] = 0x5A36, [ 8181] = 0x5A41, ++ [ 8182] = 0x5A49, [ 8183] = 0x5A66, [ 8184] = 0x5A6A, [ 8185] = 0x5A40, ++ [ 8190] = 0x5A3C, [ 8191] = 0x5A62, [ 8192] = 0x5A5A, [ 8193] = 0x5A46, ++ [ 8194] = 0x5A4A, [ 8195] = 0x5B70, [ 8196] = 0x5BC7, [ 8197] = 0x5BC5, ++ [ 8198] = 0x5BC4, [ 8199] = 0x5BC2, [ 8200] = 0x5BBF, [ 8201] = 0x5BC6, ++ [ 8202] = 0x5C09, [ 8203] = 0x5C08, [ 8204] = 0x5C07, [ 8205] = 0x5C60, ++ [ 8206] = 0x5C5C, [ 8207] = 0x5C5D, [ 8208] = 0x5D07, [ 8209] = 0x5D06, ++ [ 8210] = 0x5D0E, [ 8211] = 0x5D1B, [ 8212] = 0x5D16, [ 8213] = 0x5D22, ++ [ 8214] = 0x5D11, [ 8215] = 0x5D29, [ 8216] = 0x5D14, [ 8217] = 0x5D19, ++ [ 8218] = 0x5D24, [ 8219] = 0x5D27, [ 8220] = 0x5D17, [ 8221] = 0x5DE2, ++ [ 8222] = 0x5E38, [ 8223] = 0x5E36, [ 8224] = 0x5E33, [ 8225] = 0x5E37, ++ [ 8226] = 0x5EB7, [ 8227] = 0x5EB8, [ 8228] = 0x5EB6, [ 8229] = 0x5EB5, ++ [ 8230] = 0x5EBE, [ 8231] = 0x5F35, [ 8232] = 0x5F37, [ 8233] = 0x5F57, ++ [ 8234] = 0x5F6C, [ 8235] = 0x5F69, [ 8236] = 0x5F6B, [ 8237] = 0x5F97, ++ [ 8238] = 0x5F99, [ 8239] = 0x5F9E, [ 8240] = 0x5F98, [ 8241] = 0x5FA1, ++ [ 8242] = 0x5FA0, [ 8243] = 0x5F9C, [ 8244] = 0x607F, [ 8245] = 0x60A3, ++ [ 8246] = 0x6089, [ 8247] = 0x60A0, [ 8248] = 0x60A8, [ 8249] = 0x60CB, ++ [ 8250] = 0x60B4, [ 8251] = 0x60E6, [ 8252] = 0x60BD, [ 8287] = 0x60C5, ++ [ 8288] = 0x60BB, [ 8289] = 0x60B5, [ 8290] = 0x60DC, [ 8291] = 0x60BC, ++ [ 8292] = 0x60D8, [ 8293] = 0x60D5, [ 8294] = 0x60C6, [ 8295] = 0x60DF, ++ [ 8296] = 0x60B8, [ 8297] = 0x60DA, [ 8298] = 0x60C7, [ 8299] = 0x621A, ++ [ 8300] = 0x621B, [ 8301] = 0x6248, [ 8302] = 0x63A0, [ 8303] = 0x63A7, ++ [ 8304] = 0x6372, [ 8305] = 0x6396, [ 8306] = 0x63A2, [ 8307] = 0x63A5, ++ [ 8308] = 0x6377, [ 8309] = 0x6367, [ 8310] = 0x6398, [ 8311] = 0x63AA, ++ [ 8312] = 0x6371, [ 8313] = 0x63A9, [ 8314] = 0x6389, [ 8315] = 0x6383, ++ [ 8316] = 0x639B, [ 8317] = 0x636B, [ 8318] = 0x63A8, [ 8319] = 0x6384, ++ [ 8320] = 0x6388, [ 8321] = 0x6399, [ 8322] = 0x63A1, [ 8323] = 0x63AC, ++ [ 8324] = 0x6392, [ 8325] = 0x638F, [ 8326] = 0x6380, [ 8327] = 0x637B, ++ [ 8328] = 0x6369, [ 8329] = 0x6368, [ 8330] = 0x637A, [ 8331] = 0x655D, ++ [ 8332] = 0x6556, [ 8333] = 0x6551, [ 8334] = 0x6559, [ 8335] = 0x6557, ++ [ 8336] = 0x555F, [ 8337] = 0x654F, [ 8338] = 0x6558, [ 8339] = 0x6555, ++ [ 8340] = 0x6554, [ 8341] = 0x659C, [ 8342] = 0x659B, [ 8343] = 0x65AC, ++ [ 8344] = 0x65CF, [ 8345] = 0x65CB, [ 8346] = 0x65CC, [ 8347] = 0x65CE, ++ [ 8348] = 0x665D, [ 8349] = 0x665A, [ 8350] = 0x6664, [ 8351] = 0x6668, ++ [ 8352] = 0x6666, [ 8353] = 0x665E, [ 8354] = 0x66F9, [ 8355] = 0x52D7, ++ [ 8356] = 0x671B, [ 8357] = 0x6881, [ 8358] = 0x68AF, [ 8359] = 0x68A2, ++ [ 8360] = 0x6893, [ 8361] = 0x68B5, [ 8362] = 0x687F, [ 8363] = 0x6876, ++ [ 8364] = 0x68B1, [ 8365] = 0x68A7, [ 8366] = 0x6897, [ 8367] = 0x68B0, ++ [ 8368] = 0x6883, [ 8369] = 0x68C4, [ 8370] = 0x68AD, [ 8371] = 0x6886, ++ [ 8372] = 0x6885, [ 8373] = 0x6894, [ 8374] = 0x689D, [ 8375] = 0x68A8, ++ [ 8376] = 0x689F, [ 8377] = 0x68A1, [ 8378] = 0x6882, [ 8379] = 0x6B32, ++ [ 8380] = 0x6BBA, [ 8385] = 0x6BEB, [ 8386] = 0x6BEC, [ 8387] = 0x6C2B, ++ [ 8388] = 0x6D8E, [ 8389] = 0x6DBC, [ 8390] = 0x6DF3, [ 8391] = 0x6DD9, ++ [ 8392] = 0x6DB2, [ 8393] = 0x6DE1, [ 8394] = 0x6DCC, [ 8395] = 0x6DE4, ++ [ 8396] = 0x6DFB, [ 8397] = 0x6DFA, [ 8398] = 0x6E05, [ 8399] = 0x6DC7, ++ [ 8400] = 0x6DCB, [ 8401] = 0x6DAF, [ 8402] = 0x6DD1, [ 8403] = 0x6DAE, ++ [ 8404] = 0x6DDE, [ 8405] = 0x6DF9, [ 8406] = 0x6DB8, [ 8407] = 0x6DF7, ++ [ 8408] = 0x6DF5, [ 8409] = 0x6DC5, [ 8410] = 0x6DD2, [ 8411] = 0x6E1A, ++ [ 8412] = 0x6DB5, [ 8413] = 0x6DDA, [ 8414] = 0x6DEB, [ 8415] = 0x6DD8, ++ [ 8416] = 0x6DEA, [ 8417] = 0x6DF1, [ 8418] = 0x6DEE, [ 8419] = 0x6DE8, ++ [ 8420] = 0x6DC6, [ 8421] = 0x6DC4, [ 8422] = 0x6DAA, [ 8423] = 0x6DEC, ++ [ 8424] = 0x6DBF, [ 8425] = 0x6DE6, [ 8426] = 0x70F9, [ 8427] = 0x7109, ++ [ 8428] = 0x710A, [ 8429] = 0x70FD, [ 8430] = 0x70EF, [ 8431] = 0x723D, ++ [ 8432] = 0x727D, [ 8433] = 0x7281, [ 8434] = 0x731C, [ 8435] = 0x731B, ++ [ 8436] = 0x7316, [ 8437] = 0x7313, [ 8438] = 0x7319, [ 8439] = 0x7387, ++ [ 8440] = 0x7405, [ 8441] = 0x740A, [ 8442] = 0x7403, [ 8443] = 0x7406, ++ [ 8444] = 0x73FE, [ 8445] = 0x740D, [ 8446] = 0x74E0, [ 8447] = 0x74F6, ++ [ 8482] = 0x74F7, [ 8483] = 0x751C, [ 8484] = 0x7522, [ 8485] = 0x7565, ++ [ 8486] = 0x7566, [ 8487] = 0x7562, [ 8488] = 0x7570, [ 8489] = 0x758F, ++ [ 8490] = 0x75D4, [ 8491] = 0x75D5, [ 8492] = 0x75B5, [ 8493] = 0x75CA, ++ [ 8494] = 0x75CD, [ 8495] = 0x768E, [ 8496] = 0x76D4, [ 8497] = 0x76D2, ++ [ 8498] = 0x76DB, [ 8499] = 0x7737, [ 8500] = 0x773E, [ 8501] = 0x773C, ++ [ 8502] = 0x7736, [ 8503] = 0x7738, [ 8504] = 0x773A, [ 8505] = 0x786B, ++ [ 8506] = 0x7843, [ 8507] = 0x784E, [ 8508] = 0x7965, [ 8509] = 0x7968, ++ [ 8510] = 0x796D, [ 8511] = 0x79FB, [ 8512] = 0x7A92, [ 8513] = 0x7A95, ++ [ 8514] = 0x7B20, [ 8515] = 0x7B28, [ 8516] = 0x7B1B, [ 8517] = 0x7B2C, ++ [ 8518] = 0x7B26, [ 8519] = 0x7B19, [ 8520] = 0x7B1E, [ 8521] = 0x7B2E, ++ [ 8522] = 0x7C92, [ 8523] = 0x7C97, [ 8524] = 0x7C95, [ 8525] = 0x7D46, ++ [ 8526] = 0x7D43, [ 8527] = 0x7D71, [ 8528] = 0x7D2E, [ 8529] = 0x7D39, ++ [ 8530] = 0x7D3C, [ 8531] = 0x7D40, [ 8532] = 0x7D30, [ 8533] = 0x7D33, ++ [ 8534] = 0x7D44, [ 8535] = 0x7D2F, [ 8536] = 0x7D42, [ 8537] = 0x7D32, ++ [ 8538] = 0x7D31, [ 8539] = 0x7F3D, [ 8540] = 0x7F9E, [ 8541] = 0x7F9A, ++ [ 8542] = 0x7FCC, [ 8543] = 0x7FCE, [ 8544] = 0x7FD2, [ 8545] = 0x801C, ++ [ 8546] = 0x804A, [ 8547] = 0x8046, [ 8548] = 0x812F, [ 8549] = 0x8116, ++ [ 8550] = 0x8123, [ 8551] = 0x812B, [ 8552] = 0x8129, [ 8553] = 0x8130, ++ [ 8554] = 0x8124, [ 8555] = 0x8202, [ 8556] = 0x8235, [ 8557] = 0x8237, ++ [ 8558] = 0x8236, [ 8559] = 0x8239, [ 8560] = 0x838E, [ 8561] = 0x839E, ++ [ 8562] = 0x8398, [ 8563] = 0x8378, [ 8564] = 0x83A2, [ 8565] = 0x8396, ++ [ 8566] = 0x83BD, [ 8567] = 0x83AB, [ 8568] = 0x8392, [ 8569] = 0x838A, ++ [ 8570] = 0x8393, [ 8571] = 0x8389, [ 8572] = 0x83A0, [ 8573] = 0x8377, ++ [ 8574] = 0x837B, [ 8575] = 0x837C, [ 8580] = 0x8386, [ 8581] = 0x83A7, ++ [ 8582] = 0x8655, [ 8583] = 0x5F6A, [ 8584] = 0x86C7, [ 8585] = 0x86C0, ++ [ 8586] = 0x86B6, [ 8587] = 0x86C4, [ 8588] = 0x86B5, [ 8589] = 0x86C6, ++ [ 8590] = 0x86CB, [ 8591] = 0x86B1, [ 8592] = 0x86AF, [ 8593] = 0x86C9, ++ [ 8594] = 0x8853, [ 8595] = 0x889E, [ 8596] = 0x8888, [ 8597] = 0x88AB, ++ [ 8598] = 0x8892, [ 8599] = 0x8896, [ 8600] = 0x888D, [ 8601] = 0x888B, ++ [ 8602] = 0x8993, [ 8603] = 0x898F, [ 8604] = 0x8A2A, [ 8605] = 0x8A1D, ++ [ 8606] = 0x8A23, [ 8607] = 0x8A25, [ 8608] = 0x8A31, [ 8609] = 0x8A2D, ++ [ 8610] = 0x8A1F, [ 8611] = 0x8A1B, [ 8612] = 0x8A22, [ 8613] = 0x8C49, ++ [ 8614] = 0x8C5A, [ 8615] = 0x8CA9, [ 8616] = 0x8CAC, [ 8617] = 0x8CAB, ++ [ 8618] = 0x8CA8, [ 8619] = 0x8CAA, [ 8620] = 0x8CA7, [ 8621] = 0x8D67, ++ [ 8622] = 0x8D66, [ 8623] = 0x8DBE, [ 8624] = 0x8DBA, [ 8625] = 0x8EDB, ++ [ 8626] = 0x8EDF, [ 8627] = 0x9019, [ 8628] = 0x900D, [ 8629] = 0x901A, ++ [ 8630] = 0x9017, [ 8631] = 0x9023, [ 8632] = 0x901F, [ 8633] = 0x901D, ++ [ 8634] = 0x9010, [ 8635] = 0x9015, [ 8636] = 0x901E, [ 8637] = 0x9020, ++ [ 8638] = 0x900F, [ 8639] = 0x9022, [ 8640] = 0x9016, [ 8641] = 0x901B, ++ [ 8642] = 0x9014, [ 8677] = 0x90E8, [ 8678] = 0x90ED, [ 8679] = 0x90FD, ++ [ 8680] = 0x9157, [ 8681] = 0x91CE, [ 8682] = 0x91F5, [ 8683] = 0x91E6, ++ [ 8684] = 0x91E3, [ 8685] = 0x91E7, [ 8686] = 0x91ED, [ 8687] = 0x91E9, ++ [ 8688] = 0x9589, [ 8689] = 0x966A, [ 8690] = 0x9675, [ 8691] = 0x9673, ++ [ 8692] = 0x9678, [ 8693] = 0x9670, [ 8694] = 0x9674, [ 8695] = 0x9676, ++ [ 8696] = 0x9677, [ 8697] = 0x966C, [ 8698] = 0x96C0, [ 8699] = 0x96EA, ++ [ 8700] = 0x96E9, [ 8701] = 0x7AE0, [ 8702] = 0x7ADF, [ 8703] = 0x9802, ++ [ 8704] = 0x9803, [ 8705] = 0x9B5A, [ 8706] = 0x9CE5, [ 8707] = 0x9E75, ++ [ 8708] = 0x9E7F, [ 8709] = 0x9EA5, [ 8710] = 0x9EBB, [ 8711] = 0x50A2, ++ [ 8712] = 0x508D, [ 8713] = 0x5085, [ 8714] = 0x5099, [ 8715] = 0x5091, ++ [ 8716] = 0x5080, [ 8717] = 0x5096, [ 8718] = 0x5098, [ 8719] = 0x509A, ++ [ 8720] = 0x6700, [ 8721] = 0x51F1, [ 8722] = 0x5272, [ 8723] = 0x5274, ++ [ 8724] = 0x5275, [ 8725] = 0x5269, [ 8726] = 0x52DE, [ 8727] = 0x52DD, ++ [ 8728] = 0x52DB, [ 8729] = 0x535A, [ 8730] = 0x53A5, [ 8731] = 0x557B, ++ [ 8732] = 0x5580, [ 8733] = 0x55A7, [ 8734] = 0x557C, [ 8735] = 0x558A, ++ [ 8736] = 0x559D, [ 8737] = 0x5598, [ 8738] = 0x5582, [ 8739] = 0x559C, ++ [ 8740] = 0x55AA, [ 8741] = 0x5594, [ 8742] = 0x5587, [ 8743] = 0x558B, ++ [ 8744] = 0x5583, [ 8745] = 0x55B3, [ 8746] = 0x55AE, [ 8747] = 0x559F, ++ [ 8748] = 0x553E, [ 8749] = 0x55B2, [ 8750] = 0x559A, [ 8751] = 0x55BB, ++ [ 8752] = 0x55AC, [ 8753] = 0x55B1, [ 8754] = 0x557E, [ 8755] = 0x5589, ++ [ 8756] = 0x55AB, [ 8757] = 0x5599, [ 8758] = 0x570D, [ 8759] = 0x582F, ++ [ 8760] = 0x582A, [ 8761] = 0x5834, [ 8762] = 0x5824, [ 8763] = 0x5830, ++ [ 8764] = 0x5831, [ 8765] = 0x5821, [ 8766] = 0x581D, [ 8767] = 0x5820, ++ [ 8768] = 0x58F9, [ 8769] = 0x58FA, [ 8770] = 0x5960, [ 8775] = 0x5A77, ++ [ 8776] = 0x5A9A, [ 8777] = 0x5A7F, [ 8778] = 0x5A92, [ 8779] = 0x5A9B, ++ [ 8780] = 0x5AA7, [ 8781] = 0x5B73, [ 8782] = 0x5B71, [ 8783] = 0x5BD2, ++ [ 8784] = 0x5BCC, [ 8785] = 0x5BD3, [ 8786] = 0x5BD0, [ 8787] = 0x5C0A, ++ [ 8788] = 0x5C0B, [ 8789] = 0x5C31, [ 8790] = 0x5D4C, [ 8791] = 0x5D50, ++ [ 8792] = 0x5D34, [ 8793] = 0x5D47, [ 8794] = 0x5DFD, [ 8795] = 0x5E45, ++ [ 8796] = 0x5E3D, [ 8797] = 0x5E40, [ 8798] = 0x5E43, [ 8799] = 0x5E7E, ++ [ 8800] = 0x5ECA, [ 8801] = 0x5EC1, [ 8802] = 0x5EC2, [ 8803] = 0x5EC4, ++ [ 8804] = 0x5F3C, [ 8805] = 0x5F6D, [ 8806] = 0x5FA9, [ 8807] = 0x5FAA, ++ [ 8808] = 0x5FA8, [ 8809] = 0x60D1, [ 8810] = 0x60E1, [ 8811] = 0x60B2, ++ [ 8812] = 0x60B6, [ 8813] = 0x60E0, [ 8814] = 0x611C, [ 8815] = 0x6123, ++ [ 8816] = 0x60FA, [ 8817] = 0x6115, [ 8818] = 0x60F0, [ 8819] = 0x60FB, ++ [ 8820] = 0x60F4, [ 8821] = 0x6168, [ 8822] = 0x60F1, [ 8823] = 0x610E, ++ [ 8824] = 0x60F6, [ 8825] = 0x6109, [ 8826] = 0x6100, [ 8827] = 0x6112, ++ [ 8828] = 0x621F, [ 8829] = 0x6249, [ 8830] = 0x63A3, [ 8831] = 0x638C, ++ [ 8832] = 0x63CF, [ 8833] = 0x63C0, [ 8834] = 0x63E9, [ 8835] = 0x63C9, ++ [ 8836] = 0x63C6, [ 8837] = 0x63CD, [ 8872] = 0x63D2, [ 8873] = 0x63E3, ++ [ 8874] = 0x63D0, [ 8875] = 0x63E1, [ 8876] = 0x63D6, [ 8877] = 0x63ED, ++ [ 8878] = 0x63EE, [ 8879] = 0x6376, [ 8880] = 0x63F4, [ 8881] = 0x63EA, ++ [ 8882] = 0x63DB, [ 8883] = 0x6452, [ 8884] = 0x63DA, [ 8885] = 0x63F9, ++ [ 8886] = 0x655E, [ 8887] = 0x6566, [ 8888] = 0x6562, [ 8889] = 0x6563, ++ [ 8890] = 0x6591, [ 8891] = 0x6590, [ 8892] = 0x65AF, [ 8893] = 0x666E, ++ [ 8894] = 0x6670, [ 8895] = 0x6674, [ 8896] = 0x6676, [ 8897] = 0x666F, ++ [ 8898] = 0x6691, [ 8899] = 0x667A, [ 8900] = 0x667E, [ 8901] = 0x6677, ++ [ 8902] = 0x66FE, [ 8903] = 0x66FF, [ 8904] = 0x671F, [ 8905] = 0x671D, ++ [ 8906] = 0x68FA, [ 8907] = 0x68D5, [ 8908] = 0x68E0, [ 8909] = 0x68D8, ++ [ 8910] = 0x68D7, [ 8911] = 0x6905, [ 8912] = 0x68DF, [ 8913] = 0x68F5, ++ [ 8914] = 0x68EE, [ 8915] = 0x68E7, [ 8916] = 0x68F9, [ 8917] = 0x68D2, ++ [ 8918] = 0x68F2, [ 8919] = 0x68E3, [ 8920] = 0x68CB, [ 8921] = 0x68CD, ++ [ 8922] = 0x690D, [ 8923] = 0x6912, [ 8924] = 0x690E, [ 8925] = 0x68C9, ++ [ 8926] = 0x68DA, [ 8927] = 0x696E, [ 8928] = 0x68FB, [ 8929] = 0x6B3E, ++ [ 8930] = 0x6B3A, [ 8931] = 0x6B3D, [ 8932] = 0x6B98, [ 8933] = 0x6B96, ++ [ 8934] = 0x6BBC, [ 8935] = 0x6BEF, [ 8936] = 0x6C2E, [ 8937] = 0x6C2F, ++ [ 8938] = 0x6C2C, [ 8939] = 0x6E2F, [ 8940] = 0x6E38, [ 8941] = 0x6E54, ++ [ 8942] = 0x6E21, [ 8943] = 0x6E32, [ 8944] = 0x6E67, [ 8945] = 0x6E4A, ++ [ 8946] = 0x6E20, [ 8947] = 0x6E25, [ 8948] = 0x6E23, [ 8949] = 0x6E1B, ++ [ 8950] = 0x6E5B, [ 8951] = 0x6E58, [ 8952] = 0x6E24, [ 8953] = 0x6E56, ++ [ 8954] = 0x6E6E, [ 8955] = 0x6E2D, [ 8956] = 0x6E26, [ 8957] = 0x6E6F, ++ [ 8958] = 0x6E34, [ 8959] = 0x6E4D, [ 8960] = 0x6E3A, [ 8961] = 0x6E2C, ++ [ 8962] = 0x6E43, [ 8963] = 0x6E1D, [ 8964] = 0x6E3E, [ 8965] = 0x6ECB, ++ [ 8970] = 0x6E89, [ 8971] = 0x6E19, [ 8972] = 0x6E4E, [ 8973] = 0x6E63, ++ [ 8974] = 0x6E44, [ 8975] = 0x6E72, [ 8976] = 0x6E69, [ 8977] = 0x6E5F, ++ [ 8978] = 0x7119, [ 8979] = 0x711A, [ 8980] = 0x7126, [ 8981] = 0x7130, ++ [ 8982] = 0x7121, [ 8983] = 0x7136, [ 8984] = 0x716E, [ 8985] = 0x711C, ++ [ 8986] = 0x724C, [ 8987] = 0x7284, [ 8988] = 0x7280, [ 8989] = 0x7336, ++ [ 8990] = 0x7325, [ 8991] = 0x7334, [ 8992] = 0x7329, [ 8993] = 0x743A, ++ [ 8994] = 0x742A, [ 8995] = 0x7433, [ 8996] = 0x7422, [ 8997] = 0x7425, ++ [ 8998] = 0x7435, [ 8999] = 0x7436, [ 9000] = 0x7434, [ 9001] = 0x742F, ++ [ 9002] = 0x741B, [ 9003] = 0x7426, [ 9004] = 0x7428, [ 9005] = 0x7525, ++ [ 9006] = 0x7526, [ 9007] = 0x756B, [ 9008] = 0x756A, [ 9009] = 0x75E2, ++ [ 9010] = 0x75DB, [ 9011] = 0x75E3, [ 9012] = 0x75D9, [ 9013] = 0x75D8, ++ [ 9014] = 0x75DE, [ 9015] = 0x75E0, [ 9016] = 0x767B, [ 9017] = 0x767C, ++ [ 9018] = 0x7696, [ 9019] = 0x7693, [ 9020] = 0x76B4, [ 9021] = 0x76DC, ++ [ 9022] = 0x774F, [ 9023] = 0x77ED, [ 9024] = 0x785D, [ 9025] = 0x786C, ++ [ 9026] = 0x786F, [ 9027] = 0x7A0D, [ 9028] = 0x7A08, [ 9029] = 0x7A0B, ++ [ 9030] = 0x7A05, [ 9031] = 0x7A00, [ 9032] = 0x7A98, [ 9067] = 0x7A97, ++ [ 9068] = 0x7A96, [ 9069] = 0x7AE5, [ 9070] = 0x7AE3, [ 9071] = 0x7B49, ++ [ 9072] = 0x7B56, [ 9073] = 0x7B46, [ 9074] = 0x7B50, [ 9075] = 0x7B52, ++ [ 9076] = 0x7B54, [ 9077] = 0x7B4D, [ 9078] = 0x7B4B, [ 9079] = 0x7B4F, ++ [ 9080] = 0x7B51, [ 9081] = 0x7C9F, [ 9082] = 0x7CA5, [ 9083] = 0x7D5E, ++ [ 9084] = 0x7D50, [ 9085] = 0x7D68, [ 9086] = 0x7D55, [ 9087] = 0x7D2B, ++ [ 9088] = 0x7D6E, [ 9089] = 0x7D72, [ 9090] = 0x7D61, [ 9091] = 0x7D66, ++ [ 9092] = 0x7D62, [ 9093] = 0x7D70, [ 9094] = 0x7D73, [ 9095] = 0x5584, ++ [ 9096] = 0x7FD4, [ 9097] = 0x7FD5, [ 9098] = 0x800B, [ 9099] = 0x8052, ++ [ 9100] = 0x8085, [ 9101] = 0x8155, [ 9102] = 0x8154, [ 9103] = 0x814B, ++ [ 9104] = 0x8151, [ 9105] = 0x814E, [ 9106] = 0x8139, [ 9107] = 0x8146, ++ [ 9108] = 0x813E, [ 9109] = 0x814C, [ 9110] = 0x8153, [ 9111] = 0x8174, ++ [ 9112] = 0x8212, [ 9113] = 0x821C, [ 9114] = 0x83E9, [ 9115] = 0x8403, ++ [ 9116] = 0x83F8, [ 9117] = 0x840D, [ 9118] = 0x83E0, [ 9119] = 0x83C5, ++ [ 9120] = 0x840B, [ 9121] = 0x83C1, [ 9122] = 0x83EF, [ 9123] = 0x83F1, ++ [ 9124] = 0x83F4, [ 9125] = 0x8457, [ 9126] = 0x840A, [ 9127] = 0x83F0, ++ [ 9128] = 0x840C, [ 9129] = 0x83CC, [ 9130] = 0x83FD, [ 9131] = 0x83F2, ++ [ 9132] = 0x83CA, [ 9133] = 0x8438, [ 9134] = 0x840E, [ 9135] = 0x8404, ++ [ 9136] = 0x83DC, [ 9137] = 0x8407, [ 9138] = 0x83D4, [ 9139] = 0x83DF, ++ [ 9140] = 0x865B, [ 9141] = 0x86DF, [ 9142] = 0x86D9, [ 9143] = 0x86ED, ++ [ 9144] = 0x86D4, [ 9145] = 0x86DB, [ 9146] = 0x86E4, [ 9147] = 0x86D0, ++ [ 9148] = 0x86DE, [ 9149] = 0x8857, [ 9150] = 0x88C1, [ 9151] = 0x88C2, ++ [ 9152] = 0x88B1, [ 9153] = 0x8983, [ 9154] = 0x8996, [ 9155] = 0x8A3B, ++ [ 9156] = 0x8A60, [ 9157] = 0x8A55, [ 9158] = 0x8A5E, [ 9159] = 0x8A3C, ++ [ 9160] = 0x8A41, [ 9165] = 0x8A54, [ 9166] = 0x8A5B, [ 9167] = 0x8A50, ++ [ 9168] = 0x8A46, [ 9169] = 0x8A34, [ 9170] = 0x8A3A, [ 9171] = 0x8A36, ++ [ 9172] = 0x8A56, [ 9173] = 0x8C61, [ 9174] = 0x8C82, [ 9175] = 0x8CAF, ++ [ 9176] = 0x8CBC, [ 9177] = 0x8CB3, [ 9178] = 0x8CBD, [ 9179] = 0x8CC1, ++ [ 9180] = 0x8CBB, [ 9181] = 0x8CC0, [ 9182] = 0x8CB4, [ 9183] = 0x8CB7, ++ [ 9184] = 0x8CB6, [ 9185] = 0x8CBF, [ 9186] = 0x8CB8, [ 9187] = 0x8D8A, ++ [ 9188] = 0x8D85, [ 9189] = 0x8D81, [ 9190] = 0x8DCE, [ 9191] = 0x8DDD, ++ [ 9192] = 0x8DCB, [ 9193] = 0x8DDA, [ 9194] = 0x8DD1, [ 9195] = 0x8DCC, ++ [ 9196] = 0x8DDB, [ 9197] = 0x8DC6, [ 9198] = 0x8EFB, [ 9199] = 0x8EF8, ++ [ 9200] = 0x8EFC, [ 9201] = 0x8F9C, [ 9202] = 0x902E, [ 9203] = 0x9035, ++ [ 9204] = 0x9031, [ 9205] = 0x9038, [ 9206] = 0x9032, [ 9207] = 0x9036, ++ [ 9208] = 0x9102, [ 9209] = 0x90F5, [ 9210] = 0x9109, [ 9211] = 0x90FE, ++ [ 9212] = 0x9163, [ 9213] = 0x9165, [ 9214] = 0x91CF, [ 9215] = 0x9214, ++ [ 9216] = 0x9215, [ 9217] = 0x9223, [ 9218] = 0x9209, [ 9219] = 0x921E, ++ [ 9220] = 0x920D, [ 9221] = 0x9210, [ 9222] = 0x9207, [ 9223] = 0x9211, ++ [ 9224] = 0x9594, [ 9225] = 0x958F, [ 9226] = 0x958B, [ 9227] = 0x9591, ++ [ 9262] = 0x9593, [ 9263] = 0x9592, [ 9264] = 0x958E, [ 9265] = 0x968A, ++ [ 9266] = 0x968E, [ 9267] = 0x968B, [ 9268] = 0x967D, [ 9269] = 0x9685, ++ [ 9270] = 0x9686, [ 9271] = 0x968D, [ 9272] = 0x9672, [ 9273] = 0x9684, ++ [ 9274] = 0x96C1, [ 9275] = 0x96C5, [ 9276] = 0x96C4, [ 9277] = 0x96C6, ++ [ 9278] = 0x96C7, [ 9279] = 0x96EF, [ 9280] = 0x96F2, [ 9281] = 0x97CC, ++ [ 9282] = 0x9805, [ 9283] = 0x9806, [ 9284] = 0x9808, [ 9285] = 0x98E7, ++ [ 9286] = 0x98EA, [ 9287] = 0x98EF, [ 9288] = 0x98E9, [ 9289] = 0x98F2, ++ [ 9290] = 0x98ED, [ 9291] = 0x99AE, [ 9292] = 0x99AD, [ 9293] = 0x9EC3, ++ [ 9294] = 0x9ECD, [ 9295] = 0x9ED1, [ 9296] = 0x4E82, [ 9297] = 0x50AD, ++ [ 9298] = 0x50B5, [ 9299] = 0x50B2, [ 9300] = 0x50B3, [ 9301] = 0x50C5, ++ [ 9302] = 0x50BE, [ 9303] = 0x50AC, [ 9304] = 0x50B7, [ 9305] = 0x50BB, ++ [ 9306] = 0x50AF, [ 9307] = 0x50C7, [ 9308] = 0x527F, [ 9309] = 0x5277, ++ [ 9310] = 0x527D, [ 9311] = 0x52DF, [ 9312] = 0x52E6, [ 9313] = 0x52E4, ++ [ 9314] = 0x52E2, [ 9315] = 0x52E3, [ 9316] = 0x532F, [ 9317] = 0x55DF, ++ [ 9318] = 0x55E8, [ 9319] = 0x55D3, [ 9320] = 0x55E6, [ 9321] = 0x55CE, ++ [ 9322] = 0x55DC, [ 9323] = 0x55C7, [ 9324] = 0x55D1, [ 9325] = 0x55E3, ++ [ 9326] = 0x55E4, [ 9327] = 0x55EF, [ 9328] = 0x55DA, [ 9329] = 0x55E1, ++ [ 9330] = 0x55C5, [ 9331] = 0x55C6, [ 9332] = 0x55E5, [ 9333] = 0x55C9, ++ [ 9334] = 0x5712, [ 9335] = 0x5713, [ 9336] = 0x585E, [ 9337] = 0x5851, ++ [ 9338] = 0x5858, [ 9339] = 0x5857, [ 9340] = 0x585A, [ 9341] = 0x5854, ++ [ 9342] = 0x586B, [ 9343] = 0x584C, [ 9344] = 0x586D, [ 9345] = 0x584A, ++ [ 9346] = 0x5862, [ 9347] = 0x5852, [ 9348] = 0x584B, [ 9349] = 0x5967, ++ [ 9350] = 0x5AC1, [ 9351] = 0x5AC9, [ 9352] = 0x5ACC, [ 9353] = 0x5ABE, ++ [ 9354] = 0x5ABD, [ 9355] = 0x5ABC, [ 9360] = 0x5AB3, [ 9361] = 0x5AC2, ++ [ 9362] = 0x5AB2, [ 9363] = 0x5D69, [ 9364] = 0x5D6F, [ 9365] = 0x5E4C, ++ [ 9366] = 0x5E79, [ 9367] = 0x5EC9, [ 9368] = 0x5EC8, [ 9369] = 0x5F12, ++ [ 9370] = 0x5F59, [ 9371] = 0x5FAC, [ 9372] = 0x5FAE, [ 9373] = 0x611A, ++ [ 9374] = 0x610F, [ 9375] = 0x6148, [ 9376] = 0x611F, [ 9377] = 0x60F3, ++ [ 9378] = 0x611B, [ 9379] = 0x60F9, [ 9380] = 0x6101, [ 9381] = 0x6108, ++ [ 9382] = 0x614E, [ 9383] = 0x614C, [ 9384] = 0x6144, [ 9385] = 0x614D, ++ [ 9386] = 0x613E, [ 9387] = 0x6134, [ 9388] = 0x6127, [ 9389] = 0x610D, ++ [ 9390] = 0x6106, [ 9391] = 0x6137, [ 9392] = 0x6221, [ 9393] = 0x6222, ++ [ 9394] = 0x6413, [ 9395] = 0x643E, [ 9396] = 0x641E, [ 9397] = 0x642A, ++ [ 9398] = 0x642D, [ 9399] = 0x643D, [ 9400] = 0x642C, [ 9401] = 0x640F, ++ [ 9402] = 0x641C, [ 9403] = 0x6414, [ 9404] = 0x640D, [ 9405] = 0x6436, ++ [ 9406] = 0x6416, [ 9407] = 0x6417, [ 9408] = 0x6406, [ 9409] = 0x656C, ++ [ 9410] = 0x659F, [ 9411] = 0x65B0, [ 9412] = 0x6697, [ 9413] = 0x6689, ++ [ 9414] = 0x6687, [ 9415] = 0x6688, [ 9416] = 0x6696, [ 9417] = 0x6684, ++ [ 9418] = 0x6698, [ 9419] = 0x668D, [ 9420] = 0x6703, [ 9421] = 0x6994, ++ [ 9422] = 0x696D, [ 9457] = 0x695A, [ 9458] = 0x6977, [ 9459] = 0x6960, ++ [ 9460] = 0x6954, [ 9461] = 0x6975, [ 9462] = 0x6930, [ 9463] = 0x6982, ++ [ 9464] = 0x694A, [ 9465] = 0x6968, [ 9466] = 0x696B, [ 9467] = 0x695E, ++ [ 9468] = 0x6953, [ 9469] = 0x6979, [ 9470] = 0x6986, [ 9471] = 0x695D, ++ [ 9472] = 0x6963, [ 9473] = 0x695B, [ 9474] = 0x6B47, [ 9475] = 0x6B72, ++ [ 9476] = 0x6BC0, [ 9477] = 0x6BBF, [ 9478] = 0x6BD3, [ 9479] = 0x6BFD, ++ [ 9480] = 0x6EA2, [ 9481] = 0x6EAF, [ 9482] = 0x6ED3, [ 9483] = 0x6EB6, ++ [ 9484] = 0x6EC2, [ 9485] = 0x6E90, [ 9486] = 0x6E9D, [ 9487] = 0x6EC7, ++ [ 9488] = 0x6EC5, [ 9489] = 0x6EA5, [ 9490] = 0x6E98, [ 9491] = 0x6EBC, ++ [ 9492] = 0x6EBA, [ 9493] = 0x6EAB, [ 9494] = 0x6ED1, [ 9495] = 0x6E96, ++ [ 9496] = 0x6E9C, [ 9497] = 0x6EC4, [ 9498] = 0x6ED4, [ 9499] = 0x6EAA, ++ [ 9500] = 0x6EA7, [ 9501] = 0x6EB4, [ 9502] = 0x714E, [ 9503] = 0x7159, ++ [ 9504] = 0x7169, [ 9505] = 0x7164, [ 9506] = 0x7149, [ 9507] = 0x7167, ++ [ 9508] = 0x715C, [ 9509] = 0x716C, [ 9510] = 0x7166, [ 9511] = 0x714C, ++ [ 9512] = 0x7165, [ 9513] = 0x715E, [ 9514] = 0x7146, [ 9515] = 0x7168, ++ [ 9516] = 0x7156, [ 9517] = 0x723A, [ 9518] = 0x7252, [ 9519] = 0x7337, ++ [ 9520] = 0x7345, [ 9521] = 0x733F, [ 9522] = 0x733E, [ 9523] = 0x746F, ++ [ 9524] = 0x745A, [ 9525] = 0x7455, [ 9526] = 0x745F, [ 9527] = 0x745E, ++ [ 9528] = 0x7441, [ 9529] = 0x743F, [ 9530] = 0x7459, [ 9531] = 0x745B, ++ [ 9532] = 0x745C, [ 9533] = 0x7576, [ 9534] = 0x7578, [ 9535] = 0x7600, ++ [ 9536] = 0x75F0, [ 9537] = 0x7601, [ 9538] = 0x75F2, [ 9539] = 0x75F1, ++ [ 9540] = 0x75FA, [ 9541] = 0x75FF, [ 9542] = 0x75F4, [ 9543] = 0x75F3, ++ [ 9544] = 0x76DE, [ 9545] = 0x76DF, [ 9546] = 0x775B, [ 9547] = 0x776B, ++ [ 9548] = 0x7766, [ 9549] = 0x775E, [ 9550] = 0x7763, [ 9555] = 0x7779, ++ [ 9556] = 0x776A, [ 9557] = 0x776C, [ 9558] = 0x775C, [ 9559] = 0x7765, ++ [ 9560] = 0x7768, [ 9561] = 0x7762, [ 9562] = 0x77EE, [ 9563] = 0x788E, ++ [ 9564] = 0x78B0, [ 9565] = 0x7897, [ 9566] = 0x7898, [ 9567] = 0x788C, ++ [ 9568] = 0x7889, [ 9569] = 0x787C, [ 9570] = 0x7891, [ 9571] = 0x7893, ++ [ 9572] = 0x787F, [ 9573] = 0x797A, [ 9574] = 0x797F, [ 9575] = 0x7981, ++ [ 9576] = 0x842C, [ 9577] = 0x79BD, [ 9578] = 0x7A1C, [ 9579] = 0x7A1A, ++ [ 9580] = 0x7A20, [ 9581] = 0x7A14, [ 9582] = 0x7A1F, [ 9583] = 0x7A1E, ++ [ 9584] = 0x7A9F, [ 9585] = 0x7AA0, [ 9586] = 0x7B77, [ 9587] = 0x7BC0, ++ [ 9588] = 0x7B60, [ 9589] = 0x7B6E, [ 9590] = 0x7B67, [ 9591] = 0x7CB1, ++ [ 9592] = 0x7CB3, [ 9593] = 0x7CB5, [ 9594] = 0x7D93, [ 9595] = 0x7D79, ++ [ 9596] = 0x7D91, [ 9597] = 0x7D81, [ 9598] = 0x7D8F, [ 9599] = 0x7D5B, ++ [ 9600] = 0x7F6E, [ 9601] = 0x7F69, [ 9602] = 0x7F6A, [ 9603] = 0x7F72, ++ [ 9604] = 0x7FA9, [ 9605] = 0x7FA8, [ 9606] = 0x7FA4, [ 9607] = 0x8056, ++ [ 9608] = 0x8058, [ 9609] = 0x8086, [ 9610] = 0x8084, [ 9611] = 0x8171, ++ [ 9612] = 0x8170, [ 9613] = 0x8178, [ 9614] = 0x8165, [ 9615] = 0x816E, ++ [ 9616] = 0x8173, [ 9617] = 0x816B, [ 9652] = 0x8179, [ 9653] = 0x817A, ++ [ 9654] = 0x8166, [ 9655] = 0x8205, [ 9656] = 0x8247, [ 9657] = 0x8482, ++ [ 9658] = 0x8477, [ 9659] = 0x843D, [ 9660] = 0x8431, [ 9661] = 0x8475, ++ [ 9662] = 0x8466, [ 9663] = 0x846B, [ 9664] = 0x8449, [ 9665] = 0x846C, ++ [ 9666] = 0x845B, [ 9667] = 0x843C, [ 9668] = 0x8435, [ 9669] = 0x8461, ++ [ 9670] = 0x8463, [ 9671] = 0x8469, [ 9672] = 0x846D, [ 9673] = 0x8446, ++ [ 9674] = 0x865E, [ 9675] = 0x865C, [ 9676] = 0x865F, [ 9677] = 0x86F9, ++ [ 9678] = 0x8713, [ 9679] = 0x8708, [ 9680] = 0x8707, [ 9681] = 0x8700, ++ [ 9682] = 0x86FE, [ 9683] = 0x86FB, [ 9684] = 0x8702, [ 9685] = 0x8703, ++ [ 9686] = 0x8706, [ 9687] = 0x870A, [ 9688] = 0x8859, [ 9689] = 0x88DF, ++ [ 9690] = 0x88D4, [ 9691] = 0x88D9, [ 9692] = 0x88DC, [ 9693] = 0x88D8, ++ [ 9694] = 0x88DD, [ 9695] = 0x88E1, [ 9696] = 0x88CA, [ 9697] = 0x88D5, ++ [ 9698] = 0x88D2, [ 9699] = 0x899C, [ 9700] = 0x89E3, [ 9701] = 0x8A6B, ++ [ 9702] = 0x8A72, [ 9703] = 0x8A73, [ 9704] = 0x8A66, [ 9705] = 0x8A69, ++ [ 9706] = 0x8A70, [ 9707] = 0x8A87, [ 9708] = 0x8A7C, [ 9709] = 0x8A63, ++ [ 9710] = 0x8AA0, [ 9711] = 0x8A71, [ 9712] = 0x8A85, [ 9713] = 0x8A6D, ++ [ 9714] = 0x8A62, [ 9715] = 0x8A6E, [ 9716] = 0x8A6C, [ 9717] = 0x8A79, ++ [ 9718] = 0x8A7B, [ 9719] = 0x8A3E, [ 9720] = 0x8A68, [ 9721] = 0x8C62, ++ [ 9722] = 0x8C8A, [ 9723] = 0x8C89, [ 9724] = 0x8CCA, [ 9725] = 0x8CC7, ++ [ 9726] = 0x8CC8, [ 9727] = 0x8CC4, [ 9728] = 0x8CB2, [ 9729] = 0x8CC3, ++ [ 9730] = 0x8CC2, [ 9731] = 0x8CC5, [ 9732] = 0x8DE1, [ 9733] = 0x8DDF, ++ [ 9734] = 0x8DE8, [ 9735] = 0x8DEF, [ 9736] = 0x8DF3, [ 9737] = 0x8DFA, ++ [ 9738] = 0x8DEA, [ 9739] = 0x8DE4, [ 9740] = 0x8DE6, [ 9741] = 0x8EB2, ++ [ 9742] = 0x8F03, [ 9743] = 0x8F09, [ 9744] = 0x8EFE, [ 9745] = 0x8F0A, ++ [ 9750] = 0x8F9F, [ 9751] = 0x8FB2, [ 9752] = 0x904B, [ 9753] = 0x904A, ++ [ 9754] = 0x9053, [ 9755] = 0x9042, [ 9756] = 0x9054, [ 9757] = 0x903C, ++ [ 9758] = 0x9055, [ 9759] = 0x9050, [ 9760] = 0x9047, [ 9761] = 0x904F, ++ [ 9762] = 0x904E, [ 9763] = 0x904D, [ 9764] = 0x9051, [ 9765] = 0x903E, ++ [ 9766] = 0x9041, [ 9767] = 0x9112, [ 9768] = 0x9117, [ 9769] = 0x916C, ++ [ 9770] = 0x916A, [ 9771] = 0x9169, [ 9772] = 0x91C9, [ 9773] = 0x9237, ++ [ 9774] = 0x9257, [ 9775] = 0x9238, [ 9776] = 0x923D, [ 9777] = 0x9240, ++ [ 9778] = 0x923E, [ 9779] = 0x925B, [ 9780] = 0x924B, [ 9781] = 0x9264, ++ [ 9782] = 0x9251, [ 9783] = 0x9234, [ 9784] = 0x9249, [ 9785] = 0x924D, ++ [ 9786] = 0x9245, [ 9787] = 0x9239, [ 9788] = 0x923F, [ 9789] = 0x925A, ++ [ 9790] = 0x9598, [ 9791] = 0x9698, [ 9792] = 0x9694, [ 9793] = 0x9695, ++ [ 9794] = 0x96CD, [ 9795] = 0x96CB, [ 9796] = 0x96C9, [ 9797] = 0x96CA, ++ [ 9798] = 0x96F7, [ 9799] = 0x96FB, [ 9800] = 0x96F9, [ 9801] = 0x96F6, ++ [ 9802] = 0x9756, [ 9803] = 0x9774, [ 9804] = 0x9776, [ 9805] = 0x9810, ++ [ 9806] = 0x9811, [ 9807] = 0x9813, [ 9808] = 0x980A, [ 9809] = 0x9812, ++ [ 9810] = 0x980C, [ 9811] = 0x98FC, [ 9812] = 0x98F4, [ 9847] = 0x98FD, ++ [ 9848] = 0x98FE, [ 9849] = 0x99B3, [ 9850] = 0x99B1, [ 9851] = 0x99B4, ++ [ 9852] = 0x9AE1, [ 9853] = 0x9CE9, [ 9854] = 0x9E82, [ 9855] = 0x9F0E, ++ [ 9856] = 0x9F13, [ 9857] = 0x9F20, [ 9858] = 0x50E7, [ 9859] = 0x50EE, ++ [ 9860] = 0x50E5, [ 9861] = 0x50D6, [ 9862] = 0x50ED, [ 9863] = 0x50DA, ++ [ 9864] = 0x50D5, [ 9865] = 0x50CF, [ 9866] = 0x50D1, [ 9867] = 0x50F1, ++ [ 9868] = 0x50CE, [ 9869] = 0x50E9, [ 9870] = 0x5162, [ 9871] = 0x51F3, ++ [ 9872] = 0x5283, [ 9873] = 0x5282, [ 9874] = 0x5331, [ 9875] = 0x53AD, ++ [ 9876] = 0x55FE, [ 9877] = 0x5600, [ 9878] = 0x561B, [ 9879] = 0x5617, ++ [ 9880] = 0x55FD, [ 9881] = 0x5614, [ 9882] = 0x5606, [ 9883] = 0x5609, ++ [ 9884] = 0x560D, [ 9885] = 0x560E, [ 9886] = 0x55F7, [ 9887] = 0x5616, ++ [ 9888] = 0x561F, [ 9889] = 0x5608, [ 9890] = 0x5610, [ 9891] = 0x55F6, ++ [ 9892] = 0x5718, [ 9893] = 0x5716, [ 9894] = 0x5875, [ 9895] = 0x587E, ++ [ 9896] = 0x5883, [ 9897] = 0x5893, [ 9898] = 0x588A, [ 9899] = 0x5879, ++ [ 9900] = 0x5885, [ 9901] = 0x587D, [ 9902] = 0x58FD, [ 9903] = 0x5925, ++ [ 9904] = 0x5922, [ 9905] = 0x5924, [ 9906] = 0x596A, [ 9907] = 0x5969, ++ [ 9908] = 0x5AE1, [ 9909] = 0x5AE6, [ 9910] = 0x5AE9, [ 9911] = 0x5AD7, ++ [ 9912] = 0x5AD6, [ 9913] = 0x5AD8, [ 9914] = 0x5AE3, [ 9915] = 0x5B75, ++ [ 9916] = 0x5BDE, [ 9917] = 0x5BE7, [ 9918] = 0x5BE1, [ 9919] = 0x5BE5, ++ [ 9920] = 0x5BE6, [ 9921] = 0x5BE8, [ 9922] = 0x5BE2, [ 9923] = 0x5BE4, ++ [ 9924] = 0x5BDF, [ 9925] = 0x5C0D, [ 9926] = 0x5C62, [ 9927] = 0x5D84, ++ [ 9928] = 0x5D87, [ 9929] = 0x5E5B, [ 9930] = 0x5E63, [ 9931] = 0x5E55, ++ [ 9932] = 0x5E57, [ 9933] = 0x5E54, [ 9934] = 0x5ED3, [ 9935] = 0x5ED6, ++ [ 9936] = 0x5F0A, [ 9937] = 0x5F46, [ 9938] = 0x5F70, [ 9939] = 0x5FB9, ++ [ 9940] = 0x6147, [ 9945] = 0x613F, [ 9946] = 0x614B, [ 9947] = 0x6177, ++ [ 9948] = 0x6162, [ 9949] = 0x6163, [ 9950] = 0x615F, [ 9951] = 0x615A, ++ [ 9952] = 0x6158, [ 9953] = 0x6175, [ 9954] = 0x622A, [ 9955] = 0x6487, ++ [ 9956] = 0x6458, [ 9957] = 0x6454, [ 9958] = 0x64A4, [ 9959] = 0x6478, ++ [ 9960] = 0x645F, [ 9961] = 0x647A, [ 9962] = 0x6451, [ 9963] = 0x6467, ++ [ 9964] = 0x6434, [ 9965] = 0x646D, [ 9966] = 0x647B, [ 9967] = 0x6572, ++ [ 9968] = 0x65A1, [ 9969] = 0x65D7, [ 9970] = 0x65D6, [ 9971] = 0x66A2, ++ [ 9972] = 0x66A8, [ 9973] = 0x669D, [ 9974] = 0x699C, [ 9975] = 0x69A8, ++ [ 9976] = 0x6995, [ 9977] = 0x69C1, [ 9978] = 0x69AE, [ 9979] = 0x69D3, ++ [ 9980] = 0x69CB, [ 9981] = 0x699B, [ 9982] = 0x69B7, [ 9983] = 0x69BB, ++ [ 9984] = 0x69AB, [ 9985] = 0x69B4, [ 9986] = 0x69D0, [ 9987] = 0x69CD, ++ [ 9988] = 0x69AD, [ 9989] = 0x69CC, [ 9990] = 0x69A6, [ 9991] = 0x69C3, ++ [ 9992] = 0x69A3, [ 9993] = 0x6B49, [ 9994] = 0x6B4C, [ 9995] = 0x6C33, ++ [ 9996] = 0x6F33, [ 9997] = 0x6F14, [ 9998] = 0x6EFE, [ 9999] = 0x6F13, ++ [10000] = 0x6EF4, [10001] = 0x6F29, [10002] = 0x6F3E, [10003] = 0x6F20, ++ [10004] = 0x6F2C, [10005] = 0x6F0F, [10006] = 0x6F02, [10007] = 0x6F22, ++ [10042] = 0x6EFF, [10043] = 0x6EEF, [10044] = 0x6F06, [10045] = 0x6F31, ++ [10046] = 0x6F38, [10047] = 0x6F32, [10048] = 0x6F23, [10049] = 0x6F15, ++ [10050] = 0x6F2B, [10051] = 0x6F2F, [10052] = 0x6F88, [10053] = 0x6F2A, ++ [10054] = 0x6EEC, [10055] = 0x6F01, [10056] = 0x6EF2, [10057] = 0x6ECC, ++ [10058] = 0x6EF7, [10059] = 0x7194, [10060] = 0x7199, [10061] = 0x717D, ++ [10062] = 0x718A, [10063] = 0x7184, [10064] = 0x7192, [10065] = 0x723E, ++ [10066] = 0x7292, [10067] = 0x7296, [10068] = 0x7344, [10069] = 0x7350, ++ [10070] = 0x7464, [10071] = 0x7463, [10072] = 0x746A, [10073] = 0x7470, ++ [10074] = 0x746D, [10075] = 0x7504, [10076] = 0x7591, [10077] = 0x7627, ++ [10078] = 0x760D, [10079] = 0x760B, [10080] = 0x7609, [10081] = 0x7613, ++ [10082] = 0x76E1, [10083] = 0x76E3, [10084] = 0x7784, [10085] = 0x777D, ++ [10086] = 0x777F, [10087] = 0x7761, [10088] = 0x78C1, [10089] = 0x789F, ++ [10090] = 0x78A7, [10091] = 0x78B3, [10092] = 0x78A9, [10093] = 0x78A3, ++ [10094] = 0x798E, [10095] = 0x798F, [10096] = 0x798D, [10097] = 0x7A2E, ++ [10098] = 0x7A31, [10099] = 0x7AAA, [10100] = 0x7AA9, [10101] = 0x7AED, ++ [10102] = 0x7AEF, [10103] = 0x7BA1, [10104] = 0x7B95, [10105] = 0x7B8B, ++ [10106] = 0x7B75, [10107] = 0x7B97, [10108] = 0x7B9D, [10109] = 0x7B94, ++ [10110] = 0x7B8F, [10111] = 0x7BB8, [10112] = 0x7B87, [10113] = 0x7B84, ++ [10114] = 0x7CB9, [10115] = 0x7CBD, [10116] = 0x7CBE, [10117] = 0x7DBB, ++ [10118] = 0x7DB0, [10119] = 0x7D9C, [10120] = 0x7DBD, [10121] = 0x7DBE, ++ [10122] = 0x7DA0, [10123] = 0x7DCA, [10124] = 0x7DB4, [10125] = 0x7DB2, ++ [10126] = 0x7DB1, [10127] = 0x7DBA, [10128] = 0x7DA2, [10129] = 0x7DBF, ++ [10130] = 0x7DB5, [10131] = 0x7DB8, [10132] = 0x7DAD, [10133] = 0x7DD2, ++ [10134] = 0x7DC7, [10135] = 0x7DAC, [10140] = 0x7F70, [10141] = 0x7FE0, ++ [10142] = 0x7FE1, [10143] = 0x7FDF, [10144] = 0x805E, [10145] = 0x805A, ++ [10146] = 0x8087, [10147] = 0x8150, [10148] = 0x8180, [10149] = 0x818F, ++ [10150] = 0x8188, [10151] = 0x818A, [10152] = 0x817F, [10153] = 0x8182, ++ [10154] = 0x81E7, [10155] = 0x81FA, [10156] = 0x8207, [10157] = 0x8214, ++ [10158] = 0x821E, [10159] = 0x824B, [10160] = 0x84C9, [10161] = 0x84BF, ++ [10162] = 0x84C6, [10163] = 0x84C4, [10164] = 0x8499, [10165] = 0x849E, ++ [10166] = 0x84B2, [10167] = 0x849C, [10168] = 0x84CB, [10169] = 0x84B8, ++ [10170] = 0x84C0, [10171] = 0x84D3, [10172] = 0x8490, [10173] = 0x84BC, ++ [10174] = 0x84D1, [10175] = 0x84CA, [10176] = 0x873F, [10177] = 0x871C, ++ [10178] = 0x873B, [10179] = 0x8722, [10180] = 0x8725, [10181] = 0x8734, ++ [10182] = 0x8718, [10183] = 0x8755, [10184] = 0x8737, [10185] = 0x8729, ++ [10186] = 0x88F3, [10187] = 0x8902, [10188] = 0x88F4, [10189] = 0x88F9, ++ [10190] = 0x88F8, [10191] = 0x88FD, [10192] = 0x88E8, [10193] = 0x891A, ++ [10194] = 0x88EF, [10195] = 0x8AA6, [10196] = 0x8A8C, [10197] = 0x8A9E, ++ [10198] = 0x8AA3, [10199] = 0x8A8D, [10200] = 0x8AA1, [10201] = 0x8A93, ++ [10202] = 0x8AA4, [10237] = 0x8AAA, [10238] = 0x8AA5, [10239] = 0x8AA8, ++ [10240] = 0x8A98, [10241] = 0x8A91, [10242] = 0x8A9A, [10243] = 0x8AA7, ++ [10244] = 0x8C6A, [10245] = 0x8C8D, [10246] = 0x8C8C, [10247] = 0x8CD3, ++ [10248] = 0x8CD1, [10249] = 0x8CD2, [10250] = 0x8D6B, [10251] = 0x8D99, ++ [10252] = 0x8D95, [10253] = 0x8DFC, [10254] = 0x8F14, [10255] = 0x8F12, ++ [10256] = 0x8F15, [10257] = 0x8F13, [10258] = 0x8FA3, [10259] = 0x9060, ++ [10260] = 0x9058, [10261] = 0x905C, [10262] = 0x9063, [10263] = 0x9059, ++ [10264] = 0x905E, [10265] = 0x9062, [10266] = 0x905D, [10267] = 0x905B, ++ [10268] = 0x9119, [10269] = 0x9118, [10270] = 0x911E, [10271] = 0x9175, ++ [10272] = 0x9178, [10273] = 0x9177, [10274] = 0x9174, [10275] = 0x9278, ++ [10276] = 0x9280, [10277] = 0x9285, [10278] = 0x9298, [10279] = 0x9296, ++ [10280] = 0x927B, [10281] = 0x9293, [10282] = 0x929C, [10283] = 0x92A8, ++ [10284] = 0x927C, [10285] = 0x9291, [10286] = 0x95A1, [10287] = 0x95A8, ++ [10288] = 0x95A9, [10289] = 0x95A3, [10290] = 0x95A5, [10291] = 0x95A4, ++ [10292] = 0x9699, [10293] = 0x969C, [10294] = 0x969B, [10295] = 0x96CC, ++ [10296] = 0x96D2, [10297] = 0x9700, [10298] = 0x977C, [10299] = 0x9785, ++ [10300] = 0x97F6, [10301] = 0x9817, [10302] = 0x9818, [10303] = 0x98AF, ++ [10304] = 0x98B1, [10305] = 0x9903, [10306] = 0x9905, [10307] = 0x990C, ++ [10308] = 0x9909, [10309] = 0x99C1, [10310] = 0x9AAF, [10311] = 0x9AB0, ++ [10312] = 0x9AE6, [10313] = 0x9B41, [10314] = 0x9B42, [10315] = 0x9CF4, ++ [10316] = 0x9CF6, [10317] = 0x9CF3, [10318] = 0x9EBC, [10319] = 0x9F3B, ++ [10320] = 0x9F4A, [10321] = 0x5104, [10322] = 0x5100, [10323] = 0x50FB, ++ [10324] = 0x50F5, [10325] = 0x50F9, [10326] = 0x5102, [10327] = 0x5108, ++ [10328] = 0x5109, [10329] = 0x5105, [10330] = 0x51DC, [10335] = 0x5287, ++ [10336] = 0x5288, [10337] = 0x5289, [10338] = 0x528D, [10339] = 0x528A, ++ [10340] = 0x52F0, [10341] = 0x53B2, [10342] = 0x562E, [10343] = 0x563B, ++ [10344] = 0x5639, [10345] = 0x5632, [10346] = 0x563F, [10347] = 0x5634, ++ [10348] = 0x5629, [10349] = 0x5653, [10350] = 0x564E, [10351] = 0x5657, ++ [10352] = 0x5674, [10353] = 0x5636, [10354] = 0x562F, [10355] = 0x5630, ++ [10356] = 0x5880, [10357] = 0x589F, [10358] = 0x589E, [10359] = 0x58B3, ++ [10360] = 0x589C, [10361] = 0x58AE, [10362] = 0x58A9, [10363] = 0x58A6, ++ [10364] = 0x596D, [10365] = 0x5B09, [10366] = 0x5AFB, [10367] = 0x5B0B, ++ [10368] = 0x5AF5, [10369] = 0x5B0C, [10370] = 0x5B08, [10371] = 0x5BEE, ++ [10372] = 0x5BEC, [10373] = 0x5BE9, [10374] = 0x5BEB, [10375] = 0x5C64, ++ [10376] = 0x5C65, [10377] = 0x5D9D, [10378] = 0x5D94, [10379] = 0x5E62, ++ [10380] = 0x5E5F, [10381] = 0x5E61, [10382] = 0x5EE2, [10383] = 0x5EDA, ++ [10384] = 0x5EDF, [10385] = 0x5EDD, [10386] = 0x5EE3, [10387] = 0x5EE0, ++ [10388] = 0x5F48, [10389] = 0x5F71, [10390] = 0x5FB7, [10391] = 0x5FB5, ++ [10392] = 0x6176, [10393] = 0x6167, [10394] = 0x616E, [10395] = 0x615D, ++ [10396] = 0x6155, [10397] = 0x6182, [10432] = 0x617C, [10433] = 0x6170, ++ [10434] = 0x616B, [10435] = 0x617E, [10436] = 0x61A7, [10437] = 0x6190, ++ [10438] = 0x61AB, [10439] = 0x618E, [10440] = 0x61AC, [10441] = 0x619A, ++ [10442] = 0x61A4, [10443] = 0x6194, [10444] = 0x61AE, [10445] = 0x622E, ++ [10446] = 0x6469, [10447] = 0x646F, [10448] = 0x6479, [10449] = 0x649E, ++ [10450] = 0x64B2, [10451] = 0x6488, [10452] = 0x6490, [10453] = 0x64B0, ++ [10454] = 0x64A5, [10455] = 0x6493, [10456] = 0x6495, [10457] = 0x64A9, ++ [10458] = 0x6492, [10459] = 0x64AE, [10460] = 0x64AD, [10461] = 0x64AB, ++ [10462] = 0x649A, [10463] = 0x64AC, [10464] = 0x6499, [10465] = 0x64A2, ++ [10466] = 0x64B3, [10467] = 0x6575, [10468] = 0x6577, [10469] = 0x6578, ++ [10470] = 0x66AE, [10471] = 0x66AB, [10472] = 0x66B4, [10473] = 0x66B1, ++ [10474] = 0x6A23, [10475] = 0x6A1F, [10476] = 0x69E8, [10477] = 0x6A01, ++ [10478] = 0x6A1E, [10479] = 0x6A19, [10480] = 0x69FD, [10481] = 0x6A21, ++ [10482] = 0x6A13, [10483] = 0x6A0A, [10484] = 0x69F3, [10485] = 0x6A02, ++ [10486] = 0x6A05, [10487] = 0x69ED, [10488] = 0x6A11, [10489] = 0x6B50, ++ [10490] = 0x6B4E, [10491] = 0x6BA4, [10492] = 0x6BC5, [10493] = 0x6BC6, ++ [10494] = 0x6F3F, [10495] = 0x6F7C, [10496] = 0x6F84, [10497] = 0x6F51, ++ [10498] = 0x6F66, [10499] = 0x6F54, [10500] = 0x6F86, [10501] = 0x6F6D, ++ [10502] = 0x6F5B, [10503] = 0x6F78, [10504] = 0x6F6E, [10505] = 0x6F8E, ++ [10506] = 0x6F7A, [10507] = 0x6F70, [10508] = 0x6F64, [10509] = 0x6F97, ++ [10510] = 0x6F58, [10511] = 0x6ED5, [10512] = 0x6F6F, [10513] = 0x6F60, ++ [10514] = 0x6F5F, [10515] = 0x719F, [10516] = 0x71AC, [10517] = 0x71B1, ++ [10518] = 0x71A8, [10519] = 0x7256, [10520] = 0x729B, [10521] = 0x734E, ++ [10522] = 0x7357, [10523] = 0x7469, [10524] = 0x748B, [10525] = 0x7483, ++ [10530] = 0x747E, [10531] = 0x7480, [10532] = 0x757F, [10533] = 0x7620, ++ [10534] = 0x7629, [10535] = 0x761F, [10536] = 0x7624, [10537] = 0x7626, ++ [10538] = 0x7621, [10539] = 0x7622, [10540] = 0x769A, [10541] = 0x76BA, ++ [10542] = 0x76E4, [10543] = 0x778E, [10544] = 0x7787, [10545] = 0x778C, ++ [10546] = 0x7791, [10547] = 0x778B, [10548] = 0x78CB, [10549] = 0x78C5, ++ [10550] = 0x78BA, [10551] = 0x78CA, [10552] = 0x78BE, [10553] = 0x78D5, ++ [10554] = 0x78BC, [10555] = 0x78D0, [10556] = 0x7A3F, [10557] = 0x7A3C, ++ [10558] = 0x7A40, [10559] = 0x7A3D, [10560] = 0x7A37, [10561] = 0x7A3B, ++ [10562] = 0x7AAF, [10563] = 0x7AAE, [10564] = 0x7BAD, [10565] = 0x7BB1, ++ [10566] = 0x7BC4, [10567] = 0x7BB4, [10568] = 0x7BC6, [10569] = 0x7BC7, ++ [10570] = 0x7BC1, [10571] = 0x7BA0, [10572] = 0x7BCC, [10573] = 0x7CCA, ++ [10574] = 0x7DE0, [10575] = 0x7DF4, [10576] = 0x7DEF, [10577] = 0x7DFB, ++ [10578] = 0x7DD8, [10579] = 0x7DEC, [10580] = 0x7DDD, [10581] = 0x7DE8, ++ [10582] = 0x7DE3, [10583] = 0x7DDA, [10584] = 0x7DDE, [10585] = 0x7DE9, ++ [10586] = 0x7D9E, [10587] = 0x7DD9, [10588] = 0x7DF2, [10589] = 0x7DF9, ++ [10590] = 0x7F75, [10591] = 0x7F77, [10592] = 0x7FAF, [10627] = 0x7FE9, ++ [10628] = 0x8026, [10629] = 0x819B, [10630] = 0x819C, [10631] = 0x819D, ++ [10632] = 0x81A0, [10633] = 0x819A, [10634] = 0x8198, [10635] = 0x8517, ++ [10636] = 0x853D, [10637] = 0x851A, [10638] = 0x84EE, [10639] = 0x852C, ++ [10640] = 0x852D, [10641] = 0x8513, [10642] = 0x8511, [10643] = 0x8523, ++ [10644] = 0x8521, [10645] = 0x8514, [10646] = 0x84EC, [10647] = 0x8525, ++ [10648] = 0x84FF, [10649] = 0x8506, [10650] = 0x8782, [10651] = 0x8774, ++ [10652] = 0x8776, [10653] = 0x8760, [10654] = 0x8766, [10655] = 0x8778, ++ [10656] = 0x8768, [10657] = 0x8759, [10658] = 0x8757, [10659] = 0x874C, ++ [10660] = 0x8753, [10661] = 0x885B, [10662] = 0x885D, [10663] = 0x8910, ++ [10664] = 0x8907, [10665] = 0x8912, [10666] = 0x8913, [10667] = 0x8915, ++ [10668] = 0x890A, [10669] = 0x8ABC, [10670] = 0x8AD2, [10671] = 0x8AC7, ++ [10672] = 0x8AC4, [10673] = 0x8A95, [10674] = 0x8ACB, [10675] = 0x8AF8, ++ [10676] = 0x8AB2, [10677] = 0x8AC9, [10678] = 0x8AC2, [10679] = 0x8ABF, ++ [10680] = 0x8AB0, [10681] = 0x8AD6, [10682] = 0x8ACD, [10683] = 0x8AB6, ++ [10684] = 0x8AB9, [10685] = 0x8ADB, [10686] = 0x8C4C, [10687] = 0x8C4E, ++ [10688] = 0x8C6C, [10689] = 0x8CE0, [10690] = 0x8CDE, [10691] = 0x8CE6, ++ [10692] = 0x8CE4, [10693] = 0x8CEC, [10694] = 0x8CED, [10695] = 0x8CE2, ++ [10696] = 0x8CE3, [10697] = 0x8CDC, [10698] = 0x8CEA, [10699] = 0x8CE1, ++ [10700] = 0x8D6D, [10701] = 0x8D9F, [10702] = 0x8DA3, [10703] = 0x8E2B, ++ [10704] = 0x8E10, [10705] = 0x8E1D, [10706] = 0x8E22, [10707] = 0x8E0F, ++ [10708] = 0x8E29, [10709] = 0x8E1F, [10710] = 0x8E21, [10711] = 0x8E1E, ++ [10712] = 0x8EBA, [10713] = 0x8F1D, [10714] = 0x8F1B, [10715] = 0x8F1F, ++ [10716] = 0x8F29, [10717] = 0x8F26, [10718] = 0x8F2A, [10719] = 0x8F1C, ++ [10720] = 0x8F1E, [10725] = 0x8F25, [10726] = 0x9069, [10727] = 0x906E, ++ [10728] = 0x9068, [10729] = 0x906D, [10730] = 0x9077, [10731] = 0x9130, ++ [10732] = 0x912D, [10733] = 0x9127, [10734] = 0x9131, [10735] = 0x9187, ++ [10736] = 0x9189, [10737] = 0x918B, [10738] = 0x9183, [10739] = 0x92C5, ++ [10740] = 0x92BB, [10741] = 0x92B7, [10742] = 0x92EA, [10743] = 0x92AC, ++ [10744] = 0x92E4, [10745] = 0x92C1, [10746] = 0x92B3, [10747] = 0x92BC, ++ [10748] = 0x92D2, [10749] = 0x92C7, [10750] = 0x92F0, [10751] = 0x92B2, ++ [10752] = 0x95AD, [10753] = 0x95B1, [10754] = 0x9704, [10755] = 0x9706, ++ [10756] = 0x9707, [10757] = 0x9709, [10758] = 0x9760, [10759] = 0x978D, ++ [10760] = 0x978B, [10761] = 0x978F, [10762] = 0x9821, [10763] = 0x982B, ++ [10764] = 0x981C, [10765] = 0x98B3, [10766] = 0x990A, [10767] = 0x9913, ++ [10768] = 0x9912, [10769] = 0x9918, [10770] = 0x99DD, [10771] = 0x99D0, ++ [10772] = 0x99DF, [10773] = 0x99DB, [10774] = 0x99D1, [10775] = 0x99D5, ++ [10776] = 0x99D2, [10777] = 0x99D9, [10778] = 0x9AB7, [10779] = 0x9AEE, ++ [10780] = 0x9AEF, [10781] = 0x9B27, [10782] = 0x9B45, [10783] = 0x9B44, ++ [10784] = 0x9B77, [10785] = 0x9B6F, [10786] = 0x9D06, [10787] = 0x9D09, ++ [10822] = 0x9D03, [10823] = 0x9EA9, [10824] = 0x9EBE, [10825] = 0x9ECE, ++ [10826] = 0x58A8, [10827] = 0x9F52, [10828] = 0x5112, [10829] = 0x5118, ++ [10830] = 0x5114, [10831] = 0x5110, [10832] = 0x5115, [10833] = 0x5180, ++ [10834] = 0x51AA, [10835] = 0x51DD, [10836] = 0x5291, [10837] = 0x5293, ++ [10838] = 0x52F3, [10839] = 0x5659, [10840] = 0x566B, [10841] = 0x5679, ++ [10842] = 0x5669, [10843] = 0x5664, [10844] = 0x5678, [10845] = 0x566A, ++ [10846] = 0x5668, [10847] = 0x5665, [10848] = 0x5671, [10849] = 0x566F, ++ [10850] = 0x566C, [10851] = 0x5662, [10852] = 0x5676, [10853] = 0x58C1, ++ [10854] = 0x58BE, [10855] = 0x58C7, [10856] = 0x58C5, [10857] = 0x596E, ++ [10858] = 0x5B1D, [10859] = 0x5B34, [10860] = 0x5B78, [10861] = 0x5BF0, ++ [10862] = 0x5C0E, [10863] = 0x5F4A, [10864] = 0x61B2, [10865] = 0x6191, ++ [10866] = 0x61A9, [10867] = 0x618A, [10868] = 0x61CD, [10869] = 0x61B6, ++ [10870] = 0x61BE, [10871] = 0x61CA, [10872] = 0x61C8, [10873] = 0x6230, ++ [10874] = 0x64C5, [10875] = 0x64C1, [10876] = 0x64CB, [10877] = 0x64BB, ++ [10878] = 0x64BC, [10879] = 0x64DA, [10880] = 0x64C4, [10881] = 0x64C7, ++ [10882] = 0x64C2, [10883] = 0x64CD, [10884] = 0x64BF, [10885] = 0x64D2, ++ [10886] = 0x64D4, [10887] = 0x64BE, [10888] = 0x6574, [10889] = 0x66C6, ++ [10890] = 0x66C9, [10891] = 0x66B9, [10892] = 0x66C4, [10893] = 0x66C7, ++ [10894] = 0x66B8, [10895] = 0x6A3D, [10896] = 0x6A38, [10897] = 0x6A3A, ++ [10898] = 0x6A59, [10899] = 0x6A6B, [10900] = 0x6A58, [10901] = 0x6A39, ++ [10902] = 0x6A44, [10903] = 0x6A62, [10904] = 0x6A61, [10905] = 0x6A4B, ++ [10906] = 0x6A47, [10907] = 0x6A35, [10908] = 0x6A5F, [10909] = 0x6A48, ++ [10910] = 0x6B59, [10911] = 0x6B77, [10912] = 0x6C05, [10913] = 0x6FC2, ++ [10914] = 0x6FB1, [10915] = 0x6FA1, [10920] = 0x6FC3, [10921] = 0x6FA4, ++ [10922] = 0x6FC1, [10923] = 0x6FA7, [10924] = 0x6FB3, [10925] = 0x6FC0, ++ [10926] = 0x6FB9, [10927] = 0x6FB6, [10928] = 0x6FA6, [10929] = 0x6FA0, ++ [10930] = 0x6FB4, [10931] = 0x71BE, [10932] = 0x71C9, [10933] = 0x71D0, ++ [10934] = 0x71D2, [10935] = 0x71C8, [10936] = 0x71D5, [10937] = 0x71B9, ++ [10938] = 0x71CE, [10939] = 0x71D9, [10940] = 0x71DC, [10941] = 0x71C3, ++ [10942] = 0x71C4, [10943] = 0x7368, [10944] = 0x749C, [10945] = 0x74A3, ++ [10946] = 0x7498, [10947] = 0x749F, [10948] = 0x749E, [10949] = 0x74E2, ++ [10950] = 0x750C, [10951] = 0x750D, [10952] = 0x7634, [10953] = 0x7638, ++ [10954] = 0x763A, [10955] = 0x76E7, [10956] = 0x76E5, [10957] = 0x77A0, ++ [10958] = 0x779E, [10959] = 0x779F, [10960] = 0x77A5, [10961] = 0x78E8, ++ [10962] = 0x78DA, [10963] = 0x78EC, [10964] = 0x78E7, [10965] = 0x79A6, ++ [10966] = 0x7A4D, [10967] = 0x7A4E, [10968] = 0x7A46, [10969] = 0x7A4C, ++ [10970] = 0x7A4B, [10971] = 0x7ABA, [10972] = 0x7BD9, [10973] = 0x7C11, ++ [10974] = 0x7BC9, [10975] = 0x7BE4, [10976] = 0x7BDB, [10977] = 0x7BE1, ++ [10978] = 0x7BE9, [10979] = 0x7BE6, [10980] = 0x7CD5, [10981] = 0x7CD6, ++ [10982] = 0x7E0A, [11017] = 0x7E11, [11018] = 0x7E08, [11019] = 0x7E1B, ++ [11020] = 0x7E23, [11021] = 0x7E1E, [11022] = 0x7E1D, [11023] = 0x7E09, ++ [11024] = 0x7E10, [11025] = 0x7F79, [11026] = 0x7FB2, [11027] = 0x7FF0, ++ [11028] = 0x7FF1, [11029] = 0x7FEE, [11030] = 0x8028, [11031] = 0x81B3, ++ [11032] = 0x81A9, [11033] = 0x81A8, [11034] = 0x81FB, [11035] = 0x8208, ++ [11036] = 0x8258, [11037] = 0x8259, [11038] = 0x854A, [11039] = 0x8559, ++ [11040] = 0x8548, [11041] = 0x8568, [11042] = 0x8569, [11043] = 0x8543, ++ [11044] = 0x8549, [11045] = 0x856D, [11046] = 0x856A, [11047] = 0x855E, ++ [11048] = 0x8783, [11049] = 0x879F, [11050] = 0x879E, [11051] = 0x87A2, ++ [11052] = 0x878D, [11053] = 0x8861, [11054] = 0x892A, [11055] = 0x8932, ++ [11056] = 0x8925, [11057] = 0x892B, [11058] = 0x8921, [11059] = 0x89AA, ++ [11060] = 0x89A6, [11061] = 0x8AE6, [11062] = 0x8AFA, [11063] = 0x8AEB, ++ [11064] = 0x8AF1, [11065] = 0x8B00, [11066] = 0x8ADC, [11067] = 0x8AE7, ++ [11068] = 0x8AEE, [11069] = 0x8AFE, [11070] = 0x8B01, [11071] = 0x8B02, ++ [11072] = 0x8AF7, [11073] = 0x8AED, [11074] = 0x8AF3, [11075] = 0x8AF6, ++ [11076] = 0x8AFC, [11077] = 0x8C6B, [11078] = 0x8C6D, [11079] = 0x8C93, ++ [11080] = 0x8CF4, [11081] = 0x8E44, [11082] = 0x8E31, [11083] = 0x8E34, ++ [11084] = 0x8E42, [11085] = 0x8E39, [11086] = 0x8E35, [11087] = 0x8F3B, ++ [11088] = 0x8F2F, [11089] = 0x8F38, [11090] = 0x8F33, [11091] = 0x8FA8, ++ [11092] = 0x8FA6, [11093] = 0x9075, [11094] = 0x9074, [11095] = 0x9078, ++ [11096] = 0x9072, [11097] = 0x907C, [11098] = 0x907A, [11099] = 0x9134, ++ [11100] = 0x9192, [11101] = 0x9320, [11102] = 0x9336, [11103] = 0x92F8, ++ [11104] = 0x9333, [11105] = 0x932F, [11106] = 0x9322, [11107] = 0x92FC, ++ [11108] = 0x932B, [11109] = 0x9304, [11110] = 0x931A, [11115] = 0x9310, ++ [11116] = 0x9326, [11117] = 0x9321, [11118] = 0x9315, [11119] = 0x932E, ++ [11120] = 0x9319, [11121] = 0x95BB, [11122] = 0x96A7, [11123] = 0x96A8, ++ [11124] = 0x96AA, [11125] = 0x96D5, [11126] = 0x970E, [11127] = 0x9711, ++ [11128] = 0x9716, [11129] = 0x970D, [11130] = 0x9713, [11131] = 0x970F, ++ [11132] = 0x975B, [11133] = 0x975C, [11134] = 0x9766, [11135] = 0x9798, ++ [11136] = 0x9830, [11137] = 0x9838, [11138] = 0x983B, [11139] = 0x9837, ++ [11140] = 0x982D, [11141] = 0x9839, [11142] = 0x9824, [11143] = 0x9910, ++ [11144] = 0x9928, [11145] = 0x991E, [11146] = 0x991B, [11147] = 0x9921, ++ [11148] = 0x991A, [11149] = 0x99ED, [11150] = 0x99E2, [11151] = 0x99F1, ++ [11152] = 0x9AB8, [11153] = 0x9ABC, [11154] = 0x9AFB, [11155] = 0x9AED, ++ [11156] = 0x9B28, [11157] = 0x9B91, [11158] = 0x9D15, [11159] = 0x9D23, ++ [11160] = 0x9D26, [11161] = 0x9D28, [11162] = 0x9D12, [11163] = 0x9D1B, ++ [11164] = 0x9ED8, [11165] = 0x9ED4, [11166] = 0x9F8D, [11167] = 0x9F9C, ++ [11168] = 0x512A, [11169] = 0x511F, [11170] = 0x5121, [11171] = 0x5132, ++ [11172] = 0x52F5, [11173] = 0x568E, [11174] = 0x5680, [11175] = 0x5690, ++ [11176] = 0x5685, [11177] = 0x5687, [11212] = 0x568F, [11213] = 0x58D5, ++ [11214] = 0x58D3, [11215] = 0x58D1, [11216] = 0x58CE, [11217] = 0x5B30, ++ [11218] = 0x5B2A, [11219] = 0x5B24, [11220] = 0x5B7A, [11221] = 0x5C37, ++ [11222] = 0x5C68, [11223] = 0x5DBC, [11224] = 0x5DBA, [11225] = 0x5DBD, ++ [11226] = 0x5DB8, [11227] = 0x5E6B, [11228] = 0x5F4C, [11229] = 0x5FBD, ++ [11230] = 0x61C9, [11231] = 0x61C2, [11232] = 0x61C7, [11233] = 0x61E6, ++ [11234] = 0x61CB, [11235] = 0x6232, [11236] = 0x6234, [11237] = 0x64CE, ++ [11238] = 0x64CA, [11239] = 0x64D8, [11240] = 0x64E0, [11241] = 0x64F0, ++ [11242] = 0x64E6, [11243] = 0x64EC, [11244] = 0x64F1, [11245] = 0x64E2, ++ [11246] = 0x64ED, [11247] = 0x6582, [11248] = 0x6583, [11249] = 0x66D9, ++ [11250] = 0x66D6, [11251] = 0x6A80, [11252] = 0x6A94, [11253] = 0x6A84, ++ [11254] = 0x6AA2, [11255] = 0x6A9C, [11256] = 0x6ADB, [11257] = 0x6AA3, ++ [11258] = 0x6A7E, [11259] = 0x6A97, [11260] = 0x6A90, [11261] = 0x6AA0, ++ [11262] = 0x6B5C, [11263] = 0x6BAE, [11264] = 0x6BDA, [11265] = 0x6C08, ++ [11266] = 0x6FD8, [11267] = 0x6FF1, [11268] = 0x6FDF, [11269] = 0x6FE0, ++ [11270] = 0x6FDB, [11271] = 0x6FE4, [11272] = 0x6FEB, [11273] = 0x6FEF, ++ [11274] = 0x6F80, [11275] = 0x6FEC, [11276] = 0x6FE1, [11277] = 0x6FE9, ++ [11278] = 0x6FD5, [11279] = 0x6FEE, [11280] = 0x6FF0, [11281] = 0x71E7, ++ [11282] = 0x71DF, [11283] = 0x71EE, [11284] = 0x71E6, [11285] = 0x71E5, ++ [11286] = 0x71ED, [11287] = 0x71EC, [11288] = 0x71F4, [11289] = 0x71E0, ++ [11290] = 0x7235, [11291] = 0x7246, [11292] = 0x7370, [11293] = 0x7372, ++ [11294] = 0x74A9, [11295] = 0x74B0, [11296] = 0x74A6, [11297] = 0x74A8, ++ [11298] = 0x7646, [11299] = 0x7642, [11300] = 0x764C, [11301] = 0x76EA, ++ [11302] = 0x77B3, [11303] = 0x77AA, [11304] = 0x77B0, [11305] = 0x77AC, ++ [11310] = 0x77A7, [11311] = 0x77AD, [11312] = 0x77EF, [11313] = 0x78F7, ++ [11314] = 0x78FA, [11315] = 0x78F4, [11316] = 0x78EF, [11317] = 0x7901, ++ [11318] = 0x79A7, [11319] = 0x79AA, [11320] = 0x7A57, [11321] = 0x7ABF, ++ [11322] = 0x7C07, [11323] = 0x7C0D, [11324] = 0x7BFE, [11325] = 0x7BF7, ++ [11326] = 0x7C0C, [11327] = 0x7BE0, [11328] = 0x7CE0, [11329] = 0x7CDC, ++ [11330] = 0x7CDE, [11331] = 0x7CE2, [11332] = 0x7CDF, [11333] = 0x7CD9, ++ [11334] = 0x7CDD, [11335] = 0x7E2E, [11336] = 0x7E3E, [11337] = 0x7E46, ++ [11338] = 0x7E37, [11339] = 0x7E32, [11340] = 0x7E43, [11341] = 0x7E2B, ++ [11342] = 0x7E3D, [11343] = 0x7E31, [11344] = 0x7E45, [11345] = 0x7E41, ++ [11346] = 0x7E34, [11347] = 0x7E39, [11348] = 0x7E48, [11349] = 0x7E35, ++ [11350] = 0x7E3F, [11351] = 0x7E2F, [11352] = 0x7F44, [11353] = 0x7FF3, ++ [11354] = 0x7FFC, [11355] = 0x8071, [11356] = 0x8072, [11357] = 0x8070, ++ [11358] = 0x806F, [11359] = 0x8073, [11360] = 0x81C6, [11361] = 0x81C3, ++ [11362] = 0x81BA, [11363] = 0x81C2, [11364] = 0x81C0, [11365] = 0x81BF, ++ [11366] = 0x81BD, [11367] = 0x81C9, [11368] = 0x81BE, [11369] = 0x81E8, ++ [11370] = 0x8209, [11371] = 0x8271, [11372] = 0x85AA, [11407] = 0x8584, ++ [11408] = 0x857E, [11409] = 0x859C, [11410] = 0x8591, [11411] = 0x8594, ++ [11412] = 0x85AF, [11413] = 0x859B, [11414] = 0x8587, [11415] = 0x85A8, ++ [11416] = 0x858A, [11417] = 0x8667, [11418] = 0x87C0, [11419] = 0x87D1, ++ [11420] = 0x87B3, [11421] = 0x87D2, [11422] = 0x87C6, [11423] = 0x87AB, ++ [11424] = 0x87BB, [11425] = 0x87BA, [11426] = 0x87C8, [11427] = 0x87CB, ++ [11428] = 0x893B, [11429] = 0x8936, [11430] = 0x8944, [11431] = 0x8938, ++ [11432] = 0x893D, [11433] = 0x89AC, [11434] = 0x8B0E, [11435] = 0x8B17, ++ [11436] = 0x8B19, [11437] = 0x8B1B, [11438] = 0x8B0A, [11439] = 0x8B20, ++ [11440] = 0x8B1D, [11441] = 0x8B04, [11442] = 0x8B10, [11443] = 0x8C41, ++ [11444] = 0x8C3F, [11445] = 0x8C73, [11446] = 0x8CFA, [11447] = 0x8CFD, ++ [11448] = 0x8CFC, [11449] = 0x8CF8, [11450] = 0x8CFB, [11451] = 0x8DA8, ++ [11452] = 0x8E49, [11453] = 0x8E4B, [11454] = 0x8E48, [11455] = 0x8E4A, ++ [11456] = 0x8F44, [11457] = 0x8F3E, [11458] = 0x8F42, [11459] = 0x8F45, ++ [11460] = 0x8F3F, [11461] = 0x907F, [11462] = 0x907D, [11463] = 0x9084, ++ [11464] = 0x9081, [11465] = 0x9082, [11466] = 0x9080, [11467] = 0x9139, ++ [11468] = 0x91A3, [11469] = 0x919E, [11470] = 0x919C, [11471] = 0x934D, ++ [11472] = 0x9382, [11473] = 0x9328, [11474] = 0x9375, [11475] = 0x934A, ++ [11476] = 0x9365, [11477] = 0x934B, [11478] = 0x9318, [11479] = 0x937E, ++ [11480] = 0x936C, [11481] = 0x935B, [11482] = 0x9370, [11483] = 0x935A, ++ [11484] = 0x9354, [11485] = 0x95CA, [11486] = 0x95CB, [11487] = 0x95CC, ++ [11488] = 0x95C8, [11489] = 0x95C6, [11490] = 0x96B1, [11491] = 0x96B8, ++ [11492] = 0x96D6, [11493] = 0x971C, [11494] = 0x971E, [11495] = 0x97A0, ++ [11496] = 0x97D3, [11497] = 0x9846, [11498] = 0x98B6, [11499] = 0x9935, ++ [11500] = 0x9A01, [11505] = 0x99FF, [11506] = 0x9BAE, [11507] = 0x9BAB, ++ [11508] = 0x9BAA, [11509] = 0x9BAD, [11510] = 0x9D3B, [11511] = 0x9D3F, ++ [11512] = 0x9E8B, [11513] = 0x9ECF, [11514] = 0x9EDE, [11515] = 0x9EDC, ++ [11516] = 0x9EDD, [11517] = 0x9EDB, [11518] = 0x9F3E, [11519] = 0x9F4B, ++ [11520] = 0x53E2, [11521] = 0x5695, [11522] = 0x56AE, [11523] = 0x58D9, ++ [11524] = 0x58D8, [11525] = 0x5B38, [11526] = 0x5F5D, [11527] = 0x61E3, ++ [11528] = 0x6233, [11529] = 0x64F4, [11530] = 0x64F2, [11531] = 0x64FE, ++ [11532] = 0x6506, [11533] = 0x64FA, [11534] = 0x64FB, [11535] = 0x64F7, ++ [11536] = 0x65B7, [11537] = 0x66DC, [11538] = 0x6726, [11539] = 0x6AB3, ++ [11540] = 0x6AAC, [11541] = 0x6AC3, [11542] = 0x6ABB, [11543] = 0x6AB8, ++ [11544] = 0x6AC2, [11545] = 0x6AAE, [11546] = 0x6AAF, [11547] = 0x6B5F, ++ [11548] = 0x6B78, [11549] = 0x6BAF, [11550] = 0x7009, [11551] = 0x700B, ++ [11552] = 0x6FFE, [11553] = 0x7006, [11554] = 0x6FFA, [11555] = 0x7011, ++ [11556] = 0x700F, [11557] = 0x71FB, [11558] = 0x71FC, [11559] = 0x71FE, ++ [11560] = 0x71F8, [11561] = 0x7377, [11562] = 0x7375, [11563] = 0x74A7, ++ [11564] = 0x74BF, [11565] = 0x7515, [11566] = 0x7656, [11567] = 0x7658, ++ [11602] = 0x7652, [11603] = 0x77BD, [11604] = 0x77BF, [11605] = 0x77BB, ++ [11606] = 0x77BC, [11607] = 0x790E, [11608] = 0x79AE, [11609] = 0x7A61, ++ [11610] = 0x7A62, [11611] = 0x7A60, [11612] = 0x7AC4, [11613] = 0x7AC5, ++ [11614] = 0x7C2B, [11615] = 0x7C27, [11616] = 0x7C2A, [11617] = 0x7C1E, ++ [11618] = 0x7C23, [11619] = 0x7C21, [11620] = 0x7CE7, [11621] = 0x7E54, ++ [11622] = 0x7E55, [11623] = 0x7E5E, [11624] = 0x7E5A, [11625] = 0x7E61, ++ [11626] = 0x7E52, [11627] = 0x7E59, [11628] = 0x7F48, [11629] = 0x7FF9, ++ [11630] = 0x7FFB, [11631] = 0x8077, [11632] = 0x8076, [11633] = 0x81CD, ++ [11634] = 0x81CF, [11635] = 0x820A, [11636] = 0x85CF, [11637] = 0x85A9, ++ [11638] = 0x85CD, [11639] = 0x85D0, [11640] = 0x85C9, [11641] = 0x85B0, ++ [11642] = 0x85BA, [11643] = 0x85B9, [11644] = 0x85A6, [11645] = 0x87EF, ++ [11646] = 0x87EC, [11647] = 0x87F2, [11648] = 0x87E0, [11649] = 0x8986, ++ [11650] = 0x89B2, [11651] = 0x89F4, [11652] = 0x8B28, [11653] = 0x8B39, ++ [11654] = 0x8B2C, [11655] = 0x8B2B, [11656] = 0x8C50, [11657] = 0x8D05, ++ [11658] = 0x8E59, [11659] = 0x8E63, [11660] = 0x8E66, [11661] = 0x8E64, ++ [11662] = 0x8E5F, [11663] = 0x8E55, [11664] = 0x8EC0, [11665] = 0x8F49, ++ [11666] = 0x8F4D, [11667] = 0x9087, [11668] = 0x9083, [11669] = 0x9088, ++ [11670] = 0x91AB, [11671] = 0x91AC, [11672] = 0x91D0, [11673] = 0x9394, ++ [11674] = 0x938A, [11675] = 0x9396, [11676] = 0x93A2, [11677] = 0x93B3, ++ [11678] = 0x93AE, [11679] = 0x93AC, [11680] = 0x93B0, [11681] = 0x9398, ++ [11682] = 0x939A, [11683] = 0x9397, [11684] = 0x95D4, [11685] = 0x95D6, ++ [11686] = 0x95D0, [11687] = 0x95D5, [11688] = 0x96E2, [11689] = 0x96DC, ++ [11690] = 0x96D9, [11691] = 0x96DB, [11692] = 0x96DE, [11693] = 0x9724, ++ [11694] = 0x97A3, [11695] = 0x97A6, [11700] = 0x97AD, [11701] = 0x97F9, ++ [11702] = 0x984D, [11703] = 0x984F, [11704] = 0x984C, [11705] = 0x984E, ++ [11706] = 0x9853, [11707] = 0x98BA, [11708] = 0x993E, [11709] = 0x993F, ++ [11710] = 0x993D, [11711] = 0x992E, [11712] = 0x99A5, [11713] = 0x9A0E, ++ [11714] = 0x9AC1, [11715] = 0x9B03, [11716] = 0x9B06, [11717] = 0x9B4F, ++ [11718] = 0x9B4E, [11719] = 0x9B4D, [11720] = 0x9BCA, [11721] = 0x9BC9, ++ [11722] = 0x9BFD, [11723] = 0x9BC8, [11724] = 0x9BC0, [11725] = 0x9D51, ++ [11726] = 0x9D5D, [11727] = 0x9D60, [11728] = 0x9EE0, [11729] = 0x9F15, ++ [11730] = 0x9F2C, [11731] = 0x5133, [11732] = 0x56A5, [11733] = 0x58DE, ++ [11734] = 0x58DF, [11735] = 0x58E2, [11736] = 0x5BF5, [11737] = 0x9F90, ++ [11738] = 0x5EEC, [11739] = 0x61F2, [11740] = 0x61F7, [11741] = 0x61F6, ++ [11742] = 0x61F5, [11743] = 0x6500, [11744] = 0x650F, [11745] = 0x66E0, ++ [11746] = 0x66DD, [11747] = 0x6AE5, [11748] = 0x6ADD, [11749] = 0x6ADA, ++ [11750] = 0x6AD3, [11751] = 0x701B, [11752] = 0x701F, [11753] = 0x7028, ++ [11754] = 0x701A, [11755] = 0x701D, [11756] = 0x7015, [11757] = 0x7018, ++ [11758] = 0x7206, [11759] = 0x720D, [11760] = 0x7258, [11761] = 0x72A2, ++ [11762] = 0x7378, [11797] = 0x737A, [11798] = 0x74BD, [11799] = 0x74CA, ++ [11800] = 0x74E3, [11801] = 0x7587, [11802] = 0x7586, [11803] = 0x765F, ++ [11804] = 0x7661, [11805] = 0x77C7, [11806] = 0x7919, [11807] = 0x79B1, ++ [11808] = 0x7A6B, [11809] = 0x7A69, [11810] = 0x7C3E, [11811] = 0x7C3F, ++ [11812] = 0x7C38, [11813] = 0x7C3D, [11814] = 0x7C37, [11815] = 0x7C40, ++ [11816] = 0x7E6B, [11817] = 0x7E6D, [11818] = 0x7E79, [11819] = 0x7E69, ++ [11820] = 0x7E6A, [11821] = 0x7F85, [11822] = 0x7E73, [11823] = 0x7FB6, ++ [11824] = 0x7FB9, [11825] = 0x7FB8, [11826] = 0x81D8, [11827] = 0x85E9, ++ [11828] = 0x85DD, [11829] = 0x85EA, [11830] = 0x85D5, [11831] = 0x85E4, ++ [11832] = 0x85E5, [11833] = 0x85F7, [11834] = 0x87FB, [11835] = 0x8805, ++ [11836] = 0x880D, [11837] = 0x87F9, [11838] = 0x87FE, [11839] = 0x8960, ++ [11840] = 0x895F, [11841] = 0x8956, [11842] = 0x895E, [11843] = 0x8B41, ++ [11844] = 0x8B5C, [11845] = 0x8B58, [11846] = 0x8B49, [11847] = 0x8B5A, ++ [11848] = 0x8B4E, [11849] = 0x8B4F, [11850] = 0x8B46, [11851] = 0x8B59, ++ [11852] = 0x8D08, [11853] = 0x8D0A, [11854] = 0x8E7C, [11855] = 0x8E72, ++ [11856] = 0x8E87, [11857] = 0x8E76, [11858] = 0x8E6C, [11859] = 0x8E7A, ++ [11860] = 0x8E74, [11861] = 0x8F54, [11862] = 0x8F4E, [11863] = 0x8FAD, ++ [11864] = 0x908A, [11865] = 0x908B, [11866] = 0x91B1, [11867] = 0x91AE, ++ [11868] = 0x93E1, [11869] = 0x93D1, [11870] = 0x93DF, [11871] = 0x93C3, ++ [11872] = 0x93C8, [11873] = 0x93DC, [11874] = 0x93DD, [11875] = 0x93D6, ++ [11876] = 0x93E2, [11877] = 0x93CD, [11878] = 0x93D8, [11879] = 0x93E4, ++ [11880] = 0x93D7, [11881] = 0x93E8, [11882] = 0x95DC, [11883] = 0x96B4, ++ [11884] = 0x96E3, [11885] = 0x972A, [11886] = 0x9727, [11887] = 0x9761, ++ [11888] = 0x97DC, [11889] = 0x97FB, [11890] = 0x985E, [11895] = 0x9858, ++ [11896] = 0x985B, [11897] = 0x98BC, [11898] = 0x9945, [11899] = 0x9949, ++ [11900] = 0x9A16, [11901] = 0x9A19, [11902] = 0x9B0D, [11903] = 0x9BE8, ++ [11904] = 0x9BE7, [11905] = 0x9BD6, [11906] = 0x9BDB, [11907] = 0x9D89, ++ [11908] = 0x9D61, [11909] = 0x9D72, [11910] = 0x9D6A, [11911] = 0x9D6C, ++ [11912] = 0x9E92, [11913] = 0x9E97, [11914] = 0x9E93, [11915] = 0x9EB4, ++ [11916] = 0x52F8, [11917] = 0x56A8, [11918] = 0x56B7, [11919] = 0x56B6, ++ [11920] = 0x56B4, [11921] = 0x56BC, [11922] = 0x58E4, [11923] = 0x5B40, ++ [11924] = 0x5B43, [11925] = 0x5B7D, [11926] = 0x5BF6, [11927] = 0x5DC9, ++ [11928] = 0x61F8, [11929] = 0x61FA, [11930] = 0x6518, [11931] = 0x6514, ++ [11932] = 0x6519, [11933] = 0x66E6, [11934] = 0x6727, [11935] = 0x6AEC, ++ [11936] = 0x703E, [11937] = 0x7030, [11938] = 0x7032, [11939] = 0x7210, ++ [11940] = 0x737B, [11941] = 0x74CF, [11942] = 0x7662, [11943] = 0x7665, ++ [11944] = 0x7926, [11945] = 0x792A, [11946] = 0x792C, [11947] = 0x792B, ++ [11948] = 0x7AC7, [11949] = 0x7AF6, [11950] = 0x7C4C, [11951] = 0x7C43, ++ [11952] = 0x7C4D, [11953] = 0x7CEF, [11954] = 0x7CF0, [11955] = 0x8FAE, ++ [11956] = 0x7E7D, [11957] = 0x7E7C, [11992] = 0x7E82, [11993] = 0x7F4C, ++ [11994] = 0x8000, [11995] = 0x81DA, [11996] = 0x8266, [11997] = 0x85FB, ++ [11998] = 0x85F9, [11999] = 0x8611, [12000] = 0x85FA, [12001] = 0x8606, ++ [12002] = 0x860B, [12003] = 0x8607, [12004] = 0x860A, [12005] = 0x8814, ++ [12006] = 0x8815, [12007] = 0x8964, [12008] = 0x89BA, [12009] = 0x89F8, ++ [12010] = 0x8B70, [12011] = 0x8B6C, [12012] = 0x8B66, [12013] = 0x8B6F, ++ [12014] = 0x8B5F, [12015] = 0x8B6B, [12016] = 0x8D0F, [12017] = 0x8D0D, ++ [12018] = 0x8E89, [12019] = 0x8E81, [12020] = 0x8E85, [12021] = 0x8E82, ++ [12022] = 0x91B4, [12023] = 0x91CB, [12024] = 0x9418, [12025] = 0x9403, ++ [12026] = 0x93FD, [12027] = 0x95E1, [12028] = 0x9730, [12029] = 0x98C4, ++ [12030] = 0x9952, [12031] = 0x9951, [12032] = 0x99A8, [12033] = 0x9A2B, ++ [12034] = 0x9A30, [12035] = 0x9A37, [12036] = 0x9A35, [12037] = 0x9C13, ++ [12038] = 0x9C0D, [12039] = 0x9E79, [12040] = 0x9EB5, [12041] = 0x9EE8, ++ [12042] = 0x9F2F, [12043] = 0x9F5F, [12044] = 0x9F63, [12045] = 0x9F61, ++ [12046] = 0x5137, [12047] = 0x5138, [12048] = 0x56C1, [12049] = 0x56C0, ++ [12050] = 0x56C2, [12051] = 0x5914, [12052] = 0x5C6C, [12053] = 0x5DCD, ++ [12054] = 0x61FC, [12055] = 0x61FE, [12056] = 0x651D, [12057] = 0x651C, ++ [12058] = 0x6595, [12059] = 0x66E9, [12060] = 0x6AFB, [12061] = 0x6B04, ++ [12062] = 0x6AFA, [12063] = 0x6BB2, [12064] = 0x704C, [12065] = 0x721B, ++ [12066] = 0x72A7, [12067] = 0x74D6, [12068] = 0x74D4, [12069] = 0x7669, ++ [12070] = 0x77D3, [12071] = 0x7C50, [12072] = 0x7E8F, [12073] = 0x7E8C, ++ [12074] = 0x7FBC, [12075] = 0x8617, [12076] = 0x862D, [12077] = 0x861A, ++ [12078] = 0x8823, [12079] = 0x8822, [12080] = 0x8821, [12081] = 0x881F, ++ [12082] = 0x896A, [12083] = 0x896C, [12084] = 0x89BD, [12085] = 0x8B74, ++ [12090] = 0x8B77, [12091] = 0x8B7D, [12092] = 0x8D13, [12093] = 0x8E8A, ++ [12094] = 0x8E8D, [12095] = 0x8E8B, [12096] = 0x8F5F, [12097] = 0x8FAF, ++ [12098] = 0x91BA, [12099] = 0x942E, [12100] = 0x9433, [12101] = 0x9435, ++ [12102] = 0x943A, [12103] = 0x9438, [12104] = 0x9432, [12105] = 0x942B, ++ [12106] = 0x95E2, [12107] = 0x9738, [12108] = 0x9739, [12109] = 0x9732, ++ [12110] = 0x97FF, [12111] = 0x9867, [12112] = 0x9865, [12113] = 0x9957, ++ [12114] = 0x9A45, [12115] = 0x9A43, [12116] = 0x9A40, [12117] = 0x9A3E, ++ [12118] = 0x9ACF, [12119] = 0x9B54, [12120] = 0x9B51, [12121] = 0x9C2D, ++ [12122] = 0x9C25, [12123] = 0x9DAF, [12124] = 0x9DB4, [12125] = 0x9DC2, ++ [12126] = 0x9DB8, [12127] = 0x9E9D, [12128] = 0x9EEF, [12129] = 0x9F19, ++ [12130] = 0x9F5C, [12131] = 0x9F66, [12132] = 0x9F67, [12133] = 0x513C, ++ [12134] = 0x513B, [12135] = 0x56C8, [12136] = 0x56CA, [12137] = 0x56C9, ++ [12138] = 0x5B7F, [12139] = 0x5DD4, [12140] = 0x5DD2, [12141] = 0x5F4E, ++ [12142] = 0x61FF, [12143] = 0x6524, [12144] = 0x6B0A, [12145] = 0x6B61, ++ [12146] = 0x7051, [12147] = 0x7058, [12148] = 0x7380, [12149] = 0x74E4, ++ [12150] = 0x758A, [12151] = 0x766E, [12152] = 0x766C, [12187] = 0x79B3, ++ [12188] = 0x7C60, [12189] = 0x7C5F, [12190] = 0x807E, [12191] = 0x807D, ++ [12192] = 0x81DF, [12193] = 0x8972, [12194] = 0x896F, [12195] = 0x89FC, ++ [12196] = 0x8B80, [12197] = 0x8D16, [12198] = 0x8D17, [12199] = 0x8E91, ++ [12200] = 0x8E93, [12201] = 0x8F61, [12202] = 0x9148, [12203] = 0x9444, ++ [12204] = 0x9451, [12205] = 0x9452, [12206] = 0x973D, [12207] = 0x973E, ++ [12208] = 0x97C3, [12209] = 0x97C1, [12210] = 0x986B, [12211] = 0x9955, ++ [12212] = 0x9A55, [12213] = 0x9A4D, [12214] = 0x9AD2, [12215] = 0x9B1A, ++ [12216] = 0x9C49, [12217] = 0x9C31, [12218] = 0x9C3E, [12219] = 0x9C3B, ++ [12220] = 0x9DD3, [12221] = 0x9DD7, [12222] = 0x9F34, [12223] = 0x9F6C, ++ [12224] = 0x9F6A, [12225] = 0x9F94, [12226] = 0x56CC, [12227] = 0x5DD6, ++ [12228] = 0x6200, [12229] = 0x6523, [12230] = 0x652B, [12231] = 0x652A, ++ [12232] = 0x66EC, [12233] = 0x6B10, [12234] = 0x74DA, [12235] = 0x7ACA, ++ [12236] = 0x7C64, [12237] = 0x7C63, [12238] = 0x7C65, [12239] = 0x7E93, ++ [12240] = 0x7E96, [12241] = 0x7E94, [12242] = 0x81E2, [12243] = 0x8638, ++ [12244] = 0x863F, [12245] = 0x8831, [12246] = 0x8B8A, [12247] = 0x9090, ++ [12248] = 0x908F, [12249] = 0x9463, [12250] = 0x9460, [12251] = 0x9464, ++ [12252] = 0x9768, [12253] = 0x986F, [12254] = 0x995C, [12255] = 0x9A5A, ++ [12256] = 0x9A5B, [12257] = 0x9A57, [12258] = 0x9AD3, [12259] = 0x9AD4, ++ [12260] = 0x9AD1, [12261] = 0x9C54, [12262] = 0x9C57, [12263] = 0x9C56, ++ [12264] = 0x9DE5, [12265] = 0x9E9F, [12266] = 0x9EF4, [12267] = 0x56D1, ++ [12268] = 0x58E9, [12269] = 0x652C, [12270] = 0x705E, [12271] = 0x7671, ++ [12272] = 0x7672, [12273] = 0x77D7, [12274] = 0x7F50, [12275] = 0x7F88, ++ [12276] = 0x8836, [12277] = 0x8839, [12278] = 0x8862, [12279] = 0x8B93, ++ [12280] = 0x8B92, [12285] = 0x8B96, [12286] = 0x8277, [12287] = 0x8D1B, ++ [12288] = 0x91C0, [12289] = 0x946A, [12290] = 0x9742, [12291] = 0x9748, ++ [12292] = 0x9744, [12293] = 0x97C6, [12294] = 0x9870, [12295] = 0x9A5F, ++ [12296] = 0x9B22, [12297] = 0x9B58, [12298] = 0x9C5F, [12299] = 0x9DF9, ++ [12300] = 0x9DFA, [12301] = 0x9E7C, [12302] = 0x9E7D, [12303] = 0x9F07, ++ [12304] = 0x9F77, [12305] = 0x9F72, [12306] = 0x5EF3, [12307] = 0x6B16, ++ [12308] = 0x7063, [12309] = 0x7C6C, [12310] = 0x7C6E, [12311] = 0x883B, ++ [12312] = 0x89C0, [12313] = 0x8EA1, [12314] = 0x91C1, [12315] = 0x9472, ++ [12316] = 0x9470, [12317] = 0x9871, [12318] = 0x995E, [12319] = 0x9AD6, ++ [12320] = 0x9B23, [12321] = 0x9ECC, [12322] = 0x7064, [12323] = 0x77DA, ++ [12324] = 0x8B9A, [12325] = 0x9477, [12326] = 0x97C9, [12327] = 0x9A62, ++ [12328] = 0x9A65, [12329] = 0x7E9C, [12330] = 0x8B9C, [12331] = 0x8EAA, ++ [12332] = 0x91C5, [12333] = 0x947D, [12334] = 0x947E, [12335] = 0x947C, ++ [12336] = 0x9C77, [12337] = 0x9C78, [12338] = 0x9EF7, [12339] = 0x8C54, ++ [12340] = 0x947F, [12341] = 0x9E1A, [12342] = 0x7228, [12343] = 0x9A6A, ++ [12344] = 0x9B31, [12345] = 0x9E1B, [12346] = 0x9E1E, [12347] = 0x7C72, ++ [12382] = 0x2460, [12383] = 0x2461, [12384] = 0x2462, [12385] = 0x2463, ++ [12386] = 0x2464, [12387] = 0x2465, [12388] = 0x2466, [12389] = 0x2467, ++ [12390] = 0x2468, [12391] = 0x2469, [12392] = 0x2474, [12393] = 0x2475, ++ [12394] = 0x2476, [12395] = 0x2477, [12396] = 0x2478, [12397] = 0x2479, ++ [12398] = 0x247A, [12399] = 0x247B, [12400] = 0x247C, [12401] = 0x247D, ++ [12402] = 0x2170, [12403] = 0x2171, [12404] = 0x2172, [12405] = 0x2173, ++ [12406] = 0x2174, [12407] = 0x2175, [12408] = 0x2176, [12409] = 0x2177, ++ [12410] = 0x2178, [12411] = 0x2179, [12412] = 0x4E36, [12413] = 0x4E3F, ++ [12414] = 0x4E85, [12415] = 0x4EA0, [12416] = 0x5182, [12417] = 0x5196, ++ [12418] = 0x51AB, [12419] = 0x52F9, [12420] = 0x5338, [12421] = 0x5369, ++ [12422] = 0x53B6, [12423] = 0x590A, [12424] = 0x5B80, [12425] = 0x5DDB, ++ [12426] = 0x2F33, [12427] = 0x5E7F, [12429] = 0x5F50, [12430] = 0x5F61, ++ [12431] = 0x6534, [12433] = 0x7592, [12435] = 0x8FB5, [12437] = 0x00A8, ++ [12438] = 0x02C6, [12439] = 0x30FD, [12440] = 0x30FE, [12441] = 0x309D, ++ [12442] = 0x309E, [12445] = 0x3005, [12446] = 0x3006, [12447] = 0x3007, ++ [12448] = 0x30FC, [12449] = 0xFF3B, [12450] = 0xFF3D, [12451] = 0x273D, ++ [12452] = 0x3041, [12453] = 0x3042, [12454] = 0x3043, [12455] = 0x3044, ++ [12456] = 0x3045, [12457] = 0x3046, [12458] = 0x3047, [12459] = 0x3048, ++ [12460] = 0x3049, [12461] = 0x304A, [12462] = 0x304B, [12463] = 0x304C, ++ [12464] = 0x304D, [12465] = 0x304E, [12466] = 0x304F, [12467] = 0x3050, ++ [12468] = 0x3051, [12469] = 0x3052, [12470] = 0x3053, [12471] = 0x3054, ++ [12472] = 0x3055, [12473] = 0x3056, [12474] = 0x3057, [12475] = 0x3058, ++ [12480] = 0x3059, [12481] = 0x305A, [12482] = 0x305B, [12483] = 0x305C, ++ [12484] = 0x305D, [12485] = 0x305E, [12486] = 0x305F, [12487] = 0x3060, ++ [12488] = 0x3061, [12489] = 0x3062, [12490] = 0x3063, [12491] = 0x3064, ++ [12492] = 0x3065, [12493] = 0x3066, [12494] = 0x3067, [12495] = 0x3068, ++ [12496] = 0x3069, [12497] = 0x306A, [12498] = 0x306B, [12499] = 0x306C, ++ [12500] = 0x306D, [12501] = 0x306E, [12502] = 0x306F, [12503] = 0x3070, ++ [12504] = 0x3071, [12505] = 0x3072, [12506] = 0x3073, [12507] = 0x3074, ++ [12508] = 0x3075, [12509] = 0x3076, [12510] = 0x3077, [12511] = 0x3078, ++ [12512] = 0x3079, [12513] = 0x307A, [12514] = 0x307B, [12515] = 0x307C, ++ [12516] = 0x307D, [12517] = 0x307E, [12518] = 0x307F, [12519] = 0x3080, ++ [12520] = 0x3081, [12521] = 0x3082, [12522] = 0x3083, [12523] = 0x3084, ++ [12524] = 0x3085, [12525] = 0x3086, [12526] = 0x3087, [12527] = 0x3088, ++ [12528] = 0x3089, [12529] = 0x308A, [12530] = 0x308B, [12531] = 0x308C, ++ [12532] = 0x308D, [12533] = 0x308E, [12534] = 0x308F, [12535] = 0x3090, ++ [12536] = 0x3091, [12537] = 0x3092, [12538] = 0x3093, [12539] = 0x30A1, ++ [12540] = 0x30A2, [12541] = 0x30A3, [12542] = 0x30A4, [12577] = 0x30A5, ++ [12578] = 0x30A6, [12579] = 0x30A7, [12580] = 0x30A8, [12581] = 0x30A9, ++ [12582] = 0x30AA, [12583] = 0x30AB, [12584] = 0x30AC, [12585] = 0x30AD, ++ [12586] = 0x30AE, [12587] = 0x30AF, [12588] = 0x30B0, [12589] = 0x30B1, ++ [12590] = 0x30B2, [12591] = 0x30B3, [12592] = 0x30B4, [12593] = 0x30B5, ++ [12594] = 0x30B6, [12595] = 0x30B7, [12596] = 0x30B8, [12597] = 0x30B9, ++ [12598] = 0x30BA, [12599] = 0x30BB, [12600] = 0x30BC, [12601] = 0x30BD, ++ [12602] = 0x30BE, [12603] = 0x30BF, [12604] = 0x30C0, [12605] = 0x30C1, ++ [12606] = 0x30C2, [12607] = 0x30C3, [12608] = 0x30C4, [12609] = 0x30C5, ++ [12610] = 0x30C6, [12611] = 0x30C7, [12612] = 0x30C8, [12613] = 0x30C9, ++ [12614] = 0x30CA, [12615] = 0x30CB, [12616] = 0x30CC, [12617] = 0x30CD, ++ [12618] = 0x30CE, [12619] = 0x30CF, [12620] = 0x30D0, [12621] = 0x30D1, ++ [12622] = 0x30D2, [12623] = 0x30D3, [12624] = 0x30D4, [12625] = 0x30D5, ++ [12626] = 0x30D6, [12627] = 0x30D7, [12628] = 0x30D8, [12629] = 0x30D9, ++ [12630] = 0x30DA, [12631] = 0x30DB, [12632] = 0x30DC, [12633] = 0x30DD, ++ [12634] = 0x30DE, [12635] = 0x30DF, [12636] = 0x30E0, [12637] = 0x30E1, ++ [12638] = 0x30E2, [12639] = 0x30E3, [12640] = 0x30E4, [12641] = 0x30E5, ++ [12642] = 0x30E6, [12643] = 0x30E7, [12644] = 0x30E8, [12645] = 0x30E9, ++ [12646] = 0x30EA, [12647] = 0x30EB, [12648] = 0x30EC, [12649] = 0x30ED, ++ [12650] = 0x30EE, [12651] = 0x30EF, [12652] = 0x30F0, [12653] = 0x30F1, ++ [12654] = 0x30F2, [12655] = 0x30F3, [12656] = 0x30F4, [12657] = 0x30F5, ++ [12658] = 0x30F6, [12659] = 0x0410, [12660] = 0x0411, [12661] = 0x0412, ++ [12662] = 0x0413, [12663] = 0x0414, [12664] = 0x0415, [12665] = 0x0401, ++ [12666] = 0x0416, [12667] = 0x0417, [12668] = 0x0418, [12669] = 0x0419, ++ [12670] = 0x041A, [12675] = 0x041B, [12676] = 0x041C, [12677] = 0x041D, ++ [12678] = 0x041E, [12679] = 0x041F, [12680] = 0x0420, [12681] = 0x0421, ++ [12682] = 0x0422, [12683] = 0x0423, [12684] = 0x0424, [12685] = 0x0425, ++ [12686] = 0x0426, [12687] = 0x0427, [12688] = 0x0428, [12689] = 0x0429, ++ [12690] = 0x042A, [12691] = 0x042B, [12692] = 0x042C, [12693] = 0x042D, ++ [12694] = 0x042E, [12695] = 0x042F, [12696] = 0x0430, [12697] = 0x0431, ++ [12698] = 0x0432, [12699] = 0x0433, [12700] = 0x0434, [12701] = 0x0435, ++ [12702] = 0x0451, [12703] = 0x0436, [12704] = 0x0437, [12705] = 0x0438, ++ [12706] = 0x0439, [12707] = 0x043A, [12708] = 0x043B, [12709] = 0x043C, ++ [12710] = 0x043D, [12711] = 0x043E, [12712] = 0x043F, [12713] = 0x0440, ++ [12714] = 0x0441, [12715] = 0x0442, [12716] = 0x0443, [12717] = 0x0444, ++ [12718] = 0x0445, [12719] = 0x0446, [12720] = 0x0447, [12721] = 0x0448, ++ [12722] = 0x0449, [12723] = 0x044A, [12724] = 0x044B, [12725] = 0x044C, ++ [12726] = 0x044D, [12727] = 0x044E, [12728] = 0x044F, [12729] = 0x21E7, ++ [12730] = 0x21B8, [12731] = 0x21B9, [12732] = 0x31CF, [12733] = 0x200CC, ++ [12734] = 0x4E5A, [12735] = 0x2008A, [12736] = 0x5202, [12737] = 0x4491, ++ [12772] = 0x9FB0, [12773] = 0x5188, [12774] = 0x9FB1, [12775] = 0x27607, ++ [12816] = 0xFFE2, [12817] = 0xFFE4, [12818] = 0xFF07, [12819] = 0xFF02, ++ [12820] = 0x3231, [12821] = 0x2116, [12822] = 0x2121, [12823] = 0x309B, ++ [12824] = 0x309C, [12825] = 0x2E80, [12826] = 0x2E84, [12827] = 0x2E86, ++ [12828] = 0x2E87, [12829] = 0x2E88, [12830] = 0x2E8A, [12831] = 0x2E8C, ++ [12832] = 0x2E8D, [12833] = 0x2E95, [12834] = 0x2E9C, [12835] = 0x2E9D, ++ [12836] = 0x2EA5, [12837] = 0x2EA7, [12838] = 0x2EAA, [12839] = 0x2EAC, ++ [12840] = 0x2EAE, [12841] = 0x2EB6, [12842] = 0x2EBC, [12843] = 0x2EBE, ++ [12844] = 0x2EC6, [12845] = 0x2ECA, [12846] = 0x2ECC, [12847] = 0x2ECD, ++ [12848] = 0x2ECF, [12849] = 0x2ED6, [12850] = 0x2ED7, [12851] = 0x2EDE, ++ [12852] = 0x2EE3, [12856] = 0x0283, [12857] = 0x0250, [12858] = 0x025B, ++ [12859] = 0x0254, [12860] = 0x0275, [12861] = 0x0153, [12862] = 0x00F8, ++ [12863] = 0x014B, [12864] = 0x028A, [12865] = 0x026A, [12870] = 0x4E42, ++ [12871] = 0x4E5C, [12872] = 0x51F5, [12873] = 0x531A, [12874] = 0x5382, ++ [12875] = 0x4E07, [12876] = 0x4E0C, [12877] = 0x4E47, [12878] = 0x4E8D, ++ [12879] = 0x56D7, [12880] = 0xFA0C, [12881] = 0x5C6E, [12882] = 0x5F73, ++ [12883] = 0x4E0F, [12884] = 0x5187, [12885] = 0x4E0E, [12886] = 0x4E2E, ++ [12887] = 0x4E93, [12888] = 0x4EC2, [12889] = 0x4EC9, [12890] = 0x4EC8, ++ [12891] = 0x5198, [12892] = 0x52FC, [12893] = 0x536C, [12894] = 0x53B9, ++ [12895] = 0x5720, [12896] = 0x5903, [12897] = 0x592C, [12898] = 0x5C10, ++ [12899] = 0x5DFF, [12900] = 0x65E1, [12901] = 0x6BB3, [12902] = 0x6BCC, ++ [12903] = 0x6C14, [12904] = 0x723F, [12905] = 0x4E31, [12906] = 0x4E3C, ++ [12907] = 0x4EE8, [12908] = 0x4EDC, [12909] = 0x4EE9, [12910] = 0x4EE1, ++ [12911] = 0x4EDD, [12912] = 0x4EDA, [12913] = 0x520C, [12914] = 0x531C, ++ [12915] = 0x534C, [12916] = 0x5722, [12917] = 0x5723, [12918] = 0x5917, ++ [12919] = 0x592F, [12920] = 0x5B81, [12921] = 0x5B84, [12922] = 0x5C12, ++ [12923] = 0x5C3B, [12924] = 0x5C74, [12925] = 0x5C73, [12926] = 0x5E04, ++ [12927] = 0x5E80, [12928] = 0x5E82, [12929] = 0x5FC9, [12930] = 0x6209, ++ [12931] = 0x6250, [12932] = 0x6C15, [12967] = 0x6C36, [12968] = 0x6C43, ++ [12969] = 0x6C3F, [12970] = 0x6C3B, [12971] = 0x72AE, [12972] = 0x72B0, ++ [12973] = 0x738A, [12974] = 0x79B8, [12975] = 0x808A, [12976] = 0x961E, ++ [12977] = 0x4F0E, [12978] = 0x4F18, [12979] = 0x4F2C, [12980] = 0x4EF5, ++ [12981] = 0x4F14, [12982] = 0x4EF1, [12983] = 0x4F00, [12984] = 0x4EF7, ++ [12985] = 0x4F08, [12986] = 0x4F1D, [12987] = 0x4F02, [12988] = 0x4F05, ++ [12989] = 0x4F22, [12990] = 0x4F13, [12991] = 0x4F04, [12992] = 0x4EF4, ++ [12993] = 0x4F12, [12994] = 0x51B1, [12995] = 0x5213, [12996] = 0x5209, ++ [12997] = 0x5210, [12998] = 0x52A6, [12999] = 0x5322, [13000] = 0x531F, ++ [13001] = 0x534D, [13002] = 0x538A, [13003] = 0x5407, [13004] = 0x56E1, ++ [13005] = 0x56DF, [13006] = 0x572E, [13007] = 0x572A, [13008] = 0x5734, ++ [13009] = 0x593C, [13010] = 0x5980, [13011] = 0x597C, [13012] = 0x5985, ++ [13013] = 0x597B, [13014] = 0x597E, [13015] = 0x5977, [13016] = 0x597F, ++ [13017] = 0x5B56, [13018] = 0x5C15, [13019] = 0x5C25, [13020] = 0x5C7C, ++ [13021] = 0x5C7A, [13022] = 0x5C7B, [13023] = 0x5C7E, [13024] = 0x5DDF, ++ [13025] = 0x5E75, [13026] = 0x5E84, [13027] = 0x5F02, [13028] = 0x5F1A, ++ [13029] = 0x5F74, [13030] = 0x5FD5, [13031] = 0x5FD4, [13032] = 0x5FCF, ++ [13033] = 0x625C, [13034] = 0x625E, [13035] = 0x6264, [13036] = 0x6261, ++ [13037] = 0x6266, [13038] = 0x6262, [13039] = 0x6259, [13040] = 0x6260, ++ [13041] = 0x625A, [13042] = 0x6265, [13043] = 0x65EF, [13044] = 0x65EE, ++ [13045] = 0x673E, [13046] = 0x6739, [13047] = 0x6738, [13048] = 0x673B, ++ [13049] = 0x673A, [13050] = 0x673F, [13051] = 0x673C, [13052] = 0x6733, ++ [13053] = 0x6C18, [13054] = 0x6C46, [13055] = 0x6C52, [13056] = 0x6C5C, ++ [13057] = 0x6C4F, [13058] = 0x6C4A, [13059] = 0x6C54, [13060] = 0x6C4B, ++ [13065] = 0x6C4C, [13066] = 0x7071, [13067] = 0x725E, [13068] = 0x72B4, ++ [13069] = 0x72B5, [13070] = 0x738E, [13071] = 0x752A, [13072] = 0x767F, ++ [13073] = 0x7A75, [13074] = 0x7F51, [13075] = 0x8278, [13076] = 0x827C, ++ [13077] = 0x8280, [13078] = 0x827D, [13079] = 0x827F, [13080] = 0x864D, ++ [13081] = 0x897E, [13082] = 0x9099, [13083] = 0x9097, [13084] = 0x9098, ++ [13085] = 0x909B, [13086] = 0x9094, [13087] = 0x9622, [13088] = 0x9624, ++ [13089] = 0x9620, [13090] = 0x9623, [13091] = 0x4F56, [13092] = 0x4F3B, ++ [13093] = 0x4F62, [13094] = 0x4F49, [13095] = 0x4F53, [13096] = 0x4F64, ++ [13097] = 0x4F3E, [13098] = 0x4F67, [13099] = 0x4F52, [13100] = 0x4F5F, ++ [13101] = 0x4F41, [13102] = 0x4F58, [13103] = 0x4F2D, [13104] = 0x4F33, ++ [13105] = 0x4F3F, [13106] = 0x4F61, [13107] = 0x518F, [13108] = 0x51B9, ++ [13109] = 0x521C, [13110] = 0x521E, [13111] = 0x5221, [13112] = 0x52AD, ++ [13113] = 0x52AE, [13114] = 0x5309, [13115] = 0x5363, [13116] = 0x5372, ++ [13117] = 0x538E, [13118] = 0x538F, [13119] = 0x5430, [13120] = 0x5437, ++ [13121] = 0x542A, [13122] = 0x5454, [13123] = 0x5445, [13124] = 0x5419, ++ [13125] = 0x541C, [13126] = 0x5425, [13127] = 0x5418, [13162] = 0x543D, ++ [13163] = 0x544F, [13164] = 0x5441, [13165] = 0x5428, [13166] = 0x5424, ++ [13167] = 0x5447, [13168] = 0x56EE, [13169] = 0x56E7, [13170] = 0x56E5, ++ [13171] = 0x5741, [13172] = 0x5745, [13173] = 0x574C, [13174] = 0x5749, ++ [13175] = 0x574B, [13176] = 0x5752, [13177] = 0x5906, [13178] = 0x5940, ++ [13179] = 0x59A6, [13180] = 0x5998, [13181] = 0x59A0, [13182] = 0x5997, ++ [13183] = 0x598E, [13184] = 0x59A2, [13185] = 0x5990, [13186] = 0x598F, ++ [13187] = 0x59A7, [13188] = 0x59A1, [13189] = 0x5B8E, [13190] = 0x5B92, ++ [13191] = 0x5C28, [13192] = 0x5C2A, [13193] = 0x5C8D, [13194] = 0x5C8F, ++ [13195] = 0x5C88, [13196] = 0x5C8B, [13197] = 0x5C89, [13198] = 0x5C92, ++ [13199] = 0x5C8A, [13200] = 0x5C86, [13201] = 0x5C93, [13202] = 0x5C95, ++ [13203] = 0x5DE0, [13204] = 0x5E0A, [13205] = 0x5E0E, [13206] = 0x5E8B, ++ [13207] = 0x5E89, [13208] = 0x5E8C, [13209] = 0x5E88, [13210] = 0x5E8D, ++ [13211] = 0x5F05, [13212] = 0x5F1D, [13213] = 0x5F78, [13214] = 0x5F76, ++ [13215] = 0x5FD2, [13216] = 0x5FD1, [13217] = 0x5FD0, [13218] = 0x5FED, ++ [13219] = 0x5FE8, [13220] = 0x5FEE, [13221] = 0x5FF3, [13222] = 0x5FE1, ++ [13223] = 0x5FE4, [13224] = 0x5FE3, [13225] = 0x5FFA, [13226] = 0x5FEF, ++ [13227] = 0x5FF7, [13228] = 0x5FFB, [13229] = 0x6000, [13230] = 0x5FF4, ++ [13231] = 0x623A, [13232] = 0x6283, [13233] = 0x628C, [13234] = 0x628E, ++ [13235] = 0x628F, [13236] = 0x6294, [13237] = 0x6287, [13238] = 0x6271, ++ [13239] = 0x627B, [13240] = 0x627A, [13241] = 0x6270, [13242] = 0x6281, ++ [13243] = 0x6288, [13244] = 0x6277, [13245] = 0x627D, [13246] = 0x6272, ++ [13247] = 0x6274, [13248] = 0x6537, [13249] = 0x65F0, [13250] = 0x65F4, ++ [13251] = 0x65F3, [13252] = 0x65F2, [13253] = 0x65F5, [13254] = 0x6745, ++ [13255] = 0x6747, [13260] = 0x6759, [13261] = 0x6755, [13262] = 0x674C, ++ [13263] = 0x6748, [13264] = 0x675D, [13265] = 0x674D, [13266] = 0x675A, ++ [13267] = 0x674B, [13268] = 0x6BD0, [13269] = 0x6C19, [13270] = 0x6C1A, ++ [13271] = 0x6C78, [13272] = 0x6C67, [13273] = 0x6C6B, [13274] = 0x6C84, ++ [13275] = 0x6C8B, [13276] = 0x6C8F, [13277] = 0x6C71, [13278] = 0x6C6F, ++ [13279] = 0x6C69, [13280] = 0x6C9A, [13281] = 0x6C6D, [13282] = 0x6C87, ++ [13283] = 0x6C95, [13284] = 0x6C9C, [13285] = 0x6C66, [13286] = 0x6C73, ++ [13287] = 0x6C65, [13288] = 0x6C7B, [13289] = 0x6C8E, [13290] = 0x7074, ++ [13291] = 0x707A, [13292] = 0x7263, [13293] = 0x72BF, [13294] = 0x72BD, ++ [13295] = 0x72C3, [13296] = 0x72C6, [13297] = 0x72C1, [13298] = 0x72BA, ++ [13299] = 0x72C5, [13300] = 0x7395, [13301] = 0x7397, [13302] = 0x7393, ++ [13303] = 0x7394, [13304] = 0x7392, [13305] = 0x753A, [13306] = 0x7539, ++ [13307] = 0x7594, [13308] = 0x7595, [13309] = 0x7681, [13310] = 0x793D, ++ [13311] = 0x8034, [13312] = 0x8095, [13313] = 0x8099, [13314] = 0x8090, ++ [13315] = 0x8092, [13316] = 0x809C, [13317] = 0x8290, [13318] = 0x828F, ++ [13319] = 0x8285, [13320] = 0x828E, [13321] = 0x8291, [13322] = 0x8293, ++ [13357] = 0x828A, [13358] = 0x8283, [13359] = 0x8284, [13360] = 0x8C78, ++ [13361] = 0x8FC9, [13362] = 0x8FBF, [13363] = 0x909F, [13364] = 0x90A1, ++ [13365] = 0x90A5, [13366] = 0x909E, [13367] = 0x90A7, [13368] = 0x90A0, ++ [13369] = 0x9630, [13370] = 0x9628, [13371] = 0x962F, [13372] = 0x962D, ++ [13373] = 0x4E33, [13374] = 0x4F98, [13375] = 0x4F7C, [13376] = 0x4F85, ++ [13377] = 0x4F7D, [13378] = 0x4F80, [13379] = 0x4F87, [13380] = 0x4F76, ++ [13381] = 0x4F74, [13382] = 0x4F89, [13383] = 0x4F84, [13384] = 0x4F77, ++ [13385] = 0x4F4C, [13386] = 0x4F97, [13387] = 0x4F6A, [13388] = 0x4F9A, ++ [13389] = 0x4F79, [13390] = 0x4F81, [13391] = 0x4F78, [13392] = 0x4F90, ++ [13393] = 0x4F9C, [13394] = 0x4F94, [13395] = 0x4F9E, [13396] = 0x4F92, ++ [13397] = 0x4F82, [13398] = 0x4F95, [13399] = 0x4F6B, [13400] = 0x4F6E, ++ [13401] = 0x519E, [13402] = 0x51BC, [13403] = 0x51BE, [13404] = 0x5235, ++ [13405] = 0x5232, [13406] = 0x5233, [13407] = 0x5246, [13408] = 0x5231, ++ [13409] = 0x52BC, [13410] = 0x530A, [13411] = 0x530B, [13412] = 0x533C, ++ [13413] = 0x5392, [13414] = 0x5394, [13415] = 0x5487, [13416] = 0x547F, ++ [13417] = 0x5481, [13418] = 0x5491, [13419] = 0x5482, [13420] = 0x5488, ++ [13421] = 0x546B, [13422] = 0x547A, [13423] = 0x547E, [13424] = 0x5465, ++ [13425] = 0x546C, [13426] = 0x5474, [13427] = 0x5466, [13428] = 0x548D, ++ [13429] = 0x546F, [13430] = 0x5461, [13431] = 0x5460, [13432] = 0x5498, ++ [13433] = 0x5463, [13434] = 0x5467, [13435] = 0x5464, [13436] = 0x56F7, ++ [13437] = 0x56F9, [13438] = 0x576F, [13439] = 0x5772, [13440] = 0x576D, ++ [13441] = 0x576B, [13442] = 0x5771, [13443] = 0x5770, [13444] = 0x5776, ++ [13445] = 0x5780, [13446] = 0x5775, [13447] = 0x577B, [13448] = 0x5773, ++ [13449] = 0x5774, [13450] = 0x5762, [13455] = 0x5768, [13456] = 0x577D, ++ [13457] = 0x590C, [13458] = 0x5945, [13459] = 0x59B5, [13460] = 0x59BA, ++ [13461] = 0x59CF, [13462] = 0x59CE, [13463] = 0x59B2, [13464] = 0x59CC, ++ [13465] = 0x59C1, [13466] = 0x59B6, [13467] = 0x59BC, [13468] = 0x59C3, ++ [13469] = 0x59D6, [13470] = 0x59B1, [13471] = 0x59BD, [13472] = 0x59C0, ++ [13473] = 0x59C8, [13474] = 0x59B4, [13475] = 0x59C7, [13476] = 0x5B62, ++ [13477] = 0x5B65, [13478] = 0x5B93, [13479] = 0x5B95, [13480] = 0x5C44, ++ [13481] = 0x5C47, [13482] = 0x5CAE, [13483] = 0x5CA4, [13484] = 0x5CA0, ++ [13485] = 0x5CB5, [13486] = 0x5CAF, [13487] = 0x5CA8, [13488] = 0x5CAC, ++ [13489] = 0x5C9F, [13490] = 0x5CA3, [13491] = 0x5CAD, [13492] = 0x5CA2, ++ [13493] = 0x5CAA, [13494] = 0x5CA7, [13495] = 0x5C9D, [13496] = 0x5CA5, ++ [13497] = 0x5CB6, [13498] = 0x5CB0, [13499] = 0x5CA6, [13500] = 0x5E17, ++ [13501] = 0x5E14, [13502] = 0x5E19, [13503] = 0x5F28, [13504] = 0x5F22, ++ [13505] = 0x5F23, [13506] = 0x5F24, [13507] = 0x5F54, [13508] = 0x5F82, ++ [13509] = 0x5F7E, [13510] = 0x5F7D, [13511] = 0x5FDE, [13512] = 0x5FE5, ++ [13513] = 0x602D, [13514] = 0x6026, [13515] = 0x6019, [13516] = 0x6032, ++ [13517] = 0x600B, [13552] = 0x6034, [13553] = 0x600A, [13554] = 0x6017, ++ [13555] = 0x6033, [13556] = 0x601A, [13557] = 0x601E, [13558] = 0x602C, ++ [13559] = 0x6022, [13560] = 0x600D, [13561] = 0x6010, [13562] = 0x602E, ++ [13563] = 0x6013, [13564] = 0x6011, [13565] = 0x600C, [13566] = 0x6009, ++ [13567] = 0x601C, [13568] = 0x6214, [13569] = 0x623D, [13570] = 0x62AD, ++ [13571] = 0x62B4, [13572] = 0x62D1, [13573] = 0x62BE, [13574] = 0x62AA, ++ [13575] = 0x62B6, [13576] = 0x62CA, [13577] = 0x62AE, [13578] = 0x62B3, ++ [13579] = 0x62AF, [13580] = 0x62BB, [13581] = 0x62A9, [13582] = 0x62B0, ++ [13583] = 0x62B8, [13584] = 0x653D, [13585] = 0x65A8, [13586] = 0x65BB, ++ [13587] = 0x6609, [13588] = 0x65FC, [13589] = 0x6604, [13590] = 0x6612, ++ [13591] = 0x6608, [13592] = 0x65FB, [13593] = 0x6603, [13594] = 0x660B, ++ [13595] = 0x660D, [13596] = 0x6605, [13597] = 0x65FD, [13598] = 0x6611, ++ [13599] = 0x6610, [13600] = 0x66F6, [13601] = 0x670A, [13602] = 0x6785, ++ [13603] = 0x676C, [13604] = 0x678E, [13605] = 0x6792, [13606] = 0x6776, ++ [13607] = 0x677B, [13608] = 0x6798, [13609] = 0x6786, [13610] = 0x6784, ++ [13611] = 0x6774, [13612] = 0x678D, [13613] = 0x678C, [13614] = 0x677A, ++ [13615] = 0x679F, [13616] = 0x6791, [13617] = 0x6799, [13618] = 0x6783, ++ [13619] = 0x677D, [13620] = 0x6781, [13621] = 0x6778, [13622] = 0x6779, ++ [13623] = 0x6794, [13624] = 0x6B25, [13625] = 0x6B80, [13626] = 0x6B7E, ++ [13627] = 0x6BDE, [13628] = 0x6C1D, [13629] = 0x6C93, [13630] = 0x6CEC, ++ [13631] = 0x6CEB, [13632] = 0x6CEE, [13633] = 0x6CD9, [13634] = 0x6CB6, ++ [13635] = 0x6CD4, [13636] = 0x6CAD, [13637] = 0x6CE7, [13638] = 0x6CB7, ++ [13639] = 0x6CD0, [13640] = 0x6CC2, [13641] = 0x6CBA, [13642] = 0x6CC3, ++ [13643] = 0x6CC6, [13644] = 0x6CED, [13645] = 0x6CF2, [13650] = 0x6CD2, ++ [13651] = 0x6CDD, [13652] = 0x6CB4, [13653] = 0x6C8A, [13654] = 0x6C9D, ++ [13655] = 0x6C80, [13656] = 0x6CDE, [13657] = 0x6CC0, [13658] = 0x6D30, ++ [13659] = 0x6CCD, [13660] = 0x6CC7, [13661] = 0x6CB0, [13662] = 0x6CF9, ++ [13663] = 0x6CCF, [13664] = 0x6CE9, [13665] = 0x6CD1, [13666] = 0x7094, ++ [13667] = 0x7098, [13668] = 0x7085, [13669] = 0x7093, [13670] = 0x7086, ++ [13671] = 0x7084, [13672] = 0x7091, [13673] = 0x7096, [13674] = 0x7082, ++ [13675] = 0x709A, [13676] = 0x7083, [13677] = 0x726A, [13678] = 0x72D6, ++ [13679] = 0x72CB, [13680] = 0x72D8, [13681] = 0x72C9, [13682] = 0x72DC, ++ [13683] = 0x72D2, [13684] = 0x72D4, [13685] = 0x72DA, [13686] = 0x72CC, ++ [13687] = 0x72D1, [13688] = 0x73A4, [13689] = 0x73A1, [13690] = 0x73AD, ++ [13691] = 0x73A6, [13692] = 0x73A2, [13693] = 0x73A0, [13694] = 0x73AC, ++ [13695] = 0x739D, [13696] = 0x74DD, [13697] = 0x74E8, [13698] = 0x753F, ++ [13699] = 0x7540, [13700] = 0x753E, [13701] = 0x758C, [13702] = 0x7598, ++ [13703] = 0x76AF, [13704] = 0x76F3, [13705] = 0x76F1, [13706] = 0x76F0, ++ [13707] = 0x76F5, [13708] = 0x77F8, [13709] = 0x77FC, [13710] = 0x77F9, ++ [13711] = 0x77FB, [13712] = 0x77FA, [13747] = 0x77F7, [13748] = 0x7942, ++ [13749] = 0x793F, [13750] = 0x79C5, [13751] = 0x7A78, [13752] = 0x7A7B, ++ [13753] = 0x7AFB, [13754] = 0x7C75, [13755] = 0x7CFD, [13756] = 0x8035, ++ [13757] = 0x808F, [13758] = 0x80AE, [13759] = 0x80A3, [13760] = 0x80B8, ++ [13761] = 0x80B5, [13762] = 0x80AD, [13763] = 0x8220, [13764] = 0x82A0, ++ [13765] = 0x82C0, [13766] = 0x82AB, [13767] = 0x829A, [13768] = 0x8298, ++ [13769] = 0x829B, [13770] = 0x82B5, [13771] = 0x82A7, [13772] = 0x82AE, ++ [13773] = 0x82BC, [13774] = 0x829E, [13775] = 0x82BA, [13776] = 0x82B4, ++ [13777] = 0x82A8, [13778] = 0x82A1, [13779] = 0x82A9, [13780] = 0x82C2, ++ [13781] = 0x82A4, [13782] = 0x82C3, [13783] = 0x82B6, [13784] = 0x82A2, ++ [13785] = 0x8670, [13786] = 0x866F, [13787] = 0x866D, [13788] = 0x866E, ++ [13789] = 0x8C56, [13790] = 0x8FD2, [13791] = 0x8FCB, [13792] = 0x8FD3, ++ [13793] = 0x8FCD, [13794] = 0x8FD6, [13795] = 0x8FD5, [13796] = 0x8FD7, ++ [13797] = 0x90B2, [13798] = 0x90B4, [13799] = 0x90AF, [13800] = 0x90B3, ++ [13801] = 0x90B0, [13802] = 0x9639, [13803] = 0x963D, [13804] = 0x963C, ++ [13805] = 0x963A, [13806] = 0x9643, [13807] = 0x4FCD, [13808] = 0x4FC5, ++ [13809] = 0x4FD3, [13810] = 0x4FB2, [13811] = 0x4FC9, [13812] = 0x4FCB, ++ [13813] = 0x4FC1, [13814] = 0x4FD4, [13815] = 0x4FDC, [13816] = 0x4FD9, ++ [13817] = 0x4FBB, [13818] = 0x4FB3, [13819] = 0x4FDB, [13820] = 0x4FC7, ++ [13821] = 0x4FD6, [13822] = 0x4FBA, [13823] = 0x4FC0, [13824] = 0x4FB9, ++ [13825] = 0x4FEC, [13826] = 0x5244, [13827] = 0x5249, [13828] = 0x52C0, ++ [13829] = 0x52C2, [13830] = 0x533D, [13831] = 0x537C, [13832] = 0x5397, ++ [13833] = 0x5396, [13834] = 0x5399, [13835] = 0x5398, [13836] = 0x54BA, ++ [13837] = 0x54A1, [13838] = 0x54AD, [13839] = 0x54A5, [13840] = 0x54CF, ++ [13845] = 0x54C3, [13846] = 0x830D, [13847] = 0x54B7, [13848] = 0x54AE, ++ [13849] = 0x54D6, [13850] = 0x54B6, [13851] = 0x54C5, [13852] = 0x54C6, ++ [13853] = 0x54A0, [13854] = 0x5470, [13855] = 0x54BC, [13856] = 0x54A2, ++ [13857] = 0x54BE, [13858] = 0x5472, [13859] = 0x54DE, [13860] = 0x54B0, ++ [13861] = 0x57B5, [13862] = 0x579E, [13863] = 0x579F, [13864] = 0x57A4, ++ [13865] = 0x578C, [13866] = 0x5797, [13867] = 0x579D, [13868] = 0x579B, ++ [13869] = 0x5794, [13870] = 0x5798, [13871] = 0x578F, [13872] = 0x5799, ++ [13873] = 0x57A5, [13874] = 0x579A, [13875] = 0x5795, [13876] = 0x58F4, ++ [13877] = 0x590D, [13878] = 0x5953, [13879] = 0x59E1, [13880] = 0x59DE, ++ [13881] = 0x59EE, [13882] = 0x5A00, [13883] = 0x59F1, [13884] = 0x59DD, ++ [13885] = 0x59FA, [13886] = 0x59FD, [13887] = 0x59FC, [13888] = 0x59F6, ++ [13889] = 0x59E4, [13890] = 0x59F2, [13891] = 0x59F7, [13892] = 0x59DB, ++ [13893] = 0x59E9, [13894] = 0x59F3, [13895] = 0x59F5, [13896] = 0x59E0, ++ [13897] = 0x59FE, [13898] = 0x59F4, [13899] = 0x59ED, [13900] = 0x5BA8, ++ [13901] = 0x5C4C, [13902] = 0x5CD0, [13903] = 0x5CD8, [13904] = 0x5CCC, ++ [13905] = 0x5CD7, [13906] = 0x5CCB, [13907] = 0x5CDB, [13942] = 0x5CDE, ++ [13943] = 0x5CDA, [13944] = 0x5CC9, [13945] = 0x5CC7, [13946] = 0x5CCA, ++ [13947] = 0x5CD6, [13948] = 0x5CD3, [13949] = 0x5CD4, [13950] = 0x5CCF, ++ [13951] = 0x5CC8, [13952] = 0x5CC6, [13953] = 0x5CCE, [13954] = 0x5CDF, ++ [13955] = 0x5CF8, [13956] = 0x5DF9, [13957] = 0x5E21, [13958] = 0x5E22, ++ [13959] = 0x5E23, [13960] = 0x5E20, [13961] = 0x5E24, [13962] = 0x5EB0, ++ [13963] = 0x5EA4, [13964] = 0x5EA2, [13965] = 0x5E9B, [13966] = 0x5EA3, ++ [13967] = 0x5EA5, [13968] = 0x5F07, [13969] = 0x5F2E, [13970] = 0x5F56, ++ [13971] = 0x5F86, [13972] = 0x6037, [13973] = 0x6039, [13974] = 0x6054, ++ [13975] = 0x6072, [13976] = 0x605E, [13977] = 0x6045, [13978] = 0x6053, ++ [13979] = 0x6047, [13980] = 0x6049, [13981] = 0x605B, [13982] = 0x604C, ++ [13983] = 0x6040, [13984] = 0x6042, [13985] = 0x605F, [13986] = 0x6024, ++ [13987] = 0x6044, [13988] = 0x6058, [13989] = 0x6066, [13990] = 0x606E, ++ [13991] = 0x6242, [13992] = 0x6243, [13993] = 0x62CF, [13994] = 0x630D, ++ [13995] = 0x630B, [13996] = 0x62F5, [13997] = 0x630E, [13998] = 0x6303, ++ [13999] = 0x62EB, [14000] = 0x62F9, [14001] = 0x630F, [14002] = 0x630C, ++ [14003] = 0x62F8, [14004] = 0x62F6, [14005] = 0x6300, [14006] = 0x6313, ++ [14007] = 0x6314, [14008] = 0x62FA, [14009] = 0x6315, [14010] = 0x62FB, ++ [14011] = 0x62F0, [14012] = 0x6541, [14013] = 0x6543, [14014] = 0x65AA, ++ [14015] = 0x65BF, [14016] = 0x6636, [14017] = 0x6621, [14018] = 0x6632, ++ [14019] = 0x6635, [14020] = 0x661C, [14021] = 0x6626, [14022] = 0x6622, ++ [14023] = 0x6633, [14024] = 0x662B, [14025] = 0x663A, [14026] = 0x661D, ++ [14027] = 0x6634, [14028] = 0x6639, [14029] = 0x662E, [14030] = 0x670F, ++ [14031] = 0x6710, [14032] = 0x67C1, [14033] = 0x67F2, [14034] = 0x67C8, ++ [14035] = 0x67BA, [14040] = 0x67DC, [14041] = 0x67BB, [14042] = 0x67F8, ++ [14043] = 0x67D8, [14044] = 0x67C0, [14045] = 0x67B7, [14046] = 0x67C5, ++ [14047] = 0x67EB, [14048] = 0x67E4, [14049] = 0x67DF, [14050] = 0x67B5, ++ [14051] = 0x67CD, [14052] = 0x67B3, [14053] = 0x67F7, [14054] = 0x67F6, ++ [14055] = 0x67EE, [14056] = 0x67E3, [14057] = 0x67C2, [14058] = 0x67B9, ++ [14059] = 0x67CE, [14060] = 0x67E7, [14061] = 0x67F0, [14062] = 0x67B2, ++ [14063] = 0x67FC, [14064] = 0x67C6, [14065] = 0x67ED, [14066] = 0x67CC, ++ [14067] = 0x67AE, [14068] = 0x67E6, [14069] = 0x67DB, [14070] = 0x67FA, ++ [14071] = 0x67C9, [14072] = 0x67CA, [14073] = 0x67C3, [14074] = 0x67EA, ++ [14075] = 0x67CB, [14076] = 0x6B28, [14077] = 0x6B82, [14078] = 0x6B84, ++ [14079] = 0x6BB6, [14080] = 0x6BD6, [14081] = 0x6BD8, [14082] = 0x6BE0, ++ [14083] = 0x6C20, [14084] = 0x6C21, [14085] = 0x6D28, [14086] = 0x6D34, ++ [14087] = 0x6D2D, [14088] = 0x6D1F, [14089] = 0x6D3C, [14090] = 0x6D3F, ++ [14091] = 0x6D12, [14092] = 0x6D0A, [14093] = 0x6CDA, [14094] = 0x6D33, ++ [14095] = 0x6D04, [14096] = 0x6D19, [14097] = 0x6D3A, [14098] = 0x6D1A, ++ [14099] = 0x6D11, [14100] = 0x6D00, [14101] = 0x6D1D, [14102] = 0x6D42, ++ [14137] = 0x6D01, [14138] = 0x6D18, [14139] = 0x6D37, [14140] = 0x6D03, ++ [14141] = 0x6D0F, [14142] = 0x6D40, [14143] = 0x6D07, [14144] = 0x6D20, ++ [14145] = 0x6D2C, [14146] = 0x6D08, [14147] = 0x6D22, [14148] = 0x6D09, ++ [14149] = 0x6D10, [14150] = 0x70B7, [14151] = 0x709F, [14152] = 0x70BE, ++ [14153] = 0x70B1, [14154] = 0x70B0, [14155] = 0x70A1, [14156] = 0x70B4, ++ [14157] = 0x70B5, [14158] = 0x70A9, [14159] = 0x7241, [14160] = 0x7249, ++ [14161] = 0x724A, [14162] = 0x726C, [14163] = 0x7270, [14164] = 0x7273, ++ [14165] = 0x726E, [14166] = 0x72CA, [14167] = 0x72E4, [14168] = 0x72E8, ++ [14169] = 0x72EB, [14170] = 0x72DF, [14171] = 0x72EA, [14172] = 0x72E6, ++ [14173] = 0x72E3, [14174] = 0x7385, [14175] = 0x73CC, [14176] = 0x73C2, ++ [14177] = 0x73C8, [14178] = 0x73C5, [14179] = 0x73B9, [14180] = 0x73B6, ++ [14181] = 0x73B5, [14182] = 0x73B4, [14183] = 0x73EB, [14184] = 0x73BF, ++ [14185] = 0x73C7, [14186] = 0x73BE, [14187] = 0x73C3, [14188] = 0x73C6, ++ [14189] = 0x73B8, [14190] = 0x73CB, [14191] = 0x74EC, [14192] = 0x74EE, ++ [14193] = 0x752E, [14194] = 0x7547, [14195] = 0x7548, [14196] = 0x75A7, ++ [14197] = 0x75AA, [14198] = 0x7679, [14199] = 0x76C4, [14200] = 0x7708, ++ [14201] = 0x7703, [14202] = 0x7704, [14203] = 0x7705, [14204] = 0x770A, ++ [14205] = 0x76F7, [14206] = 0x76FB, [14207] = 0x76FA, [14208] = 0x77E7, ++ [14209] = 0x77E8, [14210] = 0x7806, [14211] = 0x7811, [14212] = 0x7812, ++ [14213] = 0x7805, [14214] = 0x7810, [14215] = 0x780F, [14216] = 0x780E, ++ [14217] = 0x7809, [14218] = 0x7803, [14219] = 0x7813, [14220] = 0x794A, ++ [14221] = 0x794C, [14222] = 0x794B, [14223] = 0x7945, [14224] = 0x7944, ++ [14225] = 0x79D5, [14226] = 0x79CD, [14227] = 0x79CF, [14228] = 0x79D6, ++ [14229] = 0x79CE, [14230] = 0x7A80, [14235] = 0x7A7E, [14236] = 0x7AD1, ++ [14237] = 0x7B00, [14238] = 0x7B01, [14239] = 0x7C7A, [14240] = 0x7C78, ++ [14241] = 0x7C79, [14242] = 0x7C7F, [14243] = 0x7C80, [14244] = 0x7C81, ++ [14245] = 0x7D03, [14246] = 0x7D08, [14247] = 0x7D01, [14248] = 0x7F58, ++ [14249] = 0x7F91, [14250] = 0x7F8D, [14251] = 0x7FBE, [14252] = 0x8007, ++ [14253] = 0x800E, [14254] = 0x800F, [14255] = 0x8014, [14256] = 0x8037, ++ [14257] = 0x80D8, [14258] = 0x80C7, [14259] = 0x80E0, [14260] = 0x80D1, ++ [14261] = 0x80C8, [14262] = 0x80C2, [14263] = 0x80D0, [14264] = 0x80C5, ++ [14265] = 0x80E3, [14266] = 0x80D9, [14267] = 0x80DC, [14268] = 0x80CA, ++ [14269] = 0x80D5, [14270] = 0x80C9, [14271] = 0x80CF, [14272] = 0x80D7, ++ [14273] = 0x80E6, [14274] = 0x80CD, [14275] = 0x81FF, [14276] = 0x8221, ++ [14277] = 0x8294, [14278] = 0x82D9, [14279] = 0x82FE, [14280] = 0x82F9, ++ [14281] = 0x8307, [14282] = 0x82E8, [14283] = 0x8300, [14284] = 0x82D5, ++ [14285] = 0x833A, [14286] = 0x82EB, [14287] = 0x82D6, [14288] = 0x82F4, ++ [14289] = 0x82EC, [14290] = 0x82E1, [14291] = 0x82F2, [14292] = 0x82F5, ++ [14293] = 0x830C, [14294] = 0x82FB, [14295] = 0x82F6, [14296] = 0x82F0, ++ [14297] = 0x82EA, [14332] = 0x82E4, [14333] = 0x82E0, [14334] = 0x82FA, ++ [14335] = 0x82F3, [14336] = 0x82ED, [14337] = 0x8677, [14338] = 0x8674, ++ [14339] = 0x867C, [14340] = 0x8673, [14341] = 0x8841, [14342] = 0x884E, ++ [14343] = 0x8867, [14344] = 0x886A, [14345] = 0x8869, [14346] = 0x89D3, ++ [14347] = 0x8A04, [14348] = 0x8A07, [14349] = 0x8D72, [14350] = 0x8FE3, ++ [14351] = 0x8FE1, [14352] = 0x8FEE, [14353] = 0x8FE0, [14354] = 0x90F1, ++ [14355] = 0x90BD, [14356] = 0x90BF, [14357] = 0x90D5, [14358] = 0x90C5, ++ [14359] = 0x90BE, [14360] = 0x90C7, [14361] = 0x90CB, [14362] = 0x90C8, ++ [14363] = 0x91D4, [14364] = 0x91D3, [14365] = 0x9654, [14366] = 0x964F, ++ [14367] = 0x9651, [14368] = 0x9653, [14369] = 0x964A, [14370] = 0x964E, ++ [14371] = 0x501E, [14372] = 0x5005, [14373] = 0x5007, [14374] = 0x5013, ++ [14375] = 0x5022, [14376] = 0x5030, [14377] = 0x501B, [14378] = 0x4FF5, ++ [14379] = 0x4FF4, [14380] = 0x5033, [14381] = 0x5037, [14382] = 0x502C, ++ [14383] = 0x4FF6, [14384] = 0x4FF7, [14385] = 0x5017, [14386] = 0x501C, ++ [14387] = 0x5020, [14388] = 0x5027, [14389] = 0x5035, [14390] = 0x502F, ++ [14391] = 0x5031, [14392] = 0x500E, [14393] = 0x515A, [14394] = 0x5194, ++ [14395] = 0x5193, [14396] = 0x51CA, [14397] = 0x51C4, [14398] = 0x51C5, ++ [14399] = 0x51C8, [14400] = 0x51CE, [14401] = 0x5261, [14402] = 0x525A, ++ [14403] = 0x5252, [14404] = 0x525E, [14405] = 0x525F, [14406] = 0x5255, ++ [14407] = 0x5262, [14408] = 0x52CD, [14409] = 0x530E, [14410] = 0x539E, ++ [14411] = 0x5526, [14412] = 0x54E2, [14413] = 0x5517, [14414] = 0x5512, ++ [14415] = 0x54E7, [14416] = 0x54F3, [14417] = 0x54E4, [14418] = 0x551A, ++ [14419] = 0x54FF, [14420] = 0x5504, [14421] = 0x5508, [14422] = 0x54EB, ++ [14423] = 0x5511, [14424] = 0x5505, [14425] = 0x54F1, [14430] = 0x550A, ++ [14431] = 0x54FB, [14432] = 0x54F7, [14433] = 0x54F8, [14434] = 0x54E0, ++ [14435] = 0x550E, [14436] = 0x5503, [14437] = 0x550B, [14438] = 0x5701, ++ [14439] = 0x5702, [14440] = 0x57CC, [14441] = 0x5832, [14442] = 0x57D5, ++ [14443] = 0x57D2, [14444] = 0x57BA, [14445] = 0x57C6, [14446] = 0x57BD, ++ [14447] = 0x57BC, [14448] = 0x57B8, [14449] = 0x57B6, [14450] = 0x57BF, ++ [14451] = 0x57C7, [14452] = 0x57D0, [14453] = 0x57B9, [14454] = 0x57C1, ++ [14455] = 0x590E, [14456] = 0x594A, [14457] = 0x5A19, [14458] = 0x5A16, ++ [14459] = 0x5A2D, [14460] = 0x5A2E, [14461] = 0x5A15, [14462] = 0x5A0F, ++ [14463] = 0x5A17, [14464] = 0x5A0A, [14465] = 0x5A1E, [14466] = 0x5A33, ++ [14467] = 0x5B6C, [14468] = 0x5BA7, [14469] = 0x5BAD, [14470] = 0x5BAC, ++ [14471] = 0x5C03, [14472] = 0x5C56, [14473] = 0x5C54, [14474] = 0x5CEC, ++ [14475] = 0x5CFF, [14476] = 0x5CEE, [14477] = 0x5CF1, [14478] = 0x5CF7, ++ [14479] = 0x5D00, [14480] = 0x5CF9, [14481] = 0x5E29, [14482] = 0x5E28, ++ [14483] = 0x5EA8, [14484] = 0x5EAE, [14485] = 0x5EAA, [14486] = 0x5EAC, ++ [14487] = 0x5F33, [14488] = 0x5F30, [14489] = 0x5F67, [14490] = 0x605D, ++ [14491] = 0x605A, [14492] = 0x6067, [14527] = 0x6041, [14528] = 0x60A2, ++ [14529] = 0x6088, [14530] = 0x6080, [14531] = 0x6092, [14532] = 0x6081, ++ [14533] = 0x609D, [14534] = 0x6083, [14535] = 0x6095, [14536] = 0x609B, ++ [14537] = 0x6097, [14538] = 0x6087, [14539] = 0x609C, [14540] = 0x608E, ++ [14541] = 0x6219, [14542] = 0x6246, [14543] = 0x62F2, [14544] = 0x6310, ++ [14545] = 0x6356, [14546] = 0x632C, [14547] = 0x6344, [14548] = 0x6345, ++ [14549] = 0x6336, [14550] = 0x6343, [14551] = 0x63E4, [14552] = 0x6339, ++ [14553] = 0x634B, [14554] = 0x634A, [14555] = 0x633C, [14556] = 0x6329, ++ [14557] = 0x6341, [14558] = 0x6334, [14559] = 0x6358, [14560] = 0x6354, ++ [14561] = 0x6359, [14562] = 0x632D, [14563] = 0x6347, [14564] = 0x6333, ++ [14565] = 0x635A, [14566] = 0x6351, [14567] = 0x6338, [14568] = 0x6357, ++ [14569] = 0x6340, [14570] = 0x6348, [14571] = 0x654A, [14572] = 0x6546, ++ [14573] = 0x65C6, [14574] = 0x65C3, [14575] = 0x65C4, [14576] = 0x65C2, ++ [14577] = 0x664A, [14578] = 0x665F, [14579] = 0x6647, [14580] = 0x6651, ++ [14581] = 0x6712, [14582] = 0x6713, [14583] = 0x681F, [14584] = 0x681A, ++ [14585] = 0x6849, [14586] = 0x6832, [14587] = 0x6833, [14588] = 0x683B, ++ [14589] = 0x684B, [14590] = 0x684F, [14591] = 0x6816, [14592] = 0x6831, ++ [14593] = 0x681C, [14594] = 0x6835, [14595] = 0x682B, [14596] = 0x682D, ++ [14597] = 0x682F, [14598] = 0x684E, [14599] = 0x6844, [14600] = 0x6834, ++ [14601] = 0x681D, [14602] = 0x6812, [14603] = 0x6814, [14604] = 0x6826, ++ [14605] = 0x6828, [14606] = 0x682E, [14607] = 0x684D, [14608] = 0x683A, ++ [14609] = 0x6825, [14610] = 0x6820, [14611] = 0x6B2C, [14612] = 0x6B2F, ++ [14613] = 0x6B2D, [14614] = 0x6B31, [14615] = 0x6B34, [14616] = 0x6B6D, ++ [14617] = 0x8082, [14618] = 0x6B88, [14619] = 0x6BE6, [14620] = 0x6BE4, ++ [14625] = 0x6BE8, [14626] = 0x6BE3, [14627] = 0x6BE2, [14628] = 0x6BE7, ++ [14629] = 0x6C25, [14630] = 0x6D7A, [14631] = 0x6D63, [14632] = 0x6D64, ++ [14633] = 0x6D76, [14634] = 0x6D0D, [14635] = 0x6D61, [14636] = 0x6D92, ++ [14637] = 0x6D58, [14638] = 0x6D62, [14639] = 0x6D6D, [14640] = 0x6D6F, ++ [14641] = 0x6D91, [14642] = 0x6D8D, [14643] = 0x6DEF, [14644] = 0x6D7F, ++ [14645] = 0x6D86, [14646] = 0x6D5E, [14647] = 0x6D67, [14648] = 0x6D60, ++ [14649] = 0x6D97, [14650] = 0x6D70, [14651] = 0x6D7C, [14652] = 0x6D5F, ++ [14653] = 0x6D82, [14654] = 0x6D98, [14655] = 0x6D2F, [14656] = 0x6D68, ++ [14657] = 0x6D8B, [14658] = 0x6D7E, [14659] = 0x6D80, [14660] = 0x6D84, ++ [14661] = 0x6D16, [14662] = 0x6D83, [14663] = 0x6D7B, [14664] = 0x6D7D, ++ [14665] = 0x6D75, [14666] = 0x6D90, [14667] = 0x70DC, [14668] = 0x70D3, ++ [14669] = 0x70D1, [14670] = 0x70DD, [14671] = 0x70CB, [14672] = 0x7F39, ++ [14673] = 0x70E2, [14674] = 0x70D7, [14675] = 0x70D2, [14676] = 0x70DE, ++ [14677] = 0x70E0, [14678] = 0x70D4, [14679] = 0x70CD, [14680] = 0x70C5, ++ [14681] = 0x70C6, [14682] = 0x70C7, [14683] = 0x70DA, [14684] = 0x70CE, ++ [14685] = 0x70E1, [14686] = 0x7242, [14687] = 0x7278, [14722] = 0x7277, ++ [14723] = 0x7276, [14724] = 0x7300, [14725] = 0x72FA, [14726] = 0x72F4, ++ [14727] = 0x72FE, [14728] = 0x72F6, [14729] = 0x72F3, [14730] = 0x72FB, ++ [14731] = 0x7301, [14732] = 0x73D3, [14733] = 0x73D9, [14734] = 0x73E5, ++ [14735] = 0x73D6, [14736] = 0x73BC, [14737] = 0x73E7, [14738] = 0x73E3, ++ [14739] = 0x73E9, [14740] = 0x73DC, [14741] = 0x73D2, [14742] = 0x73DB, ++ [14743] = 0x73D4, [14744] = 0x73DD, [14745] = 0x73DA, [14746] = 0x73D7, ++ [14747] = 0x73D8, [14748] = 0x73E8, [14749] = 0x74DE, [14750] = 0x74DF, ++ [14751] = 0x74F4, [14752] = 0x74F5, [14753] = 0x7521, [14754] = 0x755B, ++ [14755] = 0x755F, [14756] = 0x75B0, [14757] = 0x75C1, [14758] = 0x75BB, ++ [14759] = 0x75C4, [14760] = 0x75C0, [14761] = 0x75BF, [14762] = 0x75B6, ++ [14763] = 0x75BA, [14764] = 0x768A, [14765] = 0x76C9, [14766] = 0x771D, ++ [14767] = 0x771B, [14768] = 0x7710, [14769] = 0x7713, [14770] = 0x7712, ++ [14771] = 0x7723, [14772] = 0x7711, [14773] = 0x7715, [14774] = 0x7719, ++ [14775] = 0x771A, [14776] = 0x7722, [14777] = 0x7727, [14778] = 0x7823, ++ [14779] = 0x782C, [14780] = 0x7822, [14781] = 0x7835, [14782] = 0x782F, ++ [14783] = 0x7828, [14784] = 0x782E, [14785] = 0x782B, [14786] = 0x7821, ++ [14787] = 0x7829, [14788] = 0x7833, [14789] = 0x782A, [14790] = 0x7831, ++ [14791] = 0x7954, [14792] = 0x795B, [14793] = 0x794F, [14794] = 0x795C, ++ [14795] = 0x7953, [14796] = 0x7952, [14797] = 0x7951, [14798] = 0x79EB, ++ [14799] = 0x79EC, [14800] = 0x79E0, [14801] = 0x79EE, [14802] = 0x79ED, ++ [14803] = 0x79EA, [14804] = 0x79DC, [14805] = 0x79DE, [14806] = 0x79DD, ++ [14807] = 0x7A86, [14808] = 0x7A89, [14809] = 0x7A85, [14810] = 0x7A8B, ++ [14811] = 0x7A8C, [14812] = 0x7A8A, [14813] = 0x7A87, [14814] = 0x7AD8, ++ [14815] = 0x7B10, [14820] = 0x7B04, [14821] = 0x7B13, [14822] = 0x7B05, ++ [14823] = 0x7B0F, [14824] = 0x7B08, [14825] = 0x7B0A, [14826] = 0x7B0E, ++ [14827] = 0x7B09, [14828] = 0x7B12, [14829] = 0x7C84, [14830] = 0x7C91, ++ [14831] = 0x7C8A, [14832] = 0x7C8C, [14833] = 0x7C88, [14834] = 0x7C8D, ++ [14835] = 0x7C85, [14836] = 0x7D1E, [14837] = 0x7D1D, [14838] = 0x7D11, ++ [14839] = 0x7D0E, [14840] = 0x7D18, [14841] = 0x7D16, [14842] = 0x7D13, ++ [14843] = 0x7D1F, [14844] = 0x7D12, [14845] = 0x7D0F, [14846] = 0x7D0C, ++ [14847] = 0x7F5C, [14848] = 0x7F61, [14849] = 0x7F5E, [14850] = 0x7F60, ++ [14851] = 0x7F5D, [14852] = 0x7F5B, [14853] = 0x7F96, [14854] = 0x7F92, ++ [14855] = 0x7FC3, [14856] = 0x7FC2, [14857] = 0x7FC0, [14858] = 0x8016, ++ [14859] = 0x803E, [14860] = 0x8039, [14861] = 0x80FA, [14862] = 0x80F2, ++ [14863] = 0x80F9, [14864] = 0x80F5, [14865] = 0x8101, [14866] = 0x80FB, ++ [14867] = 0x8100, [14868] = 0x8201, [14869] = 0x822F, [14870] = 0x8225, ++ [14871] = 0x8333, [14872] = 0x832D, [14873] = 0x8344, [14874] = 0x8319, ++ [14875] = 0x8351, [14876] = 0x8325, [14877] = 0x8356, [14878] = 0x833F, ++ [14879] = 0x8341, [14880] = 0x8326, [14881] = 0x831C, [14882] = 0x8322, ++ [14917] = 0x8342, [14918] = 0x834E, [14919] = 0x831B, [14920] = 0x832A, ++ [14921] = 0x8308, [14922] = 0x833C, [14923] = 0x834D, [14924] = 0x8316, ++ [14925] = 0x8324, [14926] = 0x8320, [14927] = 0x8337, [14928] = 0x832F, ++ [14929] = 0x8329, [14930] = 0x8347, [14931] = 0x8345, [14932] = 0x834C, ++ [14933] = 0x8353, [14934] = 0x831E, [14935] = 0x832C, [14936] = 0x834B, ++ [14937] = 0x8327, [14938] = 0x8348, [14939] = 0x8653, [14940] = 0x8652, ++ [14941] = 0x86A2, [14942] = 0x86A8, [14943] = 0x8696, [14944] = 0x868D, ++ [14945] = 0x8691, [14946] = 0x869E, [14947] = 0x8687, [14948] = 0x8697, ++ [14949] = 0x8686, [14950] = 0x868B, [14951] = 0x869A, [14952] = 0x8685, ++ [14953] = 0x86A5, [14954] = 0x8699, [14955] = 0x86A1, [14956] = 0x86A7, ++ [14957] = 0x8695, [14958] = 0x8698, [14959] = 0x868E, [14960] = 0x869D, ++ [14961] = 0x8690, [14962] = 0x8694, [14963] = 0x8843, [14964] = 0x8844, ++ [14965] = 0x886D, [14966] = 0x8875, [14967] = 0x8876, [14968] = 0x8872, ++ [14969] = 0x8880, [14970] = 0x8871, [14971] = 0x887F, [14972] = 0x886F, ++ [14973] = 0x8883, [14974] = 0x887E, [14975] = 0x8874, [14976] = 0x887C, ++ [14977] = 0x8A12, [14978] = 0x8C47, [14979] = 0x8C57, [14980] = 0x8C7B, ++ [14981] = 0x8CA4, [14982] = 0x8CA3, [14983] = 0x8D76, [14984] = 0x8D78, ++ [14985] = 0x8DB5, [14986] = 0x8DB7, [14987] = 0x8DB6, [14988] = 0x8ED1, ++ [14989] = 0x8ED3, [14990] = 0x8FFE, [14991] = 0x8FF5, [14992] = 0x9002, ++ [14993] = 0x8FFF, [14994] = 0x8FFB, [14995] = 0x9004, [14996] = 0x8FFC, ++ [14997] = 0x8FF6, [14998] = 0x90D6, [14999] = 0x90E0, [15000] = 0x90D9, ++ [15001] = 0x90DA, [15002] = 0x90E3, [15003] = 0x90DF, [15004] = 0x90E5, ++ [15005] = 0x90D8, [15006] = 0x90DB, [15007] = 0x90D7, [15008] = 0x90DC, ++ [15009] = 0x90E4, [15010] = 0x9150, [15015] = 0x914E, [15016] = 0x914F, ++ [15017] = 0x91D5, [15018] = 0x91E2, [15019] = 0x91DA, [15020] = 0x965C, ++ [15021] = 0x965F, [15022] = 0x96BC, [15023] = 0x98E3, [15024] = 0x9ADF, ++ [15025] = 0x9B2F, [15026] = 0x4E7F, [15027] = 0x5070, [15028] = 0x506A, ++ [15029] = 0x5061, [15030] = 0x505E, [15031] = 0x5060, [15032] = 0x5053, ++ [15033] = 0x504B, [15034] = 0x505D, [15035] = 0x5072, [15036] = 0x5048, ++ [15037] = 0x504D, [15038] = 0x5041, [15039] = 0x505B, [15040] = 0x504A, ++ [15041] = 0x5062, [15042] = 0x5015, [15043] = 0x5045, [15044] = 0x505F, ++ [15045] = 0x5069, [15046] = 0x506B, [15047] = 0x5063, [15048] = 0x5064, ++ [15049] = 0x5046, [15050] = 0x5040, [15051] = 0x506E, [15052] = 0x5073, ++ [15053] = 0x5057, [15054] = 0x5051, [15055] = 0x51D0, [15056] = 0x526B, ++ [15057] = 0x526D, [15058] = 0x526C, [15059] = 0x526E, [15060] = 0x52D6, ++ [15061] = 0x52D3, [15062] = 0x532D, [15063] = 0x539C, [15064] = 0x5575, ++ [15065] = 0x5576, [15066] = 0x553C, [15067] = 0x554D, [15068] = 0x5550, ++ [15069] = 0x5534, [15070] = 0x552A, [15071] = 0x5551, [15072] = 0x5562, ++ [15073] = 0x5536, [15074] = 0x5535, [15075] = 0x5530, [15076] = 0x5552, ++ [15077] = 0x5545, [15112] = 0x550C, [15113] = 0x5532, [15114] = 0x5565, ++ [15115] = 0x554E, [15116] = 0x5539, [15117] = 0x5548, [15118] = 0x552D, ++ [15119] = 0x553B, [15120] = 0x5540, [15121] = 0x554B, [15122] = 0x570A, ++ [15123] = 0x5707, [15124] = 0x57FB, [15125] = 0x5814, [15126] = 0x57E2, ++ [15127] = 0x57F6, [15128] = 0x57DC, [15129] = 0x57F4, [15130] = 0x5800, ++ [15131] = 0x57ED, [15132] = 0x57FD, [15133] = 0x5808, [15134] = 0x57F8, ++ [15135] = 0x580B, [15136] = 0x57F3, [15137] = 0x57CF, [15138] = 0x5807, ++ [15139] = 0x57EE, [15140] = 0x57E3, [15141] = 0x57F2, [15142] = 0x57E5, ++ [15143] = 0x57EC, [15144] = 0x57E1, [15145] = 0x580E, [15146] = 0x57FC, ++ [15147] = 0x5810, [15148] = 0x57E7, [15149] = 0x5801, [15150] = 0x580C, ++ [15151] = 0x57F1, [15152] = 0x57E9, [15153] = 0x57F0, [15154] = 0x580D, ++ [15155] = 0x5804, [15156] = 0x595C, [15157] = 0x5A60, [15158] = 0x5A58, ++ [15159] = 0x5A55, [15160] = 0x5A67, [15161] = 0x5A5E, [15162] = 0x5A38, ++ [15163] = 0x5A35, [15164] = 0x5A6D, [15165] = 0x5A50, [15166] = 0x5A5F, ++ [15167] = 0x5A65, [15168] = 0x5A6C, [15169] = 0x5A53, [15170] = 0x5A64, ++ [15171] = 0x5A57, [15172] = 0x5A43, [15173] = 0x5A5D, [15174] = 0x5A52, ++ [15175] = 0x5A44, [15176] = 0x5A5B, [15177] = 0x5A48, [15178] = 0x5A8E, ++ [15179] = 0x5A3E, [15180] = 0x5A4D, [15181] = 0x5A39, [15182] = 0x5A4C, ++ [15183] = 0x5A70, [15184] = 0x5A69, [15185] = 0x5A47, [15186] = 0x5A51, ++ [15187] = 0x5A56, [15188] = 0x5A42, [15189] = 0x5A5C, [15190] = 0x5B72, ++ [15191] = 0x5B6E, [15192] = 0x5BC1, [15193] = 0x5BC0, [15194] = 0x5C59, ++ [15195] = 0x5D1E, [15196] = 0x5D0B, [15197] = 0x5D1D, [15198] = 0x5D1A, ++ [15199] = 0x5D20, [15200] = 0x5D0C, [15201] = 0x5D28, [15202] = 0x5D0D, ++ [15203] = 0x5D26, [15204] = 0x5D25, [15205] = 0x5D0F, [15210] = 0x5D30, ++ [15211] = 0x5D12, [15212] = 0x5D23, [15213] = 0x5D1F, [15214] = 0x5D2E, ++ [15215] = 0x5E3E, [15216] = 0x5E34, [15217] = 0x5EB1, [15218] = 0x5EB4, ++ [15219] = 0x5EB9, [15220] = 0x5EB2, [15221] = 0x5EB3, [15222] = 0x5F36, ++ [15223] = 0x5F38, [15224] = 0x5F9B, [15225] = 0x5F96, [15226] = 0x5F9F, ++ [15227] = 0x608A, [15228] = 0x6090, [15229] = 0x6086, [15230] = 0x60BE, ++ [15231] = 0x60B0, [15232] = 0x60BA, [15233] = 0x60D3, [15234] = 0x60D4, ++ [15235] = 0x60CF, [15236] = 0x60E4, [15237] = 0x60D9, [15238] = 0x60DD, ++ [15239] = 0x60C8, [15240] = 0x60B1, [15241] = 0x60DB, [15242] = 0x60B7, ++ [15243] = 0x60CA, [15244] = 0x60BF, [15245] = 0x60C3, [15246] = 0x60CD, ++ [15247] = 0x60C0, [15248] = 0x6332, [15249] = 0x6365, [15250] = 0x638A, ++ [15251] = 0x6382, [15252] = 0x637D, [15253] = 0x63BD, [15254] = 0x639E, ++ [15255] = 0x63AD, [15256] = 0x639D, [15257] = 0x6397, [15258] = 0x63AB, ++ [15259] = 0x638E, [15260] = 0x636F, [15261] = 0x6387, [15262] = 0x6390, ++ [15263] = 0x636E, [15264] = 0x63AF, [15265] = 0x6375, [15266] = 0x639C, ++ [15267] = 0x636D, [15268] = 0x63AE, [15269] = 0x637C, [15270] = 0x63A4, ++ [15271] = 0x633B, [15272] = 0x639F, [15307] = 0x6378, [15308] = 0x6385, ++ [15309] = 0x6381, [15310] = 0x6391, [15311] = 0x638D, [15312] = 0x6370, ++ [15313] = 0x6553, [15314] = 0x65CD, [15315] = 0x6665, [15316] = 0x6661, ++ [15317] = 0x665B, [15318] = 0x6659, [15319] = 0x665C, [15320] = 0x6662, ++ [15321] = 0x6718, [15322] = 0x6879, [15323] = 0x6887, [15324] = 0x6890, ++ [15325] = 0x689C, [15326] = 0x686D, [15327] = 0x686E, [15328] = 0x68AE, ++ [15329] = 0x68AB, [15330] = 0x6956, [15331] = 0x686F, [15332] = 0x68A3, ++ [15333] = 0x68AC, [15334] = 0x68A9, [15335] = 0x6875, [15336] = 0x6874, ++ [15337] = 0x68B2, [15338] = 0x688F, [15339] = 0x6877, [15340] = 0x6892, ++ [15341] = 0x687C, [15342] = 0x686B, [15343] = 0x6872, [15344] = 0x68AA, ++ [15345] = 0x6880, [15346] = 0x6871, [15347] = 0x687E, [15348] = 0x689B, ++ [15349] = 0x6896, [15350] = 0x688B, [15351] = 0x68A0, [15352] = 0x6889, ++ [15353] = 0x68A4, [15354] = 0x6878, [15355] = 0x687B, [15356] = 0x6891, ++ [15357] = 0x688C, [15358] = 0x688A, [15359] = 0x687D, [15360] = 0x6B36, ++ [15361] = 0x6B33, [15362] = 0x6B37, [15363] = 0x6B38, [15364] = 0x6B91, ++ [15365] = 0x6B8F, [15366] = 0x6B8D, [15367] = 0x6B8E, [15368] = 0x6B8C, ++ [15369] = 0x6C2A, [15370] = 0x6DC0, [15371] = 0x6DAB, [15372] = 0x6DB4, ++ [15373] = 0x6DB3, [15374] = 0x6E74, [15375] = 0x6DAC, [15376] = 0x6DE9, ++ [15377] = 0x6DE2, [15378] = 0x6DB7, [15379] = 0x6DF6, [15380] = 0x6DD4, ++ [15381] = 0x6E00, [15382] = 0x6DC8, [15383] = 0x6DE0, [15384] = 0x6DDF, ++ [15385] = 0x6DD6, [15386] = 0x6DBE, [15387] = 0x6DE5, [15388] = 0x6DDC, ++ [15389] = 0x6DDD, [15390] = 0x6DDB, [15391] = 0x6DF4, [15392] = 0x6DCA, ++ [15393] = 0x6DBD, [15394] = 0x6DED, [15395] = 0x6DF0, [15396] = 0x6DBA, ++ [15397] = 0x6DD5, [15398] = 0x6DC2, [15399] = 0x6DCF, [15400] = 0x6DC9, ++ [15405] = 0x6DD0, [15406] = 0x6DF2, [15407] = 0x6DD3, [15408] = 0x6DFD, ++ [15409] = 0x6DD7, [15410] = 0x6DCD, [15411] = 0x6DE3, [15412] = 0x6DBB, ++ [15413] = 0x70FA, [15414] = 0x710D, [15415] = 0x70F7, [15416] = 0x7117, ++ [15417] = 0x70F4, [15418] = 0x710C, [15419] = 0x70F0, [15420] = 0x7104, ++ [15421] = 0x70F3, [15422] = 0x7110, [15423] = 0x70FC, [15424] = 0x70FF, ++ [15425] = 0x7106, [15426] = 0x7113, [15427] = 0x7100, [15428] = 0x70F8, ++ [15429] = 0x70F6, [15430] = 0x710B, [15431] = 0x7102, [15432] = 0x710E, ++ [15433] = 0x727E, [15434] = 0x727B, [15435] = 0x727C, [15436] = 0x727F, ++ [15437] = 0x731D, [15438] = 0x7317, [15439] = 0x7307, [15440] = 0x7311, ++ [15441] = 0x7318, [15442] = 0x730A, [15443] = 0x7308, [15444] = 0x72FF, ++ [15445] = 0x730F, [15446] = 0x731E, [15447] = 0x7388, [15448] = 0x73F6, ++ [15449] = 0x73F8, [15450] = 0x73F5, [15451] = 0x7404, [15452] = 0x7401, ++ [15453] = 0x73FD, [15454] = 0x7407, [15455] = 0x7400, [15456] = 0x73FA, ++ [15457] = 0x73FC, [15458] = 0x73FF, [15459] = 0x740C, [15460] = 0x740B, ++ [15461] = 0x73F4, [15462] = 0x7408, [15463] = 0x7564, [15464] = 0x7563, ++ [15465] = 0x75CE, [15466] = 0x75D2, [15467] = 0x75CF, [15502] = 0x75CB, ++ [15503] = 0x75CC, [15504] = 0x75D1, [15505] = 0x75D0, [15506] = 0x768F, ++ [15507] = 0x7689, [15508] = 0x76D3, [15509] = 0x7739, [15510] = 0x772F, ++ [15511] = 0x772D, [15512] = 0x7731, [15513] = 0x7732, [15514] = 0x7734, ++ [15515] = 0x7733, [15516] = 0x773D, [15517] = 0x7725, [15518] = 0x773B, ++ [15519] = 0x7735, [15520] = 0x7848, [15521] = 0x7852, [15522] = 0x7849, ++ [15523] = 0x784D, [15524] = 0x784A, [15525] = 0x784C, [15526] = 0x7826, ++ [15527] = 0x7845, [15528] = 0x7850, [15529] = 0x7964, [15530] = 0x7967, ++ [15531] = 0x7969, [15532] = 0x796A, [15533] = 0x7963, [15534] = 0x796B, ++ [15535] = 0x7961, [15536] = 0x79BB, [15537] = 0x79FA, [15538] = 0x79F8, ++ [15539] = 0x79F6, [15540] = 0x79F7, [15541] = 0x7A8F, [15542] = 0x7A94, ++ [15543] = 0x7A90, [15544] = 0x7B35, [15545] = 0x7B47, [15546] = 0x7B34, ++ [15547] = 0x7B25, [15548] = 0x7B30, [15549] = 0x7B22, [15550] = 0x7B24, ++ [15551] = 0x7B33, [15552] = 0x7B18, [15553] = 0x7B2A, [15554] = 0x7B1D, ++ [15555] = 0x7B31, [15556] = 0x7B2B, [15557] = 0x7B2D, [15558] = 0x7B2F, ++ [15559] = 0x7B32, [15560] = 0x7B38, [15561] = 0x7B1A, [15562] = 0x7B23, ++ [15563] = 0x7C94, [15564] = 0x7C98, [15565] = 0x7C96, [15566] = 0x7CA3, ++ [15567] = 0x7D35, [15568] = 0x7D3D, [15569] = 0x7D38, [15570] = 0x7D36, ++ [15571] = 0x7D3A, [15572] = 0x7D45, [15573] = 0x7D2C, [15574] = 0x7D29, ++ [15575] = 0x7D41, [15576] = 0x7D47, [15577] = 0x7D3E, [15578] = 0x7D3F, ++ [15579] = 0x7D4A, [15580] = 0x7D3B, [15581] = 0x7D28, [15582] = 0x7F63, ++ [15583] = 0x7F95, [15584] = 0x7F9C, [15585] = 0x7F9D, [15586] = 0x7F9B, ++ [15587] = 0x7FCA, [15588] = 0x7FCB, [15589] = 0x7FCD, [15590] = 0x7FD0, ++ [15591] = 0x7FD1, [15592] = 0x7FC7, [15593] = 0x7FCF, [15594] = 0x7FC9, ++ [15595] = 0x801F, [15600] = 0x801E, [15601] = 0x801B, [15602] = 0x8047, ++ [15603] = 0x8043, [15604] = 0x8048, [15605] = 0x8118, [15606] = 0x8125, ++ [15607] = 0x8119, [15608] = 0x811B, [15609] = 0x812D, [15610] = 0x811F, ++ [15611] = 0x812C, [15612] = 0x811E, [15613] = 0x8121, [15614] = 0x8115, ++ [15615] = 0x8127, [15616] = 0x811D, [15617] = 0x8122, [15618] = 0x8211, ++ [15619] = 0x8238, [15620] = 0x8233, [15621] = 0x823A, [15622] = 0x8234, ++ [15623] = 0x8232, [15624] = 0x8274, [15625] = 0x8390, [15626] = 0x83A3, ++ [15627] = 0x83A8, [15628] = 0x838D, [15629] = 0x837A, [15630] = 0x8373, ++ [15631] = 0x83A4, [15632] = 0x8374, [15633] = 0x838F, [15634] = 0x8381, ++ [15635] = 0x8395, [15636] = 0x8399, [15637] = 0x8375, [15638] = 0x8394, ++ [15639] = 0x83A9, [15640] = 0x837D, [15641] = 0x8383, [15642] = 0x838C, ++ [15643] = 0x839D, [15644] = 0x839B, [15645] = 0x83AA, [15646] = 0x838B, ++ [15647] = 0x837E, [15648] = 0x83A5, [15649] = 0x83AF, [15650] = 0x8388, ++ [15651] = 0x8397, [15652] = 0x83B0, [15653] = 0x837F, [15654] = 0x83A6, ++ [15655] = 0x8387, [15656] = 0x83AE, [15657] = 0x8376, [15658] = 0x839A, ++ [15659] = 0x8659, [15660] = 0x8656, [15661] = 0x86BF, [15662] = 0x86B7, ++ [15697] = 0x86C2, [15698] = 0x86C1, [15699] = 0x86C5, [15700] = 0x86BA, ++ [15701] = 0x86B0, [15702] = 0x86C8, [15703] = 0x86B9, [15704] = 0x86B3, ++ [15705] = 0x86B8, [15706] = 0x86CC, [15707] = 0x86B4, [15708] = 0x86BB, ++ [15709] = 0x86BC, [15710] = 0x86C3, [15711] = 0x86BD, [15712] = 0x86BE, ++ [15713] = 0x8852, [15714] = 0x8889, [15715] = 0x8895, [15716] = 0x88A8, ++ [15717] = 0x88A2, [15718] = 0x88AA, [15719] = 0x889A, [15720] = 0x8891, ++ [15721] = 0x88A1, [15722] = 0x889F, [15723] = 0x8898, [15724] = 0x88A7, ++ [15725] = 0x8899, [15726] = 0x889B, [15727] = 0x8897, [15728] = 0x88A4, ++ [15729] = 0x88AC, [15730] = 0x888C, [15731] = 0x8893, [15732] = 0x888E, ++ [15733] = 0x8982, [15734] = 0x89D6, [15735] = 0x89D9, [15736] = 0x89D5, ++ [15737] = 0x8A30, [15738] = 0x8A27, [15739] = 0x8A2C, [15740] = 0x8A1E, ++ [15741] = 0x8C39, [15742] = 0x8C3B, [15743] = 0x8C5C, [15744] = 0x8C5D, ++ [15745] = 0x8C7D, [15746] = 0x8CA5, [15747] = 0x8D7D, [15748] = 0x8D7B, ++ [15749] = 0x8D79, [15750] = 0x8DBC, [15751] = 0x8DC2, [15752] = 0x8DB9, ++ [15753] = 0x8DBF, [15754] = 0x8DC1, [15755] = 0x8ED8, [15756] = 0x8EDE, ++ [15757] = 0x8EDD, [15758] = 0x8EDC, [15759] = 0x8ED7, [15760] = 0x8EE0, ++ [15761] = 0x8EE1, [15762] = 0x9024, [15763] = 0x900B, [15764] = 0x9011, ++ [15765] = 0x901C, [15766] = 0x900C, [15767] = 0x9021, [15768] = 0x90EF, ++ [15769] = 0x90EA, [15770] = 0x90F0, [15771] = 0x90F4, [15772] = 0x90F2, ++ [15773] = 0x90F3, [15774] = 0x90D4, [15775] = 0x90EB, [15776] = 0x90EC, ++ [15777] = 0x90E9, [15778] = 0x9156, [15779] = 0x9158, [15780] = 0x915A, ++ [15781] = 0x9153, [15782] = 0x9155, [15783] = 0x91EC, [15784] = 0x91F4, ++ [15785] = 0x91F1, [15786] = 0x91F3, [15787] = 0x91F8, [15788] = 0x91E4, ++ [15789] = 0x91F9, [15790] = 0x91EA, [15795] = 0x91EB, [15796] = 0x91F7, ++ [15797] = 0x91E8, [15798] = 0x91EE, [15799] = 0x957A, [15800] = 0x9586, ++ [15801] = 0x9588, [15802] = 0x967C, [15803] = 0x966D, [15804] = 0x966B, ++ [15805] = 0x9671, [15806] = 0x966F, [15807] = 0x96BF, [15808] = 0x976A, ++ [15809] = 0x9804, [15810] = 0x98E5, [15811] = 0x9997, [15812] = 0x509B, ++ [15813] = 0x5095, [15814] = 0x5094, [15815] = 0x509E, [15816] = 0x508B, ++ [15817] = 0x50A3, [15818] = 0x5083, [15819] = 0x508C, [15820] = 0x508E, ++ [15821] = 0x509D, [15822] = 0x5068, [15823] = 0x509C, [15824] = 0x5092, ++ [15825] = 0x5082, [15826] = 0x5087, [15827] = 0x515F, [15828] = 0x51D4, ++ [15829] = 0x5312, [15830] = 0x5311, [15831] = 0x53A4, [15832] = 0x53A7, ++ [15833] = 0x5591, [15834] = 0x55A8, [15835] = 0x55A5, [15836] = 0x55AD, ++ [15837] = 0x5577, [15838] = 0x5645, [15839] = 0x55A2, [15840] = 0x5593, ++ [15841] = 0x5588, [15842] = 0x558F, [15843] = 0x55B5, [15844] = 0x5581, ++ [15845] = 0x55A3, [15846] = 0x5592, [15847] = 0x55A4, [15848] = 0x557D, ++ [15849] = 0x558C, [15850] = 0x55A6, [15851] = 0x557F, [15852] = 0x5595, ++ [15853] = 0x55A1, [15854] = 0x558E, [15855] = 0x570C, [15856] = 0x5829, ++ [15857] = 0x5837, [15892] = 0x5819, [15893] = 0x581E, [15894] = 0x5827, ++ [15895] = 0x5823, [15896] = 0x5828, [15897] = 0x57F5, [15898] = 0x5848, ++ [15899] = 0x5825, [15900] = 0x581C, [15901] = 0x581B, [15902] = 0x5833, ++ [15903] = 0x583F, [15904] = 0x5836, [15905] = 0x582E, [15906] = 0x5839, ++ [15907] = 0x5838, [15908] = 0x582D, [15909] = 0x582C, [15910] = 0x583B, ++ [15911] = 0x5961, [15912] = 0x5AAF, [15913] = 0x5A94, [15914] = 0x5A9F, ++ [15915] = 0x5A7A, [15916] = 0x5AA2, [15917] = 0x5A9E, [15918] = 0x5A78, ++ [15919] = 0x5AA6, [15920] = 0x5A7C, [15921] = 0x5AA5, [15922] = 0x5AAC, ++ [15923] = 0x5A95, [15924] = 0x5AAE, [15925] = 0x5A37, [15926] = 0x5A84, ++ [15927] = 0x5A8A, [15928] = 0x5A97, [15929] = 0x5A83, [15930] = 0x5A8B, ++ [15931] = 0x5AA9, [15932] = 0x5A7B, [15933] = 0x5A7D, [15934] = 0x5A8C, ++ [15935] = 0x5A9C, [15936] = 0x5A8F, [15937] = 0x5A93, [15938] = 0x5A9D, ++ [15939] = 0x5BEA, [15940] = 0x5BCD, [15941] = 0x5BCB, [15942] = 0x5BD4, ++ [15943] = 0x5BD1, [15944] = 0x5BCA, [15945] = 0x5BCE, [15946] = 0x5C0C, ++ [15947] = 0x5C30, [15948] = 0x5D37, [15949] = 0x5D43, [15950] = 0x5D6B, ++ [15951] = 0x5D41, [15952] = 0x5D4B, [15953] = 0x5D3F, [15954] = 0x5D35, ++ [15955] = 0x5D51, [15956] = 0x5D4E, [15957] = 0x5D55, [15958] = 0x5D33, ++ [15959] = 0x5D3A, [15960] = 0x5D52, [15961] = 0x5D3D, [15962] = 0x5D31, ++ [15963] = 0x5D59, [15964] = 0x5D42, [15965] = 0x5D39, [15966] = 0x5D49, ++ [15967] = 0x5D38, [15968] = 0x5D3C, [15969] = 0x5D32, [15970] = 0x5D36, ++ [15971] = 0x5D40, [15972] = 0x5D45, [15973] = 0x5E44, [15974] = 0x5E41, ++ [15975] = 0x5F58, [15976] = 0x5FA6, [15977] = 0x5FA5, [15978] = 0x5FAB, ++ [15979] = 0x60C9, [15980] = 0x60B9, [15981] = 0x60CC, [15982] = 0x60E2, ++ [15983] = 0x60CE, [15984] = 0x60C4, [15985] = 0x6114, [15990] = 0x60F2, ++ [15991] = 0x610A, [15992] = 0x6116, [15993] = 0x6105, [15994] = 0x60F5, ++ [15995] = 0x6113, [15996] = 0x60F8, [15997] = 0x60FC, [15998] = 0x60FE, ++ [15999] = 0x60C1, [16000] = 0x6103, [16001] = 0x6118, [16002] = 0x611D, ++ [16003] = 0x6110, [16004] = 0x60FF, [16005] = 0x6104, [16006] = 0x610B, ++ [16007] = 0x624A, [16008] = 0x6394, [16009] = 0x63B1, [16010] = 0x63B0, ++ [16011] = 0x63CE, [16012] = 0x63E5, [16013] = 0x63E8, [16014] = 0x63EF, ++ [16015] = 0x63C3, [16016] = 0x649D, [16017] = 0x63F3, [16018] = 0x63CA, ++ [16019] = 0x63E0, [16020] = 0x63F6, [16021] = 0x63D5, [16022] = 0x63F2, ++ [16023] = 0x63F5, [16024] = 0x6461, [16025] = 0x63DF, [16026] = 0x63BE, ++ [16027] = 0x63DD, [16028] = 0x63DC, [16029] = 0x63C4, [16030] = 0x63D8, ++ [16031] = 0x63D3, [16032] = 0x63C2, [16033] = 0x63C7, [16034] = 0x63CC, ++ [16035] = 0x63CB, [16036] = 0x63C8, [16037] = 0x63F0, [16038] = 0x63D7, ++ [16039] = 0x63D9, [16040] = 0x6532, [16041] = 0x6567, [16042] = 0x656A, ++ [16043] = 0x6564, [16044] = 0x655C, [16045] = 0x6568, [16046] = 0x6565, ++ [16047] = 0x658C, [16048] = 0x659D, [16049] = 0x659E, [16050] = 0x65AE, ++ [16051] = 0x65D0, [16052] = 0x65D2, [16087] = 0x667C, [16088] = 0x666C, ++ [16089] = 0x667B, [16090] = 0x6680, [16091] = 0x6671, [16092] = 0x6679, ++ [16093] = 0x666A, [16094] = 0x6672, [16095] = 0x6701, [16096] = 0x690C, ++ [16097] = 0x68D3, [16098] = 0x6904, [16099] = 0x68DC, [16100] = 0x692A, ++ [16101] = 0x68EC, [16102] = 0x68EA, [16103] = 0x68F1, [16104] = 0x690F, ++ [16105] = 0x68D6, [16106] = 0x68F7, [16107] = 0x68EB, [16108] = 0x68E4, ++ [16109] = 0x68F6, [16110] = 0x6913, [16111] = 0x6910, [16112] = 0x68F3, ++ [16113] = 0x68E1, [16114] = 0x6907, [16115] = 0x68CC, [16116] = 0x6908, ++ [16117] = 0x6970, [16118] = 0x68B4, [16119] = 0x6911, [16120] = 0x68EF, ++ [16121] = 0x68C6, [16122] = 0x6914, [16123] = 0x68F8, [16124] = 0x68D0, ++ [16125] = 0x68FD, [16126] = 0x68FC, [16127] = 0x68E8, [16128] = 0x690B, ++ [16129] = 0x690A, [16130] = 0x6917, [16131] = 0x68CE, [16132] = 0x68C8, ++ [16133] = 0x68DD, [16134] = 0x68DE, [16135] = 0x68E6, [16136] = 0x68F4, ++ [16137] = 0x68D1, [16138] = 0x6906, [16139] = 0x68D4, [16140] = 0x68E9, ++ [16141] = 0x6915, [16142] = 0x6925, [16143] = 0x68C7, [16144] = 0x6B39, ++ [16145] = 0x6B3B, [16146] = 0x6B3F, [16147] = 0x6B3C, [16148] = 0x6B94, ++ [16149] = 0x6B97, [16150] = 0x6B99, [16151] = 0x6B95, [16152] = 0x6BBD, ++ [16153] = 0x6BF0, [16154] = 0x6BF2, [16155] = 0x6BF3, [16156] = 0x6C30, ++ [16157] = 0x6DFC, [16158] = 0x6E46, [16159] = 0x6E47, [16160] = 0x6E1F, ++ [16161] = 0x6E49, [16162] = 0x6E88, [16163] = 0x6E3C, [16164] = 0x6E3D, ++ [16165] = 0x6E45, [16166] = 0x6E62, [16167] = 0x6E2B, [16168] = 0x6E3F, ++ [16169] = 0x6E41, [16170] = 0x6E5D, [16171] = 0x6E73, [16172] = 0x6E1C, ++ [16173] = 0x6E33, [16174] = 0x6E4B, [16175] = 0x6E40, [16176] = 0x6E51, ++ [16177] = 0x6E3B, [16178] = 0x6E03, [16179] = 0x6E2E, [16180] = 0x6E5E, ++ [16185] = 0x6E68, [16186] = 0x6E5C, [16187] = 0x6E61, [16188] = 0x6E31, ++ [16189] = 0x6E28, [16190] = 0x6E60, [16191] = 0x6E71, [16192] = 0x6E6B, ++ [16193] = 0x6E39, [16194] = 0x6E22, [16195] = 0x6E30, [16196] = 0x6E53, ++ [16197] = 0x6E65, [16198] = 0x6E27, [16199] = 0x6E78, [16200] = 0x6E64, ++ [16201] = 0x6E77, [16202] = 0x6E55, [16203] = 0x6E79, [16204] = 0x6E52, ++ [16205] = 0x6E66, [16206] = 0x6E35, [16207] = 0x6E36, [16208] = 0x6E5A, ++ [16209] = 0x7120, [16210] = 0x711E, [16211] = 0x712F, [16212] = 0x70FB, ++ [16213] = 0x712E, [16214] = 0x7131, [16215] = 0x7123, [16216] = 0x7125, ++ [16217] = 0x7122, [16218] = 0x7132, [16219] = 0x711F, [16220] = 0x7128, ++ [16221] = 0x713A, [16222] = 0x711B, [16223] = 0x724B, [16224] = 0x725A, ++ [16225] = 0x7288, [16226] = 0x7289, [16227] = 0x7286, [16228] = 0x7285, ++ [16229] = 0x728B, [16230] = 0x7312, [16231] = 0x730B, [16232] = 0x7330, ++ [16233] = 0x7322, [16234] = 0x7331, [16235] = 0x7333, [16236] = 0x7327, ++ [16237] = 0x7332, [16238] = 0x732D, [16239] = 0x7326, [16240] = 0x7323, ++ [16241] = 0x7335, [16242] = 0x730C, [16243] = 0x742E, [16244] = 0x742C, ++ [16245] = 0x7430, [16246] = 0x742B, [16247] = 0x7416, [16282] = 0x741A, ++ [16283] = 0x7421, [16284] = 0x742D, [16285] = 0x7431, [16286] = 0x7424, ++ [16287] = 0x7423, [16288] = 0x741D, [16289] = 0x7429, [16290] = 0x7420, ++ [16291] = 0x7432, [16292] = 0x74FB, [16293] = 0x752F, [16294] = 0x756F, ++ [16295] = 0x756C, [16296] = 0x75E7, [16297] = 0x75DA, [16298] = 0x75E1, ++ [16299] = 0x75E6, [16300] = 0x75DD, [16301] = 0x75DF, [16302] = 0x75E4, ++ [16303] = 0x75D7, [16304] = 0x7695, [16305] = 0x7692, [16306] = 0x76DA, ++ [16307] = 0x7746, [16308] = 0x7747, [16309] = 0x7744, [16310] = 0x774D, ++ [16311] = 0x7745, [16312] = 0x774A, [16313] = 0x774E, [16314] = 0x774B, ++ [16315] = 0x774C, [16316] = 0x77DE, [16317] = 0x77EC, [16318] = 0x7860, ++ [16319] = 0x7864, [16320] = 0x7865, [16321] = 0x785C, [16322] = 0x786D, ++ [16323] = 0x7871, [16324] = 0x786A, [16325] = 0x786E, [16326] = 0x7870, ++ [16327] = 0x7869, [16328] = 0x7868, [16329] = 0x785E, [16330] = 0x7862, ++ [16331] = 0x7974, [16332] = 0x7973, [16333] = 0x7972, [16334] = 0x7970, ++ [16335] = 0x7A02, [16336] = 0x7A0A, [16337] = 0x7A03, [16338] = 0x7A0C, ++ [16339] = 0x7A04, [16340] = 0x7A99, [16341] = 0x7AE6, [16342] = 0x7AE4, ++ [16343] = 0x7B4A, [16344] = 0x7B3B, [16345] = 0x7B44, [16346] = 0x7B48, ++ [16347] = 0x7B4C, [16348] = 0x7B4E, [16349] = 0x7B40, [16350] = 0x7B58, ++ [16351] = 0x7B45, [16352] = 0x7CA2, [16353] = 0x7C9E, [16354] = 0x7CA8, ++ [16355] = 0x7CA1, [16356] = 0x7D58, [16357] = 0x7D6F, [16358] = 0x7D63, ++ [16359] = 0x7D53, [16360] = 0x7D56, [16361] = 0x7D67, [16362] = 0x7D6A, ++ [16363] = 0x7D4F, [16364] = 0x7D6D, [16365] = 0x7D5C, [16366] = 0x7D6B, ++ [16367] = 0x7D52, [16368] = 0x7D54, [16369] = 0x7D69, [16370] = 0x7D51, ++ [16371] = 0x7D5F, [16372] = 0x7D4E, [16373] = 0x7F3E, [16374] = 0x7F3F, ++ [16375] = 0x7F65, [16380] = 0x7F66, [16381] = 0x7FA2, [16382] = 0x7FA0, ++ [16383] = 0x7FA1, [16384] = 0x7FD7, [16385] = 0x8051, [16386] = 0x804F, ++ [16387] = 0x8050, [16388] = 0x80FE, [16389] = 0x80D4, [16390] = 0x8143, ++ [16391] = 0x814A, [16392] = 0x8152, [16393] = 0x814F, [16394] = 0x8147, ++ [16395] = 0x813D, [16396] = 0x814D, [16397] = 0x813A, [16398] = 0x81E6, ++ [16399] = 0x81EE, [16400] = 0x81F7, [16401] = 0x81F8, [16402] = 0x81F9, ++ [16403] = 0x8204, [16404] = 0x823C, [16405] = 0x823D, [16406] = 0x823F, ++ [16407] = 0x8275, [16408] = 0x833B, [16409] = 0x83CF, [16410] = 0x83F9, ++ [16411] = 0x8423, [16412] = 0x83C0, [16413] = 0x83E8, [16414] = 0x8412, ++ [16415] = 0x83E7, [16416] = 0x83E4, [16417] = 0x83FC, [16418] = 0x83F6, ++ [16419] = 0x8410, [16420] = 0x83C6, [16421] = 0x83C8, [16422] = 0x83EB, ++ [16423] = 0x83E3, [16424] = 0x83BF, [16425] = 0x8401, [16426] = 0x83DD, ++ [16427] = 0x83E5, [16428] = 0x83D8, [16429] = 0x83FF, [16430] = 0x83E1, ++ [16431] = 0x83CB, [16432] = 0x83CE, [16433] = 0x83D6, [16434] = 0x83F5, ++ [16435] = 0x83C9, [16436] = 0x8409, [16437] = 0x840F, [16438] = 0x83DE, ++ [16439] = 0x8411, [16440] = 0x8406, [16441] = 0x83C2, [16442] = 0x83F3, ++ [16477] = 0x83D5, [16478] = 0x83FA, [16479] = 0x83C7, [16480] = 0x83D1, ++ [16481] = 0x83EA, [16482] = 0x8413, [16483] = 0x83C3, [16484] = 0x83EC, ++ [16485] = 0x83EE, [16486] = 0x83C4, [16487] = 0x83FB, [16488] = 0x83D7, ++ [16489] = 0x83E2, [16490] = 0x841B, [16491] = 0x83DB, [16492] = 0x83FE, ++ [16493] = 0x86D8, [16494] = 0x86E2, [16495] = 0x86E6, [16496] = 0x86D3, ++ [16497] = 0x86E3, [16498] = 0x86DA, [16499] = 0x86EA, [16500] = 0x86DD, ++ [16501] = 0x86EB, [16502] = 0x86DC, [16503] = 0x86EC, [16504] = 0x86E9, ++ [16505] = 0x86D7, [16506] = 0x86E8, [16507] = 0x86D1, [16508] = 0x8848, ++ [16509] = 0x8856, [16510] = 0x8855, [16511] = 0x88BA, [16512] = 0x88D7, ++ [16513] = 0x88B9, [16514] = 0x88B8, [16515] = 0x88C0, [16516] = 0x88BE, ++ [16517] = 0x88B6, [16518] = 0x88BC, [16519] = 0x88B7, [16520] = 0x88BD, ++ [16521] = 0x88B2, [16522] = 0x8901, [16523] = 0x88C9, [16524] = 0x8995, ++ [16525] = 0x8998, [16526] = 0x8997, [16527] = 0x89DD, [16528] = 0x89DA, ++ [16529] = 0x89DB, [16530] = 0x8A4E, [16531] = 0x8A4D, [16532] = 0x8A39, ++ [16533] = 0x8A59, [16534] = 0x8A40, [16535] = 0x8A57, [16536] = 0x8A58, ++ [16537] = 0x8A44, [16538] = 0x8A45, [16539] = 0x8A52, [16540] = 0x8A48, ++ [16541] = 0x8A51, [16542] = 0x8A4A, [16543] = 0x8A4C, [16544] = 0x8A4F, ++ [16545] = 0x8C5F, [16546] = 0x8C81, [16547] = 0x8C80, [16548] = 0x8CBA, ++ [16549] = 0x8CBE, [16550] = 0x8CB0, [16551] = 0x8CB9, [16552] = 0x8CB5, ++ [16553] = 0x8D84, [16554] = 0x8D80, [16555] = 0x8D89, [16556] = 0x8DD8, ++ [16557] = 0x8DD3, [16558] = 0x8DCD, [16559] = 0x8DC7, [16560] = 0x8DD6, ++ [16561] = 0x8DDC, [16562] = 0x8DCF, [16563] = 0x8DD5, [16564] = 0x8DD9, ++ [16565] = 0x8DC8, [16566] = 0x8DD7, [16567] = 0x8DC5, [16568] = 0x8EEF, ++ [16569] = 0x8EF7, [16570] = 0x8EFA, [16575] = 0x8EF9, [16576] = 0x8EE6, ++ [16577] = 0x8EEE, [16578] = 0x8EE5, [16579] = 0x8EF5, [16580] = 0x8EE7, ++ [16581] = 0x8EE8, [16582] = 0x8EF6, [16583] = 0x8EEB, [16584] = 0x8EF1, ++ [16585] = 0x8EEC, [16586] = 0x8EF4, [16587] = 0x8EE9, [16588] = 0x902D, ++ [16589] = 0x9034, [16590] = 0x902F, [16591] = 0x9106, [16592] = 0x912C, ++ [16593] = 0x9104, [16594] = 0x90FF, [16595] = 0x90FC, [16596] = 0x9108, ++ [16597] = 0x90F9, [16598] = 0x90FB, [16599] = 0x9101, [16600] = 0x9100, ++ [16601] = 0x9107, [16602] = 0x9105, [16603] = 0x9103, [16604] = 0x9161, ++ [16605] = 0x9164, [16606] = 0x915F, [16607] = 0x9162, [16608] = 0x9160, ++ [16609] = 0x9201, [16610] = 0x920A, [16611] = 0x9225, [16612] = 0x9203, ++ [16613] = 0x921A, [16614] = 0x9226, [16615] = 0x920F, [16616] = 0x920C, ++ [16617] = 0x9200, [16618] = 0x9212, [16619] = 0x91FF, [16620] = 0x91FD, ++ [16621] = 0x9206, [16622] = 0x9204, [16623] = 0x9227, [16624] = 0x9202, ++ [16625] = 0x921C, [16626] = 0x9224, [16627] = 0x9219, [16628] = 0x9217, ++ [16629] = 0x9205, [16630] = 0x9216, [16631] = 0x957B, [16632] = 0x958D, ++ [16633] = 0x958C, [16634] = 0x9590, [16635] = 0x9687, [16636] = 0x967E, ++ [16637] = 0x9688, [16672] = 0x9689, [16673] = 0x9683, [16674] = 0x9680, ++ [16675] = 0x96C2, [16676] = 0x96C8, [16677] = 0x96C3, [16678] = 0x96F1, ++ [16679] = 0x96F0, [16680] = 0x976C, [16681] = 0x9770, [16682] = 0x976E, ++ [16683] = 0x9807, [16684] = 0x98A9, [16685] = 0x98EB, [16686] = 0x9CE6, ++ [16687] = 0x9EF9, [16688] = 0x4E83, [16689] = 0x4E84, [16690] = 0x4EB6, ++ [16691] = 0x50BD, [16692] = 0x50BF, [16693] = 0x50C6, [16694] = 0x50AE, ++ [16695] = 0x50C4, [16696] = 0x50CA, [16697] = 0x50B4, [16698] = 0x50C8, ++ [16699] = 0x50C2, [16700] = 0x50B0, [16701] = 0x50C1, [16702] = 0x50BA, ++ [16703] = 0x50B1, [16704] = 0x50CB, [16705] = 0x50C9, [16706] = 0x50B6, ++ [16707] = 0x50B8, [16708] = 0x51D7, [16709] = 0x527A, [16710] = 0x5278, ++ [16711] = 0x527B, [16712] = 0x527C, [16713] = 0x55C3, [16714] = 0x55DB, ++ [16715] = 0x55CC, [16716] = 0x55D0, [16717] = 0x55CB, [16718] = 0x55CA, ++ [16719] = 0x55DD, [16720] = 0x55C0, [16721] = 0x55D4, [16722] = 0x55C4, ++ [16723] = 0x55E9, [16724] = 0x55BF, [16725] = 0x55D2, [16726] = 0x558D, ++ [16727] = 0x55CF, [16728] = 0x55D5, [16729] = 0x55E2, [16730] = 0x55D6, ++ [16731] = 0x55C8, [16732] = 0x55F2, [16733] = 0x55CD, [16734] = 0x55D9, ++ [16735] = 0x55C2, [16736] = 0x5714, [16737] = 0x5853, [16738] = 0x5868, ++ [16739] = 0x5864, [16740] = 0x584F, [16741] = 0x584D, [16742] = 0x5849, ++ [16743] = 0x586F, [16744] = 0x5855, [16745] = 0x584E, [16746] = 0x585D, ++ [16747] = 0x5859, [16748] = 0x5865, [16749] = 0x585B, [16750] = 0x583D, ++ [16751] = 0x5863, [16752] = 0x5871, [16753] = 0x58FC, [16754] = 0x5AC7, ++ [16755] = 0x5AC4, [16756] = 0x5ACB, [16757] = 0x5ABA, [16758] = 0x5AB8, ++ [16759] = 0x5AB1, [16760] = 0x5AB5, [16761] = 0x5AB0, [16762] = 0x5ABF, ++ [16763] = 0x5AC8, [16764] = 0x5ABB, [16765] = 0x5AC6, [16770] = 0x5AB7, ++ [16771] = 0x5AC0, [16772] = 0x5ACA, [16773] = 0x5AB4, [16774] = 0x5AB6, ++ [16775] = 0x5ACD, [16776] = 0x5AB9, [16777] = 0x5A90, [16778] = 0x5BD6, ++ [16779] = 0x5BD8, [16780] = 0x5BD9, [16781] = 0x5C1F, [16782] = 0x5C33, ++ [16783] = 0x5D71, [16784] = 0x5D63, [16785] = 0x5D4A, [16786] = 0x5D65, ++ [16787] = 0x5D72, [16788] = 0x5D6C, [16789] = 0x5D5E, [16790] = 0x5D68, ++ [16791] = 0x5D67, [16792] = 0x5D62, [16793] = 0x5DF0, [16794] = 0x5E4F, ++ [16795] = 0x5E4E, [16796] = 0x5E4A, [16797] = 0x5E4D, [16798] = 0x5E4B, ++ [16799] = 0x5EC5, [16800] = 0x5ECC, [16801] = 0x5EC6, [16802] = 0x5ECB, ++ [16803] = 0x5EC7, [16804] = 0x5F40, [16805] = 0x5FAF, [16806] = 0x5FAD, ++ [16807] = 0x60F7, [16808] = 0x6149, [16809] = 0x614A, [16810] = 0x612B, ++ [16811] = 0x6145, [16812] = 0x6136, [16813] = 0x6132, [16814] = 0x612E, ++ [16815] = 0x6146, [16816] = 0x612F, [16817] = 0x614F, [16818] = 0x6129, ++ [16819] = 0x6140, [16820] = 0x6220, [16821] = 0x9168, [16822] = 0x6223, ++ [16823] = 0x6225, [16824] = 0x6224, [16825] = 0x63C5, [16826] = 0x63F1, ++ [16827] = 0x63EB, [16828] = 0x6410, [16829] = 0x6412, [16830] = 0x6409, ++ [16831] = 0x6420, [16832] = 0x6424, [16867] = 0x6433, [16868] = 0x6443, ++ [16869] = 0x641F, [16870] = 0x6415, [16871] = 0x6418, [16872] = 0x6439, ++ [16873] = 0x6437, [16874] = 0x6422, [16875] = 0x6423, [16876] = 0x640C, ++ [16877] = 0x6426, [16878] = 0x6430, [16879] = 0x6428, [16880] = 0x6441, ++ [16881] = 0x6435, [16882] = 0x642F, [16883] = 0x640A, [16884] = 0x641A, ++ [16885] = 0x6440, [16886] = 0x6425, [16887] = 0x6427, [16888] = 0x640B, ++ [16889] = 0x63E7, [16890] = 0x641B, [16891] = 0x642E, [16892] = 0x6421, ++ [16893] = 0x640E, [16894] = 0x656F, [16895] = 0x6592, [16896] = 0x65D3, ++ [16897] = 0x6686, [16898] = 0x668C, [16899] = 0x6695, [16900] = 0x6690, ++ [16901] = 0x668B, [16902] = 0x668A, [16903] = 0x6699, [16904] = 0x6694, ++ [16905] = 0x6678, [16906] = 0x6720, [16907] = 0x6966, [16908] = 0x695F, ++ [16909] = 0x6938, [16910] = 0x694E, [16911] = 0x6962, [16912] = 0x6971, ++ [16913] = 0x693F, [16914] = 0x6945, [16915] = 0x696A, [16916] = 0x6939, ++ [16917] = 0x6942, [16918] = 0x6957, [16919] = 0x6959, [16920] = 0x697A, ++ [16921] = 0x6948, [16922] = 0x6949, [16923] = 0x6935, [16924] = 0x696C, ++ [16925] = 0x6933, [16926] = 0x693D, [16927] = 0x6965, [16928] = 0x68F0, ++ [16929] = 0x6978, [16930] = 0x6934, [16931] = 0x6969, [16932] = 0x6940, ++ [16933] = 0x696F, [16934] = 0x6944, [16935] = 0x6976, [16936] = 0x6958, ++ [16937] = 0x6941, [16938] = 0x6974, [16939] = 0x694C, [16940] = 0x693B, ++ [16941] = 0x694B, [16942] = 0x6937, [16943] = 0x695C, [16944] = 0x694F, ++ [16945] = 0x6951, [16946] = 0x6932, [16947] = 0x6952, [16948] = 0x692F, ++ [16949] = 0x697B, [16950] = 0x693C, [16951] = 0x6B46, [16952] = 0x6B45, ++ [16953] = 0x6B43, [16954] = 0x6B42, [16955] = 0x6B48, [16956] = 0x6B41, ++ [16957] = 0x6B9B, [16958] = 0xFA0D, [16959] = 0x6BFB, [16960] = 0x6BFC, ++ [16965] = 0x6BF9, [16966] = 0x6BF7, [16967] = 0x6BF8, [16968] = 0x6E9B, ++ [16969] = 0x6ED6, [16970] = 0x6EC8, [16971] = 0x6E8F, [16972] = 0x6EC0, ++ [16973] = 0x6E9F, [16974] = 0x6E93, [16975] = 0x6E94, [16976] = 0x6EA0, ++ [16977] = 0x6EB1, [16978] = 0x6EB9, [16979] = 0x6EC6, [16980] = 0x6ED2, ++ [16981] = 0x6EBD, [16982] = 0x6EC1, [16983] = 0x6E9E, [16984] = 0x6EC9, ++ [16985] = 0x6EB7, [16986] = 0x6EB0, [16987] = 0x6ECD, [16988] = 0x6EA6, ++ [16989] = 0x6ECF, [16990] = 0x6EB2, [16991] = 0x6EBE, [16992] = 0x6EC3, ++ [16993] = 0x6EDC, [16994] = 0x6ED8, [16995] = 0x6E99, [16996] = 0x6E92, ++ [16997] = 0x6E8E, [16998] = 0x6E8D, [16999] = 0x6EA4, [17000] = 0x6EA1, ++ [17001] = 0x6EBF, [17002] = 0x6EB3, [17003] = 0x6ED0, [17004] = 0x6ECA, ++ [17005] = 0x6E97, [17006] = 0x6EAE, [17007] = 0x6EA3, [17008] = 0x7147, ++ [17009] = 0x7154, [17010] = 0x7152, [17011] = 0x7163, [17012] = 0x7160, ++ [17013] = 0x7141, [17014] = 0x715D, [17015] = 0x7162, [17016] = 0x7172, ++ [17017] = 0x7178, [17018] = 0x716A, [17019] = 0x7161, [17020] = 0x7142, ++ [17021] = 0x7158, [17022] = 0x7143, [17023] = 0x714B, [17024] = 0x7170, ++ [17025] = 0x715F, [17026] = 0x7150, [17027] = 0x7153, [17062] = 0x7144, ++ [17063] = 0x714D, [17064] = 0x715A, [17065] = 0x724F, [17066] = 0x728D, ++ [17067] = 0x728C, [17068] = 0x7291, [17069] = 0x7290, [17070] = 0x728E, ++ [17071] = 0x733C, [17072] = 0x7342, [17073] = 0x733B, [17074] = 0x733A, ++ [17075] = 0x7340, [17076] = 0x734A, [17077] = 0x7349, [17078] = 0x7444, ++ [17079] = 0x744A, [17080] = 0x744B, [17081] = 0x7452, [17082] = 0x7451, ++ [17083] = 0x7457, [17084] = 0x7440, [17085] = 0x744F, [17086] = 0x7450, ++ [17087] = 0x744E, [17088] = 0x7442, [17089] = 0x7446, [17090] = 0x744D, ++ [17091] = 0x7454, [17092] = 0x74E1, [17093] = 0x74FF, [17094] = 0x74FE, ++ [17095] = 0x74FD, [17096] = 0x751D, [17097] = 0x7579, [17098] = 0x7577, ++ [17099] = 0x6983, [17100] = 0x75EF, [17101] = 0x760F, [17102] = 0x7603, ++ [17103] = 0x75F7, [17104] = 0x75FE, [17105] = 0x75FC, [17106] = 0x75F9, ++ [17107] = 0x75F8, [17108] = 0x7610, [17109] = 0x75FB, [17110] = 0x75F6, ++ [17111] = 0x75ED, [17112] = 0x75F5, [17113] = 0x75FD, [17114] = 0x7699, ++ [17115] = 0x76B5, [17116] = 0x76DD, [17117] = 0x7755, [17118] = 0x775F, ++ [17119] = 0x7760, [17120] = 0x7752, [17121] = 0x7756, [17122] = 0x775A, ++ [17123] = 0x7769, [17124] = 0x7767, [17125] = 0x7754, [17126] = 0x7759, ++ [17127] = 0x776D, [17128] = 0x77E0, [17129] = 0x7887, [17130] = 0x789A, ++ [17131] = 0x7894, [17132] = 0x788F, [17133] = 0x7884, [17134] = 0x7895, ++ [17135] = 0x7885, [17136] = 0x7886, [17137] = 0x78A1, [17138] = 0x7883, ++ [17139] = 0x7879, [17140] = 0x7899, [17141] = 0x7880, [17142] = 0x7896, ++ [17143] = 0x787B, [17144] = 0x797C, [17145] = 0x7982, [17146] = 0x797D, ++ [17147] = 0x7979, [17148] = 0x7A11, [17149] = 0x7A18, [17150] = 0x7A19, ++ [17151] = 0x7A12, [17152] = 0x7A17, [17153] = 0x7A15, [17154] = 0x7A22, ++ [17155] = 0x7A13, [17160] = 0x7A1B, [17161] = 0x7A10, [17162] = 0x7AA3, ++ [17163] = 0x7AA2, [17164] = 0x7A9E, [17165] = 0x7AEB, [17166] = 0x7B66, ++ [17167] = 0x7B64, [17168] = 0x7B6D, [17169] = 0x7B74, [17170] = 0x7B69, ++ [17171] = 0x7B72, [17172] = 0x7B65, [17173] = 0x7B73, [17174] = 0x7B71, ++ [17175] = 0x7B70, [17176] = 0x7B61, [17177] = 0x7B78, [17178] = 0x7B76, ++ [17179] = 0x7B63, [17180] = 0x7CB2, [17181] = 0x7CB4, [17182] = 0x7CAF, ++ [17183] = 0x7D88, [17184] = 0x7D86, [17185] = 0x7D80, [17186] = 0x7D8D, ++ [17187] = 0x7D7F, [17188] = 0x7D85, [17189] = 0x7D7A, [17190] = 0x7D8E, ++ [17191] = 0x7D7B, [17192] = 0x7D83, [17193] = 0x7D7C, [17194] = 0x7D8C, ++ [17195] = 0x7D94, [17196] = 0x7D84, [17197] = 0x7D7D, [17198] = 0x7D92, ++ [17199] = 0x7F6D, [17200] = 0x7F6B, [17201] = 0x7F67, [17202] = 0x7F68, ++ [17203] = 0x7F6C, [17204] = 0x7FA6, [17205] = 0x7FA5, [17206] = 0x7FA7, ++ [17207] = 0x7FDB, [17208] = 0x7FDC, [17209] = 0x8021, [17210] = 0x8164, ++ [17211] = 0x8160, [17212] = 0x8177, [17213] = 0x815C, [17214] = 0x8169, ++ [17215] = 0x815B, [17216] = 0x8162, [17217] = 0x8172, [17218] = 0x6721, ++ [17219] = 0x815E, [17220] = 0x8176, [17221] = 0x8167, [17222] = 0x816F, ++ [17257] = 0x8144, [17258] = 0x8161, [17259] = 0x821D, [17260] = 0x8249, ++ [17261] = 0x8244, [17262] = 0x8240, [17263] = 0x8242, [17264] = 0x8245, ++ [17265] = 0x84F1, [17266] = 0x843F, [17267] = 0x8456, [17268] = 0x8476, ++ [17269] = 0x8479, [17270] = 0x848F, [17271] = 0x848D, [17272] = 0x8465, ++ [17273] = 0x8451, [17274] = 0x8440, [17275] = 0x8486, [17276] = 0x8467, ++ [17277] = 0x8430, [17278] = 0x844D, [17279] = 0x847D, [17280] = 0x845A, ++ [17281] = 0x8459, [17282] = 0x8474, [17283] = 0x8473, [17284] = 0x845D, ++ [17285] = 0x8507, [17286] = 0x845E, [17287] = 0x8437, [17288] = 0x843A, ++ [17289] = 0x8434, [17290] = 0x847A, [17291] = 0x8443, [17292] = 0x8478, ++ [17293] = 0x8432, [17294] = 0x8445, [17295] = 0x8429, [17296] = 0x83D9, ++ [17297] = 0x844B, [17298] = 0x842F, [17299] = 0x8442, [17300] = 0x842D, ++ [17301] = 0x845F, [17302] = 0x8470, [17303] = 0x8439, [17304] = 0x844E, ++ [17305] = 0x844C, [17306] = 0x8452, [17307] = 0x846F, [17308] = 0x84C5, ++ [17309] = 0x848E, [17310] = 0x843B, [17311] = 0x8447, [17312] = 0x8436, ++ [17313] = 0x8433, [17314] = 0x8468, [17315] = 0x847E, [17316] = 0x8444, ++ [17317] = 0x842B, [17318] = 0x8460, [17319] = 0x8454, [17320] = 0x846E, ++ [17321] = 0x8450, [17322] = 0x870B, [17323] = 0x8704, [17324] = 0x86F7, ++ [17325] = 0x870C, [17326] = 0x86FA, [17327] = 0x86D6, [17328] = 0x86F5, ++ [17329] = 0x874D, [17330] = 0x86F8, [17331] = 0x870E, [17332] = 0x8709, ++ [17333] = 0x8701, [17334] = 0x86F6, [17335] = 0x870D, [17336] = 0x8705, ++ [17337] = 0x88D6, [17338] = 0x88CB, [17339] = 0x88CD, [17340] = 0x88CE, ++ [17341] = 0x88DE, [17342] = 0x88DB, [17343] = 0x88DA, [17344] = 0x88CC, ++ [17345] = 0x88D0, [17346] = 0x8985, [17347] = 0x899B, [17348] = 0x89DF, ++ [17349] = 0x89E5, [17350] = 0x89E4, [17355] = 0x89E1, [17356] = 0x89E0, ++ [17357] = 0x89E2, [17358] = 0x89DC, [17359] = 0x89E6, [17360] = 0x8A76, ++ [17361] = 0x8A86, [17362] = 0x8A7F, [17363] = 0x8A61, [17364] = 0x8A3F, ++ [17365] = 0x8A77, [17366] = 0x8A82, [17367] = 0x8A84, [17368] = 0x8A75, ++ [17369] = 0x8A83, [17370] = 0x8A81, [17371] = 0x8A74, [17372] = 0x8A7A, ++ [17373] = 0x8C3C, [17374] = 0x8C4B, [17375] = 0x8C4A, [17376] = 0x8C65, ++ [17377] = 0x8C64, [17378] = 0x8C66, [17379] = 0x8C86, [17380] = 0x8C84, ++ [17381] = 0x8C85, [17382] = 0x8CCC, [17383] = 0x8D68, [17384] = 0x8D69, ++ [17385] = 0x8D91, [17386] = 0x8D8C, [17387] = 0x8D8E, [17388] = 0x8D8F, ++ [17389] = 0x8D8D, [17390] = 0x8D93, [17391] = 0x8D94, [17392] = 0x8D90, ++ [17393] = 0x8D92, [17394] = 0x8DF0, [17395] = 0x8DE0, [17396] = 0x8DEC, ++ [17397] = 0x8DF1, [17398] = 0x8DEE, [17399] = 0x8DD0, [17400] = 0x8DE9, ++ [17401] = 0x8DE3, [17402] = 0x8DE2, [17403] = 0x8DE7, [17404] = 0x8DF2, ++ [17405] = 0x8DEB, [17406] = 0x8DF4, [17407] = 0x8F06, [17408] = 0x8EFF, ++ [17409] = 0x8F01, [17410] = 0x8F00, [17411] = 0x8F05, [17412] = 0x8F07, ++ [17413] = 0x8F08, [17414] = 0x8F02, [17415] = 0x8F0B, [17416] = 0x9052, ++ [17417] = 0x903F, [17452] = 0x9044, [17453] = 0x9049, [17454] = 0x903D, ++ [17455] = 0x9110, [17456] = 0x910D, [17457] = 0x910F, [17458] = 0x9111, ++ [17459] = 0x9116, [17460] = 0x9114, [17461] = 0x910B, [17462] = 0x910E, ++ [17463] = 0x916E, [17464] = 0x916F, [17465] = 0x9248, [17466] = 0x9252, ++ [17467] = 0x9230, [17468] = 0x923A, [17469] = 0x9266, [17470] = 0x9233, ++ [17471] = 0x9265, [17472] = 0x925E, [17473] = 0x9283, [17474] = 0x922E, ++ [17475] = 0x924A, [17476] = 0x9246, [17477] = 0x926D, [17478] = 0x926C, ++ [17479] = 0x924F, [17480] = 0x9260, [17481] = 0x9267, [17482] = 0x926F, ++ [17483] = 0x9236, [17484] = 0x9261, [17485] = 0x9270, [17486] = 0x9231, ++ [17487] = 0x9254, [17488] = 0x9263, [17489] = 0x9250, [17490] = 0x9272, ++ [17491] = 0x924E, [17492] = 0x9253, [17493] = 0x924C, [17494] = 0x9256, ++ [17495] = 0x9232, [17496] = 0x959F, [17497] = 0x959C, [17498] = 0x959E, ++ [17499] = 0x959B, [17500] = 0x9692, [17501] = 0x9693, [17502] = 0x9691, ++ [17503] = 0x9697, [17504] = 0x96CE, [17505] = 0x96FA, [17506] = 0x96FD, ++ [17507] = 0x96F8, [17508] = 0x96F5, [17509] = 0x9773, [17510] = 0x9777, ++ [17511] = 0x9778, [17512] = 0x9772, [17513] = 0x980F, [17514] = 0x980D, ++ [17515] = 0x980E, [17516] = 0x98AC, [17517] = 0x98F6, [17518] = 0x98F9, ++ [17519] = 0x99AF, [17520] = 0x99B2, [17521] = 0x99B0, [17522] = 0x99B5, ++ [17523] = 0x9AAD, [17524] = 0x9AAB, [17525] = 0x9B5B, [17526] = 0x9CEA, ++ [17527] = 0x9CED, [17528] = 0x9CE7, [17529] = 0x9E80, [17530] = 0x9EFD, ++ [17531] = 0x50E6, [17532] = 0x50D4, [17533] = 0x50D7, [17534] = 0x50E8, ++ [17535] = 0x50F3, [17536] = 0x50DB, [17537] = 0x50EA, [17538] = 0x50DD, ++ [17539] = 0x50E4, [17540] = 0x50D3, [17541] = 0x50EC, [17542] = 0x50F0, ++ [17543] = 0x50EF, [17544] = 0x50E3, [17545] = 0x50E0, [17550] = 0x51D8, ++ [17551] = 0x5280, [17552] = 0x5281, [17553] = 0x52E9, [17554] = 0x52EB, ++ [17555] = 0x5330, [17556] = 0x53AC, [17557] = 0x5627, [17558] = 0x5615, ++ [17559] = 0x560C, [17560] = 0x5612, [17561] = 0x55FC, [17562] = 0x560F, ++ [17563] = 0x561C, [17564] = 0x5601, [17565] = 0x5613, [17566] = 0x5602, ++ [17567] = 0x55FA, [17568] = 0x561D, [17569] = 0x5604, [17570] = 0x55FF, ++ [17571] = 0x55F9, [17572] = 0x5889, [17573] = 0x587C, [17574] = 0x5890, ++ [17575] = 0x5898, [17576] = 0x5886, [17577] = 0x5881, [17578] = 0x587F, ++ [17579] = 0x5874, [17580] = 0x588B, [17581] = 0x587A, [17582] = 0x5887, ++ [17583] = 0x5891, [17584] = 0x588E, [17585] = 0x5876, [17586] = 0x5882, ++ [17587] = 0x5888, [17588] = 0x587B, [17589] = 0x5894, [17590] = 0x588F, ++ [17591] = 0x58FE, [17592] = 0x596B, [17593] = 0x5ADC, [17594] = 0x5AEE, ++ [17595] = 0x5AE5, [17596] = 0x5AD5, [17597] = 0x5AEA, [17598] = 0x5ADA, ++ [17599] = 0x5AED, [17600] = 0x5AEB, [17601] = 0x5AF3, [17602] = 0x5AE2, ++ [17603] = 0x5AE0, [17604] = 0x5ADB, [17605] = 0x5AEC, [17606] = 0x5ADE, ++ [17607] = 0x5ADD, [17608] = 0x5AD9, [17609] = 0x5AE8, [17610] = 0x5ADF, ++ [17611] = 0x5B77, [17612] = 0x5BE0, [17647] = 0x5BE3, [17648] = 0x5C63, ++ [17649] = 0x5D82, [17650] = 0x5D80, [17651] = 0x5D7D, [17652] = 0x5D86, ++ [17653] = 0x5D7A, [17654] = 0x5D81, [17655] = 0x5D77, [17656] = 0x5D8A, ++ [17657] = 0x5D89, [17658] = 0x5D88, [17659] = 0x5D7E, [17660] = 0x5D7C, ++ [17661] = 0x5D8D, [17662] = 0x5D79, [17663] = 0x5D7F, [17664] = 0x5E58, ++ [17665] = 0x5E59, [17666] = 0x5E53, [17667] = 0x5ED8, [17668] = 0x5ED1, ++ [17669] = 0x5ED7, [17670] = 0x5ECE, [17671] = 0x5EDC, [17672] = 0x5ED5, ++ [17673] = 0x5ED9, [17674] = 0x5ED2, [17675] = 0x5ED4, [17676] = 0x5F44, ++ [17677] = 0x5F43, [17678] = 0x5F6F, [17679] = 0x5FB6, [17680] = 0x612C, ++ [17681] = 0x6128, [17682] = 0x6141, [17683] = 0x615E, [17684] = 0x6171, ++ [17685] = 0x6173, [17686] = 0x6152, [17687] = 0x6153, [17688] = 0x6172, ++ [17689] = 0x616C, [17690] = 0x6180, [17691] = 0x6174, [17692] = 0x6154, ++ [17693] = 0x617A, [17694] = 0x615B, [17695] = 0x6165, [17696] = 0x613B, ++ [17697] = 0x616A, [17698] = 0x6161, [17699] = 0x6156, [17700] = 0x6229, ++ [17701] = 0x6227, [17702] = 0x622B, [17703] = 0x642B, [17704] = 0x644D, ++ [17705] = 0x645B, [17706] = 0x645D, [17707] = 0x6474, [17708] = 0x6476, ++ [17709] = 0x6472, [17710] = 0x6473, [17711] = 0x647D, [17712] = 0x6475, ++ [17713] = 0x6466, [17714] = 0x64A6, [17715] = 0x644E, [17716] = 0x6482, ++ [17717] = 0x645E, [17718] = 0x645C, [17719] = 0x644B, [17720] = 0x6453, ++ [17721] = 0x6460, [17722] = 0x6450, [17723] = 0x647F, [17724] = 0x643F, ++ [17725] = 0x646C, [17726] = 0x646B, [17727] = 0x6459, [17728] = 0x6465, ++ [17729] = 0x6477, [17730] = 0x6573, [17731] = 0x65A0, [17732] = 0x66A1, ++ [17733] = 0x66A0, [17734] = 0x669F, [17735] = 0x6705, [17736] = 0x6704, ++ [17737] = 0x6722, [17738] = 0x69B1, [17739] = 0x69B6, [17740] = 0x69C9, ++ [17745] = 0x69A0, [17746] = 0x69CE, [17747] = 0x6996, [17748] = 0x69B0, ++ [17749] = 0x69AC, [17750] = 0x69BC, [17751] = 0x6991, [17752] = 0x6999, ++ [17753] = 0x698E, [17754] = 0x69A7, [17755] = 0x698D, [17756] = 0x69A9, ++ [17757] = 0x69BE, [17758] = 0x69AF, [17759] = 0x69BF, [17760] = 0x69C4, ++ [17761] = 0x69BD, [17762] = 0x69A4, [17763] = 0x69D4, [17764] = 0x69B9, ++ [17765] = 0x69CA, [17766] = 0x699A, [17767] = 0x69CF, [17768] = 0x69B3, ++ [17769] = 0x6993, [17770] = 0x69AA, [17771] = 0x69A1, [17772] = 0x699E, ++ [17773] = 0x69D9, [17774] = 0x6997, [17775] = 0x6990, [17776] = 0x69C2, ++ [17777] = 0x69B5, [17778] = 0x69A5, [17779] = 0x69C6, [17780] = 0x6B4A, ++ [17781] = 0x6B4D, [17782] = 0x6B4B, [17783] = 0x6B9E, [17784] = 0x6B9F, ++ [17785] = 0x6BA0, [17786] = 0x6BC3, [17787] = 0x6BC4, [17788] = 0x6BFE, ++ [17789] = 0x6ECE, [17790] = 0x6EF5, [17791] = 0x6EF1, [17792] = 0x6F03, ++ [17793] = 0x6F25, [17794] = 0x6EF8, [17795] = 0x6F37, [17796] = 0x6EFB, ++ [17797] = 0x6F2E, [17798] = 0x6F09, [17799] = 0x6F4E, [17800] = 0x6F19, ++ [17801] = 0x6F1A, [17802] = 0x6F27, [17803] = 0x6F18, [17804] = 0x6F3B, ++ [17805] = 0x6F12, [17806] = 0x6EED, [17807] = 0x6F0A, [17842] = 0x6F36, ++ [17843] = 0x6F73, [17844] = 0x6EF9, [17845] = 0x6EEE, [17846] = 0x6F2D, ++ [17847] = 0x6F40, [17848] = 0x6F30, [17849] = 0x6F3C, [17850] = 0x6F35, ++ [17851] = 0x6EEB, [17852] = 0x6F07, [17853] = 0x6F0E, [17854] = 0x6F43, ++ [17855] = 0x6F05, [17856] = 0x6EFD, [17857] = 0x6EF6, [17858] = 0x6F39, ++ [17859] = 0x6F1C, [17860] = 0x6EFC, [17861] = 0x6F3A, [17862] = 0x6F1F, ++ [17863] = 0x6F0D, [17864] = 0x6F1E, [17865] = 0x6F08, [17866] = 0x6F21, ++ [17867] = 0x7187, [17868] = 0x7190, [17869] = 0x7189, [17870] = 0x7180, ++ [17871] = 0x7185, [17872] = 0x7182, [17873] = 0x718F, [17874] = 0x717B, ++ [17875] = 0x7186, [17876] = 0x7181, [17877] = 0x7197, [17878] = 0x7244, ++ [17879] = 0x7253, [17880] = 0x7297, [17881] = 0x7295, [17882] = 0x7293, ++ [17883] = 0x7343, [17884] = 0x734D, [17885] = 0x7351, [17886] = 0x734C, ++ [17887] = 0x7462, [17888] = 0x7473, [17889] = 0x7471, [17890] = 0x7475, ++ [17891] = 0x7472, [17892] = 0x7467, [17893] = 0x746E, [17894] = 0x7500, ++ [17895] = 0x7502, [17896] = 0x7503, [17897] = 0x757D, [17898] = 0x7590, ++ [17899] = 0x7616, [17900] = 0x7608, [17901] = 0x760C, [17902] = 0x7615, ++ [17903] = 0x7611, [17904] = 0x760A, [17905] = 0x7614, [17906] = 0x76B8, ++ [17907] = 0x7781, [17908] = 0x777C, [17909] = 0x7785, [17910] = 0x7782, ++ [17911] = 0x776E, [17912] = 0x7780, [17913] = 0x776F, [17914] = 0x777E, ++ [17915] = 0x7783, [17916] = 0x78B2, [17917] = 0x78AA, [17918] = 0x78B4, ++ [17919] = 0x78AD, [17920] = 0x78A8, [17921] = 0x787E, [17922] = 0x78AB, ++ [17923] = 0x789E, [17924] = 0x78A5, [17925] = 0x78A0, [17926] = 0x78AC, ++ [17927] = 0x78A2, [17928] = 0x78A4, [17929] = 0x7998, [17930] = 0x798A, ++ [17931] = 0x798B, [17932] = 0x7996, [17933] = 0x7995, [17934] = 0x7994, ++ [17935] = 0x7993, [17940] = 0x7997, [17941] = 0x7988, [17942] = 0x7992, ++ [17943] = 0x7990, [17944] = 0x7A2B, [17945] = 0x7A4A, [17946] = 0x7A30, ++ [17947] = 0x7A2F, [17948] = 0x7A28, [17949] = 0x7A26, [17950] = 0x7AA8, ++ [17951] = 0x7AAB, [17952] = 0x7AAC, [17953] = 0x7AEE, [17954] = 0x7B88, ++ [17955] = 0x7B9C, [17956] = 0x7B8A, [17957] = 0x7B91, [17958] = 0x7B90, ++ [17959] = 0x7B96, [17960] = 0x7B8D, [17961] = 0x7B8C, [17962] = 0x7B9B, ++ [17963] = 0x7B8E, [17964] = 0x7B85, [17965] = 0x7B98, [17966] = 0x5284, ++ [17967] = 0x7B99, [17968] = 0x7BA4, [17969] = 0x7B82, [17970] = 0x7CBB, ++ [17971] = 0x7CBF, [17972] = 0x7CBC, [17973] = 0x7CBA, [17974] = 0x7DA7, ++ [17975] = 0x7DB7, [17976] = 0x7DC2, [17977] = 0x7DA3, [17978] = 0x7DAA, ++ [17979] = 0x7DC1, [17980] = 0x7DC0, [17981] = 0x7DC5, [17982] = 0x7D9D, ++ [17983] = 0x7DCE, [17984] = 0x7DC4, [17985] = 0x7DC6, [17986] = 0x7DCB, ++ [17987] = 0x7DCC, [17988] = 0x7DAF, [17989] = 0x7DB9, [17990] = 0x7D96, ++ [17991] = 0x7DBC, [17992] = 0x7D9F, [17993] = 0x7DA6, [17994] = 0x7DAE, ++ [17995] = 0x7DA9, [17996] = 0x7DA1, [17997] = 0x7DC9, [17998] = 0x7F73, ++ [17999] = 0x7FE2, [18000] = 0x7FE3, [18001] = 0x7FE5, [18002] = 0x7FDE, ++ [18037] = 0x8024, [18038] = 0x805D, [18039] = 0x805C, [18040] = 0x8189, ++ [18041] = 0x8186, [18042] = 0x8183, [18043] = 0x8187, [18044] = 0x818D, ++ [18045] = 0x818C, [18046] = 0x818B, [18047] = 0x8215, [18048] = 0x8497, ++ [18049] = 0x84A4, [18050] = 0x84A1, [18051] = 0x849F, [18052] = 0x84BA, ++ [18053] = 0x84CE, [18054] = 0x84C2, [18055] = 0x84AC, [18056] = 0x84AE, ++ [18057] = 0x84AB, [18058] = 0x84B9, [18059] = 0x84B4, [18060] = 0x84C1, ++ [18061] = 0x84CD, [18062] = 0x84AA, [18063] = 0x849A, [18064] = 0x84B1, ++ [18065] = 0x84D0, [18066] = 0x849D, [18067] = 0x84A7, [18068] = 0x84BB, ++ [18069] = 0x84A2, [18070] = 0x8494, [18071] = 0x84C7, [18072] = 0x84CC, ++ [18073] = 0x849B, [18074] = 0x84A9, [18075] = 0x84AF, [18076] = 0x84A8, ++ [18077] = 0x84D6, [18078] = 0x8498, [18079] = 0x84B6, [18080] = 0x84CF, ++ [18081] = 0x84A0, [18082] = 0x84D7, [18083] = 0x84D4, [18084] = 0x84D2, ++ [18085] = 0x84DB, [18086] = 0x84B0, [18087] = 0x8491, [18088] = 0x8661, ++ [18089] = 0x8733, [18090] = 0x8723, [18091] = 0x8728, [18092] = 0x876B, ++ [18093] = 0x8740, [18094] = 0x872E, [18095] = 0x871E, [18096] = 0x8721, ++ [18097] = 0x8719, [18098] = 0x871B, [18099] = 0x8743, [18100] = 0x872C, ++ [18101] = 0x8741, [18102] = 0x873E, [18103] = 0x8746, [18104] = 0x8720, ++ [18105] = 0x8732, [18106] = 0x872A, [18107] = 0x872D, [18108] = 0x873C, ++ [18109] = 0x8712, [18110] = 0x873A, [18111] = 0x8731, [18112] = 0x8735, ++ [18113] = 0x8742, [18114] = 0x8726, [18115] = 0x8727, [18116] = 0x8738, ++ [18117] = 0x8724, [18118] = 0x871A, [18119] = 0x8730, [18120] = 0x8711, ++ [18121] = 0x88F7, [18122] = 0x88E7, [18123] = 0x88F1, [18124] = 0x88F2, ++ [18125] = 0x88FA, [18126] = 0x88FE, [18127] = 0x88EE, [18128] = 0x88FC, ++ [18129] = 0x88F6, [18130] = 0x88FB, [18135] = 0x88F0, [18136] = 0x88EC, ++ [18137] = 0x88EB, [18138] = 0x899D, [18139] = 0x89A1, [18140] = 0x899F, ++ [18141] = 0x899E, [18142] = 0x89E9, [18143] = 0x89EB, [18144] = 0x89E8, ++ [18145] = 0x8AAB, [18146] = 0x8A99, [18147] = 0x8A8B, [18148] = 0x8A92, ++ [18149] = 0x8A8F, [18150] = 0x8A96, [18151] = 0x8C3D, [18152] = 0x8C68, ++ [18153] = 0x8C69, [18154] = 0x8CD5, [18155] = 0x8CCF, [18156] = 0x8CD7, ++ [18157] = 0x8D96, [18158] = 0x8E09, [18159] = 0x8E02, [18160] = 0x8DFF, ++ [18161] = 0x8E0D, [18162] = 0x8DFD, [18163] = 0x8E0A, [18164] = 0x8E03, ++ [18165] = 0x8E07, [18166] = 0x8E06, [18167] = 0x8E05, [18168] = 0x8DFE, ++ [18169] = 0x8E00, [18170] = 0x8E04, [18171] = 0x8F10, [18172] = 0x8F11, ++ [18173] = 0x8F0E, [18174] = 0x8F0D, [18175] = 0x9123, [18176] = 0x911C, ++ [18177] = 0x9120, [18178] = 0x9122, [18179] = 0x911F, [18180] = 0x911D, ++ [18181] = 0x911A, [18182] = 0x9124, [18183] = 0x9121, [18184] = 0x911B, ++ [18185] = 0x917A, [18186] = 0x9172, [18187] = 0x9179, [18188] = 0x9173, ++ [18189] = 0x92A5, [18190] = 0x92A4, [18191] = 0x9276, [18192] = 0x929B, ++ [18193] = 0x927A, [18194] = 0x92A0, [18195] = 0x9294, [18196] = 0x92AA, ++ [18197] = 0x928D, [18232] = 0x92A6, [18233] = 0x929A, [18234] = 0x92AB, ++ [18235] = 0x9279, [18236] = 0x9297, [18237] = 0x927F, [18238] = 0x92A3, ++ [18239] = 0x92EE, [18240] = 0x928E, [18241] = 0x9282, [18242] = 0x9295, ++ [18243] = 0x92A2, [18244] = 0x927D, [18245] = 0x9288, [18246] = 0x92A1, ++ [18247] = 0x928A, [18248] = 0x9286, [18249] = 0x928C, [18250] = 0x9299, ++ [18251] = 0x92A7, [18252] = 0x927E, [18253] = 0x9287, [18254] = 0x92A9, ++ [18255] = 0x929D, [18256] = 0x928B, [18257] = 0x922D, [18258] = 0x969E, ++ [18259] = 0x96A1, [18260] = 0x96FF, [18261] = 0x9758, [18262] = 0x977D, ++ [18263] = 0x977A, [18264] = 0x977E, [18265] = 0x9783, [18266] = 0x9780, ++ [18267] = 0x9782, [18268] = 0x977B, [18269] = 0x9784, [18270] = 0x9781, ++ [18271] = 0x977F, [18272] = 0x97CE, [18273] = 0x97CD, [18274] = 0x9816, ++ [18275] = 0x98AD, [18276] = 0x98AE, [18277] = 0x9902, [18278] = 0x9900, ++ [18279] = 0x9907, [18280] = 0x999D, [18281] = 0x999C, [18282] = 0x99C3, ++ [18283] = 0x99B9, [18284] = 0x99BB, [18285] = 0x99BA, [18286] = 0x99C2, ++ [18287] = 0x99BD, [18288] = 0x99C7, [18289] = 0x9AB1, [18290] = 0x9AE3, ++ [18291] = 0x9AE7, [18292] = 0x9B3E, [18293] = 0x9B3F, [18294] = 0x9B60, ++ [18295] = 0x9B61, [18296] = 0x9B5F, [18297] = 0x9CF1, [18298] = 0x9CF2, ++ [18299] = 0x9CF5, [18300] = 0x9EA7, [18301] = 0x50FF, [18302] = 0x5103, ++ [18303] = 0x5130, [18304] = 0x50F8, [18305] = 0x5106, [18306] = 0x5107, ++ [18307] = 0x50F6, [18308] = 0x50FE, [18309] = 0x510B, [18310] = 0x510C, ++ [18311] = 0x50FD, [18312] = 0x510A, [18313] = 0x528B, [18314] = 0x528C, ++ [18315] = 0x52F1, [18316] = 0x52EF, [18317] = 0x5648, [18318] = 0x5642, ++ [18319] = 0x564C, [18320] = 0x5635, [18321] = 0x5641, [18322] = 0x564A, ++ [18323] = 0x5649, [18324] = 0x5646, [18325] = 0x5658, [18330] = 0x565A, ++ [18331] = 0x5640, [18332] = 0x5633, [18333] = 0x563D, [18334] = 0x562C, ++ [18335] = 0x563E, [18336] = 0x5638, [18337] = 0x562A, [18338] = 0x563A, ++ [18339] = 0x571A, [18340] = 0x58AB, [18341] = 0x589D, [18342] = 0x58B1, ++ [18343] = 0x58A0, [18344] = 0x58A3, [18345] = 0x58AF, [18346] = 0x58AC, ++ [18347] = 0x58A5, [18348] = 0x58A1, [18349] = 0x58FF, [18350] = 0x5AFF, ++ [18351] = 0x5AF4, [18352] = 0x5AFD, [18353] = 0x5AF7, [18354] = 0x5AF6, ++ [18355] = 0x5B03, [18356] = 0x5AF8, [18357] = 0x5B02, [18358] = 0x5AF9, ++ [18359] = 0x5B01, [18360] = 0x5B07, [18361] = 0x5B05, [18362] = 0x5B0F, ++ [18363] = 0x5C67, [18364] = 0x5D99, [18365] = 0x5D97, [18366] = 0x5D9F, ++ [18367] = 0x5D92, [18368] = 0x5DA2, [18369] = 0x5D93, [18370] = 0x5D95, ++ [18371] = 0x5DA0, [18372] = 0x5D9C, [18373] = 0x5DA1, [18374] = 0x5D9A, ++ [18375] = 0x5D9E, [18376] = 0x5E69, [18377] = 0x5E5D, [18378] = 0x5E60, ++ [18379] = 0x5E5C, [18380] = 0x7DF3, [18381] = 0x5EDB, [18382] = 0x5EDE, ++ [18383] = 0x5EE1, [18384] = 0x5F49, [18385] = 0x5FB2, [18386] = 0x618B, ++ [18387] = 0x6183, [18388] = 0x6179, [18389] = 0x61B1, [18390] = 0x61B0, ++ [18391] = 0x61A2, [18392] = 0x6189, [18427] = 0x619B, [18428] = 0x6193, ++ [18429] = 0x61AF, [18430] = 0x61AD, [18431] = 0x619F, [18432] = 0x6192, ++ [18433] = 0x61AA, [18434] = 0x61A1, [18435] = 0x618D, [18436] = 0x6166, ++ [18437] = 0x61B3, [18438] = 0x622D, [18439] = 0x646E, [18440] = 0x6470, ++ [18441] = 0x6496, [18442] = 0x64A0, [18443] = 0x6485, [18444] = 0x6497, ++ [18445] = 0x649C, [18446] = 0x648F, [18447] = 0x648B, [18448] = 0x648A, ++ [18449] = 0x648C, [18450] = 0x64A3, [18451] = 0x649F, [18452] = 0x6468, ++ [18453] = 0x64B1, [18454] = 0x6498, [18455] = 0x6576, [18456] = 0x657A, ++ [18457] = 0x6579, [18458] = 0x657B, [18459] = 0x65B2, [18460] = 0x65B3, ++ [18461] = 0x66B5, [18462] = 0x66B0, [18463] = 0x66A9, [18464] = 0x66B2, ++ [18465] = 0x66B7, [18466] = 0x66AA, [18467] = 0x66AF, [18468] = 0x6A00, ++ [18469] = 0x6A06, [18470] = 0x6A17, [18471] = 0x69E5, [18472] = 0x69F8, ++ [18473] = 0x6A15, [18474] = 0x69F1, [18475] = 0x69E4, [18476] = 0x6A20, ++ [18477] = 0x69FF, [18478] = 0x69EC, [18479] = 0x69E2, [18480] = 0x6A1B, ++ [18481] = 0x6A1D, [18482] = 0x69FE, [18483] = 0x6A27, [18484] = 0x69F2, ++ [18485] = 0x69EE, [18486] = 0x6A14, [18487] = 0x69F7, [18488] = 0x69E7, ++ [18489] = 0x6A40, [18490] = 0x6A08, [18491] = 0x69E6, [18492] = 0x69FB, ++ [18493] = 0x6A0D, [18494] = 0x69FC, [18495] = 0x69EB, [18496] = 0x6A09, ++ [18497] = 0x6A04, [18498] = 0x6A18, [18499] = 0x6A25, [18500] = 0x6A0F, ++ [18501] = 0x69F6, [18502] = 0x6A26, [18503] = 0x6A07, [18504] = 0x69F4, ++ [18505] = 0x6A16, [18506] = 0x6B51, [18507] = 0x6BA5, [18508] = 0x6BA3, ++ [18509] = 0x6BA2, [18510] = 0x6BA6, [18511] = 0x6C01, [18512] = 0x6C00, ++ [18513] = 0x6BFF, [18514] = 0x6C02, [18515] = 0x6F41, [18516] = 0x6F26, ++ [18517] = 0x6F7E, [18518] = 0x6F87, [18519] = 0x6FC6, [18520] = 0x6F92, ++ [18525] = 0x6F8D, [18526] = 0x6F89, [18527] = 0x6F8C, [18528] = 0x6F62, ++ [18529] = 0x6F4F, [18530] = 0x6F85, [18531] = 0x6F5A, [18532] = 0x6F96, ++ [18533] = 0x6F76, [18534] = 0x6F6C, [18535] = 0x6F82, [18536] = 0x6F55, ++ [18537] = 0x6F72, [18538] = 0x6F52, [18539] = 0x6F50, [18540] = 0x6F57, ++ [18541] = 0x6F94, [18542] = 0x6F93, [18543] = 0x6F5D, [18544] = 0x6F00, ++ [18545] = 0x6F61, [18546] = 0x6F6B, [18547] = 0x6F7D, [18548] = 0x6F67, ++ [18549] = 0x6F90, [18550] = 0x6F53, [18551] = 0x6F8B, [18552] = 0x6F69, ++ [18553] = 0x6F7F, [18554] = 0x6F95, [18555] = 0x6F63, [18556] = 0x6F77, ++ [18557] = 0x6F6A, [18558] = 0x6F7B, [18559] = 0x71B2, [18560] = 0x71AF, ++ [18561] = 0x719B, [18562] = 0x71B0, [18563] = 0x71A0, [18564] = 0x719A, ++ [18565] = 0x71A9, [18566] = 0x71B5, [18567] = 0x719D, [18568] = 0x71A5, ++ [18569] = 0x719E, [18570] = 0x71A4, [18571] = 0x71A1, [18572] = 0x71AA, ++ [18573] = 0x719C, [18574] = 0x71A7, [18575] = 0x71B3, [18576] = 0x7298, ++ [18577] = 0x729A, [18578] = 0x7358, [18579] = 0x7352, [18580] = 0x735E, ++ [18581] = 0x735F, [18582] = 0x7360, [18583] = 0x735D, [18584] = 0x735B, ++ [18585] = 0x7361, [18586] = 0x735A, [18587] = 0x7359, [18622] = 0x7362, ++ [18623] = 0x7487, [18624] = 0x7489, [18625] = 0x748A, [18626] = 0x7486, ++ [18627] = 0x7481, [18628] = 0x747D, [18629] = 0x7485, [18630] = 0x7488, ++ [18631] = 0x747C, [18632] = 0x7479, [18633] = 0x7508, [18634] = 0x7507, ++ [18635] = 0x757E, [18636] = 0x7625, [18637] = 0x761E, [18638] = 0x7619, ++ [18639] = 0x761D, [18640] = 0x761C, [18641] = 0x7623, [18642] = 0x761A, ++ [18643] = 0x7628, [18644] = 0x761B, [18645] = 0x769C, [18646] = 0x769D, ++ [18647] = 0x769E, [18648] = 0x769B, [18649] = 0x778D, [18650] = 0x778F, ++ [18651] = 0x7789, [18652] = 0x7788, [18653] = 0x78CD, [18654] = 0x78BB, ++ [18655] = 0x78CF, [18656] = 0x78CC, [18657] = 0x78D1, [18658] = 0x78CE, ++ [18659] = 0x78D4, [18660] = 0x78C8, [18661] = 0x78C3, [18662] = 0x78C4, ++ [18663] = 0x78C9, [18664] = 0x799A, [18665] = 0x79A1, [18666] = 0x79A0, ++ [18667] = 0x799C, [18668] = 0x79A2, [18669] = 0x799B, [18670] = 0x6B76, ++ [18671] = 0x7A39, [18672] = 0x7AB2, [18673] = 0x7AB4, [18674] = 0x7AB3, ++ [18675] = 0x7BB7, [18676] = 0x7BCB, [18677] = 0x7BBE, [18678] = 0x7BAC, ++ [18679] = 0x7BCE, [18680] = 0x7BAF, [18681] = 0x7BB9, [18682] = 0x7BCA, ++ [18683] = 0x7BB5, [18684] = 0x7CC5, [18685] = 0x7CC8, [18686] = 0x7CCC, ++ [18687] = 0x7CCB, [18688] = 0x7DF7, [18689] = 0x7DDB, [18690] = 0x7DEA, ++ [18691] = 0x7DE7, [18692] = 0x7DD7, [18693] = 0x7DE1, [18694] = 0x7E03, ++ [18695] = 0x7DFA, [18696] = 0x7DE6, [18697] = 0x7DF6, [18698] = 0x7DF1, ++ [18699] = 0x7DF0, [18700] = 0x7DEE, [18701] = 0x7DDF, [18702] = 0x7F76, ++ [18703] = 0x7FAC, [18704] = 0x7FB0, [18705] = 0x7FAD, [18706] = 0x7FED, ++ [18707] = 0x7FEB, [18708] = 0x7FEA, [18709] = 0x7FEC, [18710] = 0x7FE6, ++ [18711] = 0x7FE8, [18712] = 0x8064, [18713] = 0x8067, [18714] = 0x81A3, ++ [18715] = 0x819F, [18720] = 0x819E, [18721] = 0x8195, [18722] = 0x81A2, ++ [18723] = 0x8199, [18724] = 0x8197, [18725] = 0x8216, [18726] = 0x824F, ++ [18727] = 0x8253, [18728] = 0x8252, [18729] = 0x8250, [18730] = 0x824E, ++ [18731] = 0x8251, [18732] = 0x8524, [18733] = 0x853B, [18734] = 0x850F, ++ [18735] = 0x8500, [18736] = 0x8529, [18737] = 0x850E, [18738] = 0x8509, ++ [18739] = 0x850D, [18740] = 0x851F, [18741] = 0x850A, [18742] = 0x8527, ++ [18743] = 0x851C, [18744] = 0x84FB, [18745] = 0x852B, [18746] = 0x84FA, ++ [18747] = 0x8508, [18748] = 0x850C, [18749] = 0x84F4, [18750] = 0x852A, ++ [18751] = 0x84F2, [18752] = 0x8515, [18753] = 0x84F7, [18754] = 0x84EB, ++ [18755] = 0x84F3, [18756] = 0x84FC, [18757] = 0x8512, [18758] = 0x84EA, ++ [18759] = 0x84E9, [18760] = 0x8516, [18761] = 0x84FE, [18762] = 0x8528, ++ [18763] = 0x851D, [18764] = 0x852E, [18765] = 0x8502, [18766] = 0x84FD, ++ [18767] = 0x851E, [18768] = 0x84F6, [18769] = 0x8531, [18770] = 0x8526, ++ [18771] = 0x84E7, [18772] = 0x84E8, [18773] = 0x84F0, [18774] = 0x84EF, ++ [18775] = 0x84F9, [18776] = 0x8518, [18777] = 0x8520, [18778] = 0x8530, ++ [18779] = 0x850B, [18780] = 0x8519, [18781] = 0x852F, [18782] = 0x8662, ++ [18817] = 0x8756, [18818] = 0x8763, [18819] = 0x8764, [18820] = 0x8777, ++ [18821] = 0x87E1, [18822] = 0x8773, [18823] = 0x8758, [18824] = 0x8754, ++ [18825] = 0x875B, [18826] = 0x8752, [18827] = 0x8761, [18828] = 0x875A, ++ [18829] = 0x8751, [18830] = 0x875E, [18831] = 0x876D, [18832] = 0x876A, ++ [18833] = 0x8750, [18834] = 0x874E, [18835] = 0x875F, [18836] = 0x875D, ++ [18837] = 0x876F, [18838] = 0x876C, [18839] = 0x877A, [18840] = 0x876E, ++ [18841] = 0x875C, [18842] = 0x8765, [18843] = 0x874F, [18844] = 0x877B, ++ [18845] = 0x8775, [18846] = 0x8762, [18847] = 0x8767, [18848] = 0x8769, ++ [18849] = 0x885A, [18850] = 0x8905, [18851] = 0x890C, [18852] = 0x8914, ++ [18853] = 0x890B, [18854] = 0x8917, [18855] = 0x8918, [18856] = 0x8919, ++ [18857] = 0x8906, [18858] = 0x8916, [18859] = 0x8911, [18860] = 0x890E, ++ [18861] = 0x8909, [18862] = 0x89A2, [18863] = 0x89A4, [18864] = 0x89A3, ++ [18865] = 0x89ED, [18866] = 0x89F0, [18867] = 0x89EC, [18868] = 0x8ACF, ++ [18869] = 0x8AC6, [18870] = 0x8AB8, [18871] = 0x8AD3, [18872] = 0x8AD1, ++ [18873] = 0x8AD4, [18874] = 0x8AD5, [18875] = 0x8ABB, [18876] = 0x8AD7, ++ [18877] = 0x8ABE, [18878] = 0x8AC0, [18879] = 0x8AC5, [18880] = 0x8AD8, ++ [18881] = 0x8AC3, [18882] = 0x8ABA, [18883] = 0x8ABD, [18884] = 0x8AD9, ++ [18885] = 0x8C3E, [18886] = 0x8C4D, [18887] = 0x8C8F, [18888] = 0x8CE5, ++ [18889] = 0x8CDF, [18890] = 0x8CD9, [18891] = 0x8CE8, [18892] = 0x8CDA, ++ [18893] = 0x8CDD, [18894] = 0x8CE7, [18895] = 0x8DA0, [18896] = 0x8D9C, ++ [18897] = 0x8DA1, [18898] = 0x8D9B, [18899] = 0x8E20, [18900] = 0x8E23, ++ [18901] = 0x8E25, [18902] = 0x8E24, [18903] = 0x8E2E, [18904] = 0x8E15, ++ [18905] = 0x8E1B, [18906] = 0x8E16, [18907] = 0x8E11, [18908] = 0x8E19, ++ [18909] = 0x8E26, [18910] = 0x8E27, [18915] = 0x8E14, [18916] = 0x8E12, ++ [18917] = 0x8E18, [18918] = 0x8E13, [18919] = 0x8E1C, [18920] = 0x8E17, ++ [18921] = 0x8E1A, [18922] = 0x8F2C, [18923] = 0x8F24, [18924] = 0x8F18, ++ [18925] = 0x8F1A, [18926] = 0x8F20, [18927] = 0x8F23, [18928] = 0x8F16, ++ [18929] = 0x8F17, [18930] = 0x9073, [18931] = 0x9070, [18932] = 0x906F, ++ [18933] = 0x9067, [18934] = 0x906B, [18935] = 0x912F, [18936] = 0x912B, ++ [18937] = 0x9129, [18938] = 0x912A, [18939] = 0x9132, [18940] = 0x9126, ++ [18941] = 0x912E, [18942] = 0x9185, [18943] = 0x9186, [18944] = 0x918A, ++ [18945] = 0x9181, [18946] = 0x9182, [18947] = 0x9184, [18948] = 0x9180, ++ [18949] = 0x92D0, [18950] = 0x92C3, [18951] = 0x92C4, [18952] = 0x92C0, ++ [18953] = 0x92D9, [18954] = 0x92B6, [18955] = 0x92CF, [18956] = 0x92F1, ++ [18957] = 0x92DF, [18958] = 0x92D8, [18959] = 0x92E9, [18960] = 0x92D7, ++ [18961] = 0x92DD, [18962] = 0x92CC, [18963] = 0x92EF, [18964] = 0x92C2, ++ [18965] = 0x92E8, [18966] = 0x92CA, [18967] = 0x92C8, [18968] = 0x92CE, ++ [18969] = 0x92E6, [18970] = 0x92CD, [18971] = 0x92D5, [18972] = 0x92C9, ++ [18973] = 0x92E0, [18974] = 0x92DE, [18975] = 0x92E7, [18976] = 0x92D1, ++ [18977] = 0x92D3, [19012] = 0x92B5, [19013] = 0x92E1, [19014] = 0x92C6, ++ [19015] = 0x92B4, [19016] = 0x957C, [19017] = 0x95AC, [19018] = 0x95AB, ++ [19019] = 0x95AE, [19020] = 0x95B0, [19021] = 0x96A4, [19022] = 0x96A2, ++ [19023] = 0x96D3, [19024] = 0x9705, [19025] = 0x9708, [19026] = 0x9702, ++ [19027] = 0x975A, [19028] = 0x978A, [19029] = 0x978E, [19030] = 0x9788, ++ [19031] = 0x97D0, [19032] = 0x97CF, [19033] = 0x981E, [19034] = 0x981D, ++ [19035] = 0x9826, [19036] = 0x9829, [19037] = 0x9828, [19038] = 0x9820, ++ [19039] = 0x981B, [19040] = 0x9827, [19041] = 0x98B2, [19042] = 0x9908, ++ [19043] = 0x98FA, [19044] = 0x9911, [19045] = 0x9914, [19046] = 0x9916, ++ [19047] = 0x9917, [19048] = 0x9915, [19049] = 0x99DC, [19050] = 0x99CD, ++ [19051] = 0x99CF, [19052] = 0x99D3, [19053] = 0x99D4, [19054] = 0x99CE, ++ [19055] = 0x99C9, [19056] = 0x99D6, [19057] = 0x99D8, [19058] = 0x99CB, ++ [19059] = 0x99D7, [19060] = 0x99CC, [19061] = 0x9AB3, [19062] = 0x9AEC, ++ [19063] = 0x9AEB, [19064] = 0x9AF3, [19065] = 0x9AF2, [19066] = 0x9AF1, ++ [19067] = 0x9B46, [19068] = 0x9B43, [19069] = 0x9B67, [19070] = 0x9B74, ++ [19071] = 0x9B71, [19072] = 0x9B66, [19073] = 0x9B76, [19074] = 0x9B75, ++ [19075] = 0x9B70, [19076] = 0x9B68, [19077] = 0x9B64, [19078] = 0x9B6C, ++ [19079] = 0x9CFC, [19080] = 0x9CFA, [19081] = 0x9CFD, [19082] = 0x9CFF, ++ [19083] = 0x9CF7, [19084] = 0x9D07, [19085] = 0x9D00, [19086] = 0x9CF9, ++ [19087] = 0x9CFB, [19088] = 0x9D08, [19089] = 0x9D05, [19090] = 0x9D04, ++ [19091] = 0x9E83, [19092] = 0x9ED3, [19093] = 0x9F0F, [19094] = 0x9F10, ++ [19095] = 0x511C, [19096] = 0x5113, [19097] = 0x5117, [19098] = 0x511A, ++ [19099] = 0x5111, [19100] = 0x51DE, [19101] = 0x5334, [19102] = 0x53E1, ++ [19103] = 0x5670, [19104] = 0x5660, [19105] = 0x566E, [19110] = 0x5673, ++ [19111] = 0x5666, [19112] = 0x5663, [19113] = 0x566D, [19114] = 0x5672, ++ [19115] = 0x565E, [19116] = 0x5677, [19117] = 0x571C, [19118] = 0x571B, ++ [19119] = 0x58C8, [19120] = 0x58BD, [19121] = 0x58C9, [19122] = 0x58BF, ++ [19123] = 0x58BA, [19124] = 0x58C2, [19125] = 0x58BC, [19126] = 0x58C6, ++ [19127] = 0x5B17, [19128] = 0x5B19, [19129] = 0x5B1B, [19130] = 0x5B21, ++ [19131] = 0x5B14, [19132] = 0x5B13, [19133] = 0x5B10, [19134] = 0x5B16, ++ [19135] = 0x5B28, [19136] = 0x5B1A, [19137] = 0x5B20, [19138] = 0x5B1E, ++ [19139] = 0x5BEF, [19140] = 0x5DAC, [19141] = 0x5DB1, [19142] = 0x5DA9, ++ [19143] = 0x5DA7, [19144] = 0x5DB5, [19145] = 0x5DB0, [19146] = 0x5DAE, ++ [19147] = 0x5DAA, [19148] = 0x5DA8, [19149] = 0x5DB2, [19150] = 0x5DAD, ++ [19151] = 0x5DAF, [19152] = 0x5DB4, [19153] = 0x5E67, [19154] = 0x5E68, ++ [19155] = 0x5E66, [19156] = 0x5E6F, [19157] = 0x5EE9, [19158] = 0x5EE7, ++ [19159] = 0x5EE6, [19160] = 0x5EE8, [19161] = 0x5EE5, [19162] = 0x5F4B, ++ [19163] = 0x5FBC, [19164] = 0x619D, [19165] = 0x61A8, [19166] = 0x6196, ++ [19167] = 0x61C5, [19168] = 0x61B4, [19169] = 0x61C6, [19170] = 0x61C1, ++ [19171] = 0x61CC, [19172] = 0x61BA, [19207] = 0x61BF, [19208] = 0x61B8, ++ [19209] = 0x618C, [19210] = 0x64D7, [19211] = 0x64D6, [19212] = 0x64D0, ++ [19213] = 0x64CF, [19214] = 0x64C9, [19215] = 0x64BD, [19216] = 0x6489, ++ [19217] = 0x64C3, [19218] = 0x64DB, [19219] = 0x64F3, [19220] = 0x64D9, ++ [19221] = 0x6533, [19222] = 0x657F, [19223] = 0x657C, [19224] = 0x65A2, ++ [19225] = 0x66C8, [19226] = 0x66BE, [19227] = 0x66C0, [19228] = 0x66CA, ++ [19229] = 0x66CB, [19230] = 0x66CF, [19231] = 0x66BD, [19232] = 0x66BB, ++ [19233] = 0x66BA, [19234] = 0x66CC, [19235] = 0x6723, [19236] = 0x6A34, ++ [19237] = 0x6A66, [19238] = 0x6A49, [19239] = 0x6A67, [19240] = 0x6A32, ++ [19241] = 0x6A68, [19242] = 0x6A3E, [19243] = 0x6A5D, [19244] = 0x6A6D, ++ [19245] = 0x6A76, [19246] = 0x6A5B, [19247] = 0x6A51, [19248] = 0x6A28, ++ [19249] = 0x6A5A, [19250] = 0x6A3B, [19251] = 0x6A3F, [19252] = 0x6A41, ++ [19253] = 0x6A6A, [19254] = 0x6A64, [19255] = 0x6A50, [19256] = 0x6A4F, ++ [19257] = 0x6A54, [19258] = 0x6A6F, [19259] = 0x6A69, [19260] = 0x6A60, ++ [19261] = 0x6A3C, [19262] = 0x6A5E, [19263] = 0x6A56, [19264] = 0x6A55, ++ [19265] = 0x6A4D, [19266] = 0x6A4E, [19267] = 0x6A46, [19268] = 0x6B55, ++ [19269] = 0x6B54, [19270] = 0x6B56, [19271] = 0x6BA7, [19272] = 0x6BAA, ++ [19273] = 0x6BAB, [19274] = 0x6BC8, [19275] = 0x6BC7, [19276] = 0x6C04, ++ [19277] = 0x6C03, [19278] = 0x6C06, [19279] = 0x6FAD, [19280] = 0x6FCB, ++ [19281] = 0x6FA3, [19282] = 0x6FC7, [19283] = 0x6FBC, [19284] = 0x6FCE, ++ [19285] = 0x6FC8, [19286] = 0x6F5E, [19287] = 0x6FC4, [19288] = 0x6FBD, ++ [19289] = 0x6F9E, [19290] = 0x6FCA, [19291] = 0x6FA8, [19292] = 0x7004, ++ [19293] = 0x6FA5, [19294] = 0x6FAE, [19295] = 0x6FBA, [19296] = 0x6FAC, ++ [19297] = 0x6FAA, [19298] = 0x6FCF, [19299] = 0x6FBF, [19300] = 0x6FB8, ++ [19305] = 0x6FA2, [19306] = 0x6FC9, [19307] = 0x6FAB, [19308] = 0x6FCD, ++ [19309] = 0x6FAF, [19310] = 0x6FB2, [19311] = 0x6FB0, [19312] = 0x71C5, ++ [19313] = 0x71C2, [19314] = 0x71BF, [19315] = 0x71B8, [19316] = 0x71D6, ++ [19317] = 0x71C0, [19318] = 0x71C1, [19319] = 0x71CB, [19320] = 0x71D4, ++ [19321] = 0x71CA, [19322] = 0x71C7, [19323] = 0x71CF, [19324] = 0x71BD, ++ [19325] = 0x71D8, [19326] = 0x71BC, [19327] = 0x71C6, [19328] = 0x71DA, ++ [19329] = 0x71DB, [19330] = 0x729D, [19331] = 0x729E, [19332] = 0x7369, ++ [19333] = 0x7366, [19334] = 0x7367, [19335] = 0x736C, [19336] = 0x7365, ++ [19337] = 0x736B, [19338] = 0x736A, [19339] = 0x747F, [19340] = 0x749A, ++ [19341] = 0x74A0, [19342] = 0x7494, [19343] = 0x7492, [19344] = 0x7495, ++ [19345] = 0x74A1, [19346] = 0x750B, [19347] = 0x7580, [19348] = 0x762F, ++ [19349] = 0x762D, [19350] = 0x7631, [19351] = 0x763D, [19352] = 0x7633, ++ [19353] = 0x763C, [19354] = 0x7635, [19355] = 0x7632, [19356] = 0x7630, ++ [19357] = 0x76BB, [19358] = 0x76E6, [19359] = 0x779A, [19360] = 0x779D, ++ [19361] = 0x77A1, [19362] = 0x779C, [19363] = 0x779B, [19364] = 0x77A2, ++ [19365] = 0x77A3, [19366] = 0x7795, [19367] = 0x7799, [19402] = 0x7797, ++ [19403] = 0x78DD, [19404] = 0x78E9, [19405] = 0x78E5, [19406] = 0x78EA, ++ [19407] = 0x78DE, [19408] = 0x78E3, [19409] = 0x78DB, [19410] = 0x78E1, ++ [19411] = 0x78E2, [19412] = 0x78ED, [19413] = 0x78DF, [19414] = 0x78E0, ++ [19415] = 0x79A4, [19416] = 0x7A44, [19417] = 0x7A48, [19418] = 0x7A47, ++ [19419] = 0x7AB6, [19420] = 0x7AB8, [19421] = 0x7AB5, [19422] = 0x7AB1, ++ [19423] = 0x7AB7, [19424] = 0x7BDE, [19425] = 0x7BE3, [19426] = 0x7BE7, ++ [19427] = 0x7BDD, [19428] = 0x7BD5, [19429] = 0x7BE5, [19430] = 0x7BDA, ++ [19431] = 0x7BE8, [19432] = 0x7BF9, [19433] = 0x7BD4, [19434] = 0x7BEA, ++ [19435] = 0x7BE2, [19436] = 0x7BDC, [19437] = 0x7BEB, [19438] = 0x7BD8, ++ [19439] = 0x7BDF, [19440] = 0x7CD2, [19441] = 0x7CD4, [19442] = 0x7CD7, ++ [19443] = 0x7CD0, [19444] = 0x7CD1, [19445] = 0x7E12, [19446] = 0x7E21, ++ [19447] = 0x7E17, [19448] = 0x7E0C, [19449] = 0x7E1F, [19450] = 0x7E20, ++ [19451] = 0x7E13, [19452] = 0x7E0E, [19453] = 0x7E1C, [19454] = 0x7E15, ++ [19455] = 0x7E1A, [19456] = 0x7E22, [19457] = 0x7E0B, [19458] = 0x7E0F, ++ [19459] = 0x7E16, [19460] = 0x7E0D, [19461] = 0x7E14, [19462] = 0x7E25, ++ [19463] = 0x7E24, [19464] = 0x7F43, [19465] = 0x7F7B, [19466] = 0x7F7C, ++ [19467] = 0x7F7A, [19468] = 0x7FB1, [19469] = 0x7FEF, [19470] = 0x802A, ++ [19471] = 0x8029, [19472] = 0x806C, [19473] = 0x81B1, [19474] = 0x81A6, ++ [19475] = 0x81AE, [19476] = 0x81B9, [19477] = 0x81B5, [19478] = 0x81AB, ++ [19479] = 0x81B0, [19480] = 0x81AC, [19481] = 0x81B4, [19482] = 0x81B2, ++ [19483] = 0x81B7, [19484] = 0x81A7, [19485] = 0x81F2, [19486] = 0x8255, ++ [19487] = 0x8256, [19488] = 0x8257, [19489] = 0x8556, [19490] = 0x8545, ++ [19491] = 0x856B, [19492] = 0x854D, [19493] = 0x8553, [19494] = 0x8561, ++ [19495] = 0x8558, [19500] = 0x8540, [19501] = 0x8546, [19502] = 0x8564, ++ [19503] = 0x8541, [19504] = 0x8562, [19505] = 0x8544, [19506] = 0x8551, ++ [19507] = 0x8547, [19508] = 0x8563, [19509] = 0x853E, [19510] = 0x855B, ++ [19511] = 0x8571, [19512] = 0x854E, [19513] = 0x856E, [19514] = 0x8575, ++ [19515] = 0x8555, [19516] = 0x8567, [19517] = 0x8560, [19518] = 0x858C, ++ [19519] = 0x8566, [19520] = 0x855D, [19521] = 0x8554, [19522] = 0x8565, ++ [19523] = 0x856C, [19524] = 0x8663, [19525] = 0x8665, [19526] = 0x8664, ++ [19527] = 0x879B, [19528] = 0x878F, [19529] = 0x8797, [19530] = 0x8793, ++ [19531] = 0x8792, [19532] = 0x8788, [19533] = 0x8781, [19534] = 0x8796, ++ [19535] = 0x8798, [19536] = 0x8779, [19537] = 0x8787, [19538] = 0x87A3, ++ [19539] = 0x8785, [19540] = 0x8790, [19541] = 0x8791, [19542] = 0x879D, ++ [19543] = 0x8784, [19544] = 0x8794, [19545] = 0x879C, [19546] = 0x879A, ++ [19547] = 0x8789, [19548] = 0x891E, [19549] = 0x8926, [19550] = 0x8930, ++ [19551] = 0x892D, [19552] = 0x892E, [19553] = 0x8927, [19554] = 0x8931, ++ [19555] = 0x8922, [19556] = 0x8929, [19557] = 0x8923, [19558] = 0x892F, ++ [19559] = 0x892C, [19560] = 0x891F, [19561] = 0x89F1, [19562] = 0x8AE0, ++ [19597] = 0x8AE2, [19598] = 0x8AF2, [19599] = 0x8AF4, [19600] = 0x8AF5, ++ [19601] = 0x8ADD, [19602] = 0x8B14, [19603] = 0x8AE4, [19604] = 0x8ADF, ++ [19605] = 0x8AF0, [19606] = 0x8AC8, [19607] = 0x8ADE, [19608] = 0x8AE1, ++ [19609] = 0x8AE8, [19610] = 0x8AFF, [19611] = 0x8AEF, [19612] = 0x8AFB, ++ [19613] = 0x8C91, [19614] = 0x8C92, [19615] = 0x8C90, [19616] = 0x8CF5, ++ [19617] = 0x8CEE, [19618] = 0x8CF1, [19619] = 0x8CF0, [19620] = 0x8CF3, ++ [19621] = 0x8D6C, [19622] = 0x8D6E, [19623] = 0x8DA5, [19624] = 0x8DA7, ++ [19625] = 0x8E33, [19626] = 0x8E3E, [19627] = 0x8E38, [19628] = 0x8E40, ++ [19629] = 0x8E45, [19630] = 0x8E36, [19631] = 0x8E3C, [19632] = 0x8E3D, ++ [19633] = 0x8E41, [19634] = 0x8E30, [19635] = 0x8E3F, [19636] = 0x8EBD, ++ [19637] = 0x8F36, [19638] = 0x8F2E, [19639] = 0x8F35, [19640] = 0x8F32, ++ [19641] = 0x8F39, [19642] = 0x8F37, [19643] = 0x8F34, [19644] = 0x9076, ++ [19645] = 0x9079, [19646] = 0x907B, [19647] = 0x9086, [19648] = 0x90FA, ++ [19649] = 0x9133, [19650] = 0x9135, [19651] = 0x9136, [19652] = 0x9193, ++ [19653] = 0x9190, [19654] = 0x9191, [19655] = 0x918D, [19656] = 0x918F, ++ [19657] = 0x9327, [19658] = 0x931E, [19659] = 0x9308, [19660] = 0x931F, ++ [19661] = 0x9306, [19662] = 0x930F, [19663] = 0x937A, [19664] = 0x9338, ++ [19665] = 0x933C, [19666] = 0x931B, [19667] = 0x9323, [19668] = 0x9312, ++ [19669] = 0x9301, [19670] = 0x9346, [19671] = 0x932D, [19672] = 0x930E, ++ [19673] = 0x930D, [19674] = 0x92CB, [19675] = 0x931D, [19676] = 0x92FA, ++ [19677] = 0x9325, [19678] = 0x9313, [19679] = 0x92F9, [19680] = 0x92F7, ++ [19681] = 0x9334, [19682] = 0x9302, [19683] = 0x9324, [19684] = 0x92FF, ++ [19685] = 0x9329, [19686] = 0x9339, [19687] = 0x9335, [19688] = 0x932A, ++ [19689] = 0x9314, [19690] = 0x930C, [19695] = 0x930B, [19696] = 0x92FE, ++ [19697] = 0x9309, [19698] = 0x9300, [19699] = 0x92FB, [19700] = 0x9316, ++ [19701] = 0x95BC, [19702] = 0x95CD, [19703] = 0x95BE, [19704] = 0x95B9, ++ [19705] = 0x95BA, [19706] = 0x95B6, [19707] = 0x95BF, [19708] = 0x95B5, ++ [19709] = 0x95BD, [19710] = 0x96A9, [19711] = 0x96D4, [19712] = 0x970B, ++ [19713] = 0x9712, [19714] = 0x9710, [19715] = 0x9799, [19716] = 0x9797, ++ [19717] = 0x9794, [19718] = 0x97F0, [19719] = 0x97F8, [19720] = 0x9835, ++ [19721] = 0x982F, [19722] = 0x9832, [19723] = 0x9924, [19724] = 0x991F, ++ [19725] = 0x9927, [19726] = 0x9929, [19727] = 0x999E, [19728] = 0x99EE, ++ [19729] = 0x99EC, [19730] = 0x99E5, [19731] = 0x99E4, [19732] = 0x99F0, ++ [19733] = 0x99E3, [19734] = 0x99EA, [19735] = 0x99E9, [19736] = 0x99E7, ++ [19737] = 0x9AB9, [19738] = 0x9ABF, [19739] = 0x9AB4, [19740] = 0x9ABB, ++ [19741] = 0x9AF6, [19742] = 0x9AFA, [19743] = 0x9AF9, [19744] = 0x9AF7, ++ [19745] = 0x9B33, [19746] = 0x9B80, [19747] = 0x9B85, [19748] = 0x9B87, ++ [19749] = 0x9B7C, [19750] = 0x9B7E, [19751] = 0x9B7B, [19752] = 0x9B82, ++ [19753] = 0x9B93, [19754] = 0x9B92, [19755] = 0x9B90, [19756] = 0x9B7A, ++ [19757] = 0x9B95, [19792] = 0x9B7D, [19793] = 0x9B88, [19794] = 0x9D25, ++ [19795] = 0x9D17, [19796] = 0x9D20, [19797] = 0x9D1E, [19798] = 0x9D14, ++ [19799] = 0x9D29, [19800] = 0x9D1D, [19801] = 0x9D18, [19802] = 0x9D22, ++ [19803] = 0x9D10, [19804] = 0x9D19, [19805] = 0x9D1F, [19806] = 0x9E88, ++ [19807] = 0x9E86, [19808] = 0x9E87, [19809] = 0x9EAE, [19810] = 0x9EAD, ++ [19811] = 0x9ED5, [19812] = 0x9ED6, [19813] = 0x9EFA, [19814] = 0x9F12, ++ [19815] = 0x9F3D, [19816] = 0x5126, [19817] = 0x5125, [19818] = 0x5122, ++ [19819] = 0x5124, [19820] = 0x5120, [19821] = 0x5129, [19822] = 0x52F4, ++ [19823] = 0x5693, [19824] = 0x568C, [19825] = 0x568D, [19826] = 0x5686, ++ [19827] = 0x5684, [19828] = 0x5683, [19829] = 0x567E, [19830] = 0x5682, ++ [19831] = 0x567F, [19832] = 0x5681, [19833] = 0x58D6, [19834] = 0x58D4, ++ [19835] = 0x58CF, [19836] = 0x58D2, [19837] = 0x5B2D, [19838] = 0x5B25, ++ [19839] = 0x5B32, [19840] = 0x5B23, [19841] = 0x5B2C, [19842] = 0x5B27, ++ [19843] = 0x5B26, [19844] = 0x5B2F, [19845] = 0x5B2E, [19846] = 0x5B7B, ++ [19847] = 0x5BF1, [19848] = 0x5BF2, [19849] = 0x5DB7, [19850] = 0x5E6C, ++ [19851] = 0x5E6A, [19852] = 0x5FBE, [19853] = 0x5FBB, [19854] = 0x61C3, ++ [19855] = 0x61B5, [19856] = 0x61BC, [19857] = 0x61E7, [19858] = 0x61E0, ++ [19859] = 0x61E5, [19860] = 0x61E4, [19861] = 0x61E8, [19862] = 0x61DE, ++ [19863] = 0x64EF, [19864] = 0x64E9, [19865] = 0x64E3, [19866] = 0x64EB, ++ [19867] = 0x64E4, [19868] = 0x64E8, [19869] = 0x6581, [19870] = 0x6580, ++ [19871] = 0x65B6, [19872] = 0x65DA, [19873] = 0x66D2, [19874] = 0x6A8D, ++ [19875] = 0x6A96, [19876] = 0x6A81, [19877] = 0x6AA5, [19878] = 0x6A89, ++ [19879] = 0x6A9F, [19880] = 0x6A9B, [19881] = 0x6AA1, [19882] = 0x6A9E, ++ [19883] = 0x6A87, [19884] = 0x6A93, [19885] = 0x6A8E, [19890] = 0x6A95, ++ [19891] = 0x6A83, [19892] = 0x6AA8, [19893] = 0x6AA4, [19894] = 0x6A91, ++ [19895] = 0x6A7F, [19896] = 0x6AA6, [19897] = 0x6A9A, [19898] = 0x6A85, ++ [19899] = 0x6A8C, [19900] = 0x6A92, [19901] = 0x6B5B, [19902] = 0x6BAD, ++ [19903] = 0x6C09, [19904] = 0x6FCC, [19905] = 0x6FA9, [19906] = 0x6FF4, ++ [19907] = 0x6FD4, [19908] = 0x6FE3, [19909] = 0x6FDC, [19910] = 0x6FED, ++ [19911] = 0x6FE7, [19912] = 0x6FE6, [19913] = 0x6FDE, [19914] = 0x6FF2, ++ [19915] = 0x6FDD, [19916] = 0x6FE2, [19917] = 0x6FE8, [19918] = 0x71E1, ++ [19919] = 0x71F1, [19920] = 0x71E8, [19921] = 0x71F2, [19922] = 0x71E4, ++ [19923] = 0x71F0, [19924] = 0x71E2, [19925] = 0x7373, [19926] = 0x736E, ++ [19927] = 0x736F, [19928] = 0x7497, [19929] = 0x74B2, [19930] = 0x74AB, ++ [19931] = 0x7490, [19932] = 0x74AA, [19933] = 0x74AD, [19934] = 0x74B1, ++ [19935] = 0x74A5, [19936] = 0x74AF, [19937] = 0x7510, [19938] = 0x7511, ++ [19939] = 0x7512, [19940] = 0x750F, [19941] = 0x7584, [19942] = 0x7643, ++ [19943] = 0x7648, [19944] = 0x7649, [19945] = 0x7647, [19946] = 0x76A4, ++ [19947] = 0x76E9, [19948] = 0x77B5, [19949] = 0x77AB, [19950] = 0x77B2, ++ [19951] = 0x77B7, [19952] = 0x77B6, [19987] = 0x77B4, [19988] = 0x77B1, ++ [19989] = 0x77A8, [19990] = 0x77F0, [19991] = 0x78F3, [19992] = 0x78FD, ++ [19993] = 0x7902, [19994] = 0x78FB, [19995] = 0x78FC, [19996] = 0x78F2, ++ [19997] = 0x7905, [19998] = 0x78F9, [19999] = 0x78FE, [20000] = 0x7904, ++ [20001] = 0x79AB, [20002] = 0x79A8, [20003] = 0x7A5C, [20004] = 0x7A5B, ++ [20005] = 0x7A56, [20006] = 0x7A58, [20007] = 0x7A54, [20008] = 0x7A5A, ++ [20009] = 0x7ABE, [20010] = 0x7AC0, [20011] = 0x7AC1, [20012] = 0x7C05, ++ [20013] = 0x7C0F, [20014] = 0x7BF2, [20015] = 0x7C00, [20016] = 0x7BFF, ++ [20017] = 0x7BFB, [20018] = 0x7C0E, [20019] = 0x7BF4, [20020] = 0x7C0B, ++ [20021] = 0x7BF3, [20022] = 0x7C02, [20023] = 0x7C09, [20024] = 0x7C03, ++ [20025] = 0x7C01, [20026] = 0x7BF8, [20027] = 0x7BFD, [20028] = 0x7C06, ++ [20029] = 0x7BF0, [20030] = 0x7BF1, [20031] = 0x7C10, [20032] = 0x7C0A, ++ [20033] = 0x7CE8, [20034] = 0x7E2D, [20035] = 0x7E3C, [20036] = 0x7E42, ++ [20037] = 0x7E33, [20038] = 0x9848, [20039] = 0x7E38, [20040] = 0x7E2A, ++ [20041] = 0x7E49, [20042] = 0x7E40, [20043] = 0x7E47, [20044] = 0x7E29, ++ [20045] = 0x7E4C, [20046] = 0x7E30, [20047] = 0x7E3B, [20048] = 0x7E36, ++ [20049] = 0x7E44, [20050] = 0x7E3A, [20051] = 0x7F45, [20052] = 0x7F7F, ++ [20053] = 0x7F7E, [20054] = 0x7F7D, [20055] = 0x7FF4, [20056] = 0x7FF2, ++ [20057] = 0x802C, [20058] = 0x81BB, [20059] = 0x81C4, [20060] = 0x81CC, ++ [20061] = 0x81CA, [20062] = 0x81C5, [20063] = 0x81C7, [20064] = 0x81BC, ++ [20065] = 0x81E9, [20066] = 0x825B, [20067] = 0x825A, [20068] = 0x825C, ++ [20069] = 0x8583, [20070] = 0x8580, [20071] = 0x858F, [20072] = 0x85A7, ++ [20073] = 0x8595, [20074] = 0x85A0, [20075] = 0x858B, [20076] = 0x85A3, ++ [20077] = 0x857B, [20078] = 0x85A4, [20079] = 0x859A, [20080] = 0x859E, ++ [20085] = 0x8577, [20086] = 0x857C, [20087] = 0x8589, [20088] = 0x85A1, ++ [20089] = 0x857A, [20090] = 0x8578, [20091] = 0x8557, [20092] = 0x858E, ++ [20093] = 0x8596, [20094] = 0x8586, [20095] = 0x858D, [20096] = 0x8599, ++ [20097] = 0x859D, [20098] = 0x8581, [20099] = 0x85A2, [20100] = 0x8582, ++ [20101] = 0x8588, [20102] = 0x8585, [20103] = 0x8579, [20104] = 0x8576, ++ [20105] = 0x8598, [20106] = 0x8590, [20107] = 0x859F, [20108] = 0x8668, ++ [20109] = 0x87BE, [20110] = 0x87AA, [20111] = 0x87AD, [20112] = 0x87C5, ++ [20113] = 0x87B0, [20114] = 0x87AC, [20115] = 0x87B9, [20116] = 0x87B5, ++ [20117] = 0x87BC, [20118] = 0x87AE, [20119] = 0x87C9, [20120] = 0x87C3, ++ [20121] = 0x87C2, [20122] = 0x87CC, [20123] = 0x87B7, [20124] = 0x87AF, ++ [20125] = 0x87C4, [20126] = 0x87CA, [20127] = 0x87B4, [20128] = 0x87B6, ++ [20129] = 0x87BF, [20130] = 0x87B8, [20131] = 0x87BD, [20132] = 0x87DE, ++ [20133] = 0x87B2, [20134] = 0x8935, [20135] = 0x8933, [20136] = 0x893C, ++ [20137] = 0x893E, [20138] = 0x8941, [20139] = 0x8952, [20140] = 0x8937, ++ [20141] = 0x8942, [20142] = 0x89AD, [20143] = 0x89AF, [20144] = 0x89AE, ++ [20145] = 0x89F2, [20146] = 0x89F3, [20147] = 0x8B1E, [20182] = 0x8B18, ++ [20183] = 0x8B16, [20184] = 0x8B11, [20185] = 0x8B05, [20186] = 0x8B0B, ++ [20187] = 0x8B22, [20188] = 0x8B0F, [20189] = 0x8B12, [20190] = 0x8B15, ++ [20191] = 0x8B07, [20192] = 0x8B0D, [20193] = 0x8B08, [20194] = 0x8B06, ++ [20195] = 0x8B1C, [20196] = 0x8B13, [20197] = 0x8B1A, [20198] = 0x8C4F, ++ [20199] = 0x8C70, [20200] = 0x8C72, [20201] = 0x8C71, [20202] = 0x8C6F, ++ [20203] = 0x8C95, [20204] = 0x8C94, [20205] = 0x8CF9, [20206] = 0x8D6F, ++ [20207] = 0x8E4E, [20208] = 0x8E4D, [20209] = 0x8E53, [20210] = 0x8E50, ++ [20211] = 0x8E4C, [20212] = 0x8E47, [20213] = 0x8F43, [20214] = 0x8F40, ++ [20215] = 0x9085, [20216] = 0x907E, [20217] = 0x9138, [20218] = 0x919A, ++ [20219] = 0x91A2, [20220] = 0x919B, [20221] = 0x9199, [20222] = 0x919F, ++ [20223] = 0x91A1, [20224] = 0x919D, [20225] = 0x91A0, [20226] = 0x93A1, ++ [20227] = 0x9383, [20228] = 0x93AF, [20229] = 0x9364, [20230] = 0x9356, ++ [20231] = 0x9347, [20232] = 0x937C, [20233] = 0x9358, [20234] = 0x935C, ++ [20235] = 0x9376, [20236] = 0x9349, [20237] = 0x9350, [20238] = 0x9351, ++ [20239] = 0x9360, [20240] = 0x936D, [20241] = 0x938F, [20242] = 0x934C, ++ [20243] = 0x936A, [20244] = 0x9379, [20245] = 0x9357, [20246] = 0x9355, ++ [20247] = 0x9352, [20248] = 0x934F, [20249] = 0x9371, [20250] = 0x9377, ++ [20251] = 0x937B, [20252] = 0x9361, [20253] = 0x935E, [20254] = 0x9363, ++ [20255] = 0x9367, [20256] = 0x9380, [20257] = 0x934E, [20258] = 0x9359, ++ [20259] = 0x95C7, [20260] = 0x95C0, [20261] = 0x95C9, [20262] = 0x95C3, ++ [20263] = 0x95C5, [20264] = 0x95B7, [20265] = 0x96AE, [20266] = 0x96B0, ++ [20267] = 0x96AC, [20268] = 0x9720, [20269] = 0x971F, [20270] = 0x9718, ++ [20271] = 0x971D, [20272] = 0x9719, [20273] = 0x979A, [20274] = 0x97A1, ++ [20275] = 0x979C, [20280] = 0x979E, [20281] = 0x979D, [20282] = 0x97D5, ++ [20283] = 0x97D4, [20284] = 0x97F1, [20285] = 0x9841, [20286] = 0x9844, ++ [20287] = 0x984A, [20288] = 0x9849, [20289] = 0x9845, [20290] = 0x9843, ++ [20291] = 0x9925, [20292] = 0x992B, [20293] = 0x992C, [20294] = 0x992A, ++ [20295] = 0x9933, [20296] = 0x9932, [20297] = 0x992F, [20298] = 0x992D, ++ [20299] = 0x9931, [20300] = 0x9930, [20301] = 0x9998, [20302] = 0x99A3, ++ [20303] = 0x99A1, [20304] = 0x9A02, [20305] = 0x99FA, [20306] = 0x99F4, ++ [20307] = 0x99F7, [20308] = 0x99F9, [20309] = 0x99F8, [20310] = 0x99F6, ++ [20311] = 0x99FB, [20312] = 0x99FD, [20313] = 0x99FE, [20314] = 0x99FC, ++ [20315] = 0x9A03, [20316] = 0x9ABE, [20317] = 0x9AFE, [20318] = 0x9AFD, ++ [20319] = 0x9B01, [20320] = 0x9AFC, [20321] = 0x9B48, [20322] = 0x9B9A, ++ [20323] = 0x9BA8, [20324] = 0x9B9E, [20325] = 0x9B9B, [20326] = 0x9BA6, ++ [20327] = 0x9BA1, [20328] = 0x9BA5, [20329] = 0x9BA4, [20330] = 0x9B86, ++ [20331] = 0x9BA2, [20332] = 0x9BA0, [20333] = 0x9BAF, [20334] = 0x9D33, ++ [20335] = 0x9D41, [20336] = 0x9D67, [20337] = 0x9D36, [20338] = 0x9D2E, ++ [20339] = 0x9D2F, [20340] = 0x9D31, [20341] = 0x9D38, [20342] = 0x9D30, ++ [20377] = 0x9D45, [20378] = 0x9D42, [20379] = 0x9D43, [20380] = 0x9D3E, ++ [20381] = 0x9D37, [20382] = 0x9D40, [20383] = 0x9D3D, [20384] = 0x7FF5, ++ [20385] = 0x9D2D, [20386] = 0x9E8A, [20387] = 0x9E89, [20388] = 0x9E8D, ++ [20389] = 0x9EB0, [20390] = 0x9EC8, [20391] = 0x9EDA, [20392] = 0x9EFB, ++ [20393] = 0x9EFF, [20394] = 0x9F24, [20395] = 0x9F23, [20396] = 0x9F22, ++ [20397] = 0x9F54, [20398] = 0x9FA0, [20399] = 0x5131, [20400] = 0x512D, ++ [20401] = 0x512E, [20402] = 0x5698, [20403] = 0x569C, [20404] = 0x5697, ++ [20405] = 0x569A, [20406] = 0x569D, [20407] = 0x5699, [20408] = 0x5970, ++ [20409] = 0x5B3C, [20410] = 0x5C69, [20411] = 0x5C6A, [20412] = 0x5DC0, ++ [20413] = 0x5E6D, [20414] = 0x5E6E, [20415] = 0x61D8, [20416] = 0x61DF, ++ [20417] = 0x61ED, [20418] = 0x61EE, [20419] = 0x61F1, [20420] = 0x61EA, ++ [20421] = 0x61F0, [20422] = 0x61EB, [20423] = 0x61D6, [20424] = 0x61E9, ++ [20425] = 0x64FF, [20426] = 0x6504, [20427] = 0x64FD, [20428] = 0x64F8, ++ [20429] = 0x6501, [20430] = 0x6503, [20431] = 0x64FC, [20432] = 0x6594, ++ [20433] = 0x65DB, [20434] = 0x66DA, [20435] = 0x66DB, [20436] = 0x66D8, ++ [20437] = 0x6AC5, [20438] = 0x6AB9, [20439] = 0x6ABD, [20440] = 0x6AE1, ++ [20441] = 0x6AC6, [20442] = 0x6ABA, [20443] = 0x6AB6, [20444] = 0x6AB7, ++ [20445] = 0x6AC7, [20446] = 0x6AB4, [20447] = 0x6AAD, [20448] = 0x6B5E, ++ [20449] = 0x6BC9, [20450] = 0x6C0B, [20451] = 0x7007, [20452] = 0x700C, ++ [20453] = 0x700D, [20454] = 0x7001, [20455] = 0x7005, [20456] = 0x7014, ++ [20457] = 0x700E, [20458] = 0x6FFF, [20459] = 0x7000, [20460] = 0x6FFB, ++ [20461] = 0x7026, [20462] = 0x6FFC, [20463] = 0x6FF7, [20464] = 0x700A, ++ [20465] = 0x7201, [20466] = 0x71FF, [20467] = 0x71F9, [20468] = 0x7203, ++ [20469] = 0x71FD, [20470] = 0x7376, [20475] = 0x74B8, [20476] = 0x74C0, ++ [20477] = 0x74B5, [20478] = 0x74C1, [20479] = 0x74BE, [20480] = 0x74B6, ++ [20481] = 0x74BB, [20482] = 0x74C2, [20483] = 0x7514, [20484] = 0x7513, ++ [20485] = 0x765C, [20486] = 0x7664, [20487] = 0x7659, [20488] = 0x7650, ++ [20489] = 0x7653, [20490] = 0x7657, [20491] = 0x765A, [20492] = 0x76A6, ++ [20493] = 0x76BD, [20494] = 0x76EC, [20495] = 0x77C2, [20496] = 0x77BA, ++ [20497] = 0x78FF, [20498] = 0x790C, [20499] = 0x7913, [20500] = 0x7914, ++ [20501] = 0x7909, [20502] = 0x7910, [20503] = 0x7912, [20504] = 0x7911, ++ [20505] = 0x79AD, [20506] = 0x79AC, [20507] = 0x7A5F, [20508] = 0x7C1C, ++ [20509] = 0x7C29, [20510] = 0x7C19, [20511] = 0x7C20, [20512] = 0x7C1F, ++ [20513] = 0x7C2D, [20514] = 0x7C1D, [20515] = 0x7C26, [20516] = 0x7C28, ++ [20517] = 0x7C22, [20518] = 0x7C25, [20519] = 0x7C30, [20520] = 0x7E5C, ++ [20521] = 0x7E50, [20522] = 0x7E56, [20523] = 0x7E63, [20524] = 0x7E58, ++ [20525] = 0x7E62, [20526] = 0x7E5F, [20527] = 0x7E51, [20528] = 0x7E60, ++ [20529] = 0x7E57, [20530] = 0x7E53, [20531] = 0x7FB5, [20532] = 0x7FB3, ++ [20533] = 0x7FF7, [20534] = 0x7FF8, [20535] = 0x8075, [20536] = 0x81D1, ++ [20537] = 0x81D2, [20572] = 0x81D0, [20573] = 0x825F, [20574] = 0x825E, ++ [20575] = 0x85B4, [20576] = 0x85C6, [20577] = 0x85C0, [20578] = 0x85C3, ++ [20579] = 0x85C2, [20580] = 0x85B3, [20581] = 0x85B5, [20582] = 0x85BD, ++ [20583] = 0x85C7, [20584] = 0x85C4, [20585] = 0x85BF, [20586] = 0x85CB, ++ [20587] = 0x85CE, [20588] = 0x85C8, [20589] = 0x85C5, [20590] = 0x85B1, ++ [20591] = 0x85B6, [20592] = 0x85D2, [20593] = 0x8624, [20594] = 0x85B8, ++ [20595] = 0x85B7, [20596] = 0x85BE, [20597] = 0x8669, [20598] = 0x87E7, ++ [20599] = 0x87E6, [20600] = 0x87E2, [20601] = 0x87DB, [20602] = 0x87EB, ++ [20603] = 0x87EA, [20604] = 0x87E5, [20605] = 0x87DF, [20606] = 0x87F3, ++ [20607] = 0x87E4, [20608] = 0x87D4, [20609] = 0x87DC, [20610] = 0x87D3, ++ [20611] = 0x87ED, [20612] = 0x87D8, [20613] = 0x87E3, [20614] = 0x87A4, ++ [20615] = 0x87D7, [20616] = 0x87D9, [20617] = 0x8801, [20618] = 0x87F4, ++ [20619] = 0x87E8, [20620] = 0x87DD, [20621] = 0x8953, [20622] = 0x894B, ++ [20623] = 0x894F, [20624] = 0x894C, [20625] = 0x8946, [20626] = 0x8950, ++ [20627] = 0x8951, [20628] = 0x8949, [20629] = 0x8B2A, [20630] = 0x8B27, ++ [20631] = 0x8B23, [20632] = 0x8B33, [20633] = 0x8B30, [20634] = 0x8B35, ++ [20635] = 0x8B47, [20636] = 0x8B2F, [20637] = 0x8B3C, [20638] = 0x8B3E, ++ [20639] = 0x8B31, [20640] = 0x8B25, [20641] = 0x8B37, [20642] = 0x8B26, ++ [20643] = 0x8B36, [20644] = 0x8B2E, [20645] = 0x8B24, [20646] = 0x8B3B, ++ [20647] = 0x8B3D, [20648] = 0x8B3A, [20649] = 0x8C42, [20650] = 0x8C75, ++ [20651] = 0x8C99, [20652] = 0x8C98, [20653] = 0x8C97, [20654] = 0x8CFE, ++ [20655] = 0x8D04, [20656] = 0x8D02, [20657] = 0x8D00, [20658] = 0x8E5C, ++ [20659] = 0x8E62, [20660] = 0x8E60, [20661] = 0x8E57, [20662] = 0x8E56, ++ [20663] = 0x8E5E, [20664] = 0x8E65, [20665] = 0x8E67, [20670] = 0x8E5B, ++ [20671] = 0x8E5A, [20672] = 0x8E61, [20673] = 0x8E5D, [20674] = 0x8E69, ++ [20675] = 0x8E54, [20676] = 0x8F46, [20677] = 0x8F47, [20678] = 0x8F48, ++ [20679] = 0x8F4B, [20680] = 0x9128, [20681] = 0x913A, [20682] = 0x913B, ++ [20683] = 0x913E, [20684] = 0x91A8, [20685] = 0x91A5, [20686] = 0x91A7, ++ [20687] = 0x91AF, [20688] = 0x91AA, [20689] = 0x93B5, [20690] = 0x938C, ++ [20691] = 0x9392, [20692] = 0x93B7, [20693] = 0x939B, [20694] = 0x939D, ++ [20695] = 0x9389, [20696] = 0x93A7, [20697] = 0x938E, [20698] = 0x93AA, ++ [20699] = 0x939E, [20700] = 0x93A6, [20701] = 0x9395, [20702] = 0x9388, ++ [20703] = 0x9399, [20704] = 0x939F, [20705] = 0x938D, [20706] = 0x93B1, ++ [20707] = 0x9391, [20708] = 0x93B2, [20709] = 0x93A4, [20710] = 0x93A8, ++ [20711] = 0x93B4, [20712] = 0x93A3, [20713] = 0x93A5, [20714] = 0x95D2, ++ [20715] = 0x95D3, [20716] = 0x95D1, [20717] = 0x96B3, [20718] = 0x96D7, ++ [20719] = 0x96DA, [20720] = 0x5DC2, [20721] = 0x96DF, [20722] = 0x96D8, ++ [20723] = 0x96DD, [20724] = 0x9723, [20725] = 0x9722, [20726] = 0x9725, ++ [20727] = 0x97AC, [20728] = 0x97AE, [20729] = 0x97A8, [20730] = 0x97AB, ++ [20731] = 0x97A4, [20732] = 0x97AA, [20767] = 0x97A2, [20768] = 0x97A5, ++ [20769] = 0x97D7, [20770] = 0x97D9, [20771] = 0x97D6, [20772] = 0x97D8, ++ [20773] = 0x97FA, [20774] = 0x9850, [20775] = 0x9851, [20776] = 0x9852, ++ [20777] = 0x98B8, [20778] = 0x9941, [20779] = 0x993C, [20780] = 0x993A, ++ [20781] = 0x9A0F, [20782] = 0x9A0B, [20783] = 0x9A09, [20784] = 0x9A0D, ++ [20785] = 0x9A04, [20786] = 0x9A11, [20787] = 0x9A0A, [20788] = 0x9A05, ++ [20789] = 0x9A07, [20790] = 0x9A06, [20791] = 0x9AC0, [20792] = 0x9ADC, ++ [20793] = 0x9B08, [20794] = 0x9B04, [20795] = 0x9B05, [20796] = 0x9B29, ++ [20797] = 0x9B35, [20798] = 0x9B4A, [20799] = 0x9B4C, [20800] = 0x9B4B, ++ [20801] = 0x9BC7, [20802] = 0x9BC6, [20803] = 0x9BC3, [20804] = 0x9BBF, ++ [20805] = 0x9BC1, [20806] = 0x9BB5, [20807] = 0x9BB8, [20808] = 0x9BD3, ++ [20809] = 0x9BB6, [20810] = 0x9BC4, [20811] = 0x9BB9, [20812] = 0x9BBD, ++ [20813] = 0x9D5C, [20814] = 0x9D53, [20815] = 0x9D4F, [20816] = 0x9D4A, ++ [20817] = 0x9D5B, [20818] = 0x9D4B, [20819] = 0x9D59, [20820] = 0x9D56, ++ [20821] = 0x9D4C, [20822] = 0x9D57, [20823] = 0x9D52, [20824] = 0x9D54, ++ [20825] = 0x9D5F, [20826] = 0x9D58, [20827] = 0x9D5A, [20828] = 0x9E8E, ++ [20829] = 0x9E8C, [20830] = 0x9EDF, [20831] = 0x9F01, [20832] = 0x9F00, ++ [20833] = 0x9F16, [20834] = 0x9F25, [20835] = 0x9F2B, [20836] = 0x9F2A, ++ [20837] = 0x9F29, [20838] = 0x9F28, [20839] = 0x9F4C, [20840] = 0x9F55, ++ [20841] = 0x5134, [20842] = 0x5135, [20843] = 0x5296, [20844] = 0x52F7, ++ [20845] = 0x53B4, [20846] = 0x56AB, [20847] = 0x56AD, [20848] = 0x56A6, ++ [20849] = 0x56A7, [20850] = 0x56AA, [20851] = 0x56AC, [20852] = 0x58DA, ++ [20853] = 0x58DD, [20854] = 0x58DB, [20855] = 0x5912, [20856] = 0x5B3D, ++ [20857] = 0x5B3E, [20858] = 0x5B3F, [20859] = 0x5DC3, [20860] = 0x5E70, ++ [20865] = 0x5FBF, [20866] = 0x61FB, [20867] = 0x6507, [20868] = 0x6510, ++ [20869] = 0x650D, [20870] = 0x6509, [20871] = 0x650C, [20872] = 0x650E, ++ [20873] = 0x6584, [20874] = 0x65DE, [20875] = 0x65DD, [20876] = 0x66DE, ++ [20877] = 0x6AE7, [20878] = 0x6AE0, [20879] = 0x6ACC, [20880] = 0x6AD1, ++ [20881] = 0x6AD9, [20882] = 0x6ACB, [20883] = 0x6ADF, [20884] = 0x6ADC, ++ [20885] = 0x6AD0, [20886] = 0x6AEB, [20887] = 0x6ACF, [20888] = 0x6ACD, ++ [20889] = 0x6ADE, [20890] = 0x6B60, [20891] = 0x6BB0, [20892] = 0x6C0C, ++ [20893] = 0x7019, [20894] = 0x7027, [20895] = 0x7020, [20896] = 0x7016, ++ [20897] = 0x702B, [20898] = 0x7021, [20899] = 0x7022, [20900] = 0x7023, ++ [20901] = 0x7029, [20902] = 0x7017, [20903] = 0x7024, [20904] = 0x701C, ++ [20905] = 0x702A, [20906] = 0x720C, [20907] = 0x720A, [20908] = 0x7207, ++ [20909] = 0x7202, [20910] = 0x7205, [20911] = 0x72A5, [20912] = 0x72A6, ++ [20913] = 0x72A4, [20914] = 0x72A3, [20915] = 0x72A1, [20916] = 0x74CB, ++ [20917] = 0x74C5, [20918] = 0x74B7, [20919] = 0x74C3, [20920] = 0x7516, ++ [20921] = 0x7660, [20922] = 0x77C9, [20923] = 0x77CA, [20924] = 0x77C4, ++ [20925] = 0x77F1, [20926] = 0x791D, [20927] = 0x791B, [20962] = 0x7921, ++ [20963] = 0x791C, [20964] = 0x7917, [20965] = 0x791E, [20966] = 0x79B0, ++ [20967] = 0x7A67, [20968] = 0x7A68, [20969] = 0x7C33, [20970] = 0x7C3C, ++ [20971] = 0x7C39, [20972] = 0x7C2C, [20973] = 0x7C3B, [20974] = 0x7CEC, ++ [20975] = 0x7CEA, [20976] = 0x7E76, [20977] = 0x7E75, [20978] = 0x7E78, ++ [20979] = 0x7E70, [20980] = 0x7E77, [20981] = 0x7E6F, [20982] = 0x7E7A, ++ [20983] = 0x7E72, [20984] = 0x7E74, [20985] = 0x7E68, [20986] = 0x7F4B, ++ [20987] = 0x7F4A, [20988] = 0x7F83, [20989] = 0x7F86, [20990] = 0x7FB7, ++ [20991] = 0x7FFD, [20992] = 0x7FFE, [20993] = 0x8078, [20994] = 0x81D7, ++ [20995] = 0x81D5, [20996] = 0x8264, [20997] = 0x8261, [20998] = 0x8263, ++ [20999] = 0x85EB, [21000] = 0x85F1, [21001] = 0x85ED, [21002] = 0x85D9, ++ [21003] = 0x85E1, [21004] = 0x85E8, [21005] = 0x85DA, [21006] = 0x85D7, ++ [21007] = 0x85EC, [21008] = 0x85F2, [21009] = 0x85F8, [21010] = 0x85D8, ++ [21011] = 0x85DF, [21012] = 0x85E3, [21013] = 0x85DC, [21014] = 0x85D1, ++ [21015] = 0x85F0, [21016] = 0x85E6, [21017] = 0x85EF, [21018] = 0x85DE, ++ [21019] = 0x85E2, [21020] = 0x8800, [21021] = 0x87FA, [21022] = 0x8803, ++ [21023] = 0x87F6, [21024] = 0x87F7, [21025] = 0x8809, [21026] = 0x880C, ++ [21027] = 0x880B, [21028] = 0x8806, [21029] = 0x87FC, [21030] = 0x8808, ++ [21031] = 0x87FF, [21032] = 0x880A, [21033] = 0x8802, [21034] = 0x8962, ++ [21035] = 0x895A, [21036] = 0x895B, [21037] = 0x8957, [21038] = 0x8961, ++ [21039] = 0x895C, [21040] = 0x8958, [21041] = 0x895D, [21042] = 0x8959, ++ [21043] = 0x8988, [21044] = 0x89B7, [21045] = 0x89B6, [21046] = 0x89F6, ++ [21047] = 0x8B50, [21048] = 0x8B48, [21049] = 0x8B4A, [21050] = 0x8B40, ++ [21051] = 0x8B53, [21052] = 0x8B56, [21053] = 0x8B54, [21054] = 0x8B4B, ++ [21055] = 0x8B55, [21060] = 0x8B51, [21061] = 0x8B42, [21062] = 0x8B52, ++ [21063] = 0x8B57, [21064] = 0x8C43, [21065] = 0x8C77, [21066] = 0x8C76, ++ [21067] = 0x8C9A, [21068] = 0x8D06, [21069] = 0x8D07, [21070] = 0x8D09, ++ [21071] = 0x8DAC, [21072] = 0x8DAA, [21073] = 0x8DAD, [21074] = 0x8DAB, ++ [21075] = 0x8E6D, [21076] = 0x8E78, [21077] = 0x8E73, [21078] = 0x8E6A, ++ [21079] = 0x8E6F, [21080] = 0x8E7B, [21081] = 0x8EC2, [21082] = 0x8F52, ++ [21083] = 0x8F51, [21084] = 0x8F4F, [21085] = 0x8F50, [21086] = 0x8F53, ++ [21087] = 0x8FB4, [21088] = 0x9140, [21089] = 0x913F, [21090] = 0x91B0, ++ [21091] = 0x91AD, [21092] = 0x93DE, [21093] = 0x93C7, [21094] = 0x93CF, ++ [21095] = 0x93C2, [21096] = 0x93DA, [21097] = 0x93D0, [21098] = 0x93F9, ++ [21099] = 0x93EC, [21100] = 0x93CC, [21101] = 0x93D9, [21102] = 0x93A9, ++ [21103] = 0x93E6, [21104] = 0x93CA, [21105] = 0x93D4, [21106] = 0x93EE, ++ [21107] = 0x93E3, [21108] = 0x93D5, [21109] = 0x93C4, [21110] = 0x93CE, ++ [21111] = 0x93C0, [21112] = 0x93D2, [21113] = 0x93E7, [21114] = 0x957D, ++ [21115] = 0x95DA, [21116] = 0x95DB, [21117] = 0x96E1, [21118] = 0x9729, ++ [21119] = 0x972B, [21120] = 0x972C, [21121] = 0x9728, [21122] = 0x9726, ++ [21157] = 0x97B3, [21158] = 0x97B7, [21159] = 0x97B6, [21160] = 0x97DD, ++ [21161] = 0x97DE, [21162] = 0x97DF, [21163] = 0x985C, [21164] = 0x9859, ++ [21165] = 0x985D, [21166] = 0x9857, [21167] = 0x98BF, [21168] = 0x98BD, ++ [21169] = 0x98BB, [21170] = 0x98BE, [21171] = 0x9948, [21172] = 0x9947, ++ [21173] = 0x9943, [21174] = 0x99A6, [21175] = 0x99A7, [21176] = 0x9A1A, ++ [21177] = 0x9A15, [21178] = 0x9A25, [21179] = 0x9A1D, [21180] = 0x9A24, ++ [21181] = 0x9A1B, [21182] = 0x9A22, [21183] = 0x9A20, [21184] = 0x9A27, ++ [21185] = 0x9A23, [21186] = 0x9A1E, [21187] = 0x9A1C, [21188] = 0x9A14, ++ [21189] = 0x9AC2, [21190] = 0x9B0B, [21191] = 0x9B0A, [21192] = 0x9B0E, ++ [21193] = 0x9B0C, [21194] = 0x9B37, [21195] = 0x9BEA, [21196] = 0x9BEB, ++ [21197] = 0x9BE0, [21198] = 0x9BDE, [21199] = 0x9BE4, [21200] = 0x9BE6, ++ [21201] = 0x9BE2, [21202] = 0x9BF0, [21203] = 0x9BD4, [21204] = 0x9BD7, ++ [21205] = 0x9BEC, [21206] = 0x9BDC, [21207] = 0x9BD9, [21208] = 0x9BE5, ++ [21209] = 0x9BD5, [21210] = 0x9BE1, [21211] = 0x9BDA, [21212] = 0x9D77, ++ [21213] = 0x9D81, [21214] = 0x9D8A, [21215] = 0x9D84, [21216] = 0x9D88, ++ [21217] = 0x9D71, [21218] = 0x9D80, [21219] = 0x9D78, [21220] = 0x9D86, ++ [21221] = 0x9D8B, [21222] = 0x9D8C, [21223] = 0x9D7D, [21224] = 0x9D6B, ++ [21225] = 0x9D74, [21226] = 0x9D75, [21227] = 0x9D70, [21228] = 0x9D69, ++ [21229] = 0x9D85, [21230] = 0x9D73, [21231] = 0x9D7B, [21232] = 0x9D82, ++ [21233] = 0x9D6F, [21234] = 0x9D79, [21235] = 0x9D7F, [21236] = 0x9D87, ++ [21237] = 0x9D68, [21238] = 0x9E94, [21239] = 0x9E91, [21240] = 0x9EC0, ++ [21241] = 0x9EFC, [21242] = 0x9F2D, [21243] = 0x9F40, [21244] = 0x9F41, ++ [21245] = 0x9F4D, [21246] = 0x9F56, [21247] = 0x9F57, [21248] = 0x9F58, ++ [21249] = 0x5337, [21250] = 0x56B2, [21255] = 0x56B5, [21256] = 0x56B3, ++ [21257] = 0x58E3, [21258] = 0x5B45, [21259] = 0x5DC6, [21260] = 0x5DC7, ++ [21261] = 0x5EEE, [21262] = 0x5EEF, [21263] = 0x5FC0, [21264] = 0x5FC1, ++ [21265] = 0x61F9, [21266] = 0x6517, [21267] = 0x6516, [21268] = 0x6515, ++ [21269] = 0x6513, [21270] = 0x65DF, [21271] = 0x66E8, [21272] = 0x66E3, ++ [21273] = 0x66E4, [21274] = 0x6AF3, [21275] = 0x6AF0, [21276] = 0x6AEA, ++ [21277] = 0x6AE8, [21278] = 0x6AF9, [21279] = 0x6AF1, [21280] = 0x6AEE, ++ [21281] = 0x6AEF, [21282] = 0x703C, [21283] = 0x7035, [21284] = 0x702F, ++ [21285] = 0x7037, [21286] = 0x7034, [21287] = 0x7031, [21288] = 0x7042, ++ [21289] = 0x7038, [21290] = 0x703F, [21291] = 0x703A, [21292] = 0x7039, ++ [21293] = 0x7040, [21294] = 0x703B, [21295] = 0x7033, [21296] = 0x7041, ++ [21297] = 0x7213, [21298] = 0x7214, [21299] = 0x72A8, [21300] = 0x737D, ++ [21301] = 0x737C, [21302] = 0x74BA, [21303] = 0x76AB, [21304] = 0x76AA, ++ [21305] = 0x76BE, [21306] = 0x76ED, [21307] = 0x77CC, [21308] = 0x77CE, ++ [21309] = 0x77CF, [21310] = 0x77CD, [21311] = 0x77F2, [21312] = 0x7925, ++ [21313] = 0x7923, [21314] = 0x7927, [21315] = 0x7928, [21316] = 0x7924, ++ [21317] = 0x7929, [21352] = 0x79B2, [21353] = 0x7A6E, [21354] = 0x7A6C, ++ [21355] = 0x7A6D, [21356] = 0x7AF7, [21357] = 0x7C49, [21358] = 0x7C48, ++ [21359] = 0x7C4A, [21360] = 0x7C47, [21361] = 0x7C45, [21362] = 0x7CEE, ++ [21363] = 0x7E7B, [21364] = 0x7E7E, [21365] = 0x7E81, [21366] = 0x7E80, ++ [21367] = 0x7FBA, [21368] = 0x7FFF, [21369] = 0x8079, [21370] = 0x81DB, ++ [21371] = 0x81D9, [21372] = 0x820B, [21373] = 0x8268, [21374] = 0x8269, ++ [21375] = 0x8622, [21376] = 0x85FF, [21377] = 0x8601, [21378] = 0x85FE, ++ [21379] = 0x861B, [21380] = 0x8600, [21381] = 0x85F6, [21382] = 0x8604, ++ [21383] = 0x8609, [21384] = 0x8605, [21385] = 0x860C, [21386] = 0x85FD, ++ [21387] = 0x8819, [21388] = 0x8810, [21389] = 0x8811, [21390] = 0x8817, ++ [21391] = 0x8813, [21392] = 0x8816, [21393] = 0x8963, [21394] = 0x8966, ++ [21395] = 0x89B9, [21396] = 0x89F7, [21397] = 0x8B60, [21398] = 0x8B6A, ++ [21399] = 0x8B5D, [21400] = 0x8B68, [21401] = 0x8B63, [21402] = 0x8B65, ++ [21403] = 0x8B67, [21404] = 0x8B6D, [21405] = 0x8DAE, [21406] = 0x8E86, ++ [21407] = 0x8E88, [21408] = 0x8E84, [21409] = 0x8F59, [21410] = 0x8F56, ++ [21411] = 0x8F57, [21412] = 0x8F55, [21413] = 0x8F58, [21414] = 0x8F5A, ++ [21415] = 0x908D, [21416] = 0x9143, [21417] = 0x9141, [21418] = 0x91B7, ++ [21419] = 0x91B5, [21420] = 0x91B2, [21421] = 0x91B3, [21422] = 0x940B, ++ [21423] = 0x9413, [21424] = 0x93FB, [21425] = 0x9420, [21426] = 0x940F, ++ [21427] = 0x9414, [21428] = 0x93FE, [21429] = 0x9415, [21430] = 0x9410, ++ [21431] = 0x9428, [21432] = 0x9419, [21433] = 0x940D, [21434] = 0x93F5, ++ [21435] = 0x9400, [21436] = 0x93F7, [21437] = 0x9407, [21438] = 0x940E, ++ [21439] = 0x9416, [21440] = 0x9412, [21441] = 0x93FA, [21442] = 0x9409, ++ [21443] = 0x93F8, [21444] = 0x940A, [21445] = 0x93FF, [21450] = 0x93FC, ++ [21451] = 0x940C, [21452] = 0x93F6, [21453] = 0x9411, [21454] = 0x9406, ++ [21455] = 0x95DE, [21456] = 0x95E0, [21457] = 0x95DF, [21458] = 0x972E, ++ [21459] = 0x972F, [21460] = 0x97B9, [21461] = 0x97BB, [21462] = 0x97FD, ++ [21463] = 0x97FE, [21464] = 0x9860, [21465] = 0x9862, [21466] = 0x9863, ++ [21467] = 0x985F, [21468] = 0x98C1, [21469] = 0x98C2, [21470] = 0x9950, ++ [21471] = 0x994E, [21472] = 0x9959, [21473] = 0x994C, [21474] = 0x994B, ++ [21475] = 0x9953, [21476] = 0x9A32, [21477] = 0x9A34, [21478] = 0x9A31, ++ [21479] = 0x9A2C, [21480] = 0x9A2A, [21481] = 0x9A36, [21482] = 0x9A29, ++ [21483] = 0x9A2E, [21484] = 0x9A38, [21485] = 0x9A2D, [21486] = 0x9AC7, ++ [21487] = 0x9ACA, [21488] = 0x9AC6, [21489] = 0x9B10, [21490] = 0x9B12, ++ [21491] = 0x9B11, [21492] = 0x9C0B, [21493] = 0x9C08, [21494] = 0x9BF7, ++ [21495] = 0x9C05, [21496] = 0x9C12, [21497] = 0x9BF8, [21498] = 0x9C40, ++ [21499] = 0x9C07, [21500] = 0x9C0E, [21501] = 0x9C06, [21502] = 0x9C17, ++ [21503] = 0x9C14, [21504] = 0x9C09, [21505] = 0x9D9F, [21506] = 0x9D99, ++ [21507] = 0x9DA4, [21508] = 0x9D9D, [21509] = 0x9D92, [21510] = 0x9D98, ++ [21511] = 0x9D90, [21512] = 0x9D9B, [21547] = 0x9DA0, [21548] = 0x9D94, ++ [21549] = 0x9D9C, [21550] = 0x9DAA, [21551] = 0x9D97, [21552] = 0x9DA1, ++ [21553] = 0x9D9A, [21554] = 0x9DA2, [21555] = 0x9DA8, [21556] = 0x9D9E, ++ [21557] = 0x9DA3, [21558] = 0x9DBF, [21559] = 0x9DA9, [21560] = 0x9D96, ++ [21561] = 0x9DA6, [21562] = 0x9DA7, [21563] = 0x9E99, [21564] = 0x9E9B, ++ [21565] = 0x9E9A, [21566] = 0x9EE5, [21567] = 0x9EE4, [21568] = 0x9EE7, ++ [21569] = 0x9EE6, [21570] = 0x9F30, [21571] = 0x9F2E, [21572] = 0x9F5B, ++ [21573] = 0x9F60, [21574] = 0x9F5E, [21575] = 0x9F5D, [21576] = 0x9F59, ++ [21577] = 0x9F91, [21578] = 0x513A, [21579] = 0x5139, [21580] = 0x5298, ++ [21581] = 0x5297, [21582] = 0x56C3, [21583] = 0x56BD, [21584] = 0x56BE, ++ [21585] = 0x5B48, [21586] = 0x5B47, [21587] = 0x5DCB, [21588] = 0x5DCF, ++ [21589] = 0x5EF1, [21590] = 0x61FD, [21591] = 0x651B, [21592] = 0x6B02, ++ [21593] = 0x6AFC, [21594] = 0x6B03, [21595] = 0x6AF8, [21596] = 0x6B00, ++ [21597] = 0x7043, [21598] = 0x7044, [21599] = 0x704A, [21600] = 0x7048, ++ [21601] = 0x7049, [21602] = 0x7045, [21603] = 0x7046, [21604] = 0x721D, ++ [21605] = 0x721A, [21606] = 0x7219, [21607] = 0x737E, [21608] = 0x7517, ++ [21609] = 0x766A, [21610] = 0x77D0, [21611] = 0x792D, [21612] = 0x7931, ++ [21613] = 0x792F, [21614] = 0x7C54, [21615] = 0x7C53, [21616] = 0x7CF2, ++ [21617] = 0x7E8A, [21618] = 0x7E87, [21619] = 0x7E88, [21620] = 0x7E8B, ++ [21621] = 0x7E86, [21622] = 0x7E8D, [21623] = 0x7F4D, [21624] = 0x7FBB, ++ [21625] = 0x8030, [21626] = 0x81DD, [21627] = 0x8618, [21628] = 0x862A, ++ [21629] = 0x8626, [21630] = 0x861F, [21631] = 0x8623, [21632] = 0x861C, ++ [21633] = 0x8619, [21634] = 0x8627, [21635] = 0x862E, [21636] = 0x8621, ++ [21637] = 0x8620, [21638] = 0x8629, [21639] = 0x861E, [21640] = 0x8625, ++ [21645] = 0x8829, [21646] = 0x881D, [21647] = 0x881B, [21648] = 0x8820, ++ [21649] = 0x8824, [21650] = 0x881C, [21651] = 0x882B, [21652] = 0x884A, ++ [21653] = 0x896D, [21654] = 0x8969, [21655] = 0x896E, [21656] = 0x896B, ++ [21657] = 0x89FA, [21658] = 0x8B79, [21659] = 0x8B78, [21660] = 0x8B45, ++ [21661] = 0x8B7A, [21662] = 0x8B7B, [21663] = 0x8D10, [21664] = 0x8D14, ++ [21665] = 0x8DAF, [21666] = 0x8E8E, [21667] = 0x8E8C, [21668] = 0x8F5E, ++ [21669] = 0x8F5B, [21670] = 0x8F5D, [21671] = 0x9146, [21672] = 0x9144, ++ [21673] = 0x9145, [21674] = 0x91B9, [21675] = 0x943F, [21676] = 0x943B, ++ [21677] = 0x9436, [21678] = 0x9429, [21679] = 0x943D, [21680] = 0x943C, ++ [21681] = 0x9430, [21682] = 0x9439, [21683] = 0x942A, [21684] = 0x9437, ++ [21685] = 0x942C, [21686] = 0x9440, [21687] = 0x9431, [21688] = 0x95E5, ++ [21689] = 0x95E4, [21690] = 0x95E3, [21691] = 0x9735, [21692] = 0x973A, ++ [21693] = 0x97BF, [21694] = 0x97E1, [21695] = 0x9864, [21696] = 0x98C9, ++ [21697] = 0x98C6, [21698] = 0x98C0, [21699] = 0x9958, [21700] = 0x9956, ++ [21701] = 0x9A39, [21702] = 0x9A3D, [21703] = 0x9A46, [21704] = 0x9A44, ++ [21705] = 0x9A42, [21706] = 0x9A41, [21707] = 0x9A3A, [21742] = 0x9A3F, ++ [21743] = 0x9ACD, [21744] = 0x9B15, [21745] = 0x9B17, [21746] = 0x9B18, ++ [21747] = 0x9B16, [21748] = 0x9B3A, [21749] = 0x9B52, [21750] = 0x9C2B, ++ [21751] = 0x9C1D, [21752] = 0x9C1C, [21753] = 0x9C2C, [21754] = 0x9C23, ++ [21755] = 0x9C28, [21756] = 0x9C29, [21757] = 0x9C24, [21758] = 0x9C21, ++ [21759] = 0x9DB7, [21760] = 0x9DB6, [21761] = 0x9DBC, [21762] = 0x9DC1, ++ [21763] = 0x9DC7, [21764] = 0x9DCA, [21765] = 0x9DCF, [21766] = 0x9DBE, ++ [21767] = 0x9DC5, [21768] = 0x9DC3, [21769] = 0x9DBB, [21770] = 0x9DB5, ++ [21771] = 0x9DCE, [21772] = 0x9DB9, [21773] = 0x9DBA, [21774] = 0x9DAC, ++ [21775] = 0x9DC8, [21776] = 0x9DB1, [21777] = 0x9DAD, [21778] = 0x9DCC, ++ [21779] = 0x9DB3, [21780] = 0x9DCD, [21781] = 0x9DB2, [21782] = 0x9E7A, ++ [21783] = 0x9E9C, [21784] = 0x9EEB, [21785] = 0x9EEE, [21786] = 0x9EED, ++ [21787] = 0x9F1B, [21788] = 0x9F18, [21789] = 0x9F1A, [21790] = 0x9F31, ++ [21791] = 0x9F4E, [21792] = 0x9F65, [21793] = 0x9F64, [21794] = 0x9F92, ++ [21795] = 0x4EB9, [21796] = 0x56C6, [21797] = 0x56C5, [21798] = 0x56CB, ++ [21799] = 0x5971, [21800] = 0x5B4B, [21801] = 0x5B4C, [21802] = 0x5DD5, ++ [21803] = 0x5DD1, [21804] = 0x5EF2, [21805] = 0x6521, [21806] = 0x6520, ++ [21807] = 0x6526, [21808] = 0x6522, [21809] = 0x6B0B, [21810] = 0x6B08, ++ [21811] = 0x6B09, [21812] = 0x6C0D, [21813] = 0x7055, [21814] = 0x7056, ++ [21815] = 0x7057, [21816] = 0x7052, [21817] = 0x721E, [21818] = 0x721F, ++ [21819] = 0x72A9, [21820] = 0x737F, [21821] = 0x74D8, [21822] = 0x74D5, ++ [21823] = 0x74D9, [21824] = 0x74D7, [21825] = 0x766D, [21826] = 0x76AD, ++ [21827] = 0x7935, [21828] = 0x79B4, [21829] = 0x7A70, [21830] = 0x7A71, ++ [21831] = 0x7C57, [21832] = 0x7C5C, [21833] = 0x7C59, [21834] = 0x7C5B, ++ [21835] = 0x7C5A, [21840] = 0x7CF4, [21841] = 0x7CF1, [21842] = 0x7E91, ++ [21843] = 0x7F4F, [21844] = 0x7F87, [21845] = 0x81DE, [21846] = 0x826B, ++ [21847] = 0x8634, [21848] = 0x8635, [21849] = 0x8633, [21850] = 0x862C, ++ [21851] = 0x8632, [21852] = 0x8636, [21853] = 0x882C, [21854] = 0x8828, ++ [21855] = 0x8826, [21856] = 0x882A, [21857] = 0x8825, [21858] = 0x8971, ++ [21859] = 0x89BF, [21860] = 0x89BE, [21861] = 0x89FB, [21862] = 0x8B7E, ++ [21863] = 0x8B84, [21864] = 0x8B82, [21865] = 0x8B86, [21866] = 0x8B85, ++ [21867] = 0x8B7F, [21868] = 0x8D15, [21869] = 0x8E95, [21870] = 0x8E94, ++ [21871] = 0x8E9A, [21872] = 0x8E92, [21873] = 0x8E90, [21874] = 0x8E96, ++ [21875] = 0x8E97, [21876] = 0x8F60, [21877] = 0x8F62, [21878] = 0x9147, ++ [21879] = 0x944C, [21880] = 0x9450, [21881] = 0x944A, [21882] = 0x944B, ++ [21883] = 0x944F, [21884] = 0x9447, [21885] = 0x9445, [21886] = 0x9448, ++ [21887] = 0x9449, [21888] = 0x9446, [21889] = 0x973F, [21890] = 0x97E3, ++ [21891] = 0x986A, [21892] = 0x9869, [21893] = 0x98CB, [21894] = 0x9954, ++ [21895] = 0x995B, [21896] = 0x9A4E, [21897] = 0x9A53, [21898] = 0x9A54, ++ [21899] = 0x9A4C, [21900] = 0x9A4F, [21901] = 0x9A48, [21902] = 0x9A4A, ++ [21937] = 0x9A49, [21938] = 0x9A52, [21939] = 0x9A50, [21940] = 0x9AD0, ++ [21941] = 0x9B19, [21942] = 0x9B2B, [21943] = 0x9B3B, [21944] = 0x9B56, ++ [21945] = 0x9B55, [21946] = 0x9C46, [21947] = 0x9C48, [21948] = 0x9C3F, ++ [21949] = 0x9C44, [21950] = 0x9C39, [21951] = 0x9C33, [21952] = 0x9C41, ++ [21953] = 0x9C3C, [21954] = 0x9C37, [21955] = 0x9C34, [21956] = 0x9C32, ++ [21957] = 0x9C3D, [21958] = 0x9C36, [21959] = 0x9DDB, [21960] = 0x9DD2, ++ [21961] = 0x9DDE, [21962] = 0x9DDA, [21963] = 0x9DCB, [21964] = 0x9DD0, ++ [21965] = 0x9DDC, [21966] = 0x9DD1, [21967] = 0x9DDF, [21968] = 0x9DE9, ++ [21969] = 0x9DD9, [21970] = 0x9DD8, [21971] = 0x9DD6, [21972] = 0x9DF5, ++ [21973] = 0x9DD5, [21974] = 0x9DDD, [21975] = 0x9EB6, [21976] = 0x9EF0, ++ [21977] = 0x9F35, [21978] = 0x9F33, [21979] = 0x9F32, [21980] = 0x9F42, ++ [21981] = 0x9F6B, [21982] = 0x9F95, [21983] = 0x9FA2, [21984] = 0x513D, ++ [21985] = 0x5299, [21986] = 0x58E8, [21987] = 0x58E7, [21988] = 0x5972, ++ [21989] = 0x5B4D, [21990] = 0x5DD8, [21991] = 0x882F, [21992] = 0x5F4F, ++ [21993] = 0x6201, [21994] = 0x6203, [21995] = 0x6204, [21996] = 0x6529, ++ [21997] = 0x6525, [21998] = 0x6596, [21999] = 0x66EB, [22000] = 0x6B11, ++ [22001] = 0x6B12, [22002] = 0x6B0F, [22003] = 0x6BCA, [22004] = 0x705B, ++ [22005] = 0x705A, [22006] = 0x7222, [22007] = 0x7382, [22008] = 0x7381, ++ [22009] = 0x7383, [22010] = 0x7670, [22011] = 0x77D4, [22012] = 0x7C67, ++ [22013] = 0x7C66, [22014] = 0x7E95, [22015] = 0x826C, [22016] = 0x863A, ++ [22017] = 0x8640, [22018] = 0x8639, [22019] = 0x863C, [22020] = 0x8631, ++ [22021] = 0x863B, [22022] = 0x863E, [22023] = 0x8830, [22024] = 0x8832, ++ [22025] = 0x882E, [22026] = 0x8833, [22027] = 0x8976, [22028] = 0x8974, ++ [22029] = 0x8973, [22030] = 0x89FE, [22035] = 0x8B8C, [22036] = 0x8B8E, ++ [22037] = 0x8B8B, [22038] = 0x8B88, [22039] = 0x8C45, [22040] = 0x8D19, ++ [22041] = 0x8E98, [22042] = 0x8F64, [22043] = 0x8F63, [22044] = 0x91BC, ++ [22045] = 0x9462, [22046] = 0x9455, [22047] = 0x945D, [22048] = 0x9457, ++ [22049] = 0x945E, [22050] = 0x97C4, [22051] = 0x97C5, [22052] = 0x9800, ++ [22053] = 0x9A56, [22054] = 0x9A59, [22055] = 0x9B1E, [22056] = 0x9B1F, ++ [22057] = 0x9B20, [22058] = 0x9C52, [22059] = 0x9C58, [22060] = 0x9C50, ++ [22061] = 0x9C4A, [22062] = 0x9C4D, [22063] = 0x9C4B, [22064] = 0x9C55, ++ [22065] = 0x9C59, [22066] = 0x9C4C, [22067] = 0x9C4E, [22068] = 0x9DFB, ++ [22069] = 0x9DF7, [22070] = 0x9DEF, [22071] = 0x9DE3, [22072] = 0x9DEB, ++ [22073] = 0x9DF8, [22074] = 0x9DE4, [22075] = 0x9DF6, [22076] = 0x9DE1, ++ [22077] = 0x9DEE, [22078] = 0x9DE6, [22079] = 0x9DF2, [22080] = 0x9DF0, ++ [22081] = 0x9DE2, [22082] = 0x9DEC, [22083] = 0x9DF4, [22084] = 0x9DF3, ++ [22085] = 0x9DE8, [22086] = 0x9DED, [22087] = 0x9EC2, [22088] = 0x9ED0, ++ [22089] = 0x9EF2, [22090] = 0x9EF3, [22091] = 0x9F06, [22092] = 0x9F1C, ++ [22093] = 0x9F38, [22094] = 0x9F37, [22095] = 0x9F36, [22096] = 0x9F43, ++ [22097] = 0x9F4F, [22132] = 0x9F71, [22133] = 0x9F70, [22134] = 0x9F6E, ++ [22135] = 0x9F6F, [22136] = 0x56D3, [22137] = 0x56CD, [22138] = 0x5B4E, ++ [22139] = 0x5C6D, [22140] = 0x652D, [22141] = 0x66ED, [22142] = 0x66EE, ++ [22143] = 0x6B13, [22144] = 0x705F, [22145] = 0x7061, [22146] = 0x705D, ++ [22147] = 0x7060, [22148] = 0x7223, [22149] = 0x74DB, [22150] = 0x74E5, ++ [22151] = 0x77D5, [22152] = 0x7938, [22153] = 0x79B7, [22154] = 0x79B6, ++ [22155] = 0x7C6A, [22156] = 0x7E97, [22157] = 0x7F89, [22158] = 0x826D, ++ [22159] = 0x8643, [22160] = 0x8838, [22161] = 0x8837, [22162] = 0x8835, ++ [22163] = 0x884B, [22164] = 0x8B94, [22165] = 0x8B95, [22166] = 0x8E9E, ++ [22167] = 0x8E9F, [22168] = 0x8EA0, [22169] = 0x8E9D, [22170] = 0x91BE, ++ [22171] = 0x91BD, [22172] = 0x91C2, [22173] = 0x946B, [22174] = 0x9468, ++ [22175] = 0x9469, [22176] = 0x96E5, [22177] = 0x9746, [22178] = 0x9743, ++ [22179] = 0x9747, [22180] = 0x97C7, [22181] = 0x97E5, [22182] = 0x9A5E, ++ [22183] = 0x9AD5, [22184] = 0x9B59, [22185] = 0x9C63, [22186] = 0x9C67, ++ [22187] = 0x9C66, [22188] = 0x9C62, [22189] = 0x9C5E, [22190] = 0x9C60, ++ [22191] = 0x9E02, [22192] = 0x9DFE, [22193] = 0x9E07, [22194] = 0x9E03, ++ [22195] = 0x9E06, [22196] = 0x9E05, [22197] = 0x9E00, [22198] = 0x9E01, ++ [22199] = 0x9E09, [22200] = 0x9DFF, [22201] = 0x9DFD, [22202] = 0x9E04, ++ [22203] = 0x9EA0, [22204] = 0x9F1E, [22205] = 0x9F46, [22206] = 0x9F74, ++ [22207] = 0x9F75, [22208] = 0x9F76, [22209] = 0x56D4, [22210] = 0x652E, ++ [22211] = 0x65B8, [22212] = 0x6B18, [22213] = 0x6B19, [22214] = 0x6B17, ++ [22215] = 0x6B1A, [22216] = 0x7062, [22217] = 0x7226, [22218] = 0x72AA, ++ [22219] = 0x77D8, [22220] = 0x77D9, [22221] = 0x7939, [22222] = 0x7C69, ++ [22223] = 0x7C6B, [22224] = 0x7CF6, [22225] = 0x7E9A, [22230] = 0x7E98, ++ [22231] = 0x7E9B, [22232] = 0x7E99, [22233] = 0x81E0, [22234] = 0x81E1, ++ [22235] = 0x8646, [22236] = 0x8647, [22237] = 0x8648, [22238] = 0x8979, ++ [22239] = 0x897A, [22240] = 0x897C, [22241] = 0x897B, [22242] = 0x89FF, ++ [22243] = 0x8B98, [22244] = 0x8B99, [22245] = 0x8EA5, [22246] = 0x8EA4, ++ [22247] = 0x8EA3, [22248] = 0x946E, [22249] = 0x946D, [22250] = 0x946F, ++ [22251] = 0x9471, [22252] = 0x9473, [22253] = 0x9749, [22254] = 0x9872, ++ [22255] = 0x995F, [22256] = 0x9C68, [22257] = 0x9C6E, [22258] = 0x9C6D, ++ [22259] = 0x9E0B, [22260] = 0x9E0D, [22261] = 0x9E10, [22262] = 0x9E0F, ++ [22263] = 0x9E12, [22264] = 0x9E11, [22265] = 0x9EA1, [22266] = 0x9EF5, ++ [22267] = 0x9F09, [22268] = 0x9F47, [22269] = 0x9F78, [22270] = 0x9F7B, ++ [22271] = 0x9F7A, [22272] = 0x9F79, [22273] = 0x571E, [22274] = 0x7066, ++ [22275] = 0x7C6F, [22276] = 0x883C, [22277] = 0x8DB2, [22278] = 0x8EA6, ++ [22279] = 0x91C3, [22280] = 0x9474, [22281] = 0x9478, [22282] = 0x9476, ++ [22283] = 0x9475, [22284] = 0x9A60, [22285] = 0x9C74, [22286] = 0x9C73, ++ [22287] = 0x9C71, [22288] = 0x9C75, [22289] = 0x9E14, [22290] = 0x9E13, ++ [22291] = 0x9EF6, [22292] = 0x9F0A, [22327] = 0x9FA4, [22328] = 0x7068, ++ [22329] = 0x7065, [22330] = 0x7CF7, [22331] = 0x866A, [22332] = 0x883E, ++ [22333] = 0x883D, [22334] = 0x883F, [22335] = 0x8B9E, [22336] = 0x8C9C, ++ [22337] = 0x8EA9, [22338] = 0x8EC9, [22339] = 0x974B, [22340] = 0x9873, ++ [22341] = 0x9874, [22342] = 0x98CC, [22343] = 0x9961, [22344] = 0x99AB, ++ [22345] = 0x9A64, [22346] = 0x9A66, [22347] = 0x9A67, [22348] = 0x9B24, ++ [22349] = 0x9E15, [22350] = 0x9E17, [22351] = 0x9F48, [22352] = 0x6207, ++ [22353] = 0x6B1E, [22354] = 0x7227, [22355] = 0x864C, [22356] = 0x8EA8, ++ [22357] = 0x9482, [22358] = 0x9480, [22359] = 0x9481, [22360] = 0x9A69, ++ [22361] = 0x9A68, [22362] = 0x9B2E, [22363] = 0x9E19, [22364] = 0x7229, ++ [22365] = 0x864B, [22366] = 0x8B9F, [22367] = 0x9483, [22368] = 0x9C79, ++ [22369] = 0x9EB7, [22370] = 0x7675, [22371] = 0x9A6B, [22372] = 0x9C7A, ++ [22373] = 0x9E1D, [22374] = 0x7069, [22375] = 0x706A, [22376] = 0x9EA4, ++ [22377] = 0x9F7E, [22378] = 0x9F49, [22379] = 0x9F98, [22380] = 0x7881, ++ [22381] = 0x92B9, [22382] = 0x88CF, [22383] = 0x58BB, [22384] = 0x6052, ++ [22385] = 0x7CA7, [22386] = 0x5AFA, [22387] = 0x2554, [22388] = 0x2566, ++ [22389] = 0x2557, [22390] = 0x2560, [22391] = 0x256C, [22392] = 0x2563, ++ [22393] = 0x255A, [22394] = 0x2569, [22395] = 0x255D, [22396] = 0x2552, ++ [22397] = 0x2564, [22398] = 0x2555, [22399] = 0x255E, [22400] = 0x256A, ++ [22401] = 0x2561, [22402] = 0x2558, [22403] = 0x2567, [22404] = 0x255B, ++ [22405] = 0x2553, [22406] = 0x2565, [22407] = 0x2556, [22408] = 0x255F, ++ [22409] = 0x256B, [22410] = 0x2562, [22411] = 0x2559, [22412] = 0x2568, ++ [22413] = 0x255C, [22414] = 0x2551, [22415] = 0x2550, [22416] = 0x256D, ++ [22417] = 0x256E, [22418] = 0x2570, [22419] = 0x256F, [22420] = 0xFFED, ++ [22425] = 0x20547, [22426] = 0x92DB, [22427] = 0x205DF, [22428] = 0x23FC5, ++ [22429] = 0x854C, [22430] = 0x42B5, [22431] = 0x73EF, [22432] = 0x51B5, ++ [22433] = 0x3649, [22434] = 0x24942, [22435] = 0x289E4, [22436] = 0x9344, ++ [22437] = 0x219DB, [22438] = 0x82EE, [22439] = 0x23CC8, [22440] = 0x783C, ++ [22441] = 0x6744, [22442] = 0x62DF, [22443] = 0x24933, [22444] = 0x289AA, ++ [22445] = 0x202A0, [22446] = 0x26BB3, [22447] = 0x21305, [22448] = 0x4FAB, ++ [22449] = 0x224ED, [22450] = 0x5008, [22451] = 0x26D29, [22452] = 0x27A84, ++ [22453] = 0x23600, [22454] = 0x24AB1, [22455] = 0x22513, [22457] = 0x2037E, ++ [22458] = 0x5FA4, [22459] = 0x20380, [22460] = 0x20347, [22461] = 0x6EDB, ++ [22462] = 0x2041F, [22464] = 0x5101, [22465] = 0x347A, [22466] = 0x510E, ++ [22467] = 0x986C, [22468] = 0x3743, [22469] = 0x8416, [22470] = 0x249A4, ++ [22471] = 0x20487, [22472] = 0x5160, [22473] = 0x233B4, [22474] = 0x516A, ++ [22475] = 0x20BFF, [22476] = 0x220FC, [22477] = 0x202E5, [22478] = 0x22530, ++ [22479] = 0x2058E, [22480] = 0x23233, [22481] = 0x21983, [22482] = 0x5B82, ++ [22483] = 0x877D, [22484] = 0x205B3, [22485] = 0x23C99, [22486] = 0x51B2, ++ [22487] = 0x51B8, [22522] = 0x9D34, [22523] = 0x51C9, [22524] = 0x51CF, ++ [22525] = 0x51D1, [22526] = 0x3CDC, [22527] = 0x51D3, [22528] = 0x24AA6, ++ [22529] = 0x51B3, [22530] = 0x51E2, [22531] = 0x5342, [22532] = 0x51ED, ++ [22533] = 0x83CD, [22534] = 0x693E, [22535] = 0x2372D, [22536] = 0x5F7B, ++ [22537] = 0x520B, [22538] = 0x5226, [22539] = 0x523C, [22540] = 0x52B5, ++ [22541] = 0x5257, [22542] = 0x5294, [22543] = 0x52B9, [22544] = 0x52C5, ++ [22545] = 0x7C15, [22546] = 0x8542, [22547] = 0x52E0, [22548] = 0x860D, ++ [22549] = 0x26B13, [22551] = 0x28ADE, [22552] = 0x5549, [22553] = 0x6ED9, ++ [22554] = 0x23F80, [22555] = 0x20954, [22556] = 0x23FEC, [22557] = 0x5333, ++ [22559] = 0x20BE2, [22560] = 0x6CCB, [22561] = 0x21726, [22562] = 0x681B, ++ [22563] = 0x73D5, [22564] = 0x604A, [22565] = 0x3EAA, [22566] = 0x38CC, ++ [22567] = 0x216E8, [22568] = 0x71DD, [22569] = 0x44A2, [22570] = 0x536D, ++ [22571] = 0x5374, [22572] = 0x286AB, [22573] = 0x537E, [22575] = 0x21596, ++ [22576] = 0x21613, [22577] = 0x77E6, [22578] = 0x5393, [22579] = 0x28A9B, ++ [22580] = 0x53A0, [22581] = 0x53AB, [22582] = 0x53AE, [22583] = 0x73A7, ++ [22584] = 0x25772, [22585] = 0x3F59, [22586] = 0x739C, [22587] = 0x53C1, ++ [22588] = 0x53C5, [22589] = 0x6C49, [22590] = 0x4E49, [22591] = 0x57FE, ++ [22592] = 0x53D9, [22593] = 0x3AAB, [22594] = 0x20B8F, [22595] = 0x53E0, ++ [22596] = 0x23FEB, [22597] = 0x22DA3, [22598] = 0x53F6, [22599] = 0x20C77, ++ [22600] = 0x5413, [22601] = 0x7079, [22602] = 0x552B, [22603] = 0x6657, ++ [22604] = 0x6D5B, [22605] = 0x546D, [22606] = 0x26B53, [22607] = 0x20D74, ++ [22608] = 0x555D, [22609] = 0x548F, [22610] = 0x54A4, [22611] = 0x47A6, ++ [22612] = 0x2170D, [22613] = 0x20EDD, [22614] = 0x3DB4, [22615] = 0x20D4D, ++ [22620] = 0x289BC, [22621] = 0x22698, [22622] = 0x5547, [22623] = 0x4CED, ++ [22624] = 0x542F, [22625] = 0x7417, [22626] = 0x5586, [22627] = 0x55A9, ++ [22629] = 0x218D7, [22630] = 0x2403A, [22631] = 0x4552, [22632] = 0x24435, ++ [22633] = 0x66B3, [22634] = 0x210B4, [22635] = 0x5637, [22636] = 0x66CD, ++ [22637] = 0x2328A, [22638] = 0x66A4, [22639] = 0x66AD, [22640] = 0x564D, ++ [22641] = 0x564F, [22642] = 0x78F1, [22643] = 0x56F1, [22644] = 0x9787, ++ [22645] = 0x53FE, [22646] = 0x5700, [22647] = 0x56EF, [22648] = 0x56ED, ++ [22649] = 0x28B66, [22650] = 0x3623, [22651] = 0x2124F, [22652] = 0x5746, ++ [22653] = 0x241A5, [22654] = 0x6C6E, [22655] = 0x708B, [22656] = 0x5742, ++ [22657] = 0x36B1, [22658] = 0x26C7E, [22659] = 0x57E6, [22660] = 0x21416, ++ [22661] = 0x5803, [22662] = 0x21454, [22663] = 0x24363, [22664] = 0x5826, ++ [22665] = 0x24BF5, [22666] = 0x585C, [22667] = 0x58AA, [22668] = 0x3561, ++ [22669] = 0x58E0, [22670] = 0x58DC, [22671] = 0x2123C, [22672] = 0x58FB, ++ [22673] = 0x5BFF, [22674] = 0x5743, [22675] = 0x2A150, [22676] = 0x24278, ++ [22677] = 0x93D3, [22678] = 0x35A1, [22679] = 0x591F, [22680] = 0x68A6, ++ [22681] = 0x36C3, [22682] = 0x6E59, [22717] = 0x2163E, [22718] = 0x5A24, ++ [22719] = 0x5553, [22720] = 0x21692, [22721] = 0x8505, [22722] = 0x59C9, ++ [22723] = 0x20D4E, [22724] = 0x26C81, [22725] = 0x26D2A, [22726] = 0x217DC, ++ [22727] = 0x59D9, [22728] = 0x217FB, [22729] = 0x217B2, [22730] = 0x26DA6, ++ [22731] = 0x6D71, [22732] = 0x21828, [22733] = 0x216D5, [22734] = 0x59F9, ++ [22735] = 0x26E45, [22736] = 0x5AAB, [22737] = 0x5A63, [22738] = 0x36E6, ++ [22739] = 0x249A9, [22741] = 0x3708, [22742] = 0x5A96, [22743] = 0x7465, ++ [22744] = 0x5AD3, [22745] = 0x26FA1, [22746] = 0x22554, [22747] = 0x3D85, ++ [22748] = 0x21911, [22749] = 0x3732, [22750] = 0x216B8, [22751] = 0x5E83, ++ [22752] = 0x52D0, [22753] = 0x5B76, [22754] = 0x6588, [22755] = 0x5B7C, ++ [22756] = 0x27A0E, [22757] = 0x4004, [22758] = 0x485D, [22759] = 0x20204, ++ [22760] = 0x5BD5, [22761] = 0x6160, [22762] = 0x21A34, [22763] = 0x259CC, ++ [22764] = 0x205A5, [22765] = 0x5BF3, [22766] = 0x5B9D, [22767] = 0x4D10, ++ [22768] = 0x5C05, [22769] = 0x21B44, [22770] = 0x5C13, [22771] = 0x73CE, ++ [22772] = 0x5C14, [22773] = 0x21CA5, [22774] = 0x26B28, [22775] = 0x5C49, ++ [22776] = 0x48DD, [22777] = 0x5C85, [22778] = 0x5CE9, [22779] = 0x5CEF, ++ [22780] = 0x5D8B, [22781] = 0x21DF9, [22782] = 0x21E37, [22783] = 0x5D10, ++ [22784] = 0x5D18, [22785] = 0x5D46, [22786] = 0x21EA4, [22787] = 0x5CBA, ++ [22788] = 0x5DD7, [22789] = 0x82FC, [22790] = 0x382D, [22791] = 0x24901, ++ [22792] = 0x22049, [22793] = 0x22173, [22794] = 0x8287, [22795] = 0x3836, ++ [22796] = 0x3BC2, [22797] = 0x5E2E, [22798] = 0x6A8A, [22800] = 0x5E7A, ++ [22801] = 0x244BC, [22802] = 0x20CD3, [22803] = 0x53A6, [22804] = 0x4EB7, ++ [22806] = 0x53A8, [22807] = 0x21771, [22808] = 0x5E09, [22809] = 0x5EF4, ++ [22810] = 0x28482, [22815] = 0x5EF9, [22816] = 0x5EFB, [22817] = 0x38A0, ++ [22818] = 0x5EFC, [22819] = 0x683E, [22820] = 0x941B, [22821] = 0x5F0D, ++ [22822] = 0x201C1, [22823] = 0x2F894, [22824] = 0x3ADE, [22825] = 0x48AE, ++ [22826] = 0x2133A, [22827] = 0x5F3A, [22828] = 0x26888, [22829] = 0x223D0, ++ [22831] = 0x22471, [22832] = 0x5F63, [22833] = 0x97BD, [22834] = 0x26E6E, ++ [22835] = 0x5F72, [22836] = 0x9340, [22837] = 0x28A36, [22838] = 0x5FA7, ++ [22839] = 0x5DB6, [22840] = 0x3D5F, [22841] = 0x25250, [22842] = 0x21F6A, ++ [22843] = 0x270F8, [22844] = 0x22668, [22845] = 0x91D6, [22846] = 0x2029E, ++ [22847] = 0x28A29, [22848] = 0x6031, [22849] = 0x6685, [22850] = 0x21877, ++ [22851] = 0x3963, [22852] = 0x3DC7, [22853] = 0x3639, [22854] = 0x5790, ++ [22855] = 0x227B4, [22856] = 0x7971, [22857] = 0x3E40, [22858] = 0x609E, ++ [22860] = 0x60B3, [22861] = 0x24982, [22862] = 0x2498F, [22863] = 0x27A53, ++ [22864] = 0x74A4, [22865] = 0x50E1, [22866] = 0x5AA0, [22867] = 0x6164, ++ [22868] = 0x8424, [22869] = 0x6142, [22870] = 0x2F8A6, [22871] = 0x26ED2, ++ [22872] = 0x6181, [22873] = 0x51F4, [22874] = 0x20656, [22875] = 0x6187, ++ [22876] = 0x5BAA, [22877] = 0x23FB7, [22912] = 0x2285F, [22913] = 0x61D3, ++ [22914] = 0x28B9D, [22915] = 0x2995D, [22916] = 0x61D0, [22917] = 0x3932, ++ [22918] = 0x22980, [22919] = 0x228C1, [22920] = 0x6023, [22921] = 0x615C, ++ [22922] = 0x651E, [22923] = 0x638B, [22924] = 0x20118, [22925] = 0x62C5, ++ [22926] = 0x21770, [22927] = 0x62D5, [22928] = 0x22E0D, [22929] = 0x636C, ++ [22930] = 0x249DF, [22931] = 0x3A17, [22932] = 0x6438, [22933] = 0x63F8, ++ [22934] = 0x2138E, [22935] = 0x217FC, [22937] = 0x6F8A, [22938] = 0x22E36, ++ [22939] = 0x9814, [22940] = 0x2408C, [22941] = 0x2571D, [22942] = 0x64E1, ++ [22943] = 0x64E5, [22944] = 0x947B, [22945] = 0x3A66, [22946] = 0x643A, ++ [22947] = 0x3A57, [22948] = 0x654D, [22949] = 0x6F16, [22950] = 0x24A28, ++ [22951] = 0x24A23, [22952] = 0x6585, [22953] = 0x656D, [22954] = 0x655F, ++ [22955] = 0x2307E, [22956] = 0x65B5, [22957] = 0x24940, [22958] = 0x4B37, ++ [22959] = 0x65D1, [22960] = 0x40D8, [22961] = 0x21829, [22962] = 0x65E0, ++ [22963] = 0x65E3, [22964] = 0x5FDF, [22965] = 0x23400, [22966] = 0x6618, ++ [22967] = 0x231F7, [22968] = 0x231F8, [22969] = 0x6644, [22970] = 0x231A4, ++ [22971] = 0x231A5, [22972] = 0x664B, [22973] = 0x20E75, [22974] = 0x6667, ++ [22975] = 0x251E6, [22976] = 0x6673, [22978] = 0x21E3D, [22979] = 0x23231, ++ [22980] = 0x285F4, [22981] = 0x231C8, [22982] = 0x25313, [22983] = 0x77C5, ++ [22984] = 0x228F7, [22985] = 0x99A4, [22986] = 0x6702, [22987] = 0x2439C, ++ [22988] = 0x24A21, [22989] = 0x3B2B, [22990] = 0x69FA, [22991] = 0x237C2, ++ [22993] = 0x6767, [22994] = 0x6762, [22995] = 0x241CD, [22996] = 0x290ED, ++ [22997] = 0x67D7, [22998] = 0x44E9, [22999] = 0x6822, [23000] = 0x6E50, ++ [23001] = 0x923C, [23002] = 0x6801, [23003] = 0x233E6, [23004] = 0x26DA0, ++ [23005] = 0x685D, [23010] = 0x2346F, [23011] = 0x69E1, [23012] = 0x6A0B, ++ [23013] = 0x28ADF, [23014] = 0x6973, [23015] = 0x68C3, [23016] = 0x235CD, ++ [23017] = 0x6901, [23018] = 0x6900, [23019] = 0x3D32, [23020] = 0x3A01, ++ [23021] = 0x2363C, [23022] = 0x3B80, [23023] = 0x67AC, [23024] = 0x6961, ++ [23025] = 0x28A4A, [23026] = 0x42FC, [23027] = 0x6936, [23028] = 0x6998, ++ [23029] = 0x3BA1, [23030] = 0x203C9, [23031] = 0x8363, [23032] = 0x5090, ++ [23033] = 0x69F9, [23034] = 0x23659, [23035] = 0x2212A, [23036] = 0x6A45, ++ [23037] = 0x23703, [23038] = 0x6A9D, [23039] = 0x3BF3, [23040] = 0x67B1, ++ [23041] = 0x6AC8, [23042] = 0x2919C, [23043] = 0x3C0D, [23044] = 0x6B1D, ++ [23045] = 0x20923, [23046] = 0x60DE, [23047] = 0x6B35, [23048] = 0x6B74, ++ [23049] = 0x227CD, [23050] = 0x6EB5, [23051] = 0x23ADB, [23052] = 0x203B5, ++ [23053] = 0x21958, [23054] = 0x3740, [23055] = 0x5421, [23056] = 0x23B5A, ++ [23057] = 0x6BE1, [23058] = 0x23EFC, [23059] = 0x6BDC, [23060] = 0x6C37, ++ [23061] = 0x2248B, [23062] = 0x248F1, [23063] = 0x26B51, [23064] = 0x6C5A, ++ [23065] = 0x8226, [23066] = 0x6C79, [23067] = 0x23DBC, [23068] = 0x44C5, ++ [23069] = 0x23DBD, [23070] = 0x241A4, [23071] = 0x2490C, [23072] = 0x24900, ++ [23107] = 0x23CC9, [23108] = 0x36E5, [23109] = 0x3CEB, [23110] = 0x20D32, ++ [23111] = 0x9B83, [23112] = 0x231F9, [23113] = 0x22491, [23114] = 0x7F8F, ++ [23115] = 0x6837, [23116] = 0x26D25, [23117] = 0x26DA1, [23118] = 0x26DEB, ++ [23119] = 0x6D96, [23120] = 0x6D5C, [23121] = 0x6E7C, [23122] = 0x6F04, ++ [23123] = 0x2497F, [23124] = 0x24085, [23125] = 0x26E72, [23126] = 0x8533, ++ [23127] = 0x26F74, [23128] = 0x51C7, [23131] = 0x842E, [23132] = 0x28B21, ++ [23134] = 0x23E2F, [23135] = 0x7453, [23136] = 0x23F82, [23137] = 0x79CC, ++ [23138] = 0x6E4F, [23139] = 0x5A91, [23140] = 0x2304B, [23141] = 0x6FF8, ++ [23142] = 0x370D, [23143] = 0x6F9D, [23144] = 0x23E30, [23145] = 0x6EFA, ++ [23146] = 0x21497, [23147] = 0x2403D, [23148] = 0x4555, [23149] = 0x93F0, ++ [23150] = 0x6F44, [23151] = 0x6F5C, [23152] = 0x3D4E, [23153] = 0x6F74, ++ [23154] = 0x29170, [23155] = 0x3D3B, [23156] = 0x6F9F, [23157] = 0x24144, ++ [23158] = 0x6FD3, [23159] = 0x24091, [23160] = 0x24155, [23161] = 0x24039, ++ [23162] = 0x23FF0, [23163] = 0x23FB4, [23164] = 0x2413F, [23165] = 0x51DF, ++ [23166] = 0x24156, [23167] = 0x24157, [23168] = 0x24140, [23169] = 0x261DD, ++ [23170] = 0x704B, [23171] = 0x707E, [23172] = 0x70A7, [23173] = 0x7081, ++ [23174] = 0x70CC, [23175] = 0x70D5, [23176] = 0x70D6, [23177] = 0x70DF, ++ [23178] = 0x4104, [23179] = 0x3DE8, [23180] = 0x71B4, [23181] = 0x7196, ++ [23182] = 0x24277, [23183] = 0x712B, [23184] = 0x7145, [23185] = 0x5A88, ++ [23186] = 0x714A, [23188] = 0x5C9C, [23189] = 0x24365, [23190] = 0x714F, ++ [23191] = 0x9362, [23192] = 0x242C1, [23193] = 0x712C, [23194] = 0x2445A, ++ [23195] = 0x24A27, [23196] = 0x24A22, [23197] = 0x71BA, [23198] = 0x28BE8, ++ [23199] = 0x70BD, [23200] = 0x720E, [23205] = 0x9442, [23206] = 0x7215, ++ [23207] = 0x5911, [23208] = 0x9443, [23209] = 0x7224, [23210] = 0x9341, ++ [23211] = 0x25605, [23212] = 0x722E, [23213] = 0x7240, [23214] = 0x24974, ++ [23215] = 0x68BD, [23216] = 0x7255, [23217] = 0x7257, [23218] = 0x3E55, ++ [23219] = 0x23044, [23220] = 0x680D, [23221] = 0x6F3D, [23222] = 0x7282, ++ [23224] = 0x732B, [23225] = 0x24823, [23226] = 0x2882B, [23227] = 0x48ED, ++ [23228] = 0x28804, [23229] = 0x7328, [23230] = 0x732E, [23231] = 0x73CF, ++ [23232] = 0x73AA, [23233] = 0x20C3A, [23234] = 0x26A2E, [23235] = 0x73C9, ++ [23236] = 0x7449, [23237] = 0x241E2, [23238] = 0x216E7, [23239] = 0x24A24, ++ [23240] = 0x6623, [23241] = 0x36C5, [23242] = 0x249B7, [23243] = 0x2498D, ++ [23244] = 0x249FB, [23245] = 0x73F7, [23246] = 0x7415, [23247] = 0x6903, ++ [23248] = 0x24A26, [23249] = 0x7439, [23250] = 0x205C3, [23251] = 0x3ED7, ++ [23253] = 0x228AD, [23254] = 0x7460, [23255] = 0x28EB2, [23256] = 0x7447, ++ [23257] = 0x73E4, [23258] = 0x7476, [23259] = 0x83B9, [23260] = 0x746C, ++ [23261] = 0x3730, [23262] = 0x7474, [23263] = 0x93F1, [23264] = 0x6A2C, ++ [23265] = 0x7482, [23266] = 0x4953, [23267] = 0x24A8C, [23302] = 0x2415F, ++ [23303] = 0x24A79, [23304] = 0x28B8F, [23305] = 0x5B46, [23306] = 0x28C03, ++ [23307] = 0x2189E, [23308] = 0x74C8, [23309] = 0x21988, [23310] = 0x750E, ++ [23312] = 0x751E, [23313] = 0x28ED9, [23314] = 0x21A4B, [23315] = 0x5BD7, ++ [23316] = 0x28EAC, [23317] = 0x9385, [23318] = 0x754D, [23319] = 0x754A, ++ [23320] = 0x7567, [23321] = 0x756E, [23322] = 0x24F82, [23323] = 0x3F04, ++ [23324] = 0x24D13, [23325] = 0x758E, [23326] = 0x745D, [23327] = 0x759E, ++ [23328] = 0x75B4, [23329] = 0x7602, [23330] = 0x762C, [23331] = 0x7651, ++ [23332] = 0x764F, [23333] = 0x766F, [23334] = 0x7676, [23335] = 0x263F5, ++ [23336] = 0x7690, [23337] = 0x81EF, [23338] = 0x37F8, [23339] = 0x26911, ++ [23340] = 0x2690E, [23341] = 0x76A1, [23342] = 0x76A5, [23343] = 0x76B7, ++ [23344] = 0x76CC, [23345] = 0x26F9F, [23346] = 0x8462, [23347] = 0x2509D, ++ [23348] = 0x2517D, [23349] = 0x21E1C, [23350] = 0x771E, [23351] = 0x7726, ++ [23352] = 0x7740, [23353] = 0x64AF, [23354] = 0x25220, [23355] = 0x7758, ++ [23356] = 0x232AC, [23357] = 0x77AF, [23358] = 0x28964, [23359] = 0x28968, ++ [23360] = 0x216C1, [23361] = 0x77F4, [23363] = 0x21376, [23364] = 0x24A12, ++ [23365] = 0x68CA, [23366] = 0x78AF, [23367] = 0x78C7, [23368] = 0x78D3, ++ [23369] = 0x96A5, [23370] = 0x792E, [23371] = 0x255E0, [23372] = 0x78D7, ++ [23373] = 0x7934, [23374] = 0x78B1, [23375] = 0x2760C, [23376] = 0x8FB8, ++ [23377] = 0x8884, [23378] = 0x28B2B, [23379] = 0x26083, [23380] = 0x2261C, ++ [23381] = 0x7986, [23382] = 0x8900, [23383] = 0x6902, [23384] = 0x7980, ++ [23385] = 0x25857, [23386] = 0x799D, [23387] = 0x27B39, [23388] = 0x793C, ++ [23389] = 0x79A9, [23390] = 0x6E2A, [23391] = 0x27126, [23392] = 0x3EA8, ++ [23393] = 0x79C6, [23394] = 0x2910D, [23395] = 0x79D4 + }; + + +@@ -4636,7 +4711,7 @@ static const uint32_t big5hkscs_to_ucs[] = + } + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +-static const char from_ucs4[][2] = ++static const unsigned char from_ucs4[][2] = + { + /* 0x00a2 */ "\xa2\x46", "\xa2\x47", "\x00\x00", "\xa2\x44", "\x00\x00", + /* 0x00a7 */ "\xa1\xb1", "\xc6\xd8", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -4895,6 +4970,8 @@ static const char from_ucs4[][2] = + /* 0x22b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xa1\xe9", + ++ /* 0x23da */ "\x88\xa9", "\x88\xaa", ++ + /* 0x2460 */ "\xc6\xa1", "\xc6\xa2", "\xc6\xa3", "\xc6\xa4", "\xc6\xa5", + /* 0x2465 */ "\xc6\xa6", "\xc6\xa7", "\xc6\xa8", "\xc6\xa9", "\xc6\xaa", + /* 0x2469 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5068,29 +5145,52 @@ static const char from_ucs4[][2] = + /* 0x3122 */ "\xa3\xb3", "\xa3\xb4", "\xa3\xb5", "\xa3\xb6", "\xa3\xb7", + /* 0x3127 */ "\xa3\xb8", "\xa3\xb9", "\xa3\xba", + +- /* 0x3231 */ "\xc8\xd1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3235 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x323a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x323f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3244 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3249 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x324e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3253 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3258 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x325d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3262 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3267 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x326c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3271 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3276 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x327b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3280 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3285 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x328a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x328f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3294 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3299 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x329e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xa1\xc0", ++ /* 0x31c0 */ "\x88\x40", "\x88\x41", "\x88\x42", "\x88\x43", "\x88\x44", ++ /* 0x31c5 */ "\x88\x46", "\x88\x49", "\x88\x4a", "\x88\x4d", "\x88\x4f", ++ /* 0x31ca */ "\x88\x50", "\x88\x51", "\x88\x52", "\x88\x54", "\x88\x55", ++ /* 0x31cf */ "\xc8\x79", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x31fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3200 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3205 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x320a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x320f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3214 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3219 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x321e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3223 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3228 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x322d */ "\x00\x00", "\x00\x00", "\x00\x00", "\xc8\xd1", "\x00\x00", ++ /* 0x3232 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3237 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x323c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3241 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3246 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x324b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3250 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3255 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x325a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x325f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3264 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3269 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x326e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3273 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3278 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x327d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3282 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3287 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x328c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3291 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3296 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x329b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x32a0 */ "\x00\x00", "\x00\x00", "\xa1\xc0", + + /* 0x338e */ "\xa2\x55", "\xa2\x56", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3392 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5129,7 +5229,7 @@ static const char from_ucs4[][2] = + /* 0x3437 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x343c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xdf", "\x00\x00", + /* 0x3441 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3446 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3446 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xf4", "\x00\x00", + /* 0x344c */ "\x89\xd5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3450 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3455 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5160,7 +5260,7 @@ static const char from_ucs4[][2] = + /* 0x34d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x34d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x34dc */ "\x00\x00", "\x00\x00", "\x9e\x53", "\x00\x00", "\x00\x00", +- /* 0x34e1 */ "\x00\x00", "\x00\x00", "\x9d\xaa", "\x00\x00", "\x00\x00", ++ /* 0x34e1 */ "\x00\x00", "\x00\x00", "\x9d\xaa", "\x00\x00", "\x87\xbe", + /* 0x34e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x34eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x34f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5183,7 +5283,7 @@ static const char from_ucs4[][2] = + /* 0x3545 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x354a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x354f */ "\x00\x00", "\x89\xe8", "\x00\x00", "\x89\xea", "\x00\x00", +- /* 0x3554 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3554 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x4b", + /* 0x3559 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x355e */ "\x00\x00", "\x00\x00", "\xfb\x70", "\x00\x00", "\x00\x00", + /* 0x3563 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5224,7 +5324,7 @@ static const char from_ucs4[][2] = + /* 0x3612 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3618 */ "\x9c\x5c", "\x00\x00", "\x8b\xb1", "\x00\x00", "\x00\x00", + /* 0x361c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3621 */ "\x00\x00", "\xfb\x5e", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3621 */ "\x00\x00", "\xfb\x5e", "\x00\x00", "\x87\x70", "\x00\x00", + /* 0x3626 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x362b */ "\x00\x00", "\x9d\xf3", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3630 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xd0", +@@ -5236,7 +5336,7 @@ static const char from_ucs4[][2] = + /* 0x364e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3653 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3658 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x365d */ "\x00\x00", "\x9c\x6f", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x365d */ "\x00\x00", "\x9c\x6f", "\x00\x00", "\x8d\x5c", "\x00\x00", + /* 0x3662 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3667 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x366c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5311,7 +5411,7 @@ static const char from_ucs4[][2] = + /* 0x37c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x37ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x37cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x37d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x37d4 */ "\x00\x00", "\x8d\x4b", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x37d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x37de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x37e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5343,7 +5443,7 @@ static const char from_ucs4[][2] = + /* 0x3865 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x386a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x386f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3874 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3875 */ "\x87\x7a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3879 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x387e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3883 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5362,7 +5462,7 @@ static const char from_ucs4[][2] = + /* 0x38c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x38c9 */ "\x00\x00", "\x00\x00", "\xfa\xcd", "\x00\x00", "\x00\x00", + /* 0x38ce */ "\x00\x00", "\x00\x00", "\x93\xdd", "\x00\x00", "\x00\x00", +- /* 0x38d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x38d4 */ "\x8d\x52", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x38d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x38dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x38e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5394,7 +5494,7 @@ static const char from_ucs4[][2] = + /* 0x3964 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3969 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x396e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3973 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3973 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xf3", + /* 0x3978 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x397d */ "\x00\x00", "\x00\x00", "\x90\x60", "\x00\x00", "\x00\x00", + /* 0x3982 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5471,7 +5571,7 @@ static const char from_ucs4[][2] = + /* 0x3ae5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3aea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3af0 */ "\x90\x6f", "\x00\x00", "\x8d\xb0", "\x00\x00", "\x00\x00", +- /* 0x3af4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3af5 */ "\x87\xa2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3af9 */ "\x00\x00", "\x94\x7e", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3afe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3b03 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5503,7 +5603,7 @@ static const char from_ucs4[][2] = + /* 0x3b85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3b8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3b8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3b94 */ "\x00\x00", "\x93\xe4", "\x00\x00", "\x00\x00", "\x93\xe0", ++ /* 0x3b95 */ "\x87\x4b", "\x93\xe4", "\x00\x00", "\x00\x00", "\x93\xe0", + /* 0x3b99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3b9e */ "\x00\x00", "\x00\x00", "\xfd\x53", "\x00\x00", "\x00\x00", + /* 0x3ba3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5552,7 +5652,7 @@ static const char from_ucs4[][2] = + /* 0x3c7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3c7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3c84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3c89 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3c89 */ "\x00\x00", "\x8c\x56", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3c8e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3c93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3c98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5579,7 +5679,7 @@ static const char from_ucs4[][2] = + /* 0x3d01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3d06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3d0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3d10 */ "\x00\x00", "\x00\x00", "\x8e\xaf", "\x00\x00", "\x00\x00", ++ /* 0x3d10 */ "\x00\x00", "\x8c\xea", "\x8e\xaf", "\x00\x00", "\x00\x00", + /* 0x3d15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3d1a */ "\x00\x00", "\x00\x00", "\x91\xb5", "\x00\x00", "\x00\x00", + /* 0x3d1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5602,7 +5702,7 @@ static const char from_ucs4[][2] = + /* 0x3d75 */ "\x8d\xf0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3d79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xa6", "\x00\x00", + /* 0x3d7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3d83 */ "\x00\x00", "\xfb\xbf", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3d83 */ "\x00\x00", "\xfb\xbf", "\x00\x00", "\x00\x00", "\x8c\xdf", + /* 0x3d88 */ "\x00\x00", "\x8d\xf3", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3d8d */ "\x00\x00", "\x94\x49", "\x00\x00", "\x8d\xf5", "\x00\x00", + /* 0x3d92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5615,7 +5715,7 @@ static const char from_ucs4[][2] = + /* 0x3db5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3dba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\x50", + /* 0x3dbf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3dc4 */ "\x00\x00", "\x9d\xcc", "\xfc\x65", "\x00\x00", "\x00\x00", ++ /* 0x3dc4 */ "\x00\x00", "\x9d\xcc", "\xfc\x65", "\x00\x00", "\x8c\x44", + /* 0x3dc9 */ "\x00\x00", "\x00\x00", "\x99\x6e", "\x94\xa1", "\x00\x00", + /* 0x3dce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\x63", + /* 0x3dd3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5624,7 +5724,7 @@ static const char from_ucs4[][2] = + /* 0x3de2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x53", + /* 0x3de8 */ "\xfd\xe9", "\x00\x00", "\x00\x00", "\x9d\xb5", "\x00\x00", + /* 0x3dec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3df1 */ "\x00\x00", "\x98\x79", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3df1 */ "\x00\x00", "\x98\x79", "\x87\x6a", "\x00\x00", "\x00\x00", + /* 0x3df7 */ "\x9d\x5d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3dfc */ "\x8d\x63", "\x96\x69", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3e00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5670,16 +5770,16 @@ static const char from_ucs4[][2] = + /* 0x3ec8 */ "\x00\x00", "\x98\xc3", "\x00\x00", "\x95\xf6", "\x00\x00", + /* 0x3ecd */ "\x00\x00", "\x00\x00", "\x8f\xfd", "\x98\xc5", "\x00\x00", + /* 0x3ed2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x66", "\xfe\x6e", +- /* 0x3ed7 */ "\x00\x00", "\x00\x00", "\x97\xdd", "\x00\x00", "\x00\x00", ++ /* 0x3ed7 */ "\x00\x00", "\x00\x00", "\x97\xdd", "\x8c\xaa", "\x00\x00", + /* 0x3edc */ "\x00\x00", "\x92\xd2", "\x00\x00", "\x00\x00", "\x97\x61", + /* 0x3ee2 */ "\x98\xcb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3ee7 */ "\x95\xf0", "\x00\x00", "\x97\x5d", "\x00\x00", "\x91\xe3", +- /* 0x3eeb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xcc", ++ /* 0x3eec */ "\x87\x7e", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xcc", + /* 0x3ef0 */ "\x00\x00", "\x00\x00", "\x94\x69", "\x98\xcd", "\x00\x00", + /* 0x3ef5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xce", + /* 0x3efa */ "\x00\x00", "\x95\xfc", "\x00\x00", "\x00\x00", "\x94\xa3", + /* 0x3f00 */ "\x96\x62", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xb6", +- /* 0x3f04 */ "\x00\x00", "\x94\x63", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3f04 */ "\x00\x00", "\x94\x63", "\x8d\x47", "\x00\x00", "\x00\x00", + /* 0x3f09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xd0", + /* 0x3f0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3f13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5718,7 +5818,7 @@ static const char from_ucs4[][2] = + /* 0x3fb8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3fbd */ "\x00\x00", "\x00\x00", "\x98\xd9", "\x00\x00", "\x00\x00", + /* 0x3fc2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x3fc7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x3fc8 */ "\x8d\x5a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3fcc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3fd1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3fd7 */ "\x98\xdb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5731,7 +5831,7 @@ static const char from_ucs4[][2] = + /* 0x3ffa */ "\x8a\xae", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x3ffe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4004 */ "\xfb\xc9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4008 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4009 */ "\x8c\x5d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x400d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4012 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4017 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5751,7 +5851,7 @@ static const char from_ucs4[][2] = + /* 0x405d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xdf", + /* 0x4062 */ "\x00\x00", "\x00\x00", "\xa0\xac", "\x00\x00", "\x00\x00", + /* 0x4067 */ "\x00\x00", "\x00\x00", "\x98\xeb", "\x00\x00", "\x00\x00", +- /* 0x406c */ "\x00\x00", "\x00\x00", "\x98\xec", "\x00\x00", "\x00\x00", ++ /* 0x406c */ "\x00\x00", "\x00\x00", "\x98\xec", "\x00\x00", "\x8c\xc3", + /* 0x4071 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4076 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x407b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5765,7 +5865,7 @@ static const char from_ucs4[][2] = + /* 0x40a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xf4", + /* 0x40a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x40ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x40b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x40b2 */ "\x00\x00", "\x87\xd9", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x40b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xb8", "\x00\x00", + /* 0x40bc */ "\x00\x00", "\x00\x00", "\x9e\xe7", "\x00\x00", "\x00\x00", + /* 0x40c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5778,9 +5878,9 @@ static const char from_ucs4[][2] = + /* 0x40e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x40e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x40ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x40f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x40f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x4a", + /* 0x40f8 */ "\x00\x00", "\x9e\x7e", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x40fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x40fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x44", + /* 0x4103 */ "\x98\xfe", "\xfd\xe8", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4107 */ "\x00\x00", "\x99\x40", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x410c */ "\x00\x00", "\x94\xc9", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5790,7 +5890,7 @@ static const char from_ucs4[][2] = + /* 0x4120 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4125 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x412a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x412f */ "\x00\x00", "\x00\x00", "\x94\xd3", "\x00\x00", "\x00\x00", ++ /* 0x412f */ "\x00\x00", "\x87\xc6", "\x94\xd3", "\x00\x00", "\x00\x00", + /* 0x4134 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4139 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x413e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5805,8 +5905,8 @@ static const char from_ucs4[][2] = + /* 0x416c */ "\x90\xc0", "\x00\x00", "\x94\xd1", "\x00\x00", "\x00\x00", + /* 0x4170 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4175 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x417a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x73", +- /* 0x417f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x417a */ "\x00\x00", "\x8d\x4e", "\x00\x00", "\x00\x00", "\x95\x73", ++ /* 0x417f */ "\x00\x00", "\x87\xce", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4184 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4189 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x418e */ "\x00\x00", "\x93\xc2", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5827,7 +5927,7 @@ static const char from_ucs4[][2] = + /* 0x41d9 */ "\x00\x00", "\x8e\xfe", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x41de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x41e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x41e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x41e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x5f", + /* 0x41ed */ "\x00\x00", "\x8e\x59", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x41f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x41f7 */ "\x00\x00", "\x94\xec", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5838,7 +5938,7 @@ static const char from_ucs4[][2] = + /* 0x4211 */ "\x94\xef", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4215 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x421a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x421f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x421f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x60", "\x00\x00", + /* 0x4224 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4229 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x422e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5855,7 +5955,7 @@ static const char from_ucs4[][2] = + /* 0x4265 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x44", + /* 0x426a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x426f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4274 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4274 */ "\x00\x00", "\x8c\xcb", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x427a */ "\x99\x56", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x427e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4283 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5864,7 +5964,7 @@ static const char from_ucs4[][2] = + /* 0x4292 */ "\x00\x00", "\x99\x5b", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4297 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x429c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x42a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x42a2 */ "\x8c\xc4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x42a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x42ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x42b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x45", +@@ -5884,7 +5984,7 @@ static const char from_ucs4[][2] = + /* 0x42f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xc9", + /* 0x42fc */ "\xfd\x50", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4300 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4305 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4305 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\xaa", + /* 0x430a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x430f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4314 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5913,7 +6013,7 @@ static const char from_ucs4[][2] = + /* 0x4387 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x438c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4391 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4397 */ "\x99\x67", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4397 */ "\x99\x67", "\x00\x00", "\x00\x00", "\x8c\xe3", "\x00\x00", + /* 0x439b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x43a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x43a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5930,7 +6030,7 @@ static const char from_ucs4[][2] = + /* 0x43dc */ "\x00\x00", "\x00\x00", "\x9d\x51", "\x00\x00", "\x00\x00", + /* 0x43e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x43e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x43eb */ "\x00\x00", "\x99\x73", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x43eb */ "\x00\x00", "\x99\x73", "\x00\x00", "\x00\x00", "\x87\x40", + /* 0x43f0 */ "\x00\x00", "\x9d\x4f", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x43f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x43fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -5963,7 +6063,7 @@ static const char from_ucs4[][2] = + /* 0x4481 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4486 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x448b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x99\xad", "\x00\x00", +- /* 0x4490 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4491 */ "\xc8\x7e", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4495 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x449a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x6e", + /* 0x44a0 */ "\x8f\x70", "\x00\x00", "\xfa\xd0", "\x00\x00", "\x00\x00", +@@ -5971,15 +6071,15 @@ static const char from_ucs4[][2] = + /* 0x44a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x44ae */ "\x00\x00", "\x99\xb3", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x44b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\x53", "\x00\x00", +- /* 0x44b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x44b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x5e", + /* 0x44bd */ "\x00\x00", "\x00\x00", "\x96\x5c", "\x00\x00", "\x00\x00", +- /* 0x44c2 */ "\x00\x00", "\x00\x00", "\xfd\x7a", "\x00\x00", "\x00\x00", ++ /* 0x44c3 */ "\x8c\xe0", "\x00\x00", "\xfd\x7a", "\x00\x00", "\x00\x00", + /* 0x44c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x44cc */ "\x00\x00", "\x97\xfe", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x44d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x44d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x44db */ "\x00\x00", "\x92\xbd", "\x00\x00", "\x97\xfd", "\x00\x00", +- /* 0x44e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\x64", "\x00\x00", ++ /* 0x44db */ "\x00\x00", "\x92\xbd", "\x8d\x5d", "\x97\xfd", "\x00\x00", ++ /* 0x44e1 */ "\x87\xdb", "\x00\x00", "\x00\x00", "\x8f\x64", "\x00\x00", + /* 0x44e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xf7", "\x95\x62", + /* 0x44eb */ "\x97\xcd", "\x9e\x64", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x44ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x4c", +@@ -5990,26 +6090,26 @@ static const char from_ucs4[][2] = + /* 0x4509 */ "\x9d\xa5", "\x00\x00", "\x8f\x54", "\x00\x00", "\x00\x00", + /* 0x450d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4512 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\x7c", "\x00\x00", +- /* 0x4517 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4517 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x55", "\x00\x00", + /* 0x451d */ "\x8e\xa2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4521 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4527 */ "\x8f\x7a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x452b */ "\x00\x00", "\x00\x00", "\x97\xae", "\x00\x00", "\x00\x00", + /* 0x4530 */ "\x00\x00", "\x00\x00", "\x96\xc8", "\x00\x00", "\x00\x00", +- /* 0x4535 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4536 */ "\x8c\xe4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x453b */ "\x99\xc3", "\x00\x00", "\x90\xd6", "\x00\x00", "\x9c\xbe", + /* 0x453f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\x76", "\x00\x00", + /* 0x4544 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4549 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x454e */ "\x00\x00", "\x00\x00", "\x94\x70", "\xfb\x4b", "\x00\x00", +- /* 0x4553 */ "\x00\x00", "\xfd\xca", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4553 */ "\x00\x00", "\xfd\xca", "\x00\x00", "\x00\x00", "\x8c\xef", + /* 0x4558 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xc7", "\x00\x00", +- /* 0x455d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xf9", ++ /* 0x455d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x54", "\xa0\xf9", + /* 0x4562 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4567 */ "\x00\x00", "\x00\x00", "\x8f\xa9", "\x00\x00", "\x00\x00", +- /* 0x456c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x456d */ "\x8d\x51", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4571 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4577 */ "\x99\xc7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4577 */ "\x99\xc7", "\x87\x44", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x457b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4580 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xd7", + /* 0x4585 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6018,26 +6118,26 @@ static const char from_ucs4[][2] = + /* 0x4594 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4599 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x459e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x45a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x45a3 */ "\x00\x00", "\x00\x00", "\x87\x43", "\x00\x00", "\x00\x00", + /* 0x45a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x45b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x45b3 */ "\x87\x47", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x45d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x45d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x58", + /* 0x45da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xdf", +- /* 0x45e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x45ea */ "\x8d\x59", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x45fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4602 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x99\xce", "\x00\x00", ++ /* 0x4603 */ "\x87\x42", "\x00\x00", "\x00\x00", "\x99\xce", "\x00\x00", + /* 0x4607 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x460c */ "\x00\x00", "\x00\x00", "\x8f\xba", "\x00\x00", "\x00\x00", + /* 0x4611 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xeb", "\x00\x00", +@@ -6068,12 +6168,12 @@ static const char from_ucs4[][2] = + /* 0x468e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4693 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4698 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x469d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x469d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x5d", "\x00\x00", + /* 0x46a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x46a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x46ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x46ac */ "\x00\x00", "\x87\xcc", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x46b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x46b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x46b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x45", + /* 0x46bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x46c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x46c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6085,7 +6185,7 @@ static const char from_ucs4[][2] = + /* 0x46e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x46e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x46ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x46f2 */ "\x00\x00", "\x00\x00", "\x95\xb2", "\x00\x00", "\x00\x00", ++ /* 0x46f2 */ "\x00\x00", "\x00\x00", "\x95\xb2", "\x00\x00", "\x8d\x4c", + /* 0x46f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x46fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4701 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6098,12 +6198,12 @@ static const char from_ucs4[][2] = + /* 0x4724 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4729 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x472e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4733 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4733 */ "\x00\x00", "\x00\x00", "\x87\x4c", "\x00\x00", "\x00\x00", + /* 0x4738 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x473d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4742 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4742 */ "\x00\x00", "\x87\x4d", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4747 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x474c */ "\x00\x00", "\x9e\x7a", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x474c */ "\x00\x00", "\x9e\x7a", "\x87\x57", "\x00\x00", "\x00\x00", + /* 0x4751 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4756 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x475b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6124,7 +6224,7 @@ static const char from_ucs4[][2] = + /* 0x47a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x47ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x47b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x47b6 */ "\x9e\xe5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x47b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x47ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x47bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x47c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6199,7 +6299,7 @@ static const char from_ucs4[][2] = + /* 0x491e */ "\x99\xf8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4922 */ "\x00\x00", "\x00\x00", "\x96\x64", "\x00\x00", "\x00\x00", + /* 0x4927 */ "\x00\x00", "\x00\x00", "\x90\x55", "\x00\x00", "\x00\x00", +- /* 0x492d */ "\x96\xd4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x492d */ "\x96\xd4", "\x00\x00", "\x87\xc4", "\x87\xae", "\x00\x00", + /* 0x4931 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x7c", "\x00\x00", + /* 0x4936 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x493c */ "\x96\x4d", "\x00\x00", "\x97\xe1", "\x00\x00", "\x00\x00", +@@ -6274,7 +6374,7 @@ static const char from_ucs4[][2] = + /* 0x4a94 */ "\x00\x00", "\x97\xc2", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4a99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4a9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4aa3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4aa4 */ "\x87\x5c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4aa8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4aad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4ab2 */ "\x00\x00", "\x8a\xbb", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6295,10 +6395,10 @@ static const char from_ucs4[][2] = + /* 0x4afd */ "\x00\x00", "\x91\x45", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4b02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4b07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4b0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4b0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x58", "\x00\x00", + /* 0x4b11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4b16 */ "\x00\x00", "\x00\x00", "\x9a\x63", "\x00\x00", "\x00\x00", +- /* 0x4b1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4b1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x49", + /* 0x4b20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4b25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4b2a */ "\x00\x00", "\x8b\xb6", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6353,24 +6453,24 @@ static const char from_ucs4[][2] = + /* 0x4c1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4c2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4c2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x41", "\x00\x00", + /* 0x4c33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c38 */ "\x00\x00", "\x00\x00", "\x9f\xa5", "\x00\x00", "\x00\x00", +- /* 0x4c3e */ "\x89\xba", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4c42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4c3e */ "\x89\xba", "\x00\x00", "\x87\x4f", "\x00\x00", "\x00\x00", ++ /* 0x4c42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x4e", + /* 0x4c47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c51 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4c56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xcd", ++ /* 0x4c57 */ "\x87\x55", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xcd", + /* 0x4c5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c6a */ "\x00\x00", "\x00\x00", "\x9a\x79", "\x00\x00", "\x00\x00", + /* 0x4c6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4c74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4c79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xce", "\x00\x00", +- /* 0x4c7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4c83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4c74 */ "\x00\x00", "\x00\x00", "\x8c\xf2", "\x00\x00", "\x00\x00", ++ /* 0x4c79 */ "\x00\x00", "\x8d\x57", "\x00\x00", "\x9d\xce", "\x00\x00", ++ /* 0x4c7e */ "\x00\x00", "\x00\x00", "\x8c\xd2", "\x00\x00", "\x00\x00", ++ /* 0x4c83 */ "\x00\x00", "\x87\x59", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4c92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6388,7 +6488,7 @@ static const char from_ucs4[][2] = + /* 0x4cce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4cd3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4cd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4cdd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xee", "\x00\x00", ++ /* 0x4cdd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xee", "\x87\x49", + /* 0x4ce2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4ce7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4ced */ "\xfb\x43", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6396,7 +6496,7 @@ static const char from_ucs4[][2] = + /* 0x4cf6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4cfb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4d05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xc9", "\x00\x00", ++ /* 0x4d05 */ "\x00\x00", "\x87\x5b", "\x00\x00", "\x9e\xc9", "\x00\x00", + /* 0x4d0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d10 */ "\xfb\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6418,11 +6518,11 @@ static const char from_ucs4[][2] = + /* 0x4d64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4d73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4d73 */ "\x00\x00", "\x00\x00", "\x8d\x58", "\x87\x46", "\x00\x00", + /* 0x4d78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x4d87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x4d87 */ "\x00\x00", "\x8d\x56", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x78", + /* 0x4d91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4d96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6455,7 +6555,7 @@ static const char from_ucs4[][2] = + /* 0x4e1e */ "\xa5\xe0", "\xa5\xe1", "\x00\x00", "\x99\x4f", "\x00\x00", + /* 0x4e22 */ "\x00\x00", "\x89\xce", "\x00\x00", "\xa8\xc3", "\x00\x00", + /* 0x4e28 */ "\x8b\xc0", "\x00\x00", "\x9f\xc4", "\xa4\x58", "\x8b\xd4", +- /* 0x4e2d */ "\xa4\xa4", "\xc9\x50", "\x00\x00", "\xa4\xa5", "\xc9\x63", ++ /* 0x4e2d */ "\xa4\xa4", "\xc9\x50", "\x8c\x72", "\xa4\xa5", "\xc9\x63", + /* 0x4e32 */ "\xa6\xea", "\xcb\xb1", "\x00\x00", "\x00\x00", "\xc6\xbf", + /* 0x4e37 */ "\x8b\xf9", "\xa4\x59", "\xa4\xa6", "\x00\x00", "\xa5\x44", + /* 0x4e3c */ "\xc9\x64", "\x89\x46", "\x00\x00", "\xc6\xc0", "\x00\x00", +@@ -6478,7 +6578,7 @@ static const char from_ucs4[][2] = + /* 0x4e91 */ "\xa4\xaa", "\xa4\xac", "\xc9\x51", "\xa4\xad", "\xa4\xab", + /* 0x4e95 */ "\x00\x00", "\x00\x00", "\x92\x7e", "\xa5\xe5", "\x9d\xba", + /* 0x4e9b */ "\xa8\xc7", "\x00\x00", "\x00\x00", "\xa8\xc8", "\xab\x45", +- /* 0x4ea0 */ "\xc6\xc2", "\xa4\x60", "\xa4\xae", "\x00\x00", "\xa5\xe6", ++ /* 0x4ea0 */ "\xc6\xc2", "\xa4\x60", "\xa4\xae", "\x8c\x6f", "\xa5\xe6", + /* 0x4ea5 */ "\xa5\xe8", "\xa5\xe7", "\x00\x00", "\xa6\xeb", "\x00\x00", + /* 0x4ea9 */ "\x00\x00", "\xa8\xc9", "\xa8\xca", "\xab\x46", "\xab\x47", + /* 0x4eae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xad\xbd", +@@ -6501,7 +6601,7 @@ static const char from_ucs4[][2] = + /* 0x4f04 */ "\xc9\xb9", "\xc9\xb6", "\x00\x00", "\x00\x00", "\xc9\xb3", + /* 0x4f09 */ "\xa5\xea", "\xa5\xec", "\xa5\xf9", "\x00\x00", "\xa5\xee", + /* 0x4f0e */ "\xc9\xab", "\xa5\xf1", "\xa5\xef", "\xa5\xf0", "\xc9\xbb", +- /* 0x4f13 */ "\xc9\xb8", "\xc9\xaf", "\xa5\xed", "\x00\x00", "\x00\x00", ++ /* 0x4f13 */ "\xc9\xb8", "\xc9\xaf", "\xa5\xed", "\x00\x00", "\x8c\x73", + /* 0x4f18 */ "\xc9\xac", "\xa5\xeb", "\x89\x4e", "\x00\x00", "\x00\x00", + /* 0x4f1d */ "\xc9\xb4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4f22 */ "\xc9\xb7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6533,7 +6633,7 @@ static const char from_ucs4[][2] = + /* 0x4fa3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x89\x50", + /* 0x4fa8 */ "\x00\x00", "\x00\x00", "\xfa\x57", "\x00\x00", "\x00\x00", + /* 0x4fae */ "\xab\x56", "\xab\x4a", "\x98\x66", "\x00\x00", "\xcd\xe0", +- /* 0x4fb3 */ "\xcd\xe8", "\x00\x00", "\xab\x49", "\xab\x51", "\xab\x5d", ++ /* 0x4fb3 */ "\xcd\xe8", "\x8c\xf8", "\xab\x49", "\xab\x51", "\xab\x5d", + /* 0x4fb7 */ "\x00\x00", "\xcd\xee", "\xcd\xec", "\xcd\xe7", "\x00\x00", + /* 0x4fbd */ "\x89\xd6", "\x00\x00", "\xab\x4b", "\xcd\xed", "\xcd\xe3", + /* 0x4fc2 */ "\xab\x59", "\xab\x50", "\xab\x58", "\xcd\xde", "\x00\x00", +@@ -6545,7 +6645,7 @@ static const char from_ucs4[][2] = + /* 0x4fe0 */ "\xab\x4c", "\xab\x48", "\x00\x00", "\x00\x00", "\x96\xde", + /* 0x4fe5 */ "\x92\xac", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x4fe9 */ "\x00\x00", "\x00\x00", "\xcd\xef", "\x00\x00", "\xad\xd7", +- /* 0x4fef */ "\xad\xc1", "\x00\x00", "\xad\xd1", "\x9f\x6e", "\xad\xd6", ++ /* 0x4fef */ "\xad\xc1", "\x8c\x70", "\xad\xd1", "\x9f\x6e", "\xad\xd6", + /* 0x4ff4 */ "\xd0\xd0", "\xd0\xcf", "\xd0\xd4", "\xd0\xd5", "\xad\xc4", + /* 0x4ff9 */ "\x8e\xf2", "\xad\xcd", "\x00\x00", "\x00\x00", "\x9f\x6c", + /* 0x4ffe */ "\xad\xda", "\x00\x00", "\xad\xce", "\x00\x00", "\x00\x00", +@@ -6560,7 +6660,7 @@ static const char from_ucs4[][2] = + /* 0x502b */ "\xad\xdb", "\xd0\xd3", "\xad\xd8", "\x92\xa8", "\xd0\xdb", + /* 0x5030 */ "\xd0\xcd", "\xd0\xdc", "\x00\x00", "\xd0\xd1", "\x91\x63", + /* 0x5035 */ "\xd0\xda", "\x00\x00", "\xd0\xd2", "\x00\x00", "\x00\x00", +- /* 0x5039 */ "\x00\x00", "\x00\x00", "\xad\xc8", "\x00\x00", "\x00\x00", ++ /* 0x5039 */ "\x00\x00", "\x8c\x40", "\xad\xc8", "\x00\x00", "\x00\x00", + /* 0x503e */ "\x00\x00", "\xd4\x63", "\xd4\x57", "\x00\x00", "\xb0\xb3", + /* 0x5043 */ "\x00\x00", "\xd4\x5c", "\xd4\x62", "\xb0\xb2", "\xd4\x55", + /* 0x5049 */ "\xb0\xb6", "\xd4\x59", "\xd4\x52", "\xb0\xb4", "\xd4\x56", +@@ -6586,7 +6686,7 @@ static const char from_ucs4[][2] = + /* 0x50ad */ "\xb6\xc4", "\xdc\xb7", "\xb6\xcd", "\xdc\xbd", "\xdc\xc0", + /* 0x50b2 */ "\xb6\xc6", "\xb6\xc7", "\xdc\xba", "\xb6\xc5", "\xdc\xc3", + /* 0x50b7 */ "\xb6\xcb", "\xdc\xc4", "\x00\x00", "\xdc\xbf", "\xb6\xcc", +- /* 0x50bb */ "\x00\x00", "\xdc\xb4", "\xb6\xc9", "\xdc\xb5", "\x00\x00", ++ /* 0x50bc */ "\x8c\x71", "\xdc\xb4", "\xb6\xc9", "\xdc\xb5", "\x00\x00", + /* 0x50c1 */ "\xdc\xbe", "\xdc\xbc", "\x00\x00", "\xdc\xb8", "\xb6\xc8", + /* 0x50c6 */ "\xdc\xb6", "\xb6\xce", "\xdc\xbb", "\xdc\xc2", "\xdc\xb9", + /* 0x50cb */ "\xdc\xc1", "\x00\x00", "\x92\xa1", "\xb9\xb6", "\xb9\xb3", +@@ -6634,7 +6734,7 @@ static const char from_ucs4[][2] = + /* 0x519c */ "\x00\x00", "\xcb\xcd", "\x00\x00", "\xab\x61", "\x00\x00", + /* 0x51a2 */ "\xad\xe0", "\x00\x00", "\xad\xde", "\xad\xdf", "\x00\x00", + /* 0x51a7 */ "\x9e\x55", "\x92\xba", "\x00\x00", "\xbe\xad", "\xc6\xc5", +- /* 0x51ac */ "\xa5\x56", "\x00\x00", "\x00\x00", "\x00\x00", "\xa6\x42", ++ /* 0x51ac */ "\xa5\x56", "\x00\x00", "\x8c\x5b", "\x00\x00", "\xa6\x42", + /* 0x51b1 */ "\xc9\xbc", "\xfa\x7d", "\xfa\xa8", "\x9a\x68", "\xfa\x47", + /* 0x51b6 */ "\xa7\x4d", "\xa7\x4e", "\xfa\x7e", "\xca\x6b", "\x00\x00", + /* 0x51ba */ "\x00\x00", "\xcb\xce", "\xa8\xe6", "\xcb\xcf", "\x00\x00", +@@ -6666,7 +6766,7 @@ static const char from_ucs4[][2] = + /* 0x523c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xa8\xef", + /* 0x5241 */ "\x00\x00", "\xab\x63", "\xcd\xf0", "\x00\x00", "\xcb\xd3", + /* 0x5247 */ "\xab\x68", "\x00\x00", "\xcd\xf1", "\xab\x64", "\xab\x67", +- /* 0x524c */ "\xab\x66", "\xab\x65", "\xab\x62", "\x00\x00", "\x00\x00", ++ /* 0x524c */ "\xab\x66", "\xab\x65", "\xab\x62", "\x87\xbc", "\x00\x00", + /* 0x5250 */ "\x00\x00", "\xd0\xe8", "\x00\x00", "\xad\xe7", "\xd0\xeb", + /* 0x5256 */ "\xad\xe5", "\xfa\xb4", "\x00\x00", "\x92\xc4", "\xd0\xe7", + /* 0x525b */ "\xad\xe8", "\xad\xe6", "\xad\xe9", "\xd0\xe9", "\xd0\xea", +@@ -6709,7 +6809,7 @@ static const char from_ucs4[][2] = + /* 0x5313 */ "\x00\x00", "\xa4\x50", "\xa4\xc6", "\xa5\x5f", "\x00\x00", + /* 0x5319 */ "\xb0\xcd", "\xc9\x43", "\x00\x00", "\xc9\x6c", "\xa5\x60", + /* 0x531d */ "\x00\x00", "\xc9\xc2", "\xa6\x4b", "\xa6\x4a", "\xc9\xc1", +- /* 0x5323 */ "\xa7\x58", "\x00\x00", "\x00\x00", "\x00\x00", "\x89\xe5", ++ /* 0x5323 */ "\xa7\x58", "\x8c\x68", "\x00\x00", "\x00\x00", "\x89\xe5", + /* 0x5327 */ "\x00\x00", "\x00\x00", "\xad\xea", "\x00\x00", "\x9f\x7d", + /* 0x532d */ "\xd4\x6f", "\x00\x00", "\xb6\xd7", "\xe1\x45", "\xb9\xbc", + /* 0x5332 */ "\xa0\xa9", "\xfa\xc4", "\xe8\xfa", "\x00\x00", "\x00\x00", +@@ -6763,12 +6863,12 @@ static const char from_ucs4[][2] = + /* 0x5421 */ "\x00\x00", "\x89\xec", "\xca\xa5", "\xca\x7d", "\xa7\x5f", + /* 0x5427 */ "\xa7\x61", "\xca\xa4", "\xa7\x68", "\xca\x78", "\xa7\x74", + /* 0x542c */ "\xa7\x76", "\xa7\x5c", "\xa7\x6d", "\xfb\x44", "\xca\x76", +- /* 0x5431 */ "\xa7\x73", "\x9d\xe2", "\xa7\x64", "\x00\x00", "\xa7\x6e", ++ /* 0x5431 */ "\xa7\x73", "\x9d\xe2", "\xa7\x64", "\x8c\x75", "\xa7\x6e", + /* 0x5436 */ "\xa7\x6f", "\xca\x77", "\xa7\x6c", "\xa7\x6a", "\x00\x00", + /* 0x543b */ "\xa7\x6b", "\xa7\x71", "\xca\xa1", "\xa7\x5e", "\x00\x00", + /* 0x5440 */ "\xa7\x72", "\xca\xa3", "\xa7\x66", "\xa7\x63", "\x00\x00", + /* 0x5445 */ "\xca\x7a", "\xa7\x62", "\xca\xa6", "\xa7\x65", "\x00\x00", +- /* 0x544a */ "\xa7\x69", "\x9e\xc0", "\x00\x00", "\x9e\x56", "\xa7\x60", ++ /* 0x544a */ "\xa7\x69", "\x9e\xc0", "\x87\xc5", "\x9e\x56", "\xa7\x60", + /* 0x544f */ "\xca\xa2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x5454 */ "\xca\x79", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x5458 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -6905,7 +7005,7 @@ static const char from_ucs4[][2] = + /* 0x56e7 */ "\x00\x00", "\x00\x00", "\xa7\x77", "\xa7\x7a", "\x00\x00", + /* 0x56ed */ "\xfb\x5c", "\xca\xa7", "\xfb\x5b", "\xa7\x78", "\xfb\x57", + /* 0x56f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x56f7 */ "\xcb\xf0", "\x00\x00", "\xcb\xf1", "\xa9\x54", "\x00\x00", ++ /* 0x56f7 */ "\xcb\xf0", "\x00\x00", "\xcb\xf1", "\xa9\x54", "\x87\x65", + /* 0x56fb */ "\x00\x00", "\x98\xc7", "\x00\x00", "\xab\xaa", "\xfb\x5a", + /* 0x5701 */ "\xd1\x48", "\xd1\x49", "\xae\x45", "\xae\x46", "\x00\x00", + /* 0x5705 */ "\x00\x00", "\xd4\xac", "\xb0\xe9", "\xb0\xeb", "\xd4\xab", +@@ -6919,7 +7019,7 @@ static const char from_ucs4[][2] = + /* 0x572e */ "\xc9\xc8", "\xa6\x65", "\xa6\x61", "\x00\x00", "\x94\xa7", + /* 0x5733 */ "\xa6\x60", "\xc9\xca", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x5737 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa7\xa6", "\x00\x00", +- /* 0x573c */ "\x00\x00", "\xa7\xa3", "\x9b\xd4", "\xa7\x7d", "\xca\xaa", ++ /* 0x573d */ "\x8c\xcc", "\xa7\xa3", "\x9b\xd4", "\xa7\x7d", "\xca\xaa", + /* 0x5742 */ "\xfb\x64", "\xfb\x76", "\x00\x00", "\xca\xab", "\xfb\x60", + /* 0x5747 */ "\xa7\xa1", "\x00\x00", "\xca\xad", "\xa7\x7b", "\xca\xae", + /* 0x574c */ "\xca\xac", "\xa7\x7e", "\xa7\xa2", "\xa7\xa5", "\xa7\xa4", +@@ -6942,7 +7042,7 @@ static const char from_ucs4[][2] = + /* 0x57a1 */ "\x9b\xf4", "\xab\xaf", "\xab\xae", "\xce\x53", "\xce\x5c", + /* 0x57a5 */ "\x00\x00", "\x9e\xf7", "\x00\x00", "\x00\x00", "\x9e\xc1", + /* 0x57aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\xab\xb1", "\x00\x00", +- /* 0x57af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x99\x6f", ++ /* 0x57af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x87\xc3", "\x99\x6f", + /* 0x57b5 */ "\xce\x50", "\xd1\x53", "\x00\x00", "\xd1\x52", "\xd1\x57", + /* 0x57ba */ "\xd1\x4e", "\x96\xf1", "\xd1\x51", "\xd1\x50", "\x8e\x41", + /* 0x57bf */ "\xd1\x54", "\x00\x00", "\xd1\x58", "\xae\x47", "\xae\x4a", +@@ -6962,7 +7062,7 @@ static const char from_ucs4[][2] = + /* 0x5805 */ "\xb0\xed", "\xb0\xef", "\xd4\xbb", "\xd4\xb6", "\xae\x4b", + /* 0x580a */ "\xb0\xee", "\xd4\xb8", "\xd4\xc7", "\xd4\xcb", "\xd4\xc2", + /* 0x580e */ "\x00\x00", "\xd4\xc4", "\x00\x00", "\x97\xe5", "\x00\x00", +- /* 0x5814 */ "\xd4\xae", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x5814 */ "\xd4\xae", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\xc8", + /* 0x5819 */ "\xd8\xa1", "\x00\x00", "\xd8\xaa", "\xd8\xa9", "\xb3\xfa", + /* 0x581e */ "\xd8\xa2", "\x00\x00", "\xb3\xfb", "\xb3\xf9", "\x96\x7d", + /* 0x5823 */ "\xd8\xa4", "\xb3\xf6", "\xd8\xa8", "\xfb\x6c", "\xd8\xa3", +@@ -6987,8 +7087,8 @@ static const char from_ucs4[][2] = + /* 0x5882 */ "\xe1\x64", "\xb9\xd2", "\x00\x00", "\xb9\xd6", "\xe1\x5a", + /* 0x5887 */ "\xe1\x60", "\xe1\x65", "\xe1\x56", "\xb9\xd4", "\xe1\x5e", + /* 0x588b */ "\x00\x00", "\x00\x00", "\xe1\x62", "\xe1\x68", "\xe1\x58", +- /* 0x5891 */ "\xe1\x61", "\x00\x00", "\xb9\xd3", "\xe1\x67", "\x00\x00", +- /* 0x5895 */ "\x00\x00", "\x00\x00", "\xe1\x59", "\x8b\xaf", "\x9e\xbd", ++ /* 0x5891 */ "\xe1\x61", "\x8c\x77", "\xb9\xd3", "\xe1\x67", "\x00\x00", ++ /* 0x5896 */ "\x87\xb0", "\x00\x00", "\xe1\x59", "\x8b\xaf", "\x9e\xbd", + /* 0x589a */ "\x00\x00", "\xbc\x59", "\xe5\x4b", "\xbc\x57", "\xbc\x56", + /* 0x58a0 */ "\xe5\x4d", "\xe5\x52", "\x00\x00", "\xe5\x4e", "\x00\x00", + /* 0x58a5 */ "\xe5\x51", "\xbc\x5c", "\x9e\xe6", "\xbe\xa5", "\xbc\x5b", +@@ -6999,7 +7099,7 @@ static const char from_ucs4[][2] = + /* 0x58be */ "\xbe\xc1", "\xe9\x4c", "\x00\x00", "\xbe\xc0", "\xe9\x4e", + /* 0x58c2 */ "\x00\x00", "\x00\x00", "\xbe\xc3", "\xe9\x50", "\xbe\xc2", + /* 0x58c8 */ "\xe9\x49", "\xe9\x4b", "\x00\x00", "\x92\xea", "\x00\x00", +- /* 0x58cc */ "\x00\x00", "\xc0\xa5", "\xec\xcc", "\x00\x00", "\xc0\xa4", ++ /* 0x58cc */ "\x00\x00", "\xc0\xa5", "\xec\xcc", "\x8c\x78", "\xc0\xa4", + /* 0x58d2 */ "\xec\xcd", "\xc0\xa3", "\xec\xcb", "\xc0\xa2", "\xec\xca", + /* 0x58d6 */ "\x00\x00", "\xc2\x53", "\xc2\x52", "\xf1\xf6", "\xf1\xf8", + /* 0x58dc */ "\xfb\x72", "\xf1\xf7", "\xc3\x61", "\xc3\x62", "\xfb\x71", +@@ -7015,7 +7115,7 @@ static const char from_ucs4[][2] = + /* 0x590e */ "\xd1\x59", "\xae\x4c", "\x00\x00", "\xfe\x42", "\xf1\xf9", + /* 0x5912 */ "\x00\x00", "\xc4\xdc", "\xa4\x69", "\xa5\x7e", "\xc9\x70", + /* 0x5917 */ "\x00\x00", "\xa6\x67", "\xa6\x68", "\x00\x00", "\xa9\x5d", +- /* 0x591c */ "\x00\x00", "\x00\x00", "\xfb\x7b", "\xb0\xf7", "\x00\x00", ++ /* 0x591d */ "\x87\x68", "\x00\x00", "\xfb\x7b", "\xb0\xf7", "\x00\x00", + /* 0x5922 */ "\xb9\xda", "\x00\x00", "\xb9\xdb", "\xb9\xd9", "\x00\x00", + /* 0x5927 */ "\xa4\x6a", "\x00\x00", "\xa4\xd1", "\xa4\xd3", "\xa4\xd2", + /* 0x592c */ "\xc9\x5b", "\xa4\xd4", "\xa5\xa1", "\xc9\x71", "\x00\x00", +@@ -7047,7 +7147,7 @@ static const char from_ucs4[][2] = + /* 0x59ae */ "\xa9\x67", "\xa9\x6f", "\x97\xb3", "\xcc\x4f", "\xcc\x48", + /* 0x59b3 */ "\xa9\x70", "\xcc\x53", "\xcc\x44", "\xcc\x4b", "\x9f\x74", + /* 0x59b8 */ "\x92\xf1", "\xa9\x66", "\xcc\x45", "\xa9\x64", "\xcc\x4c", +- /* 0x59bd */ "\xcc\x50", "\xa9\x63", "\x00\x00", "\xcc\x51", "\xcc\x4a", ++ /* 0x59bd */ "\xcc\x50", "\xa9\x63", "\x8c\xfa", "\xcc\x51", "\xcc\x4a", + /* 0x59c1 */ "\x00\x00", "\xcc\x4d", "\x97\xdf", "\xa9\x72", "\xa9\x69", + /* 0x59c7 */ "\xcc\x54", "\xcc\x52", "\xfb\xa6", "\xa9\x6e", "\xa9\x6c", + /* 0x59cc */ "\xcc\x49", "\xa9\x6b", "\xcc\x47", "\xcc\x46", "\xa9\x6a", +@@ -7065,7 +7165,7 @@ static const char from_ucs4[][2] = + /* 0x5a07 */ "\x00\x00", "\xae\x5c", "\xd1\x62", "\x97\x42", "\xae\x5b", + /* 0x5a0d */ "\x94\xe6", "\x00\x00", "\xd1\x60", "\x00\x00", "\xae\x50", + /* 0x5a12 */ "\x92\xf5", "\xae\x55", "\x00\x00", "\xd1\x5f", "\xd1\x5c", +- /* 0x5a17 */ "\xd1\x61", "\xae\x51", "\xd1\x5b", "\x00\x00", "\xae\x54", ++ /* 0x5a17 */ "\xd1\x61", "\xae\x51", "\xd1\x5b", "\x8c\xc5", "\xae\x54", + /* 0x5a1c */ "\xae\x52", "\x00\x00", "\xd1\x63", "\xae\x53", "\xae\x57", + /* 0x5a21 */ "\x92\xfd", "\x00\x00", "\xae\x58", "\xfb\xa2", "\xae\x5a", + /* 0x5a25 */ "\x00\x00", "\x9c\x51", "\x00\x00", "\xae\x59", "\x94\xe9", +@@ -7093,7 +7193,7 @@ static const char from_ucs4[][2] = + /* 0x5a94 */ "\xd8\xb6", "\xd8\xc0", "\xfb\xba", "\xd8\xc5", "\x00\x00", + /* 0x5a99 */ "\x92\xeb", "\xb4\x41", "\xb4\x44", "\xd8\xcc", "\xd8\xcf", + /* 0x5a9e */ "\xd8\xba", "\xd8\xb7", "\xfc\x73", "\x97\xb7", "\xd8\xb9", +- /* 0x5aa2 */ "\x00\x00", "\x00\x00", "\xd8\xbe", "\xd8\xbc", "\xb4\x45", ++ /* 0x5aa2 */ "\x00\x00", "\x87\x6f", "\xd8\xbe", "\xd8\xbc", "\xb4\x45", + /* 0x5aa7 */ "\x00\x00", "\xd8\xc8", "\x00\x00", "\xfb\xb4", "\xd8\xbf", + /* 0x5aac */ "\x00\x00", "\xd8\xc1", "\xd8\xb5", "\xdc\xfa", "\xdc\xf8", + /* 0x5ab2 */ "\xb7\x42", "\xb7\x40", "\xdd\x43", "\xdc\xf9", "\xdd\x44", +@@ -7102,7 +7202,7 @@ static const char from_ucs4[][2] = + /* 0x5ac1 */ "\xb6\xf9", "\xb7\x41", "\x90\xa7", "\xdc\xf4", "\x00\x00", + /* 0x5ac6 */ "\xdc\xfe", "\xdc\xf3", "\xdc\xfc", "\xb6\xfa", "\xdd\x42", + /* 0x5acb */ "\xdc\xf5", "\xb6\xfb", "\xdd\x45", "\x97\x41", "\x92\xf4", +- /* 0x5acf */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xbc", "\x00\x00", ++ /* 0x5acf */ "\x00\x00", "\x87\x72", "\x00\x00", "\xfb\xbc", "\x00\x00", + /* 0x5ad5 */ "\xe1\x6e", "\xb9\xe2", "\xb9\xe1", "\xb9\xe3", "\xe1\x7a", + /* 0x5ada */ "\xe1\x70", "\xe1\x76", "\xe1\x6b", "\xe1\x79", "\xe1\x78", + /* 0x5adf */ "\xe1\x7c", "\xe1\x75", "\xb9\xde", "\xe1\x74", "\xb9\xe4", +@@ -7115,7 +7215,7 @@ static const char from_ucs4[][2] = + /* 0x5b02 */ "\xe5\x5b", "\xe5\x59", "\x00\x00", "\xe5\x5f", "\x00\x00", + /* 0x5b07 */ "\xe5\x5e", "\xbc\x63", "\xbc\x5e", "\x00\x00", "\xbc\x60", + /* 0x5b0c */ "\xbc\x62", "\x9e\xb5", "\x00\x00", "\xe5\x60", "\xe9\x57", +- /* 0x5b11 */ "\x96\x4b", "\x00\x00", "\xe9\x56", "\xe9\x55", "\x00\x00", ++ /* 0x5b11 */ "\x96\x4b", "\x00\x00", "\xe9\x56", "\xe9\x55", "\x8c\xac", + /* 0x5b16 */ "\xe9\x58", "\xe9\x51", "\x00\x00", "\xe9\x52", "\xe9\x5a", + /* 0x5b1b */ "\xe9\x53", "\x00\x00", "\xbe\xc5", "\xe9\x5c", "\xa0\xfa", + /* 0x5b20 */ "\xe9\x5b", "\xe9\x54", "\x00\x00", "\xec\xd1", "\xc0\xa8", +@@ -7141,21 +7241,21 @@ static const char from_ucs4[][2] = + /* 0x5b84 */ "\xc9\x73", "\xa6\x76", "\x00\x00", "\xa6\x74", "\xa6\x75", + /* 0x5b89 */ "\xa6\x77", "\x00\x00", "\xa7\xba", "\xa7\xb9", "\x00\x00", + /* 0x5b8e */ "\xca\xbc", "\xa7\xbb", "\x9e\x67", "\x00\x00", "\xca\xbd", +- /* 0x5b93 */ "\xcc\x57", "\x00\x00", "\xcc\x58", "\x00\x00", "\xa9\x76", ++ /* 0x5b93 */ "\xcc\x57", "\x00\x00", "\xcc\x58", "\x8c\xd9", "\xa9\x76", + /* 0x5b98 */ "\xa9\x78", "\xa9\x7a", "\xa9\x77", "\xa9\x7b", "\xa9\x79", + /* 0x5b9d */ "\xfb\xd2", "\x89\x62", "\x89\x63", "\x00\x00", "\x00\x00", + /* 0x5ba2 */ "\xab\xc8", "\xab\xc5", "\xab\xc7", "\xab\xc9", "\xab\xc6", + /* 0x5ba7 */ "\xd1\x66", "\xce\x77", "\x00\x00", "\xfc\x7d", "\x00\x00", + /* 0x5bac */ "\xd1\x68", "\xd1\x67", "\xae\x63", "\x00\x00", "\xae\x5f", + /* 0x5bb0 */ "\x00\x00", "\x00\x00", "\xae\x60", "\xae\x62", "\xae\x64", +- /* 0x5bb6 */ "\xae\x61", "\x00\x00", "\xae\x66", "\xae\x65", "\x00\x00", ++ /* 0x5bb6 */ "\xae\x61", "\x87\x73", "\xae\x66", "\xae\x65", "\x00\x00", + /* 0x5bba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xb1\x4a", + /* 0x5bc0 */ "\xd4\xf2", "\xd4\xf1", "\xb1\x49", "\x9f\x6b", "\xb1\x48", + /* 0x5bc5 */ "\xb1\x47", "\xb1\x4b", "\xb1\x46", "\x00\x00", "\x00\x00", + /* 0x5bca */ "\xd8\xd5", "\xd8\xd2", "\xb4\x49", "\xd8\xd1", "\xd8\xd6", + /* 0x5bce */ "\x00\x00", "\xb4\x4b", "\xd8\xd4", "\xb4\x48", "\xb4\x4a", + /* 0x5bd4 */ "\xd8\xd3", "\xfb\xcc", "\xdd\x48", "\xfe\xae", "\xdd\x49", +- /* 0x5bd9 */ "\xdd\x4a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x5bd9 */ "\xdd\x4a", "\x00\x00", "\x87\x6d", "\x00\x00", "\x00\x00", + /* 0x5bde */ "\xb9\xe6", "\xb9\xee", "\xe1\x7e", "\xb9\xe8", "\xb9\xec", + /* 0x5be3 */ "\xe1\xa1", "\xb9\xed", "\xb9\xe9", "\xb9\xea", "\xb9\xe7", + /* 0x5be8 */ "\xb9\xeb", "\xbc\x66", "\xd8\xd0", "\xbc\x67", "\xbc\x65", +@@ -7186,7 +7286,7 @@ static const char from_ucs4[][2] = + /* 0x5c65 */ "\xbc\x69", "\x00\x00", "\xe5\x61", "\xc0\xab", "\xef\xc2", + /* 0x5c6a */ "\xef\xc3", "\x00\x00", "\xc4\xdd", "\xf8\xa8", "\xc9\x4b", + /* 0x5c6f */ "\xa4\xd9", "\x00\x00", "\xa4\x73", "\x00\x00", "\xc9\x77", +- /* 0x5c74 */ "\xc9\x76", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x5c74 */ "\xc9\x76", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xe9", + /* 0x5c79 */ "\xa6\x7a", "\xc9\xd7", "\xc9\xd8", "\xc9\xd6", "\x00\x00", + /* 0x5c7e */ "\xc9\xd9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x5c82 */ "\x00\x00", "\x00\x00", "\xfb\xdd", "\xca\xc7", "\x00\x00", +@@ -7205,15 +7305,15 @@ static const char from_ucs4[][2] = + /* 0x5cc3 */ "\x00\x00", "\x00\x00", "\xce\xab", "\xce\xa4", "\xce\xaa", + /* 0x5cc9 */ "\xce\xa3", "\xce\xa5", "\xce\x7d", "\xce\x7b", "\x00\x00", + /* 0x5cce */ "\xce\xac", "\xce\xa9", "\xce\x79", "\x9f\x58", "\xab\xd0", +- /* 0x5cd3 */ "\xce\xa7", "\xce\xa8", "\x00\x00", "\xce\xa6", "\xce\x7c", ++ /* 0x5cd3 */ "\xce\xa7", "\xce\xa8", "\x8c\xe6", "\xce\xa6", "\xce\x7c", + /* 0x5cd8 */ "\xce\x7a", "\xab\xcf", "\xce\xa2", "\xce\x7e", "\x00\x00", + /* 0x5cdc */ "\x00\x00", "\xce\xa1", "\xce\xad", "\x00\x00", "\x00\x00", + /* 0x5ce1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x73", "\x00\x00", + /* 0x5ce6 */ "\x00\x00", "\xae\x6f", "\xfb\xde", "\xae\x6e", "\x00\x00", + /* 0x5cec */ "\xd1\x6c", "\xae\x6b", "\xd1\x6e", "\xfb\xdf", "\xae\x70", +- /* 0x5cf1 */ "\xd1\x6f", "\x00\x00", "\x00\x00", "\xae\x73", "\x00\x00", ++ /* 0x5cf1 */ "\xd1\x6f", "\x00\x00", "\x00\x00", "\xae\x73", "\x8c\x48", + /* 0x5cf6 */ "\xae\x71", "\xd1\x70", "\xce\xae", "\xd1\x72", "\x00\x00", +- /* 0x5cfb */ "\xae\x6d", "\x00\x00", "\xae\x6c", "\x00\x00", "\xd1\x6d", ++ /* 0x5cfb */ "\xae\x6d", "\x87\x74", "\xae\x6c", "\x00\x00", "\xd1\x6d", + /* 0x5d00 */ "\xd1\x71", "\xae\x72", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x5d04 */ "\x00\x00", "\xb1\x53", "\xb1\x52", "\x00\x00", "\x00\x00", + /* 0x5d09 */ "\x00\x00", "\xd4\xf5", "\xd4\xf9", "\xd4\xfb", "\xb1\x54", +@@ -7238,7 +7338,7 @@ static const char from_ucs4[][2] = + /* 0x5d69 */ "\xb7\x43", "\x00\x00", "\xd8\xdb", "\xdd\x52", "\x00\x00", + /* 0x5d6d */ "\x00\x00", "\xb7\x44", "\x98\xad", "\xdd\x4d", "\xdd\x51", + /* 0x5d72 */ "\x00\x00", "\x9e\xea", "\x00\x00", "\x00\x00", "\xe1\xa9", +- /* 0x5d77 */ "\x00\x00", "\xe1\xb0", "\xe1\xa7", "\x00\x00", "\xe1\xae", ++ /* 0x5d78 */ "\x8c\xec", "\xe1\xb0", "\xe1\xa7", "\x8c\xd4", "\xe1\xae", + /* 0x5d7d */ "\xe1\xa5", "\xe1\xad", "\xe1\xb1", "\xe1\xa4", "\xe1\xa8", + /* 0x5d82 */ "\xe1\xa3", "\x00\x00", "\xb9\xf1", "\x9c\xeb", "\xe1\xa6", + /* 0x5d87 */ "\xb9\xf2", "\xe1\xac", "\xe1\xab", "\xe1\xaa", "\xfb\xe0", +@@ -7294,8 +7394,8 @@ static const char from_ucs4[][2] = + /* 0x5e80 */ "\x00\x00", "\xc9\x7a", "\xfb\xc3", "\xc9\xdc", "\x00\x00", + /* 0x5e86 */ "\x89\x65", "\xa7\xc8", "\xca\xd0", "\xca\xce", "\xa7\xc9", + /* 0x5e8b */ "\xca\xcd", "\xca\xcf", "\xca\xd1", "\x00\x00", "\xa7\xc7", +- /* 0x5e8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x5e95 */ "\xa9\xb3", "\xa9\xb4", "\xa9\xb1", "\x00\x00", "\x00\x00", ++ /* 0x5e8f */ "\x00\x00", "\x00\x00", "\x8c\x7a", "\x00\x00", "\x00\x00", ++ /* 0x5e95 */ "\xa9\xb3", "\xa9\xb4", "\xa9\xb1", "\x00\x00", "\x8c\x7b", + /* 0x5e9a */ "\xa9\xb0", "\xce\xb8", "\xa9\xb2", "\x00\x00", "\x00\x00", + /* 0x5e9e */ "\x00\x00", "\xab\xd6", "\x00\x00", "\xce\xb7", "\xce\xb9", + /* 0x5ea4 */ "\xce\xb6", "\xce\xba", "\xab\xd7", "\xae\x79", "\xd1\x75", +@@ -7328,7 +7428,7 @@ static const char from_ucs4[][2] = + /* 0x5f2a */ "\x00\x00", "\x00\x00", "\xab\xda", "\xce\xbc", "\x00\x00", + /* 0x5f30 */ "\xd1\x7a", "\xae\x7a", "\x00\x00", "\xd1\x79", "\x00\x00", + /* 0x5f35 */ "\xb1\x69", "\xd5\x4c", "\xb1\x6a", "\xd5\x4d", "\x00\x00", +- /* 0x5f3a */ "\xfc\x4c", "\x00\x00", "\xb4\x5d", "\x00\x00", "\x00\x00", ++ /* 0x5f3a */ "\xfc\x4c", "\x8c\xfe", "\xb4\x5d", "\x00\x00", "\x00\x00", + /* 0x5f3e */ "\x00\x00", "\xdd\x62", "\x00\x00", "\x00\x00", "\xe1\xbf", + /* 0x5f44 */ "\xe1\xbe", "\x00\x00", "\xb9\xfb", "\x00\x00", "\xbc\x75", + /* 0x5f49 */ "\xe5\x76", "\xbe\xca", "\xe9\x74", "\xc0\xb1", "\x95\xb8", +@@ -7355,7 +7455,7 @@ static const char from_ucs4[][2] = + /* 0x5fb2 */ "\xe5\x77", "\x00\x00", "\x00\x00", "\xbc\x78", "\xe1\xc1", + /* 0x5fb7 */ "\xbc\x77", "\x00\x00", "\xb9\xfd", "\xa0\x51", "\xec\xde", + /* 0x5fbc */ "\xe9\x75", "\xc0\xb2", "\xec\xdd", "\xf2\x40", "\xf4\x48", +- /* 0x5fc1 */ "\xf4\x49", "\x00\x00", "\xa4\xdf", "\x8b\xcb", "\xa5\xb2", ++ /* 0x5fc1 */ "\xf4\x49", "\x8c\x7c", "\xa4\xdf", "\x8b\xcb", "\xa5\xb2", + /* 0x5fc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xc9\x7b", "\x00\x00", + /* 0x5fca */ "\x00\x00", "\xa7\xd2", "\xa7\xd4", "\x00\x00", "\xc9\xe2", + /* 0x5fd0 */ "\xca\xd8", "\xca\xd7", "\xca\xd6", "\x00\x00", "\xc9\xe1", +@@ -7425,7 +7525,7 @@ static const char from_ucs4[][2] = + /* 0x6110 */ "\xd9\x4d", "\x00\x00", "\xb4\x74", "\xd9\x45", "\xd8\xfe", + /* 0x6115 */ "\xb4\x6a", "\xd9\x42", "\x00\x00", "\xd9\x4b", "\x9e\xf1", + /* 0x611a */ "\xb7\x4d", "\xb7\x52", "\xb4\x67", "\xd9\x4c", "\x00\x00", +- /* 0x611f */ "\xb7\x50", "\x00\x00", "\x00\x00", "\x00\x00", "\xb4\x68", ++ /* 0x611f */ "\xb7\x50", "\x00\x00", "\x00\x00", "\x8c\x4d", "\xb4\x68", + /* 0x6123 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xb7\x5c", "\xe1\xc3", + /* 0x6129 */ "\xdd\x70", "\x00\x00", "\xdd\x68", "\xe1\xc2", "\x00\x00", + /* 0x612e */ "\xdd\x6c", "\xdd\x6e", "\x9f\x7e", "\x00\x00", "\xdd\x6b", +@@ -7508,7 +7608,7 @@ static const char from_ucs4[][2] = + /* 0x62af */ "\xcc\xbc", "\xcc\xbf", "\xa9\xea", "\x00\x00", "\xcc\xbb", + /* 0x62b4 */ "\xcc\xb4", "\xa9\xe8", "\xcc\xb8", "\x00\x00", "\xcc\xc0", + /* 0x62b9 */ "\xa9\xd9", "\x00\x00", "\xcc\xbd", "\xa9\xe3", "\xa9\xe2", +- /* 0x62be */ "\xcc\xb6", "\xa9\xd7", "\x00\x00", "\x00\x00", "\xa9\xd8", ++ /* 0x62be */ "\xcc\xb6", "\xa9\xd7", "\x00\x00", "\x87\xdd", "\xa9\xd8", + /* 0x62c3 */ "\x9b\x46", "\xa9\xd6", "\xfc\xae", "\xa9\xee", "\xa9\xe6", + /* 0x62c8 */ "\xa9\xe0", "\xa9\xd4", "\xcc\xb9", "\xa9\xdf", "\xa9\xd5", + /* 0x62cd */ "\xa9\xe7", "\xa9\xf0", "\xce\xd4", "\xa9\xe4", "\xcc\xb5", +@@ -7651,7 +7751,7 @@ static const char from_ucs4[][2] = + /* 0x657a */ "\xe5\xbe", "\xe5\xc0", "\xe9\xb1", "\x00\x00", "\x00\x00", + /* 0x657f */ "\xe9\xb0", "\xec\xef", "\xec\xee", "\xc0\xc4", "\xc0\xc5", + /* 0x6584 */ "\xf2\x48", "\xfc\xc9", "\x8d\xac", "\xa4\xe5", "\xfb\xc6", +- /* 0x6589 */ "\x89\x67", "\x00\x00", "\x00\x00", "\xd9\x79", "\x00\x00", ++ /* 0x6589 */ "\x89\x67", "\x00\x00", "\x8c\x7e", "\xd9\x79", "\x00\x00", + /* 0x658d */ "\x00\x00", "\x00\x00", "\xb4\xb4", "\xb4\xb3", "\xdd\xbd", + /* 0x6592 */ "\x00\x00", "\xef\xd8", "\xc4\xe3", "\xf7\xde", "\xa4\xe6", + /* 0x6597 */ "\x00\x00", "\xae\xc6", "\x00\x00", "\xb1\xd8", "\xb1\xd7", +@@ -7690,11 +7790,11 @@ static const char from_ucs4[][2] = + /* 0x663c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xae\xd0", + /* 0x6642 */ "\xae\xc9", "\xae\xcc", "\xfc\xda", "\xae\xcf", "\x00\x00", + /* 0x6647 */ "\xd1\xd5", "\x9b\x71", "\xae\xca", "\xd1\xd3", "\xfc\xdd", +- /* 0x664c */ "\xae\xce", "\x00\x00", "\x00\x00", "\xae\xcb", "\x00\x00", ++ /* 0x664c */ "\xae\xce", "\x87\x64", "\x00\x00", "\xae\xcb", "\x00\x00", + /* 0x6651 */ "\xd1\xd6", "\xae\xcd", "\x8d\xaf", "\x00\x00", "\x00\x00", + /* 0x6655 */ "\x00\x00", "\xfa\xf2", "\x00\x00", "\xd5\xac", "\xb1\xdf", + /* 0x665b */ "\xd5\xab", "\xd5\xad", "\xb1\xde", "\xb1\xe3", "\xd1\xd4", +- /* 0x665f */ "\x00\x00", "\xd5\xaa", "\xd5\xae", "\x93\xd8", "\xb1\xe0", ++ /* 0x6660 */ "\x87\xb5", "\xd5\xaa", "\xd5\xae", "\x93\xd8", "\xb1\xe0", + /* 0x6665 */ "\xd5\xa9", "\xb1\xe2", "\xfc\xdf", "\xb1\xe1", "\x00\x00", + /* 0x666a */ "\xd9\xa7", "\x93\xd3", "\xd9\xa2", "\x00\x00", "\xb4\xb6", + /* 0x666f */ "\xb4\xba", "\xb4\xb7", "\xd9\xa5", "\xd9\xa8", "\xfc\xe1", +@@ -7721,7 +7821,7 @@ static const char from_ucs4[][2] = + /* 0x66d8 */ "\xef\xdc", "\xc0\xc6", "\xef\xda", "\xef\xdb", "\xc2\x60", + /* 0x66dd */ "\xc3\x6e", "\xf2\x4b", "\x00\x00", "\xc3\x6d", "\x00\x00", + /* 0x66e1 */ "\x00\x00", "\xf4\x51", "\xf4\x52", "\x00\x00", "\xc4\x66", +- /* 0x66e6 */ "\x00\x00", "\xf4\x50", "\xc4\xe4", "\x00\x00", "\xf7\xdf", ++ /* 0x66e7 */ "\x8c\xdb", "\xf4\x50", "\xc4\xe4", "\x00\x00", "\xf7\xdf", + /* 0x66ec */ "\xc5\xce", "\xf8\xaa", "\xf8\xab", "\x00\x00", "\xa4\xea", + /* 0x66f1 */ "\x9d\xf1", "\xa6\xb1", "\xa6\xb2", "\xa7\xf3", "\x00\x00", + /* 0x66f6 */ "\xcc\xd1", "\xac\x54", "\xae\xd1", "\xb1\xe4", "\x00\x00", +@@ -7731,7 +7831,7 @@ static const char from_ucs4[][2] = + /* 0x670a */ "\xcc\xd2", "\xaa\x42", "\xa0\xbb", "\xaa\x41", "\x9b\x7e", + /* 0x670f */ "\xce\xf9", "\xce\xfa", "\x00\x00", "\xd1\xd7", "\xd1\xd8", + /* 0x6714 */ "\xae\xd2", "\xae\xd3", "\x8d\xb3", "\xae\xd4", "\xd5\xaf", +- /* 0x6718 */ "\x00\x00", "\x00\x00", "\xb1\xe6", "\x00\x00", "\xb4\xc2", ++ /* 0x6719 */ "\x8c\x52", "\x00\x00", "\xb1\xe6", "\x00\x00", "\xb4\xc2", + /* 0x671e */ "\x9a\xe8", "\xb4\xc1", "\xdd\xc8", "\xdf\x7a", "\xe1\xfb", + /* 0x6723 */ "\xe9\xbd", "\x00\x00", "\x8e\xdc", "\xc2\x61", "\xc4\x67", + /* 0x6728 */ "\xa4\xec", "\x00\x00", "\xa5\xbc", "\xa5\xbd", "\xa5\xbb", +@@ -7747,12 +7847,12 @@ static const char from_ucs4[][2] = + /* 0x675a */ "\xcb\x46", "\x00\x00", "\xa7\xf9", "\xcb\x44", "\xa7\xfb", + /* 0x675f */ "\xa7\xf4", "\xa7\xfe", "\x98\xe7", "\xfc\xf3", "\x00\x00", + /* 0x6763 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xf2", "\x00\x00", +- /* 0x6768 */ "\x00\x00", "\xaa\x57", "\x00\x00", "\xcc\xd4", "\xaa\x43", +- /* 0x676d */ "\x00\x00", "\xaa\x4d", "\xaa\x4e", "\xaa\x46", "\xaa\x58", ++ /* 0x6768 */ "\x00\x00", "\xaa\x57", "\x8c\xca", "\xcc\xd4", "\xaa\x43", ++ /* 0x676e */ "\x87\x75", "\xaa\x4d", "\xaa\x4e", "\xaa\x46", "\xaa\x58", + /* 0x6773 */ "\xaa\x48", "\xcc\xdc", "\xaa\x53", "\xcc\xd7", "\xaa\x49", + /* 0x6778 */ "\xcc\xe6", "\xcc\xe7", "\xcc\xdf", "\xcc\xd8", "\xaa\x56", + /* 0x677d */ "\xcc\xe4", "\xaa\x51", "\xaa\x4f", "\x00\x00", "\xcc\xe5", +- /* 0x6781 */ "\x00\x00", "\xcc\xe3", "\xcc\xdb", "\xcc\xd3", "\xcc\xda", ++ /* 0x6782 */ "\x87\xba", "\xcc\xe3", "\xcc\xdb", "\xcc\xd3", "\xcc\xda", + /* 0x6787 */ "\xaa\x4a", "\x00\x00", "\xaa\x50", "\x00\x00", "\xaa\x44", + /* 0x678c */ "\xcc\xde", "\xcc\xdd", "\xcc\xd5", "\x93\xe5", "\xaa\x52", + /* 0x6791 */ "\xcc\xe1", "\xcc\xd6", "\xaa\x55", "\xcc\xe8", "\xaa\x45", +@@ -7833,7 +7933,7 @@ static const char from_ucs4[][2] = + /* 0x6908 */ "\xd9\xbe", "\x8d\xbd", "\xd9\xcb", "\xd9\xca", "\xd9\xaa", + /* 0x690d */ "\xb4\xd3", "\xb4\xd5", "\xd9\xb2", "\xd9\xb9", "\xd9\xc1", + /* 0x6912 */ "\xb4\xd4", "\xd9\xb8", "\xd9\xc4", "\xd9\xd7", "\x00\x00", +- /* 0x6917 */ "\xd9\xcc", "\x9b\xa1", "\x00\x00", "\x9a\xb7", "\x8e\xfc", ++ /* 0x6917 */ "\xd9\xcc", "\x9b\xa1", "\x8c\xa2", "\x9a\xb7", "\x8e\xfc", + /* 0x691b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x6920 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xd9\xd8", + /* 0x6925 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xd9\xae", +@@ -7887,19 +7987,19 @@ static const char from_ucs4[][2] = + /* 0x6a16 */ "\xe5\xef", "\xe5\xcc", "\xe5\xe8", "\xbc\xd0", "\x97\xf9", + /* 0x6a1b */ "\xe5\xd6", "\x95\x58", "\xe5\xd7", "\xbc\xcf", "\xbc\xcc", + /* 0x6a20 */ "\xe5\xd2", "\xbc\xd2", "\x00\x00", "\xbc\xcb", "\x00\x00", +- /* 0x6a25 */ "\xe5\xe9", "\xe5\xec", "\xe5\xd9", "\xe9\xca", "\x00\x00", ++ /* 0x6a25 */ "\xe5\xe9", "\xe5\xec", "\xe5\xd9", "\xe9\xca", "\x87\xb6", + /* 0x6a29 */ "\x00\x00", "\x98\x5e", "\xfe\x7b", "\x94\xcd", "\x00\x00", + /* 0x6a2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\xe9\xc2", "\x93\xee", + /* 0x6a34 */ "\xe9\xbe", "\xbe\xf6", "\x00\x00", "\x00\x00", "\xbe\xeb", + /* 0x6a39 */ "\xbe\xf0", "\xbe\xec", "\xe9\xcc", "\xe9\xd7", "\xbe\xea", + /* 0x6a3e */ "\xe9\xc4", "\xe9\xcd", "\xe5\xdf", "\xe9\xce", "\x00\x00", +- /* 0x6a42 */ "\x00\x00", "\xbe\xf1", "\xfd\x5a", "\xe9\xdd", "\xbe\xf5", ++ /* 0x6a43 */ "\x8c\xa3", "\xbe\xf1", "\xfd\x5a", "\xe9\xdd", "\xbe\xf5", + /* 0x6a48 */ "\xbe\xf8", "\xe9\xc0", "\x00\x00", "\xbe\xf4", "\x93\xf5", + /* 0x6a4d */ "\xe9\xdb", "\xe9\xdc", "\xe9\xd2", "\xe9\xd1", "\xe9\xc9", + /* 0x6a52 */ "\x93\xef", "\x8e\xea", "\xe9\xd3", "\xe9\xda", "\xe9\xd9", + /* 0x6a57 */ "\x8f\x5b", "\xbe\xef", "\xbe\xed", "\xe9\xcb", "\xe9\xc8", + /* 0x6a5b */ "\x00\x00", "\xe9\xc5", "\xe9\xd8", "\xbe\xf7", "\xe9\xd6", +- /* 0x6a61 */ "\xbe\xf3", "\xbe\xf2", "\x00\x00", "\xe9\xd0", "\x8d\xc6", ++ /* 0x6a61 */ "\xbe\xf3", "\xbe\xf2", "\x8c\x5e", "\xe9\xd0", "\x8d\xc6", + /* 0x6a66 */ "\xe9\xbf", "\xe9\xc1", "\xe9\xc3", "\xe9\xd5", "\xe9\xcf", + /* 0x6a6b */ "\xbe\xee", "\x00\x00", "\xe9\xc6", "\x00\x00", "\xe9\xd4", + /* 0x6a6f */ "\x00\x00", "\x8d\xc8", "\x00\x00", "\x00\x00", "\x8d\xc7", +@@ -8033,7 +8133,7 @@ static const char from_ucs4[][2] = + /* 0x6cf0 */ "\xae\xf5", "\xaa\x74", "\xcc\xfe", "\xaa\x61", "\x00\x00", + /* 0x6cf5 */ "\xac\xa6", "\x00\x00", "\x00\x00", "\x00\x00", "\xcd\x4c", + /* 0x6cf9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x6cfe */ "\x00\x00", "\xcf\x7c", "\xcf\xa1", "\x8d\xd7", "\xcf\xa4", ++ /* 0x6cff */ "\x8c\xa5", "\xcf\x7c", "\xcf\xa1", "\x8d\xd7", "\xcf\xa4", + /* 0x6d04 */ "\xcf\x77", "\x92\xfb", "\x8d\xd8", "\xcf\xa7", "\xcf\xaa", + /* 0x6d09 */ "\xcf\xac", "\xcf\x74", "\xac\x76", "\xac\x7b", "\xd2\x49", + /* 0x6d0e */ "\xac\xad", "\xcf\xa5", "\xcf\xad", "\xcf\x7b", "\xcf\x73", +@@ -8084,7 +8184,7 @@ static const char from_ucs4[][2] = + /* 0x6def */ "\xd2\x52", "\xd5\xf9", "\xb2\x60", "\xd6\x41", "\xb2\x45", + /* 0x6df4 */ "\xd5\xf5", "\xb2\x57", "\xd5\xe9", "\xb2\x56", "\x00\x00", + /* 0x6df9 */ "\xb2\x54", "\xb2\x4c", "\xb2\x4b", "\xd9\xe7", "\xd6\x43", +- /* 0x6dfd */ "\x00\x00", "\x00\x00", "\xd5\xeb", "\x00\x00", "\x97\xd5", ++ /* 0x6dfe */ "\x8c\x41", "\x00\x00", "\xd5\xeb", "\x00\x00", "\x97\xd5", + /* 0x6e03 */ "\xd9\xfc", "\x94\x4a", "\xb2\x4d", "\x00\x00", "\x00\x00", + /* 0x6e07 */ "\x00\x00", "\x00\x00", "\x94\x4d", "\x00\x00", "\x00\x00", + /* 0x6e0c */ "\x00\x00", "\x00\x00", "\x97\xcb", "\x00\x00", "\x00\x00", +@@ -8101,7 +8201,7 @@ static const char from_ucs4[][2] = + /* 0x6e44 */ "\xb5\x44", "\xd9\xef", "\xd9\xe8", "\xd9\xe9", "\x00\x00", + /* 0x6e49 */ "\xd9\xeb", "\xb4\xea", "\xd9\xf8", "\x00\x00", "\xb4\xf8", + /* 0x6e4e */ "\xb5\x42", "\xfd\xc0", "\xfc\xf9", "\xd9\xfa", "\xda\x53", +- /* 0x6e53 */ "\xda\x4b", "\xb4\xe6", "\xda\x51", "\xb4\xf2", "\x00\x00", ++ /* 0x6e53 */ "\xda\x4b", "\xb4\xe6", "\xda\x51", "\xb4\xf2", "\x8c\xdd", + /* 0x6e58 */ "\xb4\xf0", "\xfb\x7e", "\xda\x57", "\xb4\xef", "\xda\x41", + /* 0x6e5d */ "\xd9\xf4", "\xd9\xfe", "\xb5\x47", "\xda\x45", "\xda\x42", + /* 0x6e62 */ "\xd9\xf0", "\xb5\x43", "\xda\x4f", "\xda\x4c", "\xda\x54", +@@ -8202,15 +8302,15 @@ static const char from_ucs4[][2] = + /* 0x703c */ "\x00\x00", "\xc4\x69", "\xf4\x63", "\xf4\x66", "\xf4\x69", + /* 0x7042 */ "\xf4\x61", "\xf5\xd3", "\xf5\xd4", "\xf5\xd8", "\xf5\xd9", + /* 0x7046 */ "\x00\x00", "\xf5\xd6", "\xf5\xd7", "\xf5\xd5", "\xfd\xe0", +- /* 0x704c */ "\xc4\xe9", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\xf6", ++ /* 0x704c */ "\xc4\xe9", "\x8c\x67", "\x00\x00", "\x00\x00", "\x8d\xf6", + /* 0x7051 */ "\xc5\x78", "\xf6\xeb", "\x00\x00", "\x8d\xf7", "\xf6\xe8", + /* 0x7056 */ "\xf6\xe9", "\xf6\xea", "\xc5\x79", "\x00\x00", "\xf7\xe5", + /* 0x705b */ "\xf7\xe4", "\x8f\xfa", "\xf8\xaf", "\xc5\xf4", "\xf8\xad", + /* 0x7060 */ "\xf8\xb0", "\xf8\xae", "\xf8\xf5", "\xc6\x57", "\xc6\x65", + /* 0x7065 */ "\xf9\xa3", "\xf9\x6c", "\x97\xd0", "\xf9\xa2", "\xf9\xd0", +- /* 0x706a */ "\xf9\xd1", "\xa4\xf5", "\x8b\xd2", "\x00\x00", "\x00\x00", ++ /* 0x706a */ "\xf9\xd1", "\xa4\xf5", "\x8b\xd2", "\x00\x00", "\x87\xde", + /* 0x706f */ "\x8d\xf8", "\xa6\xc7", "\xca\x41", "\x00\x00", "\x00\x00", +- /* 0x7074 */ "\xcb\x5e", "\x90\xd9", "\xa8\x5f", "\x00\x00", "\xa8\x62", ++ /* 0x7074 */ "\xcb\x5e", "\x90\xd9", "\xa8\x5f", "\x8c\x47", "\xa8\x62", + /* 0x7079 */ "\xfa\xf0", "\xcb\x5f", "\x00\x00", "\xa8\x60", "\xa8\x61", + /* 0x707e */ "\xfd\xe1", "\x8d\xf9", "\x00\x00", "\xfd\xe3", "\xcd\x58", + /* 0x7083 */ "\xcd\x5a", "\xcd\x55", "\xcd\x52", "\xcd\x54", "\x00\x00", +@@ -8255,7 +8355,7 @@ static const char from_ucs4[][2] = + /* 0x7146 */ "\xb7\xda", "\xde\x6b", "\x00\x00", "\xb7\xd2", "\xfd\xf0", + /* 0x714b */ "\xde\x7a", "\xb7\xd7", "\xde\xa2", "\xb7\xce", "\xfd\xf4", + /* 0x7150 */ "\xde\x7d", "\x9b\xf5", "\xde\x6d", "\xde\x7e", "\xde\x6c", +- /* 0x7154 */ "\x00\x00", "\xb7\xdc", "\x00\x00", "\xde\x78", "\xb7\xcf", ++ /* 0x7154 */ "\x00\x00", "\xb7\xdc", "\x8c\xee", "\xde\x78", "\xb7\xcf", + /* 0x715a */ "\xde\xa3", "\x00\x00", "\xb7\xd4", "\xde\x71", "\xb7\xd9", + /* 0x715f */ "\xde\x7c", "\xde\x6f", "\xde\x76", "\xde\x72", "\xde\x6e", + /* 0x7164 */ "\xb7\xd1", "\xb7\xd8", "\xb7\xd6", "\xb7\xd3", "\xb7\xdb", +@@ -8267,7 +8367,7 @@ static const char from_ucs4[][2] = + /* 0x7182 */ "\xe2\xbf", "\x00\x00", "\xba\xb6", "\xe2\xbe", "\xe2\xc2", + /* 0x7187 */ "\xe2\xba", "\x98\xe0", "\xe2\xbc", "\xba\xb5", "\x00\x00", + /* 0x718c */ "\x92\xca", "\x00\x00", "\x98\x57", "\xe2\xc0", "\xe2\xbb", +- /* 0x7190 */ "\x00\x00", "\xba\xb7", "\x00\x00", "\xba\xb2", "\x00\x00", ++ /* 0x7191 */ "\x8c\x51", "\xba\xb7", "\x00\x00", "\xba\xb2", "\x00\x00", + /* 0x7196 */ "\xfd\xeb", "\xe2\xc4", "\x9b\x49", "\xba\xb3", "\xe6\x67", + /* 0x719b */ "\xe6\x64", "\xe6\x70", "\xe6\x6a", "\xe6\x6c", "\xbc\xf4", + /* 0x71a0 */ "\xe6\x66", "\xe6\x6e", "\x9d\x76", "\x9e\xaf", "\xe6\x6d", +@@ -8289,14 +8389,14 @@ static const char from_ucs4[][2] = + /* 0x71f0 */ "\xed\x61", "\xed\x5d", "\xed\x5f", "\x00\x00", "\xc0\xed", + /* 0x71f5 */ "\x98\xbf", "\x9e\x49", "\x00\x00", "\xc2\x77", "\xef\xfb", + /* 0x71f9 */ "\x00\x00", "\xc2\x74", "\xc2\x75", "\xef\xfd", "\xc2\x76", +- /* 0x71ff */ "\xef\xfa", "\x00\x00", "\xef\xf9", "\xf2\x6c", "\xef\xfc", ++ /* 0x71ff */ "\xef\xfa", "\x8c\xa7", "\xef\xf9", "\xf2\x6c", "\xef\xfc", + /* 0x7203 */ "\x00\x00", "\xf2\x6d", "\xc3\x7a", "\xf2\x6b", "\x00\x00", + /* 0x7209 */ "\x9b\xca", "\xf2\x6a", "\x00\x00", "\xf2\x69", "\xc3\x7b", + /* 0x720e */ "\xfd\xfe", "\x92\xdc", "\xc4\x6c", "\x00\x00", "\x00\x00", + /* 0x7213 */ "\xf4\x6a", "\xf4\x6b", "\xfe\x41", "\x91\xcc", "\x91\xe2", + /* 0x7217 */ "\x00\x00", "\xf5\xdc", "\xf5\xdb", "\xc4\xea", "\x00\x00", + /* 0x721d */ "\xf5\xda", "\xf6\xec", "\xf6\xed", "\x00\x00", "\x00\x00", +- /* 0x7222 */ "\xf7\xe6", "\xf8\xb1", "\xfe\x44", "\x00\x00", "\xf8\xf6", ++ /* 0x7222 */ "\xf7\xe6", "\xf8\xb1", "\xfe\x44", "\x87\x5f", "\xf8\xf6", + /* 0x7227 */ "\xf9\xbc", "\xc6\x79", "\xf9\xc6", "\xa4\xf6", "\x8b\xd3", + /* 0x722c */ "\xaa\xa6", "\xaa\xa7", "\xfe\x47", "\x00\x00", "\xac\xb8", + /* 0x7230 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xc0\xef", +@@ -8368,7 +8468,7 @@ static const char from_ucs4[][2] = + /* 0x737b */ "\xc4\x6d", "\xf4\x6e", "\xf4\x6d", "\xf5\xdd", "\xf6\xef", + /* 0x7380 */ "\xc5\x7a", "\xf7\xe8", "\xf7\xe7", "\xf7\xe9", "\xa5\xc8", + /* 0x7385 */ "\xcf\xc6", "\xaf\x59", "\xb2\x76", "\xd6\x6a", "\xa5\xc9", +- /* 0x738a */ "\xc9\xa7", "\xa4\xfd", "\x00\x00", "\x00\x00", "\xca\x45", ++ /* 0x738a */ "\xc9\xa7", "\xa4\xfd", "\x8c\xa9", "\x00\x00", "\xca\x45", + /* 0x738f */ "\x98\xae", "\x00\x00", "\x00\x00", "\xcb\x6c", "\xcb\x6a", + /* 0x7394 */ "\xcb\x6b", "\xcb\x68", "\xa8\x68", "\xcb\x69", "\x92\xd6", + /* 0x7398 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\xe1", "\xcd\x6d", +@@ -8377,9 +8477,9 @@ static const char from_ucs4[][2] = + /* 0x73a8 */ "\xaa\xb2", "\xaa\xb1", "\xfe\x5b", "\xaa\xb4", "\xcd\x6c", + /* 0x73ad */ "\xcd\x68", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x73b2 */ "\xac\xc2", "\xac\xc5", "\xcf\xce", "\xcf\xcd", "\xcf\xcc", +- /* 0x73b7 */ "\xac\xbf", "\xcf\xd5", "\xcf\xcb", "\x00\x00", "\xac\xc1", ++ /* 0x73b7 */ "\xac\xbf", "\xcf\xd5", "\xcf\xcb", "\x8c\x53", "\xac\xc1", + /* 0x73bc */ "\xd2\xaf", "\x00\x00", "\xcf\xd2", "\xcf\xd0", "\xac\xc4", +- /* 0x73c0 */ "\x00\x00", "\xcf\xc8", "\xcf\xd3", "\x00\x00", "\xcf\xca", ++ /* 0x73c0 */ "\x00\x00", "\xcf\xc8", "\xcf\xd3", "\x87\xbf", "\xcf\xca", + /* 0x73c6 */ "\xcf\xd4", "\xcf\xd1", "\xcf\xc9", "\xfe\x5e", "\xac\xc0", + /* 0x73cb */ "\xcf\xd6", "\xcf\xc7", "\xac\xc3", "\xfb\xd7", "\xfe\x5a", + /* 0x73d0 */ "\x94\xc5", "\x00\x00", "\xd2\xb4", "\xd2\xab", "\xd2\xb6", +@@ -8392,7 +8492,7 @@ static const char from_ucs4[][2] = + /* 0x73f3 */ "\x97\x64", "\xd6\x78", "\xd6\x6d", "\xd6\x6b", "\xfe\x68", + /* 0x73f8 */ "\xd6\x6c", "\x96\x4e", "\xd6\x73", "\x97\x65", "\xd6\x74", + /* 0x73fd */ "\xd6\x70", "\xb2\x7b", "\xd6\x75", "\xd6\x72", "\xd6\x6f", +- /* 0x7401 */ "\x00\x00", "\xb2\x79", "\xd6\x6e", "\xb2\x77", "\xb2\x7a", ++ /* 0x7402 */ "\x8c\x5a", "\xb2\x79", "\xd6\x6e", "\xb2\x77", "\xb2\x7a", + /* 0x7407 */ "\xd6\x71", "\xd6\x79", "\xaf\x5b", "\xb2\x78", "\xd6\x77", + /* 0x740c */ "\xd6\x76", "\xb2\x7c", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x7411 */ "\x89\xa1", "\x95\xfa", "\x00\x00", "\x92\xd4", "\xfe\x69", +@@ -8406,12 +8506,12 @@ static const char from_ucs4[][2] = + /* 0x7439 */ "\xfe\x6c", "\xb5\x57", "\x00\x00", "\x94\x6b", "\x00\x00", + /* 0x743d */ "\x00\x00", "\xb7\xe9", "\xde\xb7", "\xb7\xe8", "\xde\xbb", + /* 0x7443 */ "\x92\xfc", "\xde\xb1", "\x95\xeb", "\xde\xbc", "\xfe\x73", +- /* 0x7448 */ "\x97\x6e", "\xfe\x5f", "\xde\xb2", "\xde\xb3", "\x00\x00", ++ /* 0x7448 */ "\x97\x6e", "\xfe\x5f", "\xde\xb2", "\xde\xb3", "\x87\xb8", + /* 0x744d */ "\xde\xbd", "\xde\xba", "\xde\xb8", "\xde\xb9", "\xde\xb5", + /* 0x7452 */ "\xde\xb4", "\xfd\xbd", "\xde\xbe", "\xb7\xe5", "\x92\xd5", + /* 0x7457 */ "\xde\xb6", "\x00\x00", "\xb7\xea", "\xb7\xe4", "\xb7\xeb", + /* 0x745c */ "\xb7\xec", "\xfe\xb9", "\xb7\xe7", "\xb7\xe6", "\xfe\x71", +- /* 0x7460 */ "\x00\x00", "\xe2\xce", "\xba\xbe", "\xba\xbd", "\xfb\xbb", ++ /* 0x7461 */ "\x87\x78", "\xe2\xce", "\xba\xbe", "\xba\xbd", "\xfb\xbb", + /* 0x7465 */ "\x00\x00", "\xe2\xd3", "\x94\x7a", "\xbc\xfc", "\xba\xbf", + /* 0x746b */ "\x95\xfb", "\xfe\x77", "\xba\xc1", "\xe2\xd4", "\xb7\xe3", + /* 0x7470 */ "\xba\xc0", "\xe2\xd0", "\xe2\xd2", "\xe2\xcf", "\xfe\x79", +@@ -8423,15 +8523,15 @@ static const char from_ucs4[][2] = + /* 0x748d */ "\x00\x00", "\x00\x00", "\xed\x69", "\x00\x00", "\xea\x66", + /* 0x7492 */ "\x00\x00", "\xea\x65", "\xea\x67", "\x00\x00", "\xed\x66", + /* 0x7498 */ "\xbf\x5a", "\x92\xd3", "\xea\x63", "\x94\xb8", "\xbf\x58", +- /* 0x749c */ "\x00\x00", "\xbf\x5c", "\xbf\x5b", "\xea\x64", "\xea\x68", ++ /* 0x749d */ "\x87\x79", "\xbf\x5c", "\xbf\x5b", "\xea\x64", "\xea\x68", + /* 0x74a1 */ "\x00\x00", "\xbf\x59", "\xfc\x71", "\xed\x6d", "\xc0\xf5", + /* 0x74a7 */ "\xc2\x7a", "\xc0\xf6", "\xc0\xf3", "\xed\x6a", "\xed\x68", + /* 0x74ab */ "\x00\x00", "\xed\x6b", "\x00\x00", "\xed\x6e", "\xc0\xf4", + /* 0x74b1 */ "\xed\x6c", "\xed\x67", "\x00\x00", "\x97\x5e", "\xf0\x42", +- /* 0x74b6 */ "\xf0\x45", "\xf2\x75", "\xf0\x40", "\x00\x00", "\xf4\x6f", ++ /* 0x74b6 */ "\xf0\x45", "\xf2\x75", "\xf0\x40", "\x8c\xad", "\xf4\x6f", + /* 0x74bb */ "\xf0\x46", "\x00\x00", "\xc3\xa2", "\xf0\x44", "\xc2\x7b", + /* 0x74c0 */ "\xf0\x41", "\xf0\x43", "\xf0\x47", "\xf2\x76", "\x00\x00", +- /* 0x74c5 */ "\xf2\x74", "\x00\x00", "\x00\x00", "\xfe\xa7", "\x00\x00", ++ /* 0x74c5 */ "\xf2\x74", "\x87\xc1", "\x00\x00", "\xfe\xa7", "\x00\x00", + /* 0x74ca */ "\xc3\xa3", "\xf2\x73", "\x94\x6a", "\x00\x00", "\x00\x00", + /* 0x74cf */ "\xc4\x6e", "\x93\xe3", "\x00\x00", "\x00\x00", "\x98\xcf", + /* 0x74d4 */ "\xc4\xed", "\xf6\xf1", "\xc4\xec", "\xf6\xf3", "\xf6\xf0", +@@ -8537,7 +8637,7 @@ static const char from_ucs4[][2] = + /* 0x76c8 */ "\xac\xd5", "\xd2\xcc", "\xaf\x71", "\x00\x00", "\xfe\xcb", + /* 0x76cd */ "\xaf\x72", "\xaf\x73", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x76d2 */ "\xb2\xb0", "\xd6\xa7", "\xb2\xaf", "\x00\x00", "\x9f\xc2", +- /* 0x76d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xda\xb9", "\xb2\xb1", ++ /* 0x76d6 */ "\x00\x00", "\x00\x00", "\x8c\x6b", "\xda\xb9", "\xb2\xb1", + /* 0x76dc */ "\xb5\x73", "\xde\xd7", "\xb7\xf8", "\xb7\xf9", "\x00\x00", + /* 0x76e1 */ "\xba\xc9", "\x00\x00", "\xba\xca", "\xbd\x4c", "\xbf\x64", + /* 0x76e6 */ "\xea\x75", "\xbf\x63", "\x00\x00", "\xed\x79", "\xc0\xfa", +@@ -8589,7 +8689,7 @@ static const char from_ucs4[][2] = + /* 0x77cc */ "\xf4\x74", "\xf4\x77", "\xf4\x75", "\xf4\x76", "\xf5\xe0", + /* 0x77d0 */ "\x00\x00", "\x00\x00", "\xc4\xef", "\xf7\xeb", "\xf8\xb4", + /* 0x77d5 */ "\x00\x00", "\xc5\xf7", "\xf8\xf8", "\xf8\xf9", "\xc6\x66", +- /* 0x77db */ "\xa5\xd9", "\xac\xe1", "\x00\x00", "\xda\xc3", "\x00\x00", ++ /* 0x77db */ "\xa5\xd9", "\xac\xe1", "\x8c\x6e", "\xda\xc3", "\x00\x00", + /* 0x77e0 */ "\xde\xe3", "\x00\x00", "\xa5\xda", "\xa8\x6f", "\x00\x00", + /* 0x77e5 */ "\xaa\xbe", "\xfa\xd8", "\xcf\xe8", "\xcf\xe9", "\xaf\x78", + /* 0x77e9 */ "\x00\x00", "\x00\x00", "\xda\xc4", "\xb5\x75", "\xb8\x47", +@@ -8642,7 +8742,7 @@ static const char from_ucs4[][2] = + /* 0x78d5 */ "\xbd\x57", "\x00\x00", "\xfe\xe7", "\x9f\xfb", "\x00\x00", + /* 0x78da */ "\xbf\x6a", "\xea\xa8", "\x00\x00", "\xea\xa2", "\xea\xa6", + /* 0x78df */ "\xea\xac", "\xea\xad", "\xea\xa9", "\xea\xaa", "\xea\xa7", +- /* 0x78e3 */ "\x00\x00", "\xea\xa4", "\x00\x00", "\xbf\x6c", "\xbf\x69", ++ /* 0x78e4 */ "\x8c\x59", "\xea\xa4", "\x00\x00", "\xbf\x6c", "\xbf\x69", + /* 0x78e9 */ "\xea\xa3", "\xea\xa5", "\x00\x00", "\xbf\x6b", "\xea\xab", + /* 0x78ee */ "\x93\xc9", "\xc1\x46", "\x94\xe8", "\xfb\x56", "\xed\xaa", + /* 0x78f3 */ "\xed\xa5", "\xc1\x45", "\x90\xc5", "\x00\x00", "\xc1\x43", +@@ -8688,8 +8788,8 @@ static const char from_ucs4[][2] = + /* 0x79bb */ "\xd6\xc3", "\x00\x00", "\xb8\x56", "\xa5\xdd", "\xa8\x72", + /* 0x79c0 */ "\xa8\x71", "\xa8\x70", "\x00\x00", "\x00\x00", "\x97\xa8", + /* 0x79c5 */ "\xcd\xa4", "\xfe\xfc", "\x00\x00", "\xaa\xc4", "\xaa\xc3", +- /* 0x79c9 */ "\x00\x00", "\xac\xee", "\xfd\xbf", "\xcf\xfa", "\xcf\xfd", +- /* 0x79cf */ "\xcf\xfb", "\x00\x00", "\xac\xec", "\xac\xed", "\x00\x00", ++ /* 0x79ca */ "\x8c\xde", "\xac\xee", "\xfd\xbf", "\xcf\xfa", "\xcf\xfd", ++ /* 0x79cf */ "\xcf\xfb", "\x87\xb3", "\xac\xec", "\xac\xed", "\x00\x00", + /* 0x79d4 */ "\xfe\xfe", "\xcf\xf9", "\xcf\xfc", "\x00\x00", "\xaf\xb5", + /* 0x79d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xd2\xf3", "\xd2\xf5", + /* 0x79de */ "\xd2\xf4", "\xaf\xb2", "\xd2\xef", "\x00\x00", "\x96\xd1", +@@ -8707,8 +8807,8 @@ static const char from_ucs4[][2] = + /* 0x7a1a */ "\xb8\x58", "\xdf\x40", "\xb8\x57", "\x00\x00", "\xb8\x5c", + /* 0x7a1f */ "\xb8\x5b", "\xb8\x59", "\x00\x00", "\xde\xfd", "\x00\x00", + /* 0x7a23 */ "\x00\x00", "\x00\x00", "\xe3\x49", "\x00\x00", "\xe3\x48", +- /* 0x7a28 */ "\x00\x00", "\x00\x00", "\xe3\x44", "\x00\x00", "\xa0\xb3", +- /* 0x7a2e */ "\xba\xd8", "\xe3\x47", "\xe3\x46", "\xba\xd9", "\x00\x00", ++ /* 0x7a28 */ "\x00\x00", "\x8c\x63", "\xe3\x44", "\x87\xbb", "\xa0\xb3", ++ /* 0x7a2e */ "\xba\xd8", "\xe3\x47", "\xe3\x46", "\xba\xd9", "\x87\xb4", + /* 0x7a32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xbd\x5e", + /* 0x7a37 */ "\x00\x00", "\xe6\xd2", "\x94\xcf", "\xbd\x5f", "\xbd\x5b", + /* 0x7a3d */ "\xbd\x5d", "\x9f\xfa", "\xbd\x5a", "\xbd\x5c", "\x00\x00", +@@ -8721,14 +8821,14 @@ static const char from_ucs4[][2] = + /* 0x7a60 */ "\xc2\xaa", "\xc2\xa8", "\xc2\xa9", "\x00\x00", "\x00\x00", + /* 0x7a65 */ "\x8e\x4c", "\x00\x00", "\xf2\xa6", "\xf2\xa7", "\xc3\xad", + /* 0x7a69 */ "\x00\x00", "\xc3\xac", "\xf4\xa3", "\xf4\xa4", "\xf4\xa2", +- /* 0x7a6e */ "\x00\x00", "\xf6\xf8", "\xf6\xf9", "\x00\x00", "\x00\x00", ++ /* 0x7a6e */ "\x00\x00", "\xf6\xf8", "\xf6\xf9", "\x87\xc9", "\x00\x00", + /* 0x7a74 */ "\xa5\xde", "\xca\x48", "\xa8\x73", "\x00\x00", "\xcd\xa5", + /* 0x7a79 */ "\xaa\xc6", "\xaa\xc5", "\xcd\xa6", "\x00\x00", "\x8e\x4d", + /* 0x7a7e */ "\xd0\x40", "\xac\xef", "\xcf\xfe", "\xac\xf0", "\x00\x00", + /* 0x7a83 */ "\x9a\x73", "\xaf\xb6", "\xd2\xf8", "\xd2\xf6", "\xd2\xfc", + /* 0x7a88 */ "\xaf\xb7", "\xd2\xf7", "\xd2\xfb", "\xd2\xf9", "\xd2\xfa", + /* 0x7a8c */ "\x00\x00", "\x00\x00", "\xd6\xc8", "\xd6\xca", "\x99\x47", +- /* 0x7a92 */ "\xb2\xbf", "\x00\x00", "\xd6\xc9", "\xb2\xc0", "\xb5\xa2", ++ /* 0x7a92 */ "\xb2\xbf", "\x8c\xb1", "\xd6\xc9", "\xb2\xc0", "\xb5\xa2", + /* 0x7a97 */ "\xb5\xa1", "\xb5\x7e", "\xda\xdb", "\x00\x00", "\x00\x00", + /* 0x7a9b */ "\x00\x00", "\x00\x00", "\xdf\x44", "\xb8\x5d", "\xb8\x5e", + /* 0x7aa0 */ "\x00\x00", "\xdf\x43", "\xdf\x42", "\x00\x00", "\x00\x00", +@@ -8749,7 +8849,7 @@ static const char from_ucs4[][2] = + /* 0x7aeb */ "\x00\x00", "\xba\xdc", "\xe3\x4d", "\xba\xdd", "\x00\x00", + /* 0x7af0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x7af6 */ "\xc4\x76", "\xf4\xa5", "\x00\x00", "\xa6\xcb", "\xaa\xc7", +- /* 0x7afb */ "\xcd\xa7", "\x00\x00", "\xac\xf2", "\x94\xeb", "\xac\xf1", ++ /* 0x7afb */ "\xcd\xa7", "\x87\xa3", "\xac\xf2", "\x94\xeb", "\xac\xf1", + /* 0x7b00 */ "\xd0\x42", "\xd0\x43", "\x00\x00", "\x00\x00", "\xd3\x40", + /* 0x7b05 */ "\xd3\x42", "\xaf\xb9", "\x00\x00", "\xd3\x44", "\xd3\x47", + /* 0x7b0a */ "\xd3\x45", "\x8e\x5c", "\x95\x53", "\x00\x00", "\xd3\x46", +@@ -8784,12 +8884,12 @@ static const char from_ucs4[][2] = + /* 0x7b9b */ "\xe3\x56", "\xe3\x4f", "\xba\xe3", "\x00\x00", "\x00\x00", + /* 0x7ba0 */ "\xbd\x69", "\xba\xde", "\x8e\x61", "\x9f\x59", "\xe3\x5c", + /* 0x7ba4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x7ba9 */ "\x00\x00", "\x00\x00", "\xe6\xd9", "\xbd\x62", "\x00\x00", ++ /* 0x7ba9 */ "\x00\x00", "\x00\x00", "\xe6\xd9", "\xbd\x62", "\x87\xd0", + /* 0x7baf */ "\xe6\xdb", "\x00\x00", "\xbd\x63", "\x8b\xb3", "\x00\x00", + /* 0x7bb4 */ "\xbd\x65", "\xe6\xde", "\x00\x00", "\xe6\xd6", "\xba\xe6", + /* 0x7bb9 */ "\xe6\xdc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x7bbe */ "\xe6\xd8", "\x00\x00", "\xb8\x60", "\xbd\x68", "\x00\x00", +- /* 0x7bc2 */ "\x00\x00", "\xbd\x64", "\x00\x00", "\xbd\x66", "\xbd\x67", ++ /* 0x7bc2 */ "\x00\x00", "\xbd\x64", "\x87\xb9", "\xbd\x66", "\xbd\x67", + /* 0x7bc7 */ "\x00\x00", "\xbf\x76", "\xe6\xdd", "\xe6\xd7", "\xbd\x6a", + /* 0x7bcc */ "\x00\x00", "\xe6\xda", "\x9f\x5d", "\x8e\x66", "\x00\x00", + /* 0x7bd1 */ "\x00\x00", "\x00\x00", "\xea\xc0", "\xea\xbb", "\x00\x00", +@@ -8797,7 +8897,7 @@ static const char from_ucs4[][2] = + /* 0x7bdc */ "\xea\xc3", "\xea\xba", "\xea\xb7", "\xea\xc6", "\xc1\x51", + /* 0x7be1 */ "\xbf\x79", "\xea\xc2", "\xea\xb8", "\xbf\x77", "\xea\xbc", + /* 0x7be6 */ "\xbf\x7b", "\xea\xb9", "\xea\xbe", "\xbf\x7a", "\xea\xc1", +- /* 0x7beb */ "\xea\xc4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x7beb */ "\xea\xc4", "\x8c\xb2", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x7bf0 */ "\xed\xcb", "\xed\xcc", "\xed\xbc", "\xed\xc3", "\xed\xc1", + /* 0x7bf4 */ "\x00\x00", "\x00\x00", "\xc1\x4f", "\xed\xc8", "\xea\xbf", + /* 0x7bfa */ "\x8e\x6e", "\xed\xbf", "\x9f\x64", "\xed\xc9", "\xc1\x4e", +@@ -8840,7 +8940,7 @@ static const char from_ucs4[][2] = + /* 0x7cb3 */ "\xb8\x65", "\xdf\x55", "\xb8\x66", "\x00\x00", "\x00\x00", + /* 0x7cb8 */ "\x99\x5a", "\xba\xe9", "\xe3\x61", "\xe3\x5e", "\xe3\x60", + /* 0x7cbd */ "\xba\xea", "\xba\xeb", "\xe3\x5f", "\x00\x00", "\x00\x00", +- /* 0x7cc2 */ "\xa0\xb0", "\x00\x00", "\x00\x00", "\xe6\xdf", "\x00\x00", ++ /* 0x7cc2 */ "\xa0\xb0", "\x8c\xb3", "\x00\x00", "\xe6\xdf", "\x00\x00", + /* 0x7cc7 */ "\x8e\x79", "\xe6\xe0", "\x8e\x78", "\xbd\x6b", "\xe6\xe2", + /* 0x7ccc */ "\xe6\xe1", "\x94\xf3", "\xa2\x61", "\x00\x00", "\xea\xca", + /* 0x7cd1 */ "\xea\xcb", "\xea\xc7", "\x98\xaf", "\xea\xc8", "\xbf\x7c", +@@ -8880,9 +8980,9 @@ static const char from_ucs4[][2] = + /* 0x7d7b */ "\xdf\x5f", "\xdf\x61", "\xdf\x65", "\x00\x00", "\xdf\x5b", + /* 0x7d80 */ "\xdf\x59", "\xb8\x6a", "\x00\x00", "\xdf\x60", "\xdf\x64", + /* 0x7d85 */ "\xdf\x5c", "\xdf\x58", "\x00\x00", "\xdf\x57", "\x8e\xa7", +- /* 0x7d89 */ "\x00\x00", "\x00\x00", "\xdf\x62", "\xdf\x5a", "\xdf\x5e", ++ /* 0x7d89 */ "\x00\x00", "\x8c\x76", "\xdf\x62", "\xdf\x5a", "\xdf\x5e", + /* 0x7d8f */ "\xb8\x6b", "\x00\x00", "\xb8\x69", "\xdf\x66", "\xb8\x67", +- /* 0x7d94 */ "\xdf\x63", "\x00\x00", "\xe3\x72", "\x95\x42", "\x00\x00", ++ /* 0x7d94 */ "\xdf\x63", "\x87\x67", "\xe3\x72", "\x95\x42", "\x00\x00", + /* 0x7d98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xba\xee", "\xe3\x6a", + /* 0x7d9e */ "\xbd\x78", "\xe3\x74", "\xba\xf1", "\xe3\x78", "\xba\xf7", + /* 0x7da3 */ "\xe3\x65", "\x98\x7d", "\x00\x00", "\xe3\x75", "\xe3\x62", +@@ -8921,11 +9021,11 @@ static const char from_ucs4[][2] = + /* 0x7e48 */ "\xc1\x66", "\xed\xd7", "\x00\x00", "\x00\x00", "\xed\xdb", + /* 0x7e4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\xf0\x6e", "\xf0\x74", + /* 0x7e52 */ "\xc2\xb9", "\xf0\x77", "\xc2\xb4", "\xc2\xb5", "\xf0\x6f", +- /* 0x7e57 */ "\xf0\x76", "\xf0\x71", "\xc2\xba", "\xc2\xb7", "\x00\x00", ++ /* 0x7e57 */ "\xf0\x76", "\xf0\x71", "\xc2\xba", "\xc2\xb7", "\x8c\xdc", + /* 0x7e5c */ "\xf0\x6d", "\x00\x00", "\xc2\xb6", "\xf0\x73", "\xf0\x75", + /* 0x7e61 */ "\xc2\xb8", "\xf0\x72", "\xf0\x70", "\x00\x00", "\x98\x76", + /* 0x7e65 */ "\x00\x00", "\x8e\xa1", "\xf2\xb8", "\xc3\xb7", "\xc3\xb8", +- /* 0x7e6b */ "\xc3\xb4", "\x00\x00", "\xc3\xb5", "\x8e\xb7", "\xf2\xb4", ++ /* 0x7e6b */ "\xc3\xb4", "\x8c\xb4", "\xc3\xb5", "\x8e\xb7", "\xf2\xb4", + /* 0x7e70 */ "\xf2\xb2", "\x00\x00", "\xf2\xb6", "\xc3\xba", "\xf2\xb7", + /* 0x7e75 */ "\xf2\xb0", "\xf2\xaf", "\xf2\xb3", "\xf2\xb1", "\xc3\xb6", + /* 0x7e7a */ "\xf2\xb5", "\xf4\xac", "\xc4\x7e", "\xc4\x7d", "\xf4\xad", +@@ -9078,7 +9178,7 @@ static const char from_ucs4[][2] = + /* 0x8159 */ "\x99\x7d", "\x99\x7e", "\xdf\x77", "\xdf\x75", "\x00\x00", + /* 0x815e */ "\xdf\x7b", "\x00\x00", "\xdf\x73", "\xdf\xa2", "\xdf\x78", + /* 0x8162 */ "\x00\x00", "\xdf\x72", "\xb8\x7b", "\xb8\xa3", "\xdf\x7d", +- /* 0x8167 */ "\x00\x00", "\xdf\x76", "\x00\x00", "\xb8\x7e", "\x00\x00", ++ /* 0x8167 */ "\x00\x00", "\xdf\x76", "\x00\x00", "\xb8\x7e", "\x8c\xfb", + /* 0x816d */ "\x8b\x5b", "\xb8\x7c", "\xdf\x7e", "\xb8\x79", "\xb8\x78", + /* 0x8172 */ "\xdf\x79", "\xb8\x7d", "\xb5\xcd", "\x00\x00", "\xdf\x7c", + /* 0x8177 */ "\xdf\x74", "\xb8\x7a", "\xb8\xa1", "\xb8\xa2", "\x00\x00", +@@ -9146,7 +9246,7 @@ static const char from_ucs4[][2] = + /* 0x82ad */ "\xaa\xdd", "\xcd\xba", "\xaa\xe4", "\xaa\xe7", "\xaa\xe1", + /* 0x82b1 */ "\x00\x00", "\xaa\xda", "\xcd\xbe", "\xcd\xb8", "\xcd\xc5", + /* 0x82b7 */ "\xaa\xe9", "\xaa\xe5", "\xaa\xe0", "\xcd\xbd", "\xaf\xec", +- /* 0x82bc */ "\xcd\xbb", "\xaa\xde", "\xaa\xe8", "\x00\x00", "\xcd\xb3", ++ /* 0x82bc */ "\xcd\xbb", "\xaa\xde", "\xaa\xe8", "\x8c\xd0", "\xcd\xb3", + /* 0x82c0 */ "\x00\x00", "\xcd\xc2", "\xcd\xc4", "\x8b\x52", "\x00\x00", + /* 0x82c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x99\xb0", + /* 0x82ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x89\x77", +@@ -9158,7 +9258,7 @@ static const char from_ucs4[][2] = + /* 0x82e8 */ "\x00\x00", "\xd0\x7e", "\xd0\x73", "\xd0\x76", "\xd0\xa5", + /* 0x82ee */ "\xfa\x4d", "\xad\x66", "\xd0\x7d", "\xad\x5e", "\xd0\x78", + /* 0x82f3 */ "\xd0\xa4", "\xd0\x75", "\xd0\x79", "\xd0\x7c", "\x9d\xe4", +- /* 0x82f7 */ "\x00\x00", "\xd0\x6d", "\xd0\xa3", "\xd0\x7b", "\xfb\xe9", ++ /* 0x82f8 */ "\x8c\xb5", "\xd0\x6d", "\xd0\xa3", "\xd0\x7b", "\xfb\xe9", + /* 0x82fd */ "\x9b\x54", "\xd0\x6c", "\x99\xb2", "\xd0\x70", "\xad\x5f", + /* 0x8302 */ "\xad\x5a", "\xad\x53", "\xad\x58", "\xad\x54", "\xad\x67", + /* 0x8307 */ "\xd0\x6e", "\xd3\xa5", "\xad\x5b", "\x00\x00", "\x9e\x68", +@@ -9237,7 +9337,7 @@ static const char from_ucs4[][2] = + /* 0x8474 */ "\xdf\xba", "\xb8\xaa", "\xdf\xac", "\xb8\xa7", "\xdf\xc4", + /* 0x8479 */ "\xdf\xad", "\xdf\xc2", "\x00\x00", "\x00\x00", "\xdf\xb7", + /* 0x847e */ "\xdf\xdb", "\x91\xc7", "\x95\x5f", "\x00\x00", "\xb8\xa6", +- /* 0x8482 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xdf\xb3", "\x00\x00", ++ /* 0x8482 */ "\x00\x00", "\x87\xab", "\x00\x00", "\xdf\xb3", "\x00\x00", + /* 0x8488 */ "\x99\xbb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x848d */ "\xdf\xaf", "\xdf\xd5", "\xdf\xae", "\xbb\x60", "\xe3\xd3", + /* 0x8492 */ "\x8e\x6d", "\x8f\x71", "\xe3\xc2", "\x00\x00", "\x94\xcb", +@@ -9262,7 +9362,7 @@ static const char from_ucs4[][2] = + /* 0x84f1 */ "\xdf\xa9", "\xe7\x5f", "\xe7\x63", "\xe7\x5d", "\x00\x00", + /* 0x84f6 */ "\xe7\x70", "\xe7\x61", "\x99\xbf", "\xe7\x77", "\xe7\x5a", + /* 0x84fb */ "\xe7\x58", "\xe7\x64", "\xe7\x6e", "\xe7\x69", "\xbd\xb6", +- /* 0x8500 */ "\xe7\x4f", "\x00\x00", "\xe7\x6d", "\x92\x42", "\x00\x00", ++ /* 0x8500 */ "\xe7\x4f", "\x00\x00", "\xe7\x6d", "\x92\x42", "\x87\xd7", + /* 0x8505 */ "\xfb\xa5", "\xbd\xb7", "\xdf\xbd", "\xe7\x5b", "\xe7\x52", + /* 0x850a */ "\xe7\x55", "\xe7\x7b", "\xe7\x5c", "\xe7\x53", "\xe7\x51", + /* 0x850f */ "\xe7\x4e", "\x99\xc0", "\xbd\xb0", "\xe7\x65", "\xbd\xaf", +@@ -9281,7 +9381,7 @@ static const char from_ucs4[][2] = + /* 0x854f */ "\x00\x00", "\xeb\x46", "\x99\xc2", "\xea\xfc", "\xeb\x55", + /* 0x8555 */ "\xeb\x4f", "\xea\xf8", "\xee\x46", "\xea\xfe", "\xbf\xb7", + /* 0x855a */ "\x8f\x5c", "\xeb\x4a", "\x00\x00", "\xeb\x54", "\xbf\xbf", +- /* 0x855e */ "\x00\x00", "\xeb\x51", "\xea\xfd", "\xeb\x44", "\xeb\x48", ++ /* 0x855f */ "\x8c\xbd", "\xeb\x51", "\xea\xfd", "\xeb\x44", "\xeb\x48", + /* 0x8564 */ "\xeb\x42", "\xeb\x56", "\xeb\x53", "\xeb\x50", "\xbf\xb9", + /* 0x8569 */ "\xbf\xba", "\xbf\xbe", "\xea\xfa", "\xeb\x57", "\xbf\xbd", + /* 0x856e */ "\xeb\x4d", "\x99\xc4", "\x99\xc5", "\xeb\x4b", "\x00\x00", +@@ -9291,8 +9391,8 @@ static const char from_ucs4[][2] = + /* 0x8582 */ "\xee\x4f", "\xed\xf3", "\xc1\xa1", "\xee\x51", "\xee\x49", + /* 0x8587 */ "\xc1\xa8", "\xee\x50", "\xee\x42", "\xc1\xaa", "\xed\xf9", + /* 0x858c */ "\xeb\x52", "\xee\x4a", "\xee\x47", "\xed\xf5", "\xee\x55", +- /* 0x8591 */ "\xc1\xa4", "\x00\x00", "\x00\x00", "\xc1\xa5", "\xed\xf7", +- /* 0x8596 */ "\xee\x48", "\x00\x00", "\xee\x54", "\xee\x4b", "\xed\xfd", ++ /* 0x8591 */ "\xc1\xa4", "\x00\x00", "\x87\x76", "\xc1\xa5", "\xed\xf7", ++ /* 0x8596 */ "\xee\x48", "\x8c\xb6", "\xee\x54", "\xee\x4b", "\xed\xfd", + /* 0x859b */ "\xc1\xa7", "\xc1\xa3", "\xee\x4c", "\xed\xfe", "\xee\x56", + /* 0x85a0 */ "\xed\xf8", "\xee\x43", "\xee\x4e", "\xed\xfa", "\xed\xfc", + /* 0x85a4 */ "\x00\x00", "\xc2\xcb", "\xed\xf6", "\xc1\xa9", "\xc2\xc4", +@@ -9304,7 +9404,7 @@ static const char from_ucs4[][2] = + /* 0x85c3 */ "\xf0\xa7", "\xf0\xad", "\xf0\xb2", "\xf0\xa5", "\xf0\xac", + /* 0x85c8 */ "\xf0\xb1", "\xc2\xc7", "\x00\x00", "\xf0\xaf", "\x00\x00", + /* 0x85cd */ "\xc2\xc5", "\xf0\xb0", "\xc2\xc3", "\xc2\xc6", "\xf2\xd5", +- /* 0x85d2 */ "\xf0\xb5", "\x00\x00", "\x00\x00", "\xc3\xc2", "\x00\x00", ++ /* 0x85d2 */ "\xf0\xb5", "\x00\x00", "\x00\x00", "\xc3\xc2", "\x8c\xce", + /* 0x85d7 */ "\xf2\xcd", "\xf2\xd1", "\xf2\xc9", "\xf2\xcc", "\x00\x00", + /* 0x85dc */ "\xf2\xd4", "\xc3\xc0", "\xf2\xd9", "\xf2\xd2", "\x99\xc6", + /* 0x85e1 */ "\xf2\xca", "\xf2\xda", "\xf2\xd3", "\xc3\xc3", "\xc3\xc4", +@@ -9316,8 +9416,8 @@ static const char from_ucs4[][2] = + /* 0x85ff */ "\xf4\xb9", "\xf4\xbd", "\xf4\xba", "\x8f\xa5", "\x00\x00", + /* 0x8604 */ "\xf4\xbf", "\xf4\xc1", "\xc4\xaa", "\xc4\xac", "\x00\x00", + /* 0x8609 */ "\xf4\xc0", "\xc4\xad", "\xc4\xab", "\xf4\xc2", "\xfa\xbb", +- /* 0x860d */ "\x00\x00", "\x00\x00", "\x95\x70", "\xc4\xa8", "\x00\x00", +- /* 0x8612 */ "\x00\x00", "\x93\x68", "\x00\x00", "\x8f\x7e", "\xc4\xf4", ++ /* 0x860d */ "\x00\x00", "\x8c\x61", "\x95\x70", "\xc4\xa8", "\x00\x00", ++ /* 0x8613 */ "\x87\xaf", "\x93\x68", "\x00\x00", "\x8f\x7e", "\xc4\xf4", + /* 0x8618 */ "\xf5\xf1", "\xf5\xf7", "\xc4\xf6", "\xf4\xbc", "\xf5\xf6", + /* 0x861c */ "\x00\x00", "\xf5\xfd", "\xf5\xf4", "\xf5\xfb", "\xf5\xfa", + /* 0x8622 */ "\xf4\xb8", "\xf5\xf5", "\xf0\xb6", "\xf5\xfe", "\xf5\xf3", +@@ -9444,10 +9544,10 @@ static const char from_ucs4[][2] = + /* 0x887f */ "\xd3\xd7", "\xd3\xd5", "\xb0\x4b", "\xb0\x4c", "\xd3\xd9", + /* 0x8884 */ "\xfe\xec", "\x00\x00", "\x00\x00", "\x95\xa3", "\xb3\x50", + /* 0x8889 */ "\xd7\xb2", "\x00\x00", "\xb3\x55", "\xd7\xc2", "\xb3\x54", +- /* 0x888e */ "\xd7\xc4", "\x00\x00", "\x00\x00", "\xd7\xb8", "\xb3\x52", ++ /* 0x888e */ "\xd7\xc4", "\x8c\x45", "\x8c\xb8", "\xd7\xb8", "\xb3\x52", + /* 0x8893 */ "\xd7\xc3", "\x00\x00", "\xd7\xb3", "\xb3\x53", "\xd7\xbf", + /* 0x8898 */ "\xd7\xbb", "\xd7\xbd", "\xd7\xb7", "\xd7\xbe", "\x8f\xc1", +- /* 0x889c */ "\x00\x00", "\xb3\x4f", "\xd7\xba", "\xa0\x52", "\xd7\xb9", ++ /* 0x889d */ "\x87\xb7", "\xb3\x4f", "\xd7\xba", "\xa0\x52", "\xd7\xb9", + /* 0x88a2 */ "\xd7\xb5", "\x00\x00", "\xd7\xc0", "\x00\x00", "\x00\x00", + /* 0x88a7 */ "\xd7\xbc", "\xd7\xb4", "\x00\x00", "\xd7\xb6", "\xb3\x51", + /* 0x88ac */ "\xd7\xc1", "\x00\x00", "\x99\xd0", "\x00\x00", "\x00\x00", +@@ -9558,7 +9658,7 @@ static const char from_ucs4[][2] = + /* 0x8ab9 */ "\xbd\xda", "\xe7\xe2", "\xe7\xdb", "\xbd\xcb", "\xe7\xe3", + /* 0x8abe */ "\xe7\xdd", "\xbd\xd5", "\xe7\xde", "\x00\x00", "\xbd\xd4", + /* 0x8ac3 */ "\xe7\xe1", "\xbd\xce", "\xe7\xdf", "\xe7\xd5", "\xbd\xcd", +- /* 0x8ac8 */ "\xeb\xaa", "\xbd\xd3", "\x00\x00", "\xbd\xd0", "\x00\x00", ++ /* 0x8ac8 */ "\xeb\xaa", "\xbd\xd3", "\x00\x00", "\xbd\xd0", "\x8c\xf7", + /* 0x8acd */ "\xbd\xd8", "\x00\x00", "\xe7\xd4", "\x00\x00", "\xe7\xd8", + /* 0x8ad2 */ "\xbd\xcc", "\xe7\xd7", "\xe7\xd9", "\xe7\xda", "\xbd\xd7", + /* 0x8ad7 */ "\xe7\xdc", "\xe7\xe0", "\xe7\xe4", "\x92\x7c", "\xbd\xdb", +@@ -9567,7 +9667,7 @@ static const char from_ucs4[][2] = + /* 0x8ae6 */ "\xbf\xcd", "\xbf\xd3", "\xeb\xad", "\x00\x00", "\x9c\x45", + /* 0x8aeb */ "\xbf\xcf", "\x00\x00", "\xbf\xd9", "\xbf\xd4", "\xeb\xaf", + /* 0x8af0 */ "\xeb\xa9", "\xbf\xd0", "\xeb\xa2", "\xbf\xda", "\xeb\xa3", +- /* 0x8af5 */ "\xeb\xa4", "\xbf\xdb", "\xbf\xd8", "\xbd\xd1", "\x00\x00", ++ /* 0x8af5 */ "\xeb\xa4", "\xbf\xdb", "\xbf\xd8", "\xbd\xd1", "\x8c\xe8", + /* 0x8afa */ "\xbf\xce", "\xeb\xb0", "\xbf\xdc", "\x00\x00", "\xbf\xd5", + /* 0x8aff */ "\xeb\xae", "\xbf\xd1", "\xbf\xd6", "\xbf\xd7", "\x00\x00", + /* 0x8b04 */ "\xc1\xc3", "\xee\xa4", "\xee\xad", "\xee\xaa", "\xee\xac", +@@ -9595,9 +9695,9 @@ static const char from_ucs4[][2] = + /* 0x8b71 */ "\x00\x00", "\x00\x00", "\xc4\xfe", "\x00\x00", "\x00\x00", + /* 0x8b77 */ "\xc5\x40", "\xf6\x4e", "\xf6\x4d", "\xf6\x50", "\xf6\x51", + /* 0x8b7b */ "\x00\x00", "\xc5\x41", "\xf7\x56", "\xf7\x5b", "\xc5\xaa", +- /* 0x8b81 */ "\x9a\xf6", "\xf7\x58", "\x00\x00", "\xf7\x57", "\xf7\x5a", ++ /* 0x8b81 */ "\x9a\xf6", "\xf7\x58", "\x8c\xae", "\xf7\x57", "\xf7\x5a", + /* 0x8b86 */ "\xf7\x59", "\x00\x00", "\xf8\x43", "\x00\x00", "\xc5\xdc", +- /* 0x8b8b */ "\xf8\x42", "\xf8\x40", "\x00\x00", "\xf8\x41", "\x00\x00", ++ /* 0x8b8b */ "\xf8\x42", "\xf8\x40", "\x00\x00", "\xf8\x41", "\x87\xcb", + /* 0x8b90 */ "\x8f\xe7", "\x00\x00", "\xc5\xfe", "\xc5\xfd", "\xf8\xc1", + /* 0x8b95 */ "\xf8\xc2", "\xc6\x40", "\x00\x00", "\xf9\x4d", "\xf9\x4e", + /* 0x8b9a */ "\xc6\x67", "\x8f\xe8", "\xc6\x6d", "\x00\x00", "\xf9\xa9", +@@ -9759,7 +9859,7 @@ static const char from_ucs4[][2] = + /* 0x8ea6 */ "\xf9\x70", "\x95\xc9", "\xf9\xbe", "\xf9\xab", "\xc6\x6e", + /* 0x8eab */ "\xa8\xad", "\xb0\x60", "\x90\x48", "\x00\x00", "\x00\x00", + /* 0x8eb0 */ "\x99\xe8", "\x00\x00", "\xb8\xfa", "\x00\x00", "\x00\x00", +- /* 0x8eb4 */ "\x00\x00", "\x90\x49", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x8eb4 */ "\x00\x00", "\x90\x49", "\x00\x00", "\x00\x00", "\x8c\xba", + /* 0x8eba */ "\xbd\xf6", "\x00\x00", "\x90\xb1", "\xeb\xc8", "\x00\x00", + /* 0x8ebe */ "\x00\x00", "\xc2\xdf", "\x00\x00", "\xf3\x55", "\x90\x4a", + /* 0x8ec3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -9807,7 +9907,7 @@ static const char from_ucs4[][2] = + /* 0x8f95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x8f9b */ "\xa8\xaf", "\xb6\x64", "\x00\x00", "\x00\x00", "\xb9\x40", + /* 0x8fa0 */ "\x9b\x5a", "\x00\x00", "\x00\x00", "\xbb\xb6", "\x00\x00", +- /* 0x8fa5 */ "\x90\x50", "\xbf\xec", "\x00\x00", "\xbf\xeb", "\x00\x00", ++ /* 0x8fa5 */ "\x90\x50", "\xbf\xec", "\x8c\x4f", "\xbf\xeb", "\x00\x00", + /* 0x8fa9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xc3\xe3", "\xc4\x7c", + /* 0x8faf */ "\xc5\x47", "\xa8\xb0", "\xb0\x64", "\xb9\x41", "\x90\x54", + /* 0x8fb4 */ "\xf3\x5b", "\xc6\xd6", "\x9a\xa8", "\x99\xef", "\xfe\xeb", +@@ -9815,7 +9915,7 @@ static const char from_ucs4[][2] = + /* 0x8fbe */ "\x9d\x7d", "\xcb\xa6", "\x00\x00", "\x99\xf0", "\xa8\xb1", + /* 0x8fc2 */ "\x00\x00", "\xa8\xb4", "\xa8\xb3", "\xa8\xb2", "\x00\x00", + /* 0x8fc7 */ "\x00\x00", "\xcb\xa5", "\x99\xf1", "\xcd\xcd", "\x99\xf2", +- /* 0x8fcd */ "\xcd\xcf", "\xaa\xef", "\x00\x00", "\x9d\x60", "\xaa\xf1", ++ /* 0x8fcd */ "\xcd\xcf", "\xaa\xef", "\x8c\xbc", "\x9d\x60", "\xaa\xf1", + /* 0x8fd2 */ "\xcd\xcc", "\xcd\xce", "\xaa\xf0", "\xcd\xd1", "\xcd\xd0", + /* 0x8fd7 */ "\xcd\xd2", "\x00\x00", "\x00\x00", "\xa0\xa3", "\x00\x00", + /* 0x8fdb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xd0\xb6", +@@ -9839,7 +9939,7 @@ static const char from_ucs4[][2] = + /* 0x9036 */ "\xb6\x6a", "\x90\x62", "\xb6\x68", "\x00\x00", "\x00\x00", + /* 0x903a */ "\x00\x00", "\xb9\x47", "\xe0\xa3", "\xb9\x4f", "\xe0\x7e", + /* 0x903f */ "\x00\x00", "\xb9\x50", "\xb9\x45", "\x00\x00", "\xe0\xa1", +- /* 0x9044 */ "\x00\x00", "\x00\x00", "\xb9\x4a", "\x00\x00", "\xe0\xa2", ++ /* 0x9044 */ "\x00\x00", "\x87\xbd", "\xb9\x4a", "\x00\x00", "\xe0\xa2", + /* 0x904a */ "\xb9\x43", "\xb9\x42", "\x9f\x55", "\xb9\x4d", "\xb9\x4c", + /* 0x904f */ "\xb9\x4b", "\xb9\x49", "\xb9\x4e", "\xe0\x7d", "\xb9\x44", + /* 0x9054 */ "\xb9\x46", "\xb9\x48", "\x9b\xf9", "\x00\x00", "\xbb\xb8", +@@ -9925,16 +10025,16 @@ static const char from_ucs4[][2] = + /* 0x91e4 */ "\xd7\xfc", "\x96\x5b", "\xb3\xa7", "\xb3\xa9", "\xd8\x42", + /* 0x91e9 */ "\xb3\xab", "\xd7\xfe", "\xd8\x40", "\xd7\xf7", "\xb3\xaa", + /* 0x91ee */ "\xd8\x43", "\x00\x00", "\x00\x00", "\xd7\xf9", "\x00\x00", +- /* 0x91f3 */ "\xd7\xfa", "\xd7\xf8", "\xb3\xa6", "\x00\x00", "\xd8\x41", ++ /* 0x91f3 */ "\xd7\xfa", "\xd7\xf8", "\xb3\xa6", "\x8c\x50", "\xd8\x41", + /* 0x91f8 */ "\xd7\xfb", "\xd7\xfd", "\x94\xa6", "\x00\x00", "\x00\x00", + /* 0x91fd */ "\xdc\x6d", "\x8f\xd5", "\xdc\x6c", "\xdc\x6a", "\xdc\x62", + /* 0x9202 */ "\xdc\x71", "\xdc\x65", "\xdc\x6f", "\xdc\x76", "\xdc\x6e", + /* 0x9207 */ "\xb6\x79", "\x9e\x73", "\xb6\x75", "\xdc\x63", "\x00\x00", + /* 0x920c */ "\xdc\x69", "\xb6\x77", "\x90\x75", "\xdc\x68", "\xb6\x78", + /* 0x9211 */ "\xb6\x7a", "\xdc\x6b", "\x99\xf7", "\xb6\x72", "\xb6\x73", +- /* 0x9216 */ "\xdc\x77", "\xdc\x75", "\x00\x00", "\xdc\x74", "\xdc\x66", ++ /* 0x9216 */ "\xdc\x77", "\xdc\x75", "\x87\xb2", "\xdc\x74", "\xdc\x66", + /* 0x921a */ "\x00\x00", "\xdc\x72", "\x00\x00", "\xb6\x76", "\x00\x00", +- /* 0x921f */ "\x00\x00", "\x00\x00", "\x00\x00", "\xb6\x74", "\xdc\x73", ++ /* 0x921f */ "\x00\x00", "\x8c\xbf", "\x00\x00", "\xb6\x74", "\xdc\x73", + /* 0x9225 */ "\xdc\x64", "\xdc\x67", "\xdc\x70", "\x99\xf9", "\x00\x00", + /* 0x922a */ "\x96\x63", "\x95\xb9", "\x00\x00", "\xe4\xba", "\xe0\xb7", + /* 0x922e */ "\x00\x00", "\xe0\xb0", "\xe0\xc3", "\xe0\xcc", "\xe0\xb3", +@@ -10027,7 +10127,7 @@ static const char from_ucs4[][2] = + /* 0x93e2 */ "\xc3\xf0", "\xf3\x6f", "\xc3\xf3", "\x00\x00", "\xf3\x6b", + /* 0x93e7 */ "\xf3\x75", "\xc3\xf5", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x93ec */ "\xf3\x67", "\x00\x00", "\xf3\x6e", "\x00\x00", "\xfd\xcb", +- /* 0x93f1 */ "\xfe\x7a", "\x00\x00", "\x91\xdb", "\x00\x00", "\xf4\xf3", ++ /* 0x93f1 */ "\xfe\x7a", "\x00\x00", "\x91\xdb", "\x8c\x6a", "\xf4\xf3", + /* 0x93f6 */ "\xf5\x42", "\xf4\xf5", "\xf4\xfc", "\xf3\x66", "\xf4\xfa", + /* 0x93fb */ "\xf4\xe9", "\xf5\x40", "\xc4\xc3", "\xf4\xed", "\xf4\xfe", + /* 0x9400 */ "\xf4\xf4", "\x97\xaf", "\x00\x00", "\xc4\xc2", "\x95\xdd", +@@ -10039,7 +10139,7 @@ static const char from_ucs4[][2] = + /* 0x941d */ "\x00\x00", "\x00\x00", "\xf4\xea", "\x00\x00", "\x00\x00", + /* 0x9422 */ "\x00\x00", "\x91\xbc", "\x90\xe2", "\x90\xb4", "\x95\xe1", + /* 0x9428 */ "\xf4\xf0", "\xf6\x61", "\xf6\x66", "\xc5\x4f", "\xf6\x68", +- /* 0x942d */ "\x9a\x4e", "\xc5\x49", "\x00\x00", "\xf6\x64", "\xf6\x6a", ++ /* 0x942d */ "\x9a\x4e", "\xc5\x49", "\x87\xad", "\xf6\x64", "\xf6\x6a", + /* 0x9432 */ "\xc5\x4e", "\xc5\x4a", "\x00\x00", "\xc5\x4b", "\xf6\x60", + /* 0x9437 */ "\xf6\x67", "\xc5\x4d", "\xf6\x65", "\xc5\x4c", "\xf6\x5f", + /* 0x943c */ "\xf6\x63", "\xf6\x62", "\x9a\x4f", "\xf6\x5e", "\xf6\x69", +@@ -10194,13 +10294,13 @@ static const char from_ucs4[][2] = + /* 0x9725 */ "\xf1\x78", "\xf3\x7e", "\xc3\xfa", "\xf3\x7d", "\xf3\x7a", + /* 0x972a */ "\xc3\xf9", "\xf3\x7b", "\xf3\x7c", "\x00\x00", "\xf5\x48", + /* 0x972f */ "\xf5\x49", "\xc4\xc5", "\x90\xd2", "\xc5\x53", "\x00\x00", +- /* 0x9733 */ "\x00\x00", "\xf6\x6e", "\x90\xd4", "\x00\x00", "\xc5\x51", ++ /* 0x9734 */ "\x87\x6b", "\xf6\x6e", "\x90\xd4", "\x00\x00", "\xc5\x51", + /* 0x9739 */ "\xc5\x52", "\xf6\x6f", "\x00\x00", "\x00\x00", "\xc5\xb4", + /* 0x973e */ "\xc5\xb5", "\xf7\x71", "\x9a\x5b", "\x95\xfd", "\xc6\x45", + /* 0x9743 */ "\xf8\xcf", "\xc6\x47", "\x00\x00", "\xf8\xce", "\xf8\xd0", +- /* 0x9748 */ "\xc6\x46", "\xf9\x57", "\x00\x00", "\xf9\xad", "\x00\x00", ++ /* 0x9748 */ "\xc6\x46", "\xf9\x57", "\x87\xb1", "\xf9\xad", "\x00\x00", + /* 0x974c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xc4", +- /* 0x9752 */ "\xab\x43", "\x00\x00", "\x00\x00", "\x00\x00", "\xb9\x74", ++ /* 0x9752 */ "\xab\x43", "\x00\x00", "\x00\x00", "\x8c\x66", "\xb9\x74", + /* 0x9757 */ "\x90\xde", "\xe4\xbe", "\x00\x00", "\xe8\xb0", "\xc0\x51", + /* 0x975c */ "\xc0\x52", "\x9c\xe4", "\xab\x44", "\x90\xe1", "\xbe\x61", + /* 0x9761 */ "\xc3\xfb", "\xad\xb1", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -10252,10 +10352,10 @@ static const char from_ucs4[][2] = + /* 0x9847 */ "\x9b\x5e", "\xed\xd4", "\xef\x48", "\xef\x47", "\x90\xf8", + /* 0x984c */ "\xc3\x44", "\xc3\x42", "\xc3\x45", "\xc3\x43", "\xf1\xa8", + /* 0x9851 */ "\xf1\xa9", "\xf1\xaa", "\xc3\x46", "\x00\x00", "\x00\x00", +- /* 0x9855 */ "\x00\x00", "\xf3\xaa", "\xc4\x40", "\xf3\xa8", "\x00\x00", ++ /* 0x9856 */ "\x8c\xfc", "\xf3\xaa", "\xc4\x40", "\xf3\xa8", "\x00\x00", + /* 0x985b */ "\xc4\x41", "\xf3\xa7", "\xf3\xa9", "\xc3\xfe", "\xf5\x51", + /* 0x9860 */ "\xf5\x4e", "\x00\x00", "\xf5\x4f", "\xf5\x50", "\xf6\x72", +- /* 0x9865 */ "\xc5\x56", "\x90\xf9", "\xc5\x55", "\x00\x00", "\xf7\x74", ++ /* 0x9865 */ "\xc5\x56", "\x90\xf9", "\xc5\x55", "\x8c\xc9", "\xf7\x74", + /* 0x986a */ "\xf7\x73", "\xc5\xb8", "\xfa\x6a", "\x00\x00", "\x00\x00", + /* 0x986f */ "\xc5\xe3", "\xc6\x49", "\xc6\x60", "\xf9\x58", "\xf9\xae", + /* 0x9874 */ "\xf9\xaf", "\x8b\xef", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -10330,7 +10430,7 @@ static const char from_ucs4[][2] = + /* 0x99cd */ "\xe8\xc7", "\xe8\xcb", "\xe8\xc8", "\xbe\x6e", "\xbe\x71", + /* 0x99d2 */ "\xbe\x73", "\xe8\xc9", "\xe8\xca", "\xbe\x72", "\xe8\xcd", + /* 0x99d7 */ "\xe8\xd0", "\xe8\xce", "\xbe\x74", "\x9f\xab", "\xbe\x70", +- /* 0x99dc */ "\xe8\xc6", "\xbe\x6d", "\x00\x00", "\xbe\x6f", "\x00\x00", ++ /* 0x99dc */ "\xe8\xc6", "\xbe\x6d", "\x00\x00", "\xbe\x6f", "\x8c\xbe", + /* 0x99e1 */ "\x8e\xc1", "\xc0\x63", "\xec\x66", "\xec\x64", "\xec\x63", + /* 0x99e6 */ "\x95\x55", "\xec\x69", "\x00\x00", "\xec\x68", "\xec\x67", + /* 0x99ea */ "\x00\x00", "\xec\x62", "\xc0\x62", "\xec\x61", "\x00\x00", +@@ -10623,852 +10723,19 @@ static const char from_ucs4[][2] = + /* 0x9f85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x9f8a */ "\x00\x00", "\x00\x00", "\xc0\x73", "\x91\xcb", "\x00\x00", + /* 0x9f90 */ "\xc3\x65", "\xf5\xbf", "\xf6\xd5", "\x00\x00", "\xc5\xc7", +- /* 0x9f95 */ "\xf7\xce", "\x00\x00", "\x00\x00", "\xf9\xd5", "\x89\xc8", ++ /* 0x9f95 */ "\xf7\xce", "\x87\xac", "\x87\xa4", "\xf9\xd5", "\x89\xc8", + /* 0x9f99 */ "\x00\x00", "\x00\x00", "\xc0\x74", "\x00\x00", "\x00\x00", + /* 0x9f9f */ "\x8d\xaa", "\xef\xb6", "\x00\x00", "\xf7\xcf", "\x00\x00", +- /* 0x9fa4 */ "\xf9\xa1", "\x9f\xdd", +- +- /* 0xe003 */ "\xfa\x43", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe007 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe00c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe011 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe016 */ "\x00\x00", "\xfa\x58", "\x00\x00", "\x00\x00", "\xfa\x5b", +- /* 0xe01b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe020 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe025 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe02a */ "\x00\x00", "\x00\x00", "\xfa\x6d", "\x00\x00", "\x00\x00", +- /* 0xe02f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe034 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x78", "\x00\x00", +- /* 0xe039 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe03e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe043 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe048 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\xae", "\x00\x00", +- /* 0xe04d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe052 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe057 */ "\x00\x00", "\x00\x00", "\xfa\xbc", "\x00\x00", "\x00\x00", +- /* 0xe05c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe061 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe066 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe06b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe070 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe075 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe07a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe07f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe084 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe089 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe08e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe094 */ "\xfa\xf6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe099 */ "\xfa\xfb", "\xfa\xfc", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe09d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\x68", +- /* 0xe0c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0d0 */ "\xfb\x73", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xb7", +- /* 0xe0f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0f7 */ "\x00\x00", "\xfb\xbe", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe0fd */ "\xfb\xc2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe101 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xcb", +- /* 0xe106 */ "\x00\x00", "\x00\x00", "\xfb\xce", "\xfb\xcf", "\x00\x00", +- /* 0xe10b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe110 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe115 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe11a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe11f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe124 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe129 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe12e */ "\x00\x00", "\xfb\xf5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe133 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe138 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe13d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe142 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe147 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe14c */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x56", "\x00\x00", +- /* 0xe151 */ "\x00\x00", "\x00\x00", "\xfc\x5a", "\x00\x00", "\x00\x00", +- /* 0xe156 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe15b */ "\x00\x00", "\xfc\x63", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe160 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe165 */ "\x00\x00", "\x00\x00", "\xfc\x6e", "\x00\x00", "\xfc\x70", +- /* 0xe16a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe16f */ "\x00\x00", "\xfc\x77", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe175 */ "\xfc\x7b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe179 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe17e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe183 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe188 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe18d */ "\x00\x00", "\xfc\xb7", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe192 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe197 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe19c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1bb */ "\xfc\xe3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1c9 */ "\x00\x00", "\x00\x00", "\xfc\xf4", "\xfc\xf5", "\x00\x00", +- /* 0xe1ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\x40", "\x00\x00", +- /* 0xe1d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1ec */ "\x00\x00", "\x00\x00", "\xfd\x58", "\x00\x00", "\x00\x00", +- /* 0xe1f2 */ "\xfd\x5b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe1f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\x63", "\x00\x00", +- /* 0xe1fb */ "\x00\x00", "\x00\x00", "\xfd\x67", "\x00\x00", "\x00\x00", +- /* 0xe200 */ "\x00\x00", "\xfd\x6b", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe205 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe20b */ "\xfd\x74", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe20f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe214 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xa4", +- /* 0xe219 */ "\x00\x00", "\x00\x00", "\xfd\xa7", "\x00\x00", "\x00\x00", +- /* 0xe21e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe223 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xb2", "\x00\x00", +- /* 0xe228 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe22d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe232 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe237 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe23c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe241 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xd0", "\x00\x00", +- /* 0xe246 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xd5", "\x00\x00", +- /* 0xe24b */ "\x00\x00", "\x00\x00", "\xfd\xd9", "\x00\x00", "\x00\x00", +- /* 0xe250 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe255 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe25a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe25f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe264 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe269 */ "\x00\x00", "\xfd\xf6", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe26e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe273 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe278 */ "\x00\x00", "\xfe\x46", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe27d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x4e", +- /* 0xe282 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe287 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe28c */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x5c", "\x00\x00", +- /* 0xe291 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe296 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x67", +- /* 0xe29b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2a1 */ "\xfe\x6d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2af */ "\x00\x00", "\x00\x00", "\xfe\x7e", "\x00\x00", "\x00\x00", +- /* 0xe2b4 */ "\x00\x00", "\x00\x00", "\xfe\xa5", "\x00\x00", "\x00\x00", +- /* 0xe2b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2be */ "\x00\x00", "\x00\x00", "\xfe\xaf", "\x00\x00", "\x00\x00", +- /* 0xe2c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2c9 */ "\xfe\xb7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2d2 */ "\x00\x00", "\xfe\xc2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2e2 */ "\xfe\xd0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xd9", +- /* 0xe2ec */ "\xfe\xda", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xde", +- /* 0xe2f1 */ "\xfe\xdf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe2fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe300 */ "\xfe\xee", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe304 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe309 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe30e */ "\x00\x00", "\x00\x00", "\x8e\x40", "\x00\x00", "\x00\x00", +- /* 0xe313 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe318 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe31d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe322 */ "\x00\x00", "\x00\x00", "\x8e\x54", "\x00\x00", "\x00\x00", +- /* 0xe327 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe32c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\x5f", "\x00\x00", +- /* 0xe331 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe336 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe33b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe340 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\x74", +- /* 0xe345 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe34a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe34f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe354 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe359 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe35e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xb3", "\x00\x00", +- /* 0xe363 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe368 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe36d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe372 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe377 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe37c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xd2", +- /* 0xe382 */ "\x8e\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xd7", +- /* 0xe386 */ "\x00\x00", "\x00\x00", "\x8e\xda", "\x00\x00", "\x00\x00", +- /* 0xe38b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe390 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xe5", "\x00\x00", +- /* 0xe396 */ "\x8e\xe7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe39a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xef", "\x00\x00", +- /* 0xe3a0 */ "\x8e\xf1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3b4 */ "\x8f\x46", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3b8 */ "\x00\x00", "\x00\x00", "\x8f\x4d", "\x00\x00", "\x00\x00", +- /* 0xe3bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3cd */ "\x8f\x5f", "\x00\x00", "\x8f\x61", "\x00\x00", "\x00\x00", +- /* 0xe3d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\x67", "\x00\x00", +- /* 0xe3d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3e1 */ "\x8f\x73", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3e5 */ "\x00\x00", "\x8f\x79", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3f0 */ "\x8f\xa4", "\x00\x00", "\x8f\xa6", "\x00\x00", "\x8f\xa8", +- /* 0xe3f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe3fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe403 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe408 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe40d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe412 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe417 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe41c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe421 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xda", +- /* 0xe426 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe42b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe430 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe436 */ "\x8f\xea", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe43a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe43f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe444 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xfc", "\x00\x00", +- /* 0xe449 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x42", "\x00\x00", +- /* 0xe44e */ "\x00\x00", "\x90\x45", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe453 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe458 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe45d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe462 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x5c", +- /* 0xe468 */ "\x90\x5d", "\x90\x5e", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe46c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe471 */ "\x00\x00", "\x00\x00", "\x90\x69", "\x00\x00", "\x00\x00", +- /* 0xe476 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe47b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe480 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe485 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xa1", +- /* 0xe48a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe48f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe494 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe499 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe49e */ "\x00\x00", "\x00\x00", "\x90\xb8", "\x00\x00", "\x00\x00", +- /* 0xe4a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xd8", +- /* 0xe4c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xdd", +- /* 0xe4c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4da */ "\x00\x00", "\x00\x00", "\x90\xf4", "\x00\x00", "\x00\x00", +- /* 0xe4df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe4fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe502 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe507 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe50c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe511 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe516 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe51b */ "\x00\x00", "\x00\x00", "\x91\x76", "\x00\x00", "\x00\x00", +- /* 0xe520 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x7c", "\x00\x00", +- /* 0xe525 */ "\x00\x00", "\x00\x00", "\x91\xa2", "\x00\x00", "\x00\x00", +- /* 0xe52a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xa8", "\x91\xa9", +- /* 0xe52f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe534 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe539 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe53e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe543 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe548 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe54d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe552 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe557 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe55c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe561 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe566 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe56b */ "\x00\x00", "\x91\xe7", "\x00\x00", "\x00\x00", "\x91\xea", +- /* 0xe570 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe575 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xf4", +- /* 0xe57a */ "\x00\x00", "\x00\x00", "\x91\xf7", "\x00\x00", "\x00\x00", +- /* 0xe57f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xfe", +- /* 0xe584 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe589 */ "\x00\x00", "\x92\x46", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe58e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe593 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe598 */ "\x00\x00", "\x92\x55", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe59e */ "\x92\x59", "\x00\x00", "\x92\x5b", "\x00\x00", "\x00\x00", +- /* 0xe5a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x61", "\x00\x00", +- /* 0xe5a7 */ "\x00\x00", "\x00\x00", "\x92\x65", "\x00\x00", "\x00\x00", +- /* 0xe5ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5c0 */ "\x00\x00", "\x92\x7d", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5c5 */ "\x00\x00", "\x00\x00", "\x92\xa5", "\x00\x00", "\x00\x00", +- /* 0xe5ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xb5", "\x00\x00", +- /* 0xe5d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xce", "\x00\x00", +- /* 0xe5f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe5fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe601 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe606 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe60b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe610 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe615 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xf6", "\x00\x00", +- /* 0xe61a */ "\x00\x00", "\x92\xf9", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe61f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe624 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe629 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe62e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe633 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe638 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe63d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe642 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x64", "\x00\x00", +- /* 0xe647 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe64c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe651 */ "\x00\x00", "\x00\x00", "\x93\x72", "\x00\x00", "\x00\x00", +- /* 0xe656 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe65b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x7e", +- /* 0xe660 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe665 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xaa", +- /* 0xe66a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe66f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe674 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe679 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xbd", "\x00\x00", +- /* 0xe67e */ "\x00\x00", "\x93\xc0", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe683 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe688 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe68e */ "\x93\xce", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe692 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xd7", +- /* 0xe697 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe69c */ "\x00\x00", "\x93\xde", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6c0 */ "\x94\x41", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6c5 */ "\x94\x46", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6de */ "\x94\x5f", "\x94\x60", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe6fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe701 */ "\x94\xa4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe705 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe70a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe70f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xb6", "\x00\x00", +- /* 0xe714 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe719 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe71e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe723 */ "\x00\x00", "\x94\xc8", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe728 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe72d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe732 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe737 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe73d */ "\x94\xe0", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xe4", +- /* 0xe741 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe746 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe74b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe750 */ "\x00\x00", "\x94\xf5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe755 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe75a */ "\x00\x00", "\x00\x00", "\x95\x41", "\x00\x00", "\x00\x00", +- /* 0xe75f */ "\x00\x00", "\x95\x45", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe764 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x4c", "\x00\x00", +- /* 0xe769 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe76e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe773 */ "\x00\x00", "\x95\x59", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe778 */ "\x00\x00", "\x95\x5e", "\x00\x00", "\x00\x00", "\x95\x61", +- /* 0xe77d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe782 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe787 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe78c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x74", "\x00\x00", +- /* 0xe791 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe797 */ "\x95\x7b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe79b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7a6 */ "\x95\xac", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xba", +- /* 0xe7b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7d7 */ "\x00\x00", "\x00\x00", "\x95\xe0", "\x00\x00", "\x00\x00", +- /* 0xe7dd */ "\x95\xe3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7e6 */ "\x00\x00", "\x95\xee", "\x95\xef", "\x00\x00", "\x00\x00", +- /* 0xe7eb */ "\x00\x00", "\x95\xf3", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7f1 */ "\x95\xf7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe7fb */ "\x96\x42", "\x96\x43", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe800 */ "\x96\x47", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe804 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe809 */ "\x00\x00", "\x00\x00", "\x96\x53", "\x00\x00", "\x00\x00", +- /* 0xe80e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\x5a", +- /* 0xe813 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe818 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe81d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\x68", "\x00\x00", +- /* 0xe822 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe828 */ "\x96\x6f", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe82d */ "\x96\x74", "\x00\x00", "\x96\x76", "\x00\x00", "\x00\x00", +- /* 0xe831 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe836 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe83b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe840 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe845 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe84a */ "\x00\x00", "\x00\x00", "\x96\xb6", "\x00\x00", "\x00\x00", +- /* 0xe84f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe855 */ "\x96\xbe", "\x96\xbf", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe859 */ "\x00\x00", "\x96\xc4", "\x00\x00", "\x96\xc6", "\x00\x00", +- /* 0xe85e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe863 */ "\x00\x00", "\x96\xce", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe868 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe86d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe872 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe877 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe87c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe881 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe887 */ "\x96\xf0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe88b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xf8", "\x00\x00", +- /* 0xe891 */ "\x96\xfa", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe895 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe89a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe89f */ "\x00\x00", "\x97\x4b", "\x00\x00", "\x00\x00", "\x97\x4e", +- /* 0xe8a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x6c", +- /* 0xe8c3 */ "\x97\x6d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8cd */ "\x97\x77", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xa1", "\x97\xa2", +- /* 0xe8d6 */ "\x00\x00", "\x00\x00", "\x97\xa5", "\x97\xa6", "\x00\x00", +- /* 0xe8db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8e1 */ "\x97\xad", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xb1", +- /* 0xe8e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe8f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xca", +- /* 0xe8fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe903 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe908 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe90d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe912 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xe3", +- /* 0xe918 */ "\x97\xe4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe91c */ "\x00\x00", "\x00\x00", "\x97\xeb", "\x00\x00", "\x00\x00", +- /* 0xe921 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xf1", "\x00\x00", +- /* 0xe926 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xf7", +- /* 0xe92b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe930 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x41", "\x00\x00", +- /* 0xe935 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe93a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe93f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe944 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe949 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe94e */ "\x00\x00", "\x98\x5d", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe953 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe958 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe95d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe962 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x74", +- /* 0xe967 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe96c */ "\x00\x00", "\x98\x7b", "\x98\x7c", "\x00\x00", "\x00\x00", +- /* 0xe971 */ "\x00\x00", "\x98\xa2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe977 */ "\x98\xa6", "\x00\x00", "\x00\x00", "\x98\xa9", "\x98\xaa", +- /* 0xe97b */ "\x00\x00", "\x98\xac", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe980 */ "\x00\x00", "\x98\xb1", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe985 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe98a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe98f */ "\x00\x00", "\x98\xc0", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe994 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe999 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe99e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xe9c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xfa", +- +- /* 0xeaa9 */ "\x9a\x7c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeaad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeab2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeab7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeabc */ "\x00\x00", "\x00\x00", "\x9a\xb4", "\x9a\xb5", "\x9a\xb6", +- /* 0xeac1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xba", "\x00\x00", +- /* 0xeac6 */ "\x00\x00", "\x00\x00", "\x9a\xbe", "\x9a\xbf", "\x9a\xc0", +- /* 0xeacc */ "\x9a\xc1", "\x00\x00", "\x00\x00", "\x9a\xc4", "\x9a\xc5", +- /* 0xead1 */ "\x9a\xc6", "\x00\x00", "\x9a\xc8", "\x9a\xc9", "\x00\x00", +- /* 0xead6 */ "\x9a\xcb", "\x9a\xcc", "\x00\x00", "\x9a\xce", "\x9a\xcf", +- /* 0xeada */ "\x00\x00", "\x9a\xd1", "\x00\x00", "\x9a\xd3", "\x9a\xd4", +- /* 0xeae0 */ "\x9a\xd5", "\x9a\xd6", "\x9a\xd7", "\x9a\xd8", "\x00\x00", +- /* 0xeae4 */ "\x00\x00", "\x00\x00", "\x9a\xdc", "\x00\x00", "\x9a\xde", +- /* 0xeaea */ "\x9a\xdf", "\x00\x00", "\x9a\xe1", "\x00\x00", "\x9a\xe3", +- /* 0xeaee */ "\x00\x00", "\x9a\xe5", "\x9a\xe6", "\x00\x00", "\x00\x00", +- /* 0xeaf3 */ "\x00\x00", "\x9a\xea", "\x9a\xeb", "\x00\x00", "\x9a\xed", +- /* 0xeaf9 */ "\x9a\xee", "\x9a\xef", "\x9a\xf0", "\x00\x00", "\x00\x00", +- /* 0xeafd */ "\x00\x00", "\x9a\xf4", "\x9a\xf5", "\x00\x00", "\x9a\xf7", +- /* 0xeb03 */ "\x9a\xf8", "\x9a\xf9", "\x9a\xfa", "\x00\x00", "\x00\x00", +- /* 0xeb08 */ "\x9a\xfd", "\x9a\xfe", "\x9b\x40", "\x9b\x41", "\x9b\x42", +- /* 0xeb0d */ "\x9b\x43", "\x9b\x44", "\x9b\x45", "\x00\x00", "\x00\x00", +- /* 0xeb12 */ "\x9b\x48", "\x00\x00", "\x00\x00", "\x9b\x4b", "\x00\x00", +- /* 0xeb16 */ "\x00\x00", "\x00\x00", "\x9b\x4f", "\x9b\x50", "\x9b\x51", +- /* 0xeb1c */ "\x9b\x52", "\x9b\x53", "\x00\x00", "\x9b\x55", "\x9b\x56", +- /* 0xeb20 */ "\x00\x00", "\x00\x00", "\x9b\x59", "\x00\x00", "\x9b\x5b", +- /* 0xeb25 */ "\x00\x00", "\x9b\x5d", "\x00\x00", "\x00\x00", "\x9b\x60", +- /* 0xeb2a */ "\x00\x00", "\x9b\x62", "\x9b\x63", "\x9b\x64", "\x00\x00", +- /* 0xeb30 */ "\x9b\x66", "\x9b\x67", "\x9b\x68", "\x9b\x69", "\x9b\x6a", +- /* 0xeb35 */ "\x9b\x6b", "\x9b\x6c", "\x9b\x6d", "\x9b\x6e", "\x9b\x6f", +- /* 0xeb39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x73", "\x9b\x74", +- /* 0xeb3f */ "\x9b\x75", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x79", +- /* 0xeb44 */ "\x9b\x7a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeb48 */ "\x00\x00", "\x9b\xa2", "\x00\x00", "\x00\x00", "\x9b\xa5", +- /* 0xeb4e */ "\x9b\xa6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeb53 */ "\x9b\xab", "\x00\x00", "\x9b\xad", "\x9b\xae", "\x00\x00", +- /* 0xeb58 */ "\x9b\xb0", "\x00\x00", "\x9b\xb2", "\x9b\xb3", "\x00\x00", +- /* 0xeb5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeb62 */ "\x9b\xba", "\x9b\xbb", "\x00\x00", "\x9b\xbd", "\x00\x00", +- /* 0xeb67 */ "\x9b\xbf", "\x9b\xc0", "\x9b\xc1", "\x00\x00", "\x00\x00", +- /* 0xeb6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xc7", "\x9b\xc8", +- /* 0xeb71 */ "\x9b\xc9", "\x00\x00", "\x9b\xcb", "\x00\x00", "\x00\x00", +- /* 0xeb76 */ "\x9b\xce", "\x9b\xcf", "\x00\x00", "\x00\x00", "\x9b\xd2", +- /* 0xeb7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xd6", "\x9b\xd7", +- /* 0xeb80 */ "\x9b\xd8", "\x00\x00", "\x00\x00", "\x9b\xdb", "\x00\x00", +- /* 0xeb84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xe0", "\x00\x00", +- /* 0xeb8a */ "\x9b\xe2", "\x00\x00", "\x9b\xe4", "\x00\x00", "\x00\x00", +- /* 0xeb8e */ "\x00\x00", "\x9b\xe8", "\x00\x00", "\x00\x00", "\x9b\xeb", +- /* 0xeb93 */ "\x00\x00", "\x9b\xed", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeb99 */ "\x9b\xf1", "\x00\x00", "\x9b\xf3", "\x00\x00", "\x00\x00", +- /* 0xeb9d */ "\x00\x00", "\x9b\xf7", "\x00\x00", "\x00\x00", "\x9b\xfa", +- /* 0xeba2 */ "\x00\x00", "\x00\x00", "\x9b\xfd", "\x9b\xfe", "\x00\x00", +- /* 0xeba7 */ "\x00\x00", "\x00\x00", "\x9c\x43", "\x9c\x44", "\x00\x00", +- /* 0xebac */ "\x00\x00", "\x9c\x47", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xebb2 */ "\x9c\x4b", "\x9c\x4c", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xebb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xebbb */ "\x00\x00", "\x9c\x56", "\x00\x00", "\x9c\x58", "\x00\x00", +- /* 0xebc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x5e", +- /* 0xebc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x63", +- /* 0xebca */ "\x00\x00", "\x9c\x65", "\x00\x00", "\x9c\x67", "\x00\x00", +- /* 0xebd0 */ "\x9c\x69", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xebd5 */ "\x9c\x6e", "\x00\x00", "\x9c\x70", "\x9c\x71", "\x00\x00", +- /* 0xebda */ "\x9c\x73", "\x9c\x74", "\x00\x00", "\x9c\x76", "\x00\x00", +- /* 0xebdf */ "\x9c\x78", "\x00\x00", "\x9c\x7a", "\x00\x00", "\x00\x00", +- /* 0xebe4 */ "\x9c\x7d", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xa3", +- /* 0xebe9 */ "\x9c\xa4", "\x00\x00", "\x9c\xa6", "\x9c\xa7", "\x00\x00", +- /* 0xebed */ "\x00\x00", "\x9c\xaa", "\x00\x00", "\x00\x00", "\x9c\xad", +- /* 0xebf2 */ "\x00\x00", "\x00\x00", "\x9c\xb0", "\x00\x00", "\x00\x00", +- /* 0xebf7 */ "\x00\x00", "\x9c\xb4", "\x9c\xb5", "\x00\x00", "\x00\x00", +- /* 0xebfc */ "\x00\x00", "\x9c\xb9", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec06 */ "\x00\x00", "\x9c\xc3", "\x9c\xc4", "\x00\x00", "\x00\x00", +- /* 0xec0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xca", "\x00\x00", +- /* 0xec10 */ "\x00\x00", "\x00\x00", "\x9c\xce", "\x00\x00", "\x00\x00", +- /* 0xec15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xd4", "\x9c\xd5", +- /* 0xec1b */ "\x9c\xd6", "\x9c\xd7", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xdf", +- /* 0xec24 */ "\x00\x00", "\x9c\xe1", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec29 */ "\x00\x00", "\x9c\xe6", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec2f */ "\x9c\xea", "\x00\x00", "\x00\x00", "\x9c\xed", "\x00\x00", +- /* 0xec33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec3d */ "\x00\x00", "\x9c\xfa", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec43 */ "\x9c\xfe", "\x9d\x40", "\x9d\x41", "\x9d\x42", "\x9d\x43", +- /* 0xec48 */ "\x9d\x44", "\x9d\x45", "\x00\x00", "\x9d\x47", "\x00\x00", +- /* 0xec4c */ "\x00\x00", "\x00\x00", "\x9d\x4b", "\x00\x00", "\x00\x00", +- /* 0xec52 */ "\x9d\x4e", "\x00\x00", "\x9d\x50", "\x00\x00", "\x9d\x52", +- /* 0xec57 */ "\x9d\x53", "\x9d\x54", "\x00\x00", "\x9d\x56", "\x00\x00", +- /* 0xec5c */ "\x9d\x58", "\x9d\x59", "\x00\x00", "\x00\x00", "\x9d\x5c", +- /* 0xec60 */ "\x00\x00", "\x9d\x5e", "\x9d\x5f", "\x00\x00", "\x00\x00", +- /* 0xec65 */ "\x00\x00", "\x9d\x63", "\x00\x00", "\x9d\x65", "\x9d\x66", +- /* 0xec6b */ "\x9d\x67", "\x9d\x68", "\x9d\x69", "\x00\x00", "\x9d\x6b", +- /* 0xec70 */ "\x9d\x6c", "\x00\x00", "\x9d\x6e", "\x9d\x6f", "\x00\x00", +- /* 0xec75 */ "\x9d\x71", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x75", +- /* 0xec79 */ "\x00\x00", "\x9d\x77", "\x00\x00", "\x00\x00", "\x9d\x7a", +- /* 0xec7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec84 */ "\x9d\xa2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec8e */ "\x9d\xac", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xb0", +- /* 0xec92 */ "\x00\x00", "\x00\x00", "\x9d\xb3", "\x00\x00", "\x00\x00", +- /* 0xec97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xec9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeca1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeca6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xcd", "\x00\x00", +- /* 0xecb0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecb6 */ "\x9d\xd4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecbf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecc4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecc9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeccf */ "\x9d\xed", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecd3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xfa", "\x00\x00", +- /* 0xecdd */ "\x00\x00", "\x00\x00", "\x9d\xfe", "\x9e\x40", "\x00\x00", +- /* 0xece2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xece7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x4f", "\x00\x00", +- /* 0xecf2 */ "\x9e\x51", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecf6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xecfc */ "\x9e\x5b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed0f */ "\x00\x00", "\x9e\x70", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x7c", "\x00\x00", +- /* 0xed1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed24 */ "\x9e\xa5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed29 */ "\x9e\xaa", "\x00\x00", "\x00\x00", "\x9e\xad", "\x00\x00", +- /* 0xed2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xbc", "\x00\x00", +- /* 0xed3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xc2", +- /* 0xed41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xd0", "\x00\x00", +- /* 0xed50 */ "\x00\x00", "\x9e\xd3", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xe0", +- /* 0xed5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed69 */ "\x00\x00", "\x9e\xec", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xf9", +- /* 0xed78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed82 */ "\x00\x00", "\x9f\x46", "\x9f\x47", "\x00\x00", "\x00\x00", +- /* 0xed88 */ "\x9f\x4a", "\x00\x00", "\x00\x00", "\x9f\x4d", "\x00\x00", +- /* 0xed8c */ "\x00\x00", "\x9f\x50", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xed9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeda0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeda5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedaa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedaf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedb4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedbe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedc3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedcd */ "\x00\x00", "\x9f\xb3", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedd2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedd7 */ "\x00\x00", "\x00\x00", "\x9f\xbe", "\x00\x00", "\x00\x00", +- /* 0xeddc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xede1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xede6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedeb */ "\x00\x00", "\x9f\xd1", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedf0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedf5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedfa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xedff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\xec", "\x00\x00", +- /* 0xee09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee22 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee36 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xa4", "\x00\x00", +- /* 0xee5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee68 */ "\x00\x00", "\xa0\xb1", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee72 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xee9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeea5 */ "\xa0\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeea9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeeae */ "\x00\x00", "\xa0\xf7", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xeeb4 */ "\xa0\xfb", "\x00\x00", "\x00\x00", "\xa0\xfe", ++ /* 0x9fa4 */ "\xf9\xa1", "\x9f\xdd", "\x8c\x43", "\x8c\x6d", "\x8c\x74", ++ /* 0x9fa9 */ "\x8c\xb7", "\x8c\xb9", "\x8c\xbb", "\x8c\xc0", "\x8c\xd7", ++ /* 0x9fae */ "\x8c\xd8", "\x8c\xda", "\xc8\xa1", "\xc8\xa3", "\x8c\xed", ++ /* 0x9fb3 */ "\x8d\x48", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x9fb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x9fbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x9fc1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x9fc7 */ "\x87\xc2", "\x87\xd2", "\x87\xd6", "\x87\xda", "\x87\xdf", + +- /* 0xf303 */ "\x88\x40", "\x88\x41", "\x88\x42", "\x88\x43", "\x88\x44", +- /* 0xf308 */ "\x88\x45", "\x88\x46", "\x88\x47", "\x88\x48", "\x88\x49", +- /* 0xf30d */ "\x88\x4a", "\x88\x4b", "\x88\x4c", "\x88\x4d", "\x88\x4e", +- /* 0xf312 */ "\x88\x4f", "\x88\x50", "\x88\x51", "\x88\x52", "\x88\x53", +- /* 0xf317 */ "\x88\x54", "\x88\x55", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf31b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf320 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x88\x62", +- /* 0xf325 */ "\x00\x00", "\x88\x64", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf32a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf32f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf334 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf339 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf33e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf344 */ "\x88\xa3", "\x00\x00", "\x88\xa5", "\x00\x00", "\x00\x00", +- /* 0xf348 */ "\x00\x00", "\x88\xa9", "\x88\xaa", "\x00\x00", "\x00\x00", +- /* 0xf34d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf352 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf357 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf35c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf361 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf366 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf36b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf370 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf375 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf37a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf37f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf384 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf389 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf38e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf393 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf398 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf39d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x89\x41", "\x00\x00", +- /* 0xf3a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3ed */ "\x00\x00", "\x00\x00", "\x89\xb2", "\x00\x00", "\x00\x00", +- /* 0xf3f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf3f7 */ "\x00\x00", "\x89\xbb", "\x00\x00", "\x00\x00", "\x89\xbe", +- /* 0xf3fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf401 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf406 */ "\x00\x00", "\x89\xca", "\x00\x00", "\x00\x00", "\x89\xcd", +- /* 0xf40b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf410 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf415 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf41a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf41f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf424 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf429 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf42e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf433 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf438 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x40", +- /* 0xf43d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x44", "\x8a\x45", +- /* 0xf442 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf447 */ "\x00\x00", "\x8a\x4c", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf44d */ "\x8a\x50", "\x00\x00", "\x00\x00", "\x8a\x53", "\x00\x00", +- /* 0xf451 */ "\x00\x00", "\x00\x00", "\x8a\x57", "\x00\x00", "\x00\x00", +- /* 0xf456 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x5d", "\x8a\x5e", +- /* 0xf45c */ "\x8a\x5f", "\x8a\x60", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf460 */ "\x00\x00", "\x8a\x65", "\x00\x00", "\x00\x00", "\x8a\x68", +- /* 0xf466 */ "\x8a\x69", "\x00\x00", "\x00\x00", "\x8a\x6c", "\x00\x00", +- /* 0xf46a */ "\x00\x00", "\x00\x00", "\x8a\x70", "\x8a\x71", "\x8a\x72", +- /* 0xf46f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf474 */ "\x00\x00", "\x00\x00", "\x8a\x7a", "\x8a\x7b", "\x00\x00", +- /* 0xf479 */ "\x00\x00", "\x00\x00", "\x8a\xa1", "\x8a\xa2", "\x8a\xa3", +- /* 0xf47e */ "\x00\x00", "\x8a\xa5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf483 */ "\x00\x00", "\x8a\xaa", "\x00\x00", "\x00\x00", "\x8a\xad", +- /* 0xf488 */ "\x00\x00", "\x00\x00", "\x8a\xb0", "\x00\x00", "\x8a\xb2", +- /* 0xf48d */ "\x00\x00", "\x8a\xb4", "\x8a\xb5", "\x8a\xb6", "\x00\x00", +- /* 0xf492 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xbc", +- /* 0xf498 */ "\x8a\xbd", "\x00\x00", "\x00\x00", "\x8a\xc0", "\x00\x00", +- /* 0xf49c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf4a1 */ "\x00\x00", "\x00\x00", "\x8a\xc9", "\x00\x00", "\x00\x00", +- /* 0xf4a7 */ "\x8a\xcc", "\x00\x00", "\x00\x00", "\x8a\xcf", "\x00\x00", +- /* 0xf4ab */ "\x00\x00", "\x8a\xd2", "\x00\x00", "\x8a\xd4", "\x00\x00", +- /* 0xf4b0 */ "\x00\x00", "\x00\x00", "\x8a\xd8", "\x8a\xd9", "\x00\x00", +- /* 0xf4b5 */ "\x00\x00", "\x8a\xdc", "\x00\x00", "\x00\x00", "\x8a\xdf", +- /* 0xf4bb */ "\x8a\xe0", "\x8a\xe1", "\x8a\xe2", "\x00\x00", "\x00\x00", +- /* 0xf4c0 */ "\x8a\xe5", "\x8a\xe6", "\x00\x00", "\x8a\xe8", "\x00\x00", +- /* 0xf4c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xed", "\x00\x00", +- /* 0xf4c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xf3", +- /* 0xf4cf */ "\x8a\xf4", "\x00\x00", "\x00\x00", "\x8a\xf7", "\x00\x00", +- /* 0xf4d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf4d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf4dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\x48", +- /* 0xf4e2 */ "\x00\x00", "\x00\x00", "\x8b\x4b", "\x00\x00", "\x8b\x4d", +- /* 0xf4e8 */ "\x8b\x4e", "\x8b\x4f", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf4ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf4f1 */ "\x00\x00", "\x8b\x59", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf4f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf4fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf500 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf505 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf50a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf50f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf514 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf519 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf51e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xaa", "\x8b\xab", +- /* 0xf523 */ "\x00\x00", "\x8b\xad", "\x8b\xae", "\x00\x00", "\x00\x00", +- /* 0xf528 */ "\x00\x00", "\x8b\xb2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf52d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf532 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf537 */ "\x00\x00", "\x00\x00", "\x8b\xc2", "\x8b\xc3", "\x00\x00", +- /* 0xf53d */ "\x8b\xc5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf541 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf546 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf54b */ "\x00\x00", "\x00\x00", "\x8b\xd6", "\x00\x00", "\x00\x00", +- /* 0xf550 */ "\x00\x00", "\x00\x00", "\x8b\xdb", "\x00\x00", "\x00\x00", +- /* 0xf556 */ "\x8b\xde", "\x00\x00", "\x00\x00", "\x8b\xe1", "\x8b\xe2", +- /* 0xf55a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xe6", "\x00\x00", +- /* 0xf55f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf565 */ "\x8b\xed", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf569 */ "\x00\x00", "\x8b\xf3", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0xf56e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xfa", +- +- /* 0xf6b0 */ "\x8d\xfe", +- +- /* 0xf7e5 */ "\xc8\x79", "\xc8\x7a", "\x00\x00", "\xc8\x7c", "\x00\x00", +- /* 0xf7ea */ "\xc8\x7e", "\xc8\xa1", "\x00\x00", "\xc8\xa3", "\xc8\xa4", ++ /* 0xf907 */ "\x8b\xf8", + + /* 0xfa0c */ "\xc9\x4a", "\xdd\xfc", + +@@ -11534,258 +10801,304 @@ static const char from_ucs4[][2] = + /* 0xffe6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0xffeb */ "\x00\x00", "\xf9\xfe", + +- /* 0x2003e */ "\x93\x75", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20042 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x76", "\x00\x00", +- /* 0x20047 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2004c */ "\x00\x00", "\x95\x48", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20051 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20056 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2005b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20060 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20065 */ "\x00\x00", "\x00\x00", "\x8e\xc6", +- ++ /* 0x20021 */ "\x9c\x71", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20025 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2002a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2002f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20034 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20039 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x75", ++ /* 0x2003e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20043 */ "\x00\x00", "\x00\x00", "\x93\x76", "\x00\x00", "\x00\x00", ++ /* 0x20048 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2004e */ "\x95\x48", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20052 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20057 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2005c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20061 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20066 */ "\x00\x00", "\x8e\xc6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2006b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20070 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20075 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2007a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2007f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20084 */ "\x00\x00", "\x8b\xc5", "\x8b\xfa", "\x00\x00", "\x00\x00", ++ /* 0x2008a */ "\xc8\x7c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2008e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20094 */ "\x9a\xb4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20098 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2009d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x88\x4e", ++ /* 0x200cb */ "\x88\x4b", "\xc8\x7a", "\x88\x48", "\x00\x00", "\x00\x00", ++ /* 0x200cf */ "\x00\x00", "\x88\x47", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x200e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x200ee */ "\xa0\xf6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x200f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x200f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x200fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20101 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20106 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2010b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2010c */ "\x88\x45", "\x00\x00", "\x88\x53", "\x00\x00", "\x00\x00", + /* 0x20110 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20115 */ "\x00\x00", "\x00\x00", "\xfc\xad", + +- /* 0x201ab */ "\x92\x72", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201be */ "\x00\x00", "\x00\x00", "\xfc\x47", "\x00\x00", "\x00\x00", +- /* 0x201c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201d2 */ "\x00\x00", "\x94\xdf", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x201ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20204 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20209 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2020e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20214 */ "\x98\xa4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20218 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2021d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20222 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20227 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2022c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20231 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20236 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2023b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20240 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20245 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2024a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2024f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20254 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20259 */ "\x00\x00", "\x94\xe7", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2025e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20263 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20268 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2026d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20272 */ "\x00\x00", "\x90\xcb", "\x92\x7b", "\x00\x00", "\x00\x00", +- /* 0x20277 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2027c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20281 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20286 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2028b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20290 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20295 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xd8", "\x00\x00", +- /* 0x2029a */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x5f", "\x00\x00", +- /* 0x202a0 */ "\xfa\x54", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202bd */ "\x00\x00", "\x96\xda", "\x92\x79", "\x00\x00", "\x00\x00", +- /* 0x202c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x74", +- /* 0x202e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x202fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20303 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20308 */ "\x00\x00", "\x92\x75", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2030d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20312 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20317 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2031c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20321 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\xfb", "\x00\x00", +- /* 0x20326 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2032b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20330 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20335 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2033a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2033f */ "\x00\x00", "\x8a\x49", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20345 */ "\x92\xdf", "\x9b\x7c", "\xfa\x63", "\x00\x00", "\x00\x00", +- /* 0x20349 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2034e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20353 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20358 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2035d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20362 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20367 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2036c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20371 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20376 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2037b */ "\x00\x00", "\x00\x00", "\xfa\x60", "\x92\x6d", "\xfa\x62", +- /* 0x20380 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20385 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2038a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2038f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20394 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20399 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2039e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x6b", "\x00\x00", +- /* 0x203a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203b2 */ "\x00\x00", "\x00\x00", "\xfd\x6a", "\x00\x00", "\x00\x00", +- /* 0x203b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203c6 */ "\x00\x00", "\x00\x00", "\xfd\x54", "\x00\x00", "\x92\x73", +- /* 0x203cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203f3 */ "\x00\x00", "\x97\xd8", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x203f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\xbb", "\x00\x00", +- /* 0x203fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20402 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20407 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2040c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20411 */ "\x00\x00", "\x93\x42", "\x92\x76", "\x00\x00", "\x00\x00", +- /* 0x20416 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2041b */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x65", "\x00\x00", +- /* 0x20420 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20425 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2042a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2042f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20434 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20439 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2043e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20443 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20448 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2044d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20452 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20457 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2045c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20461 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x6c", "\x00\x00", +- /* 0x20466 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2046b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20470 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20475 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2047a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2047f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20484 */ "\x00\x00", "\x00\x00", "\xfa\x6e", "\x00\x00", "\x00\x00", +- /* 0x20489 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2048e */ "\x00\x00", "\x00\x00", "\x92\xc0", "\x92\xbf", "\x00\x00", +- /* 0x20493 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20498 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2049d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204a3 */ "\x92\xbe", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x204f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xb3", +- /* 0x204fc */ "\x00\x00", "\x97\x75", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20501 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20506 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2050b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20510 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20515 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2051a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2051f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20524 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20529 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2052e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20533 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20538 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2053d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20542 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x40", +- /* 0x20547 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2054c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20551 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20556 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2055b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20560 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20565 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2056a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2056f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20574 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20579 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2057e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20583 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20588 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2058e */ "\xfa\x76", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20592 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20597 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2059c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xd0", "\x00\x00", +- /* 0x205a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205b0 */ "\x00\x00", "\x00\x00", "\xfa\x7b", "\x00\x00", "\x00\x00", +- /* 0x205b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205ce */ "\x00\x00", "\x89\xcc", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205dd */ "\x00\x00", "\xfa\x42", "\x92\xbc", "\x00\x00", "\x00\x00", +- /* 0x205e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x5c", "\x00\x00", +- /* 0x205ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x205fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20600 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20605 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2060a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2060f */ "\x00\x00", "\x9b\xb5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20614 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xa7", +- /* 0x2061a */ "\x97\xa4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2061e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20623 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20628 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2062d */ "\x00\x00", "\x00\x00", "\x90\xfd", ++ /* 0x201a4 */ "\x8c\xf5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201a9 */ "\x8a\xad", "\x00\x00", "\x92\x72", "\x00\x00", "\x00\x00", ++ /* 0x201ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x47", ++ /* 0x201c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xdf", "\x00\x00", ++ /* 0x201d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\xd1", "\x00\x00", ++ /* 0x201f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x201fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20202 */ "\x00\x00", "\xfb\xcb", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20207 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x7d", ++ /* 0x2020c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20211 */ "\x00\x00", "\x00\x00", "\x98\xa4", "\x00\x00", "\x00\x00", ++ /* 0x20216 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2021b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20220 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20225 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2022a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2022f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20234 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xf9", ++ /* 0x20239 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2023e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20243 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20248 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2024d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20252 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20257 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xe7", "\x00\x00", ++ /* 0x2025c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20261 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20266 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2026b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20270 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xcb", "\x92\x7b", ++ /* 0x20275 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2027a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2027f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20284 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20289 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2028e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20293 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20299 */ "\x94\xd8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2029e */ "\xfc\x5f", "\x00\x00", "\xfa\x54", "\x00\x00", "\x00\x00", ++ /* 0x202a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202b7 */ "\x9a\xb5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xda", "\x92\x79", ++ /* 0x202c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202e3 */ "\x00\x00", "\xfa\x74", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x202fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20301 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20306 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x75", "\x00\x00", ++ /* 0x2030b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20310 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20315 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2031a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2031f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20325 */ "\x8d\xfb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20329 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2032e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20333 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20338 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2033d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x49", "\x00\x00", ++ /* 0x20342 */ "\x00\x00", "\x00\x00", "\x92\xdf", "\x9b\x7c", "\xfa\x63", ++ /* 0x20347 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2034c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20351 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20356 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2035b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20360 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20365 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2036a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2036f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20374 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20379 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x60", ++ /* 0x2037f */ "\x92\x6d", "\xfa\x62", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20383 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20388 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2038d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20392 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20397 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2039c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xb6", "\x00\x00", ++ /* 0x203a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203a7 */ "\x97\x6b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\x6a", ++ /* 0x203b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\x54", ++ /* 0x203c9 */ "\x00\x00", "\x92\x73", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xd8", "\x00\x00", ++ /* 0x203f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x203fc */ "\x9f\xbb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20400 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20405 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2040a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2040f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x42", "\x92\x76", ++ /* 0x20414 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20419 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2041f */ "\xfa\x65", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20423 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20428 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2042d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20432 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20437 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2043c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20441 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20446 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2044b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20450 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20455 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2045a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2045f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20465 */ "\x92\x6c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20469 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2046e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20473 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20478 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2047d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20482 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x6e", ++ /* 0x20487 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2048c */ "\x00\x00", "\x9e\xe0", "\x00\x00", "\x00\x00", "\x92\xc0", ++ /* 0x20492 */ "\x92\xbf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20496 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2049b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204a0 */ "\x00\x00", "\x00\x00", "\x92\xbe", "\x00\x00", "\x00\x00", ++ /* 0x204a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xba", ++ /* 0x204d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x204fa */ "\x00\x00", "\x8a\xb3", "\x00\x00", "\x97\x75", "\x00\x00", ++ /* 0x204ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20504 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20509 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2050e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20513 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20518 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2051d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20522 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20527 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2052c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20531 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20536 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2053b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20540 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20545 */ "\x00\x00", "\xfa\x40", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2054a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2054f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20554 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20559 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2055e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20563 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20568 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2056d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20572 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20577 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2057c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20581 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20586 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2058b */ "\x00\x00", "\x00\x00", "\xfa\x76", "\x00\x00", "\x00\x00", ++ /* 0x20590 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20595 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2059a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2059f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205a5 */ "\xfb\xd0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x7b", ++ /* 0x205b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205c3 */ "\xfe\x6d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205c7 */ "\x00\x00", "\x00\x00", "\x9b\xb3", "\x00\x00", "\x00\x00", ++ /* 0x205cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x89\xcc", "\x00\x00", ++ /* 0x205d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xbe", "\x00\x00", ++ /* 0x205d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205db */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x42", "\x92\xbc", ++ /* 0x205e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205eb */ "\x94\x5c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x205fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20603 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20608 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2060d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xb5", "\x00\x00", ++ /* 0x20612 */ "\x00\x00", "\x00\x00", "\x9a\xbf", "\x00\x00", "\x00\x00", ++ /* 0x20617 */ "\x00\x00", "\x98\xa7", "\x97\xa4", "\x00\x00", "\x00\x00", ++ /* 0x2061c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20621 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20626 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2062b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xfd", ++ /* 0x20630 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20635 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2063a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2063f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20644 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20649 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2064e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20653 */ "\x00\x00", "\x00\x00", "\xfc\x7b", "\x00\x00", "\x00\x00", ++ /* 0x20658 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2065d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20662 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20667 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2066c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20671 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xc0", + + /* 0x2070e */ "\x92\xc3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20712 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -11794,7 +11107,7 @@ static const char from_ucs4[][2] = + /* 0x20721 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20726 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2072b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20730 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20731 */ "\x8a\xaa", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20735 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2073a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2073f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -11824,29 +11137,89 @@ static const char from_ucs4[][2] = + /* 0x20862 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20867 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2086c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20871 */ "\x00\x00", "\x92\xc6", +- +- /* 0x20916 */ "\x95\x46", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2091a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2091f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20924 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20929 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2092e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20933 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20938 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2093d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20942 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20947 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2094c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20951 */ "\x00\x00", "\x00\x00", "\xfa\xc2", "\x00\x00", "\x00\x00", +- /* 0x20956 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2095b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20960 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20965 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2096a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2096f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20974 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xc3", +- ++ /* 0x20871 */ "\x00\x00", "\x92\xc6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20876 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2087b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20880 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20885 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2088a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2088f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20894 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20899 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2089e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xa6", ++ /* 0x208d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x208fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20902 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20907 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2090c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20911 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x46", ++ /* 0x20916 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2091b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20920 */ "\x00\x00", "\x00\x00", "\xfd\x63", "\x00\x00", "\x00\x00", ++ /* 0x20925 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2092a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2092f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20934 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20939 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2093e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20943 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20948 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2094d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20952 */ "\x00\x00", "\xfa\xc2", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20957 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2095c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20961 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20966 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2096b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20970 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20975 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xc3", "\x00\x00", ++ /* 0x2097a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2097f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20984 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20989 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2098e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20993 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20998 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2099d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x89\xb2", "\x00\x00", ++ /* 0x209e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x209fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20a01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20a06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20a0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a11 */ "\x9c\x66", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -11865,13 +11238,13 @@ static const char from_ucs4[][2] = + /* 0x20a5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20a6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20a6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x62", + /* 0x20a6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20a88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20a88 */ "\x00\x00", "\x87\xa8", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20a97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -11879,34 +11252,52 @@ static const char from_ucs4[][2] = + /* 0x20aa1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20aa6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20aab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20ab0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xc1", ++ /* 0x20ab0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xc1", "\x00\x00", ++ /* 0x20ab5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20aba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20abf */ "\x00\x00", "\x00\x00", "\x9a\xc4", "\x00\x00", "\x00\x00", ++ /* 0x20ac4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ac9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xc5", "\x00\x00", ++ /* 0x20ace */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ad3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ad8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20add */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ae2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ae7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20aec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20af1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20af6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20afb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20b00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20b05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20b0a */ "\x00\x00", "\x00\x00", "\x8e\xef", + + /* 0x20b8f */ "\xfa\xe9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20b93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20b98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20b9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20b9d */ "\x00\x00", "\x8d\x40", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ba2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20ba8 */ "\x92\x62", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ba8 */ "\x92\x62", "\x8a\xf7", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bb1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20bbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20bbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xc6", "\x00\x00", + /* 0x20bc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bc6 */ "\x92\xe1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20bca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20bcb */ "\x9a\xc9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bcf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bd9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bde */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\xc6", "\x00\x00", + /* 0x20be3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20be8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20be8 */ "\x00\x00", "\x00\x00", "\x97\xa5", "\x00\x00", "\x00\x00", + /* 0x20bed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20bf2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20bf7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20bf7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xcb", "\x00\x00", + /* 0x20bfc */ "\x00\x00", "\x00\x00", "\xfa\x72", "\x00\x00", "\x00\x00", + /* 0x20c01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20c06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20c0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20c06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x5e", ++ /* 0x20c0b */ "\x00\x00", "\x94\xe0", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -11914,8 +11305,8 @@ static const char from_ucs4[][2] = + /* 0x20c24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20c33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20c38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20c34 */ "\x8a\xe5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20c38 */ "\x00\x00", "\xfe\x5c", "\x9a\xcc", "\x00\x00", "\x00\x00", + /* 0x20c3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xf9", "\x8a\x43", + /* 0x20c43 */ "\x8a\xa6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -11923,48 +11314,48 @@ static const char from_ucs4[][2] = + /* 0x20c51 */ "\x00\x00", "\x9a\xcd", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20c60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20c60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xce", + /* 0x20c65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c74 */ "\x00\x00", "\x00\x00", "\xfa\xee", "\x9b\xcc", "\x00\x00", +- /* 0x20c79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20c79 */ "\x00\x00", "\x00\x00", "\x9a\xcf", "\x00\x00", "\x00\x00", + /* 0x20c7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20c83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20c88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20c88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xd1", + /* 0x20c8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20c92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20c92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xfa", "\x00\x00", + /* 0x20c97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x7c", + /* 0x20c9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ca1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ca6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20cab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20cb0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20cb5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20cb0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xd3", ++ /* 0x20cb5 */ "\x00\x00", "\x00\x00", "\x97\xa6", "\x00\x00", "\x00\x00", + /* 0x20cba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20cbf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20cc4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20cc9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ccf */ "\x99\x5f", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xf6", + /* 0x20cd4 */ "\x9f\xc5", "\x8a\x59", "\x8b\x6b", "\x00\x00", "\x00\x00", +- /* 0x20cd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20cd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xd4", + /* 0x20cdd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ce2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ce7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20cec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ced */ "\x9a\xd5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20cf1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20cf6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20cfb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20cfb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xa2", "\x00\x00", + /* 0x20d00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20d15 */ "\x8a\x44", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20d23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\x4a", + /* 0x20d28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20d2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xa1", "\xfd\xa4", + /* 0x20d32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -11977,24 +11368,24 @@ static const char from_ucs4[][2] = + /* 0x20d5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20d6f */ "\x9a\xd6", "\x00\x00", "\x9f\x4d", "\x00\x00", "\x00\x00", ++ /* 0x20d74 */ "\xfa\xf6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20d78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x57", "\x00\x00", + /* 0x20d7e */ "\x8b\x43", "\x8b\x44", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20d8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20d91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xb6", + /* 0x20d96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20d9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20d9c */ "\x8a\xc0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20da0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20da5 */ "\x00\x00", "\x9e\x54", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20daa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20daf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20daf */ "\x00\x00", "\x00\x00", "\x9a\xd7", "\x00\x00", "\x00\x00", + /* 0x20db4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20db9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20dbe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20dc3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20dc3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xd8", + /* 0x20dc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20dcd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20dd2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12006,7 +11397,7 @@ static const char from_ucs4[][2] = + /* 0x20df0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20df5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20dfa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20dff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20dff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xdc", + /* 0x20e04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xca", + /* 0x20e0a */ "\x9e\xa8", "\x00\x00", "\x00\x00", "\x92\x63", "\x9a\xdd", + /* 0x20e0f */ "\x8b\x65", "\x8b\x6f", "\x8b\x7e", "\x00\x00", "\x00\x00", +@@ -12021,7 +11412,7 @@ static const char from_ucs4[][2] = + /* 0x20e3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20e4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20e4a */ "\x00\x00", "\x8a\xf4", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12029,16 +11420,16 @@ static const char from_ucs4[][2] = + /* 0x20e63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xbe", + /* 0x20e6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20e72 */ "\x00\x00", "\x00\x00", "\xfc\xde", "\x9d\xfd", "\x8b\x66", ++ /* 0x20e73 */ "\x9a\xe1", "\x00\x00", "\xfc\xde", "\x9d\xfd", "\x8b\x66", + /* 0x20e78 */ "\x8b\x70", "\x8b\x75", "\x8a\xe4", "\x8b\xa4", "\x00\x00", + /* 0x20e7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20e8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20e8c */ "\x8a\xed", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20e90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20e95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20e9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20e9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20e96 */ "\x8a\x5d", "\x00\x00", "\x8b\x48", "\x00\x00", "\x00\x00", ++ /* 0x20e9a */ "\x00\x00", "\x00\x00", "\x9d\xed", "\x00\x00", "\x00\x00", ++ /* 0x20e9f */ "\x00\x00", "\x00\x00", "\x9e\x40", "\x00\x00", "\x00\x00", + /* 0x20ea4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20eaa */ "\x8a\xef", "\x8a\xf6", "\x9e\x76", "\x00\x00", "\x00\x00", + /* 0x20eae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12049,8 +11440,8 @@ static const char from_ucs4[][2] = + /* 0x20ec7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ecc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ed1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20ed6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20edb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20ed7 */ "\x9a\xde", "\x8d\xfe", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20edb */ "\x00\x00", "\xfa\xfc", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ee0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20ee5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20eea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12063,8 +11454,8 @@ static const char from_ucs4[][2] = + /* 0x20f0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20f1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20f21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20f1d */ "\x97\x4b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20f21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\x53", + /* 0x20f26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f2b */ "\x00\x00", "\x9a\xe0", "\x8b\x4a", "\x00\x00", "\x8a\xf1", + /* 0x20f31 */ "\x8a\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12072,12 +11463,12 @@ static const char from_ucs4[][2] = + /* 0x20f3b */ "\xa0\xab", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20f49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20f49 */ "\x00\x00", "\x00\x00", "\x8a\xb5", "\x00\x00", "\x00\x00", + /* 0x20f4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20f62 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20f62 */ "\x00\x00", "\x8a\x5f", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12086,7 +11477,7 @@ static const char from_ucs4[][2] = + /* 0x20f80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f8a */ "\x00\x00", "\x00\x00", "\x8a\xee", "\x00\x00", "\x00\x00", +- /* 0x20f8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20f90 */ "\x9a\xdf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20f9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12094,14 +11485,14 @@ static const char from_ucs4[][2] = + /* 0x20fa8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xfe", + /* 0x20fad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fb2 */ "\x00\x00", "\x8a\x58", "\x8b\xa3", "\x8b\xa7", "\x00\x00", +- /* 0x20fb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20fb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xe3", + /* 0x20fbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fc1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fc6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fcb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fd0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fd5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x20fda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x20fda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x61", + /* 0x20fdf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fe4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x20fea */ "\x9d\xd7", "\x9e\x7d", "\x9e\xa7", "\x9e\xab", "\x00\x00", +@@ -12112,7 +11503,7 @@ static const char from_ucs4[][2] = + /* 0x21002 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21007 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2100c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21011 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21011 */ "\x00\x00", "\x00\x00", "\x90\x42", "\x00\x00", "\x00\x00", + /* 0x21016 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2101b */ "\x00\x00", "\x8b\x79", "\x8b\x7a", "\x00\x00", "\x00\x00", + /* 0x21020 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12124,9 +11515,9 @@ static const char from_ucs4[][2] = + /* 0x2103e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21043 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21048 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2104d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2104d */ "\x00\x00", "\x9a\xe6", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21052 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21057 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21057 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xe5", + /* 0x2105c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21061 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21066 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12135,26 +11526,26 @@ static const char from_ucs4[][2] = + /* 0x21076 */ "\x9a\xe7", "\x8a\x7c", "\x8b\x71", "\x00\x00", "\x00\x00", + /* 0x2107b */ "\x9a\xe9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2107f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21084 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21084 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xea", "\x00\x00", + /* 0x21089 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2108e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21093 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21098 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21093 */ "\x00\x00", "\x00\x00", "\x9a\xeb", "\x00\x00", "\x00\x00", ++ /* 0x21098 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xbd", + /* 0x2109d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210b1 */ "\x00\x00", "\x00\x00", "\xfb\x4e", "\x00\x00", "\x00\x00", + /* 0x210b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x210bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xf9", ++ /* 0x210bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xed", "\x8a\xf9", + /* 0x210c1 */ "\x9e\x63", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210c5 */ "\x00\x00", "\x8b\x49", "\x8a\xce", "\x8b\x6e", "\x00\x00", +- /* 0x210ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x210cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x210ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xe8", ++ /* 0x210cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xee", "\x00\x00", + /* 0x210d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x210e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x210e4 */ "\x92\xce", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x210f2 */ "\x00\x00", "\x8a\x5a", "\x8b\x7b", "\x8b\x7c", "\x00\x00", +@@ -12169,13 +11560,13 @@ static const char from_ucs4[][2] = + /* 0x2111f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21124 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21129 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2112e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2112f */ "\x9a\xef", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21133 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21138 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xfa", ++ /* 0x21138 */ "\x00\x00", "\x00\x00", "\x9a\xf0", "\x00\x00", "\x8a\xfa", + /* 0x2113d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21142 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21142 */ "\x00\x00", "\x00\x00", "\x89\x41", "\x00\x00", "\x00\x00", + /* 0x21148 */ "\x8b\x72", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2114c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2114c */ "\x00\x00", "\x00\x00", "\x8a\xf3", "\x00\x00", "\x00\x00", + /* 0x21151 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21156 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2115b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12222,7 +11613,7 @@ static const char from_ucs4[][2] = + /* 0x21228 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2122d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21232 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21237 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21237 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\x73", + /* 0x2123c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21241 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21246 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12244,7 +11635,7 @@ static const char from_ucs4[][2] = + /* 0x21296 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2129b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x212a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x212a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xf6", "\x00\x00", ++ /* 0x212a5 */ "\x00\x00", "\x00\x00", "\x91\xfe", "\x9e\xf6", "\x00\x00", + /* 0x212aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x212b0 */ "\x97\xed", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x212b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12272,7 +11663,7 @@ static const char from_ucs4[][2] = + /* 0x21322 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21327 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2132c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21331 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21331 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xf5", + /* 0x21336 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x4b", "\x00\x00", + /* 0x2133b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21340 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12285,14 +11676,14 @@ static const char from_ucs4[][2] = + /* 0x21363 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21368 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2136d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21372 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21372 */ "\x00\x00", "\x00\x00", "\x9a\xf4", "\xfe\xde", "\x00\x00", + /* 0x21377 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2137c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21381 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21386 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2138b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2138b */ "\x00\x00", "\x00\x00", "\xfc\xb7", "\x00\x00", "\x00\x00", + /* 0x21390 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21395 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21395 */ "\x00\x00", "\x00\x00", "\x97\xf1", "\x00\x00", "\x00\x00", + /* 0x2139a */ "\x00\x00", "\x97\xc7", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2139f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x213a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12317,15 +11708,15 @@ static const char from_ucs4[][2] = + /* 0x21403 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21408 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2140d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21412 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21413 */ "\x97\x4e", "\x00\x00", "\x00\x00", "\xfb\x68", "\x00\x00", + /* 0x21417 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2141c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21421 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21421 */ "\x00\x00", "\x00\x00", "\x97\x6c", "\x00\x00", "\x00\x00", + /* 0x21426 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2142b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21430 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21435 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2143a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2143a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xc2", + /* 0x2143f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21444 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21449 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12340,7 +11731,7 @@ static const char from_ucs4[][2] = + /* 0x21476 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2147b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21480 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21485 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21485 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xe7", + /* 0x2148a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2148f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21494 */ "\x00\x00", "\x00\x00", "\xfd\xc8", "\x00\x00", "\x00\x00", +@@ -12364,259 +11755,363 @@ static const char from_ucs4[][2] = + /* 0x214ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x214f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x214f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xf3", ++ /* 0x214fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21502 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21507 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2150c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21511 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21516 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2151b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21520 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21525 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2152a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2152f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21534 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21539 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2153e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21543 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21548 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2154d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21552 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21557 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2155c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21561 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21566 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2156b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21570 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21575 */ "\x00\x00", "\x9a\xf7", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2157a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2157f */ "\x00\x00", "\x00\x00", "\x8f\xa6", "\x00\x00", "\x00\x00", ++ /* 0x21584 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21589 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2158e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21593 */ "\x00\x00", "\x00\x00", "\xfa\xd6", "\x00\x00", "\x00\x00", ++ /* 0x21598 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2159d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x215fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21601 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21606 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xc7", "\x00\x00", ++ /* 0x2160b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21610 */ "\x00\x00", "\x00\x00", "\xfa\xd7", "\x00\x00", "\x00\x00", ++ /* 0x21615 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xf8", "\x00\x00", ++ /* 0x2161a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2161f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21624 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21629 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2162e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21633 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21638 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2163e */ "\xfb\xa1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21642 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21647 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2164c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21651 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21656 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2165b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21661 */ "\x8e\xc5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21665 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2166a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2166f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21674 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21679 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2167e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21683 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21688 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2168d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xa4", ++ /* 0x21692 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21697 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2169c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216b5 */ "\x00\x00", "\x00\x00", "\xfb\xc2", "\x00\x00", "\x9a\xc1", ++ /* 0x216ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216c0 */ "\x91\xfa", "\xfe\xdb", "\x97\xab", "\x00\x00", "\x00\x00", ++ /* 0x216c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x47", ++ /* 0x216d3 */ "\x00\x00", "\xfb\xb1", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216dd */ "\x00\x00", "\x8f\xea", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xd2", "\xfe\x61", ++ /* 0x216e8 */ "\xfa\xce", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x216f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xed", "\x91\xf3", ++ /* 0x216fc */ "\x93\xc6", "\x00\x00", "\x93\x5a", "\x00\x00", "\x00\x00", ++ /* 0x21700 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21705 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2170a */ "\x00\x00", "\x00\x00", "\xfa\xfb", "\x00\x00", "\x00\x00", ++ /* 0x21710 */ "\x92\xef", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21714 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21719 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2171e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21723 */ "\x00\x00", "\x00\x00", "\xfa\xc8", "\x00\x00", "\x00\x00", ++ /* 0x21728 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2172d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21732 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21737 */ "\x00\x00", "\x00\x00", "\x98\x47", "\x93\x66", "\x98\x55", ++ /* 0x2173c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21741 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21746 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2174b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21750 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21755 */ "\x00\x00", "\x96\xe6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2175a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2175f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21764 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21769 */ "\x00\x00", "\x00\x00", "\x9f\x43", "\x9f\xaa", "\x94\xda", ++ /* 0x2176f */ "\x92\xee", "\xfc\xaf", "\xfb\xfb", "\x00\x00", "\x8e\xf9", ++ /* 0x21774 */ "\x91\xf6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21778 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2177d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21782 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21787 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2178c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21791 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21796 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2179b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217ab */ "\x93\x64", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217b0 */ "\x94\xf5", "\x9c\xb6", "\xfb\xad", "\x98\x4e", "\x8f\x44", ++ /* 0x217b5 */ "\x96\xfd", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xf9", ++ /* 0x217c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9a\xfa", "\x00\x00", ++ /* 0x217c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217d7 */ "\x00\x00", "\x97\x69", "\x95\xd4", "\x98\x4b", "\xfb\xaa", ++ /* 0x217dc */ "\x00\x00", "\x00\x00", "\x98\x7c", "\x00\x00", "\x00\x00", ++ /* 0x217e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xea", "\x00\x00", ++ /* 0x217f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xaf", ++ /* 0x217f6 */ "\x9d\xc5", "\x00\x00", "\x91\xf1", "\x8e\xb1", "\x97\xa9", ++ /* 0x217fb */ "\xfb\xac", "\xfc\xb8", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x217ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21804 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21809 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2180e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21813 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21818 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2181d */ "\x00\x00", "\x00\x00", "\x9c\xb9", "\x00\x00", "\x00\x00", ++ /* 0x21822 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21828 */ "\xfb\xb0", "\xfc\xd2", "\x93\xcb", "\x00\x00", "\x00\x00", ++ /* 0x2182d */ "\x9a\xfd", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21831 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21836 */ "\x00\x00", "\x00\x00", "\x91\xf4", "\x8b\xac", "\xa0\x55", ++ /* 0x2183b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x74", ++ /* 0x21840 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xbe", ++ /* 0x21845 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2184a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2184f */ "\x00\x00", "\x00\x00", "\x97\xad", "\x00\x00", "\x00\x00", ++ /* 0x21854 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21859 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xe9", ++ /* 0x2185e */ "\x00\x00", "\x00\x00", "\x92\xf8", "\x97\xbe", "\x91\x6c", ++ /* 0x21864 */ "\x94\xaa", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21868 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2186d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21872 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x63", ++ /* 0x21877 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xc6", "\x00\x00", ++ /* 0x2187c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21881 */ "\x00\x00", "\x97\xb5", "\x92\xb8", "\x91\xef", "\x00\x00", ++ /* 0x21886 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2188b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21890 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21895 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2189a */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xa6", "\x97\x60", ++ /* 0x218a0 */ "\x93\x58", "\x95\x76", "\x8f\xac", "\x00\x00", "\x00\x00", ++ /* 0x218a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218be */ "\x91\xec", "\x97\xb4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xf7", ++ /* 0x218d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x4a", ++ /* 0x218d7 */ "\xfb\x49", "\x95\x78", "\x93\xbc", "\x00\x00", "\x00\x00", ++ /* 0x218db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218fa */ "\x91\xd6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x218fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x55", ++ /* 0x21904 */ "\x93\x56", "\x98\x51", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21908 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2190d */ "\x00\x00", "\x00\x00", "\x8f\xf8", "\xfb\xc0", "\x93\xf2", ++ /* 0x21912 */ "\x00\x00", "\x00\x00", "\x90\xd0", "\x00\x00", "\x00\x00", ++ /* 0x21917 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x44", ++ /* 0x2191c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21922 */ "\x92\x55", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21927 */ "\x93\x63", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2192b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21930 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21935 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2193b */ "\x91\xa5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2193f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xed", ++ /* 0x21944 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21949 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2194e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21953 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\x6b", ++ /* 0x21958 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2195d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21962 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21967 */ "\x00\x00", "\x00\x00", "\x9a\xfe", "\x00\x00", "\x00\x00", ++ /* 0x2196c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21971 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21976 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2197c */ "\x93\x51", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x57", ++ /* 0x21980 */ "\x00\x00", "\x00\x00", "\xfa\x78", "\x00\x00", "\x00\x00", ++ /* 0x21985 */ "\x00\x00", "\x00\x00", "\xfe\xa8", "\x00\x00", "\x00\x00", ++ /* 0x2198a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2198f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21994 */ "\x00\x00", "\x93\x50", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21999 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2199e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219db */ "\xfa\x4c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xf7", ++ /* 0x219f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x219fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a2a */ "\x00\x00", "\x00\x00", "\x9b\x40", "\x00\x00", "\x00\x00", ++ /* 0x21a2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xce", ++ /* 0x21a34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a43 */ "\x00\x00", "\x9b\x41", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a48 */ "\x00\x00", "\x00\x00", "\xfe\xad", "\x00\x00", "\x00\x00", ++ /* 0x21a4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21a61 */ "\x00\x00", "\x87\x61", + +- /* 0x21596 */ "\xfa\xd6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2159a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2159f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x215fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21603 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21608 */ "\x00\x00", "\x9c\xc7", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2160d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21613 */ "\xfa\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21617 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2161c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21621 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21626 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2162b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21630 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21635 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2163a */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xa1", "\x00\x00", +- /* 0x2163f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21644 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21649 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2164e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21653 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21658 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2165d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xc5", "\x00\x00", +- /* 0x21662 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21667 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2166c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21671 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21676 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2167b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21680 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21685 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2168a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2168f */ "\x00\x00", "\x00\x00", "\xfb\xa4", "\x00\x00", "\x00\x00", +- /* 0x21694 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21699 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2169e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xfa", "\xfe\xdb", +- /* 0x216c2 */ "\x97\xab", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216d0 */ "\x00\x00", "\x00\x00", "\x91\x47", "\x00\x00", "\xfb\xb1", +- /* 0x216d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216e4 */ "\x00\x00", "\x94\xd2", "\xfe\x61", "\xfa\xce", "\x00\x00", +- /* 0x216e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x216f8 */ "\x00\x00", "\x92\xed", "\x91\xf3", "\x93\xc6", "\x00\x00", +- /* 0x216fe */ "\x93\x5a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21702 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21707 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2170c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xef", "\x00\x00", +- /* 0x21711 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21716 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2171b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21720 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21726 */ "\xfa\xc8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2172a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2172f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21734 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2173a */ "\x98\x47", "\x93\x66", "\x98\x55", "\x00\x00", "\x00\x00", +- /* 0x2173e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21743 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21748 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2174d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21752 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xe6", +- /* 0x21757 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2175c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21761 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21766 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2176c */ "\x9f\x43", "\x9f\xaa", "\x94\xda", "\x92\xee", "\xfc\xaf", +- /* 0x21771 */ "\xfb\xfb", "\x00\x00", "\x8e\xf9", "\x91\xf6", "\x00\x00", +- /* 0x21775 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2177a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2177f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21784 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21789 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2178e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21793 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21798 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2179d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xb6", +- /* 0x217b2 */ "\xfb\xad", "\x98\x4e", "\x8f\x44", "\x96\xfd", "\x00\x00", +- /* 0x217b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x69", +- /* 0x217da */ "\x95\xd4", "\x98\x4b", "\xfb\xaa", "\x00\x00", "\x00\x00", +- /* 0x217de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x217f2 */ "\x00\x00", "\x00\x00", "\x9d\xaf", "\x9d\xc5", "\x00\x00", +- /* 0x217f8 */ "\x91\xf1", "\x8e\xb1", "\x97\xa9", "\xfb\xac", "\xfc\xb8", +- /* 0x217fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21801 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21806 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2180b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21810 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21815 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2181a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2181f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21824 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xb0", "\xfc\xd2", +- /* 0x2182a */ "\x93\xcb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2182e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21833 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21838 */ "\x00\x00", "\x8b\xac", "\xa0\x55", "\x00\x00", "\x00\x00", +- /* 0x2183d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21842 */ "\x00\x00", "\x00\x00", "\x95\xbe", "\x00\x00", "\x00\x00", +- /* 0x21847 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2184c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21851 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21856 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2185b */ "\x00\x00", "\x00\x00", "\x8e\xe9", "\x00\x00", "\x00\x00", +- /* 0x21861 */ "\x92\xf8", "\x97\xbe", "\x91\x6c", "\x94\xaa", "\x00\x00", +- /* 0x21865 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2186a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2186f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21874 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21879 */ "\x00\x00", "\x9d\xc6", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2187e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xb5", +- /* 0x21884 */ "\x92\xb8", "\x91\xef", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21888 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2188d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21892 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21897 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2189c */ "\x00\x00", "\xfe\xa6", "\x97\x60", "\x93\x58", "\x95\x76", +- /* 0x218a2 */ "\x8f\xac", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xec", "\x97\xb4", +- /* 0x218bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218d3 */ "\x00\x00", "\x00\x00", "\x97\x4a", "\xfb\x49", "\x95\x78", +- /* 0x218d9 */ "\x93\xbc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x218f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xd6", "\x00\x00", +- /* 0x218fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21900 */ "\x00\x00", "\x00\x00", "\x93\x55", "\x93\x56", "\x98\x51", +- /* 0x21905 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2190a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21910 */ "\x8f\xf8", "\xfb\xc0", "\x93\xf2", "\x00\x00", "\x00\x00", +- /* 0x21915 */ "\x90\xd0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21919 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2191e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21923 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x63", "\x00\x00", +- /* 0x21928 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2192d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21932 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21937 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xa5", "\x00\x00", +- /* 0x2193c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21941 */ "\x00\x00", "\x00\x00", "\xa0\xed", "\x00\x00", "\x00\x00", +- /* 0x21946 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2194b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21950 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21955 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2195a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2195f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21964 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21969 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2196e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21973 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21978 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x51", "\x00\x00", +- /* 0x2197d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21982 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21988 */ "\xfe\xa8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2198c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21991 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x50", +- /* 0x21996 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2199b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x4c", "\x00\x00", +- /* 0x219dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219f0 */ "\x00\x00", "\x00\x00", "\x92\xf7", "\x00\x00", "\x00\x00", +- /* 0x219f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x219ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a22 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a36 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21a4b */ "\xfe\xad", +- +- /* 0x21b44 */ "\xfb\xd5", +- +- /* 0x21ca2 */ "\x9e\x79", "\x00\x00", "\x00\x00", "\xfb\xd9", ++ /* 0x21b44 */ "\xfb\xd5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b61 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b75 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b89 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b8e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21b9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ba2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ba7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bb1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bc1 */ "\x8b\xc2", "\x9a\x7c", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bcf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bd9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bde */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21be3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21be8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bf2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bf7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21bfc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c2a */ "\x9b\x42", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c51 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c70 */ "\x9b\x43", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21c9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ca2 */ "\x9e\x79", "\x00\x00", "\x00\x00", "\xfb\xd9", "\x00\x00", ++ /* 0x21ca6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21cac */ "\x9b\x44", + + /* 0x21d46 */ "\xa0\xa7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21d4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21d4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21d4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x7b", "\x00\x00", + /* 0x21d54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21d59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21d59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x6e", + /* 0x21d5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21d63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21d68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12626,7 +12121,7 @@ static const char from_ucs4[][2] = + /* 0x21d7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21d81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21d86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21d8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21d8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xf3", + /* 0x21d90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21d95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21d9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12634,7 +12129,7 @@ static const char from_ucs4[][2] = + /* 0x21da4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21da9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21dae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21db3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21db3 */ "\x00\x00", "\x00\x00", "\x8c\x79", "\x00\x00", "\x00\x00", + /* 0x21db8 */ "\x00\x00", "\x93\x5e", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21dbd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21dc2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12645,7 +12140,7 @@ static const char from_ucs4[][2] = + /* 0x21ddb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21de0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21de5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21dea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21deb */ "\x93\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21def */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21df4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xe1", + /* 0x21df9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12654,14 +12149,14 @@ static const char from_ucs4[][2] = + /* 0x21e08 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21e17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21e17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xd0", + /* 0x21e1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21e21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21e21 */ "\x00\x00", "\x8c\xf1", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e35 */ "\x00\x00", "\xfb\xe2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21e3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21e3a */ "\x00\x00", "\x00\x00", "\xfc\xe3", "\x00\x00", "\x00\x00", + /* 0x21e3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21e49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -12689,101 +12184,196 @@ static const char from_ucs4[][2] = + /* 0x21eb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21ebc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21ec1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21ec6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ec6 */ "\x00\x00", "\x9b\x45", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21ecb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x21ed0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x47", +- +- /* 0x21f6a */ "\xfc\x5b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21f9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x21fa1 */ "\x9c\xfd", +- +- /* 0x22049 */ "\xfb\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2204d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22052 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22057 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2205c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22061 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22066 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2206b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22070 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22075 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2207a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2207f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22084 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22089 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2208e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22093 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22098 */ "\x00\x00", "\x9b\xa8", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2209d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220c5 */ "\x00\x00", "\x8a\xd5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x220f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x73", +- /* 0x220fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22101 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22106 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2210b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22110 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22115 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2211a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2211f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22124 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2212a */ "\xfd\x59", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2212e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22133 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22138 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2213d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22142 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22147 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2214c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22151 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22156 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2215b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22160 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22165 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2216a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2216f */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xed", "\x00\x00", +- /* 0x22174 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2217a */ "\x9c\xa9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2217e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22183 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22188 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2218d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22192 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22197 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2219c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xa8", +- /* 0x221a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x221a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x221ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x221b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x221b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x221ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x221bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xc3", +- +- /* 0x2227c */ "\x9b\x4e", ++ /* 0x21ed5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21eda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21edf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ee4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ee9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21eee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ef3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ef8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21efd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f0c */ "\x00\x00", "\x00\x00", "\x9f\x50", "\x00\x00", "\x00\x00", ++ /* 0x21f11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x48", "\x00\x00", ++ /* 0x21f16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f61 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x5b", "\x00\x00", ++ /* 0x21f6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f75 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f89 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f8e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21f9e */ "\x98\xa9", "\x00\x00", "\x00\x00", "\x9c\xfd", "\x00\x00", ++ /* 0x21fa2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fa7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fb1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fcf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fd9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fde */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fe3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x88\x4c", ++ /* 0x21fe8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21fed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ff2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ff7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x21ffc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22001 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22006 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2200b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22010 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22015 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2201a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2201f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22024 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22029 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2202e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22033 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22038 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2203d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22042 */ "\x00\x00", "\x00\x00", "\x9b\x4b", "\x00\x00", "\x00\x00", ++ /* 0x22047 */ "\x00\x00", "\xfb\xec", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2204c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22051 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22056 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2205b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22060 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22065 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2206a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2206f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22074 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22079 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x69", ++ /* 0x2207e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22083 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22088 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2208d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22092 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22097 */ "\x00\x00", "\x00\x00", "\x9b\xa8", "\x00\x00", "\x00\x00", ++ /* 0x2209c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220c4 */ "\x00\x00", "\x00\x00", "\x8a\xd5", "\x00\x00", "\x00\x00", ++ /* 0x220c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x220fc */ "\xfa\x73", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22100 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22105 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2210a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2210f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22114 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22119 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2211e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22123 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22128 */ "\x00\x00", "\xfd\x59", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2212d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22132 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22137 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2213c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22141 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22146 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2214b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22150 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22155 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2215b */ "\x91\xa2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2215f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22164 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22169 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2216e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xed", ++ /* 0x22173 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22178 */ "\x00\x00", "\x9c\xa9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2217d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22182 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22187 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2218c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22191 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22196 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2219b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221a1 */ "\x8a\xa8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221be */ "\x00\x00", "\x00\x00", "\x8d\x42", "\x00\x00", "\x9b\xc3", ++ /* 0x221c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x221ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22204 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xe1", "\x00\x00", ++ /* 0x22209 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2220e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22213 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22218 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2221d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22222 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22227 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2222c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22231 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22236 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2223b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22240 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22245 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2224a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2224f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22254 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22259 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2225e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22263 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22268 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2226d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22272 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22277 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x4e", + + /* 0x22321 */ "\x95\xd0", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x5f", + +@@ -12791,257 +12381,336 @@ static const char from_ucs4[][2] = + /* 0x223c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x223c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x223cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x4e", ++ /* 0x223d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223d5 */ "\x00\x00", "\x9b\x4f", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223f8 */ "\x00\x00", "\x9b\x50", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x223fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22402 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22407 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2240c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22411 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22416 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2241b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22420 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22425 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2242a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2242f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22434 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22439 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2243e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22443 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22448 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2244d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22452 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22457 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2245c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22461 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xc6", "\x00\x00", ++ /* 0x22466 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2246b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22471 */ "\xfc\x50", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22475 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2247a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2247f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22484 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22489 */ "\x00\x00", "\xfd\x73", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2248e */ "\x00\x00", "\x00\x00", "\xfd\xa7", "\x00\x00", "\x00\x00", ++ /* 0x22493 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22498 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2249d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xa2", "\x00\x00", ++ /* 0x224b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224bc */ "\x87\xd1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224c1 */ "\x87\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x87\xd4", "\x00\x00", ++ /* 0x224ca */ "\x00\x00", "\x87\xd5", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x58", ++ /* 0x224ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x224fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22501 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22506 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2250b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22510 */ "\x00\x00", "\x00\x00", "\xfa\x5e", "\x00\x00", "\x00\x00", ++ /* 0x22515 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2251b */ "\xa0\x59", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2251f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22524 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22529 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2252e */ "\x00\x00", "\xfa\x75", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22533 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22538 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2253d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22542 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22547 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2254c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22551 */ "\x00\x00", "\x00\x00", "\xfb\xbe", "\x00\x00", "\x00\x00", ++ /* 0x22556 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2255b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22560 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22565 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2256a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2256f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22574 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22579 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2257e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22583 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22588 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xa2", ++ /* 0x2258d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22592 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22597 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2259c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x70", "\x00\x00", ++ /* 0x225b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x71", "\x00\x00", ++ /* 0x225bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x225fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22600 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22605 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2260a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2260f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22614 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22619 */ "\x00\x00", "\x93\x77", "\xfe\xef", "\x00\x00", "\x00\x00", ++ /* 0x2261e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22623 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22628 */ "\x00\x00", "\x00\x00", "\x93\x6d", "\x00\x00", "\x00\x00", ++ /* 0x2262d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22632 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22637 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2263c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22641 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22646 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2264b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22650 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22655 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2265a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2265f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22664 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x5d", "\x00\x00", ++ /* 0x22669 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2266e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22673 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22678 */ "\x00\x00", "\x90\xb8", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2267d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22682 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22687 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2268c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22691 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xfc", ++ /* 0x22696 */ "\x00\x00", "\xfb\x41", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2269b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x6b", "\x94\xe3", ++ /* 0x226f6 */ "\x8e\xe2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x226ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22704 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22709 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2270e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x7d", "\x00\x00", ++ /* 0x22714 */ "\x8e\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22718 */ "\x00\x00", "\x00\x00", "\x9c\x4d", "\x00\x00", "\x00\x00", ++ /* 0x2271d */ "\x00\x00", "\x96\xa3", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22722 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22727 */ "\x00\x00", "\x00\x00", "\x9b\x51", "\x00\x00", "\x00\x00", ++ /* 0x2272c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22731 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22736 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2273b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22740 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22745 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2274a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2274f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22754 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22759 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2275e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22763 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22768 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2276d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22772 */ "\x00\x00", "\x00\x00", "\x8a\xc3", "\x00\x00", "\x00\x00", ++ /* 0x22777 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2277c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xaa", ++ /* 0x22781 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22786 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2278b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22790 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22796 */ "\x8c\xe2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2279a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2279f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227b4 */ "\xfc\x68", "\x8b\x6d", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227cd */ "\xfd\x67", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x227fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xe9", ++ /* 0x22803 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22808 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2280d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22812 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22817 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2281c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22821 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22826 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2282b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22830 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22835 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2283a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2283f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22844 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22849 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2284e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22853 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22858 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2285d */ "\x00\x00", "\xfc\xa1", "\x93\x6c", "\x00\x00", "\x00\x00", ++ /* 0x22862 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22867 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2286c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x52", ++ /* 0x22871 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22876 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2287b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22880 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22885 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2288a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2288f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22894 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22899 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2289e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x70", ++ /* 0x228ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xa8", ++ /* 0x228c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xe9", "\x00\x00", ++ /* 0x228f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x228fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22902 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22907 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2290c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22911 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22916 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2291b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22920 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22926 */ "\x9c\xb4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2292a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2292f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22934 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xea", ++ /* 0x22939 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2293e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22943 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22948 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2294d */ "\x00\x00", "\x9b\x53", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22952 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22957 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2295c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22961 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22967 */ "\x9b\x55", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xab", ++ /* 0x2296b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22970 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22975 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2297a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22980 */ "\xfc\xa7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22984 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22989 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2298e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x56", + +- /* 0x22465 */ "\x9e\xc6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22469 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2246e */ "\x00\x00", "\x00\x00", "\xfc\x50", "\x00\x00", "\x00\x00", +- /* 0x22473 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22478 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2247d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22482 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22487 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\x73", +- +- /* 0x22513 */ "\xfa\x5e", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22517 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\x59", "\x00\x00", +- /* 0x2251c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22521 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22526 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2252b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x75", +- /* 0x22530 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22535 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2253a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2253f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22544 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22549 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2254e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22553 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22558 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2255d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22562 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22567 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2256c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22571 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22576 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2257b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22580 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22585 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2258a */ "\x00\x00", "\x00\x00", "\x9c\xa2", "\x00\x00", "\x00\x00", +- /* 0x2258f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22594 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22599 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2259e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225ad */ "\x00\x00", "\x93\x70", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225bc */ "\x00\x00", "\x93\x71", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x225fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22602 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22607 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2260c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22611 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22616 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x77", +- /* 0x2261c */ "\xfe\xef", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22620 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22625 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2262b */ "\x93\x6d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2262f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22634 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22639 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2263e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22643 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22648 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2264d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22652 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22657 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2265c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22661 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22666 */ "\x00\x00", "\xfc\x5d", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2266b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22670 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22675 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2267a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2267f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22684 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22689 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2268e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22693 */ "\x00\x00", "\x00\x00", "\x8a\xfc", "\x00\x00", "\xfb\x41", +- /* 0x22698 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2269d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226f2 */ "\x00\x00", "\x9e\x6b", "\x94\xe3", "\x8e\xe2", "\x00\x00", +- /* 0x226f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x226fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22701 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22706 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2270b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22710 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22715 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2271b */ "\x9c\x4d", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xa3", +- /* 0x2271f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22724 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22729 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2272e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22733 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22738 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2273d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22742 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22747 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2274c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22751 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22756 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2275b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22760 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22765 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2276a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2276f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22775 */ "\x8a\xc3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22779 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2277e */ "\x00\x00", "\x00\x00", "\x96\xaa", "\x00\x00", "\x00\x00", +- /* 0x22783 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22788 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2278d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22792 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22797 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2279c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x68", "\x8b\x6d", +- /* 0x227b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x227fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22800 */ "\x00\x00", "\x00\x00", "\x8a\xe9", "\x00\x00", "\x00\x00", +- /* 0x22805 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2280a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2280f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22814 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22819 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2281e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22823 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22828 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2282d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22832 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22837 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2283c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22841 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22846 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2284b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22850 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22855 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2285a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xa1", +- /* 0x22860 */ "\x93\x6c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22864 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22869 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2286e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22873 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22878 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2287d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22882 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22887 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2288c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22891 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22896 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2289b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228aa */ "\x00\x00", "\x00\x00", "\xfe\x70", "\x00\x00", "\x00\x00", +- /* 0x228af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228be */ "\x00\x00", "\x00\x00", "\xfc\xa8", "\x00\x00", "\x00\x00", +- /* 0x228c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228f5 */ "\x00\x00", "\xfc\xe9", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x228ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22904 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22909 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2290e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22913 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22918 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2291d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22922 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22927 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2292c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22931 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22936 */ "\x00\x00", "\x00\x00", "\x8a\xea", "\x00\x00", "\x00\x00", +- /* 0x2293b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22940 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22945 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2294a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2294f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22954 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22959 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2295e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22963 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22968 */ "\x00\x00", "\x00\x00", "\x96\xab", "\x00\x00", "\x00\x00", +- /* 0x2296d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22972 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22977 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2297c */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xa7", +- ++ /* 0x22a66 */ "\x8a\xbc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22a9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22aa1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22aa6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22aab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ab0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ab5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22aba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22abf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ac4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ac9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22acf */ "\x8a\xcb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22ad3 */ "\x00\x00", "\x9b\x57", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22ad8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22add */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22ae2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22ae7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ae2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x89\xcd", "\x00\x00", ++ /* 0x22ae8 */ "\x9b\x59", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22aec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22af1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22af6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22afb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22b0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22b0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x5b", "\x00\x00", + /* 0x22b0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13051,8 +12720,8 @@ static const char from_ucs4[][2] = + /* 0x22b2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22b3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22b41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22b3c */ "\x00\x00", "\x00\x00", "\x9b\x5d", "\x00\x00", "\x00\x00", ++ /* 0x22b41 */ "\x00\x00", "\x9e\x4f", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22b50 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13079,7 +12748,7 @@ static const char from_ucs4[][2] = + /* 0x22bb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22bbe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22bc3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22bc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22bc8 */ "\x00\x00", "\x8a\x7b", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22bce */ "\x8b\x42", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22bd2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22bd7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13101,15 +12770,15 @@ static const char from_ucs4[][2] = + /* 0x22c27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22c36 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22c36 */ "\x00\x00", "\x8a\x50", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22c4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22c4a */ "\x00\x00", "\x9b\x60", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c4f */ "\x00\x00", "\x8b\x45", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c55 */ "\x8b\x46", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22c5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22c5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xfe", "\x00\x00", + /* 0x22c63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13117,20 +12786,20 @@ static const char from_ucs4[][2] = + /* 0x22c77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22c86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22c86 */ "\x00\x00", "\x9b\x62", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c9b */ "\x93\x7b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22c9f */ "\x00\x00", "\x93\xb1", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22ca4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ca4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x60", + /* 0x22ca9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22cae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22cb3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22cae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xd8", "\x00\x00", ++ /* 0x22cb3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x63", "\x00\x00", + /* 0x22cb8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22cbd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22cbd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x69", + /* 0x22cc2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x47", "\x00\x00", +- /* 0x22cc7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22cc7 */ "\x00\x00", "\x8a\xcc", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22ccc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22cd1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22cd6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13144,7 +12813,7 @@ static const char from_ucs4[][2] = + /* 0x22cfe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d03 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x7c", "\x9b\x65", + /* 0x22d08 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22d0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22d0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x66", + /* 0x22d12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13154,9 +12823,9 @@ static const char from_ucs4[][2] = + /* 0x22d30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22d3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22d3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x72", + /* 0x22d44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22d49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22d49 */ "\x00\x00", "\x00\x00", "\x8a\x7a", "\x00\x00", "\x00\x00", + /* 0x22d4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13169,15 +12838,15 @@ static const char from_ucs4[][2] = + /* 0x22d7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22d8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22d8a */ "\x00\x00", "\x00\x00", "\x8a\xb0", "\x00\x00", "\x00\x00", + /* 0x22d8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22d94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22d95 */ "\x9b\x68", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22d9e */ "\x00\x00", "\x9e\xa3", "\x00\x00", "\x00\x00", "\xfa\xec", + /* 0x22da4 */ "\x8b\x77", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22da8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22dad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22db2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22db2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x67", + /* 0x22db7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22dbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22dc1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13188,7 +12857,7 @@ static const char from_ucs4[][2] = + /* 0x22dda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22ddf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22de4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22de9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22de9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\x59", + /* 0x22dee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22df3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22df8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13205,7 +12874,7 @@ static const char from_ucs4[][2] = + /* 0x22e2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22e34 */ "\x00\x00", "\xfc\xbb", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22e39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22e3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x69", "\x00\x00", + /* 0x22e43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22e48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22e4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13216,186 +12885,236 @@ static const char from_ucs4[][2] = + /* 0x22e66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22e6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x22e70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22e75 */ "\x00\x00", "\x00\x00", "\x93\xa8", ++ /* 0x22e75 */ "\x00\x00", "\x00\x00", "\x93\xa8", "\x00\x00", "\x00\x00", ++ /* 0x22e7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e89 */ "\x00\x00", "\x8a\xe0", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e8e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22e9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ea2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ea7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22eac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22eb1 */ "\x00\x00", "\x9e\x51", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22eb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ebb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ec0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ec5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22eca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ecf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ed4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ed9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ede */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ee3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ee8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22eed */ "\x00\x00", "\x8f\x5f", + +- /* 0x22fe3 */ "\x97\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22fe7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22fec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22ff1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22ff6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x22ffb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23000 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23005 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2300a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2300f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23014 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23019 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2301e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23023 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23028 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2302d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23032 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23037 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2303c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23041 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23046 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xc2", +- /* 0x2304b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23050 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23055 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2305a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2305f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23064 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23069 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2306e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23073 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23078 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x67", +- /* 0x2307e */ "\xfc\xcc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23082 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23087 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2308c */ "\x00\x00", "\x93\xb6", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23091 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23096 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2309b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230b4 */ "\x00\x00", "\x00\x00", "\x90\xe4", "\x00\x00", "\x00\x00", +- /* 0x230b9 */ "\x00\x00", "\x00\x00", "\x90\xe5", "\x00\x00", "\x00\x00", +- /* 0x230be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230d7 */ "\x00\x00", "\x00\x00", "\x9e\xf2", "\x00\x00", "\x00\x00", +- /* 0x230dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x230ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xca", "\x00\x00", +- /* 0x23104 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23109 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2310e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23113 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23118 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2311d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23122 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23127 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2312c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23131 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23136 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2313b */ "\x00\x00", "\x8b\xbc", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23140 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23145 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2314a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2314f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23154 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23159 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2315e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23163 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23168 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2316d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23172 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23177 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2317c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23182 */ "\x93\xcf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23186 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2318b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23190 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23195 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2319a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2319f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xdb", +- /* 0x231a5 */ "\xfc\xdc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231c8 */ "\xfc\xe6", "\x96\xe7", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231f4 */ "\x00\x00", "\x00\x00", "\xfc\xd8", "\xfc\xd9", "\xfd\xa6", +- /* 0x231f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x231fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23203 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23208 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2320d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23212 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23217 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2321c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23221 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xf1", "\x00\x00", +- /* 0x23226 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2322b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xe9", "\x00\x00", +- /* 0x23231 */ "\xfc\xe4", "\x94\xaf", "\xfa\x77", "\x93\xcc", "\x00\x00", +- /* 0x23235 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2323a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2323f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23244 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23249 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2324e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23253 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23258 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2325d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x5a", +- /* 0x23262 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23267 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2326c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23271 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23276 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2327b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23280 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23285 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xbf", "\xfb\x51", +- /* 0x2328a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2328f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23294 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23299 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2329e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232a8 */ "\x00\x00", "\x00\x00", "\x93\xb9", "\xfe\xd7", "\x93\xb7", +- /* 0x232ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232d0 */ "\x00\x00", "\x93\xd9", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232e0 */ "\x93\xbb", "\x93\xda", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x232fd */ "\x00\x00", "\x00\x00", "\x98\xa3", "\x00\x00", "\x00\x00", +- /* 0x23302 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23307 */ "\x00\x00", "\x00\x00", "\x90\xd1", ++ /* 0x22f74 */ "\x9b\x6a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22f9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fa0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fa5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22faa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22faf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fb4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fbe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fc3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x6b", "\x00\x00", ++ /* 0x22fcd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fd2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fd7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fdc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fe1 */ "\x00\x00", "\x97\xec", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fe6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22feb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ff0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ff5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22ffa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x22fff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23004 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23009 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2300e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23013 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23018 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2301d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23022 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23027 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2302c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23031 */ "\x00\x00", "\x9b\x6c", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23036 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2303b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23040 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x4e", "\x00\x00", ++ /* 0x23045 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2304b */ "\xfd\xc2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2304f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23054 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23059 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2305e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23063 */ "\x00\x00", "\x00\x00", "\x9b\x6d", "\x00\x00", "\x00\x00", ++ /* 0x23068 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2306d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23072 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23077 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2307d */ "\x91\x67", "\xfc\xcc", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23081 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23086 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2308b */ "\x00\x00", "\x00\x00", "\x93\xb6", "\x00\x00", "\x00\x00", ++ /* 0x23090 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23095 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2309a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2309f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xe4", "\x00\x00", ++ /* 0x230b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xe5", "\x00\x00", ++ /* 0x230bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xf2", "\x00\x00", ++ /* 0x230db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x230fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xca", ++ /* 0x23103 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23108 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2310d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23112 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23117 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2311c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23121 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23126 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2312b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23130 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23135 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2313a */ "\x00\x00", "\x00\x00", "\x8b\xbc", "\x00\x00", "\x00\x00", ++ /* 0x2313f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23144 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23149 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2314e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23153 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23158 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2315d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23162 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23167 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2316c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23171 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23176 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2317b */ "\x00\x00", "\x8f\x46", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23180 */ "\x00\x00", "\x93\xcf", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23185 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2318a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2318f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23194 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23199 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2319e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231a4 */ "\xfc\xdb", "\xfc\xdc", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231b3 */ "\x93\xc0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231c6 */ "\x00\x00", "\xfc\xe6", "\x96\xe7", "\x00\x00", "\x00\x00", ++ /* 0x231cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231ea */ "\x87\xa7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xd8", "\xfc\xd9", ++ /* 0x231f9 */ "\xfd\xa6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x231fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23202 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23207 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2320c */ "\x00\x00", "\x00\x00", "\x93\xce", "\x00\x00", "\x00\x00", ++ /* 0x23211 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23216 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2321b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23220 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xf1", ++ /* 0x23225 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2322a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xe9", ++ /* 0x2322f */ "\x00\x00", "\xfc\xe4", "\x94\xaf", "\xfa\x77", "\x93\xcc", ++ /* 0x23234 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23239 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2323e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23243 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23248 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2324d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23252 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xe1", "\x00\x00", ++ /* 0x23257 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2325c */ "\x00\x00", "\x87\xa9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23262 */ "\x90\x5a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23266 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2326b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23270 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23275 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2327a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2327f */ "\x00\x00", "\x8c\x54", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23284 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xbf", ++ /* 0x2328a */ "\xfb\x51", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2328e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23293 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23298 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2329d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xb9", "\xfe\xd7", ++ /* 0x232ad */ "\x93\xb7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232cf */ "\x00\x00", "\x00\x00", "\x93\xd9", "\x00\x00", "\x00\x00", ++ /* 0x232d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232de */ "\x00\x00", "\x93\xbb", "\x93\xda", "\x00\x00", "\x00\x00", ++ /* 0x232e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x232fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xa3", "\x00\x00", ++ /* 0x23301 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23306 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xd1", "\x00\x00", ++ /* 0x2330b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23310 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23315 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2331a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\x6e", + + /* 0x233b4 */ "\xfa\x70", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x233c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x233c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xeb", + /* 0x233cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x233db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x233db */ "\x00\x00", "\x00\x00", "\x9b\x6f", "\x00\x00", "\x00\x00", + /* 0x233e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233e6 */ "\xfc\xfc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x233ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\x40", +- /* 0x233f5 */ "\xa0\x7b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x233f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xe2", ++ /* 0x233f5 */ "\xa0\x7b", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xa1", ++ /* 0x233fa */ "\x97\xf7", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xe2", + /* 0x233fe */ "\x00\x00", "\xfc\xd6", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23403 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23408 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13408,7 +13127,7 @@ static const char from_ucs4[][2] = + /* 0x2342b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23430 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23435 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2343a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2343a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x59", + /* 0x2343f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23444 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23449 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13418,7 +13137,7 @@ static const char from_ucs4[][2] = + /* 0x2345d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23462 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23467 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2346c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2346c */ "\x00\x00", "\x00\x00", "\xfd\x40", "\x00\x00", "\x00\x00", + /* 0x23472 */ "\x93\x5f", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23476 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2347b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13452,7 +13171,7 @@ static const char from_ucs4[][2] = + /* 0x23507 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2350c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23511 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23516 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23516 */ "\x00\x00", "\x00\x00", "\x9c\x76", "\x00\x00", "\x00\x00", + /* 0x2351b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23520 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23525 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13463,12 +13182,12 @@ static const char from_ucs4[][2] = + /* 0x2353e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23543 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23548 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2354d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2354d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xeb", "\x00\x00", + /* 0x23552 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23557 */ "\x00\x00", "\x00\x00", "\x8f\x47", "\x00\x00", "\x00\x00", + /* 0x2355c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23561 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23566 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23567 */ "\x9b\x74", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2356b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23570 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23575 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13484,7 +13203,7 @@ static const char from_ucs4[][2] = + /* 0x235a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x235b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x235b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\xd8", + /* 0x235bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13496,14 +13215,14 @@ static const char from_ucs4[][2] = + /* 0x235e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x235f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x235f3 */ "\x9b\x75", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x235fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x5c", "\x00\x00", + /* 0x23601 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23606 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2360b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23610 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23615 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23615 */ "\x00\x00", "\x87\x51", "\x00\x00", "\x00\x00", "\x9b\x79", + /* 0x2361a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2361f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23624 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13516,8 +13235,8 @@ static const char from_ucs4[][2] = + /* 0x23647 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2364c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23651 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23656 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2365b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23656 */ "\x00\x00", "\x00\x00", "\xfd\x58", "\x00\x00", "\x00\x00", ++ /* 0x2365b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x5f", "\x00\x00", + /* 0x23660 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23665 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2366a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13527,10 +13246,10 @@ static const char from_ucs4[][2] = + /* 0x2367e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23683 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23688 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2368d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2368e */ "\x87\xc7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23692 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23697 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2369c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2369c */ "\x00\x00", "\x87\x7c", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x236a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x43", + /* 0x236a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x236ab */ "\x00\x00", "\x97\xfa", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13550,15 +13269,15 @@ static const char from_ucs4[][2] = + /* 0x236f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x236f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x236fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23700 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23700 */ "\x00\x00", "\x00\x00", "\xfd\x5b", "\x00\x00", "\x00\x00", + /* 0x23705 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2370a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2370f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23714 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23714 */ "\x00\x00", "\x9b\x7a", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23719 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2371e */ "\x00\x00", "\x9e\xd5", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23723 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23728 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23728 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\xae", + /* 0x2372d */ "\x00\x00", "\x9c\xc9", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23732 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x23737 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -13593,667 +13312,837 @@ static const char from_ucs4[][2] = + /* 0x237c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x237cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x237d2 */ "\x00\x00", "\x00\x00", "\x93\xec", "\x97\xf6", "\x96\xcf", ++ /* 0x237d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x237ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23804 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23809 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2380e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23813 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23818 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2381d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23822 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23827 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2382c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23831 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23836 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xde", + +- /* 0x23adb */ "\xfd\x69", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23adf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ae4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ae9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x52", +- /* 0x23aee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23af3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23af8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23afd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23b57 */ "\x00\x00", "\x00\x00", "\xfd\x6e", +- +- /* 0x23c99 */ "\xfa\x7c", "\x93\xfa", "\x90\x7c", "\x00\x00", "\x00\x00", +- /* 0x23c9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ca2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ca7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cb1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cb7 */ "\x9d\xb7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cc5 */ "\x00\x00", "\xa0\xe9", "\xfa\x4e", "\xfd\xa1", "\x00\x00", +- /* 0x23cca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ccf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cd9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cde */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ce3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ce8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ced */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cf2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23cf7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x74", +- /* 0x23cfd */ "\x9f\xbf", "\x9e\xcb", "\x9b\xb9", "\x00\x00", "\x00\x00", +- /* 0x23d01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d51 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xb9", +- /* 0x23d5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23d9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23da1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23da6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23db0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23db6 */ "\x9e\xd2", "\x97\x53", "\x96\xa4", "\x8f\xbe", "\x94\xd9", +- /* 0x23dbb */ "\x90\x58", "\xfd\x79", "\xfd\x7b", "\x00\x00", "\x00\x00", +- /* 0x23dbf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dc4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dc9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dd3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ddd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23de2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23de7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23df1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23df6 */ "\x00\x00", "\x8e\xfa", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23dfb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xd9", "\x97\xd4", +- /* 0x23e2e */ "\x90\xbb", "\xfd\xbc", "\xfd\xc6", "\x92\x48", "\x00\x00", +- /* 0x23e32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e50 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e88 */ "\x9d\xc1", "\x92\xb9", "\x92\xa6", "\x8f\x4b", "\x00\x00", +- /* 0x23e8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23e9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ea0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ea5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23eaa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23eaf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23eb4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23eb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ebf */ "\x92\xb6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ec3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ec8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ecd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ed2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ed7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23edc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ee1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ee6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23eeb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ef0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ef5 */ "\x00\x00", "\x9e\xd8", "\x94\x5e", "\x98\x5f", "\x94\xce", +- /* 0x23efb */ "\x92\x4a", "\xfd\x70", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23eff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f22 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x67", "\x00\x00", +- /* 0x23f36 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f41 */ "\x8d\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f72 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f7c */ "\x00\x00", "\x00\x00", "\x94\x48", "\xfa\xc1", "\x9c\xf7", +- /* 0x23f82 */ "\xfd\xbe", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23f9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fa4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fa9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fb3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x7e", "\x00\x00", +- /* 0x23fb8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fbd */ "\x00\x00", "\x00\x00", "\x93\xf9", "\x00\x00", "\x00\x00", +- /* 0x23fc2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fc7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fcc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fd1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fd6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fdb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fe0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23fe5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23feb */ "\xfa\xeb", "\xfa\xc3", "\x97\xd3", "\x95\xf9", "\x9c\x48", +- /* 0x23ff0 */ "\x8e\x6a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ff4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ff9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x23ffe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24003 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24008 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2400d */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xd8", "\x00\x00", +- /* 0x24012 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24017 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2401c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24021 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24026 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2402b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24030 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24035 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xd7", "\xfb\x4a", +- /* 0x2403b */ "\x9b\xaf", "\x94\x4b", "\xfd\xc9", "\x00\x00", "\x00\x00", +- /* 0x2403f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24044 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24049 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2404e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24053 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xac", "\x00\x00", +- /* 0x24058 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2405d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24062 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24067 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2406c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24071 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24076 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2407b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24080 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24085 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2408b */ "\x92\x5a", "\xfc\xbd", "\x92\xd9", "\x00\x00", "\x00\x00", +- /* 0x2408f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24094 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24099 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2409e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240c6 */ "\x00\x00", "\x00\x00", "\x92\xdd", "\x00\x00", "\x00\x00", +- /* 0x240cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x240fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24102 */ "\x00\x00", "\x96\xba", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24107 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2410c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24111 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24116 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2411b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24120 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24125 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2412a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2412f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24134 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24139 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2413f */ "\xfd\xda", "\xfd\xde", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24144 */ "\xfd\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24148 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2414d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24152 */ "\x00\x00", "\x00\x00", "\xfd\xd6", "\xfd\xdc", "\xfd\xdd", +- /* 0x24157 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xfe", +- /* 0x2415c */ "\x00\x00", "\x00\x00", "\xfe\xa1", "\x00\x00", "\x00\x00", +- /* 0x24161 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24166 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2416b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24170 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24175 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xd8", +- /* 0x2417a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2417f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24184 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24189 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2418e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24193 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24198 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2419d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241a3 */ "\x9e\x6d", "\xfd\x7c", "\xfb\x61", "\x00\x00", "\x00\x00", +- /* 0x241a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241de */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x60", "\x00\x00", +- /* 0x241e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x241f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x52", +- /* 0x241fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24201 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24206 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2420b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24210 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24215 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2421b */ "\x96\x4f", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2421f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24224 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24229 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2422e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24233 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24238 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2423d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24242 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24247 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x6e", "\x00\x00", +- /* 0x2424c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24251 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x6d", +- /* 0x24256 */ "\x00\x00", "\x00\x00", "\x98\x64", "\x00\x00", "\x00\x00", +- /* 0x2425b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24260 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24265 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2426a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2426f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24274 */ "\x00\x00", "\x94\x53", "\xfd\xec", "\xfb\x78", "\x00\x00", +- /* 0x24279 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2427e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24283 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24288 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2428d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24292 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24297 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2429c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x5a", "\x00\x00", +- /* 0x242a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xd0", +- /* 0x242ca */ "\x98\x62", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x242f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x4f", "\x00\x00", +- /* 0x242fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24300 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24305 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2430a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2430f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24314 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2431a */ "\x94\x52", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2431e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24323 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24328 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2432d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24332 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24337 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2433c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24341 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24346 */ "\x00\x00", "\x91\xd2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2434b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24350 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24355 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2435a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2435f */ "\x00\x00", "\x00\x00", "\x97\xea", "\xfb\x6b", "\x91\xb1", +- /* 0x24365 */ "\xfd\xf3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24369 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2436e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24373 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24378 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2437d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24382 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24387 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xcb", +- /* 0x2438c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24391 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xb1", +- /* 0x24396 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2439c */ "\xfc\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x6b", "\x00\x00", +- /* 0x243be */ "\x00\x00", "\x00\x00", "\x97\x51", "\x00\x00", "\x00\x00", +- /* 0x243c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243e6 */ "\x00\x00", "\x00\x00", "\x98\x71", "\x00\x00", "\x00\x00", +- /* 0x243eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243f0 */ "\x00\x00", "\x9e\xf3", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243f5 */ "\x00\x00", "\x00\x00", "\x91\xe8", "\x00\x00", "\x00\x00", +- /* 0x243fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x243ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24404 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24409 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2440e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24413 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24418 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2441d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24422 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24427 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2442c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24431 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\x4c", "\x92\x6a", +- /* 0x24436 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2443b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24440 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24445 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2444a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2444f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24454 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2445a */ "\xfd\xf8", "\x98\x61", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2445e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24463 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24468 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2446d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24472 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24477 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2447c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24481 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24487 */ "\x93\xed", "\x97\x44", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2448b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24490 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24495 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2449a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2449f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244b9 */ "\x91\xe1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244cc */ "\x00\x00", "\x98\x69", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244d1 */ "\x00\x00", "\x8a\x62", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x244fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24503 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24508 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2450d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24512 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24517 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2451c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x55", +- /* 0x24521 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24526 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2452b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24530 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24535 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2453a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2453f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24544 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24549 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2454e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24553 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24558 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2455d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24562 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24567 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2456c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24571 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24576 */ "\x00\x00", "\x8e\x77", ++ /* 0x239c2 */ "\x8a\xcf", + +- /* 0x2462a */ "\x93\xe6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2462e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24633 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24638 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2463d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24642 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24647 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2464c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24651 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24656 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2465b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24660 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xa2", +- /* 0x24665 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2466a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2466f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24674 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24679 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2467e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24683 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24688 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2468d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24692 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xb3", +- /* 0x24697 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2469c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246d4 */ "\x93\x7d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x246fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24700 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24706 */ "\x9e\x66", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2470a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2470f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24714 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24719 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2471e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24723 */ "\x00\x00", "\x94\x59", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24728 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2472d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24732 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24737 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2473c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24741 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24746 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2474b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24750 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24755 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2475a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2475f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24764 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24769 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2476e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24773 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24778 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2477d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24782 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24787 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2478c */ "\x00\x00", "\x00\x00", "\x94\x58", ++ /* 0x23aa7 */ "\x9b\xa2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23aab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ab0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ab5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23aba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23abf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ac4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ac9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ace */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ad3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ad8 */ "\x00\x00", "\x00\x00", "\xfd\x69", "\x00\x00", "\x00\x00", ++ /* 0x23add */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ae2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ae7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23aec */ "\x00\x00", "\x93\x52", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23af1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23af6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xa2", "\x00\x00", ++ /* 0x23afb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b1a */ "\x8c\xe7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b50 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23b55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\x6e", + +- /* 0x24823 */ "\xfe\x54", +- +- /* 0x248f3 */ "\x94\xa5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x248f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x248fc */ "\x00\x00", "\x00\x00", "\x95\xed", "\xfd\x7e", "\xfb\xeb", +- /* 0x24901 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24906 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2490c */ "\xfd\x7d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24910 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24916 */ "\x97\x6f", "\x94\x61", "\x00\x00", "\x9f\xc1", "\x00\x00", +- /* 0x2491a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2491f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24924 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24929 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2492f */ "\x95\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x52", +- /* 0x24933 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24938 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2493e */ "\x9f\x68", "\x9b\xe7", "\xfc\xce", "\x96\xe8", "\xfa\x49", +- /* 0x24942 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24947 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2494c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24951 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24956 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2495b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24960 */ "\x00\x00", "\x95\x4d", "\x9e\xf8", "\x00\x00", "\x00\x00", +- /* 0x24965 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2496a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2496f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x49", +- /* 0x24975 */ "\x91\xce", "\x97\x71", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24979 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2497f */ "\xfd\xb1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24983 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xf2", +- /* 0x24989 */ "\x93\xb8", "\x90\x43", "\x97\x59", "\x94\xd7", "\xfe\x66", +- /* 0x2498e */ "\x94\x7d", "\xfc\x6f", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24992 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24997 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2499c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249a7 */ "\x8e\xf7", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x7c", +- /* 0x249ac */ "\x92\xcd", "\x97\xb2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249b5 */ "\x00\x00", "\xfe\x65", "\x96\x7e", "\x97\x58", "\x9b\x77", +- /* 0x249bb */ "\x91\xcf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249de */ "\x96\xd5", "\xfc\xb3", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249e3 */ "\x93\xae", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x249f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x46", +- /* 0x249f7 */ "\x95\x5b", "\x91\xd1", "\x94\xf4", "\x00\x00", "\x00\x00", +- /* 0x249fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a1e */ "\x00\x00", "\x00\x00", "\xfc\xed", "\xfd\xfa", "\xfc\xc8", +- /* 0x24a24 */ "\xfe\x62", "\x91\xfc", "\xfe\x6b", "\xfd\xf9", "\xfc\xc7", +- /* 0x24a29 */ "\x91\x4e", "\x9c\xb8", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a3c */ "\x00\x00", "\x97\x67", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a4b */ "\x00\x00", "\x00\x00", "\x94\xa2", "\x98\x75", "\x97\xac", +- /* 0x24a51 */ "\x91\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a65 */ "\x8e\xeb", "\x97\x6a", "\x96\x5e", "\x00\x00", "\x00\x00", +- /* 0x24a69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\xf9", "\x95\xf8", +- /* 0x24a79 */ "\xfe\xa2", "\x8f\xe6", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a91 */ "\x00\x00", "\x9d\xa4", "\x97\x68", "\x8e\xec", "\x94\xbd", +- /* 0x24a96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24a9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24aa0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x5b", "\x9c\xf6", +- /* 0x24aa6 */ "\xfa\xa7", "\x9b\xd9", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24aaa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24aaf */ "\x00\x00", "\xfa\x5d", "\x96\x56", "\x97\x62", "\x00\x00", +- /* 0x24ab4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24aba */ "\x94\xba", "\xa0\x4f", "\x92\xd8", "\x00\x00", "\x00\x00", +- /* 0x24abe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24ac3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xbb", "\x00\x00", +- /* 0x24ac8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24acd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xcf", "\x00\x00", +- /* 0x24ad2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24ad7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24adc */ "\x00\x00", "\x00\x00", "\x94\x65", "\x00\x00", "\x00\x00", +- /* 0x24ae2 */ "\x9f\x4c", +- +- /* 0x24b6e */ "\x9e\xbe", ++ /* 0x23c63 */ "\x8c\xa4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x7c", ++ /* 0x23c9a */ "\x93\xfa", "\x90\x7c", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23c9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ca3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ca8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cb2 */ "\x00\x00", "\x00\x00", "\x8f\x67", "\x00\x00", "\x9d\xb7", ++ /* 0x23cb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cc1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cc7 */ "\xa0\xe9", "\xfa\x4e", "\xfd\xa1", "\x00\x00", "\x00\x00", ++ /* 0x23ccb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cd0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cd5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cdf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ce4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ce9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cf3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23cf8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x74", "\x9f\xbf", ++ /* 0x23cfe */ "\x9e\xcb", "\x9b\xb9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d3e */ "\x00\x00", "\x9d\xd4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xb9", "\x00\x00", ++ /* 0x23d5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d61 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d75 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xf1", "\x00\x00", ++ /* 0x23d7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d89 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d8f */ "\x95\x7b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23d9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23da2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23da7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23db1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xd2", ++ /* 0x23db7 */ "\x97\x53", "\x96\xa4", "\x8f\xbe", "\x94\xd9", "\x90\x58", ++ /* 0x23dbc */ "\xfd\x79", "\xfd\x7b", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dcf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dd9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dde */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xda", ++ /* 0x23de3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23de8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ded */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23df2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23df8 */ "\x8e\xfa", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23dfc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x62", ++ /* 0x23e06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e11 */ "\x9b\xa5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e29 */ "\x00\x00", "\x00\x00", "\x9e\xd9", "\x97\xd4", "\x90\xbb", ++ /* 0x23e2f */ "\xfd\xbc", "\xfd\xc6", "\x92\x48", "\x00\x00", "\x00\x00", ++ /* 0x23e33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e39 */ "\x92\xb5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e51 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xc1", ++ /* 0x23e89 */ "\x92\xb9", "\x92\xa6", "\x8f\x4b", "\x00\x00", "\x00\x00", ++ /* 0x23e8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23e9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ea1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ea6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23eab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23eb0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23eb5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xa6", "\x00\x00", ++ /* 0x23eba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xb6", ++ /* 0x23ebf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ec4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ec9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ece */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ed3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\x40", "\x00\x00", ++ /* 0x23ed8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23edd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ee2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ee7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23eec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ef1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ef7 */ "\x9e\xd8", "\x94\x5e", "\x98\x5f", "\x94\xce", "\x92\x4a", ++ /* 0x23efc */ "\xfd\x70", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f32 */ "\x00\x00", "\x00\x00", "\x94\x67", "\x00\x00", "\x00\x00", ++ /* 0x23f37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\xec", ++ /* 0x23f41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xd8", "\x00\x00", ++ /* 0x23f4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f50 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f5f */ "\x00\x00", "\x87\x63", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f7d */ "\x00\x00", "\x94\x48", "\xfa\xc1", "\x9c\xf7", "\xfd\xbe", ++ /* 0x23f82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f8c */ "\x00\x00", "\x00\x00", "\x8f\xda", "\x00\x00", "\x00\x00", ++ /* 0x23f91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23f9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fa0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fa5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23faa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23faf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xd9", ++ /* 0x23fb4 */ "\x00\x00", "\x00\x00", "\xfc\x7e", "\x00\x00", "\x00\x00", ++ /* 0x23fb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fbe */ "\x00\x00", "\x93\xf9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fc3 */ "\x00\x00", "\xfa\x43", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fcd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fd2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fd7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fdc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fe1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fe6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\xeb", ++ /* 0x23fec */ "\xfa\xc3", "\x97\xd3", "\x95\xf9", "\x9c\x48", "\xfd\xd8", ++ /* 0x23ff0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ff5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23ffa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x23fff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24004 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24009 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2400e */ "\x00\x00", "\x00\x00", "\xa0\xd8", "\x00\x00", "\x00\x00", ++ /* 0x24013 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24018 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2401d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24022 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24027 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2402c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24031 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24036 */ "\x00\x00", "\x00\x00", "\xfd\xd7", "\xfb\x4a", "\x9b\xaf", ++ /* 0x2403c */ "\x94\x4b", "\xfd\xc9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24040 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24045 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2404a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2404f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24054 */ "\x00\x00", "\x00\x00", "\x8e\xac", "\x00\x00", "\x00\x00", ++ /* 0x24059 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2405e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24063 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24068 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2406d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24072 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24077 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2407c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24081 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xb2", "\x00\x00", ++ /* 0x24086 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x5a", ++ /* 0x2408c */ "\xfc\xbd", "\x92\xd9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24091 */ "\xfd\xd5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24095 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2409a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2409f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240c7 */ "\x00\x00", "\x92\xdd", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240e1 */ "\x92\x59", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240ea */ "\x00\x00", "\x8c\xf0", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x240fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24104 */ "\x96\xba", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24108 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2410d */ "\x00\x00", "\x92\x5b", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24112 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24117 */ "\x00\x00", "\x9b\xab", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2411c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24121 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24126 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2412b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24130 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24135 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2413a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xda", ++ /* 0x24140 */ "\xfd\xde", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xd3", ++ /* 0x24144 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24149 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x46", ++ /* 0x2414e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24153 */ "\x00\x00", "\xfd\xd6", "\xfd\xdc", "\xfd\xdd", "\x00\x00", ++ /* 0x24158 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xfe", "\x00\x00", ++ /* 0x2415d */ "\x00\x00", "\xfe\xa1", "\x00\x00", "\x87\xa5", "\x00\x00", ++ /* 0x24162 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24167 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2416c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24171 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24177 */ "\x8b\xad", "\x00\x00", "\x00\x00", "\x9c\xd8", "\x00\x00", ++ /* 0x2417b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24180 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24185 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2418a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2418f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24194 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24199 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2419e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x6d", ++ /* 0x241a4 */ "\xfd\x7c", "\xfb\x61", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xf8", "\x00\x00", ++ /* 0x241ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241b2 */ "\x00\x00", "\x00\x00", "\x96\xf0", "\x00\x00", "\x00\x00", ++ /* 0x241b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241cb */ "\x00\x00", "\xfc\xf4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241df */ "\x00\x00", "\x00\x00", "\xfe\x60", "\x00\x00", "\x00\x00", ++ /* 0x241e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x241f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x52", "\x00\x00", ++ /* 0x241fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24202 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24207 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2420c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24211 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24216 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\x4f", ++ /* 0x2421b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24220 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24225 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2422a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2422f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24234 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24239 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2423e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24243 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24248 */ "\x00\x00", "\x00\x00", "\x91\x6e", "\x00\x00", "\x00\x00", ++ /* 0x2424d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24252 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x6d", "\x00\x00", ++ /* 0x24257 */ "\x00\x00", "\x98\x64", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2425c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24261 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24266 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2426b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24270 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24276 */ "\x94\x53", "\xfd\xec", "\xfb\x78", "\x00\x00", "\x00\x00", ++ /* 0x2427a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2427f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xba", ++ /* 0x24284 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24289 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2428e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x5d", ++ /* 0x24293 */ "\x00\x00", "\x92\xf9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24298 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2429d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242a2 */ "\x00\x00", "\x00\x00", "\x98\x5a", "\x00\x00", "\x00\x00", ++ /* 0x242a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x50", "\x00\x00", ++ /* 0x242c1 */ "\xfd\xf6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xd0", "\x98\x62", ++ /* 0x242ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242ee */ "\x9b\xad", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x242f7 */ "\x00\x00", "\x00\x00", "\x97\x4f", "\x00\x00", "\x00\x00", ++ /* 0x242fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24301 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24306 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2430b */ "\x00\x00", "\x9b\xae", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24310 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24315 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x52", ++ /* 0x2431a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2431f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24324 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24329 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2432e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24334 */ "\x9b\xb0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24338 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2433d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24342 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24348 */ "\x91\xd2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2434c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24351 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24356 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2435b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24360 */ "\x00\x00", "\x97\xea", "\xfb\x6b", "\x91\xb1", "\xfd\xf3", ++ /* 0x24365 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2436a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2436f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24374 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24379 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2437e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24383 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24388 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xcb", "\x00\x00", ++ /* 0x2438d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24392 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xb1", "\x00\x00", ++ /* 0x24397 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xec", ++ /* 0x2439c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243ba */ "\x00\x00", "\x00\x00", "\x98\x6b", "\x00\x00", "\x00\x00", ++ /* 0x243bf */ "\x00\x00", "\x97\x51", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243e7 */ "\x00\x00", "\x98\x71", "\x95\xef", "\x00\x00", "\x00\x00", ++ /* 0x243ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243f2 */ "\x9e\xf3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243f6 */ "\x00\x00", "\x91\xe8", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x243fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24400 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xba", "\x00\x00", ++ /* 0x24405 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2440a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2440f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24414 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24419 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2441e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24423 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24428 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2442d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24432 */ "\x00\x00", "\x00\x00", "\xfb\x4c", "\x92\x6a", "\x00\x00", ++ /* 0x24437 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2443c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24441 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24446 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2444b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24450 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24455 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xf8", ++ /* 0x2445b */ "\x98\x61", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2445f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24464 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24469 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2446e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xe7", ++ /* 0x24473 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24478 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2447d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24482 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xed", ++ /* 0x24488 */ "\x97\x44", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2448c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24491 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24496 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2449b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xe1", ++ /* 0x244b9 */ "\x00\x00", "\x00\x00", "\xfb\xf5", "\x00\x00", "\x00\x00", ++ /* 0x244be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244ce */ "\x98\x69", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244d3 */ "\x8a\x62", "\x00\x00", "\x00\x00", "\x9b\xbb", "\x00\x00", ++ /* 0x244d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x244ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24505 */ "\x8c\xa8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24509 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2450e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24513 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24518 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2451d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x55", "\x00\x00", ++ /* 0x24522 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24527 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2452c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24531 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24536 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2453b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24540 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24545 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2454a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2454f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24554 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24559 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2455e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24563 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24568 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2456d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24572 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24578 */ "\x8e\x77", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2457c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24581 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24586 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2458b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24590 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24595 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2459a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2459f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245c8 */ "\x8a\xb2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x245fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24603 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24608 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2460d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24612 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24618 */ "\x9e\xbc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2461c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24621 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24626 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xe6", "\x00\x00", ++ /* 0x2462b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24630 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24635 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2463a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2463f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24644 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24649 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2464e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24653 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24658 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2465d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24662 */ "\x00\x00", "\x00\x00", "\x93\xa2", "\x00\x00", "\x00\x00", ++ /* 0x24667 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2466c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24671 */ "\x00\x00", "\x00\x00", "\x9b\xbd", "\x00\x00", "\x00\x00", ++ /* 0x24676 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2467b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24680 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24685 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2468a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2468f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24694 */ "\x00\x00", "\x00\x00", "\x94\xb3", "\x00\x00", "\x00\x00", ++ /* 0x24699 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2469e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x7d", "\x00\x00", ++ /* 0x246d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x246fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24702 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x66", "\x00\x00", ++ /* 0x24707 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2470c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24711 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24716 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2471b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24720 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x59", ++ /* 0x24725 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2472a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xbf", ++ /* 0x2472f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24734 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24739 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2473e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24743 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24748 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2474d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24752 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24757 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2475c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24761 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24766 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2476b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24770 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24775 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2477a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2477f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24784 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24789 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2478f */ "\x94\x58", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24793 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24798 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2479d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247de */ "\x00\x00", "\x9e\xa5", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x247fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24801 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24806 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2480b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24810 */ "\x00\x00", "\x9b\xc7", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24815 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2481a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2481f */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x54", "\x00\x00", ++ /* 0x24824 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24829 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2482e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24833 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24838 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2483d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24842 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24847 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2484c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24851 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24856 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2485b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24860 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24865 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2486a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2486f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24874 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24879 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2487e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\x74", "\x00\x00", ++ /* 0x24883 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24888 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2488d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24892 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24897 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2489c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248e7 */ "\x00\x00", "\x8b\xd6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xb6", "\xfd\x74", ++ /* 0x248f2 */ "\x98\xc0", "\x94\xa5", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x248f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xc8", ++ /* 0x248fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xed", "\xfd\x7e", ++ /* 0x24901 */ "\xfb\xeb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24905 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2490a */ "\x00\x00", "\xfd\x7d", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2490f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24914 */ "\x00\x00", "\x97\x6f", "\x94\x61", "\x00\x00", "\x9f\xc1", ++ /* 0x24919 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2491e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24923 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24928 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2492d */ "\x00\x00", "\x95\xd7", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24933 */ "\xfa\x52", "\x9c\x58", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24937 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2493c */ "\x00\x00", "\x9f\x68", "\x9b\xe7", "\xfc\xce", "\x96\xe8", ++ /* 0x24942 */ "\xfa\x49", "\x97\xa1", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24946 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2494b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24950 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24955 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2495a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2495f */ "\x00\x00", "\x00\x00", "\x95\x4d", "\x9e\xf8", "\x00\x00", ++ /* 0x24964 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24969 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2496e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24974 */ "\xfe\x49", "\x91\xce", "\x97\x71", "\x00\x00", "\x00\x00", ++ /* 0x24978 */ "\x00\x00", "\x00\x00", "\x8c\xcf", "\x00\x00", "\x00\x00", ++ /* 0x2497d */ "\x00\x00", "\xfd\xb1", "\x00\x00", "\x00\x00", "\xfc\x6e", ++ /* 0x24982 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24988 */ "\x9c\xf2", "\x93\xb8", "\x90\x43", "\x97\x59", "\x94\xd7", ++ /* 0x2498d */ "\xfe\x66", "\x94\x7d", "\xfc\x6f", "\x00\x00", "\x00\x00", ++ /* 0x24991 */ "\x00\x00", "\x00\x00", "\x92\x46", "\x00\x00", "\x00\x00", ++ /* 0x24996 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2499b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x6d", "\x00\x00", ++ /* 0x249a5 */ "\x00\x00", "\x8e\xf7", "\x00\x00", "\xfb\xb7", "\x00\x00", ++ /* 0x249ab */ "\x94\x7c", "\x92\xcd", "\x97\xb2", "\x00\x00", "\x00\x00", ++ /* 0x249af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249b4 */ "\x00\x00", "\x00\x00", "\xfe\x65", "\x96\x7e", "\x97\x58", ++ /* 0x249ba */ "\x9b\x77", "\x91\xcf", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249c3 */ "\x00\x00", "\x94\xa4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249cd */ "\x00\x00", "\x00\x00", "\x9c\xad", "\x00\x00", "\x00\x00", ++ /* 0x249d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249d7 */ "\x00\x00", "\x00\x00", "\x8b\xab", "\x00\x00", "\x00\x00", ++ /* 0x249dc */ "\x00\x00", "\x96\xd5", "\xfc\xb3", "\x00\x00", "\x00\x00", ++ /* 0x249e1 */ "\x00\x00", "\x93\xae", "\x00\x00", "\x97\x6d", "\x00\x00", ++ /* 0x249e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249ec */ "\x94\x46", "\x95\xf7", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249f6 */ "\x9c\x46", "\x95\x5b", "\x91\xd1", "\x94\xf4", "\x00\x00", ++ /* 0x249fb */ "\xfe\x67", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x249ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x92\xa5", ++ /* 0x24a0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xdf", "\x8c\xab", ++ /* 0x24a13 */ "\x00\x00", "\x9b\xc9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xed", "\xfd\xfa", ++ /* 0x24a23 */ "\xfc\xc8", "\xfe\x62", "\x91\xfc", "\xfe\x6b", "\xfd\xf9", ++ /* 0x24a28 */ "\xfc\xc7", "\x91\x4e", "\x9c\xb8", "\x00\x00", "\x00\x00", ++ /* 0x24a2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a36 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a3b */ "\x00\x00", "\x00\x00", "\x97\x67", "\x00\x00", "\x00\x00", ++ /* 0x24a40 */ "\x00\x00", "\x95\xee", "\x00\x00", "\x00\x00", "\x9b\xb2", ++ /* 0x24a45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x60", ++ /* 0x24a4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xa2", "\x98\x75", ++ /* 0x24a50 */ "\x97\xac", "\x91\xd3", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x7b", "\x00\x00", ++ /* 0x24a5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a63 */ "\x00\x00", "\x8e\xeb", "\x97\x6a", "\x96\x5e", "\x00\x00", ++ /* 0x24a68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xeb", "\x00\x00", ++ /* 0x24a72 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\xf9", ++ /* 0x24a78 */ "\x95\xf8", "\xfe\xa2", "\x8f\xe6", "\x00\x00", "\x00\x00", ++ /* 0x24a7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a8c */ "\xfe\x7e", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a90 */ "\x00\x00", "\x00\x00", "\x9d\xa4", "\x97\x68", "\x8e\xec", ++ /* 0x24a96 */ "\x94\xbd", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24a9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x5b", ++ /* 0x24aa5 */ "\x9c\xf6", "\xfa\xa7", "\x9b\xd9", "\x00\x00", "\x00\x00", ++ /* 0x24aa9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24aae */ "\x00\x00", "\x00\x00", "\xfa\x5d", "\x96\x56", "\x97\x62", ++ /* 0x24ab3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ab8 */ "\x00\x00", "\x94\xba", "\xa0\x4f", "\x92\xd8", "\x00\x00", ++ /* 0x24abd */ "\x00\x00", "\x00\x00", "\x9b\xcb", "\x00\x00", "\x00\x00", ++ /* 0x24ac2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xbb", ++ /* 0x24ac7 */ "\x00\x00", "\x00\x00", "\x9d\x5f", "\x00\x00", "\x00\x00", ++ /* 0x24acc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xcf", ++ /* 0x24ad1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ad6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24adb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x65", "\x00\x00", ++ /* 0x24ae0 */ "\x00\x00", "\x9f\x4c", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ae5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xd8", "\x00\x00", ++ /* 0x24aea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24aef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24af4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24af9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24afe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b03 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b08 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b0d */ "\x00\x00", "\x8d\x5b", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b62 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24b6c */ "\x00\x00", "\x9e\xbe", + + /* 0x24bf5 */ "\xfb\x6d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24bf9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14269,7 +14158,7 @@ static const char from_ucs4[][2] = + /* 0x24cb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24cbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24cc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24cc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24cc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xfc", "\x00\x00", + /* 0x24cca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24ccf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24cd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x73", +@@ -14282,6 +14171,9 @@ static const char from_ucs4[][2] = + /* 0x24cf7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24cfc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24d01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x74", ++ /* 0x24d06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24d0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24d10 */ "\x00\x00", "\x00\x00", "\xfe\xb7", + + /* 0x24db8 */ "\x8a\x4b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24dbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14309,375 +14201,529 @@ static const char from_ucs4[][2] = + /* 0x24e2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24e2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24e34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24e39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e39 */ "\x00\x00", "\x8a\xdc", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24e3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24e43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x24e48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24e4d */ "\x00\x00", "\x00\x00", "\x8b\x76", +- +- /* 0x24f0e */ "\xa0\xf8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xdf", "\x00\x00", +- /* 0x24f5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f62 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f80 */ "\x00\x00", "\xfe\xb5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f94 */ "\x00\x00", "\x00\x00", "\x96\xfb", "\x00\x00", "\x00\x00", +- /* 0x24f9a */ "\x9b\xfb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24f9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24fa3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24fa9 */ "\x9e\xce", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24fad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24fb2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24fb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24fbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x24fc2 */ "\x9e\x7b", +- +- /* 0x2509d */ "\xfe\xce", +- +- /* 0x25148 */ "\x9d\xfc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2514c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25151 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25156 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2515b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25160 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25165 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2516a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2516f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25174 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25179 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xcf", "\x8b\xa5", +- /* 0x2517e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25183 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25188 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2518d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25192 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25197 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2519c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251e3 */ "\x8a\xec", "\x00\x00", "\x00\x00", "\xfc\xe0", "\x94\xad", +- /* 0x251e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x251fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25200 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25205 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2520a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2520f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25214 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25219 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2521e */ "\x00\x00", "\xfe\xd5", "\x94\xac", ++ /* 0x24e4d */ "\x00\x00", "\x00\x00", "\x8b\x76", "\x00\x00", "\x00\x00", ++ /* 0x24e52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e61 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e75 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e89 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e8e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24e9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ea2 */ "\x00\x00", "\x00\x00", "\x9b\xce", "\x00\x00", "\x8a\x68", ++ /* 0x24ea7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24eac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24eb1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24eb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ebb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ec0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ec5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24eca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ecf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ed4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ed9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ede */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ee3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ee8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24eed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ef2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ef7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24efc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f0b */ "\x00\x00", "\x00\x00", "\xa0\xf8", "\x00\x00", "\x00\x00", ++ /* 0x24f10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f51 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f5c */ "\x98\xdf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xb5", "\x00\x00", ++ /* 0x24f83 */ "\x00\x00", "\x00\x00", "\x9b\xcf", "\x00\x00", "\x00\x00", ++ /* 0x24f88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24f92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xfb", ++ /* 0x24f97 */ "\x00\x00", "\x00\x00", "\x9b\xfb", "\x00\x00", "\x00\x00", ++ /* 0x24f9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fa1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fa6 */ "\x00\x00", "\x00\x00", "\x9e\xce", "\x00\x00", "\x00\x00", ++ /* 0x24fab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fb0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fb5 */ "\x00\x00", "\x00\x00", "\x8e\xe5", "\x00\x00", "\x00\x00", ++ /* 0x24fba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fbf */ "\x00\x00", "\x00\x00", "\x9e\x7b", "\x00\x00", "\x00\x00", ++ /* 0x24fc4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fc9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fd3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fdd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fe2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fe7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24fec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ff1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ff6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x24ffb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25000 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25005 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2500a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2500f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25014 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25019 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2501e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25023 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25028 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xd2", "\x00\x00", ++ /* 0x2502d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25032 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25037 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2503c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25041 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25046 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2504b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25050 */ "\x00\x00", "\x8a\xa5", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25055 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2505a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2505f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25064 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25069 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2506e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25073 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25078 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2507d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25082 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25087 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2508c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25091 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25096 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2509b */ "\x00\x00", "\xfe\xce", + +- /* 0x252c7 */ "\x8a\x6f", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252d5 */ "\x00\x00", "\x00\x00", "\x8b\xa9", "\x00\x00", "\x00\x00", +- /* 0x252da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x252fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25302 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25307 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2530c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xcb", +- /* 0x25311 */ "\x00\x00", "\xfc\xe7", ++ /* 0x2512b */ "\x8a\x45", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2512f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25134 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25139 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2513e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25143 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xfc", ++ /* 0x25148 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2514d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25152 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25157 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2515c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25161 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25166 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2516b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25170 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25175 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2517a */ "\x00\x00", "\x00\x00", "\xfe\xcf", "\x8b\xa5", "\x00\x00", ++ /* 0x2517f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25184 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25189 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2518e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25193 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25198 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2519d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251ca */ "\x00\x00", "\x00\x00", "\x8c\x4a", "\x00\x00", "\x00\x00", ++ /* 0x251cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xec", ++ /* 0x251e3 */ "\x00\x00", "\x00\x00", "\xfc\xe0", "\x94\xad", "\x00\x00", ++ /* 0x251e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x251fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25201 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25206 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2520b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25210 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25215 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2521a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25220 */ "\xfe\xd5", "\x94\xac", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25224 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25229 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2522e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25233 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25238 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2523d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25242 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25247 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2524c */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x5a", "\x00\x00", ++ /* 0x25251 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25256 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2525b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25260 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25265 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2526a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2526f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25274 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25279 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2527e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25283 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25288 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2528d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25292 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25297 */ "\x00\x00", "\x9b\xd6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2529c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252c4 */ "\x00\x00", "\x00\x00", "\x8a\x6f", "\x00\x00", "\x00\x00", ++ /* 0x252c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xa9", ++ /* 0x252d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x252fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25300 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25305 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2530a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\x5f", "\x00\x00", ++ /* 0x2530f */ "\x00\x00", "\x9d\xcb", "\x00\x00", "\xfc\xe7", + +- /* 0x25425 */ "\x93\xc8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25429 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2542f */ "\x91\xf0", "\x8f\xe0", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25433 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25438 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2543d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25442 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25447 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2544c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25451 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25456 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2545b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25460 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25465 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2546a */ "\x00\x00", "\x90\xed", "\x00\x00", "\x9b\xdc", ++ /* 0x25419 */ "\x9b\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2541d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25422 */ "\x00\x00", "\x00\x00", "\x93\xc8", "\x00\x00", "\x00\x00", ++ /* 0x25427 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2542c */ "\x00\x00", "\x00\x00", "\x91\xf0", "\x8f\xe0", "\x00\x00", ++ /* 0x25431 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25436 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2543b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25440 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25446 */ "\x9b\xdb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2544a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2544f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25454 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25459 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2545e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25463 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25468 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xed", "\x00\x00", ++ /* 0x2546e */ "\x9b\xdc", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25472 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25477 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2547c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25481 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25486 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2548b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25490 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25495 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x53", + +- /* 0x2555b */ "\x93\xc7", "\x92\x49", "\x96\xe1", "\x00\x00", "\x00\x00", +- /* 0x2555f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25565 */ "\x8f\xe1", "\x9b\xe5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25569 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2556e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25573 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25578 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2557d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xc0", "\x00\x00", +- /* 0x25582 */ "\x00\x00", "\x93\xc3", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25587 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2558c */ "\x00\x00", "\x00\x00", "\x93\xc5", "\x00\x00", "\x00\x00", +- /* 0x25591 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25596 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2559b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x79", +- /* 0x255b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255d2 */ "\x00\x00", "\x00\x00", "\x97\x7b", "\x00\x00", "\x00\x00", +- /* 0x255d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x7e", "\x00\x00", +- /* 0x255dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xe6", "\x00\x00", +- /* 0x255e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x255ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25604 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25609 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2560e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25613 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25618 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2561d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25622 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25627 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2562c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25631 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xb8", "\x00\x00", +- /* 0x25636 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2563b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25640 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25645 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2564a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2564f */ "\x00\x00", "\x92\x70", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25654 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25659 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2565e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25663 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25668 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2566d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25672 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25677 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2567c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25681 */ "\x00\x00", "\x95\xa8", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25686 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2568b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25690 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25695 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2569a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2569f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256f4 */ "\x00\x00", "\x98\xb9", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x256fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25703 */ "\x00\x00", "\x00\x00", "\x91\x40", "\x00\x00", "\x00\x00", +- /* 0x25708 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2570d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25712 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25717 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2571d */ "\xfc\xbe", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25721 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x57", "\x00\x00", +- /* 0x25726 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2572b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25730 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25735 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2573a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2573f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25744 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25749 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2574e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25753 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25758 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2575d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25762 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25767 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2576c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25772 */ "\xfa\xdf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25776 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2577b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25780 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25785 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2578a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2578f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25794 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25799 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2579e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257c7 */ "\x9b\xe6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257e0 */ "\x8e\x44", "\x9c\x4f", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x257fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25802 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25807 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2580c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25811 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25816 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2581b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25820 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25825 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2582a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2582f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25834 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25839 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2583e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25843 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25848 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2584d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25852 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xf4", +- /* 0x25857 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2585c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25861 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25866 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2586b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25870 */ "\x00\x00", "\x93\xdc", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25875 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2587a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2587f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25884 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25889 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2588e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25893 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25898 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2589d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258de */ "\x00\x00", "\x00\x00", "\x8e\x4a", "\x00\x00", "\x00\x00", +- /* 0x258e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x258fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25901 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25906 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2590b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25910 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25915 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2591a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2591f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25924 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25929 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2592e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25933 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25938 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2593d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25942 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25947 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2594c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25951 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xb9", +- /* 0x25956 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2595b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25960 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25965 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2596a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2596f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25974 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25979 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2597e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25983 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25988 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2598d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25992 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25997 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2599c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x259a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x259a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x259ac */ "\x8e\x4e", ++ /* 0x25531 */ "\xa0\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xfa", ++ /* 0x25535 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2553a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xe0", ++ /* 0x2553f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25544 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25549 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2554e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25553 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25558 */ "\x00\x00", "\x00\x00", "\x93\xc7", "\x92\x49", "\x96\xe1", ++ /* 0x2555e */ "\x9b\xe2", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xe4", ++ /* 0x25562 */ "\x00\x00", "\x00\x00", "\x8f\xe1", "\x9b\xe5", "\x00\x00", ++ /* 0x25567 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2556c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25571 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25576 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2557b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25581 */ "\x94\xc0", "\x00\x00", "\x00\x00", "\x93\xc3", "\x00\x00", ++ /* 0x25585 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2558a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xc5", ++ /* 0x2558f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25594 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25599 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2559e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255b7 */ "\x00\x00", "\x90\x79", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x7b", ++ /* 0x255d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255db */ "\x90\x7e", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255e0 */ "\xfe\xe6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x255fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25602 */ "\x00\x00", "\x00\x00", "\xfe\x46", "\x00\x00", "\x00\x00", ++ /* 0x25607 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2560c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25611 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25616 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2561b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25620 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25625 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2562a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2562f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25635 */ "\x9d\xb8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25639 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2563e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25643 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25648 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2564d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x70", "\x00\x00", ++ /* 0x25652 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25657 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2565c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25661 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25666 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2566b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25670 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25675 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2567a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2567f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xa8", "\x00\x00", ++ /* 0x25684 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25689 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2568e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25693 */ "\x00\x00", "\x8c\xb0", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25698 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2569d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xc8", ++ /* 0x256e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xb9", "\x00\x00", ++ /* 0x256f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x256fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25701 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x40", ++ /* 0x25706 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2570b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25710 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25715 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2571a */ "\x00\x00", "\x00\x00", "\xfc\xbe", "\x00\x00", "\x00\x00", ++ /* 0x2571f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25725 */ "\x91\x57", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25729 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2572e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25733 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25738 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xb2", ++ /* 0x2573d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25742 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25747 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2574c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25751 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25756 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2575b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25760 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25765 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2576a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2576f */ "\x00\x00", "\x00\x00", "\xfa\xdf", "\x00\x00", "\x00\x00", ++ /* 0x25774 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25779 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2577e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25783 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25788 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2578d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25792 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25797 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2579c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257c4 */ "\x00\x00", "\x00\x00", "\x9b\xe6", "\x00\x00", "\x00\x00", ++ /* 0x257c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257dd */ "\x00\x00", "\x96\x43", "\x8e\x44", "\x9c\x4f", "\x00\x00", ++ /* 0x257e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x257fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25800 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25805 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2580a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2580f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25814 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25819 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2581e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25823 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25828 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2582d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25832 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25837 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2583c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25841 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25846 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2584b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25850 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25855 */ "\x00\x00", "\xfe\xf4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2585a */ "\x00\x00", "\x00\x00", "\x9b\xe8", "\x00\x00", "\x00\x00", ++ /* 0x2585f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25864 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25869 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2586e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xdc", "\x00\x00", ++ /* 0x25873 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25878 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2587d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25882 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25887 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2588c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25891 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25896 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2589b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\x6f", ++ /* 0x258c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258dc */ "\x00\x00", "\x87\xa1", "\x00\x00", "\x00\x00", "\x8e\x4a", ++ /* 0x258e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x258ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xed", "\x00\x00", ++ /* 0x25904 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25909 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2590e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25913 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25918 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2591d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25922 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25927 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2592c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25931 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25936 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2593b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25940 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25946 */ "\x92\xf6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2594a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2594f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25954 */ "\x00\x00", "\x9d\xb9", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25959 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2595e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25963 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25968 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2596d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25972 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25977 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2597c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25981 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25986 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2598b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25990 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25995 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2599a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2599f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x259a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x259a9 */ "\x00\x00", "\x00\x00", "\x8e\x4e", "\x00\x00", "\x00\x00", ++ /* 0x259ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x259b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x259b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x259bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x259c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x259c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xcf", + +- /* 0x25a9c */ "\x94\xe5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25aa0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25aa5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25aaa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xf0", "\x00\x00", +- /* 0x25aaf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ab4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ab9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25abe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ac3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ac8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25acd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ad2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ad7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25adc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ae1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ae6 */ "\x00\x00", "\x00\x00", "\x95\x51", ++ /* 0x25a54 */ "\x87\x60", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a62 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a95 */ "\x9e\xc2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25a99 */ "\x00\x00", "\x00\x00", "\x94\xe5", "\x00\x00", "\x00\x00", ++ /* 0x25a9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25aa3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25aa8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25aae */ "\x9b\xf0", "\x94\xe4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ab2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ab7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25abc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ac1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ac6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25acb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ad0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ad5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ada */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25adf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ae4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x51", + + /* 0x25b74 */ "\x8b\xbb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25b78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25b7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25b82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25b87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25b87 */ "\x00\x00", "\x9b\xf1", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25b8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25b91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25b96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14695,8 +14741,8 @@ static const char from_ucs4[][2] = + /* 0x25bd2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25bd7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25bdc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25be1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25be6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25be1 */ "\x00\x00", "\x00\x00", "\x8f\x61", "\x00\x00", "\x00\x00", ++ /* 0x25be6 */ "\x00\x00", "\x9b\x64", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25beb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25bf0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25bf5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14707,7 +14753,7 @@ static const char from_ucs4[][2] = + /* 0x25c0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25c1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25c1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\xbe", "\x00\x00", + /* 0x25c22 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14730,10 +14776,10 @@ static const char from_ucs4[][2] = + /* 0x25c81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25c90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25c91 */ "\x8f\x73", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25c9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25c9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25c9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xaf", + /* 0x25ca4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25ca9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25cae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14758,79 +14804,118 @@ static const char from_ucs4[][2] = + /* 0x25d0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25d12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25d17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25d1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xd8", "\x00\x00", ++ /* 0x25d1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\x6a", "\x00\x00", + /* 0x25d21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25d26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25d2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x4c", + /* 0x25d30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25d35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25d3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25d3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x52", +- +- /* 0x25e0e */ "\x95\x54", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e62 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e81 */ "\x9d\xbb", "\x95\x43", "\x92\xfe", "\x00\x00", "\x00\x00", +- /* 0x25e85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25e9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ea3 */ "\x00\x00", "\x00\x00", "\x94\xf2", "\x00\x00", "\x00\x00", +- /* 0x25ea8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ead */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25eb2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25eb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xf1", +- /* 0x25ebc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ec1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ec6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ecb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ed0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ed5 */ "\x00\x00", "\xa0\xea", "\x9d\xd2", "\x00\x00", "\x00\x00", +- /* 0x25eda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25edf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ee4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ee9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25eee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ef3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25ef8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25efd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x25f48 */ "\x00\x00", "\x00\x00", "\x91\xf8", ++ /* 0x25d3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x52", "\x00\x00", ++ /* 0x25d44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d62 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\xcf", ++ /* 0x25d99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25d9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25da3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25da8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25db2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25db7 */ "\x00\x00", "\x87\xc0", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dc1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dc6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dcb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dd0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dd5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ddf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25de4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25de9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25df3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25df8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25dfd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e0c */ "\x00\x00", "\x95\x54", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e49 */ "\x8a\xd4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e61 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e75 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e7f */ "\x00\x00", "\x9d\xbb", "\x95\x43", "\x92\xfe", "\x00\x00", ++ /* 0x25e84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e89 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e8e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25e9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ea2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xf2", "\x00\x00", ++ /* 0x25ea7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25eac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25eb1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25eb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ebc */ "\x94\xf1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ec0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ec5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25eca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ecf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ed4 */ "\x00\x00", "\x00\x00", "\xa0\xea", "\x9d\xd2", "\x00\x00", ++ /* 0x25ed9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ede */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ee3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ee8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25eed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ef2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25ef7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25efc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xb1", ++ /* 0x25f1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x25f47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xf8", + + /* 0x25fe1 */ "\x94\x62", "\x9b\xa4", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x25fe5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14844,7 +14929,7 @@ static const char from_ucs4[][2] = + /* 0x2600d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26012 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26017 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2601c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2601c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x7d", + /* 0x26021 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26026 */ "\x00\x00", "\x00\x00", "\x8e\xad", "\x00\x00", "\x00\x00", + /* 0x2602b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14852,7 +14937,7 @@ static const char from_ucs4[][2] = + /* 0x26035 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2603a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2603f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26044 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26044 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xad", "\x00\x00", + /* 0x26049 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2604e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26053 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14864,11 +14949,11 @@ static const char from_ucs4[][2] = + /* 0x26071 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26076 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2607b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26080 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26080 */ "\x00\x00", "\x00\x00", "\xfe\xee", "\x00\x00", "\x00\x00", + /* 0x26085 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2608a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2608f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26094 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26094 */ "\x00\x00", "\x00\x00", "\x8a\xb4", "\x00\x00", "\x00\x00", + /* 0x26099 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2609e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x260a4 */ "\x97\x57", "\x8a\x77", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14889,7 +14974,7 @@ static const char from_ucs4[][2] = + /* 0x260ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x260f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x260f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x260fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x260fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xf7", + /* 0x26102 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26107 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2610c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14925,7 +15010,7 @@ static const char from_ucs4[][2] = + /* 0x261a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x261a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x261ad */ "\xa0\xf3", "\x94\xbe", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x261b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x261b2 */ "\x9b\xfa", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x261b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x261bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x261c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14961,8 +15046,8 @@ static const char from_ucs4[][2] = + /* 0x26256 */ "\x00\x00", "\x9d\xbc", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2625b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26261 */ "\x94\xfe", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26265 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2626a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26265 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xdb", ++ /* 0x2626b */ "\xa0\xfe", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2626f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26274 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26279 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -14982,8 +15067,32 @@ static const char from_ucs4[][2] = + /* 0x262bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x262c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x262c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x262ce */ "\x00\x00", "\x8e\xc0", +- ++ /* 0x262ce */ "\x00\x00", "\x8e\xc0", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x262fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26300 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26305 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2630a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2630f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26314 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26319 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2631e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26323 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26328 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2632d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26332 */ "\x00\x00", "\x00\x00", "\x9f\x47", "\x00\x00", "\x00\x00", ++ /* 0x26337 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2633c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26341 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26346 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xde", ++ /* 0x2634c */ "\xa0\xfb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26351 */ "\x8e\xc3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26355 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2635a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15016,10 +15125,10 @@ static const char from_ucs4[][2] = + /* 0x263e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x263e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x263eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x263f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x263f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x263f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xc2", ++ /* 0x263f5 */ "\x00\x00", "\x00\x00", "\x95\x4c", "\x00\x00", "\x00\x00", + /* 0x263fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x263ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x263ff */ "\x00\x00", "\x00\x00", "\x9b\xfd", "\x00\x00", "\x00\x00", + /* 0x26404 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26409 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2640e */ "\x00\x00", "\x90\xcc", "\x9c\x60", "\x95\x4b", "\x00\x00", +@@ -15033,21 +15142,21 @@ static const char from_ucs4[][2] = + /* 0x26436 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2643b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26440 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26445 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26445 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xfe", + /* 0x2644a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2644f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26454 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26459 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2645e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26463 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26468 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26469 */ "\x9c\x70", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2646d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26472 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26477 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2647c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26481 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26486 */ "\x00\x00", "\x00\x00", "\x8e\xcc", "\x00\x00", "\x00\x00", +- /* 0x2648b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26481 */ "\x00\x00", "\x00\x00", "\x9c\x43", "\x00\x00", "\x00\x00", ++ /* 0x26486 */ "\x00\x00", "\x9c\x47", "\x8e\xcc", "\x00\x00", "\x00\x00", ++ /* 0x2648b */ "\x00\x00", "\x8e\x54", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26490 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26495 */ "\x00\x00", "\x00\x00", "\x8e\xe4", "\x00\x00", "\x00\x00", + /* 0x2649a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15102,13 +15211,13 @@ static const char from_ucs4[][2] = + /* 0x2658f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26594 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26599 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2659e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2659e */ "\x00\x00", "\x95\x5e", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x265a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x265a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x5c", + /* 0x265ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x265b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x265b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x265bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x265bc */ "\x00\x00", "\x00\x00", "\x9c\x4b", "\x00\x00", "\x00\x00", + /* 0x265c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x265c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x265cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15125,33 +15234,33 @@ static const char from_ucs4[][2] = + /* 0x26602 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26607 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2660c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26611 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26612 */ "\x8b\xe1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26616 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2661b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26620 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26626 */ "\x8e\xd9", + + /* 0x266af */ "\x9d\xb4", "\x00\x00", "\x92\x5f", "\x00\x00", "\x00\x00", +- /* 0x266b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x266b3 */ "\x00\x00", "\x9c\x4c", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x266d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x266d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xa1", "\x00\x00", + /* 0x266db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266e5 */ "\x00\x00", "\x00\x00", "\x8e\xdb", "\x00\x00", "\x00\x00", + /* 0x266ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x266f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x266f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x266f9 */ "\x00\x00", "\x00\x00", "\x9c\x56", "\x00\x00", "\x00\x00", + /* 0x266fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26703 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26708 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2670d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26712 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26712 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xa2", "\x00\x00", + /* 0x26717 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2671c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26721 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15177,7 +15286,7 @@ static const char from_ucs4[][2] = + /* 0x26785 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2678a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2678f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26794 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26794 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x5e", + /* 0x26799 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2679e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x267a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15188,87 +15297,144 @@ static const char from_ucs4[][2] = + /* 0x267bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x267c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x267c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x267cc */ "\xa0\xc3", +- +- /* 0x2685e */ "\x9c\x61", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26862 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26867 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2686c */ "\x00\x00", "\x9c\x5f", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26871 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26876 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2687b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26880 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26885 */ "\x00\x00", "\x00\x00", "\xfc\x4d", "\x00\x00", "\x00\x00", +- /* 0x2688a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2688f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x69", "\x00\x00", +- /* 0x26894 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26899 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2689e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x268fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26902 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26907 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2690c */ "\x00\x00", "\xfe\xc7", "\x00\x00", "\x00\x00", "\xfe\xc6", +- +- /* 0x269a8 */ "\x91\x65", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xe7", "\x00\x00", +- /* 0x269b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x54", +- /* 0x269f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x269f7 */ "\x00\x00", "\x00\x00", "\x9c\x6c", "\x00\x00", "\x00\x00", +- /* 0x269fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x5d", +- /* 0x26a2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x6a", +- /* 0x26a42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26a4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x6d", +- /* 0x26a52 */ "\x8e\xf0", ++ /* 0x267cc */ "\xa0\xc3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x267fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26802 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26807 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2680c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26811 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26816 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2681c */ "\x8a\xe6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26820 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26825 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2682a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2682f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26834 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26839 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2683e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26843 */ "\x00\x00", "\x00\x00", "\xa0\xf7", "\x00\x00", "\x00\x00", ++ /* 0x26848 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2684d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26852 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26857 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2685c */ "\x00\x00", "\x9c\x61", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26861 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26866 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2686b */ "\x00\x00", "\x00\x00", "\x9c\x5f", "\x00\x00", "\x00\x00", ++ /* 0x26870 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26875 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2687a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2687f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26884 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x4d", "\x00\x00", ++ /* 0x2688a */ "\x9e\x5b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2688e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x69", ++ /* 0x26893 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26898 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2689d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268c5 */ "\x00\x00", "\x9c\x63", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x268fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26901 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26906 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2690b */ "\x00\x00", "\x00\x00", "\xfe\xc7", "\x00\x00", "\x00\x00", ++ /* 0x26911 */ "\xfe\xc6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26915 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2691a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2691f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26924 */ "\x00\x00", "\x9c\x67", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26929 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2692e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26933 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26939 */ "\x9c\x69", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2693d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26942 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26947 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2694c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xe2", ++ /* 0x26951 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26956 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2695b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26960 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26965 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2696a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2696f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26974 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26979 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2697e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26983 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26988 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2698d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26992 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26997 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2699c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269a6 */ "\x00\x00", "\x91\x65", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xe7", ++ /* 0x269b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269f2 */ "\x8a\x54", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x269f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x6c", "\x00\x00", ++ /* 0x269fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x6e", ++ /* 0x26a2e */ "\xfe\x5d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a32 */ "\x00\x00", "\x9c\x73", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a42 */ "\x95\x6a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26a51 */ "\x95\x6d", "\x8e\xf0", + ++ /* 0x26b05 */ "\x8f\x4d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b0a */ "\x8e\xf6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26b0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26b13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26b0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\xbc", ++ /* 0x26b13 */ "\x00\x00", "\x8c\xd5", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26b22 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26b23 */ "\x87\x5e", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b28 */ "\xfb\xda", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15279,27 +15445,27 @@ static const char from_ucs4[][2] = + /* 0x26b4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b50 */ "\x8b\x4c", "\xfd\x75", "\x9b\xdd", "\xfa\xf5", "\x00\x00", + /* 0x26b54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26b59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26b59 */ "\x00\x00", "\x9c\x74", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26b72 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26b72 */ "\x00\x00", "\x00\x00", "\x95\x45", "\x00\x00", "\x00\x00", + /* 0x26b77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26b81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26b82 */ "\x96\xc6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26b96 */ "\x8f\x6a", "\x8f\x4e", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26b9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26b9a */ "\x00\x00", "\x00\x00", "\x9c\x78", "\x00\x00", "\x00\x00", + /* 0x26b9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26ba4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26ba9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26bae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfa\x55", + /* 0x26bb3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26bb8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26bbd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26bbd */ "\x00\x00", "\x00\x00", "\x97\xe4", "\x00\x00", "\x00\x00", + /* 0x26bc2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26bc7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26bcc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15325,8 +15491,8 @@ static const char from_ucs4[][2] = + /* 0x26c30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26c35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26c3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26c3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26c44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26c40 */ "\x96\xfa", "\x8c\xf6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26c44 */ "\x00\x00", "\x8d\x4d", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26c49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26c4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26c53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15345,16 +15511,16 @@ static const char from_ucs4[][2] = + /* 0x26c94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26c99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26c9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26ca3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26ca4 */ "\x9c\x7a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26ca8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26cad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26cb2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xfb", + /* 0x26cb8 */ "\x90\xca", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26cbd */ "\x9c\x5b", "\x00\x00", "\x00\x00", "\x97\x4d", "\x00\x00", +- /* 0x26cc1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26cc1 */ "\x00\x00", "\x8e\xd3", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26cc6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26ccb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26cd0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26cd1 */ "\x95\x61", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26cd5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26cda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26cdf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15379,14 +15545,14 @@ static const char from_ucs4[][2] = + /* 0x26d3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26d4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26d4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\x41", "\x00\x00", + /* 0x26d52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d61 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d6b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26d70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26d70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xd3", "\x00\x00", + /* 0x26d75 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26d7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15398,7 +15564,7 @@ static const char from_ucs4[][2] = + /* 0x26d9d */ "\x00\x00", "\x00\x00", "\xfc\xfd", "\xfd\xab", "\x91\xbd", + /* 0x26da3 */ "\x8f\x4c", "\x96\xc9", "\x8f\x55", "\xfb\xae", "\x95\x6f", + /* 0x26da7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26dac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26dac */ "\x00\x00", "\x9c\x7d", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26db1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26db6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26dbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15414,11 +15580,11 @@ static const char from_ucs4[][2] = + /* 0x26ded */ "\x00\x00", "\x00\x00", "\x96\xcb", "\x00\x00", "\x00\x00", + /* 0x26df2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26df7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26dfc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26dfc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xce", "\x00\x00", + /* 0x26e01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\x56", "\x00\x00", +- /* 0x26e06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26e07 */ "\x9c\xe1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26e0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26e10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26e10 */ "\x00\x00", "\x96\xc4", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26e15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26e1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26e1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15441,11 +15607,11 @@ static const char from_ucs4[][2] = + /* 0x26e74 */ "\x00\x00", "\x00\x00", "\x8f\x6b", "\x00\x00", "\x00\x00", + /* 0x26e79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26e7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26e84 */ "\x96\xca", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26e88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26e84 */ "\x96\xca", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\xcd", ++ /* 0x26e88 */ "\x00\x00", "\x00\x00", "\x87\x53", "\x00\x00", "\x00\x00", + /* 0x26e8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26e92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26e97 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26e97 */ "\x00\x00", "\x8f\x79", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26e9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26ea1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26ea6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15503,7 +15669,7 @@ static const char from_ucs4[][2] = + /* 0x26faa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26faf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26fb4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x26fb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x26fb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xd6", + /* 0x26fbe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26fc3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x26fc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15532,7 +15698,7 @@ static const char from_ucs4[][2] = + /* 0x2703b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27040 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27045 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2704a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2704b */ "\x9c\xa3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2704f */ "\x00\x00", "\x00\x00", "\x92\x4b", "\x98\x4a", "\x00\x00", + /* 0x27054 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27059 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15544,7 +15710,7 @@ static const char from_ucs4[][2] = + /* 0x27077 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2707c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27081 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27086 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27086 */ "\x00\x00", "\x8f\xa4", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2708b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27090 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27095 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15559,7 +15725,7 @@ static const char from_ucs4[][2] = + /* 0x270c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x270c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x270cd */ "\x8f\xa7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x270d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x270d2 */ "\x87\x54", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x270d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x270db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x270e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15570,7 +15736,7 @@ static const char from_ucs4[][2] = + /* 0x270f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x270fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27103 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27109 */ "\x98\x45", "\x00\x00", "\x00\x00", "\x90\x46", "\x00\x00", ++ /* 0x27109 */ "\x98\x45", "\x00\x00", "\x00\x00", "\x90\x46", "\x8c\xd1", + /* 0x2710d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27112 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27117 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15591,209 +15757,509 @@ static const char from_ucs4[][2] = + /* 0x27162 */ "\x00\x00", "\x9f\x48", "\x92\x47", "\x00\x00", "\x00\x00", + /* 0x27167 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2716c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27171 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xfb", +- +- /* 0x2721b */ "\x95\x71", +- +- /* 0x272e6 */ "\x9c\xac", ++ /* 0x27171 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xfb", "\x00\x00", ++ /* 0x27176 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2717b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27180 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27185 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2718a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2718f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27194 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27199 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2719e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271cb */ "\x00\x00", "\x9c\xa4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x271fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27202 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27207 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2720c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27211 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27216 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x71", ++ /* 0x2721b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27220 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27225 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2722a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2722f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27234 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27239 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2723e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27243 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27248 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2724d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27252 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27257 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2725c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27261 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27267 */ "\x87\x45", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2726b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27270 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27275 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2727a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27280 */ "\x9c\xa6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27285 */ "\x9c\xa7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27289 */ "\x00\x00", "\x9c\xaa", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2728e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27293 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27298 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2729d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272b2 */ "\x9e\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x70", ++ /* 0x272b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272e3 */ "\x00\x00", "\x00\x00", "\x9c\xac", "\x00\x00", "\x00\x00", ++ /* 0x272e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x272fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27301 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27306 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2730b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27310 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27315 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2731a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2731f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27324 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27329 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2732e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27333 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27338 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2733d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27342 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27347 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2734c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27352 */ "\x87\x52", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27356 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2735b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27360 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27365 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2736a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2736f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27374 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27379 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2737e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27383 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27388 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2738d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27392 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27397 */ "\x00\x00", "\x00\x00", "\x8f\xae", "\x00\x00", "\x00\x00", ++ /* 0x2739c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x273fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\x50", "\x00\x00", ++ /* 0x27400 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27405 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2740a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2740f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27414 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27419 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2741e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\x7d", "\x00\x00", ++ /* 0x27423 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27428 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2742d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27432 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27437 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2743c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27441 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27446 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2744b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xb0", ++ /* 0x27450 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27455 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2745a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2745f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27464 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27469 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2746e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27473 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27478 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2747d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27482 */ "\x00\x00", "\x97\xb6", "\x00\x00", "\xa0\xbd", + +- /* 0x2739a */ "\x8f\xae", ++ /* 0x27574 */ "\x8a\xdf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27578 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2757d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27582 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27587 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2758c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27591 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27596 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2759b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275a0 */ "\x00\x00", "\x00\x00", "\x9e\xaa", "\x00\x00", "\x00\x00", ++ /* 0x275a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xbd", "\x00\x00", ++ /* 0x275e1 */ "\x00\x00", "\x00\x00", "\x8f\xbf", "\x00\x00", "\x00\x00", ++ /* 0x275e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x275fa */ "\x00\x00", "\x00\x00", "\x93\x69", "\x9b\xa7", "\x00\x00", ++ /* 0x275ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27604 */ "\x00\x00", "\x00\x00", "\xc8\xa4", "\x00\x00", "\x00\x00", ++ /* 0x27609 */ "\x00\x00", "\x00\x00", "\xfe\xea", "\x00\x00", "\x00\x00", ++ /* 0x2760e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27613 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27618 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2761d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27622 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27627 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2762c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27632 */ "\x9b\xe1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27636 */ "\x00\x00", "\x00\x00", "\x8b\x41", "\x00\x00", "\x00\x00", ++ /* 0x2763b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27640 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27645 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2764a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2764f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27655 */ "\x9d\xb6", "\xa0\xeb", "\x9b\xa3", "\x00\x00", "\x00\x00", ++ /* 0x27659 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2765e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27663 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27668 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2766d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27672 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27677 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2767c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27681 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27686 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2768b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27690 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xa1", "\x00\x00", ++ /* 0x27695 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2769a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2769f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x276fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27703 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27708 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2770d */ "\x00\x00", "\x8f\xc8", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27712 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27717 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2771c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27721 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27726 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2772b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27730 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x89\x4c", ++ /* 0x27736 */ "\x98\x60", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2773a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2773f */ "\x00\x00", "\x94\xc7", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27744 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27749 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2774e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27753 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27758 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2775e */ "\x8b\x58", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27762 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27767 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2776c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27771 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27776 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2777b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27780 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xab", "\x95\xaa", ++ /* 0x27785 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2778a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2778f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27794 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27799 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2779e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x277cc */ "\x9c\xc3", + +- /* 0x27422 */ "\x95\x7d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27426 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2742b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27430 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27435 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2743a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2743f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27444 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27449 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2744e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27453 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27458 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2745d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27462 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27467 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2746c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27471 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27476 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2747b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27480 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xb6", "\x00\x00", +- /* 0x27486 */ "\xa0\xbd", +- +- /* 0x275e0 */ "\x8f\xbd", "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xbf", +- /* 0x275e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x275e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x275ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x275f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x275f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\x69", +- /* 0x275fe */ "\x9b\xa7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27602 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27607 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xea", +- /* 0x2760c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27611 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27616 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2761b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27620 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27625 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2762a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2762f */ "\x00\x00", "\x00\x00", "\x9b\xe1", "\x00\x00", "\x00\x00", +- /* 0x27634 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\x41", +- /* 0x27639 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2763e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27643 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27648 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2764d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27652 */ "\x00\x00", "\x00\x00", "\x9d\xb6", "\xa0\xeb", "\x9b\xa3", +- /* 0x27657 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2765c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27661 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27666 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2766b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27670 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27675 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2767a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2767f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27684 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27689 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2768e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27694 */ "\x8b\xa1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27698 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2769d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x276fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27701 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27706 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2770b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xc8", "\x00\x00", +- /* 0x27710 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27715 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2771a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2771f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27724 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27729 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2772e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27733 */ "\x00\x00", "\x89\x4c", "\x98\x60", "\x00\x00", "\x00\x00", +- /* 0x27738 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2773d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x94\xc7", "\x00\x00", +- /* 0x27742 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27747 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2774c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27751 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27756 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2775b */ "\x00\x00", "\x00\x00", "\x8b\x58", "\x00\x00", "\x00\x00", +- /* 0x27760 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27765 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2776a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2776f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27774 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27779 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2777e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27784 */ "\x95\xab", "\x95\xaa", +- +- /* 0x27870 */ "\x93\xd6", +- +- /* 0x27924 */ "\x8f\xd1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27928 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2792d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27932 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27937 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2793c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27941 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27946 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2794b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27950 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27955 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2795a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2795f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27964 */ "\x00\x00", "\x00\x00", "\x99\xd5", +- +- /* 0x27a0e */ "\xfb\xc8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a59 */ "\x8f\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a62 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27a9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27aa3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27aa8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27aad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ab2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ab7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27abd */ "\x8f\xd2", "\x90\x64", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ac1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ac6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27acb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ad0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ad5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ada */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27adf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ae4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27ae9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27aee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27af4 */ "\x98\xb6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27af8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27afd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b16 */ "\x00\x00", "\x98\xbd", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27b34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xdc", "\xfe\xf6", +- /* 0x27b3a */ "\x8f\xd9", ++ /* 0x27858 */ "\x9c\xc4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2785c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27861 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27866 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2786b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xd6", ++ /* 0x27870 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27875 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2787a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2787f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27884 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27889 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2788e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27893 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27898 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xac", ++ /* 0x2789d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278b2 */ "\x8b\xe6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278c5 */ "\x00\x00", "\x00\x00", "\x8a\x71", "\x00\x00", "\x00\x00", ++ /* 0x278ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x278fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27901 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27906 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2790b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27910 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27915 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2791a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2791f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xd1", ++ /* 0x27924 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27929 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2792e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27933 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27938 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2793d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27942 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27947 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2794c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27951 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27956 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2795b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27960 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27965 */ "\x00\x00", "\x99\xd5", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2796a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2796f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27974 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2797a */ "\x90\xf4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2797e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27983 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27988 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2798d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27992 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27997 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2799c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xa3", "\x00\x00", ++ /* 0x279a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xce", ++ /* 0x279dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x279fb */ "\x00\x00", "\x9c\xd4", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xd5", ++ /* 0x27a0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\xc8", "\x00\x00", ++ /* 0x27a0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a3c */ "\x00\x00", "\x9d\xb3", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a50 */ "\x00\x00", "\x00\x00", "\xfc\x70", "\x00\x00", "\x00\x00", ++ /* 0x27a55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xd7", "\x00\x00", ++ /* 0x27a5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a79 */ "\x9b\x73", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a82 */ "\x00\x00", "\xfa\x5b", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27a9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27aa0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27aa5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27aaa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27aaf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ab4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ab9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xd2", "\x90\x64", ++ /* 0x27abe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ac3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ac8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27acd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ad2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ad7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27adc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ae1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ae6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27aeb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27af0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xb6", "\x00\x00", ++ /* 0x27af5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27afa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27aff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b04 */ "\x00\x00", "\x96\x68", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b09 */ "\x00\x00", "\x9c\xd6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xbd", ++ /* 0x27b18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b22 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b36 */ "\x00\x00", "\x8f\xdc", "\xfe\xf6", "\x8f\xd9", "\x00\x00", ++ /* 0x27b3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b45 */ "\x00\x00", "\x00\x00", "\x95\x41", "\x00\x00", "\x00\x00", ++ /* 0x27b4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27b63 */ "\x00\x00", "\x87\xca", + ++ /* 0x27bef */ "\x87\x6c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27bf4 */ "\x97\xf3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27bf8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27bfd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27c02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27c07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27c0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27c12 */ "\x9b\xf8", +- ++ /* 0x27c12 */ "\x9b\xf8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c1b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c20 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c2a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c2f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c39 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c3e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c43 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c48 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c4d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c52 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c57 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c5c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c61 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c66 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c6c */ "\x87\x5a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c70 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c75 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c7a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c7f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c84 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c89 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c8e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c93 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c98 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27c9d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ca2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ca7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x48", ++ /* 0x27cb1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cb6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x4a", ++ /* 0x27cc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ccf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cd9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cde */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ce3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ce8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ced */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cf2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cf7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27cfc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d15 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d24 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d2f */ "\x9e\x6c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d33 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15805,13 +16271,13 @@ static const char from_ucs4[][2] = + /* 0x27d56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27d65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d66 */ "\x9c\xd7", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\x6e", "\x00\x00", + /* 0x27d74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x27d83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27d84 */ "\x8a\x40", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d8d */ "\x00\x00", "\x8f\xef", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27d92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15853,121 +16319,191 @@ static const char from_ucs4[][2] = + /* 0x27e46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x27e4b */ "\x00\x00", "\x98\x6a", "\x00\x00", "\x97\xcf", + +- /* 0x28002 */ "\x90\x41", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28006 */ "\x00\x00", "\x00\x00", "\x9c\xdb", ++ /* 0x27f2e */ "\x9e\xe5", + +- /* 0x280bd */ "\x8b\x62", "\x8a\x4e", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x66", +- /* 0x280e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280f4 */ "\x9c\xfb", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x280fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28102 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28107 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2810c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28111 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28116 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2811b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28120 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28125 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2812a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xfc", "\x00\x00", +- /* 0x2812f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28134 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28139 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2813e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28143 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28148 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2814d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28152 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28157 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2815c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28161 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28166 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2816b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xe5", +- +- /* 0x28207 */ "\x8b\x73", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2820b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28210 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28215 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2821a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2821f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28224 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28229 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2822e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28233 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28238 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2823d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28242 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28247 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2824c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28251 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x61", +- /* 0x28256 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2825b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28260 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28265 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2826a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2826f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28274 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28279 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2827e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28283 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28288 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2828d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28292 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28297 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2829c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xa2", "\x00\x00", +- /* 0x282ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xf2", +- /* 0x282e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x282fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28300 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28305 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2830a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2830f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28314 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28319 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2831e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28323 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28328 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2832d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28332 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28337 */ "\x00\x00", "\x00\x00", "\x8e\xca", "\x00\x00", "\x00\x00", +- /* 0x2833c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28341 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28346 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2834b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28350 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28355 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2835a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2835f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28365 */ "\x90\x4e", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28369 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2836e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28373 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28378 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9f\xf5", ++ /* 0x27ff9 */ "\x9e\x7c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x27ffd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x41", ++ /* 0x28002 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28007 */ "\x00\x00", "\x9c\xdb", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2800c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28011 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28016 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2801b */ "\x00\x00", "\x00\x00", "\x94\x41", "\x00\x00", "\x00\x00", ++ /* 0x28020 */ "\x00\x00", "\x00\x00", "\x9c\xe6", "\x9d\xb0", "\x00\x00", ++ /* 0x28025 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2802a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2802f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28034 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28039 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2803e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28043 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xea", ++ /* 0x28048 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2804d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28052 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28057 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2805c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28061 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28066 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2806b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28070 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28075 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2807a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2807f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xed", "\x00\x00", ++ /* 0x28084 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28089 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2808e */ "\x00\x00", "\x9c\xfa", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28093 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28098 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2809d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280bb */ "\x00\x00", "\x8b\x62", "\x8a\x4e", "\x00\x00", "\x00\x00", ++ /* 0x280c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xca", ++ /* 0x280e9 */ "\x8a\x66", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280f2 */ "\x00\x00", "\x9c\xfb", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x280fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28101 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28106 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2810b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28110 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28115 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2811a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2811f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28124 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28129 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xfc", ++ /* 0x2812e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28133 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28138 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2813d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28142 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28147 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2814c */ "\x00\x00", "\x00\x00", "\x9c\xfe", "\x00\x00", "\x00\x00", ++ /* 0x28151 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28156 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2815b */ "\x00\x00", "\x8a\x53", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28160 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28165 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2816a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xe5", ++ /* 0x2816f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28174 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28179 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2817e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28183 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28189 */ "\x9d\x40", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2818d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28192 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28197 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2819c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x41", "\x00\x00", ++ /* 0x281b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281ba */ "\x00\x00", "\x90\x45", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x281fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28200 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28205 */ "\x00\x00", "\x8b\x73", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2820a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2820f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28214 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xca", "\x00\x00", ++ /* 0x2821a */ "\x9d\x42", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2821e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28223 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28228 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2822d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28232 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28237 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2823c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28241 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28246 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2824b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28250 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28256 */ "\x8a\x61", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2825a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2825f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28264 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28269 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2826e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28273 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28278 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xae", "\x00\x00", ++ /* 0x2827d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28282 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28287 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2828c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28291 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28296 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xd2", ++ /* 0x2829b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xa2", ++ /* 0x282cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282e2 */ "\x9d\xf2", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x282ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28304 */ "\x00\x00", "\x9d\x43", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28309 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2830e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28313 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xdf", ++ /* 0x28318 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2831d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28322 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28327 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2832c */ "\x00\x00", "\x00\x00", "\x9d\x44", "\x00\x00", "\x00\x00", ++ /* 0x28331 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28336 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xca", "\x00\x00", ++ /* 0x2833b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28340 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28345 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2834a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2834f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28354 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28359 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2835e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28363 */ "\x00\x00", "\x90\x4e", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28368 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xb3", ++ /* 0x2836d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28372 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28377 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2837d */ "\x9f\xf5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28381 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28386 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x45", + + /* 0x28412 */ "\x90\x4f", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x28416 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -15986,73 +16522,143 @@ static const char from_ucs4[][2] = + /* 0x28457 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2845c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x28461 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28466 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2846b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28470 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28466 */ "\x00\x00", "\x9d\x47", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2846c */ "\x89\xca", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28470 */ "\x00\x00", "\x00\x00", "\x9c\xb5", "\x00\x00", "\x00\x00", + /* 0x28475 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2847a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2847f */ "\x00\x00", "\x00\x00", "\xfb\xfe", +- +- /* 0x2853c */ "\x90\x63", "\x90\x57", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28540 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28545 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2854a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2854f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28554 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28559 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2855e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28563 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28568 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x66", +- +- /* 0x285f4 */ "\xfc\xe5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x285f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x285fd */ "\x00\x00", "\x00\x00", "\x91\x62", "\x00\x00", "\x00\x00", +- /* 0x28602 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28607 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x67", "\x00\x00", +- /* 0x2860c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28611 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28616 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2861b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28620 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xa1", +- /* 0x28625 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2862a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2862f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28634 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28639 */ "\x00\x00", "\x8f\xa2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2863e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28643 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28648 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2864d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28652 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28657 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2865c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28661 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28666 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2866b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28670 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28675 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2867a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2867f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28684 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28689 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2868e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28693 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28698 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2869d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286a7 */ "\x00\x00", "\x00\x00", "\x9d\x48", "\xfa\xd3", "\x00\x00", +- /* 0x286ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xb9", "\x00\x00", +- /* 0x286d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x286e3 */ "\x00\x00", "\x00\x00", "\x90\x6b", ++ /* 0x2847f */ "\x00\x00", "\x00\x00", "\xfb\xfe", "\x00\x00", "\x00\x00", ++ /* 0x28484 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28489 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2848e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28493 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28498 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2849d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x284fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x5e", ++ /* 0x28501 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28506 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2850b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28510 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28515 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2851a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2851f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28524 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28529 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2852e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28533 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28538 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x63", "\x90\x57", ++ /* 0x2853d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28542 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28547 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2854c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28551 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28556 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2855b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28560 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28565 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2856a */ "\x00\x00", "\x90\x66", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2856f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28574 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28579 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2857e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28583 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28588 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2858d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28592 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28597 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2859c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285e8 */ "\x9b\xc0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285f1 */ "\x00\x00", "\x00\x00", "\xfc\xe5", "\x00\x00", "\x00\x00", ++ /* 0x285f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x285fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x62", ++ /* 0x28600 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28605 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2860b */ "\x90\x67", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2860f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28614 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28619 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2861e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28623 */ "\x00\x00", "\x8f\xa1", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28628 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2862d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28632 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28637 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xa2", "\x00\x00", ++ /* 0x2863c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28641 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28646 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2864b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28650 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28655 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2865a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2865f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28664 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28669 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2866e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28673 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28678 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2867d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28682 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28687 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2868c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28691 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28696 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2869b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x48", ++ /* 0x286ab */ "\xfa\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286af */ "\x00\x00", "\x00\x00", "\x8d\x4f", "\x00\x00", "\x00\x00", ++ /* 0x286b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286b9 */ "\x00\x00", "\x00\x00", "\x90\x5d", "\x00\x00", "\x00\x00", ++ /* 0x286be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286d8 */ "\x90\xb9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x6b", ++ /* 0x286e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x286ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28704 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28709 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2870f */ "\x8c\x5c", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x69", + + /* 0x28804 */ "\xfe\x57", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x28808 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -16063,574 +16669,941 @@ static const char from_ucs4[][2] = + /* 0x28821 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x28826 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x55", + +- /* 0x28933 */ "\x90\x73", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28937 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2893c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28941 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28946 */ "\x00\x00", "\x9b\xef", "\x9c\xf0", "\x00\x00", "\x00\x00", +- /* 0x2894b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28950 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28955 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2895a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2895f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28964 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28969 */ "\x00\x00", "\x00\x00", "\x91\xe0", "\x00\x00", "\x00\x00", +- /* 0x2896e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28973 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28978 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2897e */ "\x91\xd8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28982 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28987 */ "\x00\x00", "\x96\x46", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2898c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28991 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28996 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2899b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289a5 */ "\x00\x00", "\x00\x00", "\x93\x60", "\x00\x00", "\xfa\x53", +- /* 0x289ab */ "\x9c\xd3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289b9 */ "\x00\x00", "\x00\x00", "\xfb\x40", "\x00\x00", "\x00\x00", +- /* 0x289be */ "\x00\x00", "\x8d\xe2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x94\x42", +- /* 0x289dc */ "\x00\x00", "\x90\x56", "\x00\x00", "\x00\x00", "\x98\x65", +- /* 0x289e1 */ "\x00\x00", "\x00\x00", "\xfa\x4a", "\x00\x00", "\x00\x00", +- /* 0x289e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xaf", "\x97\x5a", +- /* 0x289fb */ "\x93\x49", "\x97\x47", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x289ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a0f */ "\xa0\xf4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a13 */ "\x00\x00", "\x00\x00", "\x97\x78", "\x00\x00", "\x00\x00", +- /* 0x28a18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a22 */ "\x00\x00", "\x00\x00", "\x8f\xcf", "\x00\x00", "\x00\x00", +- /* 0x28a27 */ "\x00\x00", "\xfc\x60", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a36 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xdc", "\x96\x61", +- /* 0x28a46 */ "\x92\xec", "\x93\x5d", "\x8e\xde", "\x96\xfe", "\xfd\x4f", +- /* 0x28a4b */ "\x95\xde", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x98\xb0", +- /* 0x28a5a */ "\xa0\x40", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a72 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xbd", +- /* 0x28a82 */ "\x97\x7d", "\x97\xf5", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xac", +- /* 0x28a9b */ "\xfa\xda", "\x92\xc2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28a9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28aa4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28aa9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28aae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ab3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ab8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28abd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ac2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x7b", "\x00\x00", +- /* 0x28ac7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xfe", "\x94\x7b", +- /* 0x28acc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ad1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ad6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28adb */ "\x00\x00", "\x00\x00", "\xfa\xbe", "\xfd\x43", "\x90\xc6", +- /* 0x28ae1 */ "\x90\xa4", "\x90\xa8", "\x94\xa9", "\x00\x00", "\x90\xa9", +- /* 0x28ae5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28aea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28aef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28af4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28af9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28afe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b03 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b08 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x7d", "\x00\x00", +- /* 0x28b0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfd\xba", +- /* 0x28b22 */ "\x93\xc4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xed", +- /* 0x28b2c */ "\x9d\xab", "\xa0\xe3", "\x00\x00", "\x96\x48", "\x00\x00", +- /* 0x28b30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b49 */ "\x00\x00", "\x00\x00", "\x8a\xa9", "\x00\x00", "\x9b\xc5", +- /* 0x28b4e */ "\x00\x00", "\x96\x5d", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b63 */ "\x97\x5f", "\x96\x5f", "\x96\x6e", "\xfb\x5d", "\x00\x00", +- /* 0x28b67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xb1", +- /* 0x28b6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xa3", +- /* 0x28b8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28b94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\xb2", +- /* 0x28b99 */ "\x00\x00", "\x00\x00", "\x95\xae", "\xfc\xa3", "\x00\x00", +- /* 0x28b9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ba3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ba8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bb2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bbc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bc2 */ "\xa0\xa2", "\x00\x00", "\x00\x00", "\x96\x55", "\x00\x00", +- /* 0x28bc6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bcb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bd0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bd5 */ "\x00\x00", "\x93\x41", "\x00\x00", "\x95\xad", "\x91\xd5", +- /* 0x28bda */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bdf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28be4 */ "\x00\x00", "\x00\x00", "\x97\x7a", "\xfd\xfc", "\x8e\x47", +- /* 0x28bea */ "\x93\xfd", "\x90\xa5", "\x90\xac", "\x00\x00", "\x00\x00", +- /* 0x28bee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bf3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bf8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28bfd */ "\x00\x00", "\x90\xae", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c02 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c07 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c0c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c11 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c16 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c1b */ "\x00\x00", "\x95\xe2", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c20 */ "\x00\x00", "\x00\x00", "\x94\x66", "\x00\x00", "\x00\x00", +- /* 0x28c25 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c2b */ "\x91\xb8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c30 */ "\x9c\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28c34 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xad", ++ /* 0x2890d */ "\x87\xa6", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28911 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28916 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2891b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28920 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28925 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2892a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2892f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x73", "\x00\x00", ++ /* 0x28934 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28939 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2893e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28943 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9b\xef", ++ /* 0x28949 */ "\x9c\xf0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2894d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28952 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x4b", "\x00\x00", ++ /* 0x28957 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2895c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28961 */ "\x00\x00", "\x00\x00", "\xfe\xd9", "\x00\x00", "\x00\x00", ++ /* 0x28966 */ "\x00\x00", "\xfe\xda", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2896c */ "\x91\xe0", "\x8d\x43", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28970 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28975 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2897a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xd8", "\x00\x00", ++ /* 0x2897f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28984 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\x46", ++ /* 0x28989 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2898e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28993 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28998 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2899d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289a8 */ "\x93\x60", "\x00\x00", "\xfa\x53", "\x9c\xd3", "\x00\x00", ++ /* 0x289ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289b6 */ "\x00\x00", "\x9d\x4e", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289bc */ "\xfb\x40", "\x00\x00", "\x00\x00", "\x00\x00", "\x8d\xe2", ++ /* 0x289c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289d9 */ "\x00\x00", "\x00\x00", "\x94\x42", "\x00\x00", "\x90\x56", ++ /* 0x289de */ "\x00\x00", "\x00\x00", "\x98\x65", "\x00\x00", "\x8c\x6c", ++ /* 0x289e4 */ "\xfa\x4a", "\x00\x00", "\x00\x00", "\x9d\x50", "\x9d\x52", ++ /* 0x289e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x289f7 */ "\x00\x00", "\x95\xaf", "\x97\x5a", "\x93\x49", "\x97\x47", ++ /* 0x289fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a01 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a06 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a0b */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xf4", "\x00\x00", ++ /* 0x28a10 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a16 */ "\x97\x78", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a1a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a1f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a25 */ "\x8f\xcf", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x60", ++ /* 0x28a29 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a2e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\x4e", "\x00\x00", ++ /* 0x28a33 */ "\x00\x00", "\x00\x00", "\xfc\x56", "\x00\x00", "\x00\x00", ++ /* 0x28a38 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a3d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a42 */ "\x00\x00", "\x91\xdc", "\x96\x61", "\x92\xec", "\x93\x5d", ++ /* 0x28a48 */ "\x8e\xde", "\x96\xfe", "\xfd\x4f", "\x95\xde", "\x00\x00", ++ /* 0x28a4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a51 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a56 */ "\x00\x00", "\x00\x00", "\x98\xb0", "\xa0\x40", "\x00\x00", ++ /* 0x28a5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a79 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a7e */ "\x00\x00", "\x00\x00", "\x97\xbd", "\x97\x7d", "\x97\xf5", ++ /* 0x28a83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28a97 */ "\x00\x00", "\x00\x00", "\x9b\xac", "\xfa\xda", "\x92\xc2", ++ /* 0x28a9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28aa1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28aa6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28aab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ab0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ab5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28aba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ac0 */ "\x97\xb1", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ac4 */ "\x00\x00", "\x90\x7b", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ac9 */ "\x00\x00", "\x93\xfe", "\x94\x7b", "\x00\x00", "\x97\x77", ++ /* 0x28ace */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ad3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ad8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ade */ "\xfa\xbe", "\xfd\x43", "\x90\xc6", "\x90\xa4", "\x90\xa8", ++ /* 0x28ae3 */ "\x94\xa9", "\x00\x00", "\x90\xa9", "\x00\x00", "\x00\x00", ++ /* 0x28ae7 */ "\x00\x00", "\x00\x00", "\x8c\x65", "\x00\x00", "\x00\x00", ++ /* 0x28aec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28af1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28af6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28afc */ "\x95\xe0", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b0a */ "\x00\x00", "\x90\x7d", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x92\x65", "\x00\x00", ++ /* 0x28b14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b1e */ "\x00\x00", "\x00\x00", "\xfd\xba", "\x93\xc4", "\x00\x00", ++ /* 0x28b23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b28 */ "\x00\x00", "\x00\x00", "\xfe\xed", "\x9d\xab", "\xa0\xe3", ++ /* 0x28b2d */ "\x00\x00", "\x96\x48", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x53", ++ /* 0x28b46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b4c */ "\x8a\xa9", "\x00\x00", "\x9b\xc5", "\x00\x00", "\x96\x5d", ++ /* 0x28b50 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\x5f", "\x96\x5f", ++ /* 0x28b65 */ "\x96\x6e", "\xfb\x5d", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b69 */ "\x00\x00", "\x00\x00", "\x9d\xb1", "\x00\x00", "\x00\x00", ++ /* 0x28b6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b8c */ "\x00\x00", "\x00\x00", "\xfe\xa3", "\x00\x00", "\x00\x00", ++ /* 0x28b91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28b96 */ "\x00\x00", "\x00\x00", "\x9d\xb2", "\x00\x00", "\x00\x00", ++ /* 0x28b9c */ "\x95\xae", "\xfc\xa3", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ba0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ba5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28baa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28baf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28bb4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x69", ++ /* 0x28bb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28bbe */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xa2", "\x00\x00", ++ /* 0x28bc3 */ "\x00\x00", "\x96\x55", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28bc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28bcd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28bd2 */ "\x00\x00", "\x9d\x54", "\x00\x00", "\x00\x00", "\x93\x41", ++ /* 0x28bd7 */ "\x00\x00", "\x95\xad", "\x91\xd5", "\x00\x00", "\x00\x00", ++ /* 0x28bdc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28be1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28be7 */ "\x97\x7a", "\xfd\xfc", "\x8e\x47", "\x93\xfd", "\x90\xa5", ++ /* 0x28bec */ "\x90\xac", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28bf0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xac", ++ /* 0x28bf5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28bfa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xae", ++ /* 0x28bff */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xa5", "\x00\x00", ++ /* 0x28c04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x56", ++ /* 0x28c09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28c0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28c13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28c18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xe3", "\x95\xe2", ++ /* 0x28c1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28c23 */ "\x94\x66", "\x00\x00", "\x00\x00", "\x96\x47", "\x00\x00", ++ /* 0x28c27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xb8", "\x00\x00", ++ /* 0x28c2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xec", "\x00\x00", ++ /* 0x28c31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28c36 */ "\x00\x00", "\x00\x00", "\x90\xad", "\x00\x00", "\x95\xe3", + +- /* 0x28ccd */ "\x8a\xe3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cd1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cd6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cdb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ce0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ce5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cf4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cf9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28cfe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d03 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d08 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28d30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xea", ++ /* 0x28cca */ "\x8b\x4f", "\x00\x00", "\x00\x00", "\x8a\xe3", "\x00\x00", ++ /* 0x28cce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\x4d", "\x00\x00", ++ /* 0x28cd3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28cd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28cdd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ce2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ce7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28cec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28cf1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28cf6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28cfb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d05 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d32 */ "\x00\x00", "\x95\xea", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d50 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28d96 */ "\x00\x00", "\x00\x00", "\x8b\x4e", "\x00\x00", "\x00\x00", ++ /* 0x28d9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28da0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28da5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28daa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28daf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28db4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xc1", ++ /* 0x28db9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dbe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dc3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dc8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dcd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dd2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dd7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ddc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28de1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28de6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28deb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28df0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28df5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dfa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28dff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e0f */ "\x8b\xed", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e22 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xd9", ++ /* 0x28e36 */ "\x00\x00", "\x00\x00", "\xa0\xa4", "\x00\x00", "\x00\x00", ++ /* 0x28e3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e63 */ "\x00\x00", "\x95\xf5", "\x95\xf4", "\x00\x00", "\x00\x00", ++ /* 0x28e68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e72 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e95 */ "\x00\x00", "\x9f\xb3", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28e9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ea4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ea9 */ "\x00\x00", "\x00\x00", "\xfe\xaf", "\x00\x00", "\x00\x00", ++ /* 0x28eae */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x72", "\x92\x7a", ++ /* 0x28eb3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28eb8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ebd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ec2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ec7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ecc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ed1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ed6 */ "\x00\x00", "\x00\x00", "\xfe\xac", "\x00\x00", "\x00\x00", ++ /* 0x28edb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ee0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x28ee5 */ "\x00\x00", "\x95\xf3", + +- /* 0x28e36 */ "\x91\xd9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e4e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e53 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e58 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e5d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e62 */ "\x00\x00", "\x00\x00", "\x95\xf5", "\x95\xf4", "\x00\x00", +- /* 0x28e67 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e6c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e71 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e76 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e7b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e80 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e85 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e8a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e8f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e94 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e99 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28e9e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ea3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ea8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ead */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\x72", +- /* 0x28eb3 */ "\x92\x7a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28eb7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ebc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ec1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ec6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ecb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ed0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x28ed5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xac", ++ /* 0x28fc5 */ "\x9d\x58", + +- /* 0x2908b */ "\x91\xc5", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2908f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29094 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29099 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2909e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290ad */ "\x00\x00", "\x90\xcd", "\x95\xfe", "\x91\x59", "\x00\x00", +- /* 0x290b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x97\xcc", +- /* 0x290e5 */ "\x90\xce", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x290fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29102 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29107 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2910d */ "\xfe\xfd", "\x00\x00", "\x00\x00", "\x9d\x5b", ++ /* 0x29079 */ "\x8d\x46", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2907d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29082 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29088 */ "\x93\x72", "\x00\x00", "\x00\x00", "\x91\xc5", "\x00\x00", ++ /* 0x2908c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29091 */ "\x00\x00", "\x96\x42", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29096 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2909b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xcd", ++ /* 0x290b0 */ "\x95\xfe", "\x91\x59", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290be */ "\x00\x00", "\x9c\x65", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290e1 */ "\x00\x00", "\x00\x00", "\x97\xcc", "\x90\xce", "\x00\x00", ++ /* 0x290e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290ec */ "\x9d\x59", "\xfc\xf5", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x290ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29104 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29109 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfe\xfd", "\x00\x00", ++ /* 0x2910e */ "\x00\x00", "\x9d\x5b", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29113 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29118 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2911d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29122 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29127 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2912c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29131 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29136 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2913c */ "\x9d\x5c", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29140 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29145 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2914a */ "\x00\x00", "\x00\x00", "\x93\x7e", "\x00\x00", "\x00\x00", ++ /* 0x2914f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29154 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29159 */ "\x00\x00", "\x98\xac", "\x00\x00", "\x00\x00", "\x9d\x5e", ++ /* 0x2915e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29163 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29168 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2916d */ "\x00\x00", "\x00\x00", "\xfd\xd0", "\x00\x00", "\x00\x00", ++ /* 0x29172 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29177 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2917c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29181 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29186 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2918b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29190 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29195 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2919a */ "\x00\x00", "\xfd\x60", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2919f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xcf", "\x00\x00", ++ /* 0x291a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xdd", "\x00\x00", ++ /* 0x291d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x291eb */ "\x90\xe0", + +- /* 0x2919c */ "\xfd\x60", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291a5 */ "\x00\x00", "\x00\x00", "\x9c\xcf", "\x00\x00", "\x00\x00", +- /* 0x291aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x291e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\xe0", +- +- /* 0x2941d */ "\x90\xf3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2941d */ "\x90\xf3", "\x00\x00", "\x00\x00", "\x98\xb1", "\x00\x00", + /* 0x29421 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29426 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2942b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29430 */ "\x00\x00", "\x00\x00", "\x90\xf0", "\x00\x00", "\x00\x00", + /* 0x29435 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2943a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2943a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xbd", + /* 0x2943f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29444 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x95\xb7", + +- /* 0x294d9 */ "\x8e\x4b", "\x96\x58", ++ /* 0x294d0 */ "\x9f\x46", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x294d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\x4b", ++ /* 0x294da */ "\x96\x58", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x294de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x294e3 */ "\x00\x00", "\x8a\x4c", "\x00\x00", "\x9d\x63", + + /* 0x2959e */ "\x9e\xcf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x295ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x295ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x65", "\x00\x00", + /* 0x295b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x295b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x295b6 */ "\x00\x00", "\x9d\x66", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x295d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x295d4 */ "\x00\x00", "\x00\x00", "\x96\x5a", "\x00\x00", "\x00\x00", + /* 0x295d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x295e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x295e9 */ "\x9d\x64", ++ /* 0x295e9 */ "\x9d\x64", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x295ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x295f2 */ "\x00\x00", "\x8a\x6c", ++ ++ /* 0x29720 */ "\x8a\xd9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29724 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29729 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2972e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x67", + +- /* 0x29857 */ "\x91\x50", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2985b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29860 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29865 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2986a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2986f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29874 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29879 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2987e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29883 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29888 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2988d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29892 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29897 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2989c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298a1 */ "\x00\x00", "\x00\x00", "\x9c\xc1", "\x00\x00", "\x00\x00", +- /* 0x298a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298e7 */ "\x00\x00", "\x00\x00", "\x93\xa7", "\x00\x00", "\x00\x00", +- /* 0x298ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x298fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29900 */ "\x00\x00", "\x00\x00", "\xa0\xef", "\x00\x00", "\x91\x51", +- /* 0x29905 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2990a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2990f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29914 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29919 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2991e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29923 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29928 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2992d */ "\x00\x00", "\x96\xc1", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29932 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29937 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2993c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29941 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29946 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2994b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29950 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29955 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2995a */ "\x00\x00", "\x00\x00", "\xfc\xa4", "\x00\x00", "\x00\x00", +- /* 0x2995f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29964 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2996a */ "\x9d\x6a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2996e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29973 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29978 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2997d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29982 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29987 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2998c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29991 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29996 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2999b */ "\x00\x00", "\x92\x4e", ++ /* 0x297d4 */ "\x8a\x70", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297ec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297f1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297f6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x297fb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29800 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29805 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2980a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29810 */ "\x8b\xf3", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29814 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29819 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2981e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29823 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29828 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2982d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29832 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29837 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2983c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29841 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29846 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2984b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29850 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29855 */ "\x00\x00", "\x91\x50", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2985a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2985f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29864 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29869 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2986e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29873 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29878 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2987d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29882 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29887 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2988c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29891 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29896 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2989b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xc1", "\x00\x00", ++ /* 0x298a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298aa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298b4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x68", "\x00\x00", ++ /* 0x298d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298dc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xa7", "\x00\x00", ++ /* 0x298eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298f1 */ "\x96\x74", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8c\xfd", ++ /* 0x298fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x298ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\xef", "\x00\x00", ++ /* 0x29905 */ "\x91\x51", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29909 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2990e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29913 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29918 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2991d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29922 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29927 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2992c */ "\x00\x00", "\x00\x00", "\x96\xc1", "\x00\x00", "\x00\x00", ++ /* 0x29931 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29936 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2993b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29940 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x87\x77", ++ /* 0x29945 */ "\x00\x00", "\x8c\x64", "\x96\x76", "\x9d\x69", "\x00\x00", ++ /* 0x2994a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2994f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29954 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29959 */ "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\xa4", "\x00\x00", ++ /* 0x2995e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29963 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29968 */ "\x00\x00", "\x9d\x6a", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2996d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29972 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29977 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2997c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29981 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29986 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2998b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29990 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29995 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2999a */ "\x00\x00", "\x00\x00", "\x92\x4e", "\x00\x00", "\x00\x00", ++ /* 0x2999f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299b3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299b8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299c3 */ "\x9d\x6b", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299c7 */ "\x00\x00", "\x9b\xc1", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x299fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a03 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a08 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a21 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a26 */ "\x00\x00", "\x9d\x6c", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a30 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a35 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a3a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a3f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a44 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29a49 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\x65", + + /* 0x29b05 */ "\x91\x5d", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29b09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x6d", + + /* 0x29bd5 */ "\x91\x5a", + +- /* 0x29cad */ "\x9c\xc0", ++ /* 0x29c73 */ "\x8c\x42", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29c9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ca4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ca9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xc0", + + /* 0x29d3e */ "\x91\x6a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d42 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d47 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d4c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d51 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29d56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29d56 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9d\x6e", "\x00\x00", + /* 0x29d5b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d60 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d65 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d6a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d6f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x29d74 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29d79 */ "\x00\x00", "\x00\x00", "\x9e\xa6", +- +- /* 0x29e2d */ "\x96\xb4", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e31 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e36 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e3b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e40 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e45 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e4a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e4f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e54 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e59 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e5e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e63 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x72", +- /* 0x29e68 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e6d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e72 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e77 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e7c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e81 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e86 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e8b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e90 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e95 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e9a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29e9f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ea4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ea9 */ "\x00\x00", "\x00\x00", "\x9e\xc8", "\x00\x00", "\x00\x00", +- /* 0x29eae */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29eb3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29eb8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ebd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ec3 */ "\x8b\x55", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ec7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ecc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ed1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ed6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29edb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ee0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ee5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29eea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29eef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ef4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29ef9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29efe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f03 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f08 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f0d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f12 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f17 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f1c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f21 */ "\x00\x00", "\x9d\x72", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f26 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x29f2b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xcc", +- +- /* 0x29fb7 */ "\x91\x74", +- +- /* 0x2a0e1 */ "\x91\x77", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a0e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a0ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a0ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xc0", "\x00\x00", +- /* 0x2a0f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8f\xb1", "\x00\x00", +- /* 0x2a0f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xb7", +- /* 0x2a0fe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a103 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a108 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a10d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a112 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a117 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a11c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a121 */ "\x00\x00", "\x91\x78", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a126 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a12b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a130 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a135 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a13a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a13f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a144 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a149 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a14e */ "\x00\x00", "\xfb\x77", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a153 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a158 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a15d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a162 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a167 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a16c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a171 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a176 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a17b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a180 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a185 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a18a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a18f */ "\x00\x00", "\x00\x00", "\x91\x75", "\x91\xa3", "\x00\x00", +- /* 0x2a194 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a199 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a19e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1cb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1d0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1d5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1da */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x79", +- /* 0x2a1df */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1e4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1e9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1ee */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1f3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1f8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a1fd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a202 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a207 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a20c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a211 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a216 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a21b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xa4", +- /* 0x2a220 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a225 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a22a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a22f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xa6", "\x00\x00", +- /* 0x2a234 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a239 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a23e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a243 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a248 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a24d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a252 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a257 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a25c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a261 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a266 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a26b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a270 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a275 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a27a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a27f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a284 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a289 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a28e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a293 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a298 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a29d */ "\x00\x00", "\x90\x52", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2b2 */ "\xa0\x45", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2a2df */ "\x9c\xdd", ++ /* 0x29d79 */ "\x00\x00", "\x00\x00", "\x9e\xa6", "\x00\x00", "\x00\x00", ++ /* 0x29d7e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29d83 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29d88 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29d8d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29d92 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29d98 */ "\x9d\xcd", "\x00\x00", "\x00\x00", "\x9d\x6f", "\x00\x00", ++ /* 0x29d9c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29da1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29da6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29db0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29db5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dbf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dc4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dc9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dd3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dd8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ddd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29de2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29de7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dec */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29df1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x89\xbb", ++ /* 0x29df6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29dfb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e00 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e06 */ "\x9e\xf9", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e0a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e0f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e14 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e19 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e1e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e23 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e28 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xb4", ++ /* 0x29e2d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e32 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e37 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e3c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e41 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e46 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e4b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e50 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e55 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e5a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e5f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e64 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x72", "\x00\x00", ++ /* 0x29e69 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e6e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e73 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e78 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e7d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e82 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e87 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e8c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e91 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e96 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29e9b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ea0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ea5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29eaa */ "\x00\x00", "\x9e\xc8", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29eb0 */ "\x87\x71", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29eb4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29eb9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ebe */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\x55", ++ /* 0x29ec3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ec8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ecd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ed2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ed7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29edc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ee1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ee6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29eeb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ef0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ef5 */ "\x00\x00", "\x00\x00", "\x9d\x71", "\x00\x00", "\x00\x00", ++ /* 0x29efa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29eff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f04 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f09 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f0e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f13 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f18 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f1d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f23 */ "\x9d\x72", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f27 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29f2c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xcc", + ++ /* 0x29fb7 */ "\x91\x74", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fbb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fc0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fc5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fcf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fd4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fd9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x9e\xd0", ++ /* 0x29fde */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fe3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fe8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29fed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ff2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ff7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x29ffc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a001 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a006 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a00b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a010 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x5c", "\x00\x00", ++ /* 0x2a015 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a01a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a01f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a024 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a029 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a02e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a033 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a038 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a03d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a042 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a047 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a04c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a051 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a056 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a05b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a060 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a065 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a06a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a06f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a074 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a079 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a07e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a083 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8e\xd2", "\x00\x00", ++ /* 0x2a088 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a08d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a092 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a097 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a09c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\xa8", "\x00\x00", ++ /* 0x2a0ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0ce */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0d3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0d8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0dd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x77", "\x00\x00", ++ /* 0x2a0e2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0e7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0ed */ "\x96\xbf", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0f1 */ "\x00\x00", "\x96\xc0", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0f6 */ "\x00\x00", "\x8f\xb1", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a0fb */ "\x00\x00", "\x00\x00", "\x96\xb7", "\x00\x00", "\x00\x00", ++ /* 0x2a100 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a105 */ "\x00\x00", "\x8c\x55", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a10a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a10f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a114 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a119 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a11e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x91\x78", ++ /* 0x2a123 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a128 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a12d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a133 */ "\x89\xbe", "\x91\x7c", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a137 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a13c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a141 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a146 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a14b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfb\x77", ++ /* 0x2a150 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a155 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a15a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a15f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a164 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a169 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a16e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a173 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a178 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a17d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a182 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a187 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a18c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a192 */ "\x91\x75", "\x91\xa3", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a196 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a19b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1a0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1a5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1ab */ "\x91\x76", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1af */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xbe", ++ /* 0x2a1b5 */ "\x8d\x49", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1b9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1be */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1c3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1c8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1cd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1d2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1d7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1dc */ "\x00\x00", "\x00\x00", "\x91\x79", "\x00\x00", "\x00\x00", ++ /* 0x2a1e1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1e6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1eb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1f0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x96\xb6", ++ /* 0x2a1f5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1fa */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a1ff */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a204 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a209 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a20e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a213 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a218 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a21d */ "\x00\x00", "\x00\x00", "\x91\xa4", "\x00\x00", "\x00\x00", ++ /* 0x2a222 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a227 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a22c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a231 */ "\x00\x00", "\x91\xa6", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a236 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a23b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a240 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a245 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a24a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a24f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a254 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a259 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a25e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a263 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a268 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a26d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a272 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a277 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a27c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a281 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a286 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a28b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a290 */ "\x00\x00", "\x00\x00", "\x9d\x75", "\x00\x00", "\x00\x00", ++ /* 0x2a295 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a29a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x90\x52", ++ /* 0x2a29f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2a4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2a9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2ae */ "\x00\x00", "\x00\x00", "\x00\x00", "\xa0\x45", "\x00\x00", ++ /* 0x2a2b4 */ "\x91\xa9", "\x00\x00", "\x98\xaa", "\x00\x00", "\x00\x00", ++ /* 0x2a2b8 */ "\x00\x00", "\x8c\x5f", "\x00\x00", "\x00\x00", "\x8b\xaa", ++ /* 0x2a2bd */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2c2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2c7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2cc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2d1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2d6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2db */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\xdd", "\x00\x00", ++ /* 0x2a2e0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2e5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2ea */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2ef */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2f4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2f9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a2ff */ "\x9d\x77", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a303 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a308 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a30d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a312 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a317 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a31c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a321 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a326 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a32b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a330 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a335 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a33a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a33f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a344 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a349 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a34e */ "\x00\x00", "\x00\x00", "\x87\x56", "\x00\x00", "\x00\x00", ++ /* 0x2a353 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a358 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a35d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a362 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a367 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a36c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a371 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a376 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a37b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a380 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a385 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a38a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a38f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a394 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a399 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a39e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a3a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2a3a9 */ "\x89\x40", + +- /* 0x2a5c6 */ "\x94\x78", ++ /* 0x2a434 */ "\x9e\xec", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a438 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a43d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a442 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a447 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a44c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a451 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a456 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x93\xaa", + +- /* 0x2a6a9 */ "\x9e\x75", ++ /* 0x2a5c6 */ "\x94\x78", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5cb */ "\x9d\x7a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5cf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5d4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5d9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5de */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5e3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5e8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5ed */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5f2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5f7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a5fc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xc9", ++ /* 0x2a601 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a606 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a60b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a610 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a615 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a61a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a61f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a624 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a629 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a62e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\x4b", "\x00\x00", ++ /* 0x2a633 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a638 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a63d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a642 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a647 */ "\x00\x00", "\x00\x00", "\x9f\xec", "\x00\x00", "\x00\x00", ++ /* 0x2a64c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a651 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a656 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x8a\xe2", ++ /* 0x2a65b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a660 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a665 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a66a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a66f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a674 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a679 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a67e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a683 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a688 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a68d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a692 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a697 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a69c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a6a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2a6a6 */ "\x00\x00", "\x00\x00", "\x9e\x75", + +- /* 0x2f840 */ "\xa0\x47", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f844 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f849 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f84e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f853 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f858 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f85d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f862 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f867 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f86c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f871 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f876 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f87b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f880 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f885 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f88a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f88f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x48", +- /* 0x2f894 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f899 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f89e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8a3 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8a8 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8ad */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8b2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8b7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8bc */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8c1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8c6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f8cb */ "\x00\x00", "\x9c\x52", ++ /* 0x2adff */ "\x87\xdc", ++ ++ /* 0x2f825 */ "\x98\x74", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f829 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f82e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f833 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f838 */ "\x00\x00", "\x00\x00", "\x9a\xc8", "\x00\x00", "\x00\x00", ++ /* 0x2f83d */ "\x00\x00", "\x00\x00", "\xa0\x47", "\x00\x00", "\x00\x00", ++ /* 0x2f842 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f847 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f84c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f851 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f856 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f85b */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f860 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f865 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f86a */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f86f */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f874 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x8b\xc3", "\x00\x00", ++ /* 0x2f879 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f87e */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f883 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f888 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f88d */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f892 */ "\x00\x00", "\xfc\x48", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f897 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f89c */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8a1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\xfc\x77", ++ /* 0x2f8a6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8ab */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8b0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8b5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8ba */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8bf */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8c4 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f8c9 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x9c\x52", + + /* 0x2f994 */ "\x8e\xfd", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2f998 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -16638,9 +17611,9 @@ static const char from_ucs4[][2] = + /* 0x2f9a2 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2f9a7 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2f9ac */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f9b1 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f9b2 */ "\x8f\xa8", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2f9b6 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +- /* 0x2f9bb */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", ++ /* 0x2f9bc */ "\x95\x7a", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2f9c0 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2f9c5 */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", + /* 0x2f9ca */ "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", "\x00\x00", +@@ -16693,105 +17666,70 @@ static struct + { 0x1ebe, 0x1ec1, 761 }, + { 0x2013, 0x203e, 765 }, + { 0x2103, 0x22bf, 809 }, +- { 0x2460, 0x247d, 1254 }, +- { 0x2500, 0x2642, 1284 }, +- { 0x273d, 0x273d, 1607 }, +- { 0x2e80, 0x2f33, 1608 }, +- { 0x3000, 0x3129, 1788 }, +- { 0x3231, 0x32a3, 2086 }, +- { 0x338e, 0x9fa5, 2201 }, +- { 0xe003, 0xe9cb, 29873 }, +- { 0xeaa9, 0xeeb7, 32378 }, +- { 0xf303, 0xf572, 33417 }, +- { 0xf6b0, 0xf6b0, 34041 }, +- { 0xf7e5, 0xf7ee, 34042 }, +- { 0xfa0c, 0xfa0d, 34052 }, +- { 0xfe30, 0xfe6b, 34054 }, +- { 0xff01, 0xffed, 34114 }, +- { 0x2003e, 0x20068, 34351 }, +- { 0x200ee, 0x20118, 34394 }, +- { 0x201ab, 0x20630, 34437 }, +- { 0x2070e, 0x20779, 35595 }, +- { 0x2082c, 0x20873, 35703 }, +- { 0x20916, 0x20979, 35775 }, +- { 0x20a11, 0x20ab4, 35875 }, +- { 0x20b8f, 0x214fd, 36039 }, +- { 0x21596, 0x21a4b, 38454 }, +- { 0x21b44, 0x21b44, 39660 }, +- { 0x21ca2, 0x21ca5, 39661 }, +- { 0x21d46, 0x21ed5, 39665 }, +- { 0x21f6a, 0x21fa1, 40065 }, +- { 0x22049, 0x221c3, 40121 }, +- { 0x2227c, 0x2227c, 40500 }, +- { 0x22321, 0x22325, 40501 }, +- { 0x223bd, 0x223d0, 40506 }, +- { 0x22465, 0x2248b, 40526 }, +- { 0x22513, 0x22980, 40565 }, +- { 0x22acf, 0x22e78, 41699 }, +- { 0x22fe3, 0x2330a, 42637 }, +- { 0x233b4, 0x237d7, 43445 }, +- { 0x23adb, 0x23b5a, 44505 }, +- { 0x23c99, 0x24578, 44633 }, +- { 0x2462a, 0x2478f, 46905 }, +- { 0x24823, 0x24823, 47263 }, +- { 0x248f3, 0x24ae2, 47264 }, +- { 0x24b6e, 0x24b6e, 47760 }, +- { 0x24bf5, 0x24c09, 47761 }, +- { 0x24c9e, 0x24d06, 47782 }, +- { 0x24db8, 0x24e50, 47887 }, +- { 0x24f0e, 0x24fc2, 48040 }, +- { 0x2509d, 0x2509d, 48221 }, +- { 0x25148, 0x25221, 48222 }, +- { 0x252c7, 0x25313, 48440 }, +- { 0x25425, 0x2546e, 48517 }, +- { 0x2555b, 0x259ac, 48591 }, +- { 0x25a9c, 0x25ae9, 49697 }, +- { 0x25b74, 0x25d43, 49775 }, +- { 0x25e0e, 0x25f4b, 50239 }, +- { 0x25fe1, 0x262d0, 50557 }, +- { 0x26351, 0x26626, 51309 }, +- { 0x266af, 0x267cc, 52035 }, +- { 0x2685e, 0x26911, 52321 }, +- { 0x269a8, 0x26a52, 52501 }, +- { 0x26b0a, 0x27175, 52672 }, +- { 0x2721b, 0x2721b, 54316 }, +- { 0x272e6, 0x272e6, 54317 }, +- { 0x2739a, 0x2739a, 54318 }, +- { 0x27422, 0x27486, 54319 }, +- { 0x275e0, 0x27785, 54420 }, +- { 0x27870, 0x27870, 54842 }, +- { 0x27924, 0x27967, 54843 }, +- { 0x27a0e, 0x27b3a, 54911 }, +- { 0x27bf4, 0x27c12, 55212 }, +- { 0x27d2f, 0x27e4f, 55243 }, +- { 0x28002, 0x28009, 55532 }, +- { 0x280bd, 0x2816f, 55540 }, +- { 0x28207, 0x2837d, 55719 }, +- { 0x28412, 0x28482, 56094 }, +- { 0x2853c, 0x2856c, 56207 }, +- { 0x285f4, 0x286e6, 56256 }, +- { 0x28804, 0x2882b, 56499 }, +- { 0x28933, 0x28c39, 56539 }, +- { 0x28ccd, 0x28d34, 57314 }, +- { 0x28e36, 0x28ed9, 57418 }, +- { 0x2908b, 0x29110, 57582 }, +- { 0x2919c, 0x291eb, 57716 }, +- { 0x2941d, 0x29448, 57796 }, +- { 0x294d9, 0x294da, 57840 }, +- { 0x2959e, 0x295e9, 57842 }, +- { 0x29857, 0x2999d, 57918 }, +- { 0x29b05, 0x29b0e, 58245 }, +- { 0x29bd5, 0x29bd5, 58255 }, +- { 0x29cad, 0x29cad, 58256 }, +- { 0x29d3e, 0x29d7c, 58257 }, +- { 0x29e2d, 0x29f30, 58320 }, +- { 0x29fb7, 0x29fb7, 58580 }, +- { 0x2a0e1, 0x2a2df, 58581 }, +- { 0x2a3a9, 0x2a3a9, 59092 }, +- { 0x2a5c6, 0x2a5c6, 59093 }, +- { 0x2a6a9, 0x2a6a9, 59094 }, +- { 0x2f840, 0x2f8cd, 59095 }, +- { 0x2f994, 0x2f9d4, 59237 } ++ { 0x23da, 0x23db, 1254 }, ++ { 0x2460, 0x247d, 1256 }, ++ { 0x2500, 0x2642, 1286 }, ++ { 0x273d, 0x273d, 1609 }, ++ { 0x2e80, 0x2f33, 1610 }, ++ { 0x3000, 0x3129, 1790 }, ++ { 0x31c0, 0x32a3, 2088 }, ++ { 0x338e, 0x9fcb, 2316 }, ++ { 0xf907, 0xf907, 30026 }, ++ { 0xfa0c, 0xfa0d, 30027 }, ++ { 0xfe30, 0xfe6b, 30029 }, ++ { 0xff01, 0xffed, 30089 }, ++ { 0x20021, 0x20118, 30326 }, ++ { 0x201a4, 0x20676, 30574 }, ++ { 0x2070e, 0x20779, 31809 }, ++ { 0x2082c, 0x20b0d, 31917 }, ++ { 0x20b8f, 0x21a63, 32655 }, ++ { 0x21b44, 0x21cac, 36452 }, ++ { 0x21d46, 0x2227c, 36813 }, ++ { 0x22321, 0x22325, 38148 }, ++ { 0x223bd, 0x22993, 38153 }, ++ { 0x22a66, 0x22eef, 39648 }, ++ { 0x22f74, 0x2331f, 40810 }, ++ { 0x233b4, 0x2383a, 41750 }, ++ { 0x239c2, 0x239c2, 42909 }, ++ { 0x23aa7, 0x23b5a, 42910 }, ++ { 0x23c63, 0x24b6e, 43090 }, ++ { 0x24bf5, 0x24c09, 46942 }, ++ { 0x24c9e, 0x24d13, 46963 }, ++ { 0x24db8, 0x2509d, 47081 }, ++ { 0x2512b, 0x25313, 47823 }, ++ { 0x25419, 0x2549a, 48312 }, ++ { 0x25531, 0x259cc, 48442 }, ++ { 0x25a54, 0x25ae9, 49622 }, ++ { 0x25b74, 0x25f4b, 49772 }, ++ { 0x25fe1, 0x26626, 50756 }, ++ { 0x266af, 0x26a52, 52362 }, ++ { 0x26b05, 0x27486, 53294 }, ++ { 0x27574, 0x277cc, 55728 }, ++ { 0x27858, 0x27b65, 56329 }, ++ { 0x27bef, 0x27e4f, 57111 }, ++ { 0x27f2e, 0x27f2e, 57720 }, ++ { 0x27ff9, 0x2838a, 57721 }, ++ { 0x28412, 0x28713, 58635 }, ++ { 0x28804, 0x2882b, 59405 }, ++ { 0x2890d, 0x28c3b, 59445 }, ++ { 0x28cca, 0x28ee7, 60260 }, ++ { 0x28fc5, 0x28fc5, 60802 }, ++ { 0x29079, 0x291eb, 60803 }, ++ { 0x2941d, 0x29448, 61174 }, ++ { 0x294d0, 0x294e7, 61218 }, ++ { 0x2959e, 0x295f4, 61242 }, ++ { 0x29720, 0x29732, 61329 }, ++ { 0x297d4, 0x29a4d, 61348 }, ++ { 0x29b05, 0x29b0e, 61982 }, ++ { 0x29bd5, 0x29bd5, 61992 }, ++ { 0x29c73, 0x29cad, 61993 }, ++ { 0x29d3e, 0x29f30, 62052 }, ++ { 0x29fb7, 0x2a3a9, 62551 }, ++ { 0x2a434, 0x2a45b, 63562 }, ++ { 0x2a5c6, 0x2a6a9, 63602 }, ++ { 0x2adff, 0x2adff, 63830 }, ++ { 0x2f825, 0x2f8cd, 63831 }, ++ { 0x2f994, 0x2f9d4, 64000 } + }; + + /* Definitions used in the body of the `gconv' function. */ +@@ -16800,57 +17738,168 @@ static struct + #define TO_LOOP to_big5hkscs + #define DEFINE_INIT 1 + #define DEFINE_FINI 1 +-#define MIN_NEEDED_FROM 1 +-#define MAX_NEEDED_FROM 2 +-#define MIN_NEEDED_TO 4 ++#define FROM_LOOP_MIN_NEEDED_FROM 1 ++#define FROM_LOOP_MAX_NEEDED_FROM 2 ++#define FROM_LOOP_MIN_NEEDED_TO 4 ++#define FROM_LOOP_MAX_NEEDED_TO 8 ++#define TO_LOOP_MIN_NEEDED_FROM 4 ++#define TO_LOOP_MAX_NEEDED_FROM 4 ++#define TO_LOOP_MIN_NEEDED_TO 1 ++#define TO_LOOP_MAX_NEEDED_TO 2 ++#define PREPARE_LOOP \ ++ int saved_state; \ ++ int *statep = &data->__statep->__count; ++#define EXTRA_LOOP_ARGS , statep ++ ++ ++/* Since we might have to reset input pointer we must be able to save ++ and restore the state. */ ++#define SAVE_RESET_STATE(Save) \ ++ if (Save) \ ++ saved_state = *statep; \ ++ else \ ++ *statep = saved_state ++ ++ ++/* During BIG5-HKSCS to UCS-4 conversion, the COUNT element of the state ++ contains the last UCS-4 character, shifted by 3 bits. ++ During UCS-4 to BIG5-HKSCS conversion, the COUNT element of the state ++ contains the last two bytes to be output, shifted by 3 bits. */ ++ ++/* Since this is a stateful encoding we have to provide code which resets ++ the output state to the initial state. This has to be done during the ++ flushing. */ ++#define EMIT_SHIFT_TO_INIT \ ++ if (data->__statep->__count != 0) \ ++ { \ ++ if (FROM_DIRECTION) \ ++ { \ ++ if (__builtin_expect (outbuf + 4 <= outend, 1)) \ ++ { \ ++ /* Write out the last character. */ \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ ++ data->__statep->__count = 0; \ ++ } \ ++ else \ ++ /* We don't have enough room in the output buffer. */ \ ++ status = __GCONV_FULL_OUTPUT; \ ++ } \ ++ else \ ++ { \ ++ if (__builtin_expect (outbuf + 2 <= outend, 1)) \ ++ { \ ++ /* Write out the last character. */ \ ++ uint32_t lasttwo = data->__statep->__count >> 3; \ ++ *outbuf++ = (lasttwo >> 8) & 0xff; \ ++ *outbuf++ = lasttwo & 0xff; \ ++ data->__statep->__count = 0; \ ++ } \ ++ else \ ++ /* We don't have enough room in the output buffer. */ \ ++ status = __GCONV_FULL_OUTPUT; \ ++ } \ ++ } + + + /* First define the conversion function from Big5 to UCS4. */ +-#define MIN_NEEDED_INPUT MIN_NEEDED_FROM +-#define MAX_NEEDED_INPUT MAX_NEEDED_FROM +-#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO ++#define MIN_NEEDED_INPUT FROM_LOOP_MIN_NEEDED_FROM ++#define MAX_NEEDED_INPUT FROM_LOOP_MAX_NEEDED_FROM ++#define MIN_NEEDED_OUTPUT FROM_LOOP_MIN_NEEDED_TO ++#define MAX_NEEDED_OUTPUT FROM_LOOP_MAX_NEEDED_TO + #define LOOPFCT FROM_LOOP + #define BODY \ + { \ +- uint32_t ch = *inptr; \ ++ uint32_t ch; \ + \ +- if (ch >= 0x81 && ch <= 0xfe) \ ++ /* Determine whether there is a buffered character pending. */ \ ++ ch = *statep >> 3; \ ++ if (__builtin_expect (ch == 0, 1)) \ + { \ +- /* Two-byte character. First test whether the next byte \ +- is also available. */ \ +- uint32_t ch2; \ +- int idx; \ ++ /* No - so look at the next input byte. */ \ ++ ch = *inptr; \ + \ +- if (__builtin_expect (inptr + 1 >= inend, 0)) \ ++ if (ch >= 0x81 && ch <= 0xfe) \ + { \ +- /* The second character is not available. */ \ +- result = __GCONV_INCOMPLETE_INPUT; \ +- break; \ +- } \ ++ /* Two-byte character. First test whether the next byte \ ++ is also available. */ \ ++ uint32_t ch2; \ ++ int idx; \ + \ +- ch2 = inptr[1]; \ +- /* See whether the second byte is in the correct range. */ \ +- if (ch < 0x88 || ch2 < 0x40 || ch2 > 0xfe \ +- || (idx = (ch - 0x88) * 195 + ch2 - 0x40, \ +- (ch = big5hkscs_to_ucs[idx]) == 0)) \ ++ if (__builtin_expect (inptr + 1 >= inend, 0)) \ ++ { \ ++ /* The second character is not available. */ \ ++ result = __GCONV_INCOMPLETE_INPUT; \ ++ break; \ ++ } \ ++ \ ++ ch2 = inptr[1]; \ ++ idx = (ch - 0x87) * 195 + ch2 - 0x40; \ ++ /* See whether the second byte is in the correct range. */ \ ++ if (ch < 0x87 || ch2 < 0x40 || ch2 > 0xfe \ ++ || (ch = big5hkscs_to_ucs[idx]) == 0) \ ++ { \ ++ /* Check for special cases: combining characters. */ \ ++ if (idx == 195 + 0x22 /* 8862 */) \ ++ { \ ++ ch = 0xca; \ ++ ch2 = 0x304; \ ++ } \ ++ else if (idx == 195 + 0x24 /* 8864 */) \ ++ { \ ++ ch = 0xca; \ ++ ch2 = 0x30c; \ ++ } \ ++ else if (idx == 195 + 0x63 /* 88a3 */) \ ++ { \ ++ ch = 0xea; \ ++ ch2 = 0x304; \ ++ } \ ++ else if (idx == 195 + 0x65 /* 88a5 */) \ ++ { \ ++ ch = 0xea; \ ++ ch2 = 0x30c; \ ++ } \ ++ else \ ++ /* This is illegal. */ \ ++ STANDARD_FROM_LOOP_ERR_HANDLER (1); \ ++ \ ++ inptr += 2; \ ++ \ ++ put32 (outptr, ch); \ ++ outptr += 4; \ ++ \ ++ /* See whether we have room for two characters. */ \ ++ if (outptr + 4 <= outend) \ ++ { \ ++ put32 (outptr, ch2); \ ++ outptr += 4; \ ++ continue; \ ++ } \ ++ \ ++ /* Otherwise store only the first character now, and \ ++ put the second one into the queue. */ \ ++ *statep = ch2 << 3; \ ++ /* Tell the caller why we terminate the loop. */ \ ++ result = __GCONV_FULL_OUTPUT; \ ++ break; \ ++ } \ ++ \ ++ inptr += 2; \ ++ } \ ++ else if (__builtin_expect (ch == 0xff, 0)) \ + { \ +- /* This is illegal. */ \ + STANDARD_FROM_LOOP_ERR_HANDLER (1); \ + } \ +- \ +- inptr += 2; \ +- } \ +- else if (__builtin_expect (ch == 0xff, 0)) \ +- { \ +- STANDARD_FROM_LOOP_ERR_HANDLER (1); \ ++ else \ ++ ++inptr; \ + } \ +- else \ +- ++inptr; \ + \ + put32 (outptr, ch); \ + outptr += 4; \ + } + #define LOOP_NEED_FLAGS ++#define EXTRA_LOOP_DECLS , int *statep + #define ONEBYTE_BODY \ + { \ + if (c <= 0x80) \ +@@ -16862,19 +17911,61 @@ static struct + + + /* Next, define the other direction. */ +-#define MIN_NEEDED_INPUT MIN_NEEDED_TO +-#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM +-#define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM ++#define MIN_NEEDED_INPUT TO_LOOP_MIN_NEEDED_FROM ++#define MAX_NEEDED_INPUT TO_LOOP_MAX_NEEDED_FROM ++#define MIN_NEEDED_OUTPUT TO_LOOP_MIN_NEEDED_TO ++#define MAX_NEEDED_OUTPUT TO_LOOP_MAX_NEEDED_TO + #define LOOPFCT TO_LOOP + #define BODY \ + { \ + uint32_t ch = get32 (inptr); \ + \ ++ if ((*statep >> 3) != 0) \ ++ { \ ++ /* Attempt to combine the last character with this one. */ \ ++ uint16_t lasttwo = *statep >> 3; \ ++ \ ++ if (ch == 0x304 && lasttwo == 0x8866) \ ++ ch = 0x8862; \ ++ else if (ch == 0x30c && lasttwo == 0x8866) \ ++ ch = 0x8864; \ ++ else if (ch == 0x304 && lasttwo == 0x88a7) \ ++ ch = 0x88a3; \ ++ else if (ch == 0x30c && lasttwo == 0x88a7) \ ++ ch = 0x88a5; \ ++ else \ ++ goto not_combining; \ ++ \ ++ /* Output the combined character. */ \ ++ if (__builtin_expect (outptr + 1 >= outend, 0)) \ ++ { \ ++ result = __GCONV_FULL_OUTPUT; \ ++ break; \ ++ } \ ++ *outptr++ = (ch >> 8) & 0xff; \ ++ *outptr++ = ch & 0xff; \ ++ *statep = 0; \ ++ inptr += 4; \ ++ continue; \ ++ \ ++ not_combining: \ ++ /* Output the buffered character. */ \ ++ if (__builtin_expect (outptr + 1 >= outend, 0)) \ ++ { \ ++ result = __GCONV_FULL_OUTPUT; \ ++ break; \ ++ } \ ++ *outptr++ = (lasttwo >> 8) & 0xff; \ ++ *outptr++ = lasttwo & 0xff; \ ++ *statep = 0; \ ++ continue; \ ++ } \ ++ \ + if (ch <= 0x0080) \ + *outptr++ = ch; \ + else \ + { \ +- const char *cp = ""; \ ++ const unsigned char *cp = (const unsigned char *) ""; \ + size_t i; \ + \ + for (i = 0; \ +@@ -16900,6 +17991,14 @@ static struct + } \ + else \ + { \ ++ /* Check for possible combining character. */ \ ++ if (__builtin_expect (ch == 0xca || ch == 0xea, 0)) \ ++ { \ ++ *statep = ((cp[0] << 8) | cp[1]) << 3; \ ++ inptr += 4; \ ++ continue; \ ++ } \ ++ \ + /* See whether there is enough room to write the second byte. */ \ + if (__builtin_expect (cp[1] != '\0', 1) \ + && __builtin_expect (outptr + 1 >= outend, 0)) \ +@@ -16918,6 +18017,7 @@ static struct + inptr += 4; \ + } + #define LOOP_NEED_FLAGS ++#define EXTRA_LOOP_DECLS , int *statep + #include + + +diff --git a/iconvdata/testdata/BIG5HKSCS b/iconvdata/testdata/BIG5HKSCS +index 827e20b..ac76f6e 100644 +--- a/iconvdata/testdata/BIG5HKSCS ++++ b/iconvdata/testdata/BIG5HKSCS +@@ -1,1135 +1,1154 @@ +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ �� +- �� �� �� �� �� �� �� �� �� �@ �A �C �F �G �H �I +- �L �M �N �O �P �Q �R �S �T �U �V �W �X �Y �Z �[ +- �\ �] �^ �_ �` �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 �{ +- �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �A �C �D �E �F �G �H +- �I �J �K �L �M �N �O �P �Q �R �S �T �U �V �W �X +- �Y �Z �[ �\ �] �^ �_ �` �a �b �d �e �f �g �h �i +- �j �k �l �m �n �o �p �q �r �s �t �v �w �x �y �z +- �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �A �B �C �D �E +- �F �G �H �I �J �K �L �M �N �O �P �Q �R �S �U �V +- �W �X �Y �Z �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �` �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 �{ �| +- �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �a �b �c �d �e �f �g �h �j �k �l �m �n �p �q +- �r �s �t �u �v �w �x �y �z �{ �| �} �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �A �B �C �D �E �F �G �H �I +- �J �K �L �M �N �O �P �Q �R �S �T �U �V �X �Y �Z +- �[ �\ �] �^ �_ �` �a �b �c �d �e �f �g �h �j �k +- �l �m �o �p �q �r �s �t �u �v �w �x �y �z �{ �| +- �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �a �b +- �c �d �e �f �g �h �i �j �k �l �n �o �p �q �r �s +- �t �u �v �w �x �y �{ �| �} �~ �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �@ �A �B �C �E �F �G �H �I �J �K �L �M �N +- �O �P �Q �R �S �T �U �V �W �X �Y �Z �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �@ �A �B �C �D �E �F �H �I �J �K +- �L �M �N �O �P �Q �R �S �T �U �V �W �X �Y �Z �[ +- �\ �] �^ �_ �` �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 �{ +- �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �@ �A �B �C +- �E �F �G �H �I �J �K �L �M �N �O �P �Q �R �S �T +- �U �V �W �X �Y �Z �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �@ �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 �[ �\ +- �] �^ �_ �` �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 �{ �| +- �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �b �c �d �e �f +- �g �h �i �j �k �l �m �n �o �p �q �r �s �t �u �w +- �y �z �| �} �~ �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ +- �A �C �D �E �F �G �H �I �J �K �L �M �N �O �P �Q +- �R �T �U �V �W �X �Y �Z �[ �\ �] �^ �_ �` �a �c +- �d �e �f �g �i �j �l �m �n �o �p �q �r �s �t �u +- �v �x �y �z �{ �| �} �~ �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �@ �A �B �C �D �E �F �G �H �I �J �K �L +- �M �N �O �P �Q �R �S �T �U �V �X �Y �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �@ �A �B �C �D �E �F �G �H �I �J �K +- �L �M �O �P �Q �R �S �T �U �V �W �X �Y �Z �[ �\ +- �] �^ �_ �a �b �c �d �e �g �h �i �j �k �l �m �n +- �o �p �q �r �s �t �u �v �w �x �y �z �{ �| �} �~ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �@ �A �B �C �D �E �F �G �H �I �J �K +- �L �M �N �O �P �Q �R �S �U �V �X �Y �[ �\ �] �^ +- �_ �` �a �d �e �f �g �h �i �j �k �l �m �n �o �p +- �q �s �t �u �v �x �y �z �{ �| �} �~ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �@ �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 �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �@ �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 +- �[ �\ �] �^ �_ �` �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 +- �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �@ �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 �[ �\ �] +- �^ �_ �` �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 �{ �| �} +- �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ +- �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 �[ �\ �] �^ �_ �` +- �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 �{ �| �} �~ �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �@ �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 �[ �\ +- �] �^ �_ �` �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 �{ �| +- �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �@ �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 �[ +- �\ �] �^ �_ �` �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 �{ +- �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �@ �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 �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �@ �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 +- �[ �\ �] �^ �_ �` �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 +- �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �@ �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 �[ �\ �] +- �^ �_ �` �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 �{ �| �} +- �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ +- �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 �[ �\ �] �^ �_ �` +- �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 �{ �| �} �~ �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �@ �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 �[ �\ +- �] �^ �_ �` �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 �{ �| +- �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �@ �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 �[ +- �\ �] �^ �_ �` �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 �{ +- �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �@ �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 �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° +- ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ á â ã +- ä å æ ç è é ê ë ì í î ï ð ñ ò ó +- ô õ ö ÷ ø ù ú û ü ý þ ÿ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ġ Ģ ģ Ĥ ĥ Ħ +- ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ +- ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ š Ţ ţ Ť ť Ŧ ŧ Ũ ũ +- Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź +- ź Ż ż Ž ž ſ �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �@ �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 +- �[ �\ �] �^ �_ �` �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 +- �{ �| �} �~ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ +- ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ +- ƽ ƾ ƿ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ǡ Ǣ ǣ Ǥ ǥ +- Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ +- Ƕ Ƿ Ǹ ǹ Ǻ ǻ Ǽ ǽ Ǿ ǿ �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ȡ Ȣ ȣ Ȥ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ɡ ɢ ɣ ɤ ɥ ɦ +- ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ +- ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ ʩ +- ʪ ʫ ʬ ʭ ʮ ʯ ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ +- ʺ ʻ ʼ ʽ ʾ ʿ �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �@ �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 +- �[ �\ �] �^ �_ �` �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 +- �{ �| �} �~ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩ ˪ ˫ ˬ +- ˭ ˮ ˯ ˰ ˱ ˲ ˳ ˴ ˵ ˶ ˷ ˸ ˹ ˺ ˻ ˼ +- ˽ ˾ ˿ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �@ �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 �[ �\ �] +- �^ �_ �` �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 �{ �| �} +- �~ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ +- ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ +- �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 �[ �\ �] �^ �_ �` +- �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 �{ �| �} �~ ͡ ͢ +- ͣ ͤ ͥ ͦ ͧ ͨ ͩ ͪ ͫ ͬ ͭ ͮ ͯ Ͱ ͱ Ͳ +- ͳ ʹ ͵ Ͷ ͷ ͸ ͹ ͺ ͻ ͼ ͽ ; Ϳ �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ Ρ ΢ Σ Τ Υ +- Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε +- ζ η θ ι κ λ μ ν ξ ο �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ +- ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ ϴ ϵ ϶ Ϸ ϸ +- Ϲ Ϻ ϻ ϼ Ͻ Ͼ Ͽ �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ С Т У Ф Х Ц Ч Ш Щ Ъ Ы +- Ь Э Ю Я а б в г д е ж з и й к л +- м н о п �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �@ �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 �[ �\ +- �] �^ �_ �` �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 �{ �| +- �} �~ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ +- ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ +- ѿ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ ҡ +- Ң ң Ҥ ҥ Ҧ ҧ Ҩ ҩ Ҫ ҫ Ҭ ҭ Ү ү Ұ ұ +- Ҳ ҳ Ҵ ҵ Ҷ ҷ Ҹ ҹ Һ һ Ҽ ҽ Ҿ ҿ �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ӡ Ӣ ӣ Ӥ +- ӥ Ӧ ӧ Ө ө Ӫ ӫ Ӭ ӭ Ӯ ӯ Ӱ ӱ Ӳ ӳ Ӵ +- ӵ Ӷ ӷ Ӹ ӹ Ӻ ӻ Ӽ ӽ Ӿ ӿ �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ԡ Ԣ ԣ Ԥ ԥ Ԧ ԧ +- Ԩ ԩ Ԫ ԫ Ԭ ԭ Ԯ ԯ ԰ Ա Բ Գ Դ Ե Զ Է +- Ը Թ Ժ Ի Լ Խ Ծ Կ �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ա բ գ դ ե զ է ը թ ժ +- ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ +- ջ ռ ս վ տ �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �@ �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 �[ +- �\ �] �^ �_ �` �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 �{ +- �| �} �~ ֡ ֢ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ +- ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֺ ֻ ּ ֽ +- ־ ֿ �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �@ �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 �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- ס ע ף פ ץ צ ק ר ש ת ׫ ׬ ׭ ׮ ׯ װ +- ױ ײ ׳ ״ ׵ ׶ ׷ ׸ ׹ ׺ ׻ ׼ ׽ ׾ ׿ �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ء آ أ +- ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س +- ش ص ض ط ظ ع غ ػ ؼ ؽ ؾ ؿ �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ١ ٢ ٣ ٤ ٥ ٦ +- ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٮ ٯ ٰ ٱ ٲ ٳ ٴ ٵ ٶ +- ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک +- ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ڲ ڳ ڴ ڵ ڶ ڷ ڸ ڹ +- ں ڻ ڼ ڽ ھ ڿ �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �@ �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 +- �[ �\ �] �^ �_ �` �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 +- �{ �| �} �~ ۡ ۢ ۣ ۤ ۥ ۦ ۧ ۨ ۩ ۪ ۫ ۬ +- ۭ ۮ ۯ ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۺ ۻ ۼ +- ۽ ۾ ۿ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �@ �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 �[ �\ �] +- �^ �_ �` �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 �{ �| �} +- �~ ܡ ܢ ܣ ܤ ܥ ܦ ܧ ܨ ܩ ܪ ܫ ܬ ܭ ܮ ܯ +- ܰ ܱ ܲ ܳ ܴ ܵ ܶ ܷ ܸ ܹ ܺ ܻ ܼ ܽ ܾ ܿ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ +- �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 �[ �\ �] �^ �_ �` +- �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 �{ �| �} �~ ݡ ݢ +- ݣ ݤ ݥ ݦ ݧ ݨ ݩ ݪ ݫ ݬ ݭ ݮ ݯ ݰ ݱ ݲ +- ݳ ݴ ݵ ݶ ݷ ݸ ݹ ݺ ݻ ݼ ݽ ݾ ݿ �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ޡ ޢ ޣ ޤ ޥ +- ަ ާ ި ީ ު ޫ ެ ޭ ޮ ޯ ް ޱ ޲ ޳ ޴ ޵ +- ޶ ޷ ޸ ޹ ޺ ޻ ޼ ޽ ޾ ޿ �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ߡ ߢ ߣ ߤ ߥ ߦ ߧ ߨ +- ߩ ߪ ߫ ߬ ߭ ߮ ߯ ߰ ߱ ߲ ߳ ߴ ߵ ߶ ߷ ߸ +- ߹ ߺ ߻ ߼ ߽ ߾ ߿ �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � � � � �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �@ �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 �[ �\ +- �] �^ �_ �` �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 �{ �| +- �} �~ � � � � � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ � +- � � � � � � � � � � � � � � � � +- � � � � � � � � � � � � � � �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � +- � � � � � � � � � � � � � � � � +- � � � � � � � � � � � �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � +- � � � � � � � � � � � � � � � � +- � � � � � � � � �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � � � � � �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �@ �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 �[ +- �\ �] �^ �_ �` �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 �{ +- �| �} �~ � � � � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � � �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �@ �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 �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- � � � � � � � � � � � � � � � � +- � � � � � � � � � � � � � � � �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � +- � � � � � � � � � � � � � � � � +- � � � � � � � � � � � � �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � +- � � � � � � � � � � � � � � � � +- � � � � � � � � � �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � � � � � � �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �@ �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 +- �[ �\ �] �^ �_ �` �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 +- �{ �| �} �~ � � � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � � � �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �@ �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 �[ �\ �] +- �^ �_ �` �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 �{ �| �} +- �~ � � � � � � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ +- �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 �[ �\ �] �^ �_ �` +- �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 �{ �| �} �~ �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � +- � � � � � � � � � � � � � � � � +- � � � � � � � � � � �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � +- � � � � � � � � � � � � � � � � +- � � � � � � � �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � � � � �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �@ �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 �[ �\ +- �] �^ �_ �` �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 �{ �| +- �} �~ � � � � � � � � � � � � � � +- � � � � � � � � � � � � � � � � +- � �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �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 �[ �\ �] �^ �_ +- �` �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 �{ �| �} �~ � +- � � � � � � � � � � � � � � � � +- � � � � � � � � � � � � � � �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � +- � � � � � � � � � � � � � � � � +- � � � � � � � � � � � �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �@ �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 �[ +- �\ �] �^ �_ �` �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 �{ +- �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �@ �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 �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �` �a �b �c �d �e �g �h �i +- �j �k �l �m �n �o �p �q �r �s �t �u �v �w �x �y +- �z �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �@ �A �B �C �D �E �F �G �I �J �K �L �M �N �O �P +- �Q �R �S �T �U �V �W �X �Y �Z �[ �\ �] �^ �_ �` +- �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 �{ �| �} �~ �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �@ �A �B �C �D �E �F +- �G �H �I �J �K �L �M �N �P �Q �R �S �T �U �V �W +- �X �Y �Z �[ �\ �] �^ �_ �` �a �b �c �d �e �f �g +- �h �i �j �k �m �n �o �p �q �r �s �t �u �v �w �x +- �y �z �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �@ �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 �[ �\ �] �^ +- �_ �` �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 �{ �| �} �~ +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �@ �A �B �C �D �E +- �F �G �H �I �J �K �L �M �N �O �P �Q �S �T �U �V +- �W �X �Y �Z �[ �\ �] �^ �_ �` �a �b �c �d �e �f +- �g �h �i �j �k �l �m �n �p �q �r �s �t �u �v �w +- �x �y �z �{ �| �} �~ �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� +- �� �� �� ++ �@ �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 �[ �\ �] �^ �_ ++ �` �a �b �c �d �e �g �h �i �j �k �l �m �n �o �p ++ �q �r �s �t �u �v �w �x �y �z �{ �| �} �~ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� ++ �� �� �� �� �� �� �@ �A �C �F �G �H �I �L �M �N ++ �O �P �Q �R �S �T �U �V �W �X �Y �Z �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �@ �A �C �D �E �F �G �H �I �J �K ++ �L �M �N �O �P �Q �R �S �T �U �V �W �X �Y �Z �[ ++ �\ �] �^ �_ �` �a �b �d �e �f �g �h �i �j �k �l ++ �m �n �o �p �q �r �s �t �v �w �x �y �z �{ �| �} ++ �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �A �B �C �D �E �F �G �H ++ �I �J �K �L �M �N �O �P �Q �R �S �U �V �W �X �Y ++ �Z �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �a �b �c �d �e �f �g �h �j �k �l ++ �m �n �p �q �r �s �t �u �v �w �x �y �z �{ �| �} ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �A �B �C �D �E ++ �F �G �H �I �J �K �L �M �N �O �P �Q �R �S �T �U ++ �V �X �Y �Z �[ �\ �] �^ �_ �` �a �b �c �d �e �f ++ �g �h �j �k �l �m �o �p �q �r �s �t �u �v �w �x ++ �y �z �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �a �b �c �d �e �f �g �h �i �j �k �l �n �o ++ �p �q �r �s �t �u �v �w �x �y �{ �| �} �~ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �@ �A �B �C �E �F �G �H �I �J ++ �K �L �M �N �O �P �Q �R �S �T �U �V �W �X �Y �Z ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �@ �A �B �C �D �E �F ++ �H �I �J �K �L �M �N �O �P �Q �R �S �T �U �V �W ++ �X �Y �Z �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �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 �{ ++ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �@ �A �B �C �E �F �G �H �I �J �K �L �M �N �O �P ++ �Q �R �S �T �U �V �W �X �Y �Z �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �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 �{ ++ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �b ++ �c �d �e �f �g �h �i �j �k �l �m �n �o �p �q �r ++ �s �t �u �w �y �z �| �} �~ �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �@ �A �C �D �E �F �G �H �I �J �K �L �M ++ �N �O �P �Q �R �T �U �V �W �X �Y �Z �[ �\ �] �^ ++ �_ �` �a �c �d �e �f �g �i �j �l �m �n �o �p �q ++ �r �s �t �u �v �x �y �z �{ �| �} �~ �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �A �B �C �D �E �F �G �H ++ �I �J �K �L �M �N �O �P �Q �R �S �T �U �V �X �Y ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �A �B �C �D �E �F �G ++ �H �I �J �K �L �M �O �P �Q �R �S �T �U �V �W �X ++ �Y �Z �[ �\ �] �^ �_ �a �b �c �d �e �g �h �i �j ++ �k �l �m �n �o �p �q �r �s �t �u �v �w �x �y �z ++ �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �A �B �C �D �E �F �G ++ �H �I �J �K �L �M �N �O �P �Q �R �S �U �V �X �Y ++ �[ �\ �] �^ �_ �` �a �d �e �f �g �h �i �j �k �l ++ �m �n �o �p �q �s �t �u �v �x �y �z �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �@ �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 ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ ++ �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 �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �@ �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 �[ �\ ++ �] �^ �_ �` �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 �{ �| ++ �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �@ �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 �[ �\ �] �^ �_ ++ �` �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 �{ �| �} �~ �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �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 �{ ++ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �@ �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 ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �@ �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 �[ �\ �] ++ �^ �_ �` �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 �{ �| �} ++ �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ ++ �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 �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �@ �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 �[ �\ ++ �] �^ �_ �` �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 �{ �| ++ �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �@ �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 �[ �\ �] �^ �_ ++ �` �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 �{ �| �} �~ �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �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 �{ ++ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �@ �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 ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ++ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ++ ½ ¾ ¿ �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �@ �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 �[ �\ �] ++ �^ �_ �` �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 �{ �| �} ++ �~ á â ã ä å æ ç è é ê ë ì í î ï ++ ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ ++ �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 �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ ġ Ģ ++ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ++ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ š Ţ ţ Ť ť ++ Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ ++ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ ++ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ++ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �@ �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 �[ �\ �] �^ �_ ++ �` �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 �{ �| �} �~ ǡ ++ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ ++ Dz dz Ǵ ǵ Ƕ Ƿ Ǹ ǹ Ǻ ǻ Ǽ ǽ Ǿ ǿ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ȡ Ȣ ȣ Ȥ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ ++ �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 �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ ɡ ɢ ++ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ++ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ʡ ʢ ʣ ʤ ʥ ++ ʦ ʧ ʨ ʩ ʪ ʫ ʬ ʭ ʮ ʯ ʰ ʱ ʲ ʳ ʴ ʵ ++ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ++ ˩ ˪ ˫ ˬ ˭ ˮ ˯ ˰ ˱ ˲ ˳ ˴ ˵ ˶ ˷ ˸ ++ ˹ ˺ ˻ ˼ ˽ ˾ ˿ �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ++ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ++ ̼ ̽ ̾ ̿ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �@ �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 �[ �\ ++ �] �^ �_ �` �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 �{ �| ++ �} �~ ͡ ͢ ͣ ͤ ͥ ͦ ͧ ͨ ͩ ͪ ͫ ͬ ͭ ͮ ++ ͯ Ͱ ͱ Ͳ ͳ ʹ ͵ Ͷ ͷ ͸ ͹ ͺ ͻ ͼ ͽ ; ++ Ϳ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �@ �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 �[ �\ �] �^ �_ ++ �` �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 �{ �| �} �~ Ρ ++ ΢ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α ++ β γ δ ε ζ η θ ι κ λ μ ν ξ ο �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ϡ Ϣ ϣ Ϥ ++ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ ϴ ++ ϵ ϶ Ϸ ϸ Ϲ Ϻ ϻ ϼ Ͻ Ͼ Ͽ �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ С Т У Ф Х Ц Ч ++ Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з ++ и й к л м н о п �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ++ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ++ ѻ Ѽ ѽ Ѿ ѿ �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �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 �{ ++ �| �} �~ ҡ Ң ң Ҥ ҥ Ҧ ҧ Ҩ ҩ Ҫ ҫ Ҭ ҭ ++ Ү ү Ұ ұ Ҳ ҳ Ҵ ҵ Ҷ ҷ Ҹ ҹ Һ һ Ҽ ҽ ++ Ҿ ҿ �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ ӡ Ӣ ӣ Ӥ ӥ Ӧ ӧ Ө ө Ӫ ӫ Ӭ ӭ Ӯ ӯ Ӱ ++ ӱ Ӳ ӳ Ӵ ӵ Ӷ ӷ Ӹ ӹ Ӻ ӻ Ӽ ӽ Ӿ ӿ �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ԡ Ԣ ԣ ++ Ԥ ԥ Ԧ ԧ Ԩ ԩ Ԫ ԫ Ԭ ԭ Ԯ ԯ ԰ Ա Բ Գ ++ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ա բ գ դ ե զ ++ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն ++ շ ո չ պ ջ ռ ս վ տ �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ֡ ֢ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ++ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ++ ֺ ֻ ּ ֽ ־ ֿ �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �@ �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 ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ ס ע ף פ ץ צ ק ר ש ת ׫ ׬ ++ ׭ ׮ ׯ װ ױ ײ ׳ ״ ׵ ׶ ׷ ׸ ׹ ׺ ׻ ׼ ++ ׽ ׾ ׿ �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �@ �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 �[ �\ �] ++ �^ �_ �` �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 �{ �| �} ++ �~ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ++ ذ ر ز س ش ص ض ط ظ ع غ ػ ؼ ؽ ؾ ؿ ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ ++ �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 �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ ١ ٢ ++ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٮ ٯ ٰ ٱ ٲ ++ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ڡ ڢ ڣ ڤ ڥ ++ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ڲ ڳ ڴ ڵ ++ ڶ ڷ ڸ ڹ ں ڻ ڼ ڽ ھ ڿ �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ۡ ۢ ۣ ۤ ۥ ۦ ۧ ۨ ++ ۩ ۪ ۫ ۬ ۭ ۮ ۯ ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ++ ۹ ۺ ۻ ۼ ۽ ۾ ۿ �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ܡ ܢ ܣ ܤ ܥ ܦ ܧ ܨ ܩ ܪ ܫ ++ ܬ ܭ ܮ ܯ ܰ ܱ ܲ ܳ ܴ ܵ ܶ ܷ ܸ ܹ ܺ ܻ ++ ܼ ܽ ܾ ܿ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �@ �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 �[ �\ ++ �] �^ �_ �` �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 �{ �| ++ �} �~ ݡ ݢ ݣ ݤ ݥ ݦ ݧ ݨ ݩ ݪ ݫ ݬ ݭ ݮ ++ ݯ ݰ ݱ ݲ ݳ ݴ ݵ ݶ ݷ ݸ ݹ ݺ ݻ ݼ ݽ ݾ ++ ݿ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �@ �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 �[ �\ �] �^ �_ ++ �` �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 �{ �| �} �~ ޡ ++ ޢ ޣ ޤ ޥ ަ ާ ި ީ ު ޫ ެ ޭ ޮ ޯ ް ޱ ++ ޲ ޳ ޴ ޵ ޶ ޷ ޸ ޹ ޺ ޻ ޼ ޽ ޾ ޿ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ ߡ ߢ ߣ ߤ ++ ߥ ߦ ߧ ߨ ߩ ߪ ߫ ߬ ߭ ߮ ߯ ߰ ߱ ߲ ߳ ߴ ++ ߵ ߶ ߷ ߸ ߹ ߺ ߻ ߼ ߽ ߾ ߿ �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �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 �{ ++ �| �} �~ � � � � � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � � � � � � � �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � � � � �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �@ �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 ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ � � � � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �@ �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 �[ �\ �] ++ �^ �_ �` �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 �{ �| �} ++ �~ � � � � � � � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ ++ �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 �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � � � � � �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � � �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �@ �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 �[ �\ ++ �] �^ �_ �` �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 �{ �| ++ �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �@ �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 �[ �\ �] �^ �_ ++ �` �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 �{ �| �} �~ � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � � � � � � �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � � � �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ � � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � � � � �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �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 �[ ++ �\ �] �^ �_ �` �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 �{ ++ �| �} �~ � � � � � � � � � � � � � ++ � � � � � � � � � � � � � � � � ++ � � �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �@ �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 �[ �\ �] �^ ++ �_ �` �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 �{ �| �} �~ ++ � � � � � � � � � � � � � � � � ++ � � � � � � � � � � � � � � � �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �_ �` �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 �{ �| �} �~ �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �@ �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 ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �@ �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 �[ �\ �] ++ �^ �_ �` �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 �{ �| �} ++ �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ ++ �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 �[ �\ �] �^ �_ �` ++ �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 �{ �| �} �~ �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �@ �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 �[ �\ �] �^ �` �a �b �c �d ++ �e �g �h �i �j �k �l �m �n �o �p �q �r �s �t �u ++ �v �w �x �y �z �{ �| �} �~ �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �@ �A �B �C �D �E �F �G �I �J �K �L ++ �M �N �O �P �Q �R �S �T �U �V �W �X �Y �Z �[ �\ ++ �] �^ �_ �` �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 �{ �| ++ �} �~ �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �A �B ++ �C �D �E �F �G �H �I �J �K �L �M �N �P �Q �R �S ++ �T �U �V �W �X �Y �Z �[ �\ �] �^ �_ �` �a �b �c ++ �d �e �f �g �h �i �j �k �m �n �o �p �q �r �s �t ++ �u �v �w �x �y �z �{ �| �} �~ �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �@ �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 ++ �[ �\ �] �^ �_ �` �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 ++ �{ �| �} �~ �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �@ �A ++ �B �C �D �E �F �G �H �I �J �K �L �M �N �O �P �Q ++ �S �T �U �V �W �X �Y �Z �[ �\ �] �^ �_ �` �a �b ++ �c �d �e �f �g �h �i �j �k �l �m �n �p �q �r �s ++ �t �u �v �w �x �y �z �{ �| �} �~ �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� ++ �� �� �� �� �� �� �� +diff --git a/iconvdata/testdata/BIG5HKSCS..UTF8 b/iconvdata/testdata/BIG5HKSCS..UTF8 +index a3b5254..5fbde06 100644 +--- a/iconvdata/testdata/BIG5HKSCS..UTF8 ++++ b/iconvdata/testdata/BIG5HKSCS..UTF8 +@@ -1,1135 +1,1154 @@ +-                 +-       Ā Á Ǎ À Ē É Ě È Ō Ó +- Ǒ Ò  Ế  Ề Ê ā á ǎ à ɑ ē é ě è +- ī í ǐ ì ō ó ǒ ò ū ú ǔ ù ǖ ǘ ǚ ǜ +- ü  ế  ề ê ɡ   𪎩  攊 丽 滝 鵎 釟 +- 𧜵 撑 会 伨 侨 兖 兴 农 凤 务 动 医 华 发 变 团 +- 声 处 备 夲 头 学 实 実 岚 庆 总 斉 柾 栄 桥 济 +- 炼 电 纤 纬 纺 织 经 统 缆 缷 艺 苏 药 视 设 询 +- 车 轧 轮 琑 糼 緍 楆 竉 刧 醌 碸 酞 肼 贋 胶  +- 肟 黇 䳍 鷉 鸌 䰾  𧀎 鸊  㗁 溚 舾 甙 䤑 马 +- 骏 龙 禇  𡷊 𠗐  两 亁 亀 亇 亿 仫 伷 㑌 侽 +- 㹈 倃 傈 㑽 㒓 㒥 円 夅 凛 凼 刅 争 剹 劐 匧 㗇 +- 厩 㕑 厰 㕓 参 吣 㕭 㕲 㚁 咓 咣 咴 咹 哐 哯 唘 +- 唣 唨 㖘 唿 㖥 㖿 嗗 㗅  唥 𠱂   喐 𢳆 㧬 +- 𠍁 蹆 𤶸  䁓 𨂾 睺  㨴 䟕  𦧲 𤷪 擝  𠾴 +- 𠳕 𡃴 撍 蹾     𨉖 𤓓 𠵆  𨃩 䟴   +- 骲 㩧  㿭 㔆 𥋇    鵮 頕 䏙 𦂥 撴 哣  +-  𡁷 㧻 𡁯    擪  𠱃 蹨 𢆡 𨭌  䠋  +- 㿺 塳   𠓼    啹 䂻 䎺 䪴   膪 飵 +-  捹 㧾 𢝵 跀 嚡 摼 㹃  𠸉 𢫏  𡃈  㦒 㨆 +-  㕸  𢃇 噒 𠼱   㒼 氽      𨳍 +- 𠹺   羓  𢠃 𢤹 㗻 𥇣  𠾍 𠺪 㾓 𠼰 𠵇  +-  𠺫  𠵈 𡃀 𡄽 㿹 𢚖 搲 𠾭 𣏴 𧘹 𢯎 𠵾 𠵿 𢱑 +- 𢱕 㨘  𡃇 𠼮  𦭐    閪 哌 苄 喹 𩻃 鰦 +- 骶 𧝞  煀 腭 胬 尜 𦕲 脴 㞗 卟 𨂽 醶 𠻺 𠸏 𠹷 +- 𠻻 㗝 𤷫 㘉 𠳖 嚯 𢞵 𡃉 𠸐 𠹸 𡁸 𡅈 𨈇 𡑕 𠹹 𤹐 +- 𢶤 婔 𡀝 𡀞 𡃵 𡃶 垜 𠸑 𧚔 𨋍 𠾵 𠹻 𥅾 㜃 𠾶 𡆀 +- 𥋘   𡠺   墙 剨 㘚  箲 孨 䠀 䬬 鼧 䧧 +- 鰟 鮍 𥭴 𣄽 嗻 㗲 嚉 丨 夂   靑  乛 亻 㔾 +- 尣 彑 忄 㣺 扌 攵 歺 氵 氺 灬 爫 丬 犭  罒 礻 +- 糹 罓  㓁  耂 肀   卝 衤 见  讠 贝 钅 +- 镸 长 门  韦 页 风 飞 饣  鱼 鸟 黄 歯 丷  +- 阝 户 钢 崾 嵈 嵖 㷼 㠏 嶤 嶹 㠠 㠸 幂 庽 弥 徃 +- 㤈 㤔 㤿 㥍 惗 愽 峥 㦉 憷 憹 懏 㦸 戬 抐 拥 挘 +- 㧸 嚱 㨃 揢 揻 搇 摚 㩋 擀 崕 嘡 龟 㪗 斆 㪽 旿 +- 晓 㫲 暒 㬢 朖 㭂 枤 栀 㭘 桊 梄 㭲 㭱 㭻 椉 楃 +- 牜 楤 榟 榅 㮼 槖 㯝 橥 橴 橱 檂 㯬 檙 㯲 檫 檵 +- 櫔 櫶 殁 毁 毪 汵 沪 㳋 洂 洆 洦 涁 㳯 涤 涱 渕 +- 渘 温 溆 𨧀 溻 滢 滚 齿 滨 滩 漤 漴 㵆 𣽁 澁 澾 +- 㵪 㵵 熷 岙 㶊 瀬 㶑 灐 灔 灯 灿 炉 𠌥 䏁 㗱  +-  垾 𦻓 焾 𥟠 㙎 榢 𨯩 孴 穉 𥣡 𩓙 穥 穽 𥦬 窻 +- 窰 竂 竃 燑  䇊 竚 竝 竪 䇯 咲 𥰁 笋 筕 笩  +- 𥳾 箢 筯 莜 𥮴 𦱿 篐 萡 箒 𣿰 㶭 𥱥 蒒 篺 簵 𥳁 +- 籄 粃  粦 晽 𤕸 糉 糇 糦 籴 糳 糵 繧 䔝 𦹄 絝 +- 𦻖 璍 綉 綫 焵 綳 𤁗 𦀩 緤 㴓 緵 𡟹 緥  𦄡 𦅚 +- 繮 纒 䌫 鑬 縧 罀 罁 罇 礶 𦋐 駡 羗 𦍑 羣 𡙡 𠁨 +- 䕜 𣝦 䔃 𨌺 翺 𦒉 耈 耝 耯   耻 耼 聡  䦉 +- 𦘦  𦛨 朥 肧 𨩈 脇 脚 墰 𢛶 汿 𦒘  擧  舘 +- 𡡞 橓 𤩥 𤪕 䑺 舩  𦩒  俹 𡓽 蓢 荢 𦬊 𤦧 𣔰 +- 𡝳 𣷸 芪 椛 芳 䇛 蕋 苐 茚 𠸖 𡞴 㛁  𣕚 艻 苢 +- 茘 𣺋 𦶣  𦮗 𣗎 㶿 茝 嗬 莅 䔋 𦶥 莬 菓 㑾 𦻔 +- 橗 蕚 㒖 𦹂  葘  葱 㷓 䓤 檧 葊  祘 𦮖 𦹷 +- 𦹃 蓞 莑 䒠 蒓 蓤  䉀 𥳀 䕃 蔴 嫲  䔧 蕳 䔖 +- 枿 蘖 𨘥 𨘻 藁  蘂  𧃍  䕪 蘨 㙈 𡢢 号 𧎚 +- 虾 蝱 𪃸 蟮 𢰧 螱 蟚 蠏 噡 虬 桖 䘏 衅 衆 𧗠 𣶹 +- 𧗤 衞 袜 䙛 袴 袵 揁 装 睷 𧜏 覇 覊 覧 覼 𨨥 觧 +- 𧤤 𧪽 誜 瞓 釾 誐 𧩙 竩 𧬺  䜓 𧬸 煼 謌 謟 𥐰 +- 𥕥 謿 譌 譍 誩 𤩺 讐 讛 誯  䘕 衏 貛 𧵔 𧶏 貫 +- 㜥 𧵓 賖 𧶘 𧶽 贒 贃 𡤐 賛 灜 贑  㻐 趩 𨀂  +- 𤦊 㭼  𧄌 竧 躭 躶 軃 鋔 輙 輭 𨍥 𨐒 辥 錃 𪊟 +- 𠩐 辳 䤪 𨧞 𨔽 𣶻 廸 𣉢 迹    𢌥 㦀 𦻗 逷 +- 𨔼 𧪾 遡 𨕬 𨘋 邨  郄 𨛦 邮 酧 㫰 醩 釄 粬 𨤳 +- 𡺉 鈎 沟 鉁 鉢 𥖹 𨫆 𣲛 𨬌 𥗛  錬 鍫 𨫡 𨯫 炏 +- 嫃 𨫢 𨫥 䥥 鉄 𨯬 𨰹 𨯿 鍳 鑛 躼 閅 閦 鐦 閠 濶 +- 䊹  𨛘 𡉼 𣸮 䧟 氜 陻 隖 䅬 隣 𦻕 懚 隶 磵 𨫠 +- 隽 双 䦡 𦲸 𠉴 𦐐 𩂯 𩃥 𤫑 𡤕 𣌊 霱 虂 霶 䨏 䔽 +- 䖅  灵 孁 霛  靗 孊 𩇫 靟 鐥 僐 𣂷 𣂼 鞉 鞟 +- 鞱 鞾 韀 韒 韠 𥑬 韮 琜 𩐳 韵 𩐝  䫑 頴 頳 顋 +- 顦 㬎 𧅵 㵑 𠘰 𤅜 𥜆 飊 颷 飈 飇 䫿 𦴧 𡛓 喰 飡 +- 飦 飬 鍸 餹 𤨩 䭲 𩡗 𩤅 駵 騌 騻 騐 驘 𥜥 㛄 𩂱 +- 𩯕 髠 髢 𩬅 髴 䰎 鬔 鬭 𨘀 倴 鬴 𦦨 㣃 𣁽 魐 魀 +- 𩴾 婅 𡡣 鮎 𤉋 鰂 鯿 鰌 𩹨 鷔 𩾷 𪆒  𪃡 𪄣 𪇟 +- 鵾 鶃  鸎 梈 鷄  𪆓 𪈠 𡤻 𪈳 鴹   麐 麕 +- 麞 麢 䴴 麪 麯 𤍤 黁 㭠 㧥 㴝 伲 㞾 𨰫 鼂 鼈 䮖 +- 鐤 𦶢 鼗 鼹 嚟 嚊 齅 馸 𩂋 韲 葿 齢 齩 竜 龎 爖 +- 䮾 𤥵 𤦻 煷 𤧸 𤍈 𤩑 玞 𨯚 𡣺 禟 𨥾 𨸶 鍩 鏳 𨩄 +- 鋬 鎁 鏋 𨥬 𤒹 爗 㻫 睲 穃 烐  𤏸 煾  炣 𡢾 +- 𣖙 㻇 𡢅 𥐯 𡟸 㜢 𡛻  㛡 𡝴  𥽋 㜣 𡛀 坛 𤨥 +- 𡏾  𡏆 𡒶 蔃 𣚦 葕  𧅥 𣸱 𥕜 𣻻 𧁒 䓴 𣛮 𩦝 +- 𦼦 柹 㜳 㰕 㷧 塬  栐 䁗 𣜿  𤂋  𦰡 哋 嚞 +- 𦚱 嚒  𠮨 𠸍 鏆  鎜 仸 儫 㠙 𤐶 亼 𠑥 𠍿 佋 +- 侊 𥙑 婨 𠆫 𠏋 㦙 𠌊 𠐔 㐵 伩 𠋀 𨺳 𠉵 諚  亘 +- 働 儍 侢 伃  𣺊 佂 倮 偬 傁 俌 俥 偘 僼 湶 𣖕 +-  𣺿 浲 𡢄 𣺉 冨 凃 𠗠 䓝 𠒣 𠒒 𠒑 赺 𨪜 𠜎 剙 +- 劤 𠡳 勡 䙺 熌 𤎌 𠰠 𤦬  槑 𠸝 㻞 璙 琔 瑖 玘 +- 䮎 𤪼 𤂍 叐 㖄 爏 𤃉 喴 𠍅 响 𠯆 圝 鉝 雴 鍦 埝 +- 垍 坿 㘾 壋 媙 𨩆 𡛺 𡝯 𡜐 娬 妸 銏 婾 嫏 娒  +- 𡧳 𡡡  㛵 洅 瑃 娡 𥺃 媁 𨯗 𠐓 鏠 璌 𡌃 焅 䥲 +- 鐈 𨧻 鎽 㞠 尞 岞 幞 幈 𡦖 𡥼 𣫮 廍 孏 𡤃 𡤄 㜁 +- 𡢠 㛝 𡛾 㛓 脪 𨩇 𡶺 𣑲 𨦨 弌 弎 𡤧  婫 𡜻 孄 +- 蘔 𧗽 衠 恾 𢡠 𢘫 忛 㺸 𢖯 𢖾  𦽳 懀 𠀾 𠁆 𢘛 +- 憙 憘 恵 𢲛 𢴇 𤛔  摱 𤙥 𢭪 㨩 𢬢 𣑐 𩣪 𢹸 挷 +-  撶 挱 揑 𤧣 𢵧 护 𢲡 搻 敫 楲 㯴 𣂎 𣊭 𤦉 𣊫 +- 唍 𣋠 𡣙  曎 𣊉  㫠 䆐 𥖄 𨬢 𥖏 𡛼 𥕛 𥐥 磮 +- 𣄃 𡠪 𣈴 㑤  𣆂 𤋉 暎 𦴤 晫 䮓 昰 𧡰  晣 𣋒 +- 𣋡 昞 𥡲 㣑  𣞼 㮙 𣞢 𣏾 瓐 㮖 枏 𤘪 梶 栞 㯄 +- 檾 㡣 𣟕 𤒇 樳 橒 櫉 欅 𡤒 攑 梘 橌 㯗 橺 歗 𣿀 +- 𣲚 鎠 鋲 𨯪 𨫋 銉  𨧜 鑧 涥 漋  𣽿 㶏 渄 𤀼 +- 娽 渊 塇 洤 硂 焻 𤌚 𤉶 烱 牐 犇 犔 𤞏 𤜥 兹 𤪤 +- 𠗫 瑺 𣻸   𤤗 𥿡 㼆 㺱 𤫟 𨰣 𣼵 悧 㻳 瓌 琼 +- 鎇 琷 䒟 𦷪 䕑 疃 㽣 𤳙 𤴆 㽘 畕 癳 𪗆 㬙 瑨 𨫌 +- 𤦫 𤦎 㫻 㷍 𤩎 㻿  𤣳 釺 圲 鍂 𨫣 𡡤 僟 𥈡 𥇧 +- 睸 𣈲 眎 眏 睻 𤚗 𣞁 㩞  琸 璛 㺿 𤪺 𤫇 䃈 𤪖 +- 𦆮 錇 𥖁 砞 碍 碈 磒 珐 祙 𧝁  䄎 蒖 禥 樭 𣻺 +- 稺 秴 䅮 𡛦 䄲 鈵 秱 𠵌 𤦌 𠊙 𣶺 𡝮 㖗 啫 㕰 㚪 +- 𠇔  竢 婙 𢛵  𥪜 娍 𠉛 磰 娪 𥯆 竾 䇹 籝 籭 +- 䈑 𥮳 𥺼 𥺦 糍 𤧹  粎 籼 粮 檲 緜 縇 緓 罎 𦉡 +- 𦅜  綗 𥺂 䉪  𠤖 柖 𠁎 𣗏 埄 𦐒  𤥢 翝 笧 +- 𠠬 𥫩 𥵃 笌 𥸎 駦 虅 驣 樜  㧢 𤧷 𦖭 騟  蒀 +- 𧄧  䓪 脷 䐂 胆 脉 腂 𦞴 飃 𦩂 艢 艥 𦩑 葓 𦶧 +- 蘐 𧈛 媆 䅿  嬫 𡢡 嫤 𡣘 蚠  蠭 𧐢 娂 衮 +- 佅 袇 袿 裦 襥 襍 𥚃 襔 𧞅 𧞄  𨯙 𨮜 𨧹 㺭 蒣 +- 䛵 䛏 㟲 訽 訜 𩑈 彍 鈫  旔 焩 烄 𡡅 鵭 貟 賩 +- 𧷜 妚 矃 姰 䍮 㛔 踪 躧 𤰉 輰 轊 䋴 汘 澻 𢌡 䢛 +- 潹 溋 𡟚 鯩 㚵 𤤯 邻 啱 䤆 醻 鐄 𨩋 䁢  鐧 𨰝 +-  蓥 訫 閙 閧 閗 閖 𨴴 瑅 㻂 𤣿   㻧 𣈥 随 +-  𨹦 𨹥 㻌  𤩸 𣿮 琒 瑫 㻼 靁 𩂰 桇 䨝   +- 鍨 𨦉  𨬯 𦎾 銺 嬑 譩 䤼 珹 𤈛 鞛 靱 餸  巁 +- 𨯅 𤪲 頟 𩓚 鋶  釥 䓀 𨭐 𤩧 𨭤 飜 𨩅 㼀 鈪 䤥 +- 萔 餻 饍  㷽 馛 䭯 馪 驜 𨭥  檏 騡 嫾 騯  +- 䮐  馼 䮽 䮗 鍽 塲 𡌂 堢 𤦸 𡓨 硄 𢜟 𣶸 棅 㵽 +- 鑘 㤧 慐 𢞁 𢥫 愇 鱏 鱓 鱻 鰵 鰐 魿 鯏 𩸭 鮟  +- 𪃾 鴡 䲮 𤄄 鸘 䲰 鴌   𪃳 𩤯 鶥 蒽  𦿟  +- 藼 䔳 𦶤 𦺄 𦷰 萠 藮  𣟗 𦁤 秢 𣖜 𣙀 䤭 𤧞 㵢 +- 鏛 銾 鍈 𠊿 碹 鉷 鑍 俤 㑀 遤 𥕝 砽 硔 碶 硋 𡝗 +- 𣇉 𤥁 㚚 佲 濚 濙 瀞 吔  垻 壳 垊 鴖 埗 焴 㒯 +-  燫  𤾗 𡞵 𨩉 愌 嫎 娋 䊼 𤒈 㜬 䭻 𨧼 鎻 鎸 +- 𡣖  葲 𦳀  𤋺 𢰦 𤏁 妔 𣶷 𦝁 綨 𦅛 𦂤 𤦹 𤦋 +- 𨧺 鋥 珢 㻩 璴 𨭣 𡢟 㻡 𤪳 櫘 珳 珻 㻖 𤨾 𤪔 𡟙 +- 𤩦 𠎧   瑈 𤤖 炥 𤥶 銄 珦 鍟 𠓾 錱  𨨖 鎆 +- 𨯧 𥗕 䤵 𨪂 煫   嚤 𠘚   唂 秄 𡟺 緾 𡛂 +- 𤩐  䔮 鐁 㜊  𤦭 妰 𡢿 𡢃 𧒄 媡 㛢 𣵛 㚰 鉟 +- 婹 𨪁 𡡢 鍴 㳍 𠪴 䪖 㦊 僴 㵩 㵌 𡎜 煵 䋻  渏 +- 𩃤 䓫 浗 𧹏 灧 沯 㳖 𣿭 𣸭 渂 漌 㵯 𠏵 畑 㚼 㓈 +- 䚀 㻚 䡱 姄 鉮 䤾 轁   堒 埈 㛖 𡑒 烾 𤍢  +- 𢿣 𡊰 𢎽 梹 楧  𣓥 𧯴 𣛟 𨪃 𣟖  𤲟 樚 𣚭 𦲷 +- 萾 䓟 䓎 𦴦  𦲂 𦿞 漗 𧄉 茽 𡜺 菭 𦲀 𧁓 𡟛 妉 +- 媂 𡞳 婡 婱 𡤅 𤇼 㜭 姯 𡜼 㛇 熎 鎐 暚 𤊥 婮 娫 +-  樫 𣻹 𧜶 𤑛 𤋊 焝 𤉙 𨧡 侰 𦴨 峂 𤓎 𧹍 𤎽 樌 +- 𤉖 𡌄 炦 焳 𤏩 㶥 泟  𤩏 繥 姫 崯 㷳 彜   +- 綤 萦 咅  𣌀 𠈔 坾  𠘙 㿥   瀃  嵰 玏 +- 糓 𨩙  俈 翧 狍 猐 𧫴 猸 猹 𥛶 獁 獈 㺩 𧬘 遬 +- 燵  珡 臶 㻊 県 㻑 沢 国 琙 琞 琟 㻢 㻰 㻴 㻺 +- 瓓 㼎 㽓 畂 畭 畲 疍 㽼 痈 痜 㿀 癍 㿗 癴 㿜 発 +- 𤽜 熈 嘣 覀 塩 䀝 睃 䀹 条 䁅 㗛 瞘 䁪 䁯 属 瞾 +- 矋 売 砘 点 砜 䂨 砹 硇 硑 硦 葈  礳 栃 礲 䄃 +- 䄉 禑 禙 辻 稆 込 䅧 窑 䆲 窼 艹 䇄 竏 竛 䇏 両 +- 筢 筬 筻 簒 簛 䉠 䉺 类 粜 䊌 粸 䊔 糭 输 烀 𠳏 +- 総 緔 緐 緽 羮 羴 犟 䎗 耠 耥 笹 耮 耱 联 㷌 垴 +- 炠 肷 胩 䏭 脌 猪 脎 脒 畠 脔 䐁 㬹 腖 腙 腚 䐓 +- 堺 腼 膄 䐥 膓 䐭 膥 埯 臁 臤 艔 䒏 芦 艶 苊 苘 +- 苿 䒰 荗 险 榊 萅 烵 葤 惣 蒈 䔄 蒾 蓡 蓸 蔐 蔸 +- 蕒 䔻 蕯 蕰 藠 䕷 虲 蚒 蚲 蛯 际 螋 䘆 䘗 袮 裿 +- 褤 襇 覑 𧥧 訩 訸 誔 誴 豑 賔 賲 贜 䞘 塟 跃 䟭 +- 仮 踺 嗘 坔 蹱 嗵 躰 䠷 軎 転 軤 軭 軲 辷 迁 迊 +- 迌 逳 駄 䢭 飠 鈓 䤞 鈨 鉘 鉫 銱 銮 銿 鋣 鋫 鋳 +- 鋴 鋽 鍃 鎄 鎭 䥅 䥑 麿 鐗 匁 鐝 鐭 鐾 䥪 鑔 鑹 +- 锭 関 䦧 间 阳 䧥 枠 䨤 靀 䨵 鞲 韂 噔 䫤 惨 颹 +- 䬙 飱 塄 餎 餙 冴 餜 餷 饂 饝 饢 䭰 駅 䮝 騼 鬏 +- 窃 魩 鮁 鯝 鯱 鯴 䱭 鰠 㝯  鵉 鰺 黾 噐 鶓 鶽 +- 鷀 鷼 银 辶 鹻 麬 麱 麽 黆 铜 黢 黱 黸 竈 齄  +-   椚 铃 妬  塀 铁 㞹     块 煳  +-   呪   咞   𠱓   惧  噺   +-     楕 鰯 螥  𠸎   𠼭  尠  帋 +-   𡁶 朞 𡁻   㙇     卤 蒭 𡋣  +-  讁     乸 炻         +- 拃 𡻕  熘 桕  槩 㛈 𢉼      苽  +-  𢫕 覥  辠  鞸  顇 骽     𢴈  +-          徱 晈 暿    𤦺 +-   𠍆 墵 朎 椘  𧙗 𥿢   𧗾 𢂚 䣐 䪸  +- 𨪚   𤀻  𤎖   凒 𠘑 妟 𡺨 㮾 𣳿   +- 垈  㦛    㝢 𢇃 譞 𨭎    爉  𠱸 +- 奥   𠝹 軚  劏 圿 煱    𤪧 喼  𥑮 +- 𦭒 㑳  𧘲  䜘  𥕦 𥟇 𤤿  偦 㓻   䝼 +- 𨥈 𥪮  𥰆  垡 煑  𧰒 遖  𤾚 譢   嵛 +- 𦯷   諪 𤧶  𣿯 𦔒 䯀   𢜛 鑥 𥟡 憕 娧 +- 晉 嚹 𤔡  乪  陖 涏 𦲽 㘘 襷  𦡮 𦐑 𦡞  +- 筂  𠨑   穅 𦧺 騦  㙟   禃   崬 +-   䛐  画 补  墶 㜜 𢖍   㱔   銁 +- 𢅺  錰 𧋦  氹 钟  𠻸 蠧 裵   𡞱 溸 𤨪 +-  㦤 㚹 䔿 暶 𩲭 𩢤 襃   囖 䃟 𡘊 㦡 𣜯  +- 𡏅 熭 荦  𩆨 䲷 𧂯 𨦫     𤅺 筃 祾 𨀉 +- 澵 𪋟 樃  厢  鎿 栶 靝 𨅯  𦦵 𡏭 𣈯  嶅 +- 𨰰  圕 頣 𨥉 嶫 𤦈 斾 槕 叒 𤪥 𣾁 㰑 朶  𨃴 +- 𨄮 𡾡        㗊  𨚪 䣺 揦  砈 +- 鉕  䏲  䏟    姸    𩄐  㷷  +-  运 犏 嚋  𩗩      𩥪   𩬎  +-  纟  𩼣 䲤 镇  熢  䶑 递  䶜 𠲜 达 嗁 +- 辺  边 𤪓 䔉 繿 潖 檱 仪 㓤 𨬬  㜺 躀 𡟵  +- 𨭬 𨮙  𦚯 㷫 𧙕 𣲷 𥘵 𥥖 亚 𥺁 𦉘 嚿 𠹭 踎 孭 +- 𣺈 𤲞 揞 𡟶 𡡻 攰 嘭 𥱊 吚 𥌑 㷆  䱽 嘢 嘞 罉 +- 𥻘 奵  蝰 东 𠿪 𠵉 𣚺 脗 鵞 贘 瘻 鱅 癎 瞹 鍅 +- 吲 腈 苷 嘥 脲 萘 肽 嗪 祢 噃 吖  㗎 嘅 嗱 曱 +- 𨋢 㘭 甴 嗰 喺 咗 啲 𠱁  廐 𥅈 𠹶   麫 絚 +- 嗞 𡁵 抝 靭 咔 賍 燶 酶 揼 掹 揾 啩  鱲  冚 +- 㓟 𠶧 冧 呍 唞 唓 癦 踭  疱 肶 蠄 螆 裇 膶 萜 +- 𡃁 䓬 猄 𤜆 宐 茋 𦢓 噻 𢛴 𧴯 𤆣 𧵳 𦻐  酰 𡇙 +- 鈈 𣳼 𪚩 𠺬 𠻹 牦 𡲢 䝎 𤿂  𠿫 䃺 鱝 攟 𢶠 䣳 +-  𩵼 𠿬 𠸊  𠿭  𡆇 熣 纎 鵐 业 丄 㕷 嬍 沲 +- 卧 㚬 㧜 卽 㚥  墚 𤭮 舭 呋 垪  𠥹 㩒 𢑥 獴 +- 𩺬 䴉 鯭 𣳾 𩼰 䱛 𤾩 𩖞  葜 𣶶  𦞳 𣜠 挮 紥 +- 𣻷 𣸬 㨪 逈 勌 㹴 㙺 䗩  癀 嫰 𠺶 硺 䞶 墧 䂿 +- 噼 鮋 嵴 癔  麅 䳡 㟻 愙 𣃚 𤏲 噝 𡊩 垧 𤥣  +- 刴 𧂮 㖭 鵼 籖 鬹 埞 𡝬 屓 擓   𧅤 蚭  𦴢 +- 𤫢  凾  嶎 霃 𡷑 麁 遌 笟 鬂 峑 箣 扨 挵 髿 +- 篏 鬪 籾 籂 粆 鰕 篼 鬉 鰛 𤤾 齚 啳 寃 俽 麘 俲 +- 剠 㸆 勑 坧 偖 妷 帒 韈 鶫 轜 呩 鞴 饀 鞺 匬 愰 +- 椬 叚 鰊 鴂 䰻 陁 榀 傦 畆 𡝭 駚 剳 酙 隁 酜 酑 +-  捿 𦴣 櫊 嘑 醎 畺 抅 𠏼 獏 籰  𣳽 𤤙 盖 鮝 +- 个 𠳔 莾 衂 届 槀 坺 刟 巵 从 氱  伹 咜 哚 劚 +- 趂 㗾 㗳 歒 酼 龥 鮗 頮 颴 骺 麨 麄 煺 笔 毺 蠘 +- 罸 嘠  蹷 齓 跔 蹏 鸜 踁 抂 𨍽 踨 蹵 竓 𤩷 稾 +- 磘 泪 詧 瘇 𨩚 鼦 泎 蟖 痃 𪊲 硓 咢 贌 狢 獱 謭 +- 猂 瓱 賫 𤪻 蘯 徺 袠 䒷 𡠻 𦸅 詾 𢔛 惽 癧 髗 鵄 +- 鍮 鮏 蟵 賷 猬 霡 鮰 㗖 犲 䰇 籑 饊 𦅙 慙 䰄 麖 +- 慽 坟 慯 抦 戹 㩜 懢 厪 𣏵 捤 栂 㗒 嵗 𨯂 迚  +- 僙 𡵆 礆 匲 阸 𠼻 䁥 矾 糂  糚 稭 聦 聣 絍 甅 +- 瓲 覔 舚 朌 聢 𧒆 聛 瓰 脃 眤 覉 𦟌 畓 𦻑 螩 蟎 +- 臈 螌 詉 貭 譃 眫 瓸 蓚 㘵 榲 趦 覩 涹 蟁 𤀑 瓧 +- 㷛 煶 悤 憜 㳑 恷 罱 𨬭 惩 䭾 删 㰘 𣳇 𥻗 𧙖  +- 𡥄 𡋾 𩤃 𦷜 𧂭 峁 𦆭 𨨏 𣙷 𠃮  𤼎 䕢 嬟  齐 +- 麦    , 、 。 . • ; : ? ! ︰ … ‥ ﹐ +- 、 ﹒ · ﹔ ﹕ ﹖ ﹗ | – ︱ — ︳ ︴ ﹏ ( ) +- ︵ ︶ { } ︷ ︸ 〔 〕 ︹ ︺ 【 】 ︻ ︼ 《 》 +- ︽ ︾ 〈 〉 ︿ ﹀ 「 」 ﹁ ﹂ 『 』 ﹃ ﹄ ﹙ ﹚ +- ﹛ ﹜ ﹝ ﹞ ‘ ’ “ ” 〝 〞 ‵ ′ # & * ※ +- § 〃 ○ ● △ ▲ ◎ ☆ ★ ◇ ◆ □ ■ ▽ ▼ ㊣ +- ℅ ‾ _ ﹉ ﹊ ﹍ ﹎ ﹋ ﹌ ﹟ ﹠ ﹡ + - × ÷ +- ± √ < > = ≦ ≧ ≠ ∞ ≒ ≡ ﹢ ﹣ ﹤ ﹥ ﹦ +- ∼ ∩ ∪ ⊥ ∠ ∟ ⊿ ㏒ ㏑ ∫ ∮ ∵ ∴ ♀ ♂ ♁ +- ☉ ↑ ↓ ← → ↖ ↗ ↙ ↘ ∥ ∣ / \ $ ¥ 〒 +- ¢ £ % @ ℃ ℉ ﹩ ﹪ ﹫ ㏕ ㎜ ㎝ ㎞ ㏎ ㎡ ㎎ +- ㎏ ㏄ ° 兙 兛 兞 兝 兡 兣 嗧 瓩 糎 ▁ ▂ ▃ ▄ +- ▅ ▆ ▇ █ ▏ ▎ ▍ ▌ ▋ ▊ ▉ ┼ ┴ ┬ ┤ ├ +- ▔ ─ │ ▕ ┌ ┐ └ ┘ ◢ ◣ ◥ ◤ ╱ ╲ ╳ 0 +- 1 2 3 4 5 6 7 8 9 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ +- Ⅷ Ⅸ Ⅹ 〡 〢 〣 〤 〥 〦 〧 〨 〩 卄 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 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 Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο +- Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η +- θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ +- ω ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ +- ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ +- ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ˙ ˉ ˊ ˇ ˋ 一 乙 丁 七 乃 +- 九 了 二 人 儿 入 八 几 刀 刁 力 匕 十 卜 又 三 +- 下 丈 上 丫 丸 凡 久 么 也 乞 于 亡 兀 刃 勺 千 +- 叉 口 土 士 夕 大 女 子 孑 孓 寸 小 尢 尸 山 川 +- 工 己 已 巳 巾 干 廾 弋 弓 才 丑 丐 不 中 丰 丹 +- 之 尹 予 云 井 互 五 亢 仁 什 仃 仆 仇 仍 今 介 +- 仄 元 允 內 六 兮 公 冗 凶 分 切 刈 勻 勾 勿 化 +- 匹 午 升 卅 卞 厄 友 及 反 壬 天 夫 太 夭 孔 少 +- 尤 尺 屯 巴 幻 廿 弔 引 心 戈 戶 手 扎 支 文 斗 +- 斤 方 日 曰 月 木 欠 止 歹 毋 比 毛 氏 水 火 爪 +- 父 爻 片 牙 牛 犬 王 丙 世 丕 且 丘 主 乍 乏 乎 +- 以 付 仔 仕 他 仗 代 令 仙 仞 充 兄 冉 冊 冬 凹 +- 出 凸 刊 加 功 包 匆 北 匝 仟 半 卉 卡 占 卯 卮 +- 去 可 古 右 召 叮 叩 叨 叼 司 叵 叫 另 只 史 叱 +- 台 句 叭 叻 四 囚 外 央 失 奴 奶 孕 它 尼 巨 巧 +- 左 市 布 平 幼 弁 弘 弗 必 戊 打 扔 扒 扑 斥 旦 +- 朮 本 未 末 札 正 母 民 氐 永 汁 汀 氾 犯 玄 玉 +- 瓜 瓦 甘 生 用 甩 田 由 甲 申 疋 白 皮 皿 目 矛 +- 矢 石 示 禾 穴 立 丞 丟 乒 乓 乩 亙 交 亦 亥 仿 +- 伉 伙 伊 伕 伍 伐 休 伏 仲 件 任 仰 仳 份 企 伋 +- 光 兇 兆 先 全 共 再 冰 列 刑 划 刎 刖 劣 匈 匡 +- 匠 印 危 吉 吏 同 吊 吐 吁 吋 各 向 名 合 吃 后 +- 吆 吒 因 回 囝 圳 地 在 圭 圬 圯 圩 夙 多 夷 夸 +- 妄 奸 妃 好 她 如 妁 字 存 宇 守 宅 安 寺 尖 屹 +- 州 帆 并 年 式 弛 忙 忖 戎 戌 戍 成 扣 扛 托 收 +- 早 旨 旬 旭 曲 曳 有 朽 朴 朱 朵 次 此 死 氖 汝 +- 汗 汙 江 池 汐 汕 污 汛 汍 汎 灰 牟 牝 百 竹 米 +- 糸 缶 羊 羽 老 考 而 耒 耳 聿 肉 肋 肌 臣 自 至 +- 臼 舌 舛 舟 艮 色 艾 虫 血 行 衣 西 阡 串 亨 位 +- 住 佇 佗 佞 伴 佛 何 估 佐 佑 伽 伺 伸 佃 佔 似 +- 但 佣 作 你 伯 低 伶 余 佝 佈 佚 兌 克 免 兵 冶 +- 冷 別 判 利 刪 刨 劫 助 努 劬 匣 即 卵 吝 吭 吞 +- 吾 否 呎 吧 呆 呃 吳 呈 呂 君 吩 告 吹 吻 吸 吮 +- 吵 吶 吠 吼 呀 吱 含 吟 听 囪 困 囤 囫 坊 坑 址 +- 坍 均 坎 圾 坐 坏 圻 壯 夾 妝 妒 妨 妞 妣 妙 妖 +- 妍 妤 妓 妊 妥 孝 孜 孚 孛 完 宋 宏 尬 局 屁 尿 +- 尾 岐 岑 岔 岌 巫 希 序 庇 床 廷 弄 弟 彤 形 彷 +- 役 忘 忌 志 忍 忱 快 忸 忪 戒 我 抄 抗 抖 技 扶 +- 抉 扭 把 扼 找 批 扳 抒 扯 折 扮 投 抓 抑 抆 改 +- 攻 攸 旱 更 束 李 杏 材 村 杜 杖 杞 杉 杆 杠 杓 +- 杗 步 每 求 汞 沙 沁 沈 沉 沅 沛 汪 決 沐 汰 沌 +- 汨 沖 沒 汽 沃 汲 汾 汴 沆 汶 沍 沔 沘 沂 灶 灼 +- 災 灸 牢 牡 牠 狄 狂 玖 甬 甫 男 甸 皂 盯 矣 私 +- 秀 禿 究 系 罕 肖 肓 肝 肘 肛 肚 育 良 芒 芋 芍 +- 見 角 言 谷 豆 豕 貝 赤 走 足 身 車 辛 辰 迂 迆 +- 迅 迄 巡 邑 邢 邪 邦 那 酉 釆 里 防 阮 阱 阪 阬 +- 並 乖 乳 事 些 亞 享 京 佯 依 侍 佳 使 佬 供 例 +- 來 侃 佰 併 侈 佩 佻 侖 佾 侏 侑 佺 兔 兒 兕 兩 +- 具 其 典 冽 函 刻 券 刷 刺 到 刮 制 剁 劾 劻 卒 +- 協 卓 卑 卦 卷 卸 卹 取 叔 受 味 呵 咖 呸 咕 咀 +- 呻 呷 咄 咒 咆 呼 咐 呱 呶 和 咚 呢 周 咋 命 咎 +- 固 垃 坷 坪 坩 坡 坦 坤 坼 夜 奉 奇 奈 奄 奔 妾 +- 妻 委 妹 妮 姑 姆 姐 姍 始 姓 姊 妯 妳 姒 姅 孟 +- 孤 季 宗 定 官 宜 宙 宛 尚 屈 居 屆 岷 岡 岸 岩 +- 岫 岱 岳 帘 帚 帖 帕 帛 帑 幸 庚 店 府 底 庖 延 +- 弦 弧 弩 往 征 彿 彼 忝 忠 忽 念 忿 怏 怔 怯 怵 +- 怖 怪 怕 怡 性 怩 怫 怛 或 戕 房 戾 所 承 拉 拌 +- 拄 抿 拂 抹 拒 招 披 拓 拔 拋 拈 抨 抽 押 拐 拙 +- 拇 拍 抵 拚 抱 拘 拖 拗 拆 抬 拎 放 斧 於 旺 昔 +- 易 昌 昆 昂 明 昀 昏 昕 昊 昇 服 朋 杭 枋 枕 東 +- 果 杳 杷 枇 枝 林 杯 杰 板 枉 松 析 杵 枚 枓 杼 +- 杪 杲 欣 武 歧 歿 氓 氛 泣 注 泳 沱 泌 泥 河 沽 +- 沾 沼 波 沫 法 泓 沸 泄 油 況 沮 泗 泅 泱 沿 治 +- 泡 泛 泊 沬 泯 泜 泖 泠 炕 炎 炒 炊 炙 爬 爭 爸 +- 版 牧 物 狀 狎 狙 狗 狐 玩 玨 玟 玫 玥 甽 疝 疙 +- 疚 的 盂 盲 直 知 矽 社 祀 祁 秉 秈 空 穹 竺 糾 +- 罔 羌 羋 者 肺 肥 肢 肱 股 肫 肩 肴 肪 肯 臥 臾 +- 舍 芳 芝 芙 芭 芽 芟 芹 花 芬 芥 芯 芸 芣 芰 芾 +- 芷 虎 虱 初 表 軋 迎 返 近 邵 邸 邱 邶 采 金 長 +- 門 阜 陀 阿 阻 附 陂 隹 雨 青 非 亟 亭 亮 信 侵 +- 侯 便 俠 俑 俏 保 促 侶 俘 俟 俊 俗 侮 俐 俄 係 +- 俚 俎 俞 侷 兗 冒 冑 冠 剎 剃 削 前 剌 剋 則 勇 +- 勉 勃 勁 匍 南 卻 厚 叛 咬 哀 咨 哎 哉 咸 咦 咳 +- 哇 哂 咽 咪 品 哄 哈 咯 咫 咱 咻 咩 咧 咿 囿 垂 +- 型 垠 垣 垢 城 垮 垓 奕 契 奏 奎 奐 姜 姘 姿 姣 +- 姨 娃 姥 姪 姚 姦 威 姻 孩 宣 宦 室 客 宥 封 屎 +- 屏 屍 屋 峙 峒 巷 帝 帥 帟 幽 庠 度 建 弈 弭 彥 +- 很 待 徊 律 徇 後 徉 怒 思 怠 急 怎 怨 恍 恰 恨 +- 恢 恆 恃 恬 恫 恪 恤 扁 拜 挖 按 拼 拭 持 拮 拽 +- 指 拱 拷 拯 括 拾 拴 挑 挂 政 故 斫 施 既 春 昭 +- 映 昧 是 星 昨 昱 昤 曷 柿 染 柱 柔 某 柬 架 枯 +- 柵 柩 柯 柄 柑 枴 柚 查 枸 柏 柞 柳 枰 柙 柢 柝 +- 柒 歪 殃 殆 段 毒 毗 氟 泉 洋 洲 洪 流 津 洌 洱 +- 洞 洗 活 洽 派 洶 洛 泵 洹 洧 洸 洩 洮 洵 洎 洫 +- 炫 為 炳 炬 炯 炭 炸 炮 炤 爰 牲 牯 牴 狩 狠 狡 +- 玷 珊 玻 玲 珍 珀 玳 甚 甭 畏 界 畎 畋 疫 疤 疥 +- 疢 疣 癸 皆 皇 皈 盈 盆 盃 盅 省 盹 相 眉 看 盾 +- 盼 眇 矜 砂 研 砌 砍 祆 祉 祈 祇 禹 禺 科 秒 秋 +- 穿 突 竿 竽 籽 紂 紅 紀 紉 紇 約 紆 缸 美 羿 耄 +- 耐 耍 耑 耶 胖 胥 胚 胃 胄 背 胡 胛 胎 胞 胤 胝 +- 致 舢 苧 范 茅 苣 苛 苦 茄 若 茂 茉 苒 苗 英 茁 +- 苜 苔 苑 苞 苓 苟 苯 茆 虐 虹 虻 虺 衍 衫 要 觔 +- 計 訂 訃 貞 負 赴 赳 趴 軍 軌 述 迦 迢 迪 迥 迭 +- 迫 迤 迨 郊 郎 郁 郃 酋 酊 重 閂 限 陋 陌 降 面 +- 革 韋 韭 音 頁 風 飛 食 首 香 乘 亳 倌 倍 倣 俯 +- 倦 倥 俸 倩 倖 倆 值 借 倚 倒 們 俺 倀 倔 倨 俱 +- 倡 個 候 倘 俳 修 倭 倪 俾 倫 倉 兼 冤 冥 冢 凍 +- 凌 准 凋 剖 剜 剔 剛 剝 匪 卿 原 厝 叟 哨 唐 唁 +- 唷 哼 哥 哲 唆 哺 唔 哩 哭 員 唉 哮 哪 哦 唧 唇 +- 哽 唏 圃 圄 埂 埔 埋 埃 堉 夏 套 奘 奚 娑 娘 娜 +- 娟 娛 娓 姬 娠 娣 娩 娥 娌 娉 孫 屘 宰 害 家 宴 +- 宮 宵 容 宸 射 屑 展 屐 峭 峽 峻 峪 峨 峰 島 崁 +- 峴 差 席 師 庫 庭 座 弱 徒 徑 徐 恙 恣 恥 恐 恕 +- 恭 恩 息 悄 悟 悚 悍 悔 悌 悅 悖 扇 拳 挈 拿 捎 +- 挾 振 捕 捂 捆 捏 捉 挺 捐 挽 挪 挫 挨 捍 捌 效 +- 敉 料 旁 旅 時 晉 晏 晃 晒 晌 晅 晁 書 朔 朕 朗 +- 校 核 案 框 桓 根 桂 桔 栩 梳 栗 桌 桑 栽 柴 桐 +- 桀 格 桃 株 桅 栓 栘 桁 殊 殉 殷 氣 氧 氨 氦 氤 +- 泰 浪 涕 消 涇 浦 浸 海 浙 涓 浬 涉 浮 浚 浴 浩 +- 涌 涊 浹 涅 浥 涔 烊 烘 烤 烙 烈 烏 爹 特 狼 狹 +- 狽 狸 狷 玆 班 琉 珮 珠 珪 珞 畔 畝 畜 畚 留 疾 +- 病 症 疲 疳 疽 疼 疹 痂 疸 皋 皰 益 盍 盎 眩 真 +- 眠 眨 矩 砰 砧 砸 砝 破 砷 砥 砭 砠 砟 砲 祕 祐 +- 祠 祟 祖 神 祝 祗 祚 秤 秣 秧 租 秦 秩 秘 窄 窈 +- 站 笆 笑 粉 紡 紗 紋 紊 素 索 純 紐 紕 級 紜 納 +- 紙 紛 缺 罟 羔 翅 翁 耆 耘 耕 耙 耗 耽 耿 胱 脂 +- 胰 脅 胭 胴 脆 胸 胳 脈 能 脊 胼 胯 臭 臬 舀 舐 +- 航 舫 舨 般 芻 茫 荒 荔 荊 茸 荐 草 茵 茴 荏 茲 +- 茹 茶 茗 荀 茱 茨 荃 虔 蚊 蚪 蚓 蚤 蚩 蚌 蚣 蚜 +- 衰 衷 袁 袂 衽 衹 記 訐 討 訌 訕 訊 託 訓 訖 訏 +- 訑 豈 豺 豹 財 貢 起 躬 軒 軔 軏 辱 送 逆 迷 退 +- 迺 迴 逃 追 逅 迸 邕 郡 郝 郢 酒 配 酌 釘 針 釗 +- 釜 釙 閃 院 陣 陡 陛 陝 除 陘 陞 隻 飢 馬 骨 高 +- 鬥 鬲 鬼 乾 偺 偽 停 假 偃 偌 做 偉 健 偶 偎 偕 +- 偵 側 偷 偏 倏 偯 偭 兜 冕 凰 剪 副 勒 務 勘 動 +- 匐 匏 匙 匿 區 匾 參 曼 商 啪 啦 啄 啞 啡 啃 啊 +- 唱 啖 問 啕 唯 啤 唸 售 啜 唬 啣 唳 啁 啗 圈 國 +- 圉 域 堅 堊 堆 埠 埤 基 堂 堵 執 培 夠 奢 娶 婁 +- 婉 婦 婪 婀 娼 婢 婚 婆 婊 孰 寇 寅 寄 寂 宿 密 +- 尉 專 將 屠 屜 屝 崇 崆 崎 崛 崖 崢 崑 崩 崔 崙 +- 崤 崧 崗 巢 常 帶 帳 帷 康 庸 庶 庵 庾 張 強 彗 +- 彬 彩 彫 得 徙 從 徘 御 徠 徜 恿 患 悉 悠 您 惋 +- 悴 惦 悽 情 悻 悵 惜 悼 惘 惕 惆 惟 悸 惚 惇 戚 +- 戛 扈 掠 控 捲 掖 探 接 捷 捧 掘 措 捱 掩 掉 掃 +- 掛 捫 推 掄 授 掙 採 掬 排 掏 掀 捻 捩 捨 捺 敝 +- 敖 救 教 敗 啟 敏 敘 敕 敔 斜 斛 斬 族 旋 旌 旎 +- 晝 晚 晤 晨 晦 晞 曹 勗 望 梁 梯 梢 梓 梵 桿 桶 +- 梱 梧 梗 械 梃 棄 梭 梆 梅 梔 條 梨 梟 梡 梂 欲 +- 殺 毫 毬 氫 涎 涼 淳 淙 液 淡 淌 淤 添 淺 清 淇 +- 淋 涯 淑 涮 淞 淹 涸 混 淵 淅 淒 渚 涵 淚 淫 淘 +- 淪 深 淮 淨 淆 淄 涪 淬 涿 淦 烹 焉 焊 烽 烯 爽 +- 牽 犁 猜 猛 猖 猓 猙 率 琅 琊 球 理 現 琍 瓠 瓶 +- 瓷 甜 產 略 畦 畢 異 疏 痔 痕 疵 痊 痍 皎 盔 盒 +- 盛 眷 眾 眼 眶 眸 眺 硫 硃 硎 祥 票 祭 移 窒 窕 +- 笠 笨 笛 第 符 笙 笞 笮 粒 粗 粕 絆 絃 統 紮 紹 +- 紼 絀 細 紳 組 累 終 紲 紱 缽 羞 羚 翌 翎 習 耜 +- 聊 聆 脯 脖 脣 脫 脩 脰 脤 舂 舵 舷 舶 船 莎 莞 +- 莘 荸 莢 莖 莽 莫 莒 莊 莓 莉 莠 荷 荻 荼 莆 莧 +- 處 彪 蛇 蛀 蚶 蛄 蚵 蛆 蛋 蚱 蚯 蛉 術 袞 袈 被 +- 袒 袖 袍 袋 覓 規 訪 訝 訣 訥 許 設 訟 訛 訢 豉 +- 豚 販 責 貫 貨 貪 貧 赧 赦 趾 趺 軛 軟 這 逍 通 +- 逗 連 速 逝 逐 逕 逞 造 透 逢 逖 逛 途 部 郭 都 +- 酗 野 釵 釦 釣 釧 釭 釩 閉 陪 陵 陳 陸 陰 陴 陶 +- 陷 陬 雀 雪 雩 章 竟 頂 頃 魚 鳥 鹵 鹿 麥 麻 傢 +- 傍 傅 備 傑 傀 傖 傘 傚 最 凱 割 剴 創 剩 勞 勝 +- 勛 博 厥 啻 喀 喧 啼 喊 喝 喘 喂 喜 喪 喔 喇 喋 +- 喃 喳 單 喟 唾 喲 喚 喻 喬 喱 啾 喉 喫 喙 圍 堯 +- 堪 場 堤 堰 報 堡 堝 堠 壹 壺 奠 婷 媚 婿 媒 媛 +- 媧 孳 孱 寒 富 寓 寐 尊 尋 就 嵌 嵐 崴 嵇 巽 幅 +- 帽 幀 幃 幾 廊 廁 廂 廄 弼 彭 復 循 徨 惑 惡 悲 +- 悶 惠 愜 愣 惺 愕 惰 惻 惴 慨 惱 愎 惶 愉 愀 愒 +- 戟 扉 掣 掌 描 揀 揩 揉 揆 揍 插 揣 提 握 揖 揭 +- 揮 捶 援 揪 換 摒 揚 揹 敞 敦 敢 散 斑 斐 斯 普 +- 晰 晴 晶 景 暑 智 晾 晷 曾 替 期 朝 棺 棕 棠 棘 +- 棗 椅 棟 棵 森 棧 棹 棒 棲 棣 棋 棍 植 椒 椎 棉 +- 棚 楮 棻 款 欺 欽 殘 殖 殼 毯 氮 氯 氬 港 游 湔 +- 渡 渲 湧 湊 渠 渥 渣 減 湛 湘 渤 湖 湮 渭 渦 湯 +- 渴 湍 渺 測 湃 渝 渾 滋 溉 渙 湎 湣 湄 湲 湩 湟 +- 焙 焚 焦 焰 無 然 煮 焜 牌 犄 犀 猶 猥 猴 猩 琺 +- 琪 琳 琢 琥 琵 琶 琴 琯 琛 琦 琨 甥 甦 畫 番 痢 +- 痛 痣 痙 痘 痞 痠 登 發 皖 皓 皴 盜 睏 短 硝 硬 +- 硯 稍 稈 程 稅 稀 窘 窗 窖 童 竣 等 策 筆 筐 筒 +- 答 筍 筋 筏 筑 粟 粥 絞 結 絨 絕 紫 絮 絲 絡 給 +- 絢 絰 絳 善 翔 翕 耋 聒 肅 腕 腔 腋 腑 腎 脹 腆 +- 脾 腌 腓 腴 舒 舜 菩 萃 菸 萍 菠 菅 萋 菁 華 菱 +- 菴 著 萊 菰 萌 菌 菽 菲 菊 萸 萎 萄 菜 萇 菔 菟 +- 虛 蛟 蛙 蛭 蛔 蛛 蛤 蛐 蛞 街 裁 裂 袱 覃 視 註 +- 詠 評 詞 証 詁 詔 詛 詐 詆 訴 診 訶 詖 象 貂 貯 +- 貼 貳 貽 賁 費 賀 貴 買 貶 貿 貸 越 超 趁 跎 距 +- 跋 跚 跑 跌 跛 跆 軻 軸 軼 辜 逮 逵 週 逸 進 逶 +- 鄂 郵 鄉 郾 酣 酥 量 鈔 鈕 鈣 鈉 鈞 鈍 鈐 鈇 鈑 +- 閔 閏 開 閑 間 閒 閎 隊 階 隋 陽 隅 隆 隍 陲 隄 +- 雁 雅 雄 集 雇 雯 雲 韌 項 順 須 飧 飪 飯 飩 飲 +- 飭 馮 馭 黃 黍 黑 亂 傭 債 傲 傳 僅 傾 催 傷 傻 +- 傯 僇 剿 剷 剽 募 勦 勤 勢 勣 匯 嗟 嗨 嗓 嗦 嗎 +- 嗜 嗇 嗑 嗣 嗤 嗯 嗚 嗡 嗅 嗆 嗥 嗉 園 圓 塞 塑 +- 塘 塗 塚 塔 填 塌 塭 塊 塢 塒 塋 奧 嫁 嫉 嫌 媾 +- 媽 媼 媳 嫂 媲 嵩 嵯 幌 幹 廉 廈 弒 彙 徬 微 愚 +- 意 慈 感 想 愛 惹 愁 愈 慎 慌 慄 慍 愾 愴 愧 愍 +- 愆 愷 戡 戢 搓 搾 搞 搪 搭 搽 搬 搏 搜 搔 損 搶 +- 搖 搗 搆 敬 斟 新 暗 暉 暇 暈 暖 暄 暘 暍 會 榔 +- 業 楚 楷 楠 楔 極 椰 概 楊 楨 楫 楞 楓 楹 榆 楝 +- 楣 楛 歇 歲 毀 殿 毓 毽 溢 溯 滓 溶 滂 源 溝 滇 +- 滅 溥 溘 溼 溺 溫 滑 準 溜 滄 滔 溪 溧 溴 煎 煙 +- 煩 煤 煉 照 煜 煬 煦 煌 煥 煞 煆 煨 煖 爺 牒 猷 +- 獅 猿 猾 瑯 瑚 瑕 瑟 瑞 瑁 琿 瑙 瑛 瑜 當 畸 瘀 +- 痰 瘁 痲 痱 痺 痿 痴 痳 盞 盟 睛 睫 睦 睞 督 睹 +- 睪 睬 睜 睥 睨 睢 矮 碎 碰 碗 碘 碌 碉 硼 碑 碓 +- 硿 祺 祿 禁 萬 禽 稜 稚 稠 稔 稟 稞 窟 窠 筷 節 +- 筠 筮 筧 粱 粳 粵 經 絹 綑 綁 綏 絛 置 罩 罪 署 +- 義 羨 群 聖 聘 肆 肄 腱 腰 腸 腥 腮 腳 腫 腹 腺 +- 腦 舅 艇 蒂 葷 落 萱 葵 葦 葫 葉 葬 葛 萼 萵 葡 +- 董 葩 葭 葆 虞 虜 號 蛹 蜓 蜈 蜇 蜀 蛾 蛻 蜂 蜃 +- 蜆 蜊 衙 裟 裔 裙 補 裘 裝 裡 裊 裕 裒 覜 解 詫 +- 該 詳 試 詩 詰 誇 詼 詣 誠 話 誅 詭 詢 詮 詬 詹 +- 詻 訾 詨 豢 貊 貉 賊 資 賈 賄 貲 賃 賂 賅 跡 跟 +- 跨 路 跳 跺 跪 跤 跦 躲 較 載 軾 輊 辟 農 運 遊 +- 道 遂 達 逼 違 遐 遇 遏 過 遍 遑 逾 遁 鄒 鄗 酬 +- 酪 酩 釉 鈷 鉗 鈸 鈽 鉀 鈾 鉛 鉋 鉤 鉑 鈴 鉉 鉍 +- 鉅 鈹 鈿 鉚 閘 隘 隔 隕 雍 雋 雉 雊 雷 電 雹 零 +- 靖 靴 靶 預 頑 頓 頊 頒 頌 飼 飴 飽 飾 馳 馱 馴 +- 髡 鳩 麂 鼎 鼓 鼠 僧 僮 僥 僖 僭 僚 僕 像 僑 僱 +- 僎 僩 兢 凳 劃 劂 匱 厭 嗾 嘀 嘛 嘗 嗽 嘔 嘆 嘉 +- 嘍 嘎 嗷 嘖 嘟 嘈 嘐 嗶 團 圖 塵 塾 境 墓 墊 塹 +- 墅 塽 壽 夥 夢 夤 奪 奩 嫡 嫦 嫩 嫗 嫖 嫘 嫣 孵 +- 寞 寧 寡 寥 實 寨 寢 寤 察 對 屢 嶄 嶇 幛 幣 幕 +- 幗 幔 廓 廖 弊 彆 彰 徹 慇 愿 態 慷 慢 慣 慟 慚 +- 慘 慵 截 撇 摘 摔 撤 摸 摟 摺 摑 摧 搴 摭 摻 敲 +- 斡 旗 旖 暢 暨 暝 榜 榨 榕 槁 榮 槓 構 榛 榷 榻 +- 榫 榴 槐 槍 榭 槌 榦 槃 榣 歉 歌 氳 漳 演 滾 漓 +- 滴 漩 漾 漠 漬 漏 漂 漢 滿 滯 漆 漱 漸 漲 漣 漕 +- 漫 漯 澈 漪 滬 漁 滲 滌 滷 熔 熙 煽 熊 熄 熒 爾 +- 犒 犖 獄 獐 瑤 瑣 瑪 瑰 瑭 甄 疑 瘧 瘍 瘋 瘉 瘓 +- 盡 監 瞄 睽 睿 睡 磁 碟 碧 碳 碩 碣 禎 福 禍 種 +- 稱 窪 窩 竭 端 管 箕 箋 筵 算 箝 箔 箏 箸 箇 箄 +- 粹 粽 精 綻 綰 綜 綽 綾 綠 緊 綴 網 綱 綺 綢 綿 +- 綵 綸 維 緒 緇 綬 罰 翠 翡 翟 聞 聚 肇 腐 膀 膏 +- 膈 膊 腿 膂 臧 臺 與 舔 舞 艋 蓉 蒿 蓆 蓄 蒙 蒞 +- 蒲 蒜 蓋 蒸 蓀 蓓 蒐 蒼 蓑 蓊 蜿 蜜 蜻 蜢 蜥 蜴 +- 蜘 蝕 蜷 蜩 裳 褂 裴 裹 裸 製 裨 褚 裯 誦 誌 語 +- 誣 認 誡 誓 誤 說 誥 誨 誘 誑 誚 誧 豪 貍 貌 賓 +- 賑 賒 赫 趙 趕 跼 輔 輒 輕 輓 辣 遠 遘 遜 遣 遙 +- 遞 遢 遝 遛 鄙 鄘 鄞 酵 酸 酷 酴 鉸 銀 銅 銘 銖 +- 鉻 銓 銜 銨 鉼 銑 閡 閨 閩 閣 閥 閤 隙 障 際 雌 +- 雒 需 靼 鞅 韶 頗 領 颯 颱 餃 餅 餌 餉 駁 骯 骰 +- 髦 魁 魂 鳴 鳶 鳳 麼 鼻 齊 億 儀 僻 僵 價 儂 儈 +- 儉 儅 凜 劇 劈 劉 劍 劊 勰 厲 嘮 嘻 嘹 嘲 嘿 嘴 +- 嘩 噓 噎 噗 噴 嘶 嘯 嘰 墀 墟 增 墳 墜 墮 墩 墦 +- 奭 嬉 嫻 嬋 嫵 嬌 嬈 寮 寬 審 寫 層 履 嶝 嶔 幢 +- 幟 幡 廢 廚 廟 廝 廣 廠 彈 影 德 徵 慶 慧 慮 慝 +- 慕 憂 慼 慰 慫 慾 憧 憐 憫 憎 憬 憚 憤 憔 憮 戮 +- 摩 摯 摹 撞 撲 撈 撐 撰 撥 撓 撕 撩 撒 撮 播 撫 +- 撚 撬 撙 撢 撳 敵 敷 數 暮 暫 暴 暱 樣 樟 槨 樁 +- 樞 標 槽 模 樓 樊 槳 樂 樅 槭 樑 歐 歎 殤 毅 毆 +- 漿 潼 澄 潑 潦 潔 澆 潭 潛 潸 潮 澎 潺 潰 潤 澗 +- 潘 滕 潯 潠 潟 熟 熬 熱 熨 牖 犛 獎 獗 瑩 璋 璃 +- 瑾 璀 畿 瘠 瘩 瘟 瘤 瘦 瘡 瘢 皚 皺 盤 瞎 瞇 瞌 +- 瞑 瞋 磋 磅 確 磊 碾 磕 碼 磐 稿 稼 穀 稽 稷 稻 +- 窯 窮 箭 箱 範 箴 篆 篇 篁 箠 篌 糊 締 練 緯 緻 +- 緘 緬 緝 編 緣 線 緞 緩 綞 緙 緲 緹 罵 罷 羯 翩 +- 耦 膛 膜 膝 膠 膚 膘 蔗 蔽 蔚 蓮 蔬 蔭 蔓 蔑 蔣 +- 蔡 蔔 蓬 蔥 蓿 蔆 螂 蝴 蝶 蝠 蝦 蝸 蝨 蝙 蝗 蝌 +- 蝓 衛 衝 褐 複 褒 褓 褕 褊 誼 諒 談 諄 誕 請 諸 +- 課 諉 諂 調 誰 論 諍 誶 誹 諛 豌 豎 豬 賠 賞 賦 +- 賤 賬 賭 賢 賣 賜 質 賡 赭 趟 趣 踫 踐 踝 踢 踏 +- 踩 踟 踡 踞 躺 輝 輛 輟 輩 輦 輪 輜 輞 輥 適 遮 +- 遨 遭 遷 鄰 鄭 鄧 鄱 醇 醉 醋 醃 鋅 銻 銷 鋪 銬 +- 鋤 鋁 銳 銼 鋒 鋇 鋰 銲 閭 閱 霄 霆 震 霉 靠 鞍 +- 鞋 鞏 頡 頫 頜 颳 養 餓 餒 餘 駝 駐 駟 駛 駑 駕 +- 駒 駙 骷 髮 髯 鬧 魅 魄 魷 魯 鴆 鴉 鴃 麩 麾 黎 +- 墨 齒 儒 儘 儔 儐 儕 冀 冪 凝 劑 劓 勳 噙 噫 噹 +- 噩 噤 噸 噪 器 噥 噱 噯 噬 噢 噶 壁 墾 壇 壅 奮 +- 嬝 嬴 學 寰 導 彊 憲 憑 憩 憊 懍 憶 憾 懊 懈 戰 +- 擅 擁 擋 撻 撼 據 擄 擇 擂 操 撿 擒 擔 撾 整 曆 +- 曉 暹 曄 曇 暸 樽 樸 樺 橙 橫 橘 樹 橄 橢 橡 橋 +- 橇 樵 機 橈 歙 歷 氅 濂 澱 澡 濃 澤 濁 澧 澳 激 +- 澹 澶 澦 澠 澴 熾 燉 燐 燒 燈 燕 熹 燎 燙 燜 燃 +- 燄 獨 璜 璣 璘 璟 璞 瓢 甌 甍 瘴 瘸 瘺 盧 盥 瞠 +- 瞞 瞟 瞥 磨 磚 磬 磧 禦 積 穎 穆 穌 穋 窺 篙 簑 +- 築 篤 篛 篡 篩 篦 糕 糖 縊 縑 縈 縛 縣 縞 縝 縉 +- 縐 罹 羲 翰 翱 翮 耨 膳 膩 膨 臻 興 艘 艙 蕊 蕙 +- 蕈 蕨 蕩 蕃 蕉 蕭 蕪 蕞 螃 螟 螞 螢 融 衡 褪 褲 +- 褥 褫 褡 親 覦 諦 諺 諫 諱 謀 諜 諧 諮 諾 謁 謂 +- 諷 諭 諳 諶 諼 豫 豭 貓 賴 蹄 踱 踴 蹂 踹 踵 輻 +- 輯 輸 輳 辨 辦 遵 遴 選 遲 遼 遺 鄴 醒 錠 錶 鋸 +- 錳 錯 錢 鋼 錫 錄 錚 錐 錦 錡 錕 錮 錙 閻 隧 隨 +- 險 雕 霎 霑 霖 霍 霓 霏 靛 靜 靦 鞘 頰 頸 頻 頷 +- 頭 頹 頤 餐 館 餞 餛 餡 餚 駭 駢 駱 骸 骼 髻 髭 +- 鬨 鮑 鴕 鴣 鴦 鴨 鴒 鴛 默 黔 龍 龜 優 償 儡 儲 +- 勵 嚎 嚀 嚐 嚅 嚇 嚏 壕 壓 壑 壎 嬰 嬪 嬤 孺 尷 +- 屨 嶼 嶺 嶽 嶸 幫 彌 徽 應 懂 懇 懦 懋 戲 戴 擎 +- 擊 擘 擠 擰 擦 擬 擱 擢 擭 斂 斃 曙 曖 檀 檔 檄 +- 檢 檜 櫛 檣 橾 檗 檐 檠 歜 殮 毚 氈 濘 濱 濟 濠 +- 濛 濤 濫 濯 澀 濬 濡 濩 濕 濮 濰 燧 營 燮 燦 燥 +- 燭 燬 燴 燠 爵 牆 獰 獲 璩 環 璦 璨 癆 療 癌 盪 +- 瞳 瞪 瞰 瞬 瞧 瞭 矯 磷 磺 磴 磯 礁 禧 禪 穗 窿 +- 簇 簍 篾 篷 簌 篠 糠 糜 糞 糢 糟 糙 糝 縮 績 繆 +- 縷 縲 繃 縫 總 縱 繅 繁 縴 縹 繈 縵 縿 縯 罄 翳 +- 翼 聱 聲 聰 聯 聳 臆 臃 膺 臂 臀 膿 膽 臉 膾 臨 +- 舉 艱 薪 薄 蕾 薜 薑 薔 薯 薛 薇 薨 薊 虧 蟀 蟑 +- 螳 蟒 蟆 螫 螻 螺 蟈 蟋 褻 褶 襄 褸 褽 覬 謎 謗 +- 謙 講 謊 謠 謝 謄 謐 豁 谿 豳 賺 賽 購 賸 賻 趨 +- 蹉 蹋 蹈 蹊 轄 輾 轂 轅 輿 避 遽 還 邁 邂 邀 鄹 +- 醣 醞 醜 鍍 鎂 錨 鍵 鍊 鍥 鍋 錘 鍾 鍬 鍛 鍰 鍚 +- 鍔 闊 闋 闌 闈 闆 隱 隸 雖 霜 霞 鞠 韓 顆 颶 餵 +- 騁 駿 鮮 鮫 鮪 鮭 鴻 鴿 麋 黏 點 黜 黝 黛 鼾 齋 +- 叢 嚕 嚮 壙 壘 嬸 彝 懣 戳 擴 擲 擾 攆 擺 擻 擷 +- 斷 曜 朦 檳 檬 櫃 檻 檸 櫂 檮 檯 歟 歸 殯 瀉 瀋 +- 濾 瀆 濺 瀑 瀏 燻 燼 燾 燸 獷 獵 璧 璿 甕 癖 癘 +- 癒 瞽 瞿 瞻 瞼 礎 禮 穡 穢 穠 竄 竅 簫 簧 簪 簞 +- 簣 簡 糧 織 繕 繞 繚 繡 繒 繙 罈 翹 翻 職 聶 臍 +- 臏 舊 藏 薩 藍 藐 藉 薰 薺 薹 薦 蟯 蟬 蟲 蟠 覆 +- 覲 觴 謨 謹 謬 謫 豐 贅 蹙 蹣 蹦 蹤 蹟 蹕 軀 轉 +- 轍 邇 邃 邈 醫 醬 釐 鎔 鎊 鎖 鎢 鎳 鎮 鎬 鎰 鎘 +- 鎚 鎗 闔 闖 闐 闕 離 雜 雙 雛 雞 霤 鞣 鞦 鞭 韹 +- 額 顏 題 顎 顓 颺 餾 餿 餽 餮 馥 騎 髁 鬃 鬆 魏 +- 魎 魍 鯊 鯉 鯽 鯈 鯀 鵑 鵝 鵠 黠 鼕 鼬 儳 嚥 壞 +- 壟 壢 寵 龐 廬 懲 懷 懶 懵 攀 攏 曠 曝 櫥 櫝 櫚 +- 櫓 瀛 瀟 瀨 瀚 瀝 瀕 瀘 爆 爍 牘 犢 獸 獺 璽 瓊 +- 瓣 疇 疆 癟 癡 矇 礙 禱 穫 穩 簾 簿 簸 簽 簷 籀 +- 繫 繭 繹 繩 繪 羅 繳 羶 羹 羸 臘 藩 藝 藪 藕 藤 +- 藥 藷 蟻 蠅 蠍 蟹 蟾 襠 襟 襖 襞 譁 譜 識 證 譚 +- 譎 譏 譆 譙 贈 贊 蹼 蹲 躇 蹶 蹬 蹺 蹴 轔 轎 辭 +- 邊 邋 醱 醮 鏡 鏑 鏟 鏃 鏈 鏜 鏝 鏖 鏢 鏍 鏘 鏤 +- 鏗 鏨 關 隴 難 霪 霧 靡 韜 韻 類 願 顛 颼 饅 饉 +- 騖 騙 鬍 鯨 鯧 鯖 鯛 鶉 鵡 鵲 鵪 鵬 麒 麗 麓 麴 +- 勸 嚨 嚷 嚶 嚴 嚼 壤 孀 孃 孽 寶 巉 懸 懺 攘 攔 +- 攙 曦 朧 櫬 瀾 瀰 瀲 爐 獻 瓏 癢 癥 礦 礪 礬 礫 +- 竇 競 籌 籃 籍 糯 糰 辮 繽 繼 纂 罌 耀 臚 艦 藻 +- 藹 蘑 藺 蘆 蘋 蘇 蘊 蠔 蠕 襤 覺 觸 議 譬 警 譯 +- 譟 譫 贏 贍 躉 躁 躅 躂 醴 釋 鐘 鐃 鏽 闡 霰 飄 +- 饒 饑 馨 騫 騰 騷 騵 鰓 鰍 鹹 麵 黨 鼯 齟 齣 齡 +- 儷 儸 囁 囀 囂 夔 屬 巍 懼 懾 攝 攜 斕 曩 櫻 欄 +- 櫺 殲 灌 爛 犧 瓖 瓔 癩 矓 籐 纏 續 羼 蘗 蘭 蘚 +- 蠣 蠢 蠡 蠟 襪 襬 覽 譴 護 譽 贓 躊 躍 躋 轟 辯 +- 醺 鐮 鐳 鐵 鐺 鐸 鐲 鐫 闢 霸 霹 露 響 顧 顥 饗 +- 驅 驃 驀 騾 髏 魔 魑 鰭 鰥 鶯 鶴 鷂 鶸 麝 黯 鼙 +- 齜 齦 齧 儼 儻 囈 囊 囉 孿 巔 巒 彎 懿 攤 權 歡 +- 灑 灘 玀 瓤 疊 癮 癬 禳 籠 籟 聾 聽 臟 襲 襯 觼 +- 讀 贖 贗 躑 躓 轡 酈 鑄 鑑 鑒 霽 霾 韃 韁 顫 饕 +- 驕 驍 髒 鬚 鱉 鰱 鰾 鰻 鷓 鷗 鼴 齬 齪 龔 囌 巖 +- 戀 攣 攫 攪 曬 欐 瓚 竊 籤 籣 籥 纓 纖 纔 臢 蘸 +- 蘿 蠱 變 邐 邏 鑣 鑠 鑤 靨 顯 饜 驚 驛 驗 髓 體 +- 髑 鱔 鱗 鱖 鷥 麟 黴 囑 壩 攬 灞 癱 癲 矗 罐 羈 +- 蠶 蠹 衢 讓 讒 讖 艷 贛 釀 鑪 靂 靈 靄 韆 顰 驟 +- 鬢 魘 鱟 鷹 鷺 鹼 鹽 鼇 齷 齲 廳 欖 灣 籬 籮 蠻 +- 觀 躡 釁 鑲 鑰 顱 饞 髖 鬣 黌 灤 矚 讚 鑷 韉 驢 +- 驥 纜 讜 躪 釅 鑽 鑾 鑼 鱷 鱸 黷 豔 鑿 鸚 爨 驪 +- 鬱 鸛 鸞 籲 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑴ ⑵ +- ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ +- ⅸ ⅹ 丶 丿 亅 亠 冂 冖 冫 勹 匸 卩 厶 夊 宀 巛 +- ⼳ 广 彐 彡 攴 疒 辵 ¨ ˆ ヽ ヾ ゝ ゞ 々 〆 〇 +- ー [ ] ✽ ぁ あ ぃ い ぅ う ぇ え ぉ お か が +- き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ +- そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ +- ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ +- ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ +- ろ ゎ わ ゐ ゑ を ん ァ ア ィ イ ゥ ウ ェ エ ォ +- オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス +- ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド +- ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ +- ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ +- リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ А Б В +- Г Д Е Ё Ж З И Й К Л М Н О П Р С +- Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б +- в г д е ё ж з и й к л м н о п р +- с т у ф х ц ч ш щ ъ ы ь э ю я ⇧ +- ↸ ↹   乚  刂   冈   ¬ ¦ ' " +- ㈱ № ℡ ゛ ゜ ⺀ ⺄ ⺆ ⺇ ⺈ ⺊ ⺌ ⺍ ⺕ ⺜ ⺝ +- ⺥ ⺧ ⺪ ⺬ ⺮ ⺶ ⺼ ⺾ ⻆ ⻊ ⻌ ⻍ ⻏ ⻖ ⻗ ⻞ +- ⻣ ʃ ɐ ɛ ɔ ɵ œ ø ŋ ʊ ɪ 乂 乜 凵 匚 厂 +- 万 丌 乇 亍 囗 兀 屮 彳 丏 冇 与 丮 亓 仂 仉 仈 +- 冘 勼 卬 厹 圠 夃 夬 尐 巿 旡 殳 毌 气 爿 丱 丼 +- 仨 仜 仩 仡 仝 仚 刌 匜 卌 圢 圣 夗 夯 宁 宄 尒 +- 尻 屴 屳 帄 庀 庂 忉 戉 扐 氕 氶 汃 氿 氻 犮 犰 +- 玊 禸 肊 阞 伎 优 伬 仵 伔 仱 伀 价 伈 伝 伂 伅 +- 伢 伓 伄 仴 伒 冱 刓 刉 刐 劦 匢 匟 卍 厊 吇 囡 +- 囟 圮 圪 圴 夼 妀 奼 妅 奻 奾 奷 奿 孖 尕 尥 屼 +- 屺 屻 屾 巟 幵 庄 异 弚 彴 忕 忔 忏 扜 扞 扤 扡 +- 扦 扢 扙 扠 扚 扥 旯 旮 朾 朹 朸 朻 机 朿 朼 朳 +- 氘 汆 汒 汜 汏 汊 汔 汋 汌 灱 牞 犴 犵 玎 甪 癿 +- 穵 网 艸 艼 芀 艽 艿 虍 襾 邙 邗 邘 邛 邔 阢 阤 +- 阠 阣 佖 伻 佢 佉 体 佤 伾 佧 佒 佟 佁 佘 伭 伳 +- 伿 佡 冏 冹 刜 刞 刡 劭 劮 匉 卣 卲 厎 厏 吰 吷 +- 吪 呔 呅 吙 吜 吥 吘 吽 呏 呁 吨 吤 呇 囮 囧 囥 +- 坁 坅 坌 坉 坋 坒 夆 奀 妦 妘 妠 妗 妎 妢 妐 妏 +- 妧 妡 宎 宒 尨 尪 岍 岏 岈 岋 岉 岒 岊 岆 岓 岕 +- 巠 帊 帎 庋 庉 庌 庈 庍 弅 弝 彸 彶 忒 忑 忐 忭 +- 忨 忮 忳 忡 忤 忣 忺 忯 忷 忻 怀 忴 戺 抃 抌 抎 +- 抏 抔 抇 扱 扻 扺 扰 抁 抈 扷 扽 扲 扴 攷 旰 旴 +- 旳 旲 旵 杅 杇 杙 杕 杌 杈 杝 杍 杚 杋 毐 氙 氚 +- 汸 汧 汫 沄 沋 沏 汱 汯 汩 沚 汭 沇 沕 沜 汦 汳 +- 汥 汻 沎 灴 灺 牣 犿 犽 狃 狆 狁 犺 狅 玕 玗 玓 +- 玔 玒 町 甹 疔 疕 皁 礽 耴 肕 肙 肐 肒 肜 芐 芏 +- 芅 芎 芑 芓 芊 芃 芄 豸 迉 辿 邟 邡 邥 邞 邧 邠 +- 阰 阨 阯 阭 丳 侘 佼 侅 佽 侀 侇 佶 佴 侉 侄 佷 +- 佌 侗 佪 侚 佹 侁 佸 侐 侜 侔 侞 侒 侂 侕 佫 佮 +- 冞 冼 冾 刵 刲 刳 剆 刱 劼 匊 匋 匼 厒 厔 咇 呿 +- 咁 咑 咂 咈 呫 呺 呾 呥 呬 呴 呦 咍 呯 呡 呠 咘 +- 呣 呧 呤 囷 囹 坯 坲 坭 坫 坱 坰 坶 垀 坵 坻 坳 +- 坴 坢 坨 坽 夌 奅 妵 妺 姏 姎 妲 姌 姁 妶 妼 姃 +- 姖 妱 妽 姀 姈 妴 姇 孢 孥 宓 宕 屄 屇 岮 岤 岠 +- 岵 岯 岨 岬 岟 岣 岭 岢 岪 岧 岝 岥 岶 岰 岦 帗 +- 帔 帙 弨 弢 弣 弤 彔 徂 彾 彽 忞 忥 怭 怦 怙 怲 +- 怋 怴 怊 怗 怳 怚 怞 怬 怢 怍 怐 怮 怓 怑 怌 怉 +- 怜 戔 戽 抭 抴 拑 抾 抪 抶 拊 抮 抳 抯 抻 抩 抰 +- 抸 攽 斨 斻 昉 旼 昄 昒 昈 旻 昃 昋 昍 昅 旽 昑 +- 昐 曶 朊 枅 杬 枎 枒 杶 杻 枘 枆 构 杴 枍 枌 杺 +- 枟 枑 枙 枃 杽 极 杸 杹 枔 欥 殀 歾 毞 氝 沓 泬 +- 泫 泮 泙 沶 泔 沭 泧 沷 泐 泂 沺 泃 泆 泭 泲 泒 +- 泝 沴 沊 沝 沀 泞 泀 洰 泍 泇 沰 泹 泏 泩 泑 炔 +- 炘 炅 炓 炆 炄 炑 炖 炂 炚 炃 牪 狖 狋 狘 狉 狜 +- 狒 狔 狚 狌 狑 玤 玡 玭 玦 玢 玠 玬 玝 瓝 瓨 甿 +- 畀 甾 疌 疘 皯 盳 盱 盰 盵 矸 矼 矹 矻 矺 矷 祂 +- 礿 秅 穸 穻 竻 籵 糽 耵 肏 肮 肣 肸 肵 肭 舠 芠 +- 苀 芫 芚 芘 芛 芵 芧 芮 芼 芞 芺 芴 芨 芡 芩 苂 +- 芤 苃 芶 芢 虰 虯 虭 虮 豖 迒 迋 迓 迍 迖 迕 迗 +- 邲 邴 邯 邳 邰 阹 阽 阼 阺 陃 俍 俅 俓 侲 俉 俋 +- 俁 俔 俜 俙 侻 侳 俛 俇 俖 侺 俀 侹 俬 剄 剉 勀 +- 勂 匽 卼 厗 厖 厙 厘 咺 咡 咭 咥 哏 哃 茍 咷 咮 +- 哖 咶 哅 哆 咠 呰 咼 咢 咾 呲 哞 咰 垵 垞 垟 垤 +- 垌 垗 垝 垛 垔 垘 垏 垙 垥 垚 垕 壴 复 奓 姡 姞 +- 姮 娀 姱 姝 姺 姽 姼 姶 姤 姲 姷 姛 姩 姳 姵 姠 +- 姾 姴 姭 宨 屌 峐 峘 峌 峗 峋 峛 峞 峚 峉 峇 峊 +- 峖 峓 峔 峏 峈 峆 峎 峟 峸 巹 帡 帢 帣 帠 帤 庰 +- 庤 庢 庛 庣 庥 弇 弮 彖 徆 怷 怹 恔 恲 恞 恅 恓 +- 恇 恉 恛 恌 恀 恂 恟 怤 恄 恘 恦 恮 扂 扃 拏 挍 +- 挋 拵 挎 挃 拫 拹 挏 挌 拸 拶 挀 挓 挔 拺 挕 拻 +- 拰 敁 敃 斪 斿 昶 昡 昲 昵 昜 昦 昢 昳 昫 昺 昝 +- 昴 昹 昮 朏 朐 柁 柲 柈 枺 柜 枻 柸 柘 柀 枷 柅 +- 柫 柤 柟 枵 柍 枳 柷 柶 柮 柣 柂 枹 柎 柧 柰 枲 +- 柼 柆 柭 柌 枮 柦 柛 柺 柉 柊 柃 柪 柋 欨 殂 殄 +- 殶 毖 毘 毠 氠 氡 洨 洴 洭 洟 洼 洿 洒 洊 泚 洳 +- 洄 洙 洺 洚 洑 洀 洝 浂 洁 洘 洷 洃 洏 浀 洇 洠 +- 洬 洈 洢 洉 洐 炷 炟 炾 炱 炰 炡 炴 炵 炩 牁 牉 +- 牊 牬 牰 牳 牮 狊 狤 狨 狫 狟 狪 狦 狣 玅 珌 珂 +- 珈 珅 玹 玶 玵 玴 珫 玿 珇 玾 珃 珆 玸 珋 瓬 瓮 +- 甮 畇 畈 疧 疪 癹 盄 眈 眃 眄 眅 眊 盷 盻 盺 矧 +- 矨 砆 砑 砒 砅 砐 砏 砎 砉 砃 砓 祊 祌 祋 祅 祄 +- 秕 种 秏 秖 秎 窀 穾 竑 笀 笁 籺 籸 籹 籿 粀 粁 +- 紃 紈 紁 罘 羑 羍 羾 耇 耎 耏 耔 耷 胘 胇 胠 胑 +- 胈 胂 胐 胅 胣 胙 胜 胊 胕 胉 胏 胗 胦 胍 臿 舡 +- 芔 苙 苾 苹 茇 苨 茀 苕 茺 苫 苖 苴 苬 苡 苲 苵 +- 茌 苻 苶 苰 苪 苤 苠 苺 苳 苭 虷 虴 虼 虳 衁 衎 +- 衧 衪 衩 觓 訄 訇 赲 迣 迡 迮 迠 郱 邽 邿 郕 郅 +- 邾 郇 郋 郈 釔 釓 陔 陏 陑 陓 陊 陎 倞 倅 倇 倓 +- 倢 倰 倛 俵 俴 倳 倷 倬 俶 俷 倗 倜 倠 倧 倵 倯 +- 倱 倎 党 冔 冓 凊 凄 凅 凈 凎 剡 剚 剒 剞 剟 剕 +- 剢 勍 匎 厞 唦 哢 唗 唒 哧 哳 哤 唚 哿 唄 唈 哫 +- 唑 唅 哱 唊 哻 哷 哸 哠 唎 唃 唋 圁 圂 埌 堲 埕 +- 埒 垺 埆 垽 垼 垸 垶 垿 埇 埐 垹 埁 夎 奊 娙 娖 +- 娭 娮 娕 娏 娗 娊 娞 娳 孬 宧 宭 宬 尃 屖 屔 峬 +- 峿 峮 峱 峷 崀 峹 帩 帨 庨 庮 庪 庬 弳 弰 彧 恝 +- 恚 恧 恁 悢 悈 悀 悒 悁 悝 悃 悕 悛 悗 悇 悜 悎 +- 戙 扆 拲 挐 捖 挬 捄 捅 挶 捃 揤 挹 捋 捊 挼 挩 +- 捁 挴 捘 捔 捙 挭 捇 挳 捚 捑 挸 捗 捀 捈 敊 敆 +- 旆 旃 旄 旂 晊 晟 晇 晑 朒 朓 栟 栚 桉 栲 栳 栻 +- 桋 桏 栖 栱 栜 栵 栫 栭 栯 桎 桄 栴 栝 栒 栔 栦 +- 栨 栮 桍 栺 栥 栠 欬 欯 欭 欱 欴 歭 肂 殈 毦 毤 +- 毨 毣 毢 毧 氥 浺 浣 浤 浶 洍 浡 涒 浘 浢 浭 浯 +- 涑 涍 淯 浿 涆 浞 浧 浠 涗 浰 浼 浟 涂 涘 洯 浨 +- 涋 浾 涀 涄 洖 涃 浻 浽 浵 涐 烜 烓 烑 烝 烋 缹 +- 烢 烗 烒 烞 烠 烔 烍 烅 烆 烇 烚 烎 烡 牂 牸 牷 +- 牶 猀 狺 狴 狾 狶 狳 狻 猁 珓 珙 珥 珖 玼 珧 珣 +- 珩 珜 珒 珛 珔 珝 珚 珗 珘 珨 瓞 瓟 瓴 瓵 甡 畛 +- 畟 疰 痁 疻 痄 痀 疿 疶 疺 皊 盉 眝 眛 眐 眓 眒 +- 眣 眑 眕 眙 眚 眢 眧 砣 砬 砢 砵 砯 砨 砮 砫 砡 +- 砩 砳 砪 砱 祔 祛 祏 祜 祓 祒 祑 秫 秬 秠 秮 秭 +- 秪 秜 秞 秝 窆 窉 窅 窋 窌 窊 窇 竘 笐 笄 笓 笅 +- 笏 笈 笊 笎 笉 笒 粄 粑 粊 粌 粈 粍 粅 紞 紝 紑 +- 紎 紘 紖 紓 紟 紒 紏 紌 罜 罡 罞 罠 罝 罛 羖 羒 +- 翃 翂 翀 耖 耾 耹 胺 胲 胹 胵 脁 胻 脀 舁 舯 舥 +- 茳 茭 荄 茙 荑 茥 荖 茿 荁 茦 茜 茢 荂 荎 茛 茪 +- 茈 茼 荍 茖 茤 茠 茷 茯 茩 荇 荅 荌 荓 茞 茬 荋 +- 茧 荈 虓 虒 蚢 蚨 蚖 蚍 蚑 蚞 蚇 蚗 蚆 蚋 蚚 蚅 +- 蚥 蚙 蚡 蚧 蚕 蚘 蚎 蚝 蚐 蚔 衃 衄 衭 衵 衶 衲 +- 袀 衱 衿 衯 袃 衾 衴 衼 訒 豇 豗 豻 貤 貣 赶 赸 +- 趵 趷 趶 軑 軓 迾 迵 适 迿 迻 逄 迼 迶 郖 郠 郙 +- 郚 郣 郟 郥 郘 郛 郗 郜 郤 酐 酎 酏 釕 釢 釚 陜 +- 陟 隼 飣 髟 鬯 乿 偰 偪 偡 偞 偠 偓 偋 偝 偲 偈 +- 偍 偁 偛 偊 偢 倕 偅 偟 偩 偫 偣 偤 偆 偀 偮 偳 +- 偗 偑 凐 剫 剭 剬 剮 勖 勓 匭 厜 啵 啶 唼 啍 啐 +- 唴 唪 啑 啢 唶 唵 唰 啒 啅 唌 唲 啥 啎 唹 啈 唭 +- 唻 啀 啋 圊 圇 埻 堔 埢 埶 埜 埴 堀 埭 埽 堈 埸 +- 堋 埳 埏 堇 埮 埣 埲 埥 埬 埡 堎 埼 堐 埧 堁 堌 +- 埱 埩 埰 堍 堄 奜 婠 婘 婕 婧 婞 娸 娵 婭 婐 婟 +- 婥 婬 婓 婤 婗 婃 婝 婒 婄 婛 婈 媎 娾 婍 娹 婌 +- 婰 婩 婇 婑 婖 婂 婜 孲 孮 寁 寀 屙 崞 崋 崝 崚 +- 崠 崌 崨 崍 崦 崥 崏 崰 崒 崣 崟 崮 帾 帴 庱 庴 +- 庹 庲 庳 弶 弸 徛 徖 徟 悊 悐 悆 悾 悰 悺 惓 惔 +- 惏 惤 惙 惝 惈 悱 惛 悷 惊 悿 惃 惍 惀 挲 捥 掊 +- 掂 捽 掽 掞 掭 掝 掗 掫 掎 捯 掇 掐 据 掯 捵 掜 +- 捭 掮 捼 掤 挻 掟 捸 掅 掁 掑 掍 捰 敓 旍 晥 晡 +- 晛 晙 晜 晢 朘 桹 梇 梐 梜 桭 桮 梮 梫 楖 桯 梣 +- 梬 梩 桵 桴 梲 梏 桷 梒 桼 桫 桲 梪 梀 桱 桾 梛 +- 梖 梋 梠 梉 梤 桸 桻 梑 梌 梊 桽 欶 欳 欷 欸 殑 +- 殏 殍 殎 殌 氪 淀 涫 涴 涳 湴 涬 淩 淢 涷 淶 淔 +- 渀 淈 淠 淟 淖 涾 淥 淜 淝 淛 淴 淊 涽 淭 淰 涺 +- 淕 淂 淏 淉 淐 淲 淓 淽 淗 淍 淣 涻 烺 焍 烷 焗 +- 烴 焌 烰 焄 烳 焐 烼 烿 焆 焓 焀 烸 烶 焋 焂 焎 +- 牾 牻 牼 牿 猝 猗 猇 猑 猘 猊 猈 狿 猏 猞 玈 珶 +- 珸 珵 琄 琁 珽 琇 琀 珺 珼 珿 琌 琋 珴 琈 畤 畣 +- 痎 痒 痏 痋 痌 痑 痐 皏 皉 盓 眹 眯 眭 眱 眲 眴 +- 眳 眽 眥 眻 眵 硈 硒 硉 硍 硊 硌 砦 硅 硐 祤 祧 +- 祩 祪 祣 祫 祡 离 秺 秸 秶 秷 窏 窔 窐 笵 筇 笴 +- 笥 笰 笢 笤 笳 笘 笪 笝 笱 笫 笭 笯 笲 笸 笚 笣 +- 粔 粘 粖 粣 紵 紽 紸 紶 紺 絅 紬 紩 絁 絇 紾 紿 +- 絊 紻 紨 罣 羕 羜 羝 羛 翊 翋 翍 翐 翑 翇 翏 翉 +- 耟 耞 耛 聇 聃 聈 脘 脥 脙 脛 脭 脟 脬 脞 脡 脕 +- 脧 脝 脢 舑 舸 舳 舺 舴 舲 艴 莐 莣 莨 莍 荺 荳 +- 莤 荴 莏 莁 莕 莙 荵 莔 莩 荽 莃 莌 莝 莛 莪 莋 +- 荾 莥 莯 莈 莗 莰 荿 莦 莇 莮 荶 莚 虙 虖 蚿 蚷 +- 蛂 蛁 蛅 蚺 蚰 蛈 蚹 蚳 蚸 蛌 蚴 蚻 蚼 蛃 蚽 蚾 +- 衒 袉 袕 袨 袢 袪 袚 袑 袡 袟 袘 袧 袙 袛 袗 袤 +- 袬 袌 袓 袎 覂 觖 觙 觕 訰 訧 訬 訞 谹 谻 豜 豝 +- 豽 貥 赽 赻 赹 趼 跂 趹 趿 跁 軘 軞 軝 軜 軗 軠 +- 軡 逤 逋 逑 逜 逌 逡 郯 郪 郰 郴 郲 郳 郔 郫 郬 +- 郩 酖 酘 酚 酓 酕 釬 釴 釱 釳 釸 釤 釹 釪 釫 釷 +- 釨 釮 镺 閆 閈 陼 陭 陫 陱 陯 隿 靪 頄 飥 馗 傛 +- 傕 傔 傞 傋 傣 傃 傌 傎 傝 偨 傜 傒 傂 傇 兟 凔 +- 匒 匑 厤 厧 喑 喨 喥 喭 啷 噅 喢 喓 喈 喏 喵 喁 +- 喣 喒 喤 啽 喌 喦 啿 喕 喡 喎 圌 堩 堷 堙 堞 堧 +- 堣 堨 埵 塈 堥 堜 堛 堳 堿 堶 堮 堹 堸 堭 堬 堻 +- 奡 媯 媔 媟 婺 媢 媞 婸 媦 婼 媥 媬 媕 媮 娷 媄 +- 媊 媗 媃 媋 媩 婻 婽 媌 媜 媏 媓 媝 寪 寍 寋 寔 +- 寑 寊 寎 尌 尰 崷 嵃 嵫 嵁 嵋 崿 崵 嵑 嵎 嵕 崳 +- 崺 嵒 崽 崱 嵙 嵂 崹 嵉 崸 崼 崲 崶 嵀 嵅 幄 幁 +- 彘 徦 徥 徫 惉 悹 惌 惢 惎 惄 愔 惲 愊 愖 愅 惵 +- 愓 惸 惼 惾 惁 愃 愘 愝 愐 惿 愄 愋 扊 掔 掱 掰 +- 揎 揥 揨 揯 揃 撝 揳 揊 揠 揶 揕 揲 揵 摡 揟 掾 +- 揝 揜 揄 揘 揓 揂 揇 揌 揋 揈 揰 揗 揙 攲 敧 敪 +- 敤 敜 敨 敥 斌 斝 斞 斮 旐 旒 晼 晬 晻 暀 晱 晹 +- 晪 晲 朁 椌 棓 椄 棜 椪 棬 棪 棱 椏 棖 棷 棫 棤 +- 棶 椓 椐 棳 棡 椇 棌 椈 楰 梴 椑 棯 棆 椔 棸 棐 +- 棽 棼 棨 椋 椊 椗 棎 棈 棝 棞 棦 棴 棑 椆 棔 棩 +- 椕 椥 棇 欹 欻 欿 欼 殔 殗 殙 殕 殽 毰 毲 毳 氰 +- 淼 湆 湇 渟 湉 溈 渼 渽 湅 湢 渫 渿 湁 湝 湳 渜 +- 渳 湋 湀 湑 渻 渃 渮 湞 湨 湜 湡 渱 渨 湠 湱 湫 +- 渹 渢 渰 湓 湥 渧 湸 湤 湷 湕 湹 湒 湦 渵 渶 湚 +- 焠 焞 焯 烻 焮 焱 焣 焥 焢 焲 焟 焨 焺 焛 牋 牚 +- 犈 犉 犆 犅 犋 猒 猋 猰 猢 猱 猳 猧 猲 猭 猦 猣 +- 猵 猌 琮 琬 琰 琫 琖 琚 琡 琭 琱 琤 琣 琝 琩 琠 +- 琲 瓻 甯 畯 畬 痧 痚 痡 痦 痝 痟 痤 痗 皕 皒 盚 +- 睆 睇 睄 睍 睅 睊 睎 睋 睌 矞 矬 硠 硤 硥 硜 硭 +- 硱 硪 确 硰 硩 硨 硞 硢 祴 祳 祲 祰 稂 稊 稃 稌 +- 稄 窙 竦 竤 筊 笻 筄 筈 筌 筎 筀 筘 筅 粢 粞 粨 +- 粡 絘 絯 絣 絓 絖 絧 絪 絏 絭 絜 絫 絒 絔 絩 絑 +- 絟 絎 缾 缿 罥 罦 羢 羠 羡 翗 聑 聏 聐 胾 胔 腃 +- 腊 腒 腏 腇 脽 腍 脺 臦 臮 臷 臸 臹 舄 舼 舽 舿 +- 艵 茻 菏 菹 萣 菀 菨 萒 菧 菤 菼 菶 萐 菆 菈 菫 +- 菣 莿 萁 菝 菥 菘 菿 菡 菋 菎 菖 菵 菉 萉 萏 菞 +- 萑 萆 菂 菳 菕 菺 菇 菑 菪 萓 菃 菬 菮 菄 菻 菗 +- 菢 萛 菛 菾 蛘 蛢 蛦 蛓 蛣 蛚 蛪 蛝 蛫 蛜 蛬 蛩 +- 蛗 蛨 蛑 衈 衖 衕 袺 裗 袹 袸 裀 袾 袶 袼 袷 袽 +- 袲 褁 裉 覕 覘 覗 觝 觚 觛 詎 詍 訹 詙 詀 詗 詘 +- 詄 詅 詒 詈 詑 詊 詌 詏 豟 貁 貀 貺 貾 貰 貹 貵 +- 趄 趀 趉 跘 跓 跍 跇 跖 跜 跏 跕 跙 跈 跗 跅 軯 +- 軷 軺 軹 軦 軮 軥 軵 軧 軨 軶 軫 軱 軬 軴 軩 逭 +- 逴 逯 鄆 鄬 鄄 郿 郼 鄈 郹 郻 鄁 鄀 鄇 鄅 鄃 酡 +- 酤 酟 酢 酠 鈁 鈊 鈥 鈃 鈚 鈦 鈏 鈌 鈀 鈒 釿 釽 +- 鈆 鈄 鈧 鈂 鈜 鈤 鈙 鈗 鈅 鈖 镻 閍 閌 閐 隇 陾 +- 隈 隉 隃 隀 雂 雈 雃 雱 雰 靬 靰 靮 頇 颩 飫 鳦 +- 黹 亃 亄 亶 傽 傿 僆 傮 僄 僊 傴 僈 僂 傰 僁 傺 +- 傱 僋 僉 傶 傸 凗 剺 剸 剻 剼 嗃 嗛 嗌 嗐 嗋 嗊 +- 嗝 嗀 嗔 嗄 嗩 喿 嗒 喍 嗏 嗕 嗢 嗖 嗈 嗲 嗍 嗙 +- 嗂 圔 塓 塨 塤 塏 塍 塉 塯 塕 塎 塝 塙 塥 塛 堽 +- 塣 塱 壼 嫇 嫄 嫋 媺 媸 媱 媵 媰 媿 嫈 媻 嫆 媷 +- 嫀 嫊 媴 媶 嫍 媹 媐 寖 寘 寙 尟 尳 嵱 嵣 嵊 嵥 +- 嵲 嵬 嵞 嵨 嵧 嵢 巰 幏 幎 幊 幍 幋 廅 廌 廆 廋 +- 廇 彀 徯 徭 惷 慉 慊 愫 慅 愶 愲 愮 慆 愯 慏 愩 +- 慀 戠 酨 戣 戥 戤 揅 揱 揫 搐 搒 搉 搠 搤 搳 摃 +- 搟 搕 搘 搹 搷 搢 搣 搌 搦 搰 搨 摁 搵 搯 搊 搚 +- 摀 搥 搧 搋 揧 搛 搮 搡 搎 敯 斒 旓 暆 暌 暕 暐 +- 暋 暊 暙 暔 晸 朠 楦 楟 椸 楎 楢 楱 椿 楅 楪 椹 +- 楂 楗 楙 楺 楈 楉 椵 楬 椳 椽 楥 棰 楸 椴 楩 楀 +- 楯 楄 楶 楘 楁 楴 楌 椻 楋 椷 楜 楏 楑 椲 楒 椯 +- 楻 椼 歆 歅 歃 歂 歈 歁 殛 嗀 毻 毼 毹 毷 毸 溛 +- 滖 滈 溏 滀 溟 溓 溔 溠 溱 溹 滆 滒 溽 滁 溞 滉 +- 溷 溰 滍 溦 滏 溲 溾 滃 滜 滘 溙 溒 溎 溍 溤 溡 +- 溿 溳 滐 滊 溗 溮 溣 煇 煔 煒 煣 煠 煁 煝 煢 煲 +- 煸 煪 煡 煂 煘 煃 煋 煰 煟 煐 煓 煄 煍 煚 牏 犍 +- 犌 犑 犐 犎 猼 獂 猻 猺 獀 獊 獉 瑄 瑊 瑋 瑒 瑑 +- 瑗 瑀 瑏 瑐 瑎 瑂 瑆 瑍 瑔 瓡 瓿 瓾 瓽 甝 畹 畷 +- 榃 痯 瘏 瘃 痷 痾 痼 痹 痸 瘐 痻 痶 痭 痵 痽 皙 +- 皵 盝 睕 睟 睠 睒 睖 睚 睩 睧 睔 睙 睭 矠 碇 碚 +- 碔 碏 碄 碕 碅 碆 碡 碃 硹 碙 碀 碖 硻 祼 禂 祽 +- 祹 稑 稘 稙 稒 稗 稕 稢 稓 稛 稐 窣 窢 窞 竫 筦 +- 筤 筭 筴 筩 筲 筥 筳 筱 筰 筡 筸 筶 筣 粲 粴 粯 +- 綈 綆 綀 綍 絿 綅 絺 綎 絻 綃 絼 綌 綔 綄 絽 綒 +- 罭 罫 罧 罨 罬 羦 羥 羧 翛 翜 耡 腤 腠 腷 腜 腩 +- 腛 腢 腲 朡 腞 腶 腧 腯 腄 腡 舝 艉 艄 艀 艂 艅 +- 蓱 萿 葖 葶 葹 蒏 蒍 葥 葑 葀 蒆 葧 萰 葍 葽 葚 +- 葙 葴 葳 葝 蔇 葞 萷 萺 萴 葺 葃 葸 萲 葅 萩 菙 +- 葋 萯 葂 萭 葟 葰 萹 葎 葌 葒 葯 蓅 蒎 萻 葇 萶 +- 萳 葨 葾 葄 萫 葠 葔 葮 葐 蜋 蜄 蛷 蜌 蛺 蛖 蛵 +- 蝍 蛸 蜎 蜉 蜁 蛶 蜍 蜅 裖 裋 裍 裎 裞 裛 裚 裌 +- 裐 覅 覛 觟 觥 觤 觡 觠 觢 觜 触 詶 誆 詿 詡 訿 +- 詷 誂 誄 詵 誃 誁 詴 詺 谼 豋 豊 豥 豤 豦 貆 貄 +- 貅 賌 赨 赩 趑 趌 趎 趏 趍 趓 趔 趐 趒 跰 跠 跬 +- 跱 跮 跐 跩 跣 跢 跧 跲 跫 跴 輆 軿 輁 輀 輅 輇 +- 輈 輂 輋 遒 逿 遄 遉 逽 鄐 鄍 鄏 鄑 鄖 鄔 鄋 鄎 +- 酮 酯 鉈 鉒 鈰 鈺 鉦 鈳 鉥 鉞 銃 鈮 鉊 鉆 鉭 鉬 +- 鉏 鉠 鉧 鉯 鈶 鉡 鉰 鈱 鉔 鉣 鉐 鉲 鉎 鉓 鉌 鉖 +- 鈲 閟 閜 閞 閛 隒 隓 隑 隗 雎 雺 雽 雸 雵 靳 靷 +- 靸 靲 頏 頍 頎 颬 飶 飹 馯 馲 馰 馵 骭 骫 魛 鳪 +- 鳭 鳧 麀 黽 僦 僔 僗 僨 僳 僛 僪 僝 僤 僓 僬 僰 +- 僯 僣 僠 凘 劀 劁 勩 勫 匰 厬 嘧 嘕 嘌 嘒 嗼 嘏 +- 嘜 嘁 嘓 嘂 嗺 嘝 嘄 嗿 嗹 墉 塼 墐 墘 墆 墁 塿 +- 塴 墋 塺 墇 墑 墎 塶 墂 墈 塻 墔 墏 壾 奫 嫜 嫮 +- 嫥 嫕 嫪 嫚 嫭 嫫 嫳 嫢 嫠 嫛 嫬 嫞 嫝 嫙 嫨 嫟 +- 孷 寠 寣 屣 嶂 嶀 嵽 嶆 嵺 嶁 嵷 嶊 嶉 嶈 嵾 嵼 +- 嶍 嵹 嵿 幘 幙 幓 廘 廑 廗 廎 廜 廕 廙 廒 廔 彄 +- 彃 彯 徶 愬 愨 慁 慞 慱 慳 慒 慓 慲 慬 憀 慴 慔 +- 慺 慛 慥 愻 慪 慡 慖 戩 戧 戫 搫 摍 摛 摝 摴 摶 +- 摲 摳 摽 摵 摦 撦 摎 撂 摞 摜 摋 摓 摠 摐 摿 搿 +- 摬 摫 摙 摥 摷 敳 斠 暡 暠 暟 朅 朄 朢 榱 榶 槉 +- 榠 槎 榖 榰 榬 榼 榑 榙 榎 榧 榍 榩 榾 榯 榿 槄 +- 榽 榤 槔 榹 槊 榚 槏 榳 榓 榪 榡 榞 槙 榗 榐 槂 +- 榵 榥 槆 歊 歍 歋 殞 殟 殠 毃 毄 毾 滎 滵 滱 漃 +- 漥 滸 漷 滻 漮 漉 潎 漙 漚 漧 漘 漻 漒 滭 漊 漶 +- 潳 滹 滮 漭 潀 漰 漼 漵 滫 漇 漎 潃 漅 滽 滶 漹 +- 漜 滼 漺 漟 漍 漞 漈 漡 熇 熐 熉 熀 熅 熂 熏 煻 +- 熆 熁 熗 牄 牓 犗 犕 犓 獃 獍 獑 獌 瑢 瑳 瑱 瑵 +- 瑲 瑧 瑮 甀 甂 甃 畽 疐 瘖 瘈 瘌 瘕 瘑 瘊 瘔 皸 +- 瞁 睼 瞅 瞂 睮 瞀 睯 睾 瞃 碲 碪 碴 碭 碨 硾 碫 +- 碞 碥 碠 碬 碢 碤 禘 禊 禋 禖 禕 禔 禓 禗 禈 禒 +- 禐 稫 穊 稰 稯 稨 稦 窨 窫 窬 竮 箈 箜 箊 箑 箐 +- 箖 箍 箌 箛 箎 箅 箘 劄 箙 箤 箂 粻 粿 粼 粺 綧 +- 綷 緂 綣 綪 緁 緀 緅 綝 緎 緄 緆 緋 緌 綯 綹 綖 +- 綼 綟 綦 綮 綩 綡 緉 罳 翢 翣 翥 翞 耤 聝 聜 膉 +- 膆 膃 膇 膍 膌 膋 舕 蒗 蒤 蒡 蒟 蒺 蓎 蓂 蒬 蒮 +- 蒫 蒹 蒴 蓁 蓍 蒪 蒚 蒱 蓐 蒝 蒧 蒻 蒢 蒔 蓇 蓌 +- 蒛 蒩 蒯 蒨 蓖 蒘 蒶 蓏 蒠 蓗 蓔 蓒 蓛 蒰 蒑 虡 +- 蜳 蜣 蜨 蝫 蝀 蜮 蜞 蜡 蜙 蜛 蝃 蜬 蝁 蜾 蝆 蜠 +- 蜲 蜪 蜭 蜼 蜒 蜺 蜱 蜵 蝂 蜦 蜧 蜸 蜤 蜚 蜰 蜑 +- 裷 裧 裱 裲 裺 裾 裮 裼 裶 裻 裰 裬 裫 覝 覡 覟 +- 覞 觩 觫 觨 誫 誙 誋 誒 誏 誖 谽 豨 豩 賕 賏 賗 +- 趖 踉 踂 跿 踍 跽 踊 踃 踇 踆 踅 跾 踀 踄 輐 輑 +- 輎 輍 鄣 鄜 鄠 鄢 鄟 鄝 鄚 鄤 鄡 鄛 酺 酲 酹 酳 +- 銥 銤 鉶 銛 鉺 銠 銔 銪 銍 銦 銚 銫 鉹 銗 鉿 銣 +- 鋮 銎 銂 銕 銢 鉽 銈 銡 銊 銆 銌 銙 銧 鉾 銇 銩 +- 銝 銋 鈭 隞 隡 雿 靘 靽 靺 靾 鞃 鞀 鞂 靻 鞄 鞁 +- 靿 韎 韍 頖 颭 颮 餂 餀 餇 馝 馜 駃 馹 馻 馺 駂 +- 馽 駇 骱 髣 髧 鬾 鬿 魠 魡 魟 鳱 鳲 鳵 麧 僿 儃 +- 儰 僸 儆 儇 僶 僾 儋 儌 僽 儊 劋 劌 勱 勯 噈 噂 +- 噌 嘵 噁 噊 噉 噆 噘 噚 噀 嘳 嘽 嘬 嘾 嘸 嘪 嘺 +- 圚 墫 墝 墱 墠 墣 墯 墬 墥 墡 壿 嫿 嫴 嫽 嫷 嫶 +- 嬃 嫸 嬂 嫹 嬁 嬇 嬅 嬏 屧 嶙 嶗 嶟 嶒 嶢 嶓 嶕 +- 嶠 嶜 嶡 嶚 嶞 幩 幝 幠 幜 緳 廛 廞 廡 彉 徲 憋 +- 憃 慹 憱 憰 憢 憉 憛 憓 憯 憭 憟 憒 憪 憡 憍 慦 +- 憳 戭 摮 摰 撖 撠 撅 撗 撜 撏 撋 撊 撌 撣 撟 摨 +- 撱 撘 敶 敺 敹 敻 斲 斳 暵 暰 暩 暲 暷 暪 暯 樀 +- 樆 樗 槥 槸 樕 槱 槤 樠 槿 槬 槢 樛 樝 槾 樧 槲 +- 槮 樔 槷 槧 橀 樈 槦 槻 樍 槼 槫 樉 樄 樘 樥 樏 +- 槶 樦 樇 槴 樖 歑 殥 殣 殢 殦 氁 氀 毿 氂 潁 漦 +- 潾 澇 濆 澒 澍 澉 澌 潢 潏 澅 潚 澖 潶 潬 澂 潕 +- 潲 潒 潐 潗 澔 澓 潝 漀 潡 潫 潽 潧 澐 潓 澋 潩 +- 潿 澕 潣 潷 潪 潻 熲 熯 熛 熰 熠 熚 熩 熵 熝 熥 +- 熞 熤 熡 熪 熜 熧 熳 犘 犚 獘 獒 獞 獟 獠 獝 獛 +- 獡 獚 獙 獢 璇 璉 璊 璆 璁 瑽 璅 璈 瑼 瑹 甈 甇 +- 畾 瘥 瘞 瘙 瘝 瘜 瘣 瘚 瘨 瘛 皜 皝 皞 皛 瞍 瞏 +- 瞉 瞈 磍 碻 磏 磌 磑 磎 磔 磈 磃 磄 磉 禚 禡 禠 +- 禜 禢 禛 歶 稹 窲 窴 窳 箷 篋 箾 箬 篎 箯 箹 篊 +- 箵 糅 糈 糌 糋 緷 緛 緪 緧 緗 緡 縃 緺 緦 緶 緱 +- 緰 緮 緟 罶 羬 羰 羭 翭 翫 翪 翬 翦 翨 聤 聧 膣 +- 膟 膞 膕 膢 膙 膗 舖 艏 艓 艒 艐 艎 艑 蔤 蔻 蔏 +- 蔀 蔩 蔎 蔉 蔍 蔟 蔊 蔧 蔜 蓻 蔫 蓺 蔈 蔌 蓴 蔪 +- 蓲 蔕 蓷 蓫 蓳 蓼 蔒 蓪 蓩 蔖 蓾 蔨 蔝 蔮 蔂 蓽 +- 蔞 蓶 蔱 蔦 蓧 蓨 蓰 蓯 蓹 蔘 蔠 蔰 蔋 蔙 蔯 虢 +- 蝖 蝣 蝤 蝷 蟡 蝳 蝘 蝔 蝛 蝒 蝡 蝚 蝑 蝞 蝭 蝪 +- 蝐 蝎 蝟 蝝 蝯 蝬 蝺 蝮 蝜 蝥 蝏 蝻 蝵 蝢 蝧 蝩 +- 衚 褅 褌 褔 褋 褗 褘 褙 褆 褖 褑 褎 褉 覢 覤 覣 +- 觭 觰 觬 諏 諆 誸 諓 諑 諔 諕 誻 諗 誾 諀 諅 諘 +- 諃 誺 誽 諙 谾 豍 貏 賥 賟 賙 賨 賚 賝 賧 趠 趜 +- 趡 趛 踠 踣 踥 踤 踮 踕 踛 踖 踑 踙 踦 踧 踔 踒 +- 踘 踓 踜 踗 踚 輬 輤 輘 輚 輠 輣 輖 輗 遳 遰 遯 +- 遧 遫 鄯 鄫 鄩 鄪 鄲 鄦 鄮 醅 醆 醊 醁 醂 醄 醀 +- 鋐 鋃 鋄 鋀 鋙 銶 鋏 鋱 鋟 鋘 鋩 鋗 鋝 鋌 鋯 鋂 +- 鋨 鋊 鋈 鋎 鋦 鋍 鋕 鋉 鋠 鋞 鋧 鋑 鋓 銵 鋡 鋆 +- 銴 镼 閬 閫 閮 閰 隤 隢 雓 霅 霈 霂 靚 鞊 鞎 鞈 +- 韐 韏 頞 頝 頦 頩 頨 頠 頛 頧 颲 餈 飺 餑 餔 餖 +- 餗 餕 駜 駍 駏 駓 駔 駎 駉 駖 駘 駋 駗 駌 骳 髬 +- 髫 髳 髲 髱 魆 魃 魧 魴 魱 魦 魶 魵 魰 魨 魤 魬 +- 鳼 鳺 鳽 鳿 鳷 鴇 鴀 鳹 鳻 鴈 鴅 鴄 麃 黓 鼏 鼐 +- 儜 儓 儗 儚 儑 凞 匴 叡 噰 噠 噮 噳 噦 噣 噭 噲 +- 噞 噷 圜 圛 壈 墽 壉 墿 墺 壂 墼 壆 嬗 嬙 嬛 嬡 +- 嬔 嬓 嬐 嬖 嬨 嬚 嬠 嬞 寯 嶬 嶱 嶩 嶧 嶵 嶰 嶮 +- 嶪 嶨 嶲 嶭 嶯 嶴 幧 幨 幦 幯 廩 廧 廦 廨 廥 彋 +- 徼 憝 憨 憖 懅 憴 懆 懁 懌 憺 憿 憸 憌 擗 擖 擐 +- 擏 擉 撽 撉 擃 擛 擳 擙 攳 敿 敼 斢 曈 暾 曀 曊 +- 曋 曏 暽 暻 暺 曌 朣 樴 橦 橉 橧 樲 橨 樾 橝 橭 +- 橶 橛 橑 樨 橚 樻 樿 橁 橪 橤 橐 橏 橔 橯 橩 橠 +- 樼 橞 橖 橕 橍 橎 橆 歕 歔 歖 殧 殪 殫 毈 毇 氄 +- 氃 氆 澭 濋 澣 濇 澼 濎 濈 潞 濄 澽 澞 濊 澨 瀄 +- 澥 澮 澺 澬 澪 濏 澿 澸 澢 濉 澫 濍 澯 澲 澰 燅 +- 燂 熿 熸 燖 燀 燁 燋 燔 燊 燇 燏 熽 燘 熼 燆 燚 +- 燛 犝 犞 獩 獦 獧 獬 獥 獫 獪 瑿 璚 璠 璔 璒 璕 +- 璡 甋 疀 瘯 瘭 瘱 瘽 瘳 瘼 瘵 瘲 瘰 皻 盦 瞚 瞝 +- 瞡 瞜 瞛 瞢 瞣 瞕 瞙 瞗 磝 磩 磥 磪 磞 磣 磛 磡 +- 磢 磭 磟 磠 禤 穄 穈 穇 窶 窸 窵 窱 窷 篞 篣 篧 +- 篝 篕 篥 篚 篨 篹 篔 篪 篢 篜 篫 篘 篟 糒 糔 糗 +- 糐 糑 縒 縡 縗 縌 縟 縠 縓 縎 縜 縕 縚 縢 縋 縏 +- 縖 縍 縔 縥 縤 罃 罻 罼 罺 羱 翯 耪 耩 聬 膱 膦 +- 膮 膹 膵 膫 膰 膬 膴 膲 膷 膧 臲 艕 艖 艗 蕖 蕅 +- 蕫 蕍 蕓 蕡 蕘 蕀 蕆 蕤 蕁 蕢 蕄 蕑 蕇 蕣 蔾 蕛 +- 蕱 蕎 蕮 蕵 蕕 蕧 蕠 薌 蕦 蕝 蕔 蕥 蕬 虣 虥 虤 +- 螛 螏 螗 螓 螒 螈 螁 螖 螘 蝹 螇 螣 螅 螐 螑 螝 +- 螄 螔 螜 螚 螉 褞 褦 褰 褭 褮 褧 褱 褢 褩 褣 褯 +- 褬 褟 觱 諠 諢 諲 諴 諵 諝 謔 諤 諟 諰 諈 諞 諡 +- 諨 諿 諯 諻 貑 貒 貐 賵 賮 賱 賰 賳 赬 赮 趥 趧 +- 踳 踾 踸 蹀 蹅 踶 踼 踽 蹁 踰 踿 躽 輶 輮 輵 輲 +- 輹 輷 輴 遶 遹 遻 邆 郺 鄳 鄵 鄶 醓 醐 醑 醍 醏 +- 錧 錞 錈 錟 錆 錏 鍺 錸 錼 錛 錣 錒 錁 鍆 錭 錎 +- 錍 鋋 錝 鋺 錥 錓 鋹 鋷 錴 錂 錤 鋿 錩 錹 錵 錪 +- 錔 錌 錋 鋾 錉 錀 鋻 錖 閼 闍 閾 閹 閺 閶 閿 閵 +- 閽 隩 雔 霋 霒 霐 鞙 鞗 鞔 韰 韸 頵 頯 頲 餤 餟 +- 餧 餩 馞 駮 駬 駥 駤 駰 駣 駪 駩 駧 骹 骿 骴 骻 +- 髶 髺 髹 髷 鬳 鮀 鮅 鮇 魼 魾 魻 鮂 鮓 鮒 鮐 魺 +- 鮕 魽 鮈 鴥 鴗 鴠 鴞 鴔 鴩 鴝 鴘 鴢 鴐 鴙 鴟 麈 +- 麆 麇 麮 麭 黕 黖 黺 鼒 鼽 儦 儥 儢 儤 儠 儩 勴 +- 嚓 嚌 嚍 嚆 嚄 嚃 噾 嚂 噿 嚁 壖 壔 壏 壒 嬭 嬥 +- 嬲 嬣 嬬 嬧 嬦 嬯 嬮 孻 寱 寲 嶷 幬 幪 徾 徻 懃 +- 憵 憼 懧 懠 懥 懤 懨 懞 擯 擩 擣 擫 擤 擨 斁 斀 +- 斶 旚 曒 檍 檖 檁 檥 檉 檟 檛 檡 檞 檇 檓 檎 檕 +- 檃 檨 檤 檑 橿 檦 檚 檅 檌 檒 歛 殭 氉 濌 澩 濴 +- 濔 濣 濜 濭 濧 濦 濞 濲 濝 濢 濨 燡 燱 燨 燲 燤 +- 燰 燢 獳 獮 獯 璗 璲 璫 璐 璪 璭 璱 璥 璯 甐 甑 +- 甒 甏 疄 癃 癈 癉 癇 皤 盩 瞵 瞫 瞲 瞷 瞶 瞴 瞱 +- 瞨 矰 磳 磽 礂 磻 磼 磲 礅 磹 磾 礄 禫 禨 穜 穛 +- 穖 穘 穔 穚 窾 竀 竁 簅 簏 篲 簀 篿 篻 簎 篴 簋 +- 篳 簂 簉 簃 簁 篸 篽 簆 篰 篱 簐 簊 糨 縭 縼 繂 +- 縳 顈 縸 縪 繉 繀 繇 縩 繌 縰 縻 縶 繄 縺 罅 罿 +- 罾 罽 翴 翲 耬 膻 臄 臌 臊 臅 臇 膼 臩 艛 艚 艜 +- 薃 薀 薏 薧 薕 薠 薋 薣 蕻 薤 薚 薞 蕷 蕼 薉 薡 +- 蕺 蕸 蕗 薎 薖 薆 薍 薙 薝 薁 薢 薂 薈 薅 蕹 蕶 +- 薘 薐 薟 虨 螾 螪 螭 蟅 螰 螬 螹 螵 螼 螮 蟉 蟃 +- 蟂 蟌 螷 螯 蟄 蟊 螴 螶 螿 螸 螽 蟞 螲 褵 褳 褼 +- 褾 襁 襒 褷 襂 覭 覯 覮 觲 觳 謞 謘 謖 謑 謅 謋 +- 謢 謏 謒 謕 謇 謍 謈 謆 謜 謓 謚 豏 豰 豲 豱 豯 +- 貕 貔 賹 赯 蹎 蹍 蹓 蹐 蹌 蹇 轃 轀 邅 遾 鄸 醚 +- 醢 醛 醙 醟 醡 醝 醠 鎡 鎃 鎯 鍤 鍖 鍇 鍼 鍘 鍜 +- 鍶 鍉 鍐 鍑 鍠 鍭 鎏 鍌 鍪 鍹 鍗 鍕 鍒 鍏 鍱 鍷 +- 鍻 鍡 鍞 鍣 鍧 鎀 鍎 鍙 闇 闀 闉 闃 闅 閷 隮 隰 +- 隬 霠 霟 霘 霝 霙 鞚 鞡 鞜 鞞 鞝 韕 韔 韱 顁 顄 +- 顊 顉 顅 顃 餥 餫 餬 餪 餳 餲 餯 餭 餱 餰 馘 馣 +- 馡 騂 駺 駴 駷 駹 駸 駶 駻 駽 駾 駼 騃 骾 髾 髽 +- 鬁 髼 魈 鮚 鮨 鮞 鮛 鮦 鮡 鮥 鮤 鮆 鮢 鮠 鮯 鴳 +- 鵁 鵧 鴶 鴮 鴯 鴱 鴸 鴰 鵅 鵂 鵃 鴾 鴷 鵀 鴽 翵 +- 鴭 麊 麉 麍 麰 黈 黚 黻 黿 鼤 鼣 鼢 齔 龠 儱 儭 +- 儮 嚘 嚜 嚗 嚚 嚝 嚙 奰 嬼 屩 屪 巀 幭 幮 懘 懟 +- 懭 懮 懱 懪 懰 懫 懖 懩 擿 攄 擽 擸 攁 攃 擼 斔 +- 旛 曚 曛 曘 櫅 檹 檽 櫡 櫆 檺 檶 檷 櫇 檴 檭 歞 +- 毉 氋 瀇 瀌 瀍 瀁 瀅 瀔 瀎 濿 瀀 濻 瀦 濼 濷 瀊 +- 爁 燿 燹 爃 燽 獶 璸 瓀 璵 瓁 璾 璶 璻 瓂 甔 甓 +- 癜 癤 癙 癐 癓 癗 癚 皦 皽 盬 矂 瞺 磿 礌 礓 礔 +- 礉 礐 礒 礑 禭 禬 穟 簜 簩 簙 簠 簟 簭 簝 簦 簨 +- 簢 簥 簰 繜 繐 繖 繣 繘 繢 繟 繑 繠 繗 繓 羵 羳 +- 翷 翸 聵 臑 臒 臐 艟 艞 薴 藆 藀 藃 藂 薳 薵 薽 +- 藇 藄 薿 藋 藎 藈 藅 薱 薶 藒 蘤 薸 薷 薾 虩 蟧 +- 蟦 蟢 蟛 蟫 蟪 蟥 蟟 蟳 蟤 蟔 蟜 蟓 蟭 蟘 蟣 螤 +- 蟗 蟙 蠁 蟴 蟨 蟝 襓 襋 襏 襌 襆 襐 襑 襉 謪 謧 +- 謣 謳 謰 謵 譇 謯 謼 謾 謱 謥 謷 謦 謶 謮 謤 謻 +- 謽 謺 豂 豵 貙 貘 貗 賾 贄 贂 贀 蹜 蹢 蹠 蹗 蹖 +- 蹞 蹥 蹧 蹛 蹚 蹡 蹝 蹩 蹔 轆 轇 轈 轋 鄨 鄺 鄻 +- 鄾 醨 醥 醧 醯 醪 鎵 鎌 鎒 鎷 鎛 鎝 鎉 鎧 鎎 鎪 +- 鎞 鎦 鎕 鎈 鎙 鎟 鎍 鎱 鎑 鎲 鎤 鎨 鎴 鎣 鎥 闒 +- 闓 闑 隳 雗 雚 巂 雟 雘 雝 霣 霢 霥 鞬 鞮 鞨 鞫 +- 鞤 鞪 鞢 鞥 韗 韙 韖 韘 韺 顐 顑 顒 颸 饁 餼 餺 +- 騏 騋 騉 騍 騄 騑 騊 騅 騇 騆 髀 髜 鬈 鬄 鬅 鬩 +- 鬵 魊 魌 魋 鯇 鯆 鯃 鮿 鯁 鮵 鮸 鯓 鮶 鯄 鮹 鮽 +- 鵜 鵓 鵏 鵊 鵛 鵋 鵙 鵖 鵌 鵗 鵒 鵔 鵟 鵘 鵚 麎 +- 麌 黟 鼁 鼀 鼖 鼥 鼫 鼪 鼩 鼨 齌 齕 儴 儵 劖 勷 +- 厴 嚫 嚭 嚦 嚧 嚪 嚬 壚 壝 壛 夒 嬽 嬾 嬿 巃 幰 +- 徿 懻 攇 攐 攍 攉 攌 攎 斄 旞 旝 曞 櫧 櫠 櫌 櫑 +- 櫙 櫋 櫟 櫜 櫐 櫫 櫏 櫍 櫞 歠 殰 氌 瀙 瀧 瀠 瀖 +- 瀫 瀡 瀢 瀣 瀩 瀗 瀤 瀜 瀪 爌 爊 爇 爂 爅 犥 犦 +- 犤 犣 犡 瓋 瓅 璷 瓃 甖 癠 矉 矊 矄 矱 礝 礛 礡 +- 礜 礗 礞 禰 穧 穨 簳 簼 簹 簬 簻 糬 糪 繶 繵 繸 +- 繰 繷 繯 繺 繲 繴 繨 罋 罊 羃 羆 羷 翽 翾 聸 臗 +- 臕 艤 艡 艣 藫 藱 藭 藙 藡 藨 藚 藗 藬 藲 藸 藘 +- 藟 藣 藜 藑 藰 藦 藯 藞 藢 蠀 蟺 蠃 蟶 蟷 蠉 蠌 +- 蠋 蠆 蟼 蠈 蟿 蠊 蠂 襢 襚 襛 襗 襡 襜 襘 襝 襙 +- 覈 覷 覶 觶 譐 譈 譊 譀 譓 譖 譔 譋 譕 譑 譂 譒 +- 譗 豃 豷 豶 貚 贆 贇 贉 趬 趪 趭 趫 蹭 蹸 蹳 蹪 +- 蹯 蹻 軂 轒 轑 轏 轐 轓 辴 酀 鄿 醰 醭 鏞 鏇 鏏 +- 鏂 鏚 鏐 鏹 鏬 鏌 鏙 鎩 鏦 鏊 鏔 鏮 鏣 鏕 鏄 鏎 +- 鏀 鏒 鏧 镽 闚 闛 雡 霩 霫 霬 霨 霦 鞳 鞷 鞶 韝 +- 韞 韟 顜 顙 顝 顗 颿 颽 颻 颾 饈 饇 饃 馦 馧 騚 +- 騕 騥 騝 騤 騛 騢 騠 騧 騣 騞 騜 騔 髂 鬋 鬊 鬎 +- 鬌 鬷 鯪 鯫 鯠 鯞 鯤 鯦 鯢 鯰 鯔 鯗 鯬 鯜 鯙 鯥 +- 鯕 鯡 鯚 鵷 鶁 鶊 鶄 鶈 鵱 鶀 鵸 鶆 鶋 鶌 鵽 鵫 +- 鵴 鵵 鵰 鵩 鶅 鵳 鵻 鶂 鵯 鵹 鵿 鶇 鵨 麔 麑 黀 +- 黼 鼭 齀 齁 齍 齖 齗 齘 匷 嚲 嚵 嚳 壣 孅 巆 巇 +- 廮 廯 忀 忁 懹 攗 攖 攕 攓 旟 曨 曣 曤 櫳 櫰 櫪 +- 櫨 櫹 櫱 櫮 櫯 瀼 瀵 瀯 瀷 瀴 瀱 灂 瀸 瀿 瀺 瀹 +- 灀 瀻 瀳 灁 爓 爔 犨 獽 獼 璺 皫 皪 皾 盭 矌 矎 +- 矏 矍 矲 礥 礣 礧 礨 礤 礩 禲 穮 穬 穭 竷 籉 籈 +- 籊 籇 籅 糮 繻 繾 纁 纀 羺 翿 聹 臛 臙 舋 艨 艩 +- 蘢 藿 蘁 藾 蘛 蘀 藶 蘄 蘉 蘅 蘌 藽 蠙 蠐 蠑 蠗 +- 蠓 蠖 襣 襦 覹 觷 譠 譪 譝 譨 譣 譥 譧 譭 趮 躆 +- 躈 躄 轙 轖 轗 轕 轘 轚 邍 酃 酁 醷 醵 醲 醳 鐋 +- 鐓 鏻 鐠 鐏 鐔 鏾 鐕 鐐 鐨 鐙 鐍 鏵 鐀 鏷 鐇 鐎 +- 鐖 鐒 鏺 鐉 鏸 鐊 鏿 鏼 鐌 鏶 鐑 鐆 闞 闠 闟 霮 +- 霯 鞹 鞻 韽 韾 顠 顢 顣 顟 飁 飂 饐 饎 饙 饌 饋 +- 饓 騲 騴 騱 騬 騪 騶 騩 騮 騸 騭 髇 髊 髆 鬐 鬒 +- 鬑 鰋 鰈 鯷 鰅 鰒 鯸 鱀 鰇 鰎 鰆 鰗 鰔 鰉 鶟 鶙 +- 鶤 鶝 鶒 鶘 鶐 鶛 鶠 鶔 鶜 鶪 鶗 鶡 鶚 鶢 鶨 鶞 +- 鶣 鶿 鶩 鶖 鶦 鶧 麙 麛 麚 黥 黤 黧 黦 鼰 鼮 齛 +- 齠 齞 齝 齙 龑 儺 儹 劘 劗 囃 嚽 嚾 孈 孇 巋 巏 +- 廱 懽 攛 欂 櫼 欃 櫸 欀 灃 灄 灊 灈 灉 灅 灆 爝 +- 爚 爙 獾 甗 癪 矐 礭 礱 礯 籔 籓 糲 纊 纇 纈 纋 +- 纆 纍 罍 羻 耰 臝 蘘 蘪 蘦 蘟 蘣 蘜 蘙 蘧 蘮 蘡 +- 蘠 蘩 蘞 蘥 蠩 蠝 蠛 蠠 蠤 蠜 蠫 衊 襭 襩 襮 襫 +- 觺 譹 譸 譅 譺 譻 贐 贔 趯 躎 躌 轞 轛 轝 酆 酄 +- 酅 醹 鐿 鐻 鐶 鐩 鐽 鐼 鐰 鐹 鐪 鐷 鐬 鑀 鐱 闥 +- 闤 闣 霵 霺 鞿 韡 顤 飉 飆 飀 饘 饖 騹 騽 驆 驄 +- 驂 驁 騺 騿 髍 鬕 鬗 鬘 鬖 鬺 魒 鰫 鰝 鰜 鰬 鰣 +- 鰨 鰩 鰤 鰡 鶷 鶶 鶼 鷁 鷇 鷊 鷏 鶾 鷅 鷃 鶻 鶵 +- 鷎 鶹 鶺 鶬 鷈 鶱 鶭 鷌 鶳 鷍 鶲 鹺 麜 黫 黮 黭 +- 鼛 鼘 鼚 鼱 齎 齥 齤 龒 亹 囆 囅 囋 奱 孋 孌 巕 +- 巑 廲 攡 攠 攦 攢 欋 欈 欉 氍 灕 灖 灗 灒 爞 爟 +- 犩 獿 瓘 瓕 瓙 瓗 癭 皭 礵 禴 穰 穱 籗 籜 籙 籛 +- 籚 糴 糱 纑 罏 羇 臞 艫 蘴 蘵 蘳 蘬 蘲 蘶 蠬 蠨 +- 蠦 蠪 蠥 襱 覿 覾 觻 譾 讄 讂 讆 讅 譿 贕 躕 躔 +- 躚 躒 躐 躖 躗 轠 轢 酇 鑌 鑐 鑊 鑋 鑏 鑇 鑅 鑈 +- 鑉 鑆 霿 韣 顪 顩 飋 饔 饛 驎 驓 驔 驌 驏 驈 驊 +- 驉 驒 驐 髐 鬙 鬫 鬻 魖 魕 鱆 鱈 鰿 鱄 鰹 鰳 鱁 +- 鰼 鰷 鰴 鰲 鰽 鰶 鷛 鷒 鷞 鷚 鷋 鷐 鷜 鷑 鷟 鷩 +- 鷙 鷘 鷖 鷵 鷕 鷝 麶 黰 鼵 鼳 鼲 齂 齫 龕 龢 儽 +- 劙 壨 壧 奲 孍 巘 蠯 彏 戁 戃 戄 攩 攥 斖 曫 欑 +- 欒 欏 毊 灛 灚 爢 玂 玁 玃 癰 矔 籧 籦 纕 艬 蘺 +- 虀 蘹 蘼 蘱 蘻 蘾 蠰 蠲 蠮 蠳 襶 襴 襳 觾 讌 讎 +- 讋 讈 豅 贙 躘 轤 轣 醼 鑢 鑕 鑝 鑗 鑞 韄 韅 頀 +- 驖 驙 鬞 鬟 鬠 鱒 鱘 鱐 鱊 鱍 鱋 鱕 鱙 鱌 鱎 鷻 +- 鷷 鷯 鷣 鷫 鷸 鷤 鷶 鷡 鷮 鷦 鷲 鷰 鷢 鷬 鷴 鷳 +- 鷨 鷭 黂 黐 黲 黳 鼆 鼜 鼸 鼷 鼶 齃 齏 齱 齰 齮 +- 齯 囓 囍 孎 屭 攭 曭 曮 欓 灟 灡 灝 灠 爣 瓛 瓥 +- 矕 礸 禷 禶 籪 纗 羉 艭 虃 蠸 蠷 蠵 衋 讔 讕 躞 +- 躟 躠 躝 醾 醽 釂 鑫 鑨 鑩 雥 靆 靃 靇 韇 韥 驞 +- 髕 魙 鱣 鱧 鱦 鱢 鱞 鱠 鸂 鷾 鸇 鸃 鸆 鸅 鸀 鸁 +- 鸉 鷿 鷽 鸄 麠 鼞 齆 齴 齵 齶 囔 攮 斸 欘 欙 欗 +- 欚 灢 爦 犪 矘 矙 礹 籩 籫 糶 纚 纘 纛 纙 臠 臡 +- 虆 虇 虈 襹 襺 襼 襻 觿 讘 讙 躥 躤 躣 鑮 鑭 鑯 +- 鑱 鑳 靉 顲 饟 鱨 鱮 鱭 鸋 鸍 鸐 鸏 鸒 鸑 麡 黵 +- 鼉 齇 齸 齻 齺 齹 圞 灦 籯 蠼 趲 躦 釃 鑴 鑸 鑶 +- 鑵 驠 鱴 鱳 鱱 鱵 鸔 鸓 黶 鼊 龤 灨 灥 糷 虪 蠾 +- 蠽 蠿 讞 貜 躩 軉 靋 顳 顴 飌 饡 馫 驤 驦 驧 鬤 +- 鸕 鸗 齈 戇 欞 爧 虌 躨 钂 钀 钁 驩 驨 鬮 鸙 爩 +- 虋 讟 钃 鱹 麷 癵 驫 鱺 鸝 灩 灪 麤 齾 齉 龘 碁 +- 銹 裏 墻 恒 粧 嫺 ╔ ╦ ╗ ╠ ╬ ╣ ╚ ╩ ╝ ╒ +- ╤ ╕ ╞ ╪ ╡ ╘ ╧ ╛ ╓ ╥ ╖ ╟ ╫ ╢ ╙ ╨ +- ╜ ║ ═ ╭ ╮ ╰ ╯ ■ 𠕇 鋛 𠗟  蕌 䊵 珯 况 +- 㙉 𤥂 𨧤 鍄 𡧛 苮 𣳈 砼 杄 拟 𤤳 𨦪 𠊠 𦮳 𡌅 侫 +-  倈 𦴩  𣘀 𤪱 𢔓 𠍾 徤 𠎀 𠍇 滛 𠐟 儁 㑺 儎 +- 顬 㝃 萖  𠒇 兠 𣎴 兪 𠯿 𢃼 𠋥 𢔰 𠖎 𣈳  宂 +- 蝽 𠖳 𣲙 冲 冸 鴴 凉 减 凑 㳜 凓 𤪦 决 凢 卂 凭 +- 菍 椾  彻 刋 刦 刼 劵 剗 劔 効 勅 簕 蕂 勠 蘍 +-  𨫞 啉 滙 𣾀 𠥔 𣿬 匳 𠯢 泋 𡜦 栛 珕 恊 㺪 㣌 +- 𡛨 燝 䒢 卭 却 𨚫 卾 𡖖 𡘓 矦 厓 𨪛 厠 厫 厮 玧 +- 𥝲 㽙 玜 叁 叅 汉 义 埾 叙 㪫 𠮏 叠 𣿫 𢶣 叶 𠱷 +- 吓 灹 唫 晗 浛 呭 𦭓  啝 咏 咤 䞦   㶴 𠵍 +- 𨦼 𢚘 啇 䳭 启 琗 喆 喩 𡣗 𤀺 䕒 𤐵 暳 𡂴 嘷 曍 +- 𣊊 暤 暭 噍 噏 磱 囱 鞇 叾 圀 囯 园 𨭦 㘣 𡉏 坆 +- 𤆥 汮 炋 坂 㚱 𦱾 埦  堃 𡑔 𤍣 堦 𤯵 塜 墪 㕡 +- 壠 壜  壻 寿 坃 𪅐 𤉸 鏓 㖡 够 梦 㛃 湙 𡘾 娤 +- 啓 𡚒 蔅 姉 𠵎 𦲁 𦴪 𡟜 姙 𡟻 𡞲 𦶦 浱 𡠨 𡛕 姹 +- 𦹅 媫 婣 㛦  㜈 媖 瑥 嫓 𦾡  㶅 𡤑 㜲  広 +- 勐 孶 斈 孼 𧨎 䀄 䡝  寕 慠   𠖥 寳 宝 䴐 +- 尅 𡭄 尓 珎 尔 𡲥 𦬨 屉 䣝 岅 峩 峯 嶋 𡷹 𡸷 崐 +- 崘 嵆 𡺤 岺 巗 苼 㠭 𤤁 𢁉 𢅳 芇 㠶 㯂 帮 檊 幺 +-  𠳓 厦 亷 厨 𡝱 帉 廴 𨒂 廹 廻 㢠 廼 栾 鐛 弍 +- 𠇁 弢 㫞 䢮 𡌺 强 𦢈 𢏐 𢑱 彣 鞽 𦹮 彲 鍀  徧 +- 嶶 㵟  𡽪 𧃸 𢙨 釖 𠊞 𨨩 怱 暅  㥣 㷇 㘹 垐 +- 𢞴 祱 㹀 悞 悳  𤦏  璤 僡 媠 慤 萤 慂  𦻒 +- 憁 凴  憇 宪 𣾷 𢡟 懓 𨮝 𩥝 懐 㤲 𢦀 𢣁 怣 慜 +- 攞 掋 𠄘 担 𡝰 拕 𢸍 捬 𤧟 㨗 搸 揸  𡟼 澊 𢸶 +- 頔 𤂌 𥜝 擡 擥 鑻 㩦 携 㩗 敍 漖 𤨨 𤨣 斅 敭 敟 +- 𣁾 斵 𤥀 䬷 旑 䃘 𡠩 无 旣 忟 𣐀 昘 𣇷 𣇸 晄 𣆤 +- 𣆥 晋 𠹵 晧 𥇦 晳  𣈱 𨗴 𣇈 𥌓 矅 𢣷 馤 朂 𤎜 +- 𤨡 㬫 槺 𣟂 杧 杢   柗 䓩 栢 湐 鈼 栁 𣏦 𦶠 +- 桝  槡 樋 𨫟 楳 棃 𣗍 椁 椀 㴲 㨁 𣘼 㮀 枬 楡 +- 𨩊 䋼 椶 榘 㮡 𠏉 荣 傐 槹  𢄪 橅  檝 㯳 枱 +- 櫈 𩆜 㰍 欝  惞 欵 歴  溵 𣫛 𠎵  㝀 吡 𣭚 +- 毡 𣻼 毜 氷 𢒋  𦭑 汚 舦 汹 𣶼 䓅 𣶽 𤆤 𤤌 𤤀 +- 𣳉 㛥 㳫  鮃 𣇹  羏 样 𦴥 𦶡 𦷫 涖 浜 湼 漄 +- 𤥿  𦹲 蔳 𦽴 凇 萮 𨬡 𣸯 瑓 𣾂 秌 湏 媑 𣁋 濸 +- 㜍 澝 𣸰 滺 𡒗 𤀽 䕕 鏰 潄 潜 㵎 潴  㴻 澟 𤅄 +- 濓  𤅕 𤀹 𥴠  𤄿 凟 𤅖 𤅗 𤅀 𦇝 灋 灾 炧 炁 +- 烌 烕 烖 烟 䄄 㷨 熴 熖 𤉷 焫 煅 媈 煊 岜 𤍥 煏 +- 鍢  焬 𤑚 𤨧 𤨢 熺 𨯨 炽 爎 鑂 爕 夑 鑃 爤 鍁 +-  爮 牀 𤥴 梽 牕 牗 㹕  栍 漽 犂 猫 𤠣 𨠫 䣭 +- 𨠄 猨 献 珏 玪  𦨮 珉 瑉 𤇢 𡛧 𤨤 昣 㛅 𤦷 𤦍 +-  珷 琕 椃 𤨦 琹  㻗 𢢭 瑠 𨺲 瑇 珤 瑶 莹 瑬 +- 㜰 瑴 鏱 樬 璂 䥓  𤅟 𤩹 𨮏 孆  𡢞 瓈 𡦈 甎 +- 甞 𨻙 𡩋 寗  鎅 畍 畊 畧 畮 𤾂 㼄  疎 瑝 疞 +- 疴 瘂 瘬 癑 癏 癯 癶  皐 臯 㟸 𦤑 𦤎 皡 皥 皷 +- 盌 𦾟 葢 𥂝 𥅽  眞 眦 着 撯 𥈠 睘 𣊬 瞯   +- 𡛁 矴   棊 碯 磇 磓 隥 礮 𥗠 磗 礴 碱 𧘌 辸 +- 袄 𨬫  𢘜 禆 褀 椂 禀 𥡗 禝 𧬹 礼 禩 渪 𧄦 㺨 +- 秆 𩄍 秔 ++ 䏰 䰲 䘃 䖦 䕸 𧉧 䵷 䖳 𧲱 䳢 𧳅 㮕 䜶 䝄 䱇 䱀 ++ 𤊿 𣘗 𧍒 𦺋 𧃒 䱗 𪍑 䝏 䗚 䲅 𧱬 䴇 䪤 䚡 𦬣 爥 ++ 𥩔 𡩣 𣸆 𣽡 晍 囻 綕 夝 𨮹 㷴 霴 𧯯 寛 𡵞 媤 㘥 ++ 𩺰 嫑 宷 峼 杮 薓 𩥅 瑡 璝 㡵 𡵓 𣚞 𦀡 㻬 𥣞 㫵 ++ 竼 龗 𤅡 𨤍 𣇪 𠪊 𣉞 䌊 蒄 龖 鐯 䤰 蘓 墖 靊 鈘 ++ 秐 稲 晠 権 袝 瑌 篅 枂 稬 剏 遆 㓦 珄 𥶹 瓆 鿇 ++ 垳 䤯 呌 䄱 𣚎 堘 穲 𧭥 讏 䚮 𦺈 䆁 𥶙 箮 𢒼 鿈 ++ 𢓁 𢓉 𢓌 鿉 蔄 𣖻 䂴 鿊 䓡 𪷿 拁 灮 鿋 ㇀ ㇁ ㇂ ++ ㇃ ㇄ 𠄌 ㇅ 𠃑 𠃍 ㇆ ㇇ 𠃋 𡿨 ㇈ 𠃊 ㇉ ㇊ ㇋ ㇌ ++ 𠄎 ㇍ ㇎ Ā Á Ǎ À Ē É Ě È Ō Ó Ǒ Ò Ê̄ ++ Ế Ê̌ Ề Ê ā á ǎ à ɑ ē é ě è ī í ǐ ++ ì ō ó ǒ ò ū ú ǔ ù ǖ ǘ ǚ ǜ ü ê̄ ế ++ ê̌ ề ê ɡ ⏚ ⏛ 𪎩 𡅅 攊 丽 滝 鵎 釟 𧜵 撑 会 ++ 伨 侨 兖 兴 农 凤 务 动 医 华 发 变 团 声 处 备 ++ 夲 头 学 实 実 岚 庆 总 斉 柾 栄 桥 济 炼 电 纤 ++ 纬 纺 织 经 统 缆 缷 艺 苏 药 视 设 询 车 轧 轮 ++ 琑 糼 緍 楆 竉 刧 醌 碸 酞 肼 贋 胶 𠧧 肟 黇 䳍 ++ 鷉 鸌 䰾 𩷶 𧀎 鸊 𪄳 㗁 溚 舾 甙 䤑 马 骏 龙 禇 ++ 𨑬 𡷊 𠗐 𢫦 两 亁 亀 亇 亿 仫 伷 㑌 侽 㹈 倃 傈 ++ 㑽 㒓 㒥 円 夅 凛 凼 刅 争 剹 劐 匧 㗇 厩 㕑 厰 ++ 㕓 参 吣 㕭 㕲 㚁 咓 咣 咴 咹 哐 哯 唘 唣 唨 㖘 ++ 唿 㖥 㖿 嗗 㗅 𧶄 唥 𠱂 𠴕 𥄫 喐 𢳆 㧬 𠍁 蹆 𤶸 ++ 𩓥 䁓 𨂾 睺 𢰸 㨴 䟕 𨅝 𦧲 𤷪 擝 𠵼 𠾴 𠳕 𡃴 撍 ++ 蹾 𠺖 𠰋 𠽤 𢲩 𨉖 𤓓 𠵆 𩩍 𨃩 䟴 𤺧 𢳂 骲 㩧 𩗴 ++ 㿭 㔆 𥋇 𩟔 𧣈 𢵄 鵮 頕 䏙 𦂥 撴 哣 𢵌 𢯊 𡁷 㧻 ++ 𡁯 𦛚 𦜖 𧦠 擪 𥁒 𠱃 蹨 𢆡 𨭌 𠜱 䠋 𠆩 㿺 塳 𢶍 ++ 𤗈 𠓼 𦂗 𠽌 𠶖 啹 䂻 䎺 䪴 𢩦 𡂝 膪 飵 𠶜 捹 㧾 ++ 𢝵 跀 嚡 摼 㹃 𪘁 𠸉 𢫏 𢳉 𡃈 𣧂 㦒 㨆 𨊛 㕸 𥹉 ++ 𢃇 噒 𠼱 𢲲 𩜠 㒼 氽 𤸻 𧕴 𢺋 𢈈 𪙛 𨳍 𠹺 𠰴 𦠜 ++ 羓 𡃏 𢠃 𢤹 㗻 𥇣 𠺌 𠾍 𠺪 㾓 𠼰 𠵇 𡅏 𠹌 𠺫 𠮩 ++ 𠵈 𡃀 𡄽 㿹 𢚖 搲 𠾭 𣏴 𧘹 𢯎 𠵾 𠵿 𢱑 𢱕 㨘 𠺘 ++ 𡃇 𠼮 𪘲 𦭐 𨳒 𨶙 𨳊 閪 哌 苄 喹 𩻃 鰦 骶 𧝞 𢷮 ++ 煀 腭 胬 尜 𦕲 脴 㞗 卟 𨂽 醶 𠻺 𠸏 𠹷 𠻻 㗝 𤷫 ++ 㘉 𠳖 嚯 𢞵 𡃉 𠸐 𠹸 𡁸 𡅈 𨈇 𡑕 𠹹 𤹐 𢶤 婔 𡀝 ++ 𡀞 𡃵 𡃶 垜 𠸑 𧚔 𨋍 𠾵 𠹻 𥅾 㜃 𠾶 𡆀 𥋘 𪊽 𤧚 ++ 𡠺 𤅷 𨉼 墙 剨 㘚 𥜽 箲 孨 䠀 䬬 鼧 䧧 鰟 鮍 𥭴 ++ 𣄽 嗻 㗲 嚉 丨 夂 𡯁 屮 靑 𠂆 乛 亻 㔾 尣 彑 忄 ++ 㣺 扌 攵 歺 氵 氺 灬 爫 丬 犭 𤣩 罒 礻 糹 罓 𦉪 ++ 㓁 𦍋 耂 肀 𦘒 𦥑 卝 衤 见 𧢲 讠 贝 钅 镸 长 门 ++ 𨸏 韦 页 风 飞 饣 𩠐 鱼 鸟 黄 歯 龜 丷 𠂇 阝 户 ++ 钢 倻 淾 𩱳 龦 㷉 袏 𤅎 灷 峵 䬠 𥇍 㕙 𥴰 愢 𨨲 ++ 辧 釶 熑 朙 玺 𣊁 𪄇 㲋 𡦀 䬐 磤 琂 冮 𨜏 䀉 橣 ++ 𪊺 䈣 蘏 𠩯 稪 𩥇 𨫪 靕 灍 匤 𢁾 鏴 盙 𨧣 龧 矝 ++ 亣 俰 傼 丯 众 龨 吴 綋 墒 壐 𡶶 庒 庙 忂 𢜒 斋 ++ 𣏹 椙 橃 𣱣 泿 爀 𤔅 玌 㻛 𤨓 嬕 璹 讃 𥲤 𥚕 窓 ++ 篬 糃 繬 苸 薗 龩 袐 龪 躹 龫 迏 蕟 駠 鈡 龬 𨶹 ++ 𡐿 䁱 䊢 娚 顨 杫 䉶 圽 藖 𤥻 芿 𧄍 䲁 𦵴 嵻 𦬕 ++ 𦾾 龭 龮 宖 龯 曧 繛 湗 秊 㶈 䓃 𣉖 𢞖 䎚 䔶 峕 ++ 𣬚 諹 屸 㴒 𣕑 嵸 龲 煗 䕘 𤃬 𡸣 䱷 㥸 㑊 𠆤 𦱁 ++ 諌 侴 𠈹 妿 腬 顖 𩣺 弻 𠮟 𢇁 𨥭 䄂 䚻 𩁹 㼇 龳 ++ 𪆵 䃸 㟖 䛷 𦱆 䅼 𨚲 𧏿 䕭 㣔 𥒚 䕡 䔛 䶉 䱻 䵶 ++ 䗪 㿈 𤬏 㙡 䓞 䒽 䇭 崾 嵈 嵖 㷼 㠏 嶤 嶹 㠠 㠸 ++ 幂 庽 弥 徃 㤈 㤔 㤿 㥍 惗 愽 峥 㦉 憷 憹 懏 㦸 ++ 戬 抐 拥 挘 㧸 嚱 㨃 揢 揻 搇 摚 㩋 擀 崕 嘡 龟 ++ 㪗 斆 㪽 旿 晓 㫲 暒 㬢 朖 㭂 枤 栀 㭘 桊 梄 㭲 ++ 㭱 㭻 椉 楃 牜 楤 榟 榅 㮼 槖 㯝 橥 橴 橱 檂 㯬 ++ 檙 㯲 檫 檵 櫔 櫶 殁 毁 毪 汵 沪 㳋 洂 洆 洦 涁 ++ 㳯 涤 涱 渕 渘 温 溆 𨧀 溻 滢 滚 齿 滨 滩 漤 漴 ++ 㵆 𣽁 澁 澾 㵪 㵵 熷 岙 㶊 瀬 㶑 灐 灔 灯 灿 炉 ++ 𠌥 䏁 㗱 𠻘 𣻗 垾 𦻓 焾 𥟠 㙎 榢 𨯩 孴 穉 𥣡 𩓙 ++ 穥 穽 𥦬 窻 窰 竂 竃 燑 𦒍 䇊 竚 竝 竪 䇯 咲 𥰁 ++ 笋 筕 笩 𥌎 𥳾 箢 筯 莜 𥮴 𦱿 篐 萡 箒 𥴠 㶭 𥱥 ++ 蒒 篺 簵 𥳁 籄 粃 𤢂 粦 晽 𤕸 糉 糇 糦 籴 糳 糵 ++ 繧 䔝 𦹄 絝 𦻖 璍 綉 綫 焵 綳 𤁗 𦀩 緤 㴓 緵 𡟹 ++ 緥 𨍭 𦄡 𦅚 繮 纒 䌫 鑬 縧 罀 罁 罇 礶 𦋐 駡 羗 ++ 𦍑 羣 𡙡 𠁨 䕜 𣝦 䔃 𨌺 翺 𦒉 耈 耝 耯 𪂇 𦳃 耻 ++ 耼 聡 𢜔 䦉 𦘦 𣷣 𦛨 朥 肧 𨩈 脇 脚 墰 𢛶 汿 𦒘 ++ 𤾸 擧 𡒊 舘 𡡞 橓 𤩥 𤪕 䑺 舩 𠬍 𦩒 𣵾 俹 𡓽 蓢 ++ 荢 𦬊 𤦧 𣔰 𡝳 𣷸 芪 椛 芳 䇛 蕋 苐 茚 𠸖 𡞴 㛁 ++ 𣅽 𣕚 艻 苢 茘 𣺋 𦶣 𦬅 𦮗 𣗎 㶿 茝 嗬 莅 䔋 𦶥 ++ 莬 菓 㑾 𦻔 橗 蕚 㒖 𦹂 𢻯 葘 𥯤 葱 㷓 䓤 檧 葊 ++ 𣲵 祘 𦮖 𦹷 𦹃 蓞 莑 䒠 蒓 蓤 𥲑 䉀 𥳀 䕃 蔴 嫲 ++ 𦺙 䔧 蕳 䔖 枿 蘖 𨘥 𨘻 藁 𧂈 蘂 𡖂 𧃍 䕫 䕪 蘨 ++ 㙈 𡢢 号 𧎚 虾 蝱 𪃸 蟮 𢰧 螱 蟚 蠏 噡 虬 桖 䘏 ++ 衅 衆 𧗠 𣶹 𧗤 衞 袜 䙛 袴 袵 揁 装 睷 𧜏 覇 覊 ++ 覧 覼 𨨥 觧 𧤤 𧪽 誜 瞓 釾 誐 𧩙 竩 𧬺 𣾏 䜓 𧬸 ++ 煼 謌 謟 𥐰 𥕥 謿 譌 譍 誩 𤩺 讐 讛 誯 𡛟 䘕 衏 ++ 貛 𧵔 𧶏 貫 㜥 𧵓 賖 𧶘 𧶽 贒 贃 𡤐 賛 灜 贑 𤳉 ++ 㻐 趩 𨀂 𡀔 𤦊 㭼 𨆼 𧄌 竧 躭 躶 軃 鋔 輙 輭 𨍥 ++ 𨐒 辥 錃 𪊟 𠩐 辳 䤪 𨧞 𨔽 𣶻 廸 𣉢 迹 𪀔 𨚼 𨔁 ++ 𢌥 㦀 𦻗 逷 𨔼 𧪾 遡 𨕬 𨘋 邨 𨜓 郄 𨛦 邮 酧 㫰 ++ 醩 釄 粬 𨤳 𡺉 鈎 沟 鉁 鉢 𥖹 𨫆 𣲛 𨬌 𥗛 𠴱 錬 ++ 鍫 𨫡 𨯫 炏 嫃 𨫢 𨫥 䥥 鉄 𨯬 𨰹 𨯿 鍳 鑛 躼 閅 ++ 閦 鐦 閠 濶 䊹 𢙺 𨛘 𡉼 𣸮 䧟 氜 陻 隖 䅬 隣 𦻕 ++ 懚 隶 磵 𨫠 隽 双 䦡 𦲸 𠉴 𦐐 𩂯 𩃥 𤫑 𡤕 𣌊 霱 ++ 虂 霶 䨏 䔽 䖅 𤫩 灵 孁 霛 𩇕 靗 孊 𩇫 靟 鐥 僐 ++ 𣂷 𣂼 鞉 鞟 鞱 鞾 韀 韒 韠 𥑬 韮 琜 𩐳 韵 𩐝 𧥺 ++ 䫑 頴 頳 顋 顦 㬎 𧅵 㵑 𠘰 𤅜 𥜆 飊 颷 飈 飇 䫿 ++ 𦴧 𡛓 喰 飡 飦 飬 鍸 餹 𤨩 䭲 𩡗 𩤅 駵 騌 騻 騐 ++ 驘 𥜥 㛄 𩂱 𩯕 髠 髢 𩬅 髴 䰎 鬔 鬭 𨘀 倴 鬴 𦦨 ++ 㣃 𣁽 魐 魀 𩴾 婅 𡡣 鮎 𤉋 鰂 鯿 鰌 𩹨 鷔 𩾷 𪆒 ++ 𪆫 𪃡 𪄣 𪇟 鵾 鶃 𪄴 鸎 梈 鷄 𢅛 𪆓 𪈠 𡤻 𪈳 鴹 ++ 𪂹 𪊴 麐 麕 麞 麢 䴴 麪 麯 𤍤 黁 㭠 㧥 㴝 伲 㞾 ++ 𨰫 鼂 鼈 䮖 鐤 𦶢 鼗 鼹 嚟 嚊 齅 馸 𩂋 韲 葿 齢 ++ 齩 竜 龎 爖 䮾 𤥵 𤦻 煷 𤧸 𤍈 𤩑 玞 𨯚 𡣺 禟 𨥾 ++ 𨸶 鍩 鏳 𨩄 鋬 鎁 鏋 𨥬 𤒹 爗 㻫 睲 穃 烐 𤑳 𤏸 ++ 煾 𡟯 炣 𡢾 𣖙 㻇 𡢅 𥐯 𡟸 㜢 𡛻 𡠹 㛡 𡝴 𡣑 𥽋 ++ 㜣 𡛀 坛 𤨥 𡏾 𡊨 𡏆 𡒶 蔃 𣚦 葕 𤦔 𧅥 𣸱 𥕜 𣻻 ++ 𧁒 䓴 𣛮 𩦝 𦼦 柹 㜳 㰕 㷧 塬 𡤢 栐 䁗 𣜿 𤃡 𤂋 ++ 𤄏 𦰡 哋 嚞 𦚱 嚒 𠿟 𠮨 𠸍 鏆 𨬓 鎜 仸 儫 㠙 𤐶 ++ 亼 𠑥 𠍿 佋 侊 𥙑 婨 𠆫 𠏋 㦙 𠌊 𠐔 㐵 伩 𠋀 𨺳 ++ 𠉵 諚 𠈌 亘 働 儍 侢 伃 𤨎 𣺊 佂 倮 偬 傁 俌 俥 ++ 偘 僼 湶 𣖕 𣸹 𣺿 浲 𡢄 𣺉 冨 凃 𠗠 䓝 𠒣 𠒒 𠒑 ++ 赺 𨪜 𠜎 剙 劤 𠡳 勡 䙺 熌 𤎌 𠰠 𤦬 𡃤 槑 𠸝 㻞 ++ 璙 琔 瑖 玘 䮎 𤪼 𤂍 叐 㖄 爏 𤃉 喴 𠍅 响 𠯆 圝 ++ 鉝 雴 鍦 埝 垍 坿 㘾 壋 媙 𨩆 𡛺 𡝯 𡜐 娬 妸 銏 ++ 婾 嫏 娒 𥥆 𡧳 𡡡 𤊕 㛵 洅 瑃 娡 𥺃 媁 𨯗 𠐓 鏠 ++ 璌 𡌃 焅 䥲 鐈 𨧻 鎽 㞠 尞 岞 幞 幈 𡦖 𡥼 𣫮 廍 ++ 孏 𡤃 𡤄 㜁 𡢠 㛝 𡛾 㛓 脪 𨩇 𡶺 𣑲 𨦨 弌 弎 𡤧 ++ 𡞫 婫 𡜻 孄 蘔 𧗽 衠 恾 𢡠 𢘫 忛 㺸 𢖯 𢖾 𩂈 𦽳 ++ 懀 𠀾 𠁆 𢘛 憙 憘 恵 𢲛 𢴇 𤛔 𩅍 摱 𤙥 𢭪 㨩 𢬢 ++ 𣑐 𩣪 𢹸 挷 𪑛 撶 挱 揑 𤧣 𢵧 护 𢲡 搻 敫 楲 㯴 ++ 𣂎 𣊭 𤦉 𣊫 唍 𣋠 𡣙 𩐿 曎 𣊉 𣆳 㫠 䆐 𥖄 𨬢 𥖏 ++ 𡛼 𥕛 𥐥 磮 𣄃 𡠪 𣈴 㑤 𣈏 𣆂 𤋉 暎 𦴤 晫 䮓 昰 ++ 𧡰 𡷫 晣 𣋒 𣋡 昞 𥡲 㣑 𣠺 𣞼 㮙 𣞢 𣏾 瓐 㮖 枏 ++ 𤘪 梶 栞 㯄 檾 㡣 𣟕 𤒇 樳 橒 櫉 欅 𡤒 攑 梘 橌 ++ 㯗 橺 歗 𣿀 𣲚 鎠 鋲 𨯪 𨫋 銉 𨀞 𨧜 鑧 涥 漋 𤧬 ++ 𣽿 㶏 渄 𤀼 娽 渊 塇 洤 硂 焻 𤌚 𤉶 烱 牐 犇 犔 ++ 𤞏 𤜥 兹 𤪤 𠗫 瑺 𣻸 𣙟 𤩊 𤤗 𥿡 㼆 㺱 𤫟 𨰣 𣼵 ++ 悧 㻳 瓌 琼 鎇 琷 䒟 𦷪 䕑 疃 㽣 𤳙 𤴆 㽘 畕 癳 ++ 𪗆 㬙 瑨 𨫌 𤦫 𤦎 㫻 㷍 𤩎 㻿 𤧅 𤣳 釺 圲 鍂 𨫣 ++ 𡡤 僟 𥈡 𥇧 睸 𣈲 眎 眏 睻 𤚗 𣞁 㩞 𤣰 琸 璛 㺿 ++ 𤪺 𤫇 䃈 𤪖 𦆮 錇 𥖁 砞 碍 碈 磒 珐 祙 𧝁 𥛣 䄎 ++ 蒖 禥 樭 𣻺 稺 秴 䅮 𡛦 䄲 鈵 秱 𠵌 𤦌 𠊙 𣶺 𡝮 ++ 㖗 啫 㕰 㚪 𠇔 𠰍 竢 婙 𢛵 𥪯 𥪜 娍 𠉛 磰 娪 𥯆 ++ 竾 䇹 籝 籭 䈑 𥮳 𥺼 𥺦 糍 𤧹 𡞰 粎 籼 粮 檲 緜 ++ 縇 緓 罎 𦉡 𦅜 𧭈 綗 𥺂 䉪 𦭵 𠤖 柖 𠁎 𣗏 埄 𦐒 ++ 𦏸 𤥢 翝 笧 𠠬 𥫩 𥵃 笌 𥸎 駦 虅 驣 樜 𣐿 㧢 𤧷 ++ 𦖭 騟 𦖠 蒀 𧄧 𦳑 䓪 脷 䐂 胆 脉 腂 𦞴 飃 𦩂 艢 ++ 艥 𦩑 葓 𦶧 蘐 𧈛 媆 䅿 𡡀 嬫 𡢡 嫤 𡣘 蚠 蜨 𣶏 ++ 蠭 𧐢 娂 衮 佅 袇 袿 裦 襥 襍 𥚃 襔 𧞅 𧞄 𨯵 𨯙 ++ 𨮜 𨧹 㺭 蒣 䛵 䛏 㟲 訽 訜 𩑈 彍 鈫 𤊄 旔 焩 烄 ++ 𡡅 鵭 貟 賩 𧷜 妚 矃 姰 䍮 㛔 踪 躧 𤰉 輰 轊 䋴 ++ 汘 澻 𢌡 䢛 潹 溋 𡟚 鯩 㚵 𤤯 邻 啱 䤆 醻 鐄 𨩋 ++ 䁢 𨫼 鐧 𨰝 𨰻 蓥 訫 閙 閧 閗 閖 𨴴 瑅 㻂 𤣿 𤩂 ++ 𤏪 㻧 𣈥 随 𨻧 𨹦 𨹥 㻌 𤧭 𤩸 𣿮 琒 瑫 㻼 靁 𩂰 ++ 桇 䨝 𩂓 𥟟 鍨 𨦉 𨰦 𨬯 𦎾 銺 嬑 譩 䤼 珹 𤈛 鞛 ++ 靱 餸 𠼦 巁 𨯅 𤪲 頟 𩓚 鋶 𩗗 釥 䓀 𨭐 𤩧 𨭤 飜 ++ 𨩅 㼀 鈪 䤥 萔 餻 饍 𧬆 㷽 馛 䭯 馪 驜 𨭥 𥣈 檏 ++ 騡 嫾 騯 𩣱 䮐 𩥈 馼 䮽 䮗 鍽 塲 𡌂 堢 𤦸 𡓨 硄 ++ 𢜟 𣶸 棅 㵽 鑘 㤧 慐 𢞁 𢥫 愇 鱏 鱓 鱻 鰵 鰐 魿 ++ 鯏 𩸭 鮟 𪇵 𪃾 鴡 䲮 𤄄 鸘 䲰 鴌 𪆴 𪃭 𪃳 𩤯 鶥 ++ 蒽 𦸒 𦿟 𦮂 藼 䔳 𦶤 𦺄 𦷰 萠 藮 𦸀 𣟗 𦁤 秢 𣖜 ++ 𣙀 䤭 𤧞 㵢 鏛 銾 鍈 𠊿 碹 鉷 鑍 俤 㑀 遤 𥕝 砽 ++ 硔 碶 硋 𡝗 𣇉 𤥁 㚚 佲 濚 濙 瀞 吔 𤆵 垻 壳 垊 ++ 鴖 埗 焴 㒯 𤆬 燫 𦱀 𤾗 𡞵 𨩉 愌 嫎 娋 䊼 𤒈 㜬 ++ 䭻 𨧼 鎻 鎸 𡣖 𠼝 葲 𦳀 𡐓 𤋺 𢰦 𤏁 妔 𣶷 𦝁 綨 ++ 𦅛 𦂤 𤦹 𤦋 𨧺 鋥 珢 㻩 璴 𨭣 𡢟 㻡 𤪳 櫘 珳 珻 ++ 㻖 𤨾 𤪔 𡟙 𤩦 𠎧 𡐤 𤧥 瑈 𤤖 炥 𤥶 銄 珦 鍟 𠓾 ++ 錱 𨫎 𨨖 鎆 𨯧 𥗕 䤵 𨪂 煫 𤥃 𠳿 嚤 𠘚 𠯫 𠲸 唂 ++ 秄 𡟺 緾 𡛂 𤩐 𡡒 䔮 鐁 㜊 𨫀 𤦭 妰 𡢿 𡢃 𧒄 媡 ++ 㛢 𣵛 㚰 鉟 婹 𨪁 𡡢 鍴 㳍 𠪴 䪖 㦊 僴 㵩 㵌 𡎜 ++ 煵 䋻 𨈘 渏 𩃤 䓫 浗 𧹏 灧 沯 㳖 𣿭 𣸭 渂 漌 㵯 ++ 𠏵 畑 㚼 㓈 䚀 㻚 䡱 姄 鉮 䤾 轁 𨰜 𦯀 堒 埈 㛖 ++ 𡑒 烾 𤍢 𤩱 𢿣 𡊰 𢎽 梹 楧 𡎘 𣓥 𧯴 𣛟 𨪃 𣟖 𣏺 ++ 𤲟 樚 𣚭 𦲷 萾 䓟 䓎 𦴦 𦵑 𦲂 𦿞 漗 𧄉 茽 𡜺 菭 ++ 𦲀 𧁓 𡟛 妉 媂 𡞳 婡 婱 𡤅 𤇼 㜭 姯 𡜼 㛇 熎 鎐 ++ 暚 𤊥 婮 娫 𤊓 樫 𣻹 𧜶 𤑛 𤋊 焝 𤉙 𨧡 侰 𦴨 峂 ++ 𤓎 𧹍 𤎽 樌 𤉖 𡌄 炦 焳 𤏩 㶥 泟 勇 𤩏 繥 姫 崯 ++ 㷳 彜 𤩝 𡟟 綤 萦 咅 𣫺 𣌀 𠈔 坾 𠣕 𠘙 㿥 𡾞 𪊶 ++ 瀃 𩅛 嵰 玏 糓 𨩙 𩐠 俈 翧 狍 猐 𧫴 猸 猹 𥛶 獁 ++ 獈 㺩 𧬘 遬 燵 𤣲 珡 臶 㻊 県 㻑 沢 国 琙 琞 琟 ++ 㻢 㻰 㻴 㻺 瓓 㼎 㽓 畂 畭 畲 疍 㽼 痈 痜 㿀 癍 ++ 㿗 癴 㿜 発 𤽜 熈 嘣 覀 塩 䀝 睃 䀹 条 䁅 㗛 瞘 ++ 䁪 䁯 属 瞾 矋 売 砘 点 砜 䂨 砹 硇 硑 硦 葈 𥔵 ++ 礳 栃 礲 䄃 䄉 禑 禙 辻 稆 込 䅧 窑 䆲 窼 艹 䇄 ++ 竏 竛 䇏 両 筢 筬 筻 簒 簛 䉠 䉺 类 粜 䊌 粸 䊔 ++ 糭 输 烀 𠳏 総 緔 緐 緽 羮 羴 犟 䎗 耠 耥 笹 耮 ++ 耱 联 㷌 垴 炠 肷 胩 䏭 脌 猪 脎 脒 畠 脔 䐁 㬹 ++ 腖 腙 腚 䐓 堺 腼 膄 䐥 膓 䐭 膥 埯 臁 臤 艔 䒏 ++ 芦 艶 苊 苘 苿 䒰 荗 险 榊 萅 烵 葤 惣 蒈 䔄 蒾 ++ 蓡 蓸 蔐 蔸 蕒 䔻 蕯 蕰 藠 䕷 虲 蚒 蚲 蛯 际 螋 ++ 䘆 䘗 袮 裿 褤 襇 覑 𧥧 訩 訸 誔 誴 豑 賔 賲 贜 ++ 䞘 塟 跃 䟭 仮 踺 嗘 坔 蹱 嗵 躰 䠷 軎 転 軤 軭 ++ 軲 辷 迁 迊 迌 逳 駄 䢭 飠 鈓 䤞 鈨 鉘 鉫 銱 銮 ++ 銿 鋣 鋫 鋳 鋴 鋽 鍃 鎄 鎭 䥅 䥑 麿 鐗 匁 鐝 鐭 ++ 鐾 䥪 鑔 鑹 锭 関 䦧 间 阳 䧥 枠 䨤 靀 䨵 鞲 韂 ++ 噔 䫤 惨 颹 䬙 飱 塄 餎 餙 冴 餜 餷 饂 饝 饢 䭰 ++ 駅 䮝 騼 鬏 窃 魩 鮁 鯝 鯱 鯴 䱭 鰠 㝯 𡯂 鵉 鰺 ++ 黾 噐 鶓 鶽 鷀 鷼 银 辶 鹻 麬 麱 麽 黆 铜 黢 黱 ++ 黸 竈 齄 𠂔 𠊷 𠎠 椚 铃 妬 𠓗 塀 铁 㞹 𠗕 𠘕 𠙶 ++ 𡚺 块 煳 𠫂 𠫍 𠮿 呪 吆 𠯋 咞 𠯻 𠰻 𠱓 𠱥 𠱼 惧 ++ 𠲍 噺 𠲵 𠳝 𠳭 𠵯 𠶲 𠷈 楕 鰯 螥 𠸄 𠸎 𠻗 𠾐 𠼭 ++ 𠹳 尠 𠾼 帋 𡁜 𡁏 𡁶 朞 𡁻 𡂈 𡂖 㙇 𡂿 𡃓 𡄯 𡄻 ++ 卤 蒭 𡋣 𡍵 𡌶 讁 𡕷 𡘙 𡟃 𡟇 乸 炻 𡠭 𡥪 𡨭 𡩅 ++ 𡰪 𡱰 𡲬 𡻈 拃 𡻕 𡼕 熘 桕 𢁅 槩 㛈 𢉼 𢏗 𢏺 𢜪 ++ 𢡱 𢥏 苽 𢥧 𢦓 𢫕 覥 𢫨 辠 𢬎 鞸 𢬿 顇 骽 𢱌 𢲈 ++ 𢲷 𥯨 𢴈 𢴒 𢶷 𢶕 𢹂 𢽴 𢿌 𣀳 𣁦 𣌟 𣏞 徱 晈 暿 ++ 𧩹 𣕧 𣗳 𤦺 𣘚 𣜖 𠍆 墵 朎 椘 𣪧 𧙗 𥿢 𣸑 𣺹 𧗾 ++ 𢂚 䣐 䪸 𤄙 𨪚 𤋮 𤌍 𤀻 𤌴 𤎖 𤩅 𠗊 凒 𠘑 妟 𡺨 ++ 㮾 𣳿 𤐄 𤓖 垈 𤙴 㦛 𤜯 𨗨 𩧉 㝢 𢇃 譞 𨭎 𤠒 𤣻 ++ 𤨕 爉 𤫀 𠱸 奥 𤺥 𤾆 𠝹 軚 𥀬 劏 圿 煱 𥊙 𥐙 𣽊 ++ 𤪧 喼 𥑆 𥑮 𦭒 㑳 𥔿 𧘲 𥕞 䜘 𥕢 𥕦 𥟇 𤤿 𥡝 偦 ++ 㓻 𣏌 𥤃 䝼 𨥈 𥪮 𥮉 𥰆 𡶐 垡 煑 𦄂 𧰒 遖 𦆲 𤾚 ++ 譢 𦐂 𦑊 嵛 𦯷 𦒄 𡤜 諪 𤧶 𦒈 𣿯 𦔒 䯀 𦖿 𦚵 𢜛 ++ 鑥 𥟡 憕 娧 晉 嚹 𤔡 𦛼 乪 𤤴 陖 涏 𦲽 㘘 襷 𦞙 ++ 𦡮 𦐑 𦡞 𦣇 筂 𩃀 𠨑 𦤦 𦤹 穅 𦧺 騦 𦨭 㙟 𦑩 𠀡 ++ 禃 𦨴 𦭛 崬 𣔙 𦮝 䛐 𦲤 画 补 𦶮 墶 㜜 𢖍 𧁋 𧇍 ++ 㱔 𧊀 𧊅 銁 𢅺 𧊋 錰 𧋦 𤧐 氹 钟 𧑐 𠻸 蠧 裵 𢤦 ++ 𨑳 𡞱 溸 𤨪 𡠠 㦤 㚹 䔿 暶 𩲭 𩢤 襃 𧟌 𧡘 囖 䃟 ++ 𡘊 㦡 𣜯 𨃨 𡏅 熭 荦 𧧝 𩆨 䲷 𧂯 𨦫 𧧽 𧨊 𧬋 𧵦 ++ 𤅺 筃 祾 𨀉 澵 𪋟 樃 𨌘 厢 𦸇 鎿 栶 靝 𨅯 𨀣 𦦵 ++ 𡏭 𣈯 𨁈 嶅 𨰰 𨂃 圕 頣 𨥉 嶫 𤦈 斾 槕 叒 𤪥 𣾁 ++ 㰑 朶 𨂐 𨃴 𨄮 𡾡 𨅏 𨆉 𨆯 𨈚 𨌆 𨌯 𨎊 㗊 𨑨 𨚪 ++ 䣺 揦 𨥖 砈 鉕 𨦸 䏲 𨧧 䏟 𨧨 𨭆 𨯔 姸 𨰉 𨿅 𩃬 ++ 𩄐 𩄼 㷷 𩅞 𤫊 运 犏 嚋 𩓧 𩗩 𩖰 𩖸 𩜲 𩣑 𩥉 𩥪 ++ 𩧃 𩨨 𩬎 𩵚 𩶛 纟 𩻸 𩼣 䲤 镇 𪊓 熢 𪋿 䶑 递 𪗋 ++ 䶜 𠲜 达 嗁 辺 𢒰 边 𤪓 䔉 繿 潖 檱 仪 㓤 𨬬 𧢝 ++ 㜺 躀 𡟵 𨀤 𨭬 𨮙 𧨾 𦚯 㷫 𧙕 𣲷 𥘵 𥥖 亚 𥺁 𦉘 ++ 嚿 𠹭 踎 孭 𣺈 𤲞 揞 𡟶 𡡻 攰 嘭 𥱊 吚 𥌑 㷆 𩶘 ++ 䱽 嘢 嘞 罉 𥻘 奵 𣵀 蝰 东 𠿪 𠵉 𣚺 脗 鵞 贘 瘻 ++ 鱅 癎 瞹 鍅 吲 腈 苷 嘥 脲 萘 肽 嗪 祢 噃 吖 𠺝 ++ 㗎 嘅 嗱 曱 𨋢 㘭 甴 嗰 喺 咗 啲 𠱁 𠲖 廐 𥅈 𠹶 ++ 𢱢 𠺢 麫 絚 嗞 𡁵 抝 靭 咔 賍 燶 酶 揼 掹 揾 啩 ++ 𢭃 鱲 𢺳 冚 㓟 𠶧 冧 呍 唞 唓 癦 踭 𦢊 疱 肶 蠄 ++ 螆 裇 膶 萜 𡃁 䓬 猄 𤜆 宐 茋 𦢓 噻 𢛴 𧴯 𤆣 𧵳 ++ 𦻐 𧊶 酰 𡇙 鈈 𣳼 𪚩 𠺬 𠻹 牦 𡲢 䝎 𤿂 𧿹 𠿫 䃺 ++ 鱝 攟 𢶠 䣳 𤟠 𩵼 𠿬 𠸊 𧖣 𠿭 𦁈 𡆇 熣 纎 鵐 业 ++ 丄 㕷 嬍 沲 卧 㚬 㧜 卽 㚥 𤘘 墚 𤭮 舭 呋 垪 𥪕 ++ 𠥹 㩒 𢑥 獴 𩺬 䴉 鯭 𣳾 𩼰 䱛 𤾩 𩖞 𩿞 葜 𣶶 𧊲 ++ 𦞳 𣜠 挮 紥 𣻷 𣸬 㨪 逈 勌 㹴 㙺 䗩 𠒎 癀 嫰 𠺶 ++ 硺 𧼮 墧 䂿 噼 鮋 嵴 癔 𪐴 麅 䳡 㟻 愙 𣃚 𤏲 噝 ++ 𡊩 垧 𤥣 𩸆 刴 𧂮 㖭 鵼 籖 鬹 埞 𡝬 屓 擓 𩓐 𦌵 ++ 𧅤 蚭 𠴨 𦴢 𤫢 𠵱 凾 𡼏 嶎 霃 𡷑 麁 遌 笟 鬂 峑 ++ 箣 扨 挵 髿 篏 鬪 籾 籂 粆 鰕 篼 鬉 鰛 𤤾 齚 啳 ++ 寃 俽 麘 俲 剠 㸆 勑 坧 偖 妷 帒 韈 鶫 轜 呩 鞴 ++ 饀 鞺 匬 愰 椬 叚 鰊 鴂 䰻 陁 榀 傦 畆 𡝭 駚 剳 ++ 酙 隁 酜 酑 𨺗 捿 𦴣 櫊 嘑 醎 畺 抅 𠏼 獏 籰 𥰡 ++ 𣳽 𤤙 盖 鮝 个 𠳔 莾 衂 届 槀 坺 刟 巵 从 氱 𠇲 ++ 伹 咜 哚 劚 趂 㗾 㗳 歒 酼 龥 鮗 頮 颴 骺 麨 麄 ++ 煺 笔 毺 蠘 罸 嘠 𪙊 蹷 齓 跔 蹏 鸜 踁 抂 𨍽 踨 ++ 蹵 竓 𤩷 稾 磘 泪 詧 瘇 𨩚 鼦 泎 蟖 痃 𪊲 硓 咢 ++ 贌 狢 獱 謭 猂 瓱 賫 𤪻 蘯 徺 袠 䒷 𡠻 𦸅 詾 𢔛 ++ 惽 癧 髗 鵄 鍮 鮏 蟵 賷 猬 霡 鮰 㗖 犲 䰇 籑 饊 ++ 𦅙 慙 䰄 麖 慽 坟 慯 抦 戹 㩜 懢 厪 𣏵 捤 栂 㗒 ++ 嵗 𨯂 迚 𨸹 僙 𡵆 礆 匲 阸 𠼻 䁥 矾 糂 𥼚 糚 稭 ++ 聦 聣 絍 甅 瓲 覔 舚 朌 聢 𧒆 聛 瓰 脃 眤 覉 𦟌 ++ 畓 𦻑 螩 蟎 臈 螌 詉 貭 譃 眫 瓸 蓚 㘵 榲 趦 覩 ++ 涹 蟁 𤀑 瓧 㷛 煶 悤 憜 㳑 恷 罱 𨬭 惩 䭾 删 㰘 ++ 𣳇 𥻗 𧙖 𥔱 𡥄 𡋾 𩤃 𦷜 𧂭 峁 𦆭 𨨏 𣙷 𠃮 𦡆 𤼎 ++ 䕢 嬟 𦍌 齐 麦 𦉫   , 、 。 . • ; : ? ! ++ ︰ … ‥ ﹐ 、 ﹒ · ﹔ ﹕ ﹖ ﹗ | – ︱ — ︳ ++ ︴ ﹏ ( ) ︵ ︶ { } ︷ ︸ 〔 〕 ︹ ︺ 【 】 ++ ︻ ︼ 《 》 ︽ ︾ 〈 〉 ︿ ﹀ 「 」 ﹁ ﹂ 『 』 ++ ﹃ ﹄ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ‘ ’ “ ” 〝 〞 ‵ ′ ++ # & * ※ § 〃 ○ ● △ ▲ ◎ ☆ ★ ◇ ◆ □ ++ ■ ▽ ▼ ㊣ ℅ ‾ _ ﹉ ﹊ ﹍ ﹎ ﹋ ﹌ ﹟ ﹠ ﹡ ++ + - × ÷ ± √ < > = ≦ ≧ ≠ ∞ ≒ ≡ ﹢ ++ ﹣ ﹤ ﹥ ﹦ ∼ ∩ ∪ ⊥ ∠ ∟ ⊿ ㏒ ㏑ ∫ ∮ ∵ ++ ∴ ♀ ♂ ♁ ☉ ↑ ↓ ← → ↖ ↗ ↙ ↘ ∥ ∣ / ++ \ $ ¥ 〒 ¢ £ % @ ℃ ℉ ﹩ ﹪ ﹫ ㏕ ㎜ ㎝ ++ ㎞ ㏎ ㎡ ㎎ ㎏ ㏄ ° 兙 兛 兞 兝 兡 兣 嗧 瓩 糎 ++ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▏ ▎ ▍ ▌ ▋ ▊ ▉ ┼ ++ ┴ ┬ ┤ ├ ▔ ─ │ ▕ ┌ ┐ └ ┘ ◢ ◣ ◥ ◤ ++ ╱ ╲ ╳ 0 1 2 3 4 5 6 7 8 9 Ⅰ Ⅱ Ⅲ ++ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ 〡 〢 〣 〤 〥 〦 〧 〨 〩 ++ 卄 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 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 Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ ++ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ ++ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ ++ υ φ χ ψ ω ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ++ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ++ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ˙ ˉ ˊ ˇ ˋ 一 ++ 乙 丁 七 乃 九 了 二 人 儿 入 八 几 刀 刁 力 匕 ++ 十 卜 又 三 下 丈 上 丫 丸 凡 久 么 也 乞 于 亡 ++ 兀 刃 勺 千 叉 口 土 士 夕 大 女 子 孑 孓 寸 小 ++ 尢 尸 山 川 工 己 已 巳 巾 干 廾 弋 弓 才 丑 丐 ++ 不 中 丰 丹 之 尹 予 云 井 互 五 亢 仁 什 仃 仆 ++ 仇 仍 今 介 仄 元 允 內 六 兮 公 冗 凶 分 切 刈 ++ 勻 勾 勿 化 匹 午 升 卅 卞 厄 友 及 反 壬 天 夫 ++ 太 夭 孔 少 尤 尺 屯 巴 幻 廿 弔 引 心 戈 戶 手 ++ 扎 支 文 斗 斤 方 日 曰 月 木 欠 止 歹 毋 比 毛 ++ 氏 水 火 爪 父 爻 片 牙 牛 犬 王 丙 世 丕 且 丘 ++ 主 乍 乏 乎 以 付 仔 仕 他 仗 代 令 仙 仞 充 兄 ++ 冉 冊 冬 凹 出 凸 刊 加 功 包 匆 北 匝 仟 半 卉 ++ 卡 占 卯 卮 去 可 古 右 召 叮 叩 叨 叼 司 叵 叫 ++ 另 只 史 叱 台 句 叭 叻 四 囚 外 央 失 奴 奶 孕 ++ 它 尼 巨 巧 左 市 布 平 幼 弁 弘 弗 必 戊 打 扔 ++ 扒 扑 斥 旦 朮 本 未 末 札 正 母 民 氐 永 汁 汀 ++ 氾 犯 玄 玉 瓜 瓦 甘 生 用 甩 田 由 甲 申 疋 白 ++ 皮 皿 目 矛 矢 石 示 禾 穴 立 丞 丟 乒 乓 乩 亙 ++ 交 亦 亥 仿 伉 伙 伊 伕 伍 伐 休 伏 仲 件 任 仰 ++ 仳 份 企 伋 光 兇 兆 先 全 共 再 冰 列 刑 划 刎 ++ 刖 劣 匈 匡 匠 印 危 吉 吏 同 吊 吐 吁 吋 各 向 ++ 名 合 吃 后 吆 吒 因 回 囝 圳 地 在 圭 圬 圯 圩 ++ 夙 多 夷 夸 妄 奸 妃 好 她 如 妁 字 存 宇 守 宅 ++ 安 寺 尖 屹 州 帆 并 年 式 弛 忙 忖 戎 戌 戍 成 ++ 扣 扛 托 收 早 旨 旬 旭 曲 曳 有 朽 朴 朱 朵 次 ++ 此 死 氖 汝 汗 汙 江 池 汐 汕 污 汛 汍 汎 灰 牟 ++ 牝 百 竹 米 糸 缶 羊 羽 老 考 而 耒 耳 聿 肉 肋 ++ 肌 臣 自 至 臼 舌 舛 舟 艮 色 艾 虫 血 行 衣 西 ++ 阡 串 亨 位 住 佇 佗 佞 伴 佛 何 估 佐 佑 伽 伺 ++ 伸 佃 佔 似 但 佣 作 你 伯 低 伶 余 佝 佈 佚 兌 ++ 克 免 兵 冶 冷 別 判 利 刪 刨 劫 助 努 劬 匣 即 ++ 卵 吝 吭 吞 吾 否 呎 吧 呆 呃 吳 呈 呂 君 吩 告 ++ 吹 吻 吸 吮 吵 吶 吠 吼 呀 吱 含 吟 听 囪 困 囤 ++ 囫 坊 坑 址 坍 均 坎 圾 坐 坏 圻 壯 夾 妝 妒 妨 ++ 妞 妣 妙 妖 妍 妤 妓 妊 妥 孝 孜 孚 孛 完 宋 宏 ++ 尬 局 屁 尿 尾 岐 岑 岔 岌 巫 希 序 庇 床 廷 弄 ++ 弟 彤 形 彷 役 忘 忌 志 忍 忱 快 忸 忪 戒 我 抄 ++ 抗 抖 技 扶 抉 扭 把 扼 找 批 扳 抒 扯 折 扮 投 ++ 抓 抑 抆 改 攻 攸 旱 更 束 李 杏 材 村 杜 杖 杞 ++ 杉 杆 杠 杓 杗 步 每 求 汞 沙 沁 沈 沉 沅 沛 汪 ++ 決 沐 汰 沌 汨 沖 沒 汽 沃 汲 汾 汴 沆 汶 沍 沔 ++ 沘 沂 灶 灼 災 灸 牢 牡 牠 狄 狂 玖 甬 甫 男 甸 ++ 皂 盯 矣 私 秀 禿 究 系 罕 肖 肓 肝 肘 肛 肚 育 ++ 良 芒 芋 芍 見 角 言 谷 豆 豕 貝 赤 走 足 身 車 ++ 辛 辰 迂 迆 迅 迄 巡 邑 邢 邪 邦 那 酉 釆 里 防 ++ 阮 阱 阪 阬 並 乖 乳 事 些 亞 享 京 佯 依 侍 佳 ++ 使 佬 供 例 來 侃 佰 併 侈 佩 佻 侖 佾 侏 侑 佺 ++ 兔 兒 兕 兩 具 其 典 冽 函 刻 券 刷 刺 到 刮 制 ++ 剁 劾 劻 卒 協 卓 卑 卦 卷 卸 卹 取 叔 受 味 呵 ++ 咖 呸 咕 咀 呻 呷 咄 咒 咆 呼 咐 呱 呶 和 咚 呢 ++ 周 咋 命 咎 固 垃 坷 坪 坩 坡 坦 坤 坼 夜 奉 奇 ++ 奈 奄 奔 妾 妻 委 妹 妮 姑 姆 姐 姍 始 姓 姊 妯 ++ 妳 姒 姅 孟 孤 季 宗 定 官 宜 宙 宛 尚 屈 居 屆 ++ 岷 岡 岸 岩 岫 岱 岳 帘 帚 帖 帕 帛 帑 幸 庚 店 ++ 府 底 庖 延 弦 弧 弩 往 征 彿 彼 忝 忠 忽 念 忿 ++ 怏 怔 怯 怵 怖 怪 怕 怡 性 怩 怫 怛 或 戕 房 戾 ++ 所 承 拉 拌 拄 抿 拂 抹 拒 招 披 拓 拔 拋 拈 抨 ++ 抽 押 拐 拙 拇 拍 抵 拚 抱 拘 拖 拗 拆 抬 拎 放 ++ 斧 於 旺 昔 易 昌 昆 昂 明 昀 昏 昕 昊 昇 服 朋 ++ 杭 枋 枕 東 果 杳 杷 枇 枝 林 杯 杰 板 枉 松 析 ++ 杵 枚 枓 杼 杪 杲 欣 武 歧 歿 氓 氛 泣 注 泳 沱 ++ 泌 泥 河 沽 沾 沼 波 沫 法 泓 沸 泄 油 況 沮 泗 ++ 泅 泱 沿 治 泡 泛 泊 沬 泯 泜 泖 泠 炕 炎 炒 炊 ++ 炙 爬 爭 爸 版 牧 物 狀 狎 狙 狗 狐 玩 玨 玟 玫 ++ 玥 甽 疝 疙 疚 的 盂 盲 直 知 矽 社 祀 祁 秉 秈 ++ 空 穹 竺 糾 罔 羌 羋 者 肺 肥 肢 肱 股 肫 肩 肴 ++ 肪 肯 臥 臾 舍 芳 芝 芙 芭 芽 芟 芹 花 芬 芥 芯 ++ 芸 芣 芰 芾 芷 虎 虱 初 表 軋 迎 返 近 邵 邸 邱 ++ 邶 采 金 長 門 阜 陀 阿 阻 附 陂 隹 雨 青 非 亟 ++ 亭 亮 信 侵 侯 便 俠 俑 俏 保 促 侶 俘 俟 俊 俗 ++ 侮 俐 俄 係 俚 俎 俞 侷 兗 冒 冑 冠 剎 剃 削 前 ++ 剌 剋 則 勇 勉 勃 勁 匍 南 卻 厚 叛 咬 哀 咨 哎 ++ 哉 咸 咦 咳 哇 哂 咽 咪 品 哄 哈 咯 咫 咱 咻 咩 ++ 咧 咿 囿 垂 型 垠 垣 垢 城 垮 垓 奕 契 奏 奎 奐 ++ 姜 姘 姿 姣 姨 娃 姥 姪 姚 姦 威 姻 孩 宣 宦 室 ++ 客 宥 封 屎 屏 屍 屋 峙 峒 巷 帝 帥 帟 幽 庠 度 ++ 建 弈 弭 彥 很 待 徊 律 徇 後 徉 怒 思 怠 急 怎 ++ 怨 恍 恰 恨 恢 恆 恃 恬 恫 恪 恤 扁 拜 挖 按 拼 ++ 拭 持 拮 拽 指 拱 拷 拯 括 拾 拴 挑 挂 政 故 斫 ++ 施 既 春 昭 映 昧 是 星 昨 昱 昤 曷 柿 染 柱 柔 ++ 某 柬 架 枯 柵 柩 柯 柄 柑 枴 柚 查 枸 柏 柞 柳 ++ 枰 柙 柢 柝 柒 歪 殃 殆 段 毒 毗 氟 泉 洋 洲 洪 ++ 流 津 洌 洱 洞 洗 活 洽 派 洶 洛 泵 洹 洧 洸 洩 ++ 洮 洵 洎 洫 炫 為 炳 炬 炯 炭 炸 炮 炤 爰 牲 牯 ++ 牴 狩 狠 狡 玷 珊 玻 玲 珍 珀 玳 甚 甭 畏 界 畎 ++ 畋 疫 疤 疥 疢 疣 癸 皆 皇 皈 盈 盆 盃 盅 省 盹 ++ 相 眉 看 盾 盼 眇 矜 砂 研 砌 砍 祆 祉 祈 祇 禹 ++ 禺 科 秒 秋 穿 突 竿 竽 籽 紂 紅 紀 紉 紇 約 紆 ++ 缸 美 羿 耄 耐 耍 耑 耶 胖 胥 胚 胃 胄 背 胡 胛 ++ 胎 胞 胤 胝 致 舢 苧 范 茅 苣 苛 苦 茄 若 茂 茉 ++ 苒 苗 英 茁 苜 苔 苑 苞 苓 苟 苯 茆 虐 虹 虻 虺 ++ 衍 衫 要 觔 計 訂 訃 貞 負 赴 赳 趴 軍 軌 述 迦 ++ 迢 迪 迥 迭 迫 迤 迨 郊 郎 郁 郃 酋 酊 重 閂 限 ++ 陋 陌 降 面 革 韋 韭 音 頁 風 飛 食 首 香 乘 亳 ++ 倌 倍 倣 俯 倦 倥 俸 倩 倖 倆 值 借 倚 倒 們 俺 ++ 倀 倔 倨 俱 倡 個 候 倘 俳 修 倭 倪 俾 倫 倉 兼 ++ 冤 冥 冢 凍 凌 准 凋 剖 剜 剔 剛 剝 匪 卿 原 厝 ++ 叟 哨 唐 唁 唷 哼 哥 哲 唆 哺 唔 哩 哭 員 唉 哮 ++ 哪 哦 唧 唇 哽 唏 圃 圄 埂 埔 埋 埃 堉 夏 套 奘 ++ 奚 娑 娘 娜 娟 娛 娓 姬 娠 娣 娩 娥 娌 娉 孫 屘 ++ 宰 害 家 宴 宮 宵 容 宸 射 屑 展 屐 峭 峽 峻 峪 ++ 峨 峰 島 崁 峴 差 席 師 庫 庭 座 弱 徒 徑 徐 恙 ++ 恣 恥 恐 恕 恭 恩 息 悄 悟 悚 悍 悔 悌 悅 悖 扇 ++ 拳 挈 拿 捎 挾 振 捕 捂 捆 捏 捉 挺 捐 挽 挪 挫 ++ 挨 捍 捌 效 敉 料 旁 旅 時 晉 晏 晃 晒 晌 晅 晁 ++ 書 朔 朕 朗 校 核 案 框 桓 根 桂 桔 栩 梳 栗 桌 ++ 桑 栽 柴 桐 桀 格 桃 株 桅 栓 栘 桁 殊 殉 殷 氣 ++ 氧 氨 氦 氤 泰 浪 涕 消 涇 浦 浸 海 浙 涓 浬 涉 ++ 浮 浚 浴 浩 涌 涊 浹 涅 浥 涔 烊 烘 烤 烙 烈 烏 ++ 爹 特 狼 狹 狽 狸 狷 玆 班 琉 珮 珠 珪 珞 畔 畝 ++ 畜 畚 留 疾 病 症 疲 疳 疽 疼 疹 痂 疸 皋 皰 益 ++ 盍 盎 眩 真 眠 眨 矩 砰 砧 砸 砝 破 砷 砥 砭 砠 ++ 砟 砲 祕 祐 祠 祟 祖 神 祝 祗 祚 秤 秣 秧 租 秦 ++ 秩 秘 窄 窈 站 笆 笑 粉 紡 紗 紋 紊 素 索 純 紐 ++ 紕 級 紜 納 紙 紛 缺 罟 羔 翅 翁 耆 耘 耕 耙 耗 ++ 耽 耿 胱 脂 胰 脅 胭 胴 脆 胸 胳 脈 能 脊 胼 胯 ++ 臭 臬 舀 舐 航 舫 舨 般 芻 茫 荒 荔 荊 茸 荐 草 ++ 茵 茴 荏 茲 茹 茶 茗 荀 茱 茨 荃 虔 蚊 蚪 蚓 蚤 ++ 蚩 蚌 蚣 蚜 衰 衷 袁 袂 衽 衹 記 訐 討 訌 訕 訊 ++ 託 訓 訖 訏 訑 豈 豺 豹 財 貢 起 躬 軒 軔 軏 辱 ++ 送 逆 迷 退 迺 迴 逃 追 逅 迸 邕 郡 郝 郢 酒 配 ++ 酌 釘 針 釗 釜 釙 閃 院 陣 陡 陛 陝 除 陘 陞 隻 ++ 飢 馬 骨 高 鬥 鬲 鬼 乾 偺 偽 停 假 偃 偌 做 偉 ++ 健 偶 偎 偕 偵 側 偷 偏 倏 偯 偭 兜 冕 凰 剪 副 ++ 勒 務 勘 動 匐 匏 匙 匿 區 匾 參 曼 商 啪 啦 啄 ++ 啞 啡 啃 啊 唱 啖 問 啕 唯 啤 唸 售 啜 唬 啣 唳 ++ 啁 啗 圈 國 圉 域 堅 堊 堆 埠 埤 基 堂 堵 執 培 ++ 夠 奢 娶 婁 婉 婦 婪 婀 娼 婢 婚 婆 婊 孰 寇 寅 ++ 寄 寂 宿 密 尉 專 將 屠 屜 屝 崇 崆 崎 崛 崖 崢 ++ 崑 崩 崔 崙 崤 崧 崗 巢 常 帶 帳 帷 康 庸 庶 庵 ++ 庾 張 強 彗 彬 彩 彫 得 徙 從 徘 御 徠 徜 恿 患 ++ 悉 悠 您 惋 悴 惦 悽 情 悻 悵 惜 悼 惘 惕 惆 惟 ++ 悸 惚 惇 戚 戛 扈 掠 控 捲 掖 探 接 捷 捧 掘 措 ++ 捱 掩 掉 掃 掛 捫 推 掄 授 掙 採 掬 排 掏 掀 捻 ++ 捩 捨 捺 敝 敖 救 教 敗 啟 敏 敘 敕 敔 斜 斛 斬 ++ 族 旋 旌 旎 晝 晚 晤 晨 晦 晞 曹 勗 望 梁 梯 梢 ++ 梓 梵 桿 桶 梱 梧 梗 械 梃 棄 梭 梆 梅 梔 條 梨 ++ 梟 梡 梂 欲 殺 毫 毬 氫 涎 涼 淳 淙 液 淡 淌 淤 ++ 添 淺 清 淇 淋 涯 淑 涮 淞 淹 涸 混 淵 淅 淒 渚 ++ 涵 淚 淫 淘 淪 深 淮 淨 淆 淄 涪 淬 涿 淦 烹 焉 ++ 焊 烽 烯 爽 牽 犁 猜 猛 猖 猓 猙 率 琅 琊 球 理 ++ 現 琍 瓠 瓶 瓷 甜 產 略 畦 畢 異 疏 痔 痕 疵 痊 ++ 痍 皎 盔 盒 盛 眷 眾 眼 眶 眸 眺 硫 硃 硎 祥 票 ++ 祭 移 窒 窕 笠 笨 笛 第 符 笙 笞 笮 粒 粗 粕 絆 ++ 絃 統 紮 紹 紼 絀 細 紳 組 累 終 紲 紱 缽 羞 羚 ++ 翌 翎 習 耜 聊 聆 脯 脖 脣 脫 脩 脰 脤 舂 舵 舷 ++ 舶 船 莎 莞 莘 荸 莢 莖 莽 莫 莒 莊 莓 莉 莠 荷 ++ 荻 荼 莆 莧 處 彪 蛇 蛀 蚶 蛄 蚵 蛆 蛋 蚱 蚯 蛉 ++ 術 袞 袈 被 袒 袖 袍 袋 覓 規 訪 訝 訣 訥 許 設 ++ 訟 訛 訢 豉 豚 販 責 貫 貨 貪 貧 赧 赦 趾 趺 軛 ++ 軟 這 逍 通 逗 連 速 逝 逐 逕 逞 造 透 逢 逖 逛 ++ 途 部 郭 都 酗 野 釵 釦 釣 釧 釭 釩 閉 陪 陵 陳 ++ 陸 陰 陴 陶 陷 陬 雀 雪 雩 章 竟 頂 頃 魚 鳥 鹵 ++ 鹿 麥 麻 傢 傍 傅 備 傑 傀 傖 傘 傚 最 凱 割 剴 ++ 創 剩 勞 勝 勛 博 厥 啻 喀 喧 啼 喊 喝 喘 喂 喜 ++ 喪 喔 喇 喋 喃 喳 單 喟 唾 喲 喚 喻 喬 喱 啾 喉 ++ 喫 喙 圍 堯 堪 場 堤 堰 報 堡 堝 堠 壹 壺 奠 婷 ++ 媚 婿 媒 媛 媧 孳 孱 寒 富 寓 寐 尊 尋 就 嵌 嵐 ++ 崴 嵇 巽 幅 帽 幀 幃 幾 廊 廁 廂 廄 弼 彭 復 循 ++ 徨 惑 惡 悲 悶 惠 愜 愣 惺 愕 惰 惻 惴 慨 惱 愎 ++ 惶 愉 愀 愒 戟 扉 掣 掌 描 揀 揩 揉 揆 揍 插 揣 ++ 提 握 揖 揭 揮 捶 援 揪 換 摒 揚 揹 敞 敦 敢 散 ++ 斑 斐 斯 普 晰 晴 晶 景 暑 智 晾 晷 曾 替 期 朝 ++ 棺 棕 棠 棘 棗 椅 棟 棵 森 棧 棹 棒 棲 棣 棋 棍 ++ 植 椒 椎 棉 棚 楮 棻 款 欺 欽 殘 殖 殼 毯 氮 氯 ++ 氬 港 游 湔 渡 渲 湧 湊 渠 渥 渣 減 湛 湘 渤 湖 ++ 湮 渭 渦 湯 渴 湍 渺 測 湃 渝 渾 滋 溉 渙 湎 湣 ++ 湄 湲 湩 湟 焙 焚 焦 焰 無 然 煮 焜 牌 犄 犀 猶 ++ 猥 猴 猩 琺 琪 琳 琢 琥 琵 琶 琴 琯 琛 琦 琨 甥 ++ 甦 畫 番 痢 痛 痣 痙 痘 痞 痠 登 發 皖 皓 皴 盜 ++ 睏 短 硝 硬 硯 稍 稈 程 稅 稀 窘 窗 窖 童 竣 等 ++ 策 筆 筐 筒 答 筍 筋 筏 筑 粟 粥 絞 結 絨 絕 紫 ++ 絮 絲 絡 給 絢 絰 絳 善 翔 翕 耋 聒 肅 腕 腔 腋 ++ 腑 腎 脹 腆 脾 腌 腓 腴 舒 舜 菩 萃 菸 萍 菠 菅 ++ 萋 菁 華 菱 菴 著 萊 菰 萌 菌 菽 菲 菊 萸 萎 萄 ++ 菜 萇 菔 菟 虛 蛟 蛙 蛭 蛔 蛛 蛤 蛐 蛞 街 裁 裂 ++ 袱 覃 視 註 詠 評 詞 証 詁 詔 詛 詐 詆 訴 診 訶 ++ 詖 象 貂 貯 貼 貳 貽 賁 費 賀 貴 買 貶 貿 貸 越 ++ 超 趁 跎 距 跋 跚 跑 跌 跛 跆 軻 軸 軼 辜 逮 逵 ++ 週 逸 進 逶 鄂 郵 鄉 郾 酣 酥 量 鈔 鈕 鈣 鈉 鈞 ++ 鈍 鈐 鈇 鈑 閔 閏 開 閑 間 閒 閎 隊 階 隋 陽 隅 ++ 隆 隍 陲 隄 雁 雅 雄 集 雇 雯 雲 韌 項 順 須 飧 ++ 飪 飯 飩 飲 飭 馮 馭 黃 黍 黑 亂 傭 債 傲 傳 僅 ++ 傾 催 傷 傻 傯 僇 剿 剷 剽 募 勦 勤 勢 勣 匯 嗟 ++ 嗨 嗓 嗦 嗎 嗜 嗇 嗑 嗣 嗤 嗯 嗚 嗡 嗅 嗆 嗥 嗉 ++ 園 圓 塞 塑 塘 塗 塚 塔 填 塌 塭 塊 塢 塒 塋 奧 ++ 嫁 嫉 嫌 媾 媽 媼 媳 嫂 媲 嵩 嵯 幌 幹 廉 廈 弒 ++ 彙 徬 微 愚 意 慈 感 想 愛 惹 愁 愈 慎 慌 慄 慍 ++ 愾 愴 愧 愍 愆 愷 戡 戢 搓 搾 搞 搪 搭 搽 搬 搏 ++ 搜 搔 損 搶 搖 搗 搆 敬 斟 新 暗 暉 暇 暈 暖 暄 ++ 暘 暍 會 榔 業 楚 楷 楠 楔 極 椰 概 楊 楨 楫 楞 ++ 楓 楹 榆 楝 楣 楛 歇 歲 毀 殿 毓 毽 溢 溯 滓 溶 ++ 滂 源 溝 滇 滅 溥 溘 溼 溺 溫 滑 準 溜 滄 滔 溪 ++ 溧 溴 煎 煙 煩 煤 煉 照 煜 煬 煦 煌 煥 煞 煆 煨 ++ 煖 爺 牒 猷 獅 猿 猾 瑯 瑚 瑕 瑟 瑞 瑁 琿 瑙 瑛 ++ 瑜 當 畸 瘀 痰 瘁 痲 痱 痺 痿 痴 痳 盞 盟 睛 睫 ++ 睦 睞 督 睹 睪 睬 睜 睥 睨 睢 矮 碎 碰 碗 碘 碌 ++ 碉 硼 碑 碓 硿 祺 祿 禁 萬 禽 稜 稚 稠 稔 稟 稞 ++ 窟 窠 筷 節 筠 筮 筧 粱 粳 粵 經 絹 綑 綁 綏 絛 ++ 置 罩 罪 署 義 羨 群 聖 聘 肆 肄 腱 腰 腸 腥 腮 ++ 腳 腫 腹 腺 腦 舅 艇 蒂 葷 落 萱 葵 葦 葫 葉 葬 ++ 葛 萼 萵 葡 董 葩 葭 葆 虞 虜 號 蛹 蜓 蜈 蜇 蜀 ++ 蛾 蛻 蜂 蜃 蜆 蜊 衙 裟 裔 裙 補 裘 裝 裡 裊 裕 ++ 裒 覜 解 詫 該 詳 試 詩 詰 誇 詼 詣 誠 話 誅 詭 ++ 詢 詮 詬 詹 詻 訾 詨 豢 貊 貉 賊 資 賈 賄 貲 賃 ++ 賂 賅 跡 跟 跨 路 跳 跺 跪 跤 跦 躲 較 載 軾 輊 ++ 辟 農 運 遊 道 遂 達 逼 違 遐 遇 遏 過 遍 遑 逾 ++ 遁 鄒 鄗 酬 酪 酩 釉 鈷 鉗 鈸 鈽 鉀 鈾 鉛 鉋 鉤 ++ 鉑 鈴 鉉 鉍 鉅 鈹 鈿 鉚 閘 隘 隔 隕 雍 雋 雉 雊 ++ 雷 電 雹 零 靖 靴 靶 預 頑 頓 頊 頒 頌 飼 飴 飽 ++ 飾 馳 馱 馴 髡 鳩 麂 鼎 鼓 鼠 僧 僮 僥 僖 僭 僚 ++ 僕 像 僑 僱 僎 僩 兢 凳 劃 劂 匱 厭 嗾 嘀 嘛 嘗 ++ 嗽 嘔 嘆 嘉 嘍 嘎 嗷 嘖 嘟 嘈 嘐 嗶 團 圖 塵 塾 ++ 境 墓 墊 塹 墅 塽 壽 夥 夢 夤 奪 奩 嫡 嫦 嫩 嫗 ++ 嫖 嫘 嫣 孵 寞 寧 寡 寥 實 寨 寢 寤 察 對 屢 嶄 ++ 嶇 幛 幣 幕 幗 幔 廓 廖 弊 彆 彰 徹 慇 愿 態 慷 ++ 慢 慣 慟 慚 慘 慵 截 撇 摘 摔 撤 摸 摟 摺 摑 摧 ++ 搴 摭 摻 敲 斡 旗 旖 暢 暨 暝 榜 榨 榕 槁 榮 槓 ++ 構 榛 榷 榻 榫 榴 槐 槍 榭 槌 榦 槃 榣 歉 歌 氳 ++ 漳 演 滾 漓 滴 漩 漾 漠 漬 漏 漂 漢 滿 滯 漆 漱 ++ 漸 漲 漣 漕 漫 漯 澈 漪 滬 漁 滲 滌 滷 熔 熙 煽 ++ 熊 熄 熒 爾 犒 犖 獄 獐 瑤 瑣 瑪 瑰 瑭 甄 疑 瘧 ++ 瘍 瘋 瘉 瘓 盡 監 瞄 睽 睿 睡 磁 碟 碧 碳 碩 碣 ++ 禎 福 禍 種 稱 窪 窩 竭 端 管 箕 箋 筵 算 箝 箔 ++ 箏 箸 箇 箄 粹 粽 精 綻 綰 綜 綽 綾 綠 緊 綴 網 ++ 綱 綺 綢 綿 綵 綸 維 緒 緇 綬 罰 翠 翡 翟 聞 聚 ++ 肇 腐 膀 膏 膈 膊 腿 膂 臧 臺 與 舔 舞 艋 蓉 蒿 ++ 蓆 蓄 蒙 蒞 蒲 蒜 蓋 蒸 蓀 蓓 蒐 蒼 蓑 蓊 蜿 蜜 ++ 蜻 蜢 蜥 蜴 蜘 蝕 蜷 蜩 裳 褂 裴 裹 裸 製 裨 褚 ++ 裯 誦 誌 語 誣 認 誡 誓 誤 說 誥 誨 誘 誑 誚 誧 ++ 豪 貍 貌 賓 賑 賒 赫 趙 趕 跼 輔 輒 輕 輓 辣 遠 ++ 遘 遜 遣 遙 遞 遢 遝 遛 鄙 鄘 鄞 酵 酸 酷 酴 鉸 ++ 銀 銅 銘 銖 鉻 銓 銜 銨 鉼 銑 閡 閨 閩 閣 閥 閤 ++ 隙 障 際 雌 雒 需 靼 鞅 韶 頗 領 颯 颱 餃 餅 餌 ++ 餉 駁 骯 骰 髦 魁 魂 鳴 鳶 鳳 麼 鼻 齊 億 儀 僻 ++ 僵 價 儂 儈 儉 儅 凜 劇 劈 劉 劍 劊 勰 厲 嘮 嘻 ++ 嘹 嘲 嘿 嘴 嘩 噓 噎 噗 噴 嘶 嘯 嘰 墀 墟 增 墳 ++ 墜 墮 墩 墦 奭 嬉 嫻 嬋 嫵 嬌 嬈 寮 寬 審 寫 層 ++ 履 嶝 嶔 幢 幟 幡 廢 廚 廟 廝 廣 廠 彈 影 德 徵 ++ 慶 慧 慮 慝 慕 憂 慼 慰 慫 慾 憧 憐 憫 憎 憬 憚 ++ 憤 憔 憮 戮 摩 摯 摹 撞 撲 撈 撐 撰 撥 撓 撕 撩 ++ 撒 撮 播 撫 撚 撬 撙 撢 撳 敵 敷 數 暮 暫 暴 暱 ++ 樣 樟 槨 樁 樞 標 槽 模 樓 樊 槳 樂 樅 槭 樑 歐 ++ 歎 殤 毅 毆 漿 潼 澄 潑 潦 潔 澆 潭 潛 潸 潮 澎 ++ 潺 潰 潤 澗 潘 滕 潯 潠 潟 熟 熬 熱 熨 牖 犛 獎 ++ 獗 瑩 璋 璃 瑾 璀 畿 瘠 瘩 瘟 瘤 瘦 瘡 瘢 皚 皺 ++ 盤 瞎 瞇 瞌 瞑 瞋 磋 磅 確 磊 碾 磕 碼 磐 稿 稼 ++ 穀 稽 稷 稻 窯 窮 箭 箱 範 箴 篆 篇 篁 箠 篌 糊 ++ 締 練 緯 緻 緘 緬 緝 編 緣 線 緞 緩 綞 緙 緲 緹 ++ 罵 罷 羯 翩 耦 膛 膜 膝 膠 膚 膘 蔗 蔽 蔚 蓮 蔬 ++ 蔭 蔓 蔑 蔣 蔡 蔔 蓬 蔥 蓿 蔆 螂 蝴 蝶 蝠 蝦 蝸 ++ 蝨 蝙 蝗 蝌 蝓 衛 衝 褐 複 褒 褓 褕 褊 誼 諒 談 ++ 諄 誕 請 諸 課 諉 諂 調 誰 論 諍 誶 誹 諛 豌 豎 ++ 豬 賠 賞 賦 賤 賬 賭 賢 賣 賜 質 賡 赭 趟 趣 踫 ++ 踐 踝 踢 踏 踩 踟 踡 踞 躺 輝 輛 輟 輩 輦 輪 輜 ++ 輞 輥 適 遮 遨 遭 遷 鄰 鄭 鄧 鄱 醇 醉 醋 醃 鋅 ++ 銻 銷 鋪 銬 鋤 鋁 銳 銼 鋒 鋇 鋰 銲 閭 閱 霄 霆 ++ 震 霉 靠 鞍 鞋 鞏 頡 頫 頜 颳 養 餓 餒 餘 駝 駐 ++ 駟 駛 駑 駕 駒 駙 骷 髮 髯 鬧 魅 魄 魷 魯 鴆 鴉 ++ 鴃 麩 麾 黎 墨 齒 儒 儘 儔 儐 儕 冀 冪 凝 劑 劓 ++ 勳 噙 噫 噹 噩 噤 噸 噪 器 噥 噱 噯 噬 噢 噶 壁 ++ 墾 壇 壅 奮 嬝 嬴 學 寰 導 彊 憲 憑 憩 憊 懍 憶 ++ 憾 懊 懈 戰 擅 擁 擋 撻 撼 據 擄 擇 擂 操 撿 擒 ++ 擔 撾 整 曆 曉 暹 曄 曇 暸 樽 樸 樺 橙 橫 橘 樹 ++ 橄 橢 橡 橋 橇 樵 機 橈 歙 歷 氅 濂 澱 澡 濃 澤 ++ 濁 澧 澳 激 澹 澶 澦 澠 澴 熾 燉 燐 燒 燈 燕 熹 ++ 燎 燙 燜 燃 燄 獨 璜 璣 璘 璟 璞 瓢 甌 甍 瘴 瘸 ++ 瘺 盧 盥 瞠 瞞 瞟 瞥 磨 磚 磬 磧 禦 積 穎 穆 穌 ++ 穋 窺 篙 簑 築 篤 篛 篡 篩 篦 糕 糖 縊 縑 縈 縛 ++ 縣 縞 縝 縉 縐 罹 羲 翰 翱 翮 耨 膳 膩 膨 臻 興 ++ 艘 艙 蕊 蕙 蕈 蕨 蕩 蕃 蕉 蕭 蕪 蕞 螃 螟 螞 螢 ++ 融 衡 褪 褲 褥 褫 褡 親 覦 諦 諺 諫 諱 謀 諜 諧 ++ 諮 諾 謁 謂 諷 諭 諳 諶 諼 豫 豭 貓 賴 蹄 踱 踴 ++ 蹂 踹 踵 輻 輯 輸 輳 辨 辦 遵 遴 選 遲 遼 遺 鄴 ++ 醒 錠 錶 鋸 錳 錯 錢 鋼 錫 錄 錚 錐 錦 錡 錕 錮 ++ 錙 閻 隧 隨 險 雕 霎 霑 霖 霍 霓 霏 靛 靜 靦 鞘 ++ 頰 頸 頻 頷 頭 頹 頤 餐 館 餞 餛 餡 餚 駭 駢 駱 ++ 骸 骼 髻 髭 鬨 鮑 鴕 鴣 鴦 鴨 鴒 鴛 默 黔 龍 龜 ++ 優 償 儡 儲 勵 嚎 嚀 嚐 嚅 嚇 嚏 壕 壓 壑 壎 嬰 ++ 嬪 嬤 孺 尷 屨 嶼 嶺 嶽 嶸 幫 彌 徽 應 懂 懇 懦 ++ 懋 戲 戴 擎 擊 擘 擠 擰 擦 擬 擱 擢 擭 斂 斃 曙 ++ 曖 檀 檔 檄 檢 檜 櫛 檣 橾 檗 檐 檠 歜 殮 毚 氈 ++ 濘 濱 濟 濠 濛 濤 濫 濯 澀 濬 濡 濩 濕 濮 濰 燧 ++ 營 燮 燦 燥 燭 燬 燴 燠 爵 牆 獰 獲 璩 環 璦 璨 ++ 癆 療 癌 盪 瞳 瞪 瞰 瞬 瞧 瞭 矯 磷 磺 磴 磯 礁 ++ 禧 禪 穗 窿 簇 簍 篾 篷 簌 篠 糠 糜 糞 糢 糟 糙 ++ 糝 縮 績 繆 縷 縲 繃 縫 總 縱 繅 繁 縴 縹 繈 縵 ++ 縿 縯 罄 翳 翼 聱 聲 聰 聯 聳 臆 臃 膺 臂 臀 膿 ++ 膽 臉 膾 臨 舉 艱 薪 薄 蕾 薜 薑 薔 薯 薛 薇 薨 ++ 薊 虧 蟀 蟑 螳 蟒 蟆 螫 螻 螺 蟈 蟋 褻 褶 襄 褸 ++ 褽 覬 謎 謗 謙 講 謊 謠 謝 謄 謐 豁 谿 豳 賺 賽 ++ 購 賸 賻 趨 蹉 蹋 蹈 蹊 轄 輾 轂 轅 輿 避 遽 還 ++ 邁 邂 邀 鄹 醣 醞 醜 鍍 鎂 錨 鍵 鍊 鍥 鍋 錘 鍾 ++ 鍬 鍛 鍰 鍚 鍔 闊 闋 闌 闈 闆 隱 隸 雖 霜 霞 鞠 ++ 韓 顆 颶 餵 騁 駿 鮮 鮫 鮪 鮭 鴻 鴿 麋 黏 點 黜 ++ 黝 黛 鼾 齋 叢 嚕 嚮 壙 壘 嬸 彝 懣 戳 擴 擲 擾 ++ 攆 擺 擻 擷 斷 曜 朦 檳 檬 櫃 檻 檸 櫂 檮 檯 歟 ++ 歸 殯 瀉 瀋 濾 瀆 濺 瀑 瀏 燻 燼 燾 燸 獷 獵 璧 ++ 璿 甕 癖 癘 癒 瞽 瞿 瞻 瞼 礎 禮 穡 穢 穠 竄 竅 ++ 簫 簧 簪 簞 簣 簡 糧 織 繕 繞 繚 繡 繒 繙 罈 翹 ++ 翻 職 聶 臍 臏 舊 藏 薩 藍 藐 藉 薰 薺 薹 薦 蟯 ++ 蟬 蟲 蟠 覆 覲 觴 謨 謹 謬 謫 豐 贅 蹙 蹣 蹦 蹤 ++ 蹟 蹕 軀 轉 轍 邇 邃 邈 醫 醬 釐 鎔 鎊 鎖 鎢 鎳 ++ 鎮 鎬 鎰 鎘 鎚 鎗 闔 闖 闐 闕 離 雜 雙 雛 雞 霤 ++ 鞣 鞦 鞭 韹 額 顏 題 顎 顓 颺 餾 餿 餽 餮 馥 騎 ++ 髁 鬃 鬆 魏 魎 魍 鯊 鯉 鯽 鯈 鯀 鵑 鵝 鵠 黠 鼕 ++ 鼬 儳 嚥 壞 壟 壢 寵 龐 廬 懲 懷 懶 懵 攀 攏 曠 ++ 曝 櫥 櫝 櫚 櫓 瀛 瀟 瀨 瀚 瀝 瀕 瀘 爆 爍 牘 犢 ++ 獸 獺 璽 瓊 瓣 疇 疆 癟 癡 矇 礙 禱 穫 穩 簾 簿 ++ 簸 簽 簷 籀 繫 繭 繹 繩 繪 羅 繳 羶 羹 羸 臘 藩 ++ 藝 藪 藕 藤 藥 藷 蟻 蠅 蠍 蟹 蟾 襠 襟 襖 襞 譁 ++ 譜 識 證 譚 譎 譏 譆 譙 贈 贊 蹼 蹲 躇 蹶 蹬 蹺 ++ 蹴 轔 轎 辭 邊 邋 醱 醮 鏡 鏑 鏟 鏃 鏈 鏜 鏝 鏖 ++ 鏢 鏍 鏘 鏤 鏗 鏨 關 隴 難 霪 霧 靡 韜 韻 類 願 ++ 顛 颼 饅 饉 騖 騙 鬍 鯨 鯧 鯖 鯛 鶉 鵡 鵲 鵪 鵬 ++ 麒 麗 麓 麴 勸 嚨 嚷 嚶 嚴 嚼 壤 孀 孃 孽 寶 巉 ++ 懸 懺 攘 攔 攙 曦 朧 櫬 瀾 瀰 瀲 爐 獻 瓏 癢 癥 ++ 礦 礪 礬 礫 竇 競 籌 籃 籍 糯 糰 辮 繽 繼 纂 罌 ++ 耀 臚 艦 藻 藹 蘑 藺 蘆 蘋 蘇 蘊 蠔 蠕 襤 覺 觸 ++ 議 譬 警 譯 譟 譫 贏 贍 躉 躁 躅 躂 醴 釋 鐘 鐃 ++ 鏽 闡 霰 飄 饒 饑 馨 騫 騰 騷 騵 鰓 鰍 鹹 麵 黨 ++ 鼯 齟 齣 齡 儷 儸 囁 囀 囂 夔 屬 巍 懼 懾 攝 攜 ++ 斕 曩 櫻 欄 櫺 殲 灌 爛 犧 瓖 瓔 癩 矓 籐 纏 續 ++ 羼 蘗 蘭 蘚 蠣 蠢 蠡 蠟 襪 襬 覽 譴 護 譽 贓 躊 ++ 躍 躋 轟 辯 醺 鐮 鐳 鐵 鐺 鐸 鐲 鐫 闢 霸 霹 露 ++ 響 顧 顥 饗 驅 驃 驀 騾 髏 魔 魑 鰭 鰥 鶯 鶴 鷂 ++ 鶸 麝 黯 鼙 齜 齦 齧 儼 儻 囈 囊 囉 孿 巔 巒 彎 ++ 懿 攤 權 歡 灑 灘 玀 瓤 疊 癮 癬 禳 籠 籟 聾 聽 ++ 臟 襲 襯 觼 讀 贖 贗 躑 躓 轡 酈 鑄 鑑 鑒 霽 霾 ++ 韃 韁 顫 饕 驕 驍 髒 鬚 鱉 鰱 鰾 鰻 鷓 鷗 鼴 齬 ++ 齪 龔 囌 巖 戀 攣 攫 攪 曬 欐 瓚 竊 籤 籣 籥 纓 ++ 纖 纔 臢 蘸 蘿 蠱 變 邐 邏 鑣 鑠 鑤 靨 顯 饜 驚 ++ 驛 驗 髓 體 髑 鱔 鱗 鱖 鷥 麟 黴 囑 壩 攬 灞 癱 ++ 癲 矗 罐 羈 蠶 蠹 衢 讓 讒 讖 艷 贛 釀 鑪 靂 靈 ++ 靄 韆 顰 驟 鬢 魘 鱟 鷹 鷺 鹼 鹽 鼇 齷 齲 廳 欖 ++ 灣 籬 籮 蠻 觀 躡 釁 鑲 鑰 顱 饞 髖 鬣 黌 灤 矚 ++ 讚 鑷 韉 驢 驥 纜 讜 躪 釅 鑽 鑾 鑼 鱷 鱸 黷 豔 ++ 鑿 鸚 爨 驪 鬱 鸛 鸞 籲 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ++ ⑨ ⑩ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⅰ ⅱ ⅲ ⅳ ++ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ 丶 丿 亅 亠 冂 冖 冫 勹 匸 卩 ++ 厶 夊 宀 巛 ⼳ 广 彐 彡 攴 疒 辵 ¨ ˆ ヽ ヾ ゝ ++ ゞ 々 〆 〇 ー [ ] ✽ ぁ あ ぃ い ぅ う ぇ え ++ ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ ++ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ++ ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ ++ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ++ ら り る れ ろ ゎ わ ゐ ゑ を ん ァ ア ィ イ ゥ ++ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ++ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ ++ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ++ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ++ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ++ ヶ А Б В Г Д Е Ё Ж З И Й К Л М Н ++ О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э ++ Ю Я а б в г д е ё ж з и й к л м ++ н о п р с т у ф х ц ч ш щ ъ ы ь ++ э ю я ⇧ ↸ ↹ ㇏ 𠃌 乚 𠂊 刂 䒑 龰 冈 龱 𧘇 ++ ¬ ¦ ' " ㈱ № ℡ ゛ ゜ ⺀ ⺄ ⺆ ⺇ ⺈ ⺊ ⺌ ++ ⺍ ⺕ ⺜ ⺝ ⺥ ⺧ ⺪ ⺬ ⺮ ⺶ ⺼ ⺾ ⻆ ⻊ ⻌ ⻍ ++ ⻏ ⻖ ⻗ ⻞ ⻣ ʃ ɐ ɛ ɔ ɵ œ ø ŋ ʊ ɪ 乂 ++ 乜 凵 匚 厂 万 丌 乇 亍 囗 兀 屮 彳 丏 冇 与 丮 ++ 亓 仂 仉 仈 冘 勼 卬 厹 圠 夃 夬 尐 巿 旡 殳 毌 ++ 气 爿 丱 丼 仨 仜 仩 仡 仝 仚 刌 匜 卌 圢 圣 夗 ++ 夯 宁 宄 尒 尻 屴 屳 帄 庀 庂 忉 戉 扐 氕 氶 汃 ++ 氿 氻 犮 犰 玊 禸 肊 阞 伎 优 伬 仵 伔 仱 伀 价 ++ 伈 伝 伂 伅 伢 伓 伄 仴 伒 冱 刓 刉 刐 劦 匢 匟 ++ 卍 厊 吇 囡 囟 圮 圪 圴 夼 妀 奼 妅 奻 奾 奷 奿 ++ 孖 尕 尥 屼 屺 屻 屾 巟 幵 庄 异 弚 彴 忕 忔 忏 ++ 扜 扞 扤 扡 扦 扢 扙 扠 扚 扥 旯 旮 朾 朹 朸 朻 ++ 机 朿 朼 朳 氘 汆 汒 汜 汏 汊 汔 汋 汌 灱 牞 犴 ++ 犵 玎 甪 癿 穵 网 艸 艼 芀 艽 艿 虍 襾 邙 邗 邘 ++ 邛 邔 阢 阤 阠 阣 佖 伻 佢 佉 体 佤 伾 佧 佒 佟 ++ 佁 佘 伭 伳 伿 佡 冏 冹 刜 刞 刡 劭 劮 匉 卣 卲 ++ 厎 厏 吰 吷 吪 呔 呅 吙 吜 吥 吘 吽 呏 呁 吨 吤 ++ 呇 囮 囧 囥 坁 坅 坌 坉 坋 坒 夆 奀 妦 妘 妠 妗 ++ 妎 妢 妐 妏 妧 妡 宎 宒 尨 尪 岍 岏 岈 岋 岉 岒 ++ 岊 岆 岓 岕 巠 帊 帎 庋 庉 庌 庈 庍 弅 弝 彸 彶 ++ 忒 忑 忐 忭 忨 忮 忳 忡 忤 忣 忺 忯 忷 忻 怀 忴 ++ 戺 抃 抌 抎 抏 抔 抇 扱 扻 扺 扰 抁 抈 扷 扽 扲 ++ 扴 攷 旰 旴 旳 旲 旵 杅 杇 杙 杕 杌 杈 杝 杍 杚 ++ 杋 毐 氙 氚 汸 汧 汫 沄 沋 沏 汱 汯 汩 沚 汭 沇 ++ 沕 沜 汦 汳 汥 汻 沎 灴 灺 牣 犿 犽 狃 狆 狁 犺 ++ 狅 玕 玗 玓 玔 玒 町 甹 疔 疕 皁 礽 耴 肕 肙 肐 ++ 肒 肜 芐 芏 芅 芎 芑 芓 芊 芃 芄 豸 迉 辿 邟 邡 ++ 邥 邞 邧 邠 阰 阨 阯 阭 丳 侘 佼 侅 佽 侀 侇 佶 ++ 佴 侉 侄 佷 佌 侗 佪 侚 佹 侁 佸 侐 侜 侔 侞 侒 ++ 侂 侕 佫 佮 冞 冼 冾 刵 刲 刳 剆 刱 劼 匊 匋 匼 ++ 厒 厔 咇 呿 咁 咑 咂 咈 呫 呺 呾 呥 呬 呴 呦 咍 ++ 呯 呡 呠 咘 呣 呧 呤 囷 囹 坯 坲 坭 坫 坱 坰 坶 ++ 垀 坵 坻 坳 坴 坢 坨 坽 夌 奅 妵 妺 姏 姎 妲 姌 ++ 姁 妶 妼 姃 姖 妱 妽 姀 姈 妴 姇 孢 孥 宓 宕 屄 ++ 屇 岮 岤 岠 岵 岯 岨 岬 岟 岣 岭 岢 岪 岧 岝 岥 ++ 岶 岰 岦 帗 帔 帙 弨 弢 弣 弤 彔 徂 彾 彽 忞 忥 ++ 怭 怦 怙 怲 怋 怴 怊 怗 怳 怚 怞 怬 怢 怍 怐 怮 ++ 怓 怑 怌 怉 怜 戔 戽 抭 抴 拑 抾 抪 抶 拊 抮 抳 ++ 抯 抻 抩 抰 抸 攽 斨 斻 昉 旼 昄 昒 昈 旻 昃 昋 ++ 昍 昅 旽 昑 昐 曶 朊 枅 杬 枎 枒 杶 杻 枘 枆 构 ++ 杴 枍 枌 杺 枟 枑 枙 枃 杽 极 杸 杹 枔 欥 殀 歾 ++ 毞 氝 沓 泬 泫 泮 泙 沶 泔 沭 泧 沷 泐 泂 沺 泃 ++ 泆 泭 泲 泒 泝 沴 沊 沝 沀 泞 泀 洰 泍 泇 沰 泹 ++ 泏 泩 泑 炔 炘 炅 炓 炆 炄 炑 炖 炂 炚 炃 牪 狖 ++ 狋 狘 狉 狜 狒 狔 狚 狌 狑 玤 玡 玭 玦 玢 玠 玬 ++ 玝 瓝 瓨 甿 畀 甾 疌 疘 皯 盳 盱 盰 盵 矸 矼 矹 ++ 矻 矺 矷 祂 礿 秅 穸 穻 竻 籵 糽 耵 肏 肮 肣 肸 ++ 肵 肭 舠 芠 苀 芫 芚 芘 芛 芵 芧 芮 芼 芞 芺 芴 ++ 芨 芡 芩 苂 芤 苃 芶 芢 虰 虯 虭 虮 豖 迒 迋 迓 ++ 迍 迖 迕 迗 邲 邴 邯 邳 邰 阹 阽 阼 阺 陃 俍 俅 ++ 俓 侲 俉 俋 俁 俔 俜 俙 侻 侳 俛 俇 俖 侺 俀 侹 ++ 俬 剄 剉 勀 勂 匽 卼 厗 厖 厙 厘 咺 咡 咭 咥 哏 ++ 哃 茍 咷 咮 哖 咶 哅 哆 咠 呰 咼 咢 咾 呲 哞 咰 ++ 垵 垞 垟 垤 垌 垗 垝 垛 垔 垘 垏 垙 垥 垚 垕 壴 ++ 复 奓 姡 姞 姮 娀 姱 姝 姺 姽 姼 姶 姤 姲 姷 姛 ++ 姩 姳 姵 姠 姾 姴 姭 宨 屌 峐 峘 峌 峗 峋 峛 峞 ++ 峚 峉 峇 峊 峖 峓 峔 峏 峈 峆 峎 峟 峸 巹 帡 帢 ++ 帣 帠 帤 庰 庤 庢 庛 庣 庥 弇 弮 彖 徆 怷 怹 恔 ++ 恲 恞 恅 恓 恇 恉 恛 恌 恀 恂 恟 怤 恄 恘 恦 恮 ++ 扂 扃 拏 挍 挋 拵 挎 挃 拫 拹 挏 挌 拸 拶 挀 挓 ++ 挔 拺 挕 拻 拰 敁 敃 斪 斿 昶 昡 昲 昵 昜 昦 昢 ++ 昳 昫 昺 昝 昴 昹 昮 朏 朐 柁 柲 柈 枺 柜 枻 柸 ++ 柘 柀 枷 柅 柫 柤 柟 枵 柍 枳 柷 柶 柮 柣 柂 枹 ++ 柎 柧 柰 枲 柼 柆 柭 柌 枮 柦 柛 柺 柉 柊 柃 柪 ++ 柋 欨 殂 殄 殶 毖 毘 毠 氠 氡 洨 洴 洭 洟 洼 洿 ++ 洒 洊 泚 洳 洄 洙 洺 洚 洑 洀 洝 浂 洁 洘 洷 洃 ++ 洏 浀 洇 洠 洬 洈 洢 洉 洐 炷 炟 炾 炱 炰 炡 炴 ++ 炵 炩 牁 牉 牊 牬 牰 牳 牮 狊 狤 狨 狫 狟 狪 狦 ++ 狣 玅 珌 珂 珈 珅 玹 玶 玵 玴 珫 玿 珇 玾 珃 珆 ++ 玸 珋 瓬 瓮 甮 畇 畈 疧 疪 癹 盄 眈 眃 眄 眅 眊 ++ 盷 盻 盺 矧 矨 砆 砑 砒 砅 砐 砏 砎 砉 砃 砓 祊 ++ 祌 祋 祅 祄 秕 种 秏 秖 秎 窀 穾 竑 笀 笁 籺 籸 ++ 籹 籿 粀 粁 紃 紈 紁 罘 羑 羍 羾 耇 耎 耏 耔 耷 ++ 胘 胇 胠 胑 胈 胂 胐 胅 胣 胙 胜 胊 胕 胉 胏 胗 ++ 胦 胍 臿 舡 芔 苙 苾 苹 茇 苨 茀 苕 茺 苫 苖 苴 ++ 苬 苡 苲 苵 茌 苻 苶 苰 苪 苤 苠 苺 苳 苭 虷 虴 ++ 虼 虳 衁 衎 衧 衪 衩 觓 訄 訇 赲 迣 迡 迮 迠 郱 ++ 邽 邿 郕 郅 邾 郇 郋 郈 釔 釓 陔 陏 陑 陓 陊 陎 ++ 倞 倅 倇 倓 倢 倰 倛 俵 俴 倳 倷 倬 俶 俷 倗 倜 ++ 倠 倧 倵 倯 倱 倎 党 冔 冓 凊 凄 凅 凈 凎 剡 剚 ++ 剒 剞 剟 剕 剢 勍 匎 厞 唦 哢 唗 唒 哧 哳 哤 唚 ++ 哿 唄 唈 哫 唑 唅 哱 唊 哻 哷 哸 哠 唎 唃 唋 圁 ++ 圂 埌 堲 埕 埒 垺 埆 垽 垼 垸 垶 垿 埇 埐 垹 埁 ++ 夎 奊 娙 娖 娭 娮 娕 娏 娗 娊 娞 娳 孬 宧 宭 宬 ++ 尃 屖 屔 峬 峿 峮 峱 峷 崀 峹 帩 帨 庨 庮 庪 庬 ++ 弳 弰 彧 恝 恚 恧 恁 悢 悈 悀 悒 悁 悝 悃 悕 悛 ++ 悗 悇 悜 悎 戙 扆 拲 挐 捖 挬 捄 捅 挶 捃 揤 挹 ++ 捋 捊 挼 挩 捁 挴 捘 捔 捙 挭 捇 挳 捚 捑 挸 捗 ++ 捀 捈 敊 敆 旆 旃 旄 旂 晊 晟 晇 晑 朒 朓 栟 栚 ++ 桉 栲 栳 栻 桋 桏 栖 栱 栜 栵 栫 栭 栯 桎 桄 栴 ++ 栝 栒 栔 栦 栨 栮 桍 栺 栥 栠 欬 欯 欭 欱 欴 歭 ++ 肂 殈 毦 毤 毨 毣 毢 毧 氥 浺 浣 浤 浶 洍 浡 涒 ++ 浘 浢 浭 浯 涑 涍 淯 浿 涆 浞 浧 浠 涗 浰 浼 浟 ++ 涂 涘 洯 浨 涋 浾 涀 涄 洖 涃 浻 浽 浵 涐 烜 烓 ++ 烑 烝 烋 缹 烢 烗 烒 烞 烠 烔 烍 烅 烆 烇 烚 烎 ++ 烡 牂 牸 牷 牶 猀 狺 狴 狾 狶 狳 狻 猁 珓 珙 珥 ++ 珖 玼 珧 珣 珩 珜 珒 珛 珔 珝 珚 珗 珘 珨 瓞 瓟 ++ 瓴 瓵 甡 畛 畟 疰 痁 疻 痄 痀 疿 疶 疺 皊 盉 眝 ++ 眛 眐 眓 眒 眣 眑 眕 眙 眚 眢 眧 砣 砬 砢 砵 砯 ++ 砨 砮 砫 砡 砩 砳 砪 砱 祔 祛 祏 祜 祓 祒 祑 秫 ++ 秬 秠 秮 秭 秪 秜 秞 秝 窆 窉 窅 窋 窌 窊 窇 竘 ++ 笐 笄 笓 笅 笏 笈 笊 笎 笉 笒 粄 粑 粊 粌 粈 粍 ++ 粅 紞 紝 紑 紎 紘 紖 紓 紟 紒 紏 紌 罜 罡 罞 罠 ++ 罝 罛 羖 羒 翃 翂 翀 耖 耾 耹 胺 胲 胹 胵 脁 胻 ++ 脀 舁 舯 舥 茳 茭 荄 茙 荑 茥 荖 茿 荁 茦 茜 茢 ++ 荂 荎 茛 茪 茈 茼 荍 茖 茤 茠 茷 茯 茩 荇 荅 荌 ++ 荓 茞 茬 荋 茧 荈 虓 虒 蚢 蚨 蚖 蚍 蚑 蚞 蚇 蚗 ++ 蚆 蚋 蚚 蚅 蚥 蚙 蚡 蚧 蚕 蚘 蚎 蚝 蚐 蚔 衃 衄 ++ 衭 衵 衶 衲 袀 衱 衿 衯 袃 衾 衴 衼 訒 豇 豗 豻 ++ 貤 貣 赶 赸 趵 趷 趶 軑 軓 迾 迵 适 迿 迻 逄 迼 ++ 迶 郖 郠 郙 郚 郣 郟 郥 郘 郛 郗 郜 郤 酐 酎 酏 ++ 釕 釢 釚 陜 陟 隼 飣 髟 鬯 乿 偰 偪 偡 偞 偠 偓 ++ 偋 偝 偲 偈 偍 偁 偛 偊 偢 倕 偅 偟 偩 偫 偣 偤 ++ 偆 偀 偮 偳 偗 偑 凐 剫 剭 剬 剮 勖 勓 匭 厜 啵 ++ 啶 唼 啍 啐 唴 唪 啑 啢 唶 唵 唰 啒 啅 唌 唲 啥 ++ 啎 唹 啈 唭 唻 啀 啋 圊 圇 埻 堔 埢 埶 埜 埴 堀 ++ 埭 埽 堈 埸 堋 埳 埏 堇 埮 埣 埲 埥 埬 埡 堎 埼 ++ 堐 埧 堁 堌 埱 埩 埰 堍 堄 奜 婠 婘 婕 婧 婞 娸 ++ 娵 婭 婐 婟 婥 婬 婓 婤 婗 婃 婝 婒 婄 婛 婈 媎 ++ 娾 婍 娹 婌 婰 婩 婇 婑 婖 婂 婜 孲 孮 寁 寀 屙 ++ 崞 崋 崝 崚 崠 崌 崨 崍 崦 崥 崏 崰 崒 崣 崟 崮 ++ 帾 帴 庱 庴 庹 庲 庳 弶 弸 徛 徖 徟 悊 悐 悆 悾 ++ 悰 悺 惓 惔 惏 惤 惙 惝 惈 悱 惛 悷 惊 悿 惃 惍 ++ 惀 挲 捥 掊 掂 捽 掽 掞 掭 掝 掗 掫 掎 捯 掇 掐 ++ 据 掯 捵 掜 捭 掮 捼 掤 挻 掟 捸 掅 掁 掑 掍 捰 ++ 敓 旍 晥 晡 晛 晙 晜 晢 朘 桹 梇 梐 梜 桭 桮 梮 ++ 梫 楖 桯 梣 梬 梩 桵 桴 梲 梏 桷 梒 桼 桫 桲 梪 ++ 梀 桱 桾 梛 梖 梋 梠 梉 梤 桸 桻 梑 梌 梊 桽 欶 ++ 欳 欷 欸 殑 殏 殍 殎 殌 氪 淀 涫 涴 涳 湴 涬 淩 ++ 淢 涷 淶 淔 渀 淈 淠 淟 淖 涾 淥 淜 淝 淛 淴 淊 ++ 涽 淭 淰 涺 淕 淂 淏 淉 淐 淲 淓 淽 淗 淍 淣 涻 ++ 烺 焍 烷 焗 烴 焌 烰 焄 烳 焐 烼 烿 焆 焓 焀 烸 ++ 烶 焋 焂 焎 牾 牻 牼 牿 猝 猗 猇 猑 猘 猊 猈 狿 ++ 猏 猞 玈 珶 珸 珵 琄 琁 珽 琇 琀 珺 珼 珿 琌 琋 ++ 珴 琈 畤 畣 痎 痒 痏 痋 痌 痑 痐 皏 皉 盓 眹 眯 ++ 眭 眱 眲 眴 眳 眽 眥 眻 眵 硈 硒 硉 硍 硊 硌 砦 ++ 硅 硐 祤 祧 祩 祪 祣 祫 祡 离 秺 秸 秶 秷 窏 窔 ++ 窐 笵 筇 笴 笥 笰 笢 笤 笳 笘 笪 笝 笱 笫 笭 笯 ++ 笲 笸 笚 笣 粔 粘 粖 粣 紵 紽 紸 紶 紺 絅 紬 紩 ++ 絁 絇 紾 紿 絊 紻 紨 罣 羕 羜 羝 羛 翊 翋 翍 翐 ++ 翑 翇 翏 翉 耟 耞 耛 聇 聃 聈 脘 脥 脙 脛 脭 脟 ++ 脬 脞 脡 脕 脧 脝 脢 舑 舸 舳 舺 舴 舲 艴 莐 莣 ++ 莨 莍 荺 荳 莤 荴 莏 莁 莕 莙 荵 莔 莩 荽 莃 莌 ++ 莝 莛 莪 莋 荾 莥 莯 莈 莗 莰 荿 莦 莇 莮 荶 莚 ++ 虙 虖 蚿 蚷 蛂 蛁 蛅 蚺 蚰 蛈 蚹 蚳 蚸 蛌 蚴 蚻 ++ 蚼 蛃 蚽 蚾 衒 袉 袕 袨 袢 袪 袚 袑 袡 袟 袘 袧 ++ 袙 袛 袗 袤 袬 袌 袓 袎 覂 觖 觙 觕 訰 訧 訬 訞 ++ 谹 谻 豜 豝 豽 貥 赽 赻 赹 趼 跂 趹 趿 跁 軘 軞 ++ 軝 軜 軗 軠 軡 逤 逋 逑 逜 逌 逡 郯 郪 郰 郴 郲 ++ 郳 郔 郫 郬 郩 酖 酘 酚 酓 酕 釬 釴 釱 釳 釸 釤 ++ 釹 釪 釫 釷 釨 釮 镺 閆 閈 陼 陭 陫 陱 陯 隿 靪 ++ 頄 飥 馗 傛 傕 傔 傞 傋 傣 傃 傌 傎 傝 偨 傜 傒 ++ 傂 傇 兟 凔 匒 匑 厤 厧 喑 喨 喥 喭 啷 噅 喢 喓 ++ 喈 喏 喵 喁 喣 喒 喤 啽 喌 喦 啿 喕 喡 喎 圌 堩 ++ 堷 堙 堞 堧 堣 堨 埵 塈 堥 堜 堛 堳 堿 堶 堮 堹 ++ 堸 堭 堬 堻 奡 媯 媔 媟 婺 媢 媞 婸 媦 婼 媥 媬 ++ 媕 媮 娷 媄 媊 媗 媃 媋 媩 婻 婽 媌 媜 媏 媓 媝 ++ 寪 寍 寋 寔 寑 寊 寎 尌 尰 崷 嵃 嵫 嵁 嵋 崿 崵 ++ 嵑 嵎 嵕 崳 崺 嵒 崽 崱 嵙 嵂 崹 嵉 崸 崼 崲 崶 ++ 嵀 嵅 幄 幁 彘 徦 徥 徫 惉 悹 惌 惢 惎 惄 愔 惲 ++ 愊 愖 愅 惵 愓 惸 惼 惾 惁 愃 愘 愝 愐 惿 愄 愋 ++ 扊 掔 掱 掰 揎 揥 揨 揯 揃 撝 揳 揊 揠 揶 揕 揲 ++ 揵 摡 揟 掾 揝 揜 揄 揘 揓 揂 揇 揌 揋 揈 揰 揗 ++ 揙 攲 敧 敪 敤 敜 敨 敥 斌 斝 斞 斮 旐 旒 晼 晬 ++ 晻 暀 晱 晹 晪 晲 朁 椌 棓 椄 棜 椪 棬 棪 棱 椏 ++ 棖 棷 棫 棤 棶 椓 椐 棳 棡 椇 棌 椈 楰 梴 椑 棯 ++ 棆 椔 棸 棐 棽 棼 棨 椋 椊 椗 棎 棈 棝 棞 棦 棴 ++ 棑 椆 棔 棩 椕 椥 棇 欹 欻 欿 欼 殔 殗 殙 殕 殽 ++ 毰 毲 毳 氰 淼 湆 湇 渟 湉 溈 渼 渽 湅 湢 渫 渿 ++ 湁 湝 湳 渜 渳 湋 湀 湑 渻 渃 渮 湞 湨 湜 湡 渱 ++ 渨 湠 湱 湫 渹 渢 渰 湓 湥 渧 湸 湤 湷 湕 湹 湒 ++ 湦 渵 渶 湚 焠 焞 焯 烻 焮 焱 焣 焥 焢 焲 焟 焨 ++ 焺 焛 牋 牚 犈 犉 犆 犅 犋 猒 猋 猰 猢 猱 猳 猧 ++ 猲 猭 猦 猣 猵 猌 琮 琬 琰 琫 琖 琚 琡 琭 琱 琤 ++ 琣 琝 琩 琠 琲 瓻 甯 畯 畬 痧 痚 痡 痦 痝 痟 痤 ++ 痗 皕 皒 盚 睆 睇 睄 睍 睅 睊 睎 睋 睌 矞 矬 硠 ++ 硤 硥 硜 硭 硱 硪 确 硰 硩 硨 硞 硢 祴 祳 祲 祰 ++ 稂 稊 稃 稌 稄 窙 竦 竤 筊 笻 筄 筈 筌 筎 筀 筘 ++ 筅 粢 粞 粨 粡 絘 絯 絣 絓 絖 絧 絪 絏 絭 絜 絫 ++ 絒 絔 絩 絑 絟 絎 缾 缿 罥 罦 羢 羠 羡 翗 聑 聏 ++ 聐 胾 胔 腃 腊 腒 腏 腇 脽 腍 脺 臦 臮 臷 臸 臹 ++ 舄 舼 舽 舿 艵 茻 菏 菹 萣 菀 菨 萒 菧 菤 菼 菶 ++ 萐 菆 菈 菫 菣 莿 萁 菝 菥 菘 菿 菡 菋 菎 菖 菵 ++ 菉 萉 萏 菞 萑 萆 菂 菳 菕 菺 菇 菑 菪 萓 菃 菬 ++ 菮 菄 菻 菗 菢 萛 菛 菾 蛘 蛢 蛦 蛓 蛣 蛚 蛪 蛝 ++ 蛫 蛜 蛬 蛩 蛗 蛨 蛑 衈 衖 衕 袺 裗 袹 袸 裀 袾 ++ 袶 袼 袷 袽 袲 褁 裉 覕 覘 覗 觝 觚 觛 詎 詍 訹 ++ 詙 詀 詗 詘 詄 詅 詒 詈 詑 詊 詌 詏 豟 貁 貀 貺 ++ 貾 貰 貹 貵 趄 趀 趉 跘 跓 跍 跇 跖 跜 跏 跕 跙 ++ 跈 跗 跅 軯 軷 軺 軹 軦 軮 軥 軵 軧 軨 軶 軫 軱 ++ 軬 軴 軩 逭 逴 逯 鄆 鄬 鄄 郿 郼 鄈 郹 郻 鄁 鄀 ++ 鄇 鄅 鄃 酡 酤 酟 酢 酠 鈁 鈊 鈥 鈃 鈚 鈦 鈏 鈌 ++ 鈀 鈒 釿 釽 鈆 鈄 鈧 鈂 鈜 鈤 鈙 鈗 鈅 鈖 镻 閍 ++ 閌 閐 隇 陾 隈 隉 隃 隀 雂 雈 雃 雱 雰 靬 靰 靮 ++ 頇 颩 飫 鳦 黹 亃 亄 亶 傽 傿 僆 傮 僄 僊 傴 僈 ++ 僂 傰 僁 傺 傱 僋 僉 傶 傸 凗 剺 剸 剻 剼 嗃 嗛 ++ 嗌 嗐 嗋 嗊 嗝 嗀 嗔 嗄 嗩 喿 嗒 喍 嗏 嗕 嗢 嗖 ++ 嗈 嗲 嗍 嗙 嗂 圔 塓 塨 塤 塏 塍 塉 塯 塕 塎 塝 ++ 塙 塥 塛 堽 塣 塱 壼 嫇 嫄 嫋 媺 媸 媱 媵 媰 媿 ++ 嫈 媻 嫆 媷 嫀 嫊 媴 媶 嫍 媹 媐 寖 寘 寙 尟 尳 ++ 嵱 嵣 嵊 嵥 嵲 嵬 嵞 嵨 嵧 嵢 巰 幏 幎 幊 幍 幋 ++ 廅 廌 廆 廋 廇 彀 徯 徭 惷 慉 慊 愫 慅 愶 愲 愮 ++ 慆 愯 慏 愩 慀 戠 酨 戣 戥 戤 揅 揱 揫 搐 搒 搉 ++ 搠 搤 搳 摃 搟 搕 搘 搹 搷 搢 搣 搌 搦 搰 搨 摁 ++ 搵 搯 搊 搚 摀 搥 搧 搋 揧 搛 搮 搡 搎 敯 斒 旓 ++ 暆 暌 暕 暐 暋 暊 暙 暔 晸 朠 楦 楟 椸 楎 楢 楱 ++ 椿 楅 楪 椹 楂 楗 楙 楺 楈 楉 椵 楬 椳 椽 楥 棰 ++ 楸 椴 楩 楀 楯 楄 楶 楘 楁 楴 楌 椻 楋 椷 楜 楏 ++ 楑 椲 楒 椯 楻 椼 歆 歅 歃 歂 歈 歁 殛 嗀 毻 毼 ++ 毹 毷 毸 溛 滖 滈 溏 滀 溟 溓 溔 溠 溱 溹 滆 滒 ++ 溽 滁 溞 滉 溷 溰 滍 溦 滏 溲 溾 滃 滜 滘 溙 溒 ++ 溎 溍 溤 溡 溿 溳 滐 滊 溗 溮 溣 煇 煔 煒 煣 煠 ++ 煁 煝 煢 煲 煸 煪 煡 煂 煘 煃 煋 煰 煟 煐 煓 煄 ++ 煍 煚 牏 犍 犌 犑 犐 犎 猼 獂 猻 猺 獀 獊 獉 瑄 ++ 瑊 瑋 瑒 瑑 瑗 瑀 瑏 瑐 瑎 瑂 瑆 瑍 瑔 瓡 瓿 瓾 ++ 瓽 甝 畹 畷 榃 痯 瘏 瘃 痷 痾 痼 痹 痸 瘐 痻 痶 ++ 痭 痵 痽 皙 皵 盝 睕 睟 睠 睒 睖 睚 睩 睧 睔 睙 ++ 睭 矠 碇 碚 碔 碏 碄 碕 碅 碆 碡 碃 硹 碙 碀 碖 ++ 硻 祼 禂 祽 祹 稑 稘 稙 稒 稗 稕 稢 稓 稛 稐 窣 ++ 窢 窞 竫 筦 筤 筭 筴 筩 筲 筥 筳 筱 筰 筡 筸 筶 ++ 筣 粲 粴 粯 綈 綆 綀 綍 絿 綅 絺 綎 絻 綃 絼 綌 ++ 綔 綄 絽 綒 罭 罫 罧 罨 罬 羦 羥 羧 翛 翜 耡 腤 ++ 腠 腷 腜 腩 腛 腢 腲 朡 腞 腶 腧 腯 腄 腡 舝 艉 ++ 艄 艀 艂 艅 蓱 萿 葖 葶 葹 蒏 蒍 葥 葑 葀 蒆 葧 ++ 萰 葍 葽 葚 葙 葴 葳 葝 蔇 葞 萷 萺 萴 葺 葃 葸 ++ 萲 葅 萩 菙 葋 萯 葂 萭 葟 葰 萹 葎 葌 葒 葯 蓅 ++ 蒎 萻 葇 萶 萳 葨 葾 葄 萫 葠 葔 葮 葐 蜋 蜄 蛷 ++ 蜌 蛺 蛖 蛵 蝍 蛸 蜎 蜉 蜁 蛶 蜍 蜅 裖 裋 裍 裎 ++ 裞 裛 裚 裌 裐 覅 覛 觟 觥 觤 觡 觠 觢 觜 触 詶 ++ 誆 詿 詡 訿 詷 誂 誄 詵 誃 誁 詴 詺 谼 豋 豊 豥 ++ 豤 豦 貆 貄 貅 賌 赨 赩 趑 趌 趎 趏 趍 趓 趔 趐 ++ 趒 跰 跠 跬 跱 跮 跐 跩 跣 跢 跧 跲 跫 跴 輆 軿 ++ 輁 輀 輅 輇 輈 輂 輋 遒 逿 遄 遉 逽 鄐 鄍 鄏 鄑 ++ 鄖 鄔 鄋 鄎 酮 酯 鉈 鉒 鈰 鈺 鉦 鈳 鉥 鉞 銃 鈮 ++ 鉊 鉆 鉭 鉬 鉏 鉠 鉧 鉯 鈶 鉡 鉰 鈱 鉔 鉣 鉐 鉲 ++ 鉎 鉓 鉌 鉖 鈲 閟 閜 閞 閛 隒 隓 隑 隗 雎 雺 雽 ++ 雸 雵 靳 靷 靸 靲 頏 頍 頎 颬 飶 飹 馯 馲 馰 馵 ++ 骭 骫 魛 鳪 鳭 鳧 麀 黽 僦 僔 僗 僨 僳 僛 僪 僝 ++ 僤 僓 僬 僰 僯 僣 僠 凘 劀 劁 勩 勫 匰 厬 嘧 嘕 ++ 嘌 嘒 嗼 嘏 嘜 嘁 嘓 嘂 嗺 嘝 嘄 嗿 嗹 墉 塼 墐 ++ 墘 墆 墁 塿 塴 墋 塺 墇 墑 墎 塶 墂 墈 塻 墔 墏 ++ 壾 奫 嫜 嫮 嫥 嫕 嫪 嫚 嫭 嫫 嫳 嫢 嫠 嫛 嫬 嫞 ++ 嫝 嫙 嫨 嫟 孷 寠 寣 屣 嶂 嶀 嵽 嶆 嵺 嶁 嵷 嶊 ++ 嶉 嶈 嵾 嵼 嶍 嵹 嵿 幘 幙 幓 廘 廑 廗 廎 廜 廕 ++ 廙 廒 廔 彄 彃 彯 徶 愬 愨 慁 慞 慱 慳 慒 慓 慲 ++ 慬 憀 慴 慔 慺 慛 慥 愻 慪 慡 慖 戩 戧 戫 搫 摍 ++ 摛 摝 摴 摶 摲 摳 摽 摵 摦 撦 摎 撂 摞 摜 摋 摓 ++ 摠 摐 摿 搿 摬 摫 摙 摥 摷 敳 斠 暡 暠 暟 朅 朄 ++ 朢 榱 榶 槉 榠 槎 榖 榰 榬 榼 榑 榙 榎 榧 榍 榩 ++ 榾 榯 榿 槄 榽 榤 槔 榹 槊 榚 槏 榳 榓 榪 榡 榞 ++ 槙 榗 榐 槂 榵 榥 槆 歊 歍 歋 殞 殟 殠 毃 毄 毾 ++ 滎 滵 滱 漃 漥 滸 漷 滻 漮 漉 潎 漙 漚 漧 漘 漻 ++ 漒 滭 漊 漶 潳 滹 滮 漭 潀 漰 漼 漵 滫 漇 漎 潃 ++ 漅 滽 滶 漹 漜 滼 漺 漟 漍 漞 漈 漡 熇 熐 熉 熀 ++ 熅 熂 熏 煻 熆 熁 熗 牄 牓 犗 犕 犓 獃 獍 獑 獌 ++ 瑢 瑳 瑱 瑵 瑲 瑧 瑮 甀 甂 甃 畽 疐 瘖 瘈 瘌 瘕 ++ 瘑 瘊 瘔 皸 瞁 睼 瞅 瞂 睮 瞀 睯 睾 瞃 碲 碪 碴 ++ 碭 碨 硾 碫 碞 碥 碠 碬 碢 碤 禘 禊 禋 禖 禕 禔 ++ 禓 禗 禈 禒 禐 稫 穊 稰 稯 稨 稦 窨 窫 窬 竮 箈 ++ 箜 箊 箑 箐 箖 箍 箌 箛 箎 箅 箘 劄 箙 箤 箂 粻 ++ 粿 粼 粺 綧 綷 緂 綣 綪 緁 緀 緅 綝 緎 緄 緆 緋 ++ 緌 綯 綹 綖 綼 綟 綦 綮 綩 綡 緉 罳 翢 翣 翥 翞 ++ 耤 聝 聜 膉 膆 膃 膇 膍 膌 膋 舕 蒗 蒤 蒡 蒟 蒺 ++ 蓎 蓂 蒬 蒮 蒫 蒹 蒴 蓁 蓍 蒪 蒚 蒱 蓐 蒝 蒧 蒻 ++ 蒢 蒔 蓇 蓌 蒛 蒩 蒯 蒨 蓖 蒘 蒶 蓏 蒠 蓗 蓔 蓒 ++ 蓛 蒰 蒑 虡 蜳 蜣 蜨 蝫 蝀 蜮 蜞 蜡 蜙 蜛 蝃 蜬 ++ 蝁 蜾 蝆 蜠 蜲 蜪 蜭 蜼 蜒 蜺 蜱 蜵 蝂 蜦 蜧 蜸 ++ 蜤 蜚 蜰 蜑 裷 裧 裱 裲 裺 裾 裮 裼 裶 裻 裰 裬 ++ 裫 覝 覡 覟 覞 觩 觫 觨 誫 誙 誋 誒 誏 誖 谽 豨 ++ 豩 賕 賏 賗 趖 踉 踂 跿 踍 跽 踊 踃 踇 踆 踅 跾 ++ 踀 踄 輐 輑 輎 輍 鄣 鄜 鄠 鄢 鄟 鄝 鄚 鄤 鄡 鄛 ++ 酺 酲 酹 酳 銥 銤 鉶 銛 鉺 銠 銔 銪 銍 銦 銚 銫 ++ 鉹 銗 鉿 銣 鋮 銎 銂 銕 銢 鉽 銈 銡 銊 銆 銌 銙 ++ 銧 鉾 銇 銩 銝 銋 鈭 隞 隡 雿 靘 靽 靺 靾 鞃 鞀 ++ 鞂 靻 鞄 鞁 靿 韎 韍 頖 颭 颮 餂 餀 餇 馝 馜 駃 ++ 馹 馻 馺 駂 馽 駇 骱 髣 髧 鬾 鬿 魠 魡 魟 鳱 鳲 ++ 鳵 麧 僿 儃 儰 僸 儆 儇 僶 僾 儋 儌 僽 儊 劋 劌 ++ 勱 勯 噈 噂 噌 嘵 噁 噊 噉 噆 噘 噚 噀 嘳 嘽 嘬 ++ 嘾 嘸 嘪 嘺 圚 墫 墝 墱 墠 墣 墯 墬 墥 墡 壿 嫿 ++ 嫴 嫽 嫷 嫶 嬃 嫸 嬂 嫹 嬁 嬇 嬅 嬏 屧 嶙 嶗 嶟 ++ 嶒 嶢 嶓 嶕 嶠 嶜 嶡 嶚 嶞 幩 幝 幠 幜 緳 廛 廞 ++ 廡 彉 徲 憋 憃 慹 憱 憰 憢 憉 憛 憓 憯 憭 憟 憒 ++ 憪 憡 憍 慦 憳 戭 摮 摰 撖 撠 撅 撗 撜 撏 撋 撊 ++ 撌 撣 撟 摨 撱 撘 敶 敺 敹 敻 斲 斳 暵 暰 暩 暲 ++ 暷 暪 暯 樀 樆 樗 槥 槸 樕 槱 槤 樠 槿 槬 槢 樛 ++ 樝 槾 樧 槲 槮 樔 槷 槧 橀 樈 槦 槻 樍 槼 槫 樉 ++ 樄 樘 樥 樏 槶 樦 樇 槴 樖 歑 殥 殣 殢 殦 氁 氀 ++ 毿 氂 潁 漦 潾 澇 濆 澒 澍 澉 澌 潢 潏 澅 潚 澖 ++ 潶 潬 澂 潕 潲 潒 潐 潗 澔 澓 潝 漀 潡 潫 潽 潧 ++ 澐 潓 澋 潩 潿 澕 潣 潷 潪 潻 熲 熯 熛 熰 熠 熚 ++ 熩 熵 熝 熥 熞 熤 熡 熪 熜 熧 熳 犘 犚 獘 獒 獞 ++ 獟 獠 獝 獛 獡 獚 獙 獢 璇 璉 璊 璆 璁 瑽 璅 璈 ++ 瑼 瑹 甈 甇 畾 瘥 瘞 瘙 瘝 瘜 瘣 瘚 瘨 瘛 皜 皝 ++ 皞 皛 瞍 瞏 瞉 瞈 磍 碻 磏 磌 磑 磎 磔 磈 磃 磄 ++ 磉 禚 禡 禠 禜 禢 禛 歶 稹 窲 窴 窳 箷 篋 箾 箬 ++ 篎 箯 箹 篊 箵 糅 糈 糌 糋 緷 緛 緪 緧 緗 緡 縃 ++ 緺 緦 緶 緱 緰 緮 緟 罶 羬 羰 羭 翭 翫 翪 翬 翦 ++ 翨 聤 聧 膣 膟 膞 膕 膢 膙 膗 舖 艏 艓 艒 艐 艎 ++ 艑 蔤 蔻 蔏 蔀 蔩 蔎 蔉 蔍 蔟 蔊 蔧 蔜 蓻 蔫 蓺 ++ 蔈 蔌 蓴 蔪 蓲 蔕 蓷 蓫 蓳 蓼 蔒 蓪 蓩 蔖 蓾 蔨 ++ 蔝 蔮 蔂 蓽 蔞 蓶 蔱 蔦 蓧 蓨 蓰 蓯 蓹 蔘 蔠 蔰 ++ 蔋 蔙 蔯 虢 蝖 蝣 蝤 蝷 蟡 蝳 蝘 蝔 蝛 蝒 蝡 蝚 ++ 蝑 蝞 蝭 蝪 蝐 蝎 蝟 蝝 蝯 蝬 蝺 蝮 蝜 蝥 蝏 蝻 ++ 蝵 蝢 蝧 蝩 衚 褅 褌 褔 褋 褗 褘 褙 褆 褖 褑 褎 ++ 褉 覢 覤 覣 觭 觰 觬 諏 諆 誸 諓 諑 諔 諕 誻 諗 ++ 誾 諀 諅 諘 諃 誺 誽 諙 谾 豍 貏 賥 賟 賙 賨 賚 ++ 賝 賧 趠 趜 趡 趛 踠 踣 踥 踤 踮 踕 踛 踖 踑 踙 ++ 踦 踧 踔 踒 踘 踓 踜 踗 踚 輬 輤 輘 輚 輠 輣 輖 ++ 輗 遳 遰 遯 遧 遫 鄯 鄫 鄩 鄪 鄲 鄦 鄮 醅 醆 醊 ++ 醁 醂 醄 醀 鋐 鋃 鋄 鋀 鋙 銶 鋏 鋱 鋟 鋘 鋩 鋗 ++ 鋝 鋌 鋯 鋂 鋨 鋊 鋈 鋎 鋦 鋍 鋕 鋉 鋠 鋞 鋧 鋑 ++ 鋓 銵 鋡 鋆 銴 镼 閬 閫 閮 閰 隤 隢 雓 霅 霈 霂 ++ 靚 鞊 鞎 鞈 韐 韏 頞 頝 頦 頩 頨 頠 頛 頧 颲 餈 ++ 飺 餑 餔 餖 餗 餕 駜 駍 駏 駓 駔 駎 駉 駖 駘 駋 ++ 駗 駌 骳 髬 髫 髳 髲 髱 魆 魃 魧 魴 魱 魦 魶 魵 ++ 魰 魨 魤 魬 鳼 鳺 鳽 鳿 鳷 鴇 鴀 鳹 鳻 鴈 鴅 鴄 ++ 麃 黓 鼏 鼐 儜 儓 儗 儚 儑 凞 匴 叡 噰 噠 噮 噳 ++ 噦 噣 噭 噲 噞 噷 圜 圛 壈 墽 壉 墿 墺 壂 墼 壆 ++ 嬗 嬙 嬛 嬡 嬔 嬓 嬐 嬖 嬨 嬚 嬠 嬞 寯 嶬 嶱 嶩 ++ 嶧 嶵 嶰 嶮 嶪 嶨 嶲 嶭 嶯 嶴 幧 幨 幦 幯 廩 廧 ++ 廦 廨 廥 彋 徼 憝 憨 憖 懅 憴 懆 懁 懌 憺 憿 憸 ++ 憌 擗 擖 擐 擏 擉 撽 撉 擃 擛 擳 擙 攳 敿 敼 斢 ++ 曈 暾 曀 曊 曋 曏 暽 暻 暺 曌 朣 樴 橦 橉 橧 樲 ++ 橨 樾 橝 橭 橶 橛 橑 樨 橚 樻 樿 橁 橪 橤 橐 橏 ++ 橔 橯 橩 橠 樼 橞 橖 橕 橍 橎 橆 歕 歔 歖 殧 殪 ++ 殫 毈 毇 氄 氃 氆 澭 濋 澣 濇 澼 濎 濈 潞 濄 澽 ++ 澞 濊 澨 瀄 澥 澮 澺 澬 澪 濏 澿 澸 澢 濉 澫 濍 ++ 澯 澲 澰 燅 燂 熿 熸 燖 燀 燁 燋 燔 燊 燇 燏 熽 ++ 燘 熼 燆 燚 燛 犝 犞 獩 獦 獧 獬 獥 獫 獪 瑿 璚 ++ 璠 璔 璒 璕 璡 甋 疀 瘯 瘭 瘱 瘽 瘳 瘼 瘵 瘲 瘰 ++ 皻 盦 瞚 瞝 瞡 瞜 瞛 瞢 瞣 瞕 瞙 瞗 磝 磩 磥 磪 ++ 磞 磣 磛 磡 磢 磭 磟 磠 禤 穄 穈 穇 窶 窸 窵 窱 ++ 窷 篞 篣 篧 篝 篕 篥 篚 篨 篹 篔 篪 篢 篜 篫 篘 ++ 篟 糒 糔 糗 糐 糑 縒 縡 縗 縌 縟 縠 縓 縎 縜 縕 ++ 縚 縢 縋 縏 縖 縍 縔 縥 縤 罃 罻 罼 罺 羱 翯 耪 ++ 耩 聬 膱 膦 膮 膹 膵 膫 膰 膬 膴 膲 膷 膧 臲 艕 ++ 艖 艗 蕖 蕅 蕫 蕍 蕓 蕡 蕘 蕀 蕆 蕤 蕁 蕢 蕄 蕑 ++ 蕇 蕣 蔾 蕛 蕱 蕎 蕮 蕵 蕕 蕧 蕠 薌 蕦 蕝 蕔 蕥 ++ 蕬 虣 虥 虤 螛 螏 螗 螓 螒 螈 螁 螖 螘 蝹 螇 螣 ++ 螅 螐 螑 螝 螄 螔 螜 螚 螉 褞 褦 褰 褭 褮 褧 褱 ++ 褢 褩 褣 褯 褬 褟 觱 諠 諢 諲 諴 諵 諝 謔 諤 諟 ++ 諰 諈 諞 諡 諨 諿 諯 諻 貑 貒 貐 賵 賮 賱 賰 賳 ++ 赬 赮 趥 趧 踳 踾 踸 蹀 蹅 踶 踼 踽 蹁 踰 踿 躽 ++ 輶 輮 輵 輲 輹 輷 輴 遶 遹 遻 邆 郺 鄳 鄵 鄶 醓 ++ 醐 醑 醍 醏 錧 錞 錈 錟 錆 錏 鍺 錸 錼 錛 錣 錒 ++ 錁 鍆 錭 錎 錍 鋋 錝 鋺 錥 錓 鋹 鋷 錴 錂 錤 鋿 ++ 錩 錹 錵 錪 錔 錌 錋 鋾 錉 錀 鋻 錖 閼 闍 閾 閹 ++ 閺 閶 閿 閵 閽 隩 雔 霋 霒 霐 鞙 鞗 鞔 韰 韸 頵 ++ 頯 頲 餤 餟 餧 餩 馞 駮 駬 駥 駤 駰 駣 駪 駩 駧 ++ 骹 骿 骴 骻 髶 髺 髹 髷 鬳 鮀 鮅 鮇 魼 魾 魻 鮂 ++ 鮓 鮒 鮐 魺 鮕 魽 鮈 鴥 鴗 鴠 鴞 鴔 鴩 鴝 鴘 鴢 ++ 鴐 鴙 鴟 麈 麆 麇 麮 麭 黕 黖 黺 鼒 鼽 儦 儥 儢 ++ 儤 儠 儩 勴 嚓 嚌 嚍 嚆 嚄 嚃 噾 嚂 噿 嚁 壖 壔 ++ 壏 壒 嬭 嬥 嬲 嬣 嬬 嬧 嬦 嬯 嬮 孻 寱 寲 嶷 幬 ++ 幪 徾 徻 懃 憵 憼 懧 懠 懥 懤 懨 懞 擯 擩 擣 擫 ++ 擤 擨 斁 斀 斶 旚 曒 檍 檖 檁 檥 檉 檟 檛 檡 檞 ++ 檇 檓 檎 檕 檃 檨 檤 檑 橿 檦 檚 檅 檌 檒 歛 殭 ++ 氉 濌 澩 濴 濔 濣 濜 濭 濧 濦 濞 濲 濝 濢 濨 燡 ++ 燱 燨 燲 燤 燰 燢 獳 獮 獯 璗 璲 璫 璐 璪 璭 璱 ++ 璥 璯 甐 甑 甒 甏 疄 癃 癈 癉 癇 皤 盩 瞵 瞫 瞲 ++ 瞷 瞶 瞴 瞱 瞨 矰 磳 磽 礂 磻 磼 磲 礅 磹 磾 礄 ++ 禫 禨 穜 穛 穖 穘 穔 穚 窾 竀 竁 簅 簏 篲 簀 篿 ++ 篻 簎 篴 簋 篳 簂 簉 簃 簁 篸 篽 簆 篰 篱 簐 簊 ++ 糨 縭 縼 繂 縳 顈 縸 縪 繉 繀 繇 縩 繌 縰 縻 縶 ++ 繄 縺 罅 罿 罾 罽 翴 翲 耬 膻 臄 臌 臊 臅 臇 膼 ++ 臩 艛 艚 艜 薃 薀 薏 薧 薕 薠 薋 薣 蕻 薤 薚 薞 ++ 蕷 蕼 薉 薡 蕺 蕸 蕗 薎 薖 薆 薍 薙 薝 薁 薢 薂 ++ 薈 薅 蕹 蕶 薘 薐 薟 虨 螾 螪 螭 蟅 螰 螬 螹 螵 ++ 螼 螮 蟉 蟃 蟂 蟌 螷 螯 蟄 蟊 螴 螶 螿 螸 螽 蟞 ++ 螲 褵 褳 褼 褾 襁 襒 褷 襂 覭 覯 覮 觲 觳 謞 謘 ++ 謖 謑 謅 謋 謢 謏 謒 謕 謇 謍 謈 謆 謜 謓 謚 豏 ++ 豰 豲 豱 豯 貕 貔 賹 赯 蹎 蹍 蹓 蹐 蹌 蹇 轃 轀 ++ 邅 遾 鄸 醚 醢 醛 醙 醟 醡 醝 醠 鎡 鎃 鎯 鍤 鍖 ++ 鍇 鍼 鍘 鍜 鍶 鍉 鍐 鍑 鍠 鍭 鎏 鍌 鍪 鍹 鍗 鍕 ++ 鍒 鍏 鍱 鍷 鍻 鍡 鍞 鍣 鍧 鎀 鍎 鍙 闇 闀 闉 闃 ++ 闅 閷 隮 隰 隬 霠 霟 霘 霝 霙 鞚 鞡 鞜 鞞 鞝 韕 ++ 韔 韱 顁 顄 顊 顉 顅 顃 餥 餫 餬 餪 餳 餲 餯 餭 ++ 餱 餰 馘 馣 馡 騂 駺 駴 駷 駹 駸 駶 駻 駽 駾 駼 ++ 騃 骾 髾 髽 鬁 髼 魈 鮚 鮨 鮞 鮛 鮦 鮡 鮥 鮤 鮆 ++ 鮢 鮠 鮯 鴳 鵁 鵧 鴶 鴮 鴯 鴱 鴸 鴰 鵅 鵂 鵃 鴾 ++ 鴷 鵀 鴽 翵 鴭 麊 麉 麍 麰 黈 黚 黻 黿 鼤 鼣 鼢 ++ 齔 龠 儱 儭 儮 嚘 嚜 嚗 嚚 嚝 嚙 奰 嬼 屩 屪 巀 ++ 幭 幮 懘 懟 懭 懮 懱 懪 懰 懫 懖 懩 擿 攄 擽 擸 ++ 攁 攃 擼 斔 旛 曚 曛 曘 櫅 檹 檽 櫡 櫆 檺 檶 檷 ++ 櫇 檴 檭 歞 毉 氋 瀇 瀌 瀍 瀁 瀅 瀔 瀎 濿 瀀 濻 ++ 瀦 濼 濷 瀊 爁 燿 燹 爃 燽 獶 璸 瓀 璵 瓁 璾 璶 ++ 璻 瓂 甔 甓 癜 癤 癙 癐 癓 癗 癚 皦 皽 盬 矂 瞺 ++ 磿 礌 礓 礔 礉 礐 礒 礑 禭 禬 穟 簜 簩 簙 簠 簟 ++ 簭 簝 簦 簨 簢 簥 簰 繜 繐 繖 繣 繘 繢 繟 繑 繠 ++ 繗 繓 羵 羳 翷 翸 聵 臑 臒 臐 艟 艞 薴 藆 藀 藃 ++ 藂 薳 薵 薽 藇 藄 薿 藋 藎 藈 藅 薱 薶 藒 蘤 薸 ++ 薷 薾 虩 蟧 蟦 蟢 蟛 蟫 蟪 蟥 蟟 蟳 蟤 蟔 蟜 蟓 ++ 蟭 蟘 蟣 螤 蟗 蟙 蠁 蟴 蟨 蟝 襓 襋 襏 襌 襆 襐 ++ 襑 襉 謪 謧 謣 謳 謰 謵 譇 謯 謼 謾 謱 謥 謷 謦 ++ 謶 謮 謤 謻 謽 謺 豂 豵 貙 貘 貗 賾 贄 贂 贀 蹜 ++ 蹢 蹠 蹗 蹖 蹞 蹥 蹧 蹛 蹚 蹡 蹝 蹩 蹔 轆 轇 轈 ++ 轋 鄨 鄺 鄻 鄾 醨 醥 醧 醯 醪 鎵 鎌 鎒 鎷 鎛 鎝 ++ 鎉 鎧 鎎 鎪 鎞 鎦 鎕 鎈 鎙 鎟 鎍 鎱 鎑 鎲 鎤 鎨 ++ 鎴 鎣 鎥 闒 闓 闑 隳 雗 雚 巂 雟 雘 雝 霣 霢 霥 ++ 鞬 鞮 鞨 鞫 鞤 鞪 鞢 鞥 韗 韙 韖 韘 韺 顐 顑 顒 ++ 颸 饁 餼 餺 騏 騋 騉 騍 騄 騑 騊 騅 騇 騆 髀 髜 ++ 鬈 鬄 鬅 鬩 鬵 魊 魌 魋 鯇 鯆 鯃 鮿 鯁 鮵 鮸 鯓 ++ 鮶 鯄 鮹 鮽 鵜 鵓 鵏 鵊 鵛 鵋 鵙 鵖 鵌 鵗 鵒 鵔 ++ 鵟 鵘 鵚 麎 麌 黟 鼁 鼀 鼖 鼥 鼫 鼪 鼩 鼨 齌 齕 ++ 儴 儵 劖 勷 厴 嚫 嚭 嚦 嚧 嚪 嚬 壚 壝 壛 夒 嬽 ++ 嬾 嬿 巃 幰 徿 懻 攇 攐 攍 攉 攌 攎 斄 旞 旝 曞 ++ 櫧 櫠 櫌 櫑 櫙 櫋 櫟 櫜 櫐 櫫 櫏 櫍 櫞 歠 殰 氌 ++ 瀙 瀧 瀠 瀖 瀫 瀡 瀢 瀣 瀩 瀗 瀤 瀜 瀪 爌 爊 爇 ++ 爂 爅 犥 犦 犤 犣 犡 瓋 瓅 璷 瓃 甖 癠 矉 矊 矄 ++ 矱 礝 礛 礡 礜 礗 礞 禰 穧 穨 簳 簼 簹 簬 簻 糬 ++ 糪 繶 繵 繸 繰 繷 繯 繺 繲 繴 繨 罋 罊 羃 羆 羷 ++ 翽 翾 聸 臗 臕 艤 艡 艣 藫 藱 藭 藙 藡 藨 藚 藗 ++ 藬 藲 藸 藘 藟 藣 藜 藑 藰 藦 藯 藞 藢 蠀 蟺 蠃 ++ 蟶 蟷 蠉 蠌 蠋 蠆 蟼 蠈 蟿 蠊 蠂 襢 襚 襛 襗 襡 ++ 襜 襘 襝 襙 覈 覷 覶 觶 譐 譈 譊 譀 譓 譖 譔 譋 ++ 譕 譑 譂 譒 譗 豃 豷 豶 貚 贆 贇 贉 趬 趪 趭 趫 ++ 蹭 蹸 蹳 蹪 蹯 蹻 軂 轒 轑 轏 轐 轓 辴 酀 鄿 醰 ++ 醭 鏞 鏇 鏏 鏂 鏚 鏐 鏹 鏬 鏌 鏙 鎩 鏦 鏊 鏔 鏮 ++ 鏣 鏕 鏄 鏎 鏀 鏒 鏧 镽 闚 闛 雡 霩 霫 霬 霨 霦 ++ 鞳 鞷 鞶 韝 韞 韟 顜 顙 顝 顗 颿 颽 颻 颾 饈 饇 ++ 饃 馦 馧 騚 騕 騥 騝 騤 騛 騢 騠 騧 騣 騞 騜 騔 ++ 髂 鬋 鬊 鬎 鬌 鬷 鯪 鯫 鯠 鯞 鯤 鯦 鯢 鯰 鯔 鯗 ++ 鯬 鯜 鯙 鯥 鯕 鯡 鯚 鵷 鶁 鶊 鶄 鶈 鵱 鶀 鵸 鶆 ++ 鶋 鶌 鵽 鵫 鵴 鵵 鵰 鵩 鶅 鵳 鵻 鶂 鵯 鵹 鵿 鶇 ++ 鵨 麔 麑 黀 黼 鼭 齀 齁 齍 齖 齗 齘 匷 嚲 嚵 嚳 ++ 壣 孅 巆 巇 廮 廯 忀 忁 懹 攗 攖 攕 攓 旟 曨 曣 ++ 曤 櫳 櫰 櫪 櫨 櫹 櫱 櫮 櫯 瀼 瀵 瀯 瀷 瀴 瀱 灂 ++ 瀸 瀿 瀺 瀹 灀 瀻 瀳 灁 爓 爔 犨 獽 獼 璺 皫 皪 ++ 皾 盭 矌 矎 矏 矍 矲 礥 礣 礧 礨 礤 礩 禲 穮 穬 ++ 穭 竷 籉 籈 籊 籇 籅 糮 繻 繾 纁 纀 羺 翿 聹 臛 ++ 臙 舋 艨 艩 蘢 藿 蘁 藾 蘛 蘀 藶 蘄 蘉 蘅 蘌 藽 ++ 蠙 蠐 蠑 蠗 蠓 蠖 襣 襦 覹 觷 譠 譪 譝 譨 譣 譥 ++ 譧 譭 趮 躆 躈 躄 轙 轖 轗 轕 轘 轚 邍 酃 酁 醷 ++ 醵 醲 醳 鐋 鐓 鏻 鐠 鐏 鐔 鏾 鐕 鐐 鐨 鐙 鐍 鏵 ++ 鐀 鏷 鐇 鐎 鐖 鐒 鏺 鐉 鏸 鐊 鏿 鏼 鐌 鏶 鐑 鐆 ++ 闞 闠 闟 霮 霯 鞹 鞻 韽 韾 顠 顢 顣 顟 飁 飂 饐 ++ 饎 饙 饌 饋 饓 騲 騴 騱 騬 騪 騶 騩 騮 騸 騭 髇 ++ 髊 髆 鬐 鬒 鬑 鰋 鰈 鯷 鰅 鰒 鯸 鱀 鰇 鰎 鰆 鰗 ++ 鰔 鰉 鶟 鶙 鶤 鶝 鶒 鶘 鶐 鶛 鶠 鶔 鶜 鶪 鶗 鶡 ++ 鶚 鶢 鶨 鶞 鶣 鶿 鶩 鶖 鶦 鶧 麙 麛 麚 黥 黤 黧 ++ 黦 鼰 鼮 齛 齠 齞 齝 齙 龑 儺 儹 劘 劗 囃 嚽 嚾 ++ 孈 孇 巋 巏 廱 懽 攛 欂 櫼 欃 櫸 欀 灃 灄 灊 灈 ++ 灉 灅 灆 爝 爚 爙 獾 甗 癪 矐 礭 礱 礯 籔 籓 糲 ++ 纊 纇 纈 纋 纆 纍 罍 羻 耰 臝 蘘 蘪 蘦 蘟 蘣 蘜 ++ 蘙 蘧 蘮 蘡 蘠 蘩 蘞 蘥 蠩 蠝 蠛 蠠 蠤 蠜 蠫 衊 ++ 襭 襩 襮 襫 觺 譹 譸 譅 譺 譻 贐 贔 趯 躎 躌 轞 ++ 轛 轝 酆 酄 酅 醹 鐿 鐻 鐶 鐩 鐽 鐼 鐰 鐹 鐪 鐷 ++ 鐬 鑀 鐱 闥 闤 闣 霵 霺 鞿 韡 顤 飉 飆 飀 饘 饖 ++ 騹 騽 驆 驄 驂 驁 騺 騿 髍 鬕 鬗 鬘 鬖 鬺 魒 鰫 ++ 鰝 鰜 鰬 鰣 鰨 鰩 鰤 鰡 鶷 鶶 鶼 鷁 鷇 鷊 鷏 鶾 ++ 鷅 鷃 鶻 鶵 鷎 鶹 鶺 鶬 鷈 鶱 鶭 鷌 鶳 鷍 鶲 鹺 ++ 麜 黫 黮 黭 鼛 鼘 鼚 鼱 齎 齥 齤 龒 亹 囆 囅 囋 ++ 奱 孋 孌 巕 巑 廲 攡 攠 攦 攢 欋 欈 欉 氍 灕 灖 ++ 灗 灒 爞 爟 犩 獿 瓘 瓕 瓙 瓗 癭 皭 礵 禴 穰 穱 ++ 籗 籜 籙 籛 籚 糴 糱 纑 罏 羇 臞 艫 蘴 蘵 蘳 蘬 ++ 蘲 蘶 蠬 蠨 蠦 蠪 蠥 襱 覿 覾 觻 譾 讄 讂 讆 讅 ++ 譿 贕 躕 躔 躚 躒 躐 躖 躗 轠 轢 酇 鑌 鑐 鑊 鑋 ++ 鑏 鑇 鑅 鑈 鑉 鑆 霿 韣 顪 顩 飋 饔 饛 驎 驓 驔 ++ 驌 驏 驈 驊 驉 驒 驐 髐 鬙 鬫 鬻 魖 魕 鱆 鱈 鰿 ++ 鱄 鰹 鰳 鱁 鰼 鰷 鰴 鰲 鰽 鰶 鷛 鷒 鷞 鷚 鷋 鷐 ++ 鷜 鷑 鷟 鷩 鷙 鷘 鷖 鷵 鷕 鷝 麶 黰 鼵 鼳 鼲 齂 ++ 齫 龕 龢 儽 劙 壨 壧 奲 孍 巘 蠯 彏 戁 戃 戄 攩 ++ 攥 斖 曫 欑 欒 欏 毊 灛 灚 爢 玂 玁 玃 癰 矔 籧 ++ 籦 纕 艬 蘺 虀 蘹 蘼 蘱 蘻 蘾 蠰 蠲 蠮 蠳 襶 襴 ++ 襳 觾 讌 讎 讋 讈 豅 贙 躘 轤 轣 醼 鑢 鑕 鑝 鑗 ++ 鑞 韄 韅 頀 驖 驙 鬞 鬟 鬠 鱒 鱘 鱐 鱊 鱍 鱋 鱕 ++ 鱙 鱌 鱎 鷻 鷷 鷯 鷣 鷫 鷸 鷤 鷶 鷡 鷮 鷦 鷲 鷰 ++ 鷢 鷬 鷴 鷳 鷨 鷭 黂 黐 黲 黳 鼆 鼜 鼸 鼷 鼶 齃 ++ 齏 齱 齰 齮 齯 囓 囍 孎 屭 攭 曭 曮 欓 灟 灡 灝 ++ 灠 爣 瓛 瓥 矕 礸 禷 禶 籪 纗 羉 艭 虃 蠸 蠷 蠵 ++ 衋 讔 讕 躞 躟 躠 躝 醾 醽 釂 鑫 鑨 鑩 雥 靆 靃 ++ 靇 韇 韥 驞 髕 魙 鱣 鱧 鱦 鱢 鱞 鱠 鸂 鷾 鸇 鸃 ++ 鸆 鸅 鸀 鸁 鸉 鷿 鷽 鸄 麠 鼞 齆 齴 齵 齶 囔 攮 ++ 斸 欘 欙 欗 欚 灢 爦 犪 矘 矙 礹 籩 籫 糶 纚 纘 ++ 纛 纙 臠 臡 虆 虇 虈 襹 襺 襼 襻 觿 讘 讙 躥 躤 ++ 躣 鑮 鑭 鑯 鑱 鑳 靉 顲 饟 鱨 鱮 鱭 鸋 鸍 鸐 鸏 ++ 鸒 鸑 麡 黵 鼉 齇 齸 齻 齺 齹 圞 灦 籯 蠼 趲 躦 ++ 釃 鑴 鑸 鑶 鑵 驠 鱴 鱳 鱱 鱵 鸔 鸓 黶 鼊 龤 灨 ++ 灥 糷 虪 蠾 蠽 蠿 讞 貜 躩 軉 靋 顳 顴 飌 饡 馫 ++ 驤 驦 驧 鬤 鸕 鸗 齈 戇 欞 爧 虌 躨 钂 钀 钁 驩 ++ 驨 鬮 鸙 爩 虋 讟 钃 鱹 麷 癵 驫 鱺 鸝 灩 灪 麤 ++ 齾 齉 龘 碁 銹 裏 墻 恒 粧 嫺 ╔ ╦ ╗ ╠ ╬ ╣ ++ ╚ ╩ ╝ ╒ ╤ ╕ ╞ ╪ ╡ ╘ ╧ ╛ ╓ ╥ ╖ ╟ ++ ╫ ╢ ╙ ╨ ╜ ║ ═ ╭ ╮ ╰ ╯ ■ 𠕇 鋛 𠗟 𣿅 ++ 蕌 䊵 珯 况 㙉 𤥂 𨧤 鍄 𡧛 苮 𣳈 砼 杄 拟 𤤳 𨦪 ++ 𠊠 𦮳 𡌅 侫 𢓭 倈 𦴩 𧪄 𣘀 𤪱 𢔓 𠍾 徤 𠎀 𠍇 滛 ++ 𠐟 儁 㑺 儎 顬 㝃 萖 𤦤 𠒇 兠 𣎴 兪 𠯿 𢃼 𠋥 𢔰 ++ 𠖎 𣈳 𡦃 宂 蝽 𠖳 𣲙 冲 冸 鴴 凉 减 凑 㳜 凓 𤪦 ++ 决 凢 卂 凭 菍 椾 𣜭 彻 刋 刦 刼 劵 剗 劔 効 勅 ++ 簕 蕂 勠 蘍 𦬓 𨫞 啉 滙 𣾀 𠥔 𣿬 匳 𠯢 泋 𡜦 栛 ++ 珕 恊 㺪 㣌 𡛨 燝 䒢 卭 却 𨚫 卾 𡖖 𡘓 矦 厓 𨪛 ++ 厠 厫 厮 玧 𥝲 㽙 玜 叁 叅 汉 义 埾 叙 㪫 𠮏 叠 ++ 𣿫 𢶣 叶 𠱷 吓 灹 唫 晗 浛 呭 𦭓 𠵴 啝 咏 咤 䞦 ++ 𡜍 𠻝 㶴 𠵍 𨦼 𢚘 啇 䳭 启 琗 喆 喩 𡣗 𤀺 䕒 𤐵 ++ 暳 𡂴 嘷 曍 𣊊 暤 暭 噍 噏 磱 囱 鞇 叾 圀 囯 园 ++ 𨭦 㘣 𡉏 坆 𤆥 汮 炋 坂 㚱 𦱾 埦 𡐖 堃 𡑔 𤍣 堦 ++ 𤯵 塜 墪 㕡 壠 壜 𡈼 壻 寿 坃 𪅐 𤉸 鏓 㖡 够 梦 ++ 㛃 湙 𡘾 娤 啓 𡚒 蔅 姉 𠵎 𦲁 𦴪 𡟜 姙 𡟻 𡞲 𦶦 ++ 浱 𡠨 𡛕 姹 𦹅 媫 婣 㛦 𤦩 㜈 媖 瑥 嫓 𦾡 𢕔 㶅 ++ 𡤑 㜲 𡚸 広 勐 孶 斈 孼 𧨎 䀄 䡝 𠈄 寕 慠 𡨴 𥧌 ++ 𠖥 寳 宝 䴐 尅 𡭄 尓 珎 尔 𡲥 𦬨 屉 䣝 岅 峩 峯 ++ 嶋 𡷹 𡸷 崐 崘 嵆 𡺤 岺 巗 苼 㠭 𤤁 𢁉 𢅳 芇 㠶 ++ 㯂 帮 檊 幺 𤒼 𠳓 厦 亷 厨 𡝱 帉 廴 𨒂 廹 廻 㢠 ++ 廼 栾 鐛 弍 𠇁 弢 㫞 䢮 𡌺 强 𦢈 𢏐 𢑱 彣 鞽 𦹮 ++ 彲 鍀 𨨶 徧 嶶 㵟 𥉐 𡽪 𧃸 𢙨 釖 𠊞 𨨩 怱 暅 𡡷 ++ 㥣 㷇 㘹 垐 𢞴 祱 㹀 悞 悳 𤦂 𤦏 𧩓 璤 僡 媠 慤 ++ 萤 慂 慈 𦻒 憁 凴 𠙖 憇 宪 𣾷 𢡟 懓 𨮝 𩥝 懐 㤲 ++ 𢦀 𢣁 怣 慜 攞 掋 𠄘 担 𡝰 拕 𢸍 捬 𤧟 㨗 搸 揸 ++ 𡎎 𡟼 澊 𢸶 頔 𤂌 𥜝 擡 擥 鑻 㩦 携 㩗 敍 漖 𤨨 ++ 𤨣 斅 敭 敟 𣁾 斵 𤥀 䬷 旑 䃘 𡠩 无 旣 忟 𣐀 昘 ++ 𣇷 𣇸 晄 𣆤 𣆥 晋 𠹵 晧 𥇦 晳 𡸽 𣈱 𨗴 𣇈 𥌓 矅 ++ 𢣷 馤 朂 𤎜 𤨡 㬫 槺 𣟂 杧 杢 𤇍 𩃭 柗 䓩 栢 湐 ++ 鈼 栁 𣏦 𦶠 桝 𣑯 槡 樋 𨫟 楳 棃 𣗍 椁 椀 㴲 㨁 ++ 𣘼 㮀 枬 楡 𨩊 䋼 椶 榘 㮡 𠏉 荣 傐 槹 𣙙 𢄪 橅 ++ 𣜃 檝 㯳 枱 櫈 𩆜 㰍 欝 𠤣 惞 欵 歴 𢟍 溵 𣫛 𠎵 ++ 𡥘 㝀 吡 𣭚 毡 𣻼 毜 氷 𢒋 𤣱 𦭑 汚 舦 汹 𣶼 䓅 ++ 𣶽 𤆤 𤤌 𤤀 𣳉 㛥 㳫 𠴲 鮃 𣇹 𢒑 羏 样 𦴥 𦶡 𦷫 ++ 涖 浜 湼 漄 𤥿 𤂅 𦹲 蔳 𦽴 凇 萮 𨬡 𣸯 瑓 𣾂 秌 ++ 湏 媑 𣁋 濸 㜍 澝 𣸰 滺 𡒗 𤀽 䕕 鏰 潄 潜 㵎 潴 ++ 𩅰 㴻 澟 𤅄 濓 𤂑 𤅕 𤀹 𣿰 𣾴 𤄿 凟 𤅖 𤅗 𤅀 𦇝 ++ 灋 灾 炧 炁 烌 烕 烖 烟 䄄 㷨 熴 熖 𤉷 焫 煅 媈 ++ 煊 岜 𤍥 煏 鍢 𤋁 焬 𤑚 𤨧 𤨢 熺 𨯨 炽 爎 鑂 爕 ++ 夑 鑃 爤 鍁 𥘅 爮 牀 𤥴 梽 牕 牗 㹕 𣁄 栍 漽 犂 ++ 猫 𤠣 𨠫 䣭 𨠄 猨 献 珏 玪 𠰺 𦨮 珉 瑉 𤇢 𡛧 𤨤 ++ 昣 㛅 𤦷 𤦍 𤧻 珷 琕 椃 𤨦 琹 𠗃 㻗 𢢭 瑠 𨺲 瑇 ++ 珤 瑶 莹 瑬 㜰 瑴 鏱 樬 璂 䥓 𤪌 𤅟 𤩹 𨮏 孆 𨰃 ++ 𡢞 瓈 𡦈 甎 甞 𨻙 𡩋 寗 𨺬 鎅 畍 畊 畧 畮 𤾂 㼄 ++ 𤴓 疎 瑝 疞 疴 瘂 瘬 癑 癏 癯 癶 𦏵 皐 臯 㟸 𦤑 ++ 𦤎 皡 皥 皷 盌 𦾟 葢 𥂝 𥅽 𡸜 眞 眦 着 撯 𥈠 睘 ++ 𣊬 瞯 𨥤 𨥨 𡛁 矴 𡍶 𤨒 棊 碯 磇 磓 隥 礮 𥗠 磗 ++ 礴 碱 𧘌 辸 袄 𨬫 𦂃 𢘜 禆 褀 椂 禀 𥡗 禝 𧬹 礼 ++ 禩 渪 𧄦 㺨 秆 𩄍 秔 +diff --git a/localedata/charmaps/BIG5-HKSCS b/localedata/charmaps/BIG5-HKSCS +index b6f55b4..0735efc 100644 +--- a/localedata/charmaps/BIG5-HKSCS ++++ b/localedata/charmaps/BIG5-HKSCS +@@ -7,7 +7,8 @@ + % alias BIG5HKSCS + + % +-% Generated from the big5hkscs.c iconv module. ++% Last updated from the HKSCS-2008 standard ++% http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/e_hkscs_2008.pdf + % + + CHARMAP +@@ -140,28 +141,153 @@ CHARMAP + /x7e TILDE + /x7f DELETE + /x80 PADDING CHARACTER (PAD) +- /x88/x40 +- /x88/x41 +- /x88/x42 +- /x88/x43 +- /x88/x44 +- /x88/x45 +- /x88/x46 +- /x88/x47 +- /x88/x48 +- /x88/x49 +- /x88/x4a +- /x88/x4b +- /x88/x4c +- /x88/x4d +- /x88/x4e +- /x88/x4f +- /x88/x50 +- /x88/x51 +- /x88/x52 +- /x88/x53 +- /x88/x54 +- /x88/x55 ++ /x87/x40 ++ /x87/x41 ++ /x87/x42 ++ /x87/x43 ++ /x87/x44 ++ /x87/x45 ++ /x87/x46 ++ /x87/x47 ++ /x87/x48 ++ /x87/x49 ++ /x87/x4a ++ /x87/x4b ++ /x87/x4c ++ /x87/x4d ++ /x87/x4e ++ /x87/x4f ++ /x87/x50 ++ /x87/x51 ++ /x87/x52 ++ /x87/x53 ++ /x87/x54 ++ /x87/x55 ++ /x87/x56 ++ /x87/x57 ++ /x87/x58 ++ /x87/x59 ++ /x87/x5a ++ /x87/x5b ++ /x87/x5c ++ /x87/x5d ++ /x87/x5e ++ /x87/x5f ++ /x87/x60 ++ /x87/x61 ++ /x87/x62 ++ /x87/x63 ++ /x87/x64 ++ /x87/x65 ++ /x87/x67 ++ /x87/x68 ++ /x87/x69 ++ /x87/x6a ++ /x87/x6b ++ /x87/x6c ++ /x87/x6d ++ /x87/x6e ++ /x87/x6f ++ /x87/x70 ++ /x87/x71 ++ /x87/x72 ++ /x87/x73 ++ /x87/x74 ++ /x87/x75 ++ /x87/x76 ++ /x87/x77 ++ /x87/x78 ++ /x87/x79 ++ /x87/x7a ++ /x87/x7b ++ /x87/x7c ++ /x87/x7d ++ /x87/x7e ++ /x87/xa1 ++ /x87/xa2 ++ /x87/xa3 ++ /x87/xa4 ++ /x87/xa5 ++ /x87/xa6 ++ /x87/xa7 ++ /x87/xa8 ++ /x87/xa9 ++ /x87/xaa ++ /x87/xab ++ /x87/xac ++ /x87/xad ++ /x87/xae ++ /x87/xaf ++ /x87/xb0 ++ /x87/xb1 ++ /x87/xb2 ++ /x87/xb3 ++ /x87/xb4 ++ /x87/xb5 ++ /x87/xb6 ++ /x87/xb7 ++ /x87/xb8 ++ /x87/xb9 ++ /x87/xba ++ /x87/xbb ++ /x87/xbc ++ /x87/xbd ++ /x87/xbe ++ /x87/xbf ++ /x87/xc0 ++ /x87/xc1 ++ /x87/xc2 ++ /x87/xc3 ++ /x87/xc4 ++ /x87/xc5 ++ /x87/xc6 ++ /x87/xc7 ++ /x87/xc8 ++ /x87/xc9 ++ /x87/xca ++ /x87/xcb ++ /x87/xcc ++ /x87/xcd ++ /x87/xce ++ /x87/xcf ++ /x87/xd0 ++ /x87/xd1 ++ /x87/xd2 ++ /x87/xd3 ++ /x87/xd4 ++ /x87/xd5 ++ /x87/xd6 ++ /x87/xd7 ++ /x87/xd8 ++ /x87/xd9 ++ /x87/xda ++ /x87/xdb ++ /x87/xdc ++ /x87/xdd ++ /x87/xde ++ /x87/xdf ++ /x88/x40 ++ /x88/x41 ++ /x88/x42 ++ /x88/x43 ++ /x88/x44 ++ /x88/x45 ++ /x88/x46 ++ /x88/x47 ++ /x88/x48 ++ /x88/x49 ++ /x88/x4a ++ /x88/x4b ++ /x88/x4c ++ /x88/x4d ++ /x88/x4e ++ /x88/x4f ++ /x88/x50 ++ /x88/x51 ++ /x88/x52 ++ /x88/x53 ++ /x88/x54 ++ /x88/x55 + /x88/x56 LATIN CAPITAL LETTER A WITH MACRON + /x88/x57 LATIN CAPITAL LETTER A WITH ACUTE + /x88/x58 LATIN CAPITAL LETTER A WITH CARON +@@ -174,9 +300,9 @@ CHARMAP + /x88/x5f LATIN CAPITAL LETTER O WITH ACUTE + /x88/x60 LATIN CAPITAL LETTER O WITH CARON + /x88/x61 LATIN CAPITAL LETTER O WITH GRAVE +- /x88/x62 ++% /x88/x62 + /x88/x63 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +- /x88/x64 ++% /x88/x64 + /x88/x65 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + /x88/x66 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /x88/x67 LATIN SMALL LETTER A WITH MACRON +@@ -205,16 +331,16 @@ CHARMAP + /x88/x7e LATIN SMALL LETTER U WITH DIAERESIS AND CARON + /x88/xa1 LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + /x88/xa2 LATIN SMALL LETTER U WITH DIAERESIS +- /x88/xa3 ++% /x88/xa3 + /x88/xa4 LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +- /x88/xa5 ++% /x88/xa5 + /x88/xa6 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + /x88/xa7 LATIN SMALL LETTER E WITH CIRCUMFLEX + /x88/xa8 LATIN SMALL LETTER SCRIPT G +- /x88/xa9 +- /x88/xaa ++ /x88/xa9 EARTH GROUND ++ /x88/xaa FUSE + /x89/x40 +- /x89/x41 ++ /x89/x41 + /x89/x43 + /x89/x46 + /x89/x47 +@@ -283,17 +409,17 @@ CHARMAP + /x89/xae + /x89/xb0 + /x89/xb1 +- /x89/xb2 ++ /x89/xb2 + /x89/xb5 + /x89/xb6 + /x89/xb7 + /x89/xb8 + /x89/xb9 + /x89/xba +- /x89/xbb ++ /x89/xbb + /x89/xbc + /x89/xbd +- /x89/xbe ++ /x89/xbe + /x89/xbf + /x89/xc1 + /x89/xc2 +@@ -303,10 +429,10 @@ CHARMAP + /x89/xc7 + /x89/xc8 + /x89/xc9 +- /x89/xca ++ /x89/xca + /x89/xcb + /x89/xcc +- /x89/xcd ++ /x89/xcd + /x89/xce + /x89/xcf + /x89/xd0 +@@ -356,95 +482,95 @@ CHARMAP + /x89/xfc + /x89/xfd + /x89/xfe +- /x8a/x40 ++ /x8a/x40 + /x8a/x41 + /x8a/x43 +- /x8a/x44 +- /x8a/x45 ++ /x8a/x44 ++ /x8a/x45 + /x8a/x46 + /x8a/x47 + /x8a/x48 + /x8a/x49 + /x8a/x4a + /x8a/x4b +- /x8a/x4c ++ /x8a/x4c + /x8a/x4d + /x8a/x4e + /x8a/x4f +- /x8a/x50 ++ /x8a/x50 + /x8a/x51 + /x8a/x52 +- /x8a/x53 ++ /x8a/x53 + /x8a/x54 + /x8a/x55 + /x8a/x56 +- /x8a/x57 ++ /x8a/x57 + /x8a/x58 + /x8a/x59 + /x8a/x5a + /x8a/x5b + /x8a/x5c +- /x8a/x5d +- /x8a/x5e +- /x8a/x5f +- /x8a/x60 ++ /x8a/x5d ++ /x8a/x5e ++ /x8a/x5f ++ /x8a/x60 + /x8a/x61 + /x8a/x62 + /x8a/x64 +- /x8a/x65 ++ /x8a/x65 + /x8a/x66 + /x8a/x67 +- /x8a/x68 +- /x8a/x69 ++ /x8a/x68 ++ /x8a/x69 + /x8a/x6a + /x8a/x6b +- /x8a/x6c ++ /x8a/x6c + /x8a/x6d + /x8a/x6e + /x8a/x6f +- /x8a/x70 +- /x8a/x71 +- /x8a/x72 ++ /x8a/x70 ++ /x8a/x71 ++ /x8a/x72 + /x8a/x73 + /x8a/x74 + /x8a/x76 + /x8a/x77 + /x8a/x78 + /x8a/x79 +- /x8a/x7a +- /x8a/x7b ++ /x8a/x7a ++ /x8a/x7b + /x8a/x7c + /x8a/x7d + /x8a/x7e +- /x8a/xa1 +- /x8a/xa2 +- /x8a/xa3 ++ /x8a/xa1 ++ /x8a/xa2 ++ /x8a/xa3 + /x8a/xa4 +- /x8a/xa5 ++ /x8a/xa5 + /x8a/xa6 + /x8a/xa7 + /x8a/xa8 + /x8a/xa9 +- /x8a/xaa ++ /x8a/xaa + /x8a/xac +- /x8a/xad ++ /x8a/xad + /x8a/xae + /x8a/xaf +- /x8a/xb0 +- /x8a/xb2 ++ /x8a/xb0 ++ /x8a/xb2 + /x8a/xb3 +- /x8a/xb4 +- /x8a/xb5 +- /x8a/xb6 ++ /x8a/xb4 ++ /x8a/xb5 ++ /x8a/xb6 + /x8a/xb7 + /x8a/xb8 + /x8a/xb9 + /x8a/xbb +- /x8a/xbc +- /x8a/xbd ++ /x8a/xbc ++ /x8a/xbd + /x8a/xbe + /x8a/xbf +- /x8a/xc0 ++ /x8a/xc0 + /x8a/xc1 + /x8a/xc2 + /x8a/xc3 +@@ -452,49 +578,49 @@ CHARMAP + /x8a/xc5 + /x8a/xc6 + /x8a/xc7 +- /x8a/xc9 ++ /x8a/xc9 + /x8a/xca + /x8a/xcb +- /x8a/xcc ++ /x8a/xcc + /x8a/xce +- /x8a/xcf ++ /x8a/xcf + /x8a/xd0 + /x8a/xd1 +- /x8a/xd2 ++ /x8a/xd2 + /x8a/xd3 +- /x8a/xd4 ++ /x8a/xd4 + /x8a/xd5 + /x8a/xd6 + /x8a/xd7 +- /x8a/xd8 +- /x8a/xd9 ++ /x8a/xd8 ++ /x8a/xd9 + /x8a/xda + /x8a/xdb +- /x8a/xdc +- /x8a/xdf +- /x8a/xe0 +- /x8a/xe1 +- /x8a/xe2 ++ /x8a/xdc ++ /x8a/xdf ++ /x8a/xe0 ++ /x8a/xe1 ++ /x8a/xe2 + /x8a/xe3 + /x8a/xe4 +- /x8a/xe5 +- /x8a/xe6 ++ /x8a/xe5 ++ /x8a/xe6 + /x8a/xe7 +- /x8a/xe8 ++ /x8a/xe8 + /x8a/xe9 + /x8a/xea + /x8a/xeb + /x8a/xec +- /x8a/xed ++ /x8a/xed + /x8a/xee + /x8a/xef + /x8a/xf0 + /x8a/xf1 + /x8a/xf2 +- /x8a/xf3 +- /x8a/xf4 ++ /x8a/xf3 ++ /x8a/xf4 + /x8a/xf6 +- /x8a/xf7 ++ /x8a/xf7 + /x8a/xf8 + /x8a/xf9 + /x8a/xfa +@@ -510,14 +636,14 @@ CHARMAP + /x8b/x45 + /x8b/x46 + /x8b/x47 +- /x8b/x48 ++ /x8b/x48 + /x8b/x49 + /x8b/x4a +- /x8b/x4b ++ /x8b/x4b + /x8b/x4c +- /x8b/x4d +- /x8b/x4e +- /x8b/x4f ++ /x8b/x4d ++ /x8b/x4e ++ /x8b/x4f + /x8b/x50 + /x8b/x51 + /x8b/x52 +@@ -526,7 +652,7 @@ CHARMAP + /x8b/x56 + /x8b/x57 + /x8b/x58 +- /x8b/x59 ++ /x8b/x59 + /x8b/x5a + /x8b/x5b + /x8b/x5c +@@ -573,15 +699,15 @@ CHARMAP + /x8b/xa7 + /x8b/xa8 + /x8b/xa9 +- /x8b/xaa +- /x8b/xab ++ /x8b/xaa ++ /x8b/xab + /x8b/xac +- /x8b/xad +- /x8b/xae ++ /x8b/xad ++ /x8b/xae + /x8b/xaf + /x8b/xb0 + /x8b/xb1 +- /x8b/xb2 ++ /x8b/xb2 + /x8b/xb3 + /x8b/xb4 + /x8b/xb5 +@@ -597,10 +723,10 @@ CHARMAP + /x8b/xbf + /x8b/xc0 + /x8b/xc1 +- /x8b/xc2 +- /x8b/xc3 ++ /x8b/xc2 ++ /x8b/xc3 + /x8b/xc4 +- /x8b/xc5 ++ /x8b/xc5 + /x8b/xc6 + /x8b/xc7 + /x8b/xc8 +@@ -617,45 +743,227 @@ CHARMAP + /x8b/xd3 + /x8b/xd4 + /x8b/xd5 +- /x8b/xd6 ++ /x8b/xd6 + /x8b/xd7 + /x8b/xd8 + /x8b/xd9 + /x8b/xda +- /x8b/xdb ++ /x8b/xdb + /x8b/xdc +- /x8b/xde ++ /x8b/xde + /x8b/xdf + /x8b/xe0 +- /x8b/xe1 +- /x8b/xe2 ++ /x8b/xe1 ++ /x8b/xe2 + /x8b/xe3 + /x8b/xe4 + /x8b/xe5 +- /x8b/xe6 ++ /x8b/xe6 + /x8b/xe7 + /x8b/xe8 + /x8b/xe9 + /x8b/xea + /x8b/xeb + /x8b/xec +- /x8b/xed ++ /x8b/xed + /x8b/xee + /x8b/xef + /x8b/xf0 + /x8b/xf1 + /x8b/xf2 +- /x8b/xf3 ++ /x8b/xf3 + /x8b/xf4 + /x8b/xf5 + /x8b/xf6 + /x8b/xf7 +-%IRREVERSIBLE% /x8b/xf8 ++ /x8b/xf8 + /x8b/xf9 +- /x8b/xfa ++ /x8b/xfa + /x8b/xfb + /x8b/xfc + /x8b/xfd ++ /x8c/x40 ++ /x8c/x41 ++ /x8c/x42 ++ /x8c/x43 ++ /x8c/x44 ++ /x8c/x45 ++ /x8c/x46 ++ /x8c/x47 ++ /x8c/x48 ++ /x8c/x49 ++ /x8c/x4a ++ /x8c/x4b ++ /x8c/x4c ++ /x8c/x4d ++ /x8c/x4e ++ /x8c/x4f ++ /x8c/x50 ++ /x8c/x51 ++ /x8c/x52 ++ /x8c/x53 ++ /x8c/x54 ++ /x8c/x55 ++ /x8c/x56 ++ /x8c/x57 ++ /x8c/x58 ++ /x8c/x59 ++ /x8c/x5a ++ /x8c/x5b ++ /x8c/x5c ++ /x8c/x5d ++ /x8c/x5e ++ /x8c/x5f ++ /x8c/x60 ++ /x8c/x61 ++ /x8c/x62 ++ /x8c/x63 ++ /x8c/x64 ++ /x8c/x65 ++ /x8c/x66 ++ /x8c/x67 ++ /x8c/x68 ++ /x8c/x69 ++ /x8c/x6a ++ /x8c/x6b ++ /x8c/x6c ++ /x8c/x6d ++ /x8c/x6e ++ /x8c/x6f ++ /x8c/x70 ++ /x8c/x71 ++ /x8c/x72 ++ /x8c/x73 ++ /x8c/x74 ++ /x8c/x75 ++ /x8c/x76 ++ /x8c/x77 ++ /x8c/x78 ++ /x8c/x79 ++ /x8c/x7a ++ /x8c/x7b ++ /x8c/x7c ++ /x8c/x7d ++ /x8c/x7e ++ /x8c/xa1 ++ /x8c/xa2 ++ /x8c/xa3 ++ /x8c/xa4 ++ /x8c/xa5 ++ /x8c/xa7 ++ /x8c/xa8 ++ /x8c/xa9 ++ /x8c/xaa ++ /x8c/xab ++ /x8c/xac ++ /x8c/xad ++ /x8c/xae ++ /x8c/xaf ++ /x8c/xb0 ++ /x8c/xb1 ++ /x8c/xb2 ++ /x8c/xb3 ++ /x8c/xb4 ++ /x8c/xb5 ++ /x8c/xb6 ++ /x8c/xb7 ++ /x8c/xb8 ++ /x8c/xb9 ++ /x8c/xba ++ /x8c/xbb ++ /x8c/xbc ++ /x8c/xbd ++ /x8c/xbe ++ /x8c/xbf ++ /x8c/xc0 ++ /x8c/xc1 ++ /x8c/xc2 ++ /x8c/xc3 ++ /x8c/xc4 ++ /x8c/xc5 ++ /x8c/xc9 ++ /x8c/xca ++ /x8c/xcb ++ /x8c/xcc ++ /x8c/xce ++ /x8c/xcf ++ /x8c/xd0 ++ /x8c/xd1 ++ /x8c/xd2 ++ /x8c/xd3 ++ /x8c/xd4 ++ /x8c/xd5 ++ /x8c/xd6 ++ /x8c/xd7 ++ /x8c/xd8 ++ /x8c/xd9 ++ /x8c/xda ++ /x8c/xdb ++ /x8c/xdc ++ /x8c/xdd ++ /x8c/xde ++ /x8c/xdf ++ /x8c/xe0 ++ /x8c/xe1 ++ /x8c/xe2 ++ /x8c/xe3 ++ /x8c/xe4 ++ /x8c/xe6 ++ /x8c/xe7 ++ /x8c/xe8 ++ /x8c/xe9 ++ /x8c/xea ++ /x8c/xeb ++ /x8c/xec ++ /x8c/xed ++ /x8c/xee ++ /x8c/xef ++ /x8c/xf0 ++ /x8c/xf1 ++ /x8c/xf2 ++ /x8c/xf3 ++ /x8c/xf4 ++ /x8c/xf5 ++ /x8c/xf6 ++ /x8c/xf7 ++ /x8c/xf8 ++ /x8c/xf9 ++ /x8c/xfa ++ /x8c/xfb ++ /x8c/xfc ++ /x8c/xfd ++ /x8c/xfe ++ /x8d/x40 ++ /x8d/x42 ++ /x8d/x43 ++ /x8d/x44 ++ /x8d/x45 ++ /x8d/x46 ++ /x8d/x47 ++ /x8d/x48 ++ /x8d/x49 ++ /x8d/x4a ++ /x8d/x4b ++ /x8d/x4c ++ /x8d/x4d ++ /x8d/x4e ++ /x8d/x4f ++ /x8d/x50 ++ /x8d/x51 ++ /x8d/x52 ++ /x8d/x53 ++ /x8d/x54 ++ /x8d/x55 ++ /x8d/x56 ++ /x8d/x57 ++ /x8d/x58 ++ /x8d/x59 ++ /x8d/x5a ++ /x8d/x5b ++ /x8d/x5c ++ /x8d/x5d ++ /x8d/x5e ++ /x8d/x5f + /x8d/x60 + /x8d/x61 + /x8d/x62 +@@ -780,8 +1088,8 @@ CHARMAP + /x8d/xfb + /x8d/xfc + /x8d/xfd +- /x8d/xfe +- /x8e/x40 ++ /x8d/xfe ++ /x8e/x40 + /x8e/x41 + /x8e/x42 + /x8e/x43 +@@ -801,7 +1109,7 @@ CHARMAP + /x8e/x51 + /x8e/x52 + /x8e/x53 +- /x8e/x54 ++ /x8e/x54 + /x8e/x55 + /x8e/x56 + /x8e/x57 +@@ -812,7 +1120,7 @@ CHARMAP + /x8e/x5c + /x8e/x5d + /x8e/x5e +- /x8e/x5f ++ /x8e/x5f + /x8e/x60 + /x8e/x61 + /x8e/x62 +@@ -822,7 +1130,7 @@ CHARMAP + /x8e/x66 + /x8e/x67 + /x8e/x68 +- /x8e/x6a ++ /x8e/x6a + /x8e/x6b + /x8e/x6c + /x8e/x6d +@@ -831,7 +1139,7 @@ CHARMAP + /x8e/x71 + /x8e/x72 + /x8e/x73 +- /x8e/x74 ++ /x8e/x74 + /x8e/x75 + /x8e/x76 + /x8e/x77 +@@ -858,7 +1166,7 @@ CHARMAP + /x8e/xb0 + /x8e/xb1 + /x8e/xb2 +- /x8e/xb3 ++ /x8e/xb3 + /x8e/xb5 + /x8e/xb6 + /x8e/xb7 +@@ -886,15 +1194,15 @@ CHARMAP + /x8e/xce + /x8e/xcf + /x8e/xd1 +- /x8e/xd2 +- /x8e/xd3 ++ /x8e/xd2 ++ /x8e/xd3 + /x8e/xd4 + /x8e/xd5 + /x8e/xd6 +- /x8e/xd7 ++ /x8e/xd7 + /x8e/xd8 + /x8e/xd9 +- /x8e/xda ++ /x8e/xda + /x8e/xdb + /x8e/xdc + /x8e/xdd +@@ -905,9 +1213,9 @@ CHARMAP + /x8e/xe2 + /x8e/xe3 + /x8e/xe4 +- /x8e/xe5 ++ /x8e/xe5 + /x8e/xe6 +- /x8e/xe7 ++ /x8e/xe7 + /x8e/xe8 + /x8e/xe9 + /x8e/xea +@@ -915,9 +1223,9 @@ CHARMAP + /x8e/xec + /x8e/xed + /x8e/xee +- /x8e/xef ++ /x8e/xef + /x8e/xf0 +- /x8e/xf1 ++ /x8e/xf1 + /x8e/xf2 + /x8e/xf3 + /x8e/xf4 +@@ -937,14 +1245,14 @@ CHARMAP + /x8f/x43 + /x8f/x44 + /x8f/x45 +- /x8f/x46 ++ /x8f/x46 + /x8f/x47 + /x8f/x48 + /x8f/x49 + /x8f/x4a + /x8f/x4b + /x8f/x4c +- /x8f/x4d ++ /x8f/x4d + /x8f/x4e + /x8f/x4f + /x8f/x50 +@@ -961,15 +1269,15 @@ CHARMAP + /x8f/x5c + /x8f/x5d + /x8f/x5e +- /x8f/x5f ++ /x8f/x5f + /x8f/x60 +- /x8f/x61 ++ /x8f/x61 + /x8f/x62 + /x8f/x63 + /x8f/x64 + /x8f/x65 + /x8f/x66 +- /x8f/x67 ++ /x8f/x67 + /x8f/x68 + /x8f/x6a + /x8f/x6b +@@ -979,13 +1287,13 @@ CHARMAP + /x8f/x70 + /x8f/x71 + /x8f/x72 +- /x8f/x73 ++ /x8f/x73 + /x8f/x74 + /x8f/x75 + /x8f/x76 + /x8f/x77 + /x8f/x78 +- /x8f/x79 ++ /x8f/x79 + /x8f/x7a + /x8f/x7b + /x8f/x7c +@@ -994,11 +1302,11 @@ CHARMAP + /x8f/xa1 + /x8f/xa2 + /x8f/xa3 +- /x8f/xa4 ++ /x8f/xa4 + /x8f/xa5 +- /x8f/xa6 ++ /x8f/xa6 + /x8f/xa7 +- /x8f/xa8 ++ /x8f/xa8 + /x8f/xa9 + /x8f/xaa + /x8f/xab +@@ -1046,7 +1354,7 @@ CHARMAP + /x8f/xd7 + /x8f/xd8 + /x8f/xd9 +- /x8f/xda ++ /x8f/xda + /x8f/xdb + /x8f/xdc + /x8f/xdd +@@ -1062,7 +1370,7 @@ CHARMAP + /x8f/xe7 + /x8f/xe8 + /x8f/xe9 +- /x8f/xea ++ /x8f/xea + /x8f/xeb + /x8f/xec + /x8f/xed +@@ -1080,14 +1388,14 @@ CHARMAP + /x8f/xf9 + /x8f/xfa + /x8f/xfb +- /x8f/xfc ++ /x8f/xfc + /x8f/xfd + /x90/x40 + /x90/x41 +- /x90/x42 ++ /x90/x42 + /x90/x43 + /x90/x44 +- /x90/x45 ++ /x90/x45 + /x90/x46 + /x90/x47 + /x90/x48 +@@ -1110,9 +1418,9 @@ CHARMAP + /x90/x59 + /x90/x5a + /x90/x5b +- /x90/x5c +- /x90/x5d +- /x90/x5e ++ /x90/x5c ++ /x90/x5d ++ /x90/x5e + /x90/x5f + /x90/x60 + /x90/x61 +@@ -1123,7 +1431,7 @@ CHARMAP + /x90/x66 + /x90/x67 + /x90/x68 +- /x90/x69 ++ /x90/x69 + /x90/x6a + /x90/x6b + /x90/x6c +@@ -1143,7 +1451,7 @@ CHARMAP + /x90/x7c + /x90/x7d + /x90/x7e +- /x90/xa1 ++ /x90/xa1 + /x90/xa2 + /x90/xa3 + /x90/xa4 +@@ -1166,7 +1474,7 @@ CHARMAP + /x90/xb5 + /x90/xb6 + /x90/xb7 +- /x90/xb8 ++ /x90/xb8 + /x90/xb9 + /x90/xba + /x90/xbb +@@ -1198,11 +1506,11 @@ CHARMAP + /x90/xd5 + /x90/xd6 + /x90/xd7 +- /x90/xd8 ++ /x90/xd8 + /x90/xd9 + /x90/xda + /x90/xdb +- /x90/xdd ++ /x90/xdd + /x90/xde + /x90/xdf + /x90/xe0 +@@ -1224,7 +1532,7 @@ CHARMAP + /x90/xf0 + /x90/xf2 + /x90/xf3 +- /x90/xf4 ++ /x90/xf4 + /x90/xf5 + /x90/xf6 + /x90/xf7 +@@ -1289,24 +1597,24 @@ CHARMAP + /x91/x73 + /x91/x74 + /x91/x75 +- /x91/x76 ++ /x91/x76 + /x91/x77 + /x91/x78 + /x91/x79 + /x91/x7a + /x91/x7b +- /x91/x7c ++ /x91/x7c + /x91/x7d + /x91/x7e + /x91/xa1 +- /x91/xa2 ++ /x91/xa2 + /x91/xa3 + /x91/xa4 + /x91/xa5 + /x91/xa6 + /x91/xa7 +- /x91/xa8 +- /x91/xa9 ++ /x91/xa8 ++ /x91/xa9 + /x91/xaa + /x91/xab + /x91/xac +@@ -1367,10 +1675,10 @@ CHARMAP + /x91/xe4 + /x91/xe5 + /x91/xe6 +- /x91/xe7 ++ /x91/xe7 + /x91/xe8 + /x91/xe9 +- /x91/xea ++ /x91/xea + /x91/xeb + /x91/xec + /x91/xed +@@ -1380,23 +1688,23 @@ CHARMAP + /x91/xf1 + /x91/xf2 + /x91/xf3 +- /x91/xf4 ++ /x91/xf4 + /x91/xf5 + /x91/xf6 +- /x91/xf7 ++ /x91/xf7 + /x91/xf8 + /x91/xf9 + /x91/xfa + /x91/xfb + /x91/xfc + /x91/xfd +- /x91/xfe ++ /x91/xfe + /x92/x40 + /x92/x41 + /x92/x42 + /x92/x43 + /x92/x45 +- /x92/x46 ++ /x92/x46 + /x92/x47 + /x92/x48 + /x92/x49 +@@ -1411,23 +1719,23 @@ CHARMAP + /x92/x52 + /x92/x53 + /x92/x54 +- /x92/x55 ++ /x92/x55 + /x92/x56 + /x92/x57 + /x92/x58 +- /x92/x59 ++ /x92/x59 + /x92/x5a +- /x92/x5b ++ /x92/x5b + /x92/x5c + /x92/x5d + /x92/x5e + /x92/x5f + /x92/x60 +- /x92/x61 ++ /x92/x61 + /x92/x62 + /x92/x63 + /x92/x64 +- /x92/x65 ++ /x92/x65 + /x92/x66 + /x92/x67 + /x92/x68 +@@ -1451,13 +1759,13 @@ CHARMAP + /x92/x7a + /x92/x7b + /x92/x7c +- /x92/x7d ++ /x92/x7d + /x92/x7e + /x92/xa1 + /x92/xa2 + /x92/xa3 + /x92/xa4 +- /x92/xa5 ++ /x92/xa5 + /x92/xa6 + /x92/xa7 + /x92/xa8 +@@ -1469,7 +1777,7 @@ CHARMAP + /x92/xae + /x92/xb3 + /x92/xb4 +- /x92/xb5 ++ /x92/xb5 + /x92/xb6 + /x92/xb7 + /x92/xb8 +@@ -1493,7 +1801,7 @@ CHARMAP + /x92/xcb + /x92/xcc + /x92/xcd +- /x92/xce ++ /x92/xce + /x92/xcf + /x92/xd0 + /x92/xd2 +@@ -1532,10 +1840,10 @@ CHARMAP + /x92/xf3 + /x92/xf4 + /x92/xf5 +- /x92/xf6 ++ /x92/xf6 + /x92/xf7 + /x92/xf8 +- /x92/xf9 ++ /x92/xf9 + /x92/xfa + /x92/xfb + /x92/xfc +@@ -1577,7 +1885,7 @@ CHARMAP + /x93/x61 + /x93/x62 + /x93/x63 +- /x93/x64 ++ /x93/x64 + /x93/x65 + /x93/x66 + /x93/x67 +@@ -1591,7 +1899,7 @@ CHARMAP + /x93/x6f + /x93/x70 + /x93/x71 +- /x93/x72 ++ /x93/x72 + /x93/x73 + /x93/x74 + /x93/x75 +@@ -1603,7 +1911,7 @@ CHARMAP + /x93/x7b + /x93/x7c + /x93/x7d +- /x93/x7e ++ /x93/x7e + /x93/xa1 + /x93/xa2 + /x93/xa3 +@@ -1613,7 +1921,7 @@ CHARMAP + /x93/xa7 + /x93/xa8 + /x93/xa9 +- /x93/xaa ++ /x93/xaa + /x93/xab + /x93/xac + /x93/xad +@@ -1632,10 +1940,10 @@ CHARMAP + /x93/xba + /x93/xbb + /x93/xbc +- /x93/xbd ++ /x93/xbd + /x93/xbe + /x93/xbf +- /x93/xc0 ++ /x93/xc0 + /x93/xc1 + /x93/xc2 + /x93/xc3 +@@ -1649,7 +1957,7 @@ CHARMAP + /x93/xcb + /x93/xcc + /x93/xcd +- /x93/xce ++ /x93/xce + /x93/xcf + /x93/xd0 + /x93/xd1 +@@ -1658,14 +1966,14 @@ CHARMAP + /x93/xd4 + /x93/xd5 + /x93/xd6 +- /x93/xd7 ++ /x93/xd7 + /x93/xd8 + /x93/xd9 + /x93/xda + /x93/xdb + /x93/xdc + /x93/xdd +- /x93/xde ++ /x93/xde + /x93/xdf + /x93/xe0 + /x93/xe1 +@@ -1699,12 +2007,12 @@ CHARMAP + /x93/xfd + /x93/xfe + /x94/x40 +- /x94/x41 ++ /x94/x41 + /x94/x42 + /x94/x43 + /x94/x44 + /x94/x45 +- /x94/x46 ++ /x94/x46 + /x94/x48 + /x94/x49 + /x94/x4a +@@ -1728,8 +2036,8 @@ CHARMAP + /x94/x5c + /x94/x5d + /x94/x5e +- /x94/x5f +- /x94/x60 ++ /x94/x5f ++ /x94/x60 + /x94/x61 + /x94/x62 + /x94/x63 +@@ -1763,7 +2071,7 @@ CHARMAP + /x94/xa1 + /x94/xa2 + /x94/xa3 +- /x94/xa4 ++ /x94/xa4 + /x94/xa5 + /x94/xa6 + /x94/xa7 +@@ -1781,7 +2089,7 @@ CHARMAP + /x94/xb3 + /x94/xb4 + /x94/xb5 +- /x94/xb6 ++ /x94/xb6 + /x94/xb7 + /x94/xb8 + /x94/xb9 +@@ -1799,7 +2107,7 @@ CHARMAP + /x94/xc5 + /x94/xc6 + /x94/xc7 +- /x94/xc8 ++ /x94/xc8 + /x94/xc9 + /x94/xcb + /x94/xcc +@@ -1822,11 +2130,11 @@ CHARMAP + /x94/xdd + /x94/xde + /x94/xdf +- /x94/xe0 ++ /x94/xe0 + /x94/xe1 + /x94/xe2 + /x94/xe3 +- /x94/xe4 ++ /x94/xe4 + /x94/xe5 + /x94/xe6 + /x94/xe7 +@@ -1843,7 +2151,7 @@ CHARMAP + /x94/xf2 + /x94/xf3 + /x94/xf4 +- /x94/xf5 ++ /x94/xf5 + /x94/xf6 + /x94/xf7 + /x94/xf8 +@@ -1854,18 +2162,18 @@ CHARMAP + /x94/xfd + /x94/xfe + /x95/x40 +- /x95/x41 ++ /x95/x41 + /x95/x42 + /x95/x43 + /x95/x44 +- /x95/x45 ++ /x95/x45 + /x95/x46 + /x95/x47 + /x95/x48 + /x95/x49 + /x95/x4a + /x95/x4b +- /x95/x4c ++ /x95/x4c + /x95/x4d + /x95/x4e + /x95/x4f +@@ -1878,15 +2186,15 @@ CHARMAP + /x95/x56 + /x95/x57 + /x95/x58 +- /x95/x59 ++ /x95/x59 + /x95/x5a + /x95/x5b + /x95/x5c + /x95/x5d +- /x95/x5e ++ /x95/x5e + /x95/x5f + /x95/x60 +- /x95/x61 ++ /x95/x61 + /x95/x62 + /x95/x63 + /x95/x64 +@@ -1905,14 +2213,14 @@ CHARMAP + /x95/x71 + /x95/x72 + /x95/x73 +- /x95/x74 ++ /x95/x74 + /x95/x75 + /x95/x76 + /x95/x77 + /x95/x78 + /x95/x79 +-%IRREVERSIBLE% /x95/x7a +- /x95/x7b ++ /x95/x7a ++ /x95/x7b + /x95/x7c + /x95/x7d + /x95/x7e +@@ -1927,7 +2235,7 @@ CHARMAP + /x95/xa9 + /x95/xaa + /x95/xab +- /x95/xac ++ /x95/xac + /x95/xad + /x95/xae + /x95/xaf +@@ -1941,7 +2249,7 @@ CHARMAP + /x95/xb7 + /x95/xb8 + /x95/xb9 +- /x95/xba ++ /x95/xba + /x95/xbb + /x95/xbc + /x95/xbd +@@ -1978,10 +2286,10 @@ CHARMAP + /x95/xdd + /x95/xde + /x95/xdf +- /x95/xe0 ++ /x95/xe0 + /x95/xe1 + /x95/xe2 +- /x95/xe3 ++ /x95/xe3 + /x95/xe4 + /x95/xe5 + /x95/xe6 +@@ -1992,16 +2300,16 @@ CHARMAP + /x95/xeb + /x95/xec + /x95/xed +- /x95/xee +- /x95/xef ++ /x95/xee ++ /x95/xef + /x95/xf0 + /x95/xf1 + /x95/xf2 +- /x95/xf3 ++ /x95/xf3 + /x95/xf4 + /x95/xf5 + /x95/xf6 +- /x95/xf7 ++ /x95/xf7 + /x95/xf8 + /x95/xf9 + /x95/xfa +@@ -2011,11 +2319,11 @@ CHARMAP + /x95/xfe + /x96/x40 + /x96/x41 +- /x96/x42 +- /x96/x43 ++ /x96/x42 ++ /x96/x43 + /x96/x45 + /x96/x46 +- /x96/x47 ++ /x96/x47 + /x96/x48 + /x96/x49 + /x96/x4a +@@ -2027,14 +2335,14 @@ CHARMAP + /x96/x50 + /x96/x51 + /x96/x52 +- /x96/x53 ++ /x96/x53 + /x96/x54 + /x96/x55 + /x96/x56 + /x96/x57 + /x96/x58 + /x96/x59 +- /x96/x5a ++ /x96/x5a + /x96/x5b + /x96/x5c + /x96/x5d +@@ -2048,21 +2356,21 @@ CHARMAP + /x96/x65 + /x96/x66 + /x96/x67 +- /x96/x68 ++ /x96/x68 + /x96/x69 + /x96/x6a + /x96/x6b + /x96/x6c + /x96/x6d + /x96/x6e +- /x96/x6f ++ /x96/x6f + /x96/x70 + /x96/x71 + /x96/x72 + /x96/x73 +- /x96/x74 ++ /x96/x74 + /x96/x75 +- /x96/x76 ++ /x96/x76 + /x96/x77 + /x96/x78 + /x96/x79 +@@ -2092,7 +2400,7 @@ CHARMAP + /x96/xb3 + /x96/xb4 + /x96/xb5 +- /x96/xb6 ++ /x96/xb6 + /x96/xb7 + /x96/xb8 + /x96/xb9 +@@ -2100,15 +2408,15 @@ CHARMAP + /x96/xbb + /x96/xbc + /x96/xbd +- /x96/xbe +- /x96/xbf ++ /x96/xbe ++ /x96/xbf + /x96/xc0 + /x96/xc1 + /x96/xc2 + /x96/xc3 +- /x96/xc4 ++ /x96/xc4 + /x96/xc5 +- /x96/xc6 ++ /x96/xc6 + /x96/xc7 + /x96/xc8 + /x96/xc9 +@@ -2116,7 +2424,7 @@ CHARMAP + /x96/xcb + /x96/xcc + /x96/xcd +- /x96/xce ++ /x96/xce + /x96/xcf + /x96/xd0 + /x96/xd1 +@@ -2149,7 +2457,7 @@ CHARMAP + /x96/xec + /x96/xee + /x96/xef +- /x96/xf0 ++ /x96/xf0 + /x96/xf1 + /x96/xf2 + /x96/xf3 +@@ -2157,9 +2465,9 @@ CHARMAP + /x96/xf5 + /x96/xf6 + /x96/xf7 +- /x96/xf8 ++ /x96/xf8 + /x96/xf9 +- /x96/xfa ++ /x96/xfa + /x96/xfb + /x96/xfd + /x96/xfe +@@ -2174,10 +2482,10 @@ CHARMAP + /x97/x48 + /x97/x49 + /x97/x4a +- /x97/x4b ++ /x97/x4b + /x97/x4c + /x97/x4d +- /x97/x4e ++ /x97/x4e + /x97/x4f + /x97/x50 + /x97/x51 +@@ -2207,8 +2515,8 @@ CHARMAP + /x97/x69 + /x97/x6a + /x97/x6b +- /x97/x6c +- /x97/x6d ++ /x97/x6c ++ /x97/x6d + /x97/x6e + /x97/x6f + /x97/x70 +@@ -2218,7 +2526,7 @@ CHARMAP + /x97/x74 + /x97/x75 + /x97/x76 +- /x97/x77 ++ /x97/x77 + /x97/x78 + /x97/x79 + /x97/x7a +@@ -2226,23 +2534,23 @@ CHARMAP + /x97/x7c + /x97/x7d + /x97/x7e +- /x97/xa1 +- /x97/xa2 ++ /x97/xa1 ++ /x97/xa2 + /x97/xa3 + /x97/xa4 +- /x97/xa5 +- /x97/xa6 ++ /x97/xa5 ++ /x97/xa6 + /x97/xa7 + /x97/xa8 + /x97/xa9 + /x97/xaa + /x97/xab + /x97/xac +- /x97/xad ++ /x97/xad + /x97/xae + /x97/xaf + /x97/xb0 +- /x97/xb1 ++ /x97/xb1 + /x97/xb2 + /x97/xb3 + /x97/xb4 +@@ -2267,7 +2575,7 @@ CHARMAP + /x97/xc7 + /x97/xc8 + /x97/xc9 +- /x97/xca ++ /x97/xca + /x97/xcb + /x97/xcc + /x97/xcd +@@ -2292,27 +2600,27 @@ CHARMAP + /x97/xe0 + /x97/xe1 + /x97/xe2 +- /x97/xe3 +- /x97/xe4 ++ /x97/xe3 ++ /x97/xe4 + /x97/xe5 + /x97/xe6 + /x97/xe7 + /x97/xe8 + /x97/xe9 + /x97/xea +- /x97/xeb ++ /x97/xeb + /x97/xec + /x97/xed + /x97/xee + /x97/xef + /x97/xf0 +- /x97/xf1 ++ /x97/xf1 + /x97/xf2 + /x97/xf3 + /x97/xf4 + /x97/xf5 + /x97/xf6 +- /x97/xf7 ++ /x97/xf7 + /x97/xf8 + /x97/xf9 + /x97/xfa +@@ -2321,7 +2629,7 @@ CHARMAP + /x97/xfd + /x97/xfe + /x98/x40 +- /x98/x41 ++ /x98/x41 + /x98/x42 + /x98/x43 + /x98/x44 +@@ -2349,7 +2657,7 @@ CHARMAP + /x98/x5a + /x98/x5b + /x98/x5c +- /x98/x5d ++ /x98/x5d + /x98/x5e + /x98/x5f + /x98/x60 +@@ -2372,34 +2680,34 @@ CHARMAP + /x98/x71 + /x98/x72 + /x98/x73 +- /x98/x74 ++ /x98/x74 + /x98/x75 + /x98/x76 + /x98/x77 + /x98/x78 + /x98/x79 + /x98/x7a +- /x98/x7b +- /x98/x7c ++ /x98/x7b ++ /x98/x7c + /x98/x7d + /x98/x7e + /x98/xa1 +- /x98/xa2 ++ /x98/xa2 + /x98/xa3 + /x98/xa4 + /x98/xa5 +- /x98/xa6 ++ /x98/xa6 + /x98/xa7 + /x98/xa8 +- /x98/xa9 +- /x98/xaa ++ /x98/xa9 ++ /x98/xaa + /x98/xab +- /x98/xac ++ /x98/xac + /x98/xad + /x98/xae + /x98/xaf + /x98/xb0 +- /x98/xb1 ++ /x98/xb1 + /x98/xb2 + /x98/xb3 + /x98/xb4 +@@ -2414,7 +2722,7 @@ CHARMAP + /x98/xbd + /x98/xbe + /x98/xbf +- /x98/xc0 ++ /x98/xc0 + /x98/xc1 + /x98/xc2 + /x98/xc3 +@@ -2472,7 +2780,7 @@ CHARMAP + /x98/xf7 + /x98/xf8 + /x98/xf9 +- /x98/xfa ++ /x98/xfa + /x98/xfb + /x98/xfc + /x98/xfd +@@ -2694,7 +3002,7 @@ CHARMAP + /x9a/x79 + /x9a/x7a + /x9a/x7b +- /x9a/x7c ++ /x9a/x7c + /x9a/x7d + /x9a/x7e + /x9a/xa1 +@@ -2716,242 +3024,242 @@ CHARMAP + /x9a/xb1 + /x9a/xb2 + /x9a/xb3 +- /x9a/xb4 +- /x9a/xb5 +- /x9a/xb6 ++ /x9a/xb4 ++ /x9a/xb5 ++ /x9a/xb6 + /x9a/xb7 + /x9a/xb8 + /x9a/xb9 +- /x9a/xba ++ /x9a/xba + /x9a/xbb + /x9a/xbc + /x9a/xbd +- /x9a/xbe +- /x9a/xbf +- /x9a/xc0 +- /x9a/xc1 ++ /x9a/xbe ++ /x9a/xbf ++ /x9a/xc0 ++ /x9a/xc1 + /x9a/xc2 + /x9a/xc3 +- /x9a/xc4 +- /x9a/xc5 +- /x9a/xc6 ++ /x9a/xc4 ++ /x9a/xc5 ++ /x9a/xc6 + /x9a/xc7 +- /x9a/xc8 +- /x9a/xc9 ++ /x9a/xc8 ++ /x9a/xc9 + /x9a/xca +- /x9a/xcb +- /x9a/xcc ++ /x9a/xcb ++ /x9a/xcc + /x9a/xcd +- /x9a/xce +- /x9a/xcf ++ /x9a/xce ++ /x9a/xcf + /x9a/xd0 +- /x9a/xd1 ++ /x9a/xd1 + /x9a/xd2 +- /x9a/xd3 +- /x9a/xd4 +- /x9a/xd5 +- /x9a/xd6 +- /x9a/xd7 +- /x9a/xd8 ++ /x9a/xd3 ++ /x9a/xd4 ++ /x9a/xd5 ++ /x9a/xd6 ++ /x9a/xd7 ++ /x9a/xd8 + /x9a/xd9 + /x9a/xda + /x9a/xdb +- /x9a/xdc ++ /x9a/xdc + /x9a/xdd +- /x9a/xde +- /x9a/xdf ++ /x9a/xde ++ /x9a/xdf + /x9a/xe0 +- /x9a/xe1 ++ /x9a/xe1 + /x9a/xe2 +- /x9a/xe3 ++ /x9a/xe3 + /x9a/xe4 +- /x9a/xe5 +- /x9a/xe6 ++ /x9a/xe5 ++ /x9a/xe6 + /x9a/xe7 + /x9a/xe8 + /x9a/xe9 +- /x9a/xea +- /x9a/xeb ++ /x9a/xea ++ /x9a/xeb + /x9a/xec +- /x9a/xed +- /x9a/xee +- /x9a/xef +- /x9a/xf0 ++ /x9a/xed ++ /x9a/xee ++ /x9a/xef ++ /x9a/xf0 + /x9a/xf1 + /x9a/xf2 + /x9a/xf3 +- /x9a/xf4 +- /x9a/xf5 ++ /x9a/xf4 ++ /x9a/xf5 + /x9a/xf6 +- /x9a/xf7 +- /x9a/xf8 +- /x9a/xf9 +- /x9a/xfa ++ /x9a/xf7 ++ /x9a/xf8 ++ /x9a/xf9 ++ /x9a/xfa + /x9a/xfb + /x9a/xfc +- /x9a/xfd +- /x9a/xfe +- /x9b/x40 +- /x9b/x41 +- /x9b/x42 +- /x9b/x43 +- /x9b/x44 +- /x9b/x45 ++ /x9a/xfd ++ /x9a/xfe ++ /x9b/x40 ++ /x9b/x41 ++ /x9b/x42 ++ /x9b/x43 ++ /x9b/x44 ++ /x9b/x45 + /x9b/x46 + /x9b/x47 +- /x9b/x48 ++ /x9b/x48 + /x9b/x49 + /x9b/x4a +- /x9b/x4b ++ /x9b/x4b + /x9b/x4c + /x9b/x4d + /x9b/x4e +- /x9b/x4f +- /x9b/x50 +- /x9b/x51 +- /x9b/x52 +- /x9b/x53 ++ /x9b/x4f ++ /x9b/x50 ++ /x9b/x51 ++ /x9b/x52 ++ /x9b/x53 + /x9b/x54 +- /x9b/x55 +- /x9b/x56 ++ /x9b/x55 ++ /x9b/x56 + /x9b/x57 + /x9b/x58 +- /x9b/x59 ++ /x9b/x59 + /x9b/x5a +- /x9b/x5b ++ /x9b/x5b + /x9b/x5c +- /x9b/x5d ++ /x9b/x5d + /x9b/x5e + /x9b/x5f +- /x9b/x60 +- /x9b/x62 +- /x9b/x63 +- /x9b/x64 ++ /x9b/x60 ++ /x9b/x62 ++ /x9b/x63 ++ /x9b/x64 + /x9b/x65 +- /x9b/x66 +- /x9b/x67 +- /x9b/x68 +- /x9b/x69 +- /x9b/x6a +- /x9b/x6b +- /x9b/x6c +- /x9b/x6d +- /x9b/x6e +- /x9b/x6f ++ /x9b/x66 ++ /x9b/x67 ++ /x9b/x68 ++ /x9b/x69 ++ /x9b/x6a ++ /x9b/x6b ++ /x9b/x6c ++ /x9b/x6d ++ /x9b/x6e ++ /x9b/x6f + /x9b/x70 + /x9b/x71 + /x9b/x72 +- /x9b/x73 +- /x9b/x74 +- /x9b/x75 ++ /x9b/x73 ++ /x9b/x74 ++ /x9b/x75 + /x9b/x77 +- /x9b/x79 +- /x9b/x7a ++ /x9b/x79 ++ /x9b/x7a + /x9b/x7c + /x9b/x7d + /x9b/x7e + /x9b/xa1 +- /x9b/xa2 ++ /x9b/xa2 + /x9b/xa3 + /x9b/xa4 +- /x9b/xa5 +- /x9b/xa6 ++ /x9b/xa5 ++ /x9b/xa6 + /x9b/xa7 + /x9b/xa8 + /x9b/xa9 + /x9b/xaa +- /x9b/xab ++ /x9b/xab + /x9b/xac +- /x9b/xad +- /x9b/xae ++ /x9b/xad ++ /x9b/xae + /x9b/xaf +- /x9b/xb0 ++ /x9b/xb0 + /x9b/xb1 +- /x9b/xb2 +- /x9b/xb3 ++ /x9b/xb2 ++ /x9b/xb3 + /x9b/xb4 + /x9b/xb5 + /x9b/xb6 + /x9b/xb7 + /x9b/xb8 + /x9b/xb9 +- /x9b/xba +- /x9b/xbb ++ /x9b/xba ++ /x9b/xbb + /x9b/xbc +- /x9b/xbd ++ /x9b/xbd + /x9b/xbe +- /x9b/xbf +- /x9b/xc0 +- /x9b/xc1 ++ /x9b/xbf ++ /x9b/xc0 ++ /x9b/xc1 + /x9b/xc2 + /x9b/xc3 + /x9b/xc4 + /x9b/xc5 +- /x9b/xc7 +- /x9b/xc8 +- /x9b/xc9 ++ /x9b/xc7 ++ /x9b/xc8 ++ /x9b/xc9 + /x9b/xca +- /x9b/xcb ++ /x9b/xcb + /x9b/xcc + /x9b/xcd +- /x9b/xce +- /x9b/xcf ++ /x9b/xce ++ /x9b/xcf + /x9b/xd0 + /x9b/xd1 +- /x9b/xd2 ++ /x9b/xd2 + /x9b/xd3 + /x9b/xd4 + /x9b/xd5 +- /x9b/xd6 +- /x9b/xd7 +- /x9b/xd8 ++ /x9b/xd6 ++ /x9b/xd7 ++ /x9b/xd8 + /x9b/xd9 + /x9b/xda +- /x9b/xdb ++ /x9b/xdb + /x9b/xdc + /x9b/xdd + /x9b/xdf +- /x9b/xe0 ++ /x9b/xe0 + /x9b/xe1 +- /x9b/xe2 ++ /x9b/xe2 + /x9b/xe3 +- /x9b/xe4 ++ /x9b/xe4 + /x9b/xe5 + /x9b/xe6 + /x9b/xe7 +- /x9b/xe8 ++ /x9b/xe8 + /x9b/xe9 + /x9b/xea +- /x9b/xeb +- /x9b/xed ++ /x9b/xeb ++ /x9b/xed + /x9b/xee + /x9b/xef + /x9b/xf0 +- /x9b/xf1 ++ /x9b/xf1 + /x9b/xf2 +- /x9b/xf3 ++ /x9b/xf3 + /x9b/xf4 + /x9b/xf5 +- /x9b/xf7 ++ /x9b/xf7 + /x9b/xf8 + /x9b/xf9 +- /x9b/xfa ++ /x9b/xfa + /x9b/xfb + /x9b/xfc +- /x9b/xfd +- /x9b/xfe ++ /x9b/xfd ++ /x9b/xfe + /x9c/x40 + /x9c/x41 +- /x9c/x43 +- /x9c/x44 ++ /x9c/x43 ++ /x9c/x44 + /x9c/x45 + /x9c/x46 +- /x9c/x47 ++ /x9c/x47 + /x9c/x48 + /x9c/x49 + /x9c/x4a +- /x9c/x4b +- /x9c/x4c ++ /x9c/x4b ++ /x9c/x4c + /x9c/x4d + /x9c/x4e + /x9c/x4f +@@ -2960,68 +3268,68 @@ CHARMAP + /x9c/x52 + /x9c/x54 + /x9c/x55 +- /x9c/x56 ++ /x9c/x56 + /x9c/x57 +- /x9c/x58 ++ /x9c/x58 + /x9c/x59 + /x9c/x5a + /x9c/x5b + /x9c/x5c + /x9c/x5d +- /x9c/x5e ++ /x9c/x5e + /x9c/x5f + /x9c/x60 + /x9c/x61 +- /x9c/x63 ++ /x9c/x63 + /x9c/x64 +- /x9c/x65 ++ /x9c/x65 + /x9c/x66 +- /x9c/x67 +- /x9c/x69 ++ /x9c/x67 ++ /x9c/x69 + /x9c/x6a + /x9c/x6c + /x9c/x6d +- /x9c/x6e ++ /x9c/x6e + /x9c/x6f +- /x9c/x70 +- /x9c/x71 ++ /x9c/x70 ++ /x9c/x71 + /x9c/x72 +- /x9c/x73 +- /x9c/x74 ++ /x9c/x73 ++ /x9c/x74 + /x9c/x75 +- /x9c/x76 +- /x9c/x78 ++ /x9c/x76 ++ /x9c/x78 + /x9c/x79 +- /x9c/x7a ++ /x9c/x7a + /x9c/x7b + /x9c/x7c +- /x9c/x7d ++ /x9c/x7d + /x9c/x7e + /x9c/xa1 + /x9c/xa2 +- /x9c/xa3 +- /x9c/xa4 ++ /x9c/xa3 ++ /x9c/xa4 + /x9c/xa5 +- /x9c/xa6 +- /x9c/xa7 ++ /x9c/xa6 ++ /x9c/xa7 + /x9c/xa8 + /x9c/xa9 +- /x9c/xaa ++ /x9c/xaa + /x9c/xab + /x9c/xac +- /x9c/xad ++ /x9c/xad + /x9c/xae + /x9c/xaf +- /x9c/xb0 ++ /x9c/xb0 + /x9c/xb1 + /x9c/xb2 + /x9c/xb3 +- /x9c/xb4 +- /x9c/xb5 ++ /x9c/xb4 ++ /x9c/xb5 + /x9c/xb6 + /x9c/xb7 + /x9c/xb8 +- /x9c/xb9 ++ /x9c/xb9 + /x9c/xba + /x9c/xbb + /x9c/xbe +@@ -3029,26 +3337,26 @@ CHARMAP + /x9c/xc0 + /x9c/xc1 + /x9c/xc2 +- /x9c/xc3 +- /x9c/xc4 ++ /x9c/xc3 ++ /x9c/xc4 + /x9c/xc5 + /x9c/xc6 + /x9c/xc7 + /x9c/xc8 + /x9c/xc9 +- /x9c/xca ++ /x9c/xca + /x9c/xcb + /x9c/xcc + /x9c/xcd +- /x9c/xce ++ /x9c/xce + /x9c/xcf + /x9c/xd1 + /x9c/xd2 + /x9c/xd3 +- /x9c/xd4 +- /x9c/xd5 +- /x9c/xd6 +- /x9c/xd7 ++ /x9c/xd4 ++ /x9c/xd5 ++ /x9c/xd6 ++ /x9c/xd7 + /x9c/xd8 + /x9c/xd9 + /x9c/xda +@@ -3056,21 +3364,21 @@ CHARMAP + /x9c/xdc + /x9c/xdd + /x9c/xde +- /x9c/xdf ++ /x9c/xdf + /x9c/xe0 +- /x9c/xe1 ++ /x9c/xe1 + /x9c/xe2 + /x9c/xe3 + /x9c/xe4 + /x9c/xe5 +- /x9c/xe6 ++ /x9c/xe6 + /x9c/xe7 + /x9c/xe8 + /x9c/xe9 +- /x9c/xea ++ /x9c/xea + /x9c/xeb + /x9c/xec +- /x9c/xed ++ /x9c/xed + /x9c/xee + /x9c/xef + /x9c/xf0 +@@ -3083,74 +3391,74 @@ CHARMAP + /x9c/xf7 + /x9c/xf8 + /x9c/xf9 +- /x9c/xfa ++ /x9c/xfa + /x9c/xfb + /x9c/xfc + /x9c/xfd +- /x9c/xfe +- /x9d/x40 +- /x9d/x41 +- /x9d/x42 +- /x9d/x43 +- /x9d/x44 +- /x9d/x45 ++ /x9c/xfe ++ /x9d/x40 ++ /x9d/x41 ++ /x9d/x42 ++ /x9d/x43 ++ /x9d/x44 ++ /x9d/x45 + /x9d/x46 +- /x9d/x47 ++ /x9d/x47 + /x9d/x48 + /x9d/x49 + /x9d/x4a +- /x9d/x4b ++ /x9d/x4b + /x9d/x4c + /x9d/x4d +- /x9d/x4e ++ /x9d/x4e + /x9d/x4f +- /x9d/x50 ++ /x9d/x50 + /x9d/x51 +- /x9d/x52 +- /x9d/x53 +- /x9d/x54 ++ /x9d/x52 ++ /x9d/x53 ++ /x9d/x54 + /x9d/x55 +- /x9d/x56 +- /x9d/x58 +- /x9d/x59 ++ /x9d/x56 ++ /x9d/x58 ++ /x9d/x59 + /x9d/x5b +- /x9d/x5c ++ /x9d/x5c + /x9d/x5d +- /x9d/x5e +- /x9d/x5f ++ /x9d/x5e ++ /x9d/x5f + /x9d/x60 + /x9d/x61 + /x9d/x62 +- /x9d/x63 ++ /x9d/x63 + /x9d/x64 +- /x9d/x65 +- /x9d/x66 +- /x9d/x67 +- /x9d/x68 +- /x9d/x69 ++ /x9d/x65 ++ /x9d/x66 ++ /x9d/x67 ++ /x9d/x68 ++ /x9d/x69 + /x9d/x6a +- /x9d/x6b +- /x9d/x6c ++ /x9d/x6b ++ /x9d/x6c + /x9d/x6d +- /x9d/x6e +- /x9d/x6f ++ /x9d/x6e ++ /x9d/x6f + /x9d/x70 +- /x9d/x71 ++ /x9d/x71 + /x9d/x72 + /x9d/x73 + /x9d/x74 +- /x9d/x75 ++ /x9d/x75 + /x9d/x76 +- /x9d/x77 ++ /x9d/x77 + /x9d/x78 + /x9d/x79 +- /x9d/x7a ++ /x9d/x7a + /x9d/x7b + /x9d/x7c + /x9d/x7d + /x9d/x7e + /x9d/xa1 +- /x9d/xa2 ++ /x9d/xa2 + /x9d/xa3 + /x9d/xa4 + /x9d/xa5 +@@ -3160,14 +3468,14 @@ CHARMAP + /x9d/xa9 + /x9d/xaa + /x9d/xab +- /x9d/xac ++ /x9d/xac + /x9d/xad + /x9d/xae + /x9d/xaf +- /x9d/xb0 ++ /x9d/xb0 + /x9d/xb1 + /x9d/xb2 +- /x9d/xb3 ++ /x9d/xb3 + /x9d/xb4 + /x9d/xb5 + /x9d/xb6 +@@ -3192,14 +3500,14 @@ CHARMAP + /x9d/xca + /x9d/xcb + /x9d/xcc +- /x9d/xcd ++ /x9d/xcd + /x9d/xce + /x9d/xcf + /x9d/xd0 + /x9d/xd1 + /x9d/xd2 + /x9d/xd3 +- /x9d/xd4 ++ /x9d/xd4 + /x9d/xd5 + /x9d/xd6 + /x9d/xd7 +@@ -3224,7 +3532,7 @@ CHARMAP + /x9d/xea + /x9d/xeb + /x9d/xec +- /x9d/xed ++ /x9d/xed + /x9d/xee + /x9d/xef + /x9d/xf0 +@@ -3237,12 +3545,12 @@ CHARMAP + /x9d/xf7 + /x9d/xf8 + /x9d/xf9 +- /x9d/xfa ++ /x9d/xfa + /x9d/xfb + /x9d/xfc + /x9d/xfd +- /x9d/xfe +- /x9e/x40 ++ /x9d/xfe ++ /x9e/x40 + /x9e/x41 + /x9e/x42 + /x9e/x43 +@@ -3257,9 +3565,9 @@ CHARMAP + /x9e/x4c + /x9e/x4d + /x9e/x4e +- /x9e/x4f ++ /x9e/x4f + /x9e/x50 +- /x9e/x51 ++ /x9e/x51 + /x9e/x52 + /x9e/x53 + /x9e/x54 +@@ -3269,7 +3577,7 @@ CHARMAP + /x9e/x58 + /x9e/x59 + /x9e/x5a +- /x9e/x5b ++ /x9e/x5b + /x9e/x5c + /x9e/x5d + /x9e/x5e +@@ -3290,7 +3598,7 @@ CHARMAP + /x9e/x6d + /x9e/x6e + /x9e/x6f +- /x9e/x70 ++ /x9e/x70 + /x9e/x71 + /x9e/x72 + /x9e/x73 +@@ -3302,20 +3610,20 @@ CHARMAP + /x9e/x79 + /x9e/x7a + /x9e/x7b +- /x9e/x7c ++ /x9e/x7c + /x9e/x7d + /x9e/x7e + /x9e/xa1 + /x9e/xa2 + /x9e/xa3 + /x9e/xa4 +- /x9e/xa5 ++ /x9e/xa5 + /x9e/xa6 + /x9e/xa7 + /x9e/xa8 +- /x9e/xaa ++ /x9e/xaa + /x9e/xab +- /x9e/xad ++ /x9e/xad + /x9e/xae + /x9e/xaf + /x9e/xb0 +@@ -3330,13 +3638,13 @@ CHARMAP + /x9e/xb9 + /x9e/xba + /x9e/xbb +- /x9e/xbc ++ /x9e/xbc + /x9e/xbd + /x9e/xbe + /x9e/xbf + /x9e/xc0 + /x9e/xc1 +- /x9e/xc2 ++ /x9e/xc2 + /x9e/xc3 + /x9e/xc5 + /x9e/xc6 +@@ -3349,10 +3657,10 @@ CHARMAP + /x9e/xcd + /x9e/xce + /x9e/xcf +- /x9e/xd0 ++ /x9e/xd0 + /x9e/xd1 + /x9e/xd2 +- /x9e/xd3 ++ /x9e/xd3 + /x9e/xd4 + /x9e/xd5 + /x9e/xd6 +@@ -3365,19 +3673,19 @@ CHARMAP + /x9e/xdd + /x9e/xde + /x9e/xdf +- /x9e/xe0 ++ /x9e/xe0 + /x9e/xe1 + /x9e/xe2 + /x9e/xe3 + /x9e/xe4 +- /x9e/xe5 ++ /x9e/xe5 + /x9e/xe6 + /x9e/xe7 + /x9e/xe8 + /x9e/xe9 + /x9e/xea + /x9e/xeb +- /x9e/xec ++ /x9e/xec + /x9e/xed + /x9e/xee + /x9e/xf0 +@@ -3388,7 +3696,7 @@ CHARMAP + /x9e/xf6 + /x9e/xf7 + /x9e/xf8 +- /x9e/xf9 ++ /x9e/xf9 + /x9e/xfa + /x9e/xfb + /x9e/xfc +@@ -3399,16 +3707,16 @@ CHARMAP + /x9f/x43 + /x9f/x44 + /x9f/x45 +- /x9f/x46 +- /x9f/x47 ++ /x9f/x46 ++ /x9f/x47 + /x9f/x48 + /x9f/x49 +- /x9f/x4a ++ /x9f/x4a + /x9f/x4b + /x9f/x4c +- /x9f/x4d ++ /x9f/x4d + /x9f/x4f +- /x9f/x50 ++ /x9f/x50 + /x9f/x51 + /x9f/x52 + /x9f/x53 +@@ -3469,7 +3777,7 @@ CHARMAP + /x9f/xaf + /x9f/xb0 + /x9f/xb2 +- /x9f/xb3 ++ /x9f/xb3 + /x9f/xb4 + /x9f/xb5 + /x9f/xb6 +@@ -3480,7 +3788,7 @@ CHARMAP + /x9f/xbb + /x9f/xbc + /x9f/xbd +- /x9f/xbe ++ /x9f/xbe + /x9f/xbf + /x9f/xc1 + /x9f/xc2 +@@ -3496,7 +3804,7 @@ CHARMAP + /x9f/xce + /x9f/xcf + /x9f/xd0 +- /x9f/xd1 ++ /x9f/xd1 + /x9f/xd2 + /x9f/xd3 + /x9f/xd4 +@@ -3519,7 +3827,7 @@ CHARMAP + /x9f/xe8 + /x9f/xe9 + /x9f/xeb +- /x9f/xec ++ /x9f/xec + /x9f/xed + /x9f/xee + /x9f/xf0 +@@ -3596,7 +3904,7 @@ CHARMAP + /xa0/xa1 + /xa0/xa2 + /xa0/xa3 +- /xa0/xa4 ++ /xa0/xa4 + /xa0/xa6 + /xa0/xa7 + /xa0/xa8 +@@ -3606,7 +3914,7 @@ CHARMAP + /xa0/xac + /xa0/xae + /xa0/xb0 +- /xa0/xb1 ++ /xa0/xb1 + /xa0/xb2 + /xa0/xb3 + /xa0/xb4 +@@ -3660,7 +3968,7 @@ CHARMAP + /xa0/xe9 + /xa0/xea + /xa0/xeb +- /xa0/xec ++ /xa0/xec + /xa0/xed + /xa0/xee + /xa0/xef +@@ -3671,14 +3979,14 @@ CHARMAP + /xa0/xf4 + /xa0/xf5 + /xa0/xf6 +- /xa0/xf7 ++ /xa0/xf7 + /xa0/xf8 + /xa0/xf9 + /xa0/xfa +- /xa0/xfb ++ /xa0/xfb + /xa0/xfc + /xa0/xfd +- /xa0/xfe ++ /xa0/xfe + /xa1/x40 IDEOGRAPHIC SPACE + /xa1/x41 FULLWIDTH COMMA + /xa1/x42 IDEOGRAPHIC COMMA +@@ -9783,16 +10091,16 @@ CHARMAP + /xc8/x76 UPWARDS WHITE ARROW + /xc8/x77 NORTH WEST ARROW TO LONG BAR + /xc8/x78 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +- /xc8/x79 +- /xc8/x7a ++ /xc8/x79 ++ /xc8/x7a + /xc8/x7b +- /xc8/x7c ++ /xc8/x7c + /xc8/x7d +- /xc8/x7e +- /xc8/xa1 ++ /xc8/x7e ++ /xc8/xa1 + /xc8/xa2 +- /xc8/xa3 +- /xc8/xa4 ++ /xc8/xa3 ++ /xc8/xa4 + /xc8/xcd FULLWIDTH NOT SIGN + /xc8/xce FULLWIDTH BROKEN BAR + /xc8/xcf FULLWIDTH APOSTROPHE +@@ -17536,7 +17844,7 @@ CHARMAP + /xfa/x40 + /xfa/x41 + /xfa/x42 +- /xfa/x43 ++ /xfa/x43 + /xfa/x44 + /xfa/x45 + /xfa/x46 +@@ -17557,10 +17865,10 @@ CHARMAP + /xfa/x55 + /xfa/x56 + /xfa/x57 +- /xfa/x58 ++ /xfa/x58 + /xfa/x59 + /xfa/x5a +- /xfa/x5b ++ /xfa/x5b + /xfa/x5c + /xfa/x5d + /xfa/x5e +@@ -17576,7 +17884,7 @@ CHARMAP + /xfa/x6a + /xfa/x6b + /xfa/x6c +- /xfa/x6d ++ /xfa/x6d + /xfa/x6e + /xfa/x6f + /xfa/x70 +@@ -17587,7 +17895,7 @@ CHARMAP + /xfa/x75 + /xfa/x76 + /xfa/x77 +- /xfa/x78 ++ /xfa/x78 + /xfa/x79 + /xfa/x7a + /xfa/x7b +@@ -17607,7 +17915,7 @@ CHARMAP + /xfa/xab + /xfa/xac + /xfa/xad +- /xfa/xae ++ /xfa/xae + /xfa/xaf + /xfa/xb0 + /xfa/xb1 +@@ -17621,7 +17929,7 @@ CHARMAP + /xfa/xb9 + /xfa/xba + /xfa/xbb +- /xfa/xbc ++ /xfa/xbc + /xfa/xbe + /xfa/xbf + /xfa/xc0 +@@ -17676,13 +17984,13 @@ CHARMAP + /xfa/xf3 + /xfa/xf4 + /xfa/xf5 +- /xfa/xf6 ++ /xfa/xf6 + /xfa/xf7 + /xfa/xf8 + /xfa/xf9 + /xfa/xfa +- /xfa/xfb +- /xfa/xfc ++ /xfa/xfb ++ /xfa/xfc + /xfa/xfd + /xfa/xfe + /xfb/x40 +@@ -17724,7 +18032,7 @@ CHARMAP + /xfb/x65 + /xfb/x66 + /xfb/x67 +- /xfb/x68 ++ /xfb/x68 + /xfb/x69 + /xfb/x6a + /xfb/x6b +@@ -17735,7 +18043,7 @@ CHARMAP + /xfb/x70 + /xfb/x71 + /xfb/x72 +- /xfb/x73 ++ /xfb/x73 + /xfb/x74 + /xfb/x75 + /xfb/x76 +@@ -17769,17 +18077,17 @@ CHARMAP + /xfb/xb4 + /xfb/xb5 + /xfb/xb6 +- /xfb/xb7 ++ /xfb/xb7 + /xfb/xb9 + /xfb/xba + /xfb/xbb + /xfb/xbc + /xfb/xbd +- /xfb/xbe ++ /xfb/xbe + /xfb/xbf + /xfb/xc0 + /xfb/xc1 +- /xfb/xc2 ++ /xfb/xc2 + /xfb/xc3 + /xfb/xc4 + /xfb/xc5 +@@ -17788,11 +18096,11 @@ CHARMAP + /xfb/xc8 + /xfb/xc9 + /xfb/xca +- /xfb/xcb ++ /xfb/xcb + /xfb/xcc + /xfb/xcd +- /xfb/xce +- /xfb/xcf ++ /xfb/xce ++ /xfb/xcf + /xfb/xd0 + /xfb/xd1 + /xfb/xd2 +@@ -17829,7 +18137,7 @@ CHARMAP + /xfb/xf1 + /xfb/xf2 + /xfb/xf4 +- /xfb/xf5 ++ /xfb/xf5 + /xfb/xf6 + /xfb/xf7 + /xfb/xf8 +@@ -17859,11 +18167,11 @@ CHARMAP + /xfc/x53 + /xfc/x54 + /xfc/x55 +- /xfc/x56 ++ /xfc/x56 + /xfc/x57 + /xfc/x58 + /xfc/x59 +- /xfc/x5a ++ /xfc/x5a + /xfc/x5b + /xfc/x5c + /xfc/x5d +@@ -17872,7 +18180,7 @@ CHARMAP + /xfc/x60 + /xfc/x61 + /xfc/x62 +- /xfc/x63 ++ /xfc/x63 + /xfc/x64 + /xfc/x65 + /xfc/x66 +@@ -17882,20 +18190,20 @@ CHARMAP + /xfc/x6a + /xfc/x6b + /xfc/x6d +- /xfc/x6e ++ /xfc/x6e + /xfc/x6f +- /xfc/x70 ++ /xfc/x70 + /xfc/x71 + /xfc/x72 + /xfc/x73 + /xfc/x74 + /xfc/x75 + /xfc/x76 +- /xfc/x77 ++ /xfc/x77 + /xfc/x78 + /xfc/x79 + /xfc/x7a +- /xfc/x7b ++ /xfc/x7b + /xfc/x7c + /xfc/x7d + /xfc/x7e +@@ -17921,7 +18229,7 @@ CHARMAP + /xfc/xb4 + /xfc/xb5 + /xfc/xb6 +- /xfc/xb7 ++ /xfc/xb7 + /xfc/xb8 + /xfc/xba + /xfc/xbb +@@ -17963,7 +18271,7 @@ CHARMAP + /xfc/xdf + /xfc/xe0 + /xfc/xe1 +- /xfc/xe3 ++ /xfc/xe3 + /xfc/xe4 + /xfc/xe5 + /xfc/xe6 +@@ -17979,8 +18287,8 @@ CHARMAP + /xfc/xf0 + /xfc/xf2 + /xfc/xf3 +- /xfc/xf4 +- /xfc/xf5 ++ /xfc/xf4 ++ /xfc/xf5 + /xfc/xf6 + /xfc/xf7 + /xfc/xf8 +@@ -17990,7 +18298,7 @@ CHARMAP + /xfc/xfc + /xfc/xfd + /xfc/xfe +- /xfd/x40 ++ /xfd/x40 + /xfd/x41 + /xfd/x42 + /xfd/x43 +@@ -18014,10 +18322,10 @@ CHARMAP + /xfd/x55 + /xfd/x56 + /xfd/x57 +- /xfd/x58 ++ /xfd/x58 + /xfd/x59 + /xfd/x5a +- /xfd/x5b ++ /xfd/x5b + /xfd/x5c + /xfd/x5d + /xfd/x5e +@@ -18025,15 +18333,15 @@ CHARMAP + /xfd/x60 + /xfd/x61 + /xfd/x62 +- /xfd/x63 ++ /xfd/x63 + /xfd/x64 + /xfd/x65 + /xfd/x66 +- /xfd/x67 ++ /xfd/x67 + /xfd/x68 + /xfd/x69 + /xfd/x6a +- /xfd/x6b ++ /xfd/x6b + /xfd/x6c + /xfd/x6d + /xfd/x6e +@@ -18042,7 +18350,7 @@ CHARMAP + /xfd/x71 + /xfd/x72 + /xfd/x73 +- /xfd/x74 ++ /xfd/x74 + /xfd/x75 + /xfd/x76 + /xfd/x77 +@@ -18056,10 +18364,10 @@ CHARMAP + /xfd/xa1 + /xfd/xa2 + /xfd/xa3 +- /xfd/xa4 ++ /xfd/xa4 + /xfd/xa5 + /xfd/xa6 +- /xfd/xa7 ++ /xfd/xa7 + /xfd/xa8 + /xfd/xa9 + /xfd/xaa +@@ -18070,7 +18378,7 @@ CHARMAP + /xfd/xaf + /xfd/xb0 + /xfd/xb1 +- /xfd/xb2 ++ /xfd/xb2 + /xfd/xb3 + /xfd/xb4 + /xfd/xb5 +@@ -18097,16 +18405,16 @@ CHARMAP + /xfd/xcd + /xfd/xce + /xfd/xcf +- /xfd/xd0 ++ /xfd/xd0 + /xfd/xd1 + /xfd/xd2 + /xfd/xd3 + /xfd/xd4 +- /xfd/xd5 ++ /xfd/xd5 + /xfd/xd6 + /xfd/xd7 +- /xfd/xd8 +- /xfd/xd9 ++ /xfd/xd8 ++ /xfd/xd9 + /xfd/xda + /xfd/xdb + /xfd/xdc +@@ -18134,7 +18442,7 @@ CHARMAP + /xfd/xf3 + /xfd/xf4 + /xfd/xf5 +- /xfd/xf6 ++ /xfd/xf6 + /xfd/xf7 + /xfd/xf8 + /xfd/xf9 +@@ -18149,7 +18457,7 @@ CHARMAP + /xfe/x43 + /xfe/x44 + /xfe/x45 +- /xfe/x46 ++ /xfe/x46 + /xfe/x47 + /xfe/x48 + /xfe/x49 +@@ -18157,7 +18465,7 @@ CHARMAP + /xfe/x4b + /xfe/x4c + /xfe/x4d +- /xfe/x4e ++ /xfe/x4e + /xfe/x4f + /xfe/x50 + /xfe/x51 +@@ -18170,7 +18478,7 @@ CHARMAP + /xfe/x59 + /xfe/x5a + /xfe/x5b +- /xfe/x5c ++ /xfe/x5c + /xfe/x5d + /xfe/x5e + /xfe/x5f +@@ -18181,13 +18489,13 @@ CHARMAP + /xfe/x64 + /xfe/x65 + /xfe/x66 +- /xfe/x67 ++ /xfe/x67 + /xfe/x68 + /xfe/x69 + /xfe/x6a + /xfe/x6b + /xfe/x6c +- /xfe/x6d ++ /xfe/x6d + /xfe/x6e + /xfe/x70 + /xfe/x71 +@@ -18203,12 +18511,12 @@ CHARMAP + /xfe/x7b + /xfe/x7c + /xfe/x7d +- /xfe/x7e ++ /xfe/x7e + /xfe/xa1 + /xfe/xa2 + /xfe/xa3 + /xfe/xa4 +- /xfe/xa5 ++ /xfe/xa5 + /xfe/xa6 + /xfe/xa7 + /xfe/xa8 +@@ -18217,7 +18525,7 @@ CHARMAP + /xfe/xac + /xfe/xad + /xfe/xae +- /xfe/xaf ++ /xfe/xaf + /xfe/xb0 + /xfe/xb1 + /xfe/xb2 +@@ -18225,7 +18533,7 @@ CHARMAP + /xfe/xb4 + /xfe/xb5 + /xfe/xb6 +- /xfe/xb7 ++ /xfe/xb7 + /xfe/xb8 + /xfe/xb9 + /xfe/xba +@@ -18236,7 +18544,7 @@ CHARMAP + /xfe/xbf + /xfe/xc0 + /xfe/xc1 +- /xfe/xc2 ++ /xfe/xc2 + /xfe/xc3 + /xfe/xc4 + /xfe/xc5 +@@ -18250,7 +18558,7 @@ CHARMAP + /xfe/xcd + /xfe/xce + /xfe/xcf +- /xfe/xd0 ++ /xfe/xd0 + /xfe/xd1 + /xfe/xd2 + /xfe/xd3 +@@ -18259,12 +18567,12 @@ CHARMAP + /xfe/xd6 + /xfe/xd7 + /xfe/xd8 +- /xfe/xd9 +- /xfe/xda ++ /xfe/xd9 ++ /xfe/xda + /xfe/xdb + /xfe/xdc +- /xfe/xde +- /xfe/xdf ++ /xfe/xde ++ /xfe/xdf + /xfe/xe0 + /xfe/xe1 + /xfe/xe2 +@@ -18279,7 +18587,7 @@ CHARMAP + /xfe/xeb + /xfe/xec + /xfe/xed +- /xfe/xee ++ /xfe/xee + /xfe/xef + /xfe/xf0 + /xfe/xf1 +@@ -18299,15 +18607,11 @@ CHARMAP + END CHARMAP + + WIDTH +-... 2 +- 2 +- 2 +- 2 +- 2 +-... 2 ++... 2 ++... 2 + ... 2 + ... 2 +-... 2 ++... 2 + ... 2 +-... 2 ++... 2 + END WIDTH diff --git a/SOURCES/glibc-rh1221046.patch b/SOURCES/glibc-rh1221046.patch new file mode 100644 index 0000000..69f07d8 --- /dev/null +++ b/SOURCES/glibc-rh1221046.patch @@ -0,0 +1,44 @@ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/generic/bits/stat.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/generic/bits/stat.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/generic/bits/stat.h +@@ -66,7 +66,7 @@ struct stat + __blksize_t st_blksize; /* Optimal block size for I/O. */ + int __pad2; + __field64(__blkcnt_t, __blkcnt64_t, st_blocks); /* 512-byte blocks */ +-#ifdef __USE_MISC ++#if defined __USE_MISC || defined __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the +@@ -107,7 +107,7 @@ struct stat64 + __blksize_t st_blksize; /* Optimal block size for I/O. */ + int __pad2; + __blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */ +-#ifdef __USE_MISC ++#if defined __USE_MISC || defined __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/bits/stat.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/bits/stat.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/bits/stat.h +@@ -41,7 +41,7 @@ struct stat + int pad0; + __dev_t st_rdev; /* Device number, if device. */ + __off_t st_size; /* Size of file, in bytes. */ +-#ifdef __USE_MISC ++#if defined __USE_MISC || defined __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the +@@ -80,7 +80,7 @@ struct stat64 + int pad0; + __dev_t st_rdev; /* Device number, if device. */ + __off_t st_size; /* Size of file, in bytes. */ +-#ifdef __USE_MISC ++#if defined __USE_MISC || defined __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the diff --git a/SOURCES/glibc-rh1234449-1.patch b/SOURCES/glibc-rh1234449-1.patch new file mode 100644 index 0000000..4b4f9c4 --- /dev/null +++ b/SOURCES/glibc-rh1234449-1.patch @@ -0,0 +1,73 @@ +commit 45c30c61c9001867c1891f5862764f084e53f348 +Author: Ondřej Bílka +Date: Sun Oct 20 08:25:25 2013 +0200 + + Replace alloca in __tzfile_read by malloc. Fixes bug 15670 + +diff --git a/time/tzfile.c b/time/tzfile.c +index 9dd5130..3ea3051 100644 +--- a/time/tzfile.c ++++ b/time/tzfile.c +@@ -114,6 +114,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap) + int was_using_tzfile = __use_tzfile; + int trans_width = 4; + size_t tzspec_len; ++ char *new = NULL; + + if (sizeof (time_t) != 4 && sizeof (time_t) != 8) + abort (); +@@ -145,22 +146,12 @@ __tzfile_read (const char *file, size_t extra, char **extrap) + if (*file != '/') + { + const char *tzdir; +- unsigned int len, tzdir_len; +- char *new, *tmp; + + tzdir = getenv ("TZDIR"); + if (tzdir == NULL || *tzdir == '\0') +- { +- tzdir = default_tzdir; +- tzdir_len = sizeof (default_tzdir) - 1; +- } +- else +- tzdir_len = strlen (tzdir); +- len = strlen (file) + 1; +- new = (char *) __alloca (tzdir_len + 1 + len); +- tmp = __mempcpy (new, tzdir, tzdir_len); +- *tmp++ = '/'; +- memcpy (tmp, file, len); ++ tzdir = default_tzdir; ++ if (__asprintf (&new, "%s/%s", tzdir, file) == -1) ++ goto ret_free_transitions; + file = new; + } + +@@ -170,11 +161,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap) + && stat64 (file, &st) == 0 + && tzfile_ino == st.st_ino && tzfile_dev == st.st_dev + && tzfile_mtime == st.st_mtime) +- { +- /* Nothing to do. */ +- __use_tzfile = 1; +- return; +- } ++ goto done; /* Nothing to do. */ + + /* Note the file is opened with cancellation in the I/O functions + disabled and if available FD_CLOEXEC set. */ +@@ -527,12 +514,15 @@ __tzfile_read (const char *file, size_t extra, char **extrap) + __daylight = rule_stdoff != rule_dstoff; + __timezone = -rule_stdoff; + ++ done: + __use_tzfile = 1; ++ free (new); + return; + + lose: + fclose (f); + ret_free_transitions: ++ free (new); + free ((void *) transitions); + transitions = NULL; + } diff --git a/SOURCES/glibc-rh1234449-2.patch b/SOURCES/glibc-rh1234449-2.patch new file mode 100644 index 0000000..67d8d4c --- /dev/null +++ b/SOURCES/glibc-rh1234449-2.patch @@ -0,0 +1,874 @@ +commit 42261ad731991df345880b0b509d83b0b9a9b9d8 +Author: Florian Weimer +Date: Fri Apr 24 17:34:47 2015 +0200 + + Make time zone file parser more robust [BZ #17715] + +diff --git a/time/tzfile.c b/time/tzfile.c +--- a/time/tzfile.c ++++ b/time/tzfile.c +@@ -213,6 +213,9 @@ + num_isstd = (size_t) decode (tzhead.tzh_ttisstdcnt); + num_isgmt = (size_t) decode (tzhead.tzh_ttisgmtcnt); + ++ if (__glibc_unlikely (num_isstd > num_types || num_isgmt > num_types)) ++ goto lose; ++ + /* For platforms with 64-bit time_t we use the new format if available. */ + if (sizeof (time_t) == 8 && trans_width == 4 + && tzhead.tzh_version[0] != '\0') +@@ -445,12 +448,20 @@ + goto lose; + + tzspec_len = st.st_size - off - 1; +- char *tzstr = alloca (tzspec_len); ++ if (tzspec_len == 0) ++ goto lose; ++ char *tzstr = malloc (tzspec_len); ++ if (tzstr == NULL) ++ goto lose; + if (getc_unlocked (f) != '\n' + || (fread_unlocked (tzstr, 1, tzspec_len - 1, f) != tzspec_len - 1)) +- goto lose; ++ { ++ free (tzstr); ++ goto lose; ++ } + tzstr[tzspec_len - 1] = '\0'; + tzspec = __tzstring (tzstr); ++ free (tzstr); + } + + /* Don't use an empty TZ string. */ + +diff --git a/time/tzset.c b/time/tzset.c +--- a/time/tzset.c ++++ b/time/tzset.c +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991-2012 Free Software Foundation, Inc. ++/* Copyright (C) 1991-2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -54,7 +55,7 @@ + /* When to change. */ + enum { J0, J1, M } type; /* Interpretation of: */ + unsigned short int m, n, d; /* Month, week, day. */ +- unsigned int secs; /* Time of day. */ ++ int secs; /* Time of day. */ + + long int offset; /* Seconds east of GMT (west if < 0). */ + +@@ -82,15 +83,14 @@ + + static struct tzstring_l *tzstring_list; + +-/* Allocate a permanent home for S. It will never be moved or deallocated, +- but may share space with other strings. +- Don't modify the returned string. */ +-char * +-__tzstring (const char *s) ++/* Allocate a permanent home for the first LEN characters of S. It ++ will never be moved or deallocated, but may share space with other ++ strings. Don't modify the returned string. */ ++static char * ++__tzstring_len (const char *s, size_t len) + { + char *p; + struct tzstring_l *t, *u, *new; +- size_t len = strlen (s); + + /* Walk the list and look for a match. If this string is the same + as the end of an already-allocated string, it can share space. */ +@@ -98,7 +98,7 @@ + if (len <= t->len) + { + p = &t->data[t->len - len]; +- if (strcmp (s, p) == 0) ++ if (memcmp (s, p, len) == 0) + return p; + } + +@@ -109,7 +109,8 @@ + + new->next = NULL; + new->len = len; +- strcpy (new->data, s); ++ memcpy (new->data, s, len); ++ new->data[len] = '\0'; + + if (u) + u->next = new; +@@ -118,6 +119,15 @@ + + return new->data; + } ++ ++/* Allocate a permanent home for S. It will never be moved or ++ deallocated, but may share space with other strings. Don't modify ++ the returned string. */ ++char * ++__tzstring (const char *s) ++{ ++ return __tzstring_len (s, strlen (s)); ++} + + /* Maximum length of a timezone name. tzset_internal keeps this up to date + (never decreasing it) when ! __use_tzfile. +@@ -125,7 +135,7 @@ + size_t __tzname_cur_max; + + long int +-__tzname_max () ++__tzname_max (void) + { + __libc_lock_lock (tzset_lock); + +@@ -164,243 +174,227 @@ + return min (ss, 59) + min (mm, 59) * 60 + min (hh, 24) * 60 * 60; + } + +- +-/* Parse the POSIX TZ-style string. */ +-void +-__tzset_parse_tz (tz) +- const char *tz; +-{ +- unsigned short int hh, mm, ss; +- +- /* Clear out old state and reset to unnamed UTC. */ +- memset (tz_rules, '\0', sizeof tz_rules); +- tz_rules[0].name = tz_rules[1].name = ""; +- +- /* Get the standard timezone name. */ +- char *tzbuf = strdupa (tz); +- +- int consumed; +- if (sscanf (tz, "%[A-Za-z]%n", tzbuf, &consumed) != 1) +- { +- /* Check for the quoted version. */ +- char *wp = tzbuf; +- if (__builtin_expect (*tz++ != '<', 0)) +- goto out; +- +- while (isalnum (*tz) || *tz == '+' || *tz == '-') +- *wp++ = *tz++; +- if (__builtin_expect (*tz++ != '>' || wp - tzbuf < 3, 0)) +- goto out; +- *wp = '\0'; ++/* Parses the time zone name at *TZP, and writes a pointer to an ++ interned string to tz_rules[WHICHRULE].name. On success, advances ++ *TZP, and returns true. Returns false otherwise. */ ++static bool ++parse_tzname (const char **tzp, int whichrule) ++{ ++ const char *start = *tzp; ++ const char *p = start; ++ while (('a' <= *p && *p <= 'z') ++ || ('A' <= *p && *p <= 'Z')) ++ ++p; ++ size_t len = p - start; ++ if (len < 3) ++ { ++ p = *tzp; ++ if (__glibc_unlikely (*p++ != '<')) ++ return false; ++ start = p; ++ while (('a' <= *p && *p <= 'z') ++ || ('A' <= *p && *p <= 'Z') ++ || ('0' <= *p && *p <= '9') ++ || *p == '+' || *p == '-') ++ ++p; ++ len = p - start; ++ if (*p++ != '>' || len < 3) ++ return false; + } +- else if (__builtin_expect (consumed < 3, 0)) +- goto out; +- else +- tz += consumed; + +- tz_rules[0].name = __tzstring (tzbuf); ++ tz_rules[whichrule].name = __tzstring_len (start, len); ++ ++ *tzp = p; ++ return true; ++} + +- /* Figure out the standard offset from UTC. */ +- if (*tz == '\0' || (*tz != '+' && *tz != '-' && !isdigit (*tz))) +- goto out; ++/* Parses the time zone offset at *TZP, and writes it to ++ tz_rules[WHICHRULE].offset. Returns true if the parse was ++ successful. */ ++static bool ++parse_offset (const char **tzp, int whichrule) ++{ ++ const char *tz = *tzp; ++ if (whichrule == 0 ++ && (*tz == '\0' || (*tz != '+' && *tz != '-' && !isdigit (*tz)))) ++ return false; + ++ long sign; + if (*tz == '-' || *tz == '+') +- tz_rules[0].offset = *tz++ == '-' ? 1L : -1L; ++ sign = *tz++ == '-' ? 1L : -1L; + else +- tz_rules[0].offset = -1L; +- switch (sscanf (tz, "%hu%n:%hu%n:%hu%n", +- &hh, &consumed, &mm, &consumed, &ss, &consumed)) +- { +- default: +- tz_rules[0].offset = 0; +- goto out; +- case 1: +- mm = 0; +- case 2: +- ss = 0; +- case 3: +- break; +- } +- tz_rules[0].offset *= compute_offset (ss, mm, hh); +- tz += consumed; +- +- /* Get the DST timezone name (if any). */ +- if (*tz != '\0') +- { +- if (sscanf (tz, "%[A-Za-z]%n", tzbuf, &consumed) != 1) +- { +- /* Check for the quoted version. */ +- char *wp = tzbuf; +- const char *rp = tz; +- if (__builtin_expect (*rp++ != '<', 0)) +- /* Punt on name, set up the offsets. */ +- goto done_names; +- +- while (isalnum (*rp) || *rp == '+' || *rp == '-') +- *wp++ = *rp++; +- if (__builtin_expect (*rp++ != '>' || wp - tzbuf < 3, 0)) +- /* Punt on name, set up the offsets. */ +- goto done_names; +- *wp = '\0'; +- tz = rp; +- } +- else if (__builtin_expect (consumed < 3, 0)) +- /* Punt on name, set up the offsets. */ +- goto done_names; +- else +- tz += consumed; ++ sign = -1L; ++ *tzp = tz; + +- tz_rules[1].name = __tzstring (tzbuf); +- +- /* Figure out the DST offset from GMT. */ +- if (*tz == '-' || *tz == '+') +- tz_rules[1].offset = *tz++ == '-' ? 1L : -1L; ++ unsigned short int hh; ++ unsigned short mm = 0; ++ unsigned short ss = 0; ++ int consumed = 0; ++ if (sscanf (tz, "%hu%n:%hu%n:%hu%n", ++ &hh, &consumed, &mm, &consumed, &ss, &consumed) > 0) ++ tz_rules[whichrule].offset = sign * compute_offset (ss, mm, hh); ++ else ++ /* Nothing could be parsed. */ ++ if (whichrule == 0) ++ { ++ /* Standard time defaults to offset zero. */ ++ tz_rules[0].offset = 0; ++ return false; ++ } + else +- tz_rules[1].offset = -1L; ++ /* DST defaults to one hour later than standard time. */ ++ tz_rules[1].offset = tz_rules[0].offset + (60 * 60); ++ *tzp = tz + consumed; ++ return true; ++} + +- switch (sscanf (tz, "%hu%n:%hu%n:%hu%n", +- &hh, &consumed, &mm, &consumed, &ss, &consumed)) ++/* Parses the standard <-> DST rules at *TZP. Updates ++ tz_rule[WHICHRULE]. On success, advances *TZP and returns true. ++ Otherwise, returns false. */ ++static bool ++parse_rule (const char **tzp, int whichrule) ++{ ++ const char *tz = *tzp; ++ tz_rule *tzr = &tz_rules[whichrule]; ++ ++ /* Ignore comma to support string following the incorrect ++ specification in early POSIX.1 printings. */ ++ tz += *tz == ','; ++ ++ /* Get the date of the change. */ ++ if (*tz == 'J' || isdigit (*tz)) ++ { ++ char *end; ++ tzr->type = *tz == 'J' ? J1 : J0; ++ if (tzr->type == J1 && !isdigit (*++tz)) ++ return false; ++ unsigned long int d = strtoul (tz, &end, 10); ++ if (end == tz || d > 365) ++ return false; ++ if (tzr->type == J1 && d == 0) ++ return false; ++ tzr->d = d; ++ tz = end; ++ } ++ else if (*tz == 'M') ++ { ++ tzr->type = M; ++ int consumed; ++ if (sscanf (tz, "M%hu.%hu.%hu%n", ++ &tzr->m, &tzr->n, &tzr->d, &consumed) != 3 ++ || tzr->m < 1 || tzr->m > 12 ++ || tzr->n < 1 || tzr->n > 5 || tzr->d > 6) ++ return false; ++ tz += consumed; ++ } ++ else if (*tz == '\0') ++ { ++ /* Daylight time rules in the U.S. are defined in the U.S. Code, ++ Title 15, Chapter 6, Subchapter IX - Standard Time. These ++ dates were established by Congress in the Energy Policy Act ++ of 2005 [Pub. L. no. 109-58, 119 Stat 594 (2005)]. ++ Below is the equivalent of "M3.2.0,M11.1.0" [/2 not needed ++ since 2:00AM is the default]. */ ++ tzr->type = M; ++ if (tzr == &tz_rules[0]) + { +- default: +- /* Default to one hour later than standard time. */ +- tz_rules[1].offset = tz_rules[0].offset + (60 * 60); +- break; +- +- case 1: +- mm = 0; +- case 2: +- ss = 0; +- case 3: +- tz_rules[1].offset *= compute_offset (ss, mm, hh); +- tz += consumed; +- break; ++ tzr->m = 3; ++ tzr->n = 2; ++ tzr->d = 0; + } +- if (*tz == '\0' || (tz[0] == ',' && tz[1] == '\0')) ++ else + { +- /* There is no rule. See if there is a default rule file. */ +- __tzfile_default (tz_rules[0].name, tz_rules[1].name, +- tz_rules[0].offset, tz_rules[1].offset); +- if (__use_tzfile) +- { +- free (old_tz); +- old_tz = NULL; +- return; +- } ++ tzr->m = 11; ++ tzr->n = 1; ++ tzr->d = 0; + } + } + else +- { +- /* There is no DST. */ +- tz_rules[1].name = tz_rules[0].name; +- tz_rules[1].offset = tz_rules[0].offset; +- goto out; ++ return false; ++ ++ if (*tz != '\0' && *tz != '/' && *tz != ',') ++ return false; ++ else if (*tz == '/') ++ { ++ /* Get the time of day of the change. */ ++ int negative; ++ ++tz; ++ if (*tz == '\0') ++ return false; ++ negative = *tz == '-'; ++ tz += negative; ++ /* Default to 2:00 AM. */ ++ unsigned short hh = 2; ++ unsigned short mm = 0; ++ unsigned short ss = 0; ++ int consumed = 0; ++ sscanf (tz, "%hu%n:%hu%n:%hu%n", ++ &hh, &consumed, &mm, &consumed, &ss, &consumed);; ++ tz += consumed; ++ tzr->secs = (negative ? -1 : 1) * ((hh * 60 * 60) + (mm * 60) + ss); + } ++ else ++ /* Default to 2:00 AM. */ ++ tzr->secs = 2 * 60 * 60; + +- done_names: +- /* Figure out the standard <-> DST rules. */ +- for (unsigned int whichrule = 0; whichrule < 2; ++whichrule) +- { +- register tz_rule *tzr = &tz_rules[whichrule]; ++ tzr->computed_for = -1; ++ *tzp = tz; ++ return true; ++} + +- /* Ignore comma to support string following the incorrect +- specification in early POSIX.1 printings. */ +- tz += *tz == ','; ++/* Parse the POSIX TZ-style string. */ ++void ++__tzset_parse_tz (const char *tz) ++{ ++ /* Clear out old state and reset to unnamed UTC. */ ++ memset (tz_rules, '\0', sizeof tz_rules); ++ tz_rules[0].name = tz_rules[1].name = ""; + +- /* Get the date of the change. */ +- if (*tz == 'J' || isdigit (*tz)) +- { +- char *end; +- tzr->type = *tz == 'J' ? J1 : J0; +- if (tzr->type == J1 && !isdigit (*++tz)) +- goto out; +- unsigned long int d = strtoul (tz, &end, 10); +- if (end == tz || d > 365) +- goto out; +- if (tzr->type == J1 && d == 0) +- goto out; +- tzr->d = d; +- tz = end; +- } +- else if (*tz == 'M') +- { +- tzr->type = M; +- if (sscanf (tz, "M%hu.%hu.%hu%n", +- &tzr->m, &tzr->n, &tzr->d, &consumed) != 3 +- || tzr->m < 1 || tzr->m > 12 +- || tzr->n < 1 || tzr->n > 5 || tzr->d > 6) +- goto out; +- tz += consumed; +- } +- else if (*tz == '\0') ++ /* Get the standard timezone name. */ ++ if (parse_tzname (&tz, 0) && parse_offset (&tz, 0)) ++ { ++ /* Get the DST timezone name (if any). */ ++ if (*tz != '\0') + { +- /* Daylight time rules in the U.S. are defined in the +- U.S. Code, Title 15, Chapter 6, Subchapter IX - Standard +- Time. These dates were established by Congress in the +- Energy Policy Act of 2005 [Pub. L. no. 109-58, 119 Stat 594 +- (2005)]. +- Below is the equivalent of "M3.2.0,M11.1.0" [/2 not needed +- since 2:00AM is the default]. */ +- tzr->type = M; +- if (tzr == &tz_rules[0]) ++ if (parse_tzname (&tz, 1)) + { +- tzr->m = 3; +- tzr->n = 2; +- tzr->d = 0; +- } +- else +- { +- tzr->m = 11; +- tzr->n = 1; +- tzr->d = 0; ++ parse_offset (&tz, 1); ++ if (*tz == '\0' || (tz[0] == ',' && tz[1] == '\0')) ++ { ++ /* There is no rule. See if there is a default rule ++ file. */ ++ __tzfile_default (tz_rules[0].name, tz_rules[1].name, ++ tz_rules[0].offset, tz_rules[1].offset); ++ if (__use_tzfile) ++ { ++ free (old_tz); ++ old_tz = NULL; ++ return; ++ } ++ } + } ++ /* Figure out the standard <-> DST rules. */ ++ if (parse_rule (&tz, 0)) ++ parse_rule (&tz, 1); + } + else +- goto out; +- +- if (*tz != '\0' && *tz != '/' && *tz != ',') +- goto out; +- else if (*tz == '/') + { +- /* Get the time of day of the change. */ +- ++tz; +- if (*tz == '\0') +- goto out; +- consumed = 0; +- switch (sscanf (tz, "%hu%n:%hu%n:%hu%n", +- &hh, &consumed, &mm, &consumed, &ss, &consumed)) +- { +- default: +- hh = 2; /* Default to 2:00 AM. */ +- case 1: +- mm = 0; +- case 2: +- ss = 0; +- case 3: +- break; +- } +- tz += consumed; +- tzr->secs = (hh * 60 * 60) + (mm * 60) + ss; ++ /* There is no DST. */ ++ tz_rules[1].name = tz_rules[0].name; ++ tz_rules[1].offset = tz_rules[0].offset; + } +- else +- /* Default to 2:00 AM. */ +- tzr->secs = 2 * 60 * 60; +- +- tzr->computed_for = -1; + } + +- out: + update_vars (); + } + + /* Interpret the TZ envariable. */ + static void + internal_function +-tzset_internal (always, explicit) +- int always; +- int explicit; ++tzset_internal (int always, int explicit) + { + static int is_initialized; +- register const char *tz; ++ const char *tz; + + if (is_initialized && !always) + return; +@@ -467,11 +461,9 @@ + put it in RULE->change, saving YEAR in RULE->computed_for. */ + static void + internal_function +-compute_change (rule, year) +- tz_rule *rule; +- int year; ++compute_change (tz_rule *rule, int year) + { +- register time_t t; ++ time_t t; + + if (year != -1 && rule->computed_for == year) + /* Operations on times in 2 BC will be slower. Oh well. */ +@@ -558,10 +550,7 @@ + `__timezone', and `__daylight' accordingly. */ + void + internal_function +-__tz_compute (timer, tm, use_localtime) +- time_t timer; +- struct tm *tm; +- int use_localtime; ++__tz_compute (time_t timer, struct tm *tm, int use_localtime) + { + compute_change (&tz_rules[0], 1900 + tm->tm_year); + compute_change (&tz_rules[1], 1900 + tm->tm_year); +@@ -641,6 +630,8 @@ + leap_extra_secs = 0; + } + ++ __libc_lock_unlock (tzset_lock); ++ + if (tp) + { + if (! use_localtime) +@@ -656,8 +647,6 @@ + tp = NULL; + } + +- __libc_lock_unlock (tzset_lock); +- + return tp; + } + +diff --git a/timezone/Makefile b/timezone/Makefile +index 17424b8..5f18545 100644 +--- a/timezone/Makefile ++++ b/timezone/Makefile +@@ -23,7 +23,7 @@ + extra-objs := scheck.o ialloc.o + + others := zdump zic +-tests := test-tz tst-timezone ++tests := test-tz tst-timezone tst-tzset + + # pacificnew doesn't compile; if it is to be used, it should be included in + # northamerica. +@@ -87,9 +87,11 @@ + Australia/Melbourne \ + America/Sao_Paulo Asia/Tokyo \ + Europe/London) ++$(objpfx)tst-tzset.out: $(addprefix $(testdata)/XT, 1 2 3 4) + + test-tz-ENV = TZDIR=$(testdata) + tst-timezone-ENV = TZDIR=$(testdata) ++tst-tzset-ENV = TZDIR=$(testdata) + + # Note this must come second in the deps list for $(built-program-cmd) to work. + zic-deps = $(objpfx)zic $(leapseconds) yearistype +@@ -111,6 +113,8 @@ + $(testdata)/Asia/Tokyo: asia $(zic-deps) + $(build-testdata) + ++$(testdata)/XT%: testdata/XT% ++ cp $< $@ + + $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make + sed -e 's|/bin/bash|$(KSH)|g' \ +diff --git a/timezone/README b/timezone/README +index 7a5e31c..2268f8e 100644 +--- a/timezone/README ++++ b/timezone/README +@@ -15,3 +15,6 @@ version of the tzcode and tzdata packages. + + These packages may be found at ftp://ftp.iana.org/tz/releases/. Commentary + should be addressed to tz@iana.org. ++ ++The subdirectory testdata contains manually edited data files for ++regression testing purposes. +diff --git a/timezone/testdata/XT1 b/timezone/testdata/XT1 +new file mode 100644 +index 0000000..67d7ee0 +Binary files /dev/null and b/timezone/testdata/XT1 differ +diff --git a/timezone/testdata/XT2 b/timezone/testdata/XT2 +new file mode 100644 +index 0000000..069189e +Binary files /dev/null and b/timezone/testdata/XT2 differ +diff --git a/timezone/testdata/XT3 b/timezone/testdata/XT3 +new file mode 100644 +index 0000000..fbf5eff +Binary files /dev/null and b/timezone/testdata/XT3 differ +diff --git a/timezone/testdata/XT4 b/timezone/testdata/XT4 +new file mode 100644 +index 0000000..990a976 +Binary files /dev/null and b/timezone/testdata/XT4 differ +diff --git a/timezone/tst-tzset.c b/timezone/tst-tzset.c +new file mode 100644 +index 0000000..aefcc76 +--- /dev/null ++++ b/timezone/tst-tzset.c +@@ -0,0 +1,200 @@ ++/* tzset tests with crafted time zone data. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define _GNU_SOURCE 1 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int do_test (void); ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" ++ ++/* Returns the name of a large TZ file. */ ++static char * ++create_tz_file (off64_t size) ++{ ++ char *path; ++ int fd = create_temp_file ("tst-tzset-", &path); ++ if (fd < 0) ++ exit (1); ++ ++ // Reopen for large-file support. ++ close (fd); ++ fd = open64 (path, O_WRONLY); ++ if (fd < 0) ++ { ++ printf ("open64 (%s) failed: %m\n", path); ++ exit (1); ++ } ++ ++ static const char data[] = { ++ 0x54, 0x5a, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x58, 0x54, 0x47, 0x00, 0x00, 0x00, ++ 0x54, 0x5a, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x00, 0x00, 0x04, 0xf8, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x58, 0x54, 0x47, 0x00, 0x00, ++ 0x00, 0x0a, 0x58, 0x54, 0x47, 0x30, 0x0a ++ }; ++ ssize_t ret = write (fd, data, sizeof (data)); ++ if (ret < 0) ++ { ++ printf ("write failed: %m\n"); ++ exit (1); ++ } ++ if ((size_t) ret != sizeof (data)) ++ { ++ printf ("Short write\n"); ++ exit (1); ++ } ++ if (lseek64 (fd, size, SEEK_CUR) < 0) ++ { ++ printf ("lseek failed: %m\n"); ++ close (fd); ++ return NULL; ++ } ++ if (write (fd, "", 1) != 1) ++ { ++ printf ("Single-byte write failed\n"); ++ close (fd); ++ return NULL; ++ } ++ if (close (fd) != 0) ++ { ++ printf ("close failed: %m\n"); ++ exit (1); ++ } ++ return path; ++} ++ ++static void ++test_tz_file (off64_t size) ++{ ++ char *path = create_tz_file (size); ++ if (setenv ("TZ", path, 1) < 0) ++ { ++ printf ("setenv failed: %m\n"); ++ exit (1); ++ } ++ tzset (); ++ free (path); ++} ++ ++static int ++do_test (void) ++{ ++ /* Limit the size of the process. Otherwise, some of the tests will ++ consume a lot of resources. */ ++ { ++ struct rlimit limit; ++ if (getrlimit (RLIMIT_AS, &limit) != 0) ++ { ++ printf ("getrlimit (RLIMIT_AS) failed: %m\n"); ++ return 1; ++ } ++ long target = 512 * 1024 * 1024; ++ if (limit.rlim_cur == RLIM_INFINITY || limit.rlim_cur > target) ++ { ++ limit.rlim_cur = 512 * 1024 * 1024; ++ if (setrlimit (RLIMIT_AS, &limit) != 0) ++ { ++ printf ("setrlimit (RLIMIT_AS) failed: %m\n"); ++ return 1; ++ } ++ } ++ } ++ ++ int errors = 0; ++ for (int i = 1; i <= 4; ++i) ++ { ++ char tz[16]; ++ snprintf (tz, sizeof (tz), "XT%d", i); ++ if (setenv ("TZ", tz, 1) < 0) ++ { ++ printf ("setenv failed: %m\n"); ++ return 1; ++ } ++ tzset (); ++ if (strcmp (tzname[0], tz) == 0) ++ { ++ printf ("Unexpected success for %s\n", tz); ++ ++errors; ++ } ++ } ++ ++ /* Large TZ files. */ ++ ++ /* This will succeed on 64-bit architectures, and fail on 32-bit ++ architectures. It used to crash on 32-bit. */ ++ test_tz_file (64 * 1024 * 1024); ++ ++ /* This will fail on 64-bit and 32-bit architectures. It used to ++ cause a test timeout on 64-bit and crash on 32-bit if the TZ file ++ open succeeded for some reason (it does not use O_LARGEFILE in ++ regular builds). */ ++ test_tz_file (4LL * 1024 * 1024 * 1024 - 6); ++ ++ /* Large TZ variables. */ ++ { ++ size_t length = 64 * 1024 * 1024; ++ char *value = malloc (length + 1); ++ if (value == NULL) ++ { ++ puts ("malloc failed: %m"); ++ return 1; ++ } ++ value[length] = '\0'; ++ ++ memset (value, ' ', length); ++ value[0] = 'U'; ++ value[1] = 'T'; ++ value[2] = 'C'; ++ if (setenv ("TZ", value, 1) < 0) ++ { ++ printf ("setenv failed: %m\n"); ++ return 1; ++ } ++ tzset (); ++ ++ memset (value, '0', length); ++ value[0] = '<'; ++ value[length - 1] = '>'; ++ if (setenv ("TZ", value, 1) < 0) ++ { ++ printf ("setenv failed: %m\n"); ++ return 1; ++ } ++ tzset (); ++ } ++ ++ return errors > 0; ++} diff --git a/SOURCES/glibc-rh1234449-3.patch b/SOURCES/glibc-rh1234449-3.patch new file mode 100644 index 0000000..048c648 --- /dev/null +++ b/SOURCES/glibc-rh1234449-3.patch @@ -0,0 +1,93 @@ +commit cc8dcf96e71dd643f929e32150904cd6ad69efa8 +Author: Florian Weimer +Date: Mon Apr 27 15:41:03 2015 +0200 + + test-skeleton: Support temporary files without memory leaks [BZ#18333] + + add_temp_file now makes a copy which is freed by delete_temp_files. + Callers to create_temp_file can now free the returned file name to + avoid the memory leak. These changes do not affect the leak behavior + of existing code. + + Also address a NULL pointer derefence in tzset after a memory allocation + failure, found during testing. + +diff --git a/test-skeleton.c b/test-skeleton.c +index 7a8ddfa..43fc236 100644 +--- a/test-skeleton.c ++++ b/test-skeleton.c +@@ -73,7 +73,7 @@ static const char *test_dir; + struct temp_name_list + { + struct qelem q; +- const char *name; ++ char *name; + } *temp_name_list; + + /* Add temporary files in list. */ +@@ -83,14 +83,17 @@ add_temp_file (const char *name) + { + struct temp_name_list *newp + = (struct temp_name_list *) calloc (sizeof (*newp), 1); +- if (newp != NULL) ++ char *newname = strdup (name); ++ if (newp != NULL && newname != NULL) + { +- newp->name = name; ++ newp->name = newname; + if (temp_name_list == NULL) + temp_name_list = (struct temp_name_list *) &newp->q; + else + insque (newp, temp_name_list); + } ++ else ++ free (newp); + } + + /* Delete all temporary files. */ +@@ -100,11 +103,19 @@ delete_temp_files (void) + while (temp_name_list != NULL) + { + remove (temp_name_list->name); +- temp_name_list = (struct temp_name_list *) temp_name_list->q.q_forw; ++ free (temp_name_list->name); ++ ++ struct temp_name_list *next ++ = (struct temp_name_list *) temp_name_list->q.q_forw; ++ free (temp_name_list); ++ temp_name_list = next; + } + } + +-/* Create a temporary file. */ ++/* Create a temporary file. Return the opened file descriptor on ++ success, or -1 on failure. Write the file name to *FILENAME if ++ FILENAME is not NULL. In this case, the caller is expected to free ++ *FILENAME. */ + static int + __attribute__ ((unused)) + create_temp_file (const char *base, char **filename) +@@ -132,6 +143,8 @@ create_temp_file (const char *base, char **filename) + add_temp_file (fname); + if (filename != NULL) + *filename = fname; ++ else ++ free (fname); + + return fd; + } +diff --git a/time/tzset.c b/time/tzset.c +--- a/time/tzset.c ++++ b/time/tzset.c +@@ -202,7 +202,10 @@ + return false; + } + +- tz_rules[whichrule].name = __tzstring_len (start, len); ++ const char *name = __tzstring_len (start, len); ++ if (name == NULL) ++ return false; ++ tz_rules[whichrule].name = name; + + *tzp = p; + return true; diff --git a/SOURCES/glibc-rh1234449-4.patch b/SOURCES/glibc-rh1234449-4.patch new file mode 100644 index 0000000..9b95a4e --- /dev/null +++ b/SOURCES/glibc-rh1234449-4.patch @@ -0,0 +1,21 @@ +commit 5cffc05ed5c7fea312f2822d388afc025d03c08a +Author: H.J. Lu +Date: Mon Apr 27 09:57:51 2015 -0700 + + Check tzspec_len == 0 in __tzfile_read + + [BZ#18333] + * time/tzset.c (__tzfile_read): Check tzspec_len == 0. + +--- a/time/tzfile.c ++++ b/time/tzfile.c +@@ -283,7 +283,8 @@ + if (__builtin_expect (tzspec_len == 0 || tzspec_len - 1 < num_isgmt, 0)) + goto lose; + tzspec_len -= num_isgmt + 1; +- if (__builtin_expect (SIZE_MAX - total_size < tzspec_len, 0)) ++ if (__builtin_expect (tzspec_len == 0 ++ || SIZE_MAX - total_size < tzspec_len, 0)) + goto lose; + } + if (__builtin_expect (SIZE_MAX - total_size - tzspec_len < extra, 0)) diff --git a/SOURCES/glibc-rh1240351-1.patch b/SOURCES/glibc-rh1240351-1.patch new file mode 100644 index 0000000..d51d67b --- /dev/null +++ b/SOURCES/glibc-rh1240351-1.patch @@ -0,0 +1,11 @@ + Removed file as a prerequisite for bug 1213267 - [7.3 FEAT] Configure + glibc with --with-cpu=power8 --with-tune=power8 for RHEL7.3 ppc64le. + +diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies b/sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies +deleted file mode 100644 +index fad2505..0000000 +--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies ++++ /dev/null +@@ -1,2 +0,0 @@ +-powerpc/powerpc64/power8/fpu +-powerpc/powerpc64/power8 diff --git a/SOURCES/glibc-rh1240351-10.patch b/SOURCES/glibc-rh1240351-10.patch new file mode 100644 index 0000000..8e4a54c --- /dev/null +++ b/SOURCES/glibc-rh1240351-10.patch @@ -0,0 +1,253 @@ + Backport of + commit 72607db038df1a1a7987af814aad8d2ed466c45c + Author: Rajalakshmi Srinivasaraghavan + Date: Fri Jan 9 11:56:35 2015 -0500 + + powerpc: Optimize POWER7 strcmp trailing checks + + This patch optimized the POWER7 trailing check by avoiding using byte + read operations and instead use the doubleword already readed with + bitwise operations. + + ChangeLog: + 2015-01-13 Rajalakshmi Srinivasaraghavan + Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/power7/strcmp.S (strcmp): Optimize + trailing byte check. + +diff --git a/sysdeps/powerpc/powerpc64/power7/strcmp.S b/sysdeps/powerpc/powerpc64/power7/strcmp.S +index f16a9d8..ade2811 100644 +--- a/sysdeps/powerpc/powerpc64/power7/strcmp.S ++++ b/sysdeps/powerpc/powerpc64/power7/strcmp.S +@@ -25,122 +25,96 @@ + + /* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */ + ++ .machine power7 + EALIGN (strcmp, 4, 0) + CALL_MCOUNT 2 + + or r9, r3, r4 + rldicl. r10, r9, 0, 61 /* are s1 and s2 8 byte aligned..? */ + bne cr0, L(process_unaligned_bytes) ++ li r5, 0 + ++ .align 4 + /* process input parameters on double word aligned boundary */ +- ld r9, 0(r4) /* load s2 at offset=0 */ +- li r10, 0 /* load mask=0 */ +- cmpb r10, r9, r10 /* compare bytes at s2 with mask */ +- cmpdi cr7, r10, 0 /* is NULL found ..? is end of string HIT */ +- bne cr7, L(process_unaligned_bytes) /* process byte by byte */ +- +- ld r10, 0(r3) /* load s1 at offset=0 */ +- li r8, 0 /* load mask=0 */ +- cmpb r8, r10, r8 /* compare bytes at s1 with mask */ +- cmpdi cr7, r8, 0 /* is NULL found ..? is end of string HIT */ +- bne cr7, L(process_unaligned_bytes) /* process byte by byte */ +- +-/*s1 and s2 does not contain NULL now , so compare all 8 bytes in a GO */ +- cmpb r9, r10, r9 /* compare s1 and s2 */ +- cmpdi cr7, r9, -1 /* compare result with 0xFFFFFFFFFFFFFFFF */ +- bne cr7, L(process_unaligned_bytes) /* s1,s2 mismatch found */ +- +- addi r5, r3, 8 /* save next offset of s2 */ +- addi r11, r4, 8 /* save next offset of s1 */ +- ld r8, 8(r4) /* load s2 at offset=8 */ +- li r9, 0 /* load mask=0 */ +- cmpb r9, r8, r9 /* compare bytes at s2 with mask */ +- cmpdi cr7, r9, 0 /* NULL found ..? */ +- bne cr7, L(processBytes)/* update input and process bytes one by one */ +- +- mr r9, r4 /* save s2 */ +- li r10, 0 /* load mask=0 */ +- +- ld r7, 8(r3) /* load s1 at offset=8 */ +- cmpb r6, r7, r10 /* compare bytes at s1 with mask */ +- cmpdi cr7, r6, 0 /* is NULL found */ +- bne cr7, L(processBytes)/* mismatch, so process one by one */ +- + L(unrollDword): +- cmpb r8, r7, r8 /* compare s1 and s2 */ +- cmpdi cr7, r8, -1 /* compare result with 0xFFFFFFFFFFFFFFFF */ +- bne cr7, L(processBytes)/* mismatch with s1 and s2 */ +- +- addi r5, r3, 16 /* save offset=16 of s1 */ +- addi r4, r9, 16 /* save offset=16 of s2 */ +- ld r8, 16(r9) /* load s2 at offset=16 */ +- cmpb r7, r8, r10 /* compare bytes at s2 with mask */ +- cmpdi cr7, r7, 0 /* NULL found ..? */ +- bne cr7, L(update2processBytes) +- +- ld r7, 16(r3) /* load s1 at offset=16 */ +- cmpb r6, r7, r10 /* check s1 for end of string */ +- cmpdi cr7, r6, 0 /* end of s1 ?,then handle byte by byte */ +- bne 7,L(update2processBytes) +- +- cmpb r8, r7, r8 /* compare s1 and s2 double words */ +- cmpdi cr7, r8, -1 /* compare results with 0xFFFFFFFFFFFFFFFF */ +- bne cr7,L(update2processBytes) +- +- addi r5, r3, 24 /* update s1 to offset=24 */ +- addi r4, r9, 24 /* update s2 to offset=24 */ +- +- ld r8, 24(r9) /* load s2 */ +- cmpb r7, r8, r10 /* compare s2 for NULL */ +- cmpdi cr7, r7, 0 /* verify if s2 is ending now */ +- bne cr7,L(update2processBytes) +- +- ld r7, 24(r3) /* load s1 at offset=24 */ +- cmpb r6, r7, r10 /* verify for NULL */ +- cmpdi cr7, r6, 0 /* is NULL found */ +- bne cr7, L(update2processBytes) +- +- cmpb r8, r7, r8 /* compare s1 and s2 */ +- cmpdi cr7, r8, -1 /* are s1 and s2 same ..? */ +- bne cr7, L(update2processBytes) +- +- addi r7, r9, 32 /* update s2 to next double word */ +- addi r3, r3, 32 /* update s1 to next double word */ +- +- ld r8, 32(r9) /* load s2 */ +- mr r4, r7 /* save s2 */ +- cmpb r6, r8, r10 /* compare s2 with NULL */ +- cmpdi cr7, r6, 0 /* end of s2 ..? */ +- bne cr7, L(process_unaligned_bytes) +- +- ld r6, 0(r3) /* load and compare s1 for NULL */ +- cmpb r5, r6, r10 +- cmpdi cr7, r5, 0 +- bne cr7, L(process_unaligned_bytes) +- +- cmpb r8, r6, r8 /* compare s1 and s2 */ +- cmpdi cr7, r8, -1 +- bne cr7, L(process_unaligned_bytes) +- +- addi r5, r3, 8 /* increment s1 and d2 here */ +- addi r11, r9, 40 +- +- ld r8, 40(r9) /* process s2 now */ +- cmpb r9, r8, r10 +- cmpdi cr7, r9, 0 +- bne cr7, L(processBytes) +- +- mr r9, r7 +- ld r7, 8(r3) /* process s1 now */ +- cmpb r6, r7, r10 +- cmpdi cr7, r6, 0 +- beq cr7, L(unrollDword) /* unroll to compare s1 and s2 */ +- +-L(processBytes): +- mr r4, r11 /* update input params */ +- mr r3, r5 +- +- .p2align 4 ++ ld r8,0(r3) ++ ld r10,0(r4) ++ cmpb r7,r8,r5 ++ cmpdi cr7,r7,0 ++ mr r9,r7 ++ bne cr7,L(null_found) ++ cmpld cr7,r8,r10 ++ bne cr7,L(different) ++ ++ ld r8,8(r3) ++ ld r10,8(r4) ++ cmpb r7,r8,r5 ++ cmpdi cr7,r7,0 ++ mr r9,r7 ++ bne cr7,L(null_found) ++ cmpld cr7,r8,r10 ++ bne cr7,L(different) ++ ++ ld r8,16(r3) ++ ld r10,16(r4) ++ cmpb r7,r8,r5 ++ cmpdi cr7,r7,0 ++ mr r9,r7 ++ bne cr7,L(null_found) ++ cmpld cr7,r8,r10 ++ bne cr7,L(different) ++ ++ ld r8,24(r3) ++ ld r10,24(r4) ++ cmpb r7,r8,r5 ++ cmpdi cr7,r7,0 ++ mr r9,r7 ++ bne cr7,L(null_found) ++ cmpld cr7,r8,r10 ++ bne cr7,L(different) ++ ++ addi r3, r3, 32 ++ addi r4, r4, 32 ++ beq cr7, L(unrollDword) ++ ++ .align 4 ++L(null_found): ++#ifdef __LITTLE_ENDIAN__ ++ neg r7,r9 ++ and r9,r9,r7 ++ li r7,-1 ++ cntlzd r9,r9 ++ subfic r9,r9,71 ++ sld r9,r7,r9 ++#else ++ cntlzd r9,r9 ++ li r7,-1 ++ addi r9,r9,8 ++ srd r9,r7,r9 ++#endif ++ or r8,r8,r9 ++ or r10,r10,r9 ++ ++L(different): ++ cmpb r9,r8,r10 ++#ifdef __LITTLE_ENDIAN__ ++ addi r7,r9,1 ++ andc r9,r7,r9 ++ cntlzd r9,r9 ++ subfic r9,r9,63 ++#else ++ not r9,r9 ++ cntlzd r9,r9 ++ subfic r9,r9,56 ++#endif ++ srd r3,r8,r9 ++ srd r10,r10,r9 ++ rldicl r10,r10,0,56 ++ rldicl r3,r3,0,56 ++ subf r3,r10,r3 ++ blr ++ ++ .align 4 + L(process_unaligned_bytes): + lbz r9, 0(r3) /* load byte from s1 */ + lbz r10, 0(r4) /* load byte from s2 */ +@@ -172,24 +146,19 @@ L(process_unaligned_bytes): + addi r4, r4, 4 /* increment s2 by unroll factor */ + beq cr6, L(process_unaligned_bytes) /* unroll byte processing */ + +- .p2align 4 ++ .align 4 + L(ComputeDiff): + extsw r9, r9 + subf r10, r10, r9 /* compute s1 - s2 */ + extsw r3, r10 + blr /* return */ + +- .p2align 4 ++ .align 4 + L(diffOfNULL): + li r9, 0 + subf r10, r10, r9 /* compute s1 - s2 */ + extsw r3, r10 /* sign extend result */ + blr /* return */ + +- .p2align 4 +-L(update2processBytes): +- mr r3, r5 /* update and proceed */ +- b L(process_unaligned_bytes) +- + END (strcmp) + libc_hidden_builtin_def (strcmp) diff --git a/SOURCES/glibc-rh1240351-11.patch b/SOURCES/glibc-rh1240351-11.patch new file mode 100644 index 0000000..8404295 --- /dev/null +++ b/SOURCES/glibc-rh1240351-11.patch @@ -0,0 +1,450 @@ + Backport of + commit d3b00f468bec441596877a685a19f43dee88657f + Author: Adhemerval Zanella + Date: Fri Jan 9 16:04:26 2015 -0500 + + powerpc: Optimized strncmp for POWER8/PPC64 + + This patch adds an optimized POWER8 strncmp. The implementation focus + on speeding up unaligned cases follwing the ideas of power8 strcmp. + + The algorithm first check the initial 16 bytes, then align the first + function source and uses unaligned loads on second argument only. + Aditional checks for page boundaries are done for unaligned cases + (where sources alignment are different). + + ChangeLog: + 2015-01-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S: New file. + * sysdeps/powerpc/powerpc64/power8/strncmp.S: New file. + * sysdeps/powerpc/powerpc64/multiarch/Makefile [sysdep_routines]: Add + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 27c8b65..677d8ce 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -14,8 +14,9 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ + strncat-power7 \ + rawmemchr-ppc64 strlen-power7 strlen-ppc64 strnlen-power7 \ + strnlen-ppc64 strcasecmp-power7 strcasecmp_l-power7 \ +- strncase-power7 strncase_l-power7 strncmp-power7 \ +- strncmp-power4 strncmp-ppc64 strchr-power7 strchr-ppc64 \ ++ strncase-power7 strncase_l-power7 \ ++ strncmp-power8 strncmp-power7 strncmp-power4 strncmp-ppc64 \ ++ strchr-power7 strchr-ppc64 \ + strchrnul-power7 strchrnul-ppc64 wcschr-power7 \ + wcschr-power6 wcschr-ppc64 wcsrchr-power7 wcsrchr-power6 \ + wcsrchr-ppc64 wcscpy-power7 wcscpy-power6 wcscpy-ppc64 \ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index 2b38c71..a540abf 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -100,6 +100,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + + /* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c. */ + IFUNC_IMPL (i, name, strncmp, ++ IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_2_07, ++ __strncmp_power8) + IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_HAS_VSX, + __strncmp_power7) + IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_POWER4, +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S +new file mode 100644 +index 0000000..8d7223d +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power8.S +@@ -0,0 +1,40 @@ ++/* Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name,alignt,words) \ ++ .section ".text"; \ ++ ENTRY_2(__strncmp_power8) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strncmp_power8): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strncmp_power8) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strncmp_power8) \ ++ END_2(__strncmp_power8) ++ ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +index 9829d69..5e76783 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +@@ -25,13 +25,16 @@ + extern __typeof (strncmp) __strncmp_ppc attribute_hidden; + extern __typeof (strncmp) __strncmp_power4 attribute_hidden; + extern __typeof (strncmp) __strncmp_power7 attribute_hidden; ++extern __typeof (strncmp) __strncmp_power8 attribute_hidden; + + /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle + ifunc symbol properly. */ + libc_ifunc (strncmp, +- (hwcap & PPC_FEATURE_HAS_VSX) +- ? __strncmp_power7 : +- (hwcap & PPC_FEATURE_POWER4) ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __strncmp_power8 : ++ (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strncmp_power7 : ++ (hwcap & PPC_FEATURE_POWER4) + ? __strncmp_power4 + : __strncmp_ppc); + #endif +diff --git a/sysdeps/powerpc/powerpc64/power8/strncmp.S b/sysdeps/powerpc/powerpc64/power8/strncmp.S +new file mode 100644 +index 0000000..56c814b +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/strncmp.S +@@ -0,0 +1,323 @@ ++/* Optimized strncmp implementation for PowerPC64/POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++/* Implements the function ++ ++ int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t [r5] n) ++ ++ The implementation uses unaligned doubleword access to avoid specialized ++ code paths depending of data alignment. Although recent powerpc64 uses ++ 64K as default, the page cross handling assumes minimum page size of ++ 4k. */ ++ ++ .machine power7 ++EALIGN (strncmp, 4, 0) ++ /* Check if size is 0. */ ++ mr. r10,r5 ++ beq cr0,L(ret0) ++ ++ /* Check if [s1]+16 or [s2]+16 will cross a 4K page boundary using ++ the code: ++ ++ (((size_t) s1) % PAGE_SIZE > (PAGE_SIZE - ITER_SIZE)) ++ ++ with PAGE_SIZE being 4096 and ITER_SIZE begin 16. */ ++ rldicl r8,r3,0,52 ++ cmpldi cr7,r8,4096-16 ++ bgt cr7,L(pagecross) ++ rldicl r9,r4,0,52 ++ cmpldi cr7,r9,4096-16 ++ bgt cr7,L(pagecross) ++ ++ /* For short string up to 16 bytes, load both s1 and s2 using ++ unaligned dwords and compare. */ ++ ld r7,0(r3) ++ ld r9,0(r4) ++ li r8,0 ++ cmpb r8,r7,r8 ++ cmpb r6,r7,r9 ++ orc. r8,r8,r6 ++ bne cr0,L(different1) ++ ++ /* If the string compared are equal, but size is less or equal ++ to 8, return 0. */ ++ cmpldi cr7,r10,8 ++ li r9,0 ++ ble cr7,L(ret1) ++ addi r5,r10,-8 ++ ++ ld r7,8(r3) ++ ld r9,8(r4) ++ cmpb r8,r7,r8 ++ cmpb r6,r7,r9 ++ orc. r8,r8,r6 ++ bne cr0,L(different0) ++ ++ cmpldi cr7,r5,8 ++ mr r9,r8 ++ ble cr7,L(ret1) ++ ++ /* Update pointers and size. */ ++ addi r10,r10,-16 ++ addi r3,r3,16 ++ addi r4,r4,16 ++ ++ /* Now it has checked for first 16 bytes, align source1 to doubleword ++ and adjust source2 address. */ ++L(align_8b): ++ rldicl r5,r3,0,61 ++ rldicr r3,r3,0,60 ++ subf r4,r5,r4 ++ add r10,r10,r5 ++ ++ /* At this point, source1 alignment is 0 and source2 alignment is ++ between 0 and 7. Check is source2 alignment is 0, meaning both ++ sources have the same alignment. */ ++ andi. r8,r4,0x7 ++ beq cr0,L(loop_eq_align_0) ++ ++ li r5,0 ++ b L(loop_ne_align_1) ++ ++ /* If source2 is unaligned to doubleword, the code needs to check ++ on each interation if the unaligned doubleword access will cross ++ a 4k page boundary. */ ++ .align 4 ++L(loop_ne_align_0): ++ ld r7,0(r3) ++ ld r9,0(r4) ++ cmpb r8,r7,r5 ++ cmpb r6,r7,r9 ++ orc. r8,r8,r6 ++ bne cr0,L(different1) ++ ++ cmpldi cr7,r10,8 ++ ble cr7,L(ret0) ++ addi r10,r10,-8 ++ addi r3,r3,8 ++ addi r4,r4,8 ++L(loop_ne_align_1): ++ rldicl r9,r4,0,52 ++ cmpldi r7,r9,4088 ++ ble cr7,L(loop_ne_align_0) ++ cmpdi cr7,r10,0 ++ beq cr7,L(ret0) ++ ++ lbz r9,0(r3) ++ lbz r8,0(r4) ++ cmplw cr7,r9,r8 ++ bne cr7,L(byte_ne_4) ++ cmpdi cr7,r9,0 ++ beq cr7,L(size_reached_0) ++ ++ li r9,r7 ++ addi r8,r3,1 ++ mtctr r9 ++ addi r4,r4,1 ++ addi r10,r10,-1 ++ addi r3,r3,8 ++ ++ /* The unaligned read of source2 will cross a 4K page boundary, ++ and the different byte or NULL maybe be in the remaining page ++ bytes. Since it can not use the unaligned load the algorithm ++ reads and compares 8 bytes to keep source1 doubleword aligned. */ ++ .align 4 ++L(loop_ne_align_byte): ++ cmpdi cr7,r10,0 ++ addi r10,r10,-1 ++ beq cr7,L(ret0) ++ lbz r9,0(r8) ++ lbz r7,0(r4) ++ addi r8,r8,1 ++ addi r4,r4,1 ++ cmplw cr7,r9,r7 ++ cmpdi cr5,r9,0 ++ bne cr7,L(size_reached_2) ++ beq cr5,L(size_reached_0) ++ bdnz L(loop_ne_align_byte) ++ ++ cmpdi cr7,r10,0 ++ bne+ cr7,L(loop_ne_align_0) ++ ++ .align 4 ++L(ret0): ++ li r9,0 ++L(ret1): ++ mr r3,r9 ++ blr ++ ++ /* The code now check if r8 and r10 are different by issuing a ++ cmpb and shift the result based on its output: ++ ++ #ifdef __LITTLE_ENDIAN__ ++ leadzero = (__builtin_ffsl (z1) - 1); ++ leadzero = leadzero > (n-1)*8 ? (n-1)*8 : leadzero; ++ r1 = (r1 >> leadzero) & 0xFFUL; ++ r2 = (r2 >> leadzero) & 0xFFUL; ++ #else ++ leadzero = __builtin_clzl (z1); ++ leadzero = leadzero > (n-1)*8 ? (n-1)*8 : leadzero; ++ r1 = (r1 >> (56 - leadzero)) & 0xFFUL; ++ r2 = (r2 >> (56 - leadzero)) & 0xFFUL; ++ #endif ++ return r1 - r2; */ ++ ++ .align 4 ++L(different0): ++ mr r10,r5 ++#ifdef __LITTLE_ENDIAN__ ++L(different1): ++ neg r11,r8 ++ sldi r10,r10,3 ++ and r8,r11,r8 ++ addi r10,r10,-8 ++ cntlzd r8,r8 ++ subfic r8,r8,63 ++ extsw r8,r8 ++ cmpld cr7,r8,r10 ++ ble cr7,L(different2) ++ mr r8,r10 ++L(different2): ++ extsw r8,r8 ++#else ++L(different1): ++ addi r10,r10,-1 ++ cntlzd r8,r8 ++ sldi r10,r10,3 ++ cmpld cr7,r8,r10 ++ blt cr7,L(different2) ++ mr r8,r10 ++L(different2): ++ subfic r8,r8,56 ++#endif ++ srd r7,r7,r8 ++ srd r9,r9,r8 ++ rldicl r3,r7,0,56 ++ rldicl r9,r9,0,56 ++ subf r9,r9,3 ++ extsw r9,r9 ++ mr r3,r9 ++ blr ++ ++ /* If unaligned 16 bytes reads across a 4K page boundary, it uses ++ a simple byte a byte comparison until the page alignment for s1 ++ is reached. */ ++ .align 4 ++L(pagecross): ++ lbz r7,0(r3) ++ lbz r9,0(r4) ++ subfic r8,r8,4095 ++ cmplw cr7,r9,r7 ++ bne cr7,L(byte_ne_3) ++ cmpdi cr7,r9,0 ++ beq cr7,L(byte_ne_0) ++ addi r10,r10,-1 ++ subf r7,r8,r10 ++ subf r9,r7,r10 ++ addi r9,r9,1 ++ mtctr r9 ++ b L(pagecross_loop1) ++ ++ .align 4 ++L(pagecross_loop0): ++ beq cr7,L(ret0) ++ lbz r9,0(r3) ++ lbz r8,0(r4) ++ addi r10,r10,-1 ++ cmplw cr7,r9,r8 ++ cmpdi cr5,r9,0 ++ bne r7,L(byte_ne_2) ++ beq r5,L(byte_ne_0) ++L(pagecross_loop1): ++ cmpdi cr7,r10,0 ++ addi r3,r3,1 ++ addi r4,r4,1 ++ bdnz L(pagecross_loop0) ++ cmpdi cr7,r7,0 ++ li r9,0 ++ bne+ cr7,L(align_8b) ++ b L(ret1) ++ ++ /* If both source1 and source2 are doubleword aligned, there is no ++ need for page boundary cross checks. */ ++ .align 4 ++L(loop_eq_align_0): ++ ld r7,0(r3) ++ ld r9,0(r4) ++ cmpb r8,r7,r8 ++ cmpb r6,r7,r9 ++ orc. r8,r8,r6 ++ bne cr0,L(different1) ++ ++ cmpldi cr7,r10,8 ++ ble cr7,L(ret0) ++ addi r9,r10,-9 ++ ++ li r5,0 ++ srdi r9,r9,3 ++ addi r9,r9,1 ++ mtctr r9 ++ b L(loop_eq_align_2) ++ ++ .align 4 ++L(loop_eq_align_1): ++ bdz L(ret0) ++L(loop_eq_align_2): ++ ldu r7,8(r3) ++ addi r10,r10,-8 ++ ldu r9,8(r4) ++ cmpb r8,r7,r5 ++ cmpb r6,r7,r9 ++ orc. r8,r8,r6 ++ beq cr0,L(loop_eq_align_1) ++ b L(different1) ++ ++ .align 4 ++L(byte_ne_0): ++ li r7,0 ++L(byte_ne_1): ++ subf r9,r9,r7 ++ extsw r9,r9 ++ b L(ret1) ++ ++ .align 4 ++L(byte_ne_2): ++ extsw r7,r9 ++ mr r9,r8 ++ b L(byte_ne_1) ++L(size_reached_0): ++ li r10,0 ++L(size_reached_1): ++ subf r9,r9,r10 ++ extsw r9,r9 ++ b L(ret1) ++L(size_reached_2): ++ extsw r10,r9 ++ mr r9,r7 ++ b L(size_reached_1) ++L(byte_ne_3): ++ extsw r7,r7 ++ b L(byte_ne_1) ++L(byte_ne_4): ++ extsw r10,r9 ++ mr r9,r8 ++ b L(size_reached_1) ++END(strncmp) ++libc_hidden_builtin_def(strncmp) diff --git a/SOURCES/glibc-rh1240351-12.patch b/SOURCES/glibc-rh1240351-12.patch new file mode 100644 index 0000000..de55a65 --- /dev/null +++ b/SOURCES/glibc-rh1240351-12.patch @@ -0,0 +1,1375 @@ + Backport of + commit ce6615c9c686acd34672a9f4eba9bcf5553496f6 + Author: Adhemerval Zanella + Date: Sun Jan 11 19:33:17 2015 -0600 + + powerpc: Fix POWER7/PPC64 performance regression on LE + + This patch fixes a performance regression on the POWER7/PPC64 memcmp + porting for Little Endian. The LE code uses 'ldbrx' instruction to read + the memory on byte reversed form, however ISA 2.06 just provide the indexed + form which uses a register value as additional index, instead of a fixed value + enconded in the instruction. + + And the port strategy for LE uses r0 index value and update the address + value on each compare loop interation. For large compare size values, + it adds 8 more instructions plus some more depending of trailing + size. This patch fixes it by adding pre-calculate indexes to remove the + address update on loops and tailing sizes. + + For large sizes it shows a considerable gain, with double performance + pairing with BE. + + ChangeLog: + 2015-01-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/power7/memcmp.S (memcmp): Fix performance + regression on LE. + +diff --git a/sysdeps/powerpc/powerpc64/power7/memcmp.S b/sysdeps/powerpc/powerpc64/power7/memcmp.S +index 09bff69..98b9e54 100644 +--- a/sysdeps/powerpc/powerpc64/power7/memcmp.S ++++ b/sysdeps/powerpc/powerpc64/power7/memcmp.S +@@ -26,18 +26,48 @@ + EALIGN (memcmp, 4, 0) + CALL_MCOUNT 3 + +-#define rRTN r3 +-#define rSTR1 r3 /* first string arg */ +-#define rSTR2 r4 /* second string arg */ +-#define rN r5 /* max string length */ +-#define rWORD1 r6 /* current word in s1 */ +-#define rWORD2 r7 /* current word in s2 */ +-#define rWORD3 r8 /* next word in s1 */ +-#define rWORD4 r9 /* next word in s2 */ +-#define rWORD5 r10 /* next word in s1 */ +-#define rWORD6 r11 /* next word in s2 */ +-#define rWORD7 r30 /* next word in s1 */ +-#define rWORD8 r31 /* next word in s2 */ ++#define rRTN r3 ++#define rSTR1 r3 /* first string arg */ ++#define rSTR2 r4 /* second string arg */ ++#define rN r5 /* max string length */ ++#define rWORD1 r6 /* current word in s1 */ ++#define rWORD2 r7 /* current word in s2 */ ++#define rWORD3 r8 /* next word in s1 */ ++#define rWORD4 r9 /* next word in s2 */ ++#define rWORD5 r10 /* next word in s1 */ ++#define rWORD6 r11 /* next word in s2 */ ++ ++#define rOFF8 r20 /* 8 bytes offset. */ ++#define rOFF16 r21 /* 16 bytes offset. */ ++#define rOFF24 r22 /* 24 bytes offset. */ ++#define rOFF32 r23 /* 24 bytes offset. */ ++#define rWORD6_SHIFT r24 /* Left rotation temp for rWORD8. */ ++#define rWORD4_SHIFT r25 /* Left rotation temp for rWORD6. */ ++#define rWORD2_SHIFT r26 /* Left rotation temp for rWORD4. */ ++#define rWORD8_SHIFT r27 /* Left rotation temp for rWORD2. */ ++#define rSHR r28 /* Unaligned shift right count. */ ++#define rSHL r29 /* Unaligned shift left count. */ ++#define rWORD7 r30 /* next word in s1 */ ++#define rWORD8 r31 /* next word in s2 */ ++ ++#define rWORD8SAVE (-8) ++#define rWORD7SAVE (-16) ++#define rOFF8SAVE (-24) ++#define rOFF16SAVE (-32) ++#define rOFF24SAVE (-40) ++#define rOFF32SAVE (-48) ++#define rSHRSAVE (-56) ++#define rSHLSAVE (-64) ++#define rWORD8SHIFTSAVE (-72) ++#define rWORD2SHIFTSAVE (-80) ++#define rWORD4SHIFTSAVE (-88) ++#define rWORD6SHIFTSAVE (-96) ++ ++#ifdef __LITTLE_ENDIAN__ ++# define LD ldbrx ++#else ++# define LD ldx ++#endif + + xor r0, rSTR2, rSTR1 + cmpldi cr6, rN, 0 +@@ -51,10 +81,24 @@ EALIGN (memcmp, 4, 0) + /* If less than 8 bytes or not aligned, use the unaligned + byte loop. */ + blt cr1, L(bytealigned) +- std rWORD8, -8(r1) +- cfi_offset(rWORD8, -8) +- std rWORD7, -16(r1) +- cfi_offset(rWORD7, -16) ++ std rWORD8, rWORD8SAVE(r1) ++ cfi_offset(rWORD8, rWORD8SAVE) ++ std rWORD7, rWORD7SAVE(r1) ++ cfi_offset(rWORD7, rWORD7SAVE) ++ std rOFF8, rOFF8SAVE(r1) ++ cfi_offset(rWORD7, rOFF8SAVE) ++ std rOFF16, rOFF16SAVE(r1) ++ cfi_offset(rWORD7, rOFF16SAVE) ++ std rOFF24, rOFF24SAVE(r1) ++ cfi_offset(rWORD7, rOFF24SAVE) ++ std rOFF32, rOFF32SAVE(r1) ++ cfi_offset(rWORD7, rOFF32SAVE) ++ ++ li rOFF8,8 ++ li rOFF16,16 ++ li rOFF24,24 ++ li rOFF32,32 ++ + bne L(unaligned) + /* At this point we know both strings have the same alignment and the + compare length is at least 8 bytes. r12 contains the low order +@@ -79,15 +123,8 @@ L(samealignment): + sldi rWORD6, r12, 3 + srdi r0, rN, 5 /* Divide by 32 */ + andi. r12, rN, 24 /* Get the DW remainder */ +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 0(rSTR1) +- ld rWORD2, 0(rSTR2) +-#endif ++ LD rWORD1, 0, rSTR1 ++ LD rWORD2, 0, rSTR2 + cmpldi cr1, r12, 16 + cmpldi cr7, rN, 32 + clrldi rN, rN, 61 +@@ -104,15 +141,8 @@ L(dsP1): + cmpld cr5, rWORD5, rWORD6 + blt cr7, L(dP1x) + /* Do something useful in this cycle since we have to branch anyway. */ +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 8(rSTR1) +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD1, rOFF8, rSTR1 ++ LD rWORD2, rOFF8, rSTR2 + cmpld cr7, rWORD1, rWORD2 + b L(dP1e) + /* Remainder is 16 */ +@@ -123,15 +153,8 @@ L(dPs2): + cmpld cr6, rWORD5, rWORD6 + blt cr7, L(dP2x) + /* Do something useful in this cycle since we have to branch anyway. */ +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD7, 8(rSTR1) +- ld rWORD8, 8(rSTR2) +-#endif ++ LD rWORD7, rOFF8, rSTR1 ++ LD rWORD8, rOFF8, rSTR2 + cmpld cr5, rWORD7, rWORD8 + b L(dP2e) + /* Remainder is 24 */ +@@ -173,72 +196,43 @@ L(dP1): + change any on the early exit path. The key here is the non-early + exit path only cares about the condition code (cr5), not about which + register pair was used. */ +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 0(rSTR1) +- ld rWORD6, 0(rSTR2) +-#endif ++ LD rWORD5, 0, rSTR1 ++ LD rWORD6, 0, rSTR2 + cmpld cr5, rWORD5, rWORD6 + blt cr7, L(dP1x) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 8(rSTR1) +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD1, rOFF8, rSTR1 ++ LD rWORD2, rOFF8, rSTR2 + cmpld cr7, rWORD1, rWORD2 + L(dP1e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 16(rSTR1) +- ld rWORD4, 16(rSTR2) +-#endif ++ LD rWORD3, rOFF16, rSTR1 ++ LD rWORD4, rOFF16, rSTR2 + cmpld cr1, rWORD3, rWORD4 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 24(rSTR1) +- ld rWORD6, 24(rSTR2) +-#endif ++ LD rWORD5, rOFF24, rSTR1 ++ LD rWORD6, rOFF24, rSTR2 + cmpld cr6, rWORD5, rWORD6 + bne cr5, L(dLcr5x) + bne cr7, L(dLcr7x) + +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ldu rWORD7, 32(rSTR1) +- ldu rWORD8, 32(rSTR2) +-#endif ++ LD rWORD7, rOFF32, rSTR1 ++ LD rWORD8, rOFF32, rSTR2 ++ addi rSTR1, rSTR1, 32 ++ addi rSTR2, rSTR2, 32 + bne cr1, L(dLcr1) + cmpld cr5, rWORD7, rWORD8 + bdnz L(dLoop) + bne cr6, L(dLcr6) +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + .align 3 + L(dP1x): + sldi. r12, rN, 3 + bne cr5, L(dLcr5x) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + bne L(d00) ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 0 + blr + +@@ -246,79 +240,41 @@ L(dP1x): + .align 4 + L(dP2): + mtctr r0 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 0(rSTR1) +- ld rWORD6, 0(rSTR2) +-#endif ++ LD rWORD5, 0, rSTR1 ++ LD rWORD6, 0, rSTR2 + cmpld cr6, rWORD5, rWORD6 + blt cr7, L(dP2x) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD7, 8(rSTR1) +- ld rWORD8, 8(rSTR2) +-#endif ++ LD rWORD7, rOFF8, rSTR1 ++ LD rWORD8, rOFF8, rSTR2 + cmpld cr5, rWORD7, rWORD8 + L(dP2e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 16(rSTR1) +- ld rWORD2, 16(rSTR2) +-#endif ++ LD rWORD1, rOFF16, rSTR1 ++ LD rWORD2, rOFF16, rSTR2 + cmpld cr7, rWORD1, rWORD2 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 24(rSTR1) +- ld rWORD4, 24(rSTR2) +-#endif ++ LD rWORD3, rOFF24, rSTR1 ++ LD rWORD4, rOFF24, rSTR2 + cmpld cr1, rWORD3, rWORD4 +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 +-#endif + bne cr6, L(dLcr6) + bne cr5, L(dLcr5) + b L(dLoop2) +-/* Again we are on a early exit path (16-23 byte compare), we want to +- only use volatile registers and avoid restoring non-volatile +- registers. */ + .align 4 + L(dP2x): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 8(rSTR1) +- ld rWORD4, 8(rSTR2) +-#endif ++ LD rWORD3, rOFF8, rSTR1 ++ LD rWORD4, rOFF8, rSTR2 + cmpld cr1, rWORD3, rWORD4 + sldi. r12, rN, 3 + bne cr6, L(dLcr6x) +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 +-#endif + bne cr1, L(dLcr1x) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + bne L(d00) ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 0 + blr + +@@ -326,52 +282,22 @@ L(dP2x): + .align 4 + L(dP3): + mtctr r0 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 0(rSTR1) +- ld rWORD4, 0(rSTR2) +-#endif ++ LD rWORD3, 0, rSTR1 ++ LD rWORD4, 0, rSTR2 + cmpld cr1, rWORD3, rWORD4 + L(dP3e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 8(rSTR1) +- ld rWORD6, 8(rSTR2) +-#endif ++ LD rWORD5, rOFF8, rSTR1 ++ LD rWORD6, rOFF8, rSTR2 + cmpld cr6, rWORD5, rWORD6 + blt cr7, L(dP3x) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD7, 16(rSTR1) +- ld rWORD8, 16(rSTR2) +-#endif ++ LD rWORD7, rOFF16, rSTR1 ++ LD rWORD8, rOFF16, rSTR2 + cmpld cr5, rWORD7, rWORD8 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 24(rSTR1) +- ld rWORD2, 24(rSTR2) +-#endif ++ LD rWORD1, rOFF24, rSTR1 ++ LD rWORD2, rOFF24, rSTR2 + cmpld cr7, rWORD1, rWORD2 +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 16 + addi rSTR2, rSTR2, 16 +-#endif + bne cr1, L(dLcr1) + bne cr6, L(dLcr6) + b L(dLoop1) +@@ -380,26 +306,21 @@ L(dP3e): + registers. */ + .align 4 + L(dP3x): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 16(rSTR1) +- ld rWORD2, 16(rSTR2) +-#endif ++ LD rWORD1, rOFF16, rSTR1 ++ LD rWORD2, rOFF16, rSTR2 + cmpld cr7, rWORD1, rWORD2 + sldi. r12, rN, 3 + bne cr1, L(dLcr1x) +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 16 + addi rSTR2, rSTR2, 16 +-#endif + bne cr6, L(dLcr6x) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + bne cr7, L(dLcr7x) + bne L(d00) ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 0 + blr + +@@ -407,46 +328,20 @@ L(dP3x): + .align 4 + L(dP4): + mtctr r0 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 0(rSTR1) +- ld rWORD2, 0(rSTR2) +-#endif ++ LD rWORD1, 0, rSTR1 ++ LD rWORD2, 0, rSTR2 + cmpld cr7, rWORD1, rWORD2 + L(dP4e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 8(rSTR1) +- ld rWORD4, 8(rSTR2) +-#endif ++ LD rWORD3, rOFF8, rSTR1 ++ LD rWORD4, rOFF8, rSTR2 + cmpld cr1, rWORD3, rWORD4 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 16(rSTR1) +- ld rWORD6, 16(rSTR2) +-#endif ++ LD rWORD5, rOFF16, rSTR1 ++ LD rWORD6, rOFF16, rSTR2 + cmpld cr6, rWORD5, rWORD6 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ldu rWORD7, 24(rSTR1) +- ldu rWORD8, 24(rSTR2) +-#endif ++ LD rWORD7, rOFF24, rSTR1 ++ LD rWORD8, rOFF24, rSTR2 ++ addi rSTR1, rSTR1, 24 ++ addi rSTR2, rSTR2, 24 + cmpld cr5, rWORD7, rWORD8 + bne cr7, L(dLcr7) + bne cr1, L(dLcr1) +@@ -454,51 +349,25 @@ L(dP4e): + /* This is the primary loop */ + .align 4 + L(dLoop): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 8(rSTR1) +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD1, rOFF8, rSTR1 ++ LD rWORD2, rOFF8, rSTR2 + cmpld cr1, rWORD3, rWORD4 + bne cr6, L(dLcr6) + L(dLoop1): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 16(rSTR1) +- ld rWORD4, 16(rSTR2) +-#endif ++ LD rWORD3, rOFF16, rSTR1 ++ LD rWORD4, rOFF16, rSTR2 + cmpld cr6, rWORD5, rWORD6 + bne cr5, L(dLcr5) + L(dLoop2): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 24(rSTR1) +- ld rWORD6, 24(rSTR2) +-#endif ++ LD rWORD5, rOFF24, rSTR1 ++ LD rWORD6, rOFF24, rSTR2 + cmpld cr5, rWORD7, rWORD8 + bne cr7, L(dLcr7) + L(dLoop3): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ldu rWORD7, 32(rSTR1) +- ldu rWORD8, 32(rSTR2) +-#endif ++ LD rWORD7, rOFF32, rSTR1 ++ LD rWORD8, rOFF32, rSTR2 ++ addi rSTR1, rSTR1, 32 ++ addi rSTR2, rSTR2, 32 + bne cr1, L(dLcr1) + cmpld cr7, rWORD1, rWORD2 + bdnz L(dLoop) +@@ -519,62 +388,75 @@ L(d14): + sldi. r12, rN, 3 + bne cr5, L(dLcr5) + L(d04): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ +- beq L(zeroLength) ++ beq L(duzeroLength) + /* At this point we have a remainder of 1 to 7 bytes to compare. Since + we are aligned it is safe to load the whole double word, and use + shift right double to eliminate bits beyond the compare length. */ + L(d00): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 8(rSTR1) +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD1, rOFF8, rSTR1 ++ LD rWORD2, rOFF8, rSTR2 + srd rWORD1, rWORD1, rN + srd rWORD2, rWORD2, rN + cmpld cr7, rWORD1, rWORD2 + bne cr7, L(dLcr7x) ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 0 + blr + + .align 4 + L(dLcr7): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + L(dLcr7x): ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 1 + bgtlr cr7 + li rRTN, -1 + blr + .align 4 + L(dLcr1): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + L(dLcr1x): ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 1 + bgtlr cr1 + li rRTN, -1 + blr + .align 4 + L(dLcr6): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + L(dLcr6x): ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 1 + bgtlr cr6 + li rRTN, -1 + blr + .align 4 + L(dLcr5): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + L(dLcr5x): ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 1 + bgtlr cr5 + li rRTN, -1 +@@ -583,10 +465,6 @@ L(dLcr5x): + .align 4 + L(bytealigned): + mtctr rN +-#if 0 +-/* Huh? We've already branched on cr6! */ +- beq cr6, L(zeroLength) +-#endif + + /* We need to prime this loop. This loop is swing modulo scheduled + to avoid pipe delays. The dependent instruction latencies (load to +@@ -685,6 +563,7 @@ L(b11): + L(bx12): + sub rRTN, rWORD1, rWORD2 + blr ++ + .align 4 + L(zeroLength): + li rRTN, 0 +@@ -705,42 +584,36 @@ L(zeroLength): + we need to adjust the length (rN) and special case the loop + versioning for the first DW. This ensures that the loop count is + correct and the first DW (shifted) is in the expected resister pair. */ +-#define rSHL r29 /* Unaligned shift left count. */ +-#define rSHR r28 /* Unaligned shift right count. */ +-#define rWORD8_SHIFT r27 /* Left rotation temp for rWORD2. */ +-#define rWORD2_SHIFT r26 /* Left rotation temp for rWORD4. */ +-#define rWORD4_SHIFT r25 /* Left rotation temp for rWORD6. */ +-#define rWORD6_SHIFT r24 /* Left rotation temp for rWORD8. */ + L(unaligned): +- std rSHL, -24(r1) +- cfi_offset(rSHL, -24) ++ std rSHL, rSHLSAVE(r1) ++ cfi_offset(rSHL, rSHLSAVE) + clrldi rSHL, rSTR2, 61 + beq cr6, L(duzeroLength) +- std rSHR, -32(r1) +- cfi_offset(rSHR, -32) ++ std rSHR, rSHRSAVE(r1) ++ cfi_offset(rSHR, rSHRSAVE) + beq cr5, L(DWunaligned) +- std rWORD8_SHIFT, -40(r1) +- cfi_offset(rWORD8_SHIFT, -40) ++ std rWORD8_SHIFT, rWORD8SHIFTSAVE(r1) ++ cfi_offset(rWORD8_SHIFT, rWORD8SHIFTSAVE) + /* Adjust the logical start of rSTR2 to compensate for the extra bits + in the 1st rSTR1 DW. */ + sub rWORD8_SHIFT, rSTR2, r12 + /* But do not attempt to address the DW before that DW that contains + the actual start of rSTR2. */ + clrrdi rSTR2, rSTR2, 3 +- std rWORD2_SHIFT, -48(r1) +- cfi_offset(rWORD2_SHIFT, -48) ++ std rWORD2_SHIFT, rWORD2SHIFTSAVE(r1) ++ cfi_offset(rWORD2_SHIFT, rWORD2SHIFTSAVE) + /* Compute the left/right shift counts for the unaligned rSTR2, + compensating for the logical (DW aligned) start of rSTR1. */ + clrldi rSHL, rWORD8_SHIFT, 61 + clrrdi rSTR1, rSTR1, 3 +- std rWORD4_SHIFT, -56(r1) +- cfi_offset(rWORD4_SHIFT, -56) ++ std rWORD4_SHIFT, rWORD4SHIFTSAVE(r1) ++ cfi_offset(rWORD4_SHIFT, rWORD4SHIFTSAVE) + sldi rSHL, rSHL, 3 + cmpld cr5, rWORD8_SHIFT, rSTR2 + add rN, rN, r12 + sldi rWORD6, r12, 3 +- std rWORD6_SHIFT, -64(r1) +- cfi_offset(rWORD6_SHIFT, -64) ++ std rWORD6_SHIFT, rWORD6SHIFTSAVE(r1) ++ cfi_offset(rWORD6_SHIFT, rWORD6SHIFTSAVE) + subfic rSHR, rSHL, 64 + srdi r0, rN, 5 /* Divide by 32 */ + andi. r12, rN, 24 /* Get the DW remainder */ +@@ -750,25 +623,13 @@ L(unaligned): + this may cross a page boundary and cause a page fault. */ + li rWORD8, 0 + blt cr5, L(dus0) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD8, 0, rSTR2 ++ LD rWORD8, 0, rSTR2 + addi rSTR2, rSTR2, 8 +-#else +- ld rWORD8, 0(rSTR2) +- addi rSTR2, rSTR2, 8 +-#endif + sld rWORD8, rWORD8, rSHL + + L(dus0): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 0(rSTR1) +- ld rWORD2, 0(rSTR2) +-#endif ++ LD rWORD1, 0, rSTR1 ++ LD rWORD2, 0, rSTR2 + cmpldi cr1, r12, 16 + cmpldi cr7, rN, 32 + srd r12, rWORD2, rSHR +@@ -796,12 +657,7 @@ L(dusP1): + beq L(duZeroReturn) + li r0, 0 + ble cr7, L(dutrim) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD2, rOFF8, rSTR2 + srd r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 16 */ +@@ -832,27 +688,21 @@ L(duPs4): + compare length is at least 8 bytes. */ + .align 4 + L(DWunaligned): +- std rWORD8_SHIFT, -40(r1) +- cfi_offset(rWORD8_SHIFT, -40) ++ std rWORD8_SHIFT, rWORD8SHIFTSAVE(r1) ++ cfi_offset(rWORD8_SHIFT, rWORD8SHIFTSAVE) + clrrdi rSTR2, rSTR2, 3 +- std rWORD2_SHIFT, -48(r1) +- cfi_offset(rWORD2_SHIFT, -48) ++ std rWORD2_SHIFT, rWORD2SHIFTSAVE(r1) ++ cfi_offset(rWORD2_SHIFT, rWORD2SHIFTSAVE) + srdi r0, rN, 5 /* Divide by 32 */ +- std rWORD4_SHIFT, -56(r1) +- cfi_offset(rWORD4_SHIFT, -56) ++ std rWORD4_SHIFT, rWORD4SHIFTSAVE(r1) ++ cfi_offset(rWORD4_SHIFT, rWORD4SHIFTSAVE) + andi. r12, rN, 24 /* Get the DW remainder */ +- std rWORD6_SHIFT, -64(r1) +- cfi_offset(rWORD6_SHIFT, -64) ++ std rWORD6_SHIFT, rWORD6SHIFTSAVE(r1) ++ cfi_offset(rWORD6_SHIFT, rWORD6SHIFTSAVE) + sldi rSHL, rSHL, 3 +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD6, 0, rSTR2 ++ LD rWORD6, 0, rSTR2 ++ LD rWORD8, rOFF8, rSTR2 + addi rSTR2, rSTR2, 8 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD6, 0(rSTR2) +- ldu rWORD8, 8(rSTR2) +-#endif + cmpldi cr1, r12, 16 + cmpldi cr7, rN, 32 + clrldi rN, rN, 61 +@@ -867,52 +717,26 @@ L(DWunaligned): + .align 4 + L(duP1): + srd r12, rWORD8, rSHR +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- addi rSTR1, rSTR1, 8 +-#else +- ld rWORD7, 0(rSTR1) +-#endif ++ LD rWORD7, 0, rSTR1 + sld rWORD8_SHIFT, rWORD8, rSHL + or rWORD8, r12, rWORD6_SHIFT + blt cr7, L(duP1x) + L(duP1e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 8(rSTR1) +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD1, rOFF8, rSTR1 ++ LD rWORD2, rOFF8, rSTR2 + cmpld cr5, rWORD7, rWORD8 + srd r0, rWORD2, rSHR + sld rWORD2_SHIFT, rWORD2, rSHL + or rWORD2, r0, rWORD8_SHIFT +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 16(rSTR1) +- ld rWORD4, 16(rSTR2) +-#endif ++ LD rWORD3, rOFF16, rSTR1 ++ LD rWORD4, rOFF16, rSTR2 + cmpld cr7, rWORD1, rWORD2 + srd r12, rWORD4, rSHR + sld rWORD4_SHIFT, rWORD4, rSHL + bne cr5, L(duLcr5) + or rWORD4, r12, rWORD2_SHIFT +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 24(rSTR1) +- ld rWORD6, 24(rSTR2) +-#endif ++ LD rWORD5, rOFF24, rSTR1 ++ LD rWORD6, rOFF24, rSTR2 + cmpld cr1, rWORD3, rWORD4 + srd r0, rWORD6, rSHR + sld rWORD6_SHIFT, rWORD6, rSHL +@@ -932,82 +756,47 @@ L(duP1x): + beq L(duZeroReturn) + li r0, 0 + ble cr7, L(dutrim) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD2, rOFF8, rSTR2 + srd r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 16 */ + .align 4 + L(duP2): + srd r0, rWORD8, rSHR +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- addi rSTR1, rSTR1, 8 +-#else +- ld rWORD5, 0(rSTR1) +-#endif ++ LD rWORD5, 0, rSTR1 + or rWORD6, r0, rWORD6_SHIFT + sld rWORD6_SHIFT, rWORD8, rSHL + L(duP2e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD7, 8(rSTR1) +- ld rWORD8, 8(rSTR2) +-#endif ++ LD rWORD7, rOFF8, rSTR1 ++ LD rWORD8, rOFF8, rSTR2 + cmpld cr6, rWORD5, rWORD6 + srd r12, rWORD8, rSHR + sld rWORD8_SHIFT, rWORD8, rSHL + or rWORD8, r12, rWORD6_SHIFT + blt cr7, L(duP2x) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 16(rSTR1) +- ld rWORD2, 16(rSTR2) +-#endif ++ LD rWORD1, rOFF16, rSTR1 ++ LD rWORD2, rOFF16, rSTR2 + cmpld cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) + srd r0, rWORD2, rSHR + sld rWORD2_SHIFT, rWORD2, rSHL + or rWORD2, r0, rWORD8_SHIFT +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 24(rSTR1) +- ld rWORD4, 24(rSTR2) +-#endif ++ LD rWORD3, rOFF24, rSTR1 ++ LD rWORD4, rOFF24, rSTR2 + cmpld cr7, rWORD1, rWORD2 + bne cr5, L(duLcr5) + srd r12, rWORD4, rSHR + sld rWORD4_SHIFT, rWORD4, rSHL + or rWORD4, r12, rWORD2_SHIFT +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 +-#endif + cmpld cr1, rWORD3, rWORD4 + b L(duLoop2) + .align 4 + L(duP2x): + cmpld cr5, rWORD7, rWORD8 +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 +-#endif + bne cr6, L(duLcr6) + sldi. rN, rN, 3 + bne cr5, L(duLcr5) +@@ -1015,12 +804,7 @@ L(duP2x): + beq L(duZeroReturn) + li r0, 0 + ble cr7, L(dutrim) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD2, rOFF8, rSTR2 + srd r0, rWORD2, rSHR + b L(dutrim) + +@@ -1028,73 +812,39 @@ L(duP2x): + .align 4 + L(duP3): + srd r12, rWORD8, rSHR +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- addi rSTR1, rSTR1, 8 +-#else +- ld rWORD3, 0(rSTR1) +-#endif ++ LD rWORD3, 0, rSTR1 + sld rWORD4_SHIFT, rWORD8, rSHL + or rWORD4, r12, rWORD6_SHIFT + L(duP3e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 8(rSTR1) +- ld rWORD6, 8(rSTR2) +-#endif ++ LD rWORD5, rOFF8, rSTR1 ++ LD rWORD6, rOFF8, rSTR2 + cmpld cr1, rWORD3, rWORD4 + srd r0, rWORD6, rSHR + sld rWORD6_SHIFT, rWORD6, rSHL + or rWORD6, r0, rWORD4_SHIFT +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD7, 16(rSTR1) +- ld rWORD8, 16(rSTR2) +-#endif ++ LD rWORD7, rOFF16, rSTR1 ++ LD rWORD8, rOFF16, rSTR2 + cmpld cr6, rWORD5, rWORD6 + bne cr1, L(duLcr1) + srd r12, rWORD8, rSHR + sld rWORD8_SHIFT, rWORD8, rSHL + or rWORD8, r12, rWORD6_SHIFT + blt cr7, L(duP3x) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 24(rSTR1) +- ld rWORD2, 24(rSTR2) +-#endif ++ LD rWORD1, rOFF24, rSTR1 ++ LD rWORD2, rOFF24, rSTR2 + cmpld cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) + srd r0, rWORD2, rSHR + sld rWORD2_SHIFT, rWORD2, rSHL + or rWORD2, r0, rWORD8_SHIFT +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 16 + addi rSTR2, rSTR2, 16 +-#endif + cmpld cr7, rWORD1, rWORD2 + b L(duLoop1) + .align 4 + L(duP3x): +-#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 16 + addi rSTR2, rSTR2, 16 +-#endif +-#if 0 +-/* Huh? We've already branched on cr1! */ +- bne cr1, L(duLcr1) +-#endif + cmpld cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) + sldi. rN, rN, 3 +@@ -1103,12 +853,7 @@ L(duP3x): + beq L(duZeroReturn) + li r0, 0 + ble cr7, L(dutrim) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD2, rOFF8, rSTR2 + srd r0, rWORD2, rSHR + b L(dutrim) + +@@ -1117,51 +862,27 @@ L(duP3x): + L(duP4): + mtctr r0 + srd r0, rWORD8, rSHR +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- addi rSTR1, rSTR1, 8 +-#else +- ld rWORD1, 0(rSTR1) +-#endif ++ LD rWORD1, 0, rSTR1 + sld rWORD2_SHIFT, rWORD8, rSHL + or rWORD2, r0, rWORD6_SHIFT + L(duP4e): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 8(rSTR1) +- ld rWORD4, 8(rSTR2) +-#endif ++ LD rWORD3, rOFF8, rSTR1 ++ LD rWORD4, rOFF8, rSTR2 + cmpld cr7, rWORD1, rWORD2 + srd r12, rWORD4, rSHR + sld rWORD4_SHIFT, rWORD4, rSHL + or rWORD4, r12, rWORD2_SHIFT +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 16(rSTR1) +- ld rWORD6, 16(rSTR2) +-#endif ++ LD rWORD5, rOFF16, rSTR1 ++ LD rWORD6, rOFF16, rSTR2 + cmpld cr1, rWORD3, rWORD4 + bne cr7, L(duLcr7) + srd r0, rWORD6, rSHR + sld rWORD6_SHIFT, rWORD6, rSHL + or rWORD6, r0, rWORD4_SHIFT +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ldu rWORD7, 24(rSTR1) +- ldu rWORD8, 24(rSTR2) +-#endif ++ LD rWORD7, rOFF24, rSTR1 ++ LD rWORD8, rOFF24, rSTR2 ++ addi rSTR1, rSTR1, 24 ++ addi rSTR2, rSTR2, 24 + cmpld cr6, rWORD5, rWORD6 + bne cr1, L(duLcr1) + srd r12, rWORD8, rSHR +@@ -1172,60 +893,34 @@ L(duP4e): + /* This is the primary loop */ + .align 4 + L(duLoop): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD1, 8(rSTR1) +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD1, rOFF8, rSTR1 ++ LD rWORD2, rOFF8, rSTR2 + cmpld cr1, rWORD3, rWORD4 + bne cr6, L(duLcr6) + srd r0, rWORD2, rSHR + sld rWORD2_SHIFT, rWORD2, rSHL + or rWORD2, r0, rWORD8_SHIFT + L(duLoop1): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD3, 0, rSTR1 +- ldbrx rWORD4, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD3, 16(rSTR1) +- ld rWORD4, 16(rSTR2) +-#endif ++ LD rWORD3, rOFF16, rSTR1 ++ LD rWORD4, rOFF16, rSTR2 + cmpld cr6, rWORD5, rWORD6 + bne cr5, L(duLcr5) + srd r12, rWORD4, rSHR + sld rWORD4_SHIFT, rWORD4, rSHL + or rWORD4, r12, rWORD2_SHIFT + L(duLoop2): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD5, 0, rSTR1 +- ldbrx rWORD6, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD5, 24(rSTR1) +- ld rWORD6, 24(rSTR2) +-#endif ++ LD rWORD5, rOFF24, rSTR1 ++ LD rWORD6, rOFF24, rSTR2 + cmpld cr5, rWORD7, rWORD8 + bne cr7, L(duLcr7) + srd r0, rWORD6, rSHR + sld rWORD6_SHIFT, rWORD6, rSHL + or rWORD6, r0, rWORD4_SHIFT + L(duLoop3): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD7, 0, rSTR1 +- ldbrx rWORD8, 0, rSTR2 +- addi rSTR1, rSTR1, 8 +- addi rSTR2, rSTR2, 8 +-#else +- ldu rWORD7, 32(rSTR1) +- ldu rWORD8, 32(rSTR2) +-#endif ++ LD rWORD7, rOFF32, rSTR1 ++ LD rWORD8, rOFF32, rSTR2 ++ addi rSTR1, rSTR1, 32 ++ addi rSTR2, rSTR2, 32 + cmpld cr7, rWORD1, rWORD2 + bne cr1, L(duLcr1) + srd r12, rWORD8, rSHR +@@ -1234,10 +929,6 @@ L(duLoop3): + bdnz L(duLoop) + + L(duL4): +-#if 0 +-/* Huh? We've already branched on cr1! */ +- bne cr1, L(duLcr1) +-#endif + cmpld cr1, rWORD3, rWORD4 + bne cr6, L(duLcr6) + cmpld cr6, rWORD5, rWORD6 +@@ -1264,99 +955,102 @@ L(du14): + beq L(duZeroReturn) + li r0, 0 + ble cr7, L(dutrim) +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD2, 0, rSTR2 +- addi rSTR2, rSTR2, 8 +-#else +- ld rWORD2, 8(rSTR2) +-#endif ++ LD rWORD2, rOFF8, rSTR2 + srd r0, rWORD2, rSHR + .align 4 + L(dutrim): +-#ifdef __LITTLE_ENDIAN__ +- ldbrx rWORD1, 0, rSTR1 +-#else +- ld rWORD1, 8(rSTR1) +-#endif ++ LD rWORD1, rOFF8, rSTR1 + ld rWORD8, -8(r1) + subfic rN, rN, 64 /* Shift count is 64 - (rN * 8). */ + or rWORD2, r0, rWORD8_SHIFT +- ld rWORD7, -16(r1) +- ld rSHL, -24(r1) ++ ld rWORD7, rWORD7SAVE(r1) ++ ld rSHL, rSHLSAVE(r1) + srd rWORD1, rWORD1, rN + srd rWORD2, rWORD2, rN +- ld rSHR, -32(r1) +- ld rWORD8_SHIFT, -40(r1) ++ ld rSHR, rSHRSAVE(r1) ++ ld rWORD8_SHIFT, rWORD8SHIFTSAVE(r1) + li rRTN, 0 + cmpld cr7, rWORD1, rWORD2 +- ld rWORD2_SHIFT, -48(r1) +- ld rWORD4_SHIFT, -56(r1) ++ ld rWORD2_SHIFT, rWORD2SHIFTSAVE(r1) ++ ld rWORD4_SHIFT, rWORD4SHIFTSAVE(r1) + beq cr7, L(dureturn24) + li rRTN, 1 +- ld rWORD6_SHIFT, -64(r1) ++ ld rWORD6_SHIFT, rWORD6SHIFTSAVE(r1) ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + bgtlr cr7 + li rRTN, -1 + blr + .align 4 + L(duLcr7): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + li rRTN, 1 + bgt cr7, L(dureturn29) +- ld rSHL, -24(r1) +- ld rSHR, -32(r1) ++ ld rSHL, rSHLSAVE(r1) ++ ld rSHR, rSHRSAVE(r1) + li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr1): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + li rRTN, 1 + bgt cr1, L(dureturn29) +- ld rSHL, -24(r1) +- ld rSHR, -32(r1) ++ ld rSHL, rSHLSAVE(r1) ++ ld rSHR, rSHRSAVE(r1) + li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr6): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + li rRTN, 1 + bgt cr6, L(dureturn29) +- ld rSHL, -24(r1) +- ld rSHR, -32(r1) ++ ld rSHL, rSHLSAVE(r1) ++ ld rSHR, rSHRSAVE(r1) + li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr5): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + li rRTN, 1 + bgt cr5, L(dureturn29) +- ld rSHL, -24(r1) +- ld rSHR, -32(r1) ++ ld rSHL, rSHLSAVE(r1) ++ ld rSHR, rSHRSAVE(r1) + li rRTN, -1 + b L(dureturn27) ++ + .align 3 + L(duZeroReturn): + li rRTN, 0 + .align 4 + L(dureturn): +- ld rWORD8, -8(r1) +- ld rWORD7, -16(r1) ++ ld rWORD8, rWORD8SAVE(r1) ++ ld rWORD7, rWORD7SAVE(r1) + L(dureturn29): +- ld rSHL, -24(r1) +- ld rSHR, -32(r1) ++ ld rSHL, rSHLSAVE(r1) ++ ld rSHR, rSHRSAVE(r1) + L(dureturn27): +- ld rWORD8_SHIFT, -40(r1) +-L(dureturn26): +- ld rWORD2_SHIFT, -48(r1) +-L(dureturn25): +- ld rWORD4_SHIFT, -56(r1) ++ ld rWORD8_SHIFT, rWORD8SHIFTSAVE(r1) ++ ld rWORD2_SHIFT, rWORD2SHIFTSAVE(r1) ++ ld rWORD4_SHIFT, rWORD4SHIFTSAVE(r1) + L(dureturn24): +- ld rWORD6_SHIFT, -64(r1) ++ ld rWORD6_SHIFT, rWORD6SHIFTSAVE(r1) ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + blr ++ + L(duzeroLength): ++ ld rOFF8, rOFF8SAVE(r1) ++ ld rOFF16, rOFF16SAVE(r1) ++ ld rOFF24, rOFF24SAVE(r1) ++ ld rOFF32, rOFF32SAVE(r1) + li rRTN, 0 + blr + diff --git a/SOURCES/glibc-rh1240351-2.patch b/SOURCES/glibc-rh1240351-2.patch new file mode 100644 index 0000000..0d47968 --- /dev/null +++ b/SOURCES/glibc-rh1240351-2.patch @@ -0,0 +1,231 @@ + Backport of: + commit 487972aea52004f604c2878c8c9d3e77670f2c32 + Author: Adhemerval Zanella + Date: Thu Feb 27 09:43:51 2014 -0600 + + PowerPC: Optimized isnan/isnanf for POWER8 + + This patch add a optimized isnan/isnanf implementation for POWER8 + using the new Move From VSR Doubleword instruction to gains some + cycles from FP to GRP register move. + + ChangeLog: + 2014-02-27 Adhemerval Zanella + + * sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h (INIT_ARCH): + Add hwcap2 initialization. + * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile: Add isnan power8 + implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S: New file: + POWER8 isnan ifunc implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c (__isnan): Add + POWER8 implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c (__isnanf): + Likewise. + * sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S: New file: + POWER8 isnan implementation. + * sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S: New file. + +diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h b/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h +index 51a34f2..72d720d 100644 +--- a/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h ++++ b/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h +@@ -36,6 +36,7 @@ + and fills the previous ones. */ + #define INIT_ARCH() \ + unsigned long int hwcap = __GLRO(dl_hwcap); \ ++ unsigned long int __attribute__((unused)) hwcap2 = __GLRO(dl_hwcap2); \ + if (hwcap & PPC_FEATURE_ARCH_2_06) \ + hwcap |= PPC_FEATURE_ARCH_2_05 | \ + PPC_FEATURE_POWER5_PLUS | \ +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile +index 1e04f21..4cd1c5d 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile +@@ -4,7 +4,7 @@ sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \ + s_copysign-ppc64 s_finite-power7 s_finite-ppc64 \ + s_finitef-ppc64 s_isinff-ppc64 s_isinf-power7 \ + s_isinf-ppc64 s_modf-power5+ s_modf-ppc64 \ +- s_modff-power5+ s_modff-ppc64 ++ s_modff-power5+ s_modff-ppc64 s_isnan-power8 + + libm-sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \ + s_isnan-power5 s_isnan-ppc64 s_llround-power6x \ +@@ -21,7 +21,8 @@ libm-sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \ + s_logbl-power7 s_logb-ppc64 s_logbf-ppc64 \ + s_logbl-ppc64 s_modf-power5+ s_modf-ppc64 \ + s_modff-power5+ s_modff-ppc64 e_hypot-ppc64 \ +- e_hypot-power7 e_hypotf-ppc64 e_hypotf-power7 ++ e_hypot-power7 e_hypotf-ppc64 e_hypotf-power7 \ ++ s_isnan-power8 + + CFLAGS-s_logbf-power7.c = -mcpu=power7 + CFLAGS-s_logbl-power7.c = -mcpu=power7 +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S +new file mode 100644 +index 0000000..c176d5a +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-power8.S +@@ -0,0 +1,33 @@ ++/* isnan(). PowerPC64/POWER7 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#undef hidden_def ++#define hidden_def(name) ++#undef weak_alias ++#define weak_alias(name, alias) ++#undef strong_alias ++#define strong_alias(name, alias) ++#undef compat_symbol ++#define compat_symbol(lib, name, symbol, ver) ++ ++#define __isnan __isnan_power8 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c +index 0de833e..65a5ca0 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c +@@ -26,16 +26,19 @@ extern __typeof (__isnan) __isnan_power5 attribute_hidden; + extern __typeof (__isnan) __isnan_power6 attribute_hidden; + extern __typeof (__isnan) __isnan_power6x attribute_hidden; + extern __typeof (__isnan) __isnan_power7 attribute_hidden; ++extern __typeof (__isnan) __isnan_power8 attribute_hidden; + + libc_ifunc (__isnan, +- (hwcap & PPC_FEATURE_ARCH_2_06) +- ? __isnan_power7 : +- (hwcap & PPC_FEATURE_POWER6_EXT) ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __isnan_power8 : ++ (hwcap & PPC_FEATURE_ARCH_2_06) ++ ? __isnan_power7 : ++ (hwcap & PPC_FEATURE_POWER6_EXT) + ? __isnan_power6x : +- (hwcap & PPC_FEATURE_ARCH_2_05) +- ? __isnan_power6 : +- (hwcap & PPC_FEATURE_POWER5) +- ? __isnan_power5 ++ (hwcap & PPC_FEATURE_ARCH_2_05) ++ ? __isnan_power6 : ++ (hwcap & PPC_FEATURE_POWER5) ++ ? __isnan_power5 + : __isnan_ppc64); + + weak_alias (__isnan, isnan) +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c +index b237455..eb68a50 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnanf.c +@@ -25,16 +25,19 @@ extern __typeof (__isnanf) __isnan_power5 attribute_hidden; + extern __typeof (__isnanf) __isnan_power6 attribute_hidden; + extern __typeof (__isnanf) __isnan_power6x attribute_hidden; + extern __typeof (__isnanf) __isnan_power7 attribute_hidden; ++extern __typeof (__isnanf) __isnan_power8 attribute_hidden; + + libc_ifunc (__isnanf, +- (hwcap & PPC_FEATURE_ARCH_2_06) +- ? __isnan_power7 : +- (hwcap & PPC_FEATURE_POWER6_EXT) +- ? __isnan_power6x : +- (hwcap & PPC_FEATURE_ARCH_2_05) +- ? __isnan_power6 : +- (hwcap & PPC_FEATURE_POWER5) +- ? __isnan_power5 ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __isnan_power8 : ++ (hwcap & PPC_FEATURE_ARCH_2_06) ++ ? __isnan_power7 : ++ (hwcap & PPC_FEATURE_POWER6_EXT) ++ ? __isnan_power6x : ++ (hwcap & PPC_FEATURE_ARCH_2_05) ++ ? __isnan_power6 : ++ (hwcap & PPC_FEATURE_POWER5) ++ ? __isnan_power5 + : __isnan_ppc64); + + weak_alias (__isnanf, isnanf) +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S +new file mode 100644 +index 0000000..c1ca9a5 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S +@@ -0,0 +1,53 @@ ++/* isnan(). PowerPC64/POWER8 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#define MFVSRD_R3_V1 .byte 0x7c,0x23,0x00,0x66 /* mfvsrd r3,vs1 */ ++ ++/* int [r3] __isnan([f1] x) */ ++ ++EALIGN (__isnan, 4, 0) ++ CALL_MCOUNT 0 ++ MFVSRD_R3_V1 ++ lis r9,0x7ff0 ++ clrldi r3,r3,1 /* r3 = r3 & 0x8000000000000000 */ ++ rldicr r9,r9,32,31 /* r9 = (r9 << 32) & 0xffffffff */ ++ subf r3,r3,r9 ++ rldicl r3,r3,1,63 ++ blr ++END (__isnan) ++ ++/* It turns out that the 'double' version will also always work for ++ single-precision. */ ++strong_alias (__isnan, __isnanf) ++hidden_def (__isnanf) ++weak_alias (__isnanf, isnanf) ++ ++#ifdef NO_LONG_DOUBLE ++strong_alias (__isnan, __isnanl) ++weak_alias (__isnan, isnanl) ++#endif ++ ++#ifndef IS_IN_libm ++# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) ++compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); ++compat_symbol (libc, isnan, isnanl, GLIBC_2_0); ++# endif ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S +new file mode 100644 +index 0000000..b48c85e +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnanf.S +@@ -0,0 +1 @@ ++/* This function uses the same code as s_isnan.S. */ diff --git a/SOURCES/glibc-rh1240351-3.patch b/SOURCES/glibc-rh1240351-3.patch new file mode 100644 index 0000000..2a09502 --- /dev/null +++ b/SOURCES/glibc-rh1240351-3.patch @@ -0,0 +1,667 @@ + Backport of the following patches: + + commit 4393fc119c34e97519b9b7a4fc94066b283be452 + Author: Adhemerval Zanella + Date: Thu Feb 27 09:45:41 2014 -0600 + + PowerPC: Optimized isinf/isinff for POWER8 + + This patch add a optimized isinf/isinff implementation for POWER8 + using the new Move From VSR Doubleword instruction to gains some + cycles from FP to GRP register move. + + ChangeLog: + 2014-02-27 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile: Add isinf power8 + implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S: New file: + POWER8 isinf ifunc implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c (__isinf): Add + POWER8 implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c (__isinff): + Likewise. + * sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S: New file: + POWER8 isinf implementation. + * sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S: New file. + + commit cac626d60a863e48ab75417064984769e58c5719 + Author: Adhemerval Zanella + Date: Thu Feb 27 09:46:46 2014 -0600 + + PowerPC: Optimized finite/finitef for POWER8 + + This patch add a optimized finite/finitef implementation for POWER8 + using the new Move From VSR Doubleword instruction to gains some + cycles from FP to GRP register move. + + ChangeLog: + 2014-02-27 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile: Add finite power8 + implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S: New file: + POWER8 finite ifunc implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c (__finite): Add + POWER8 implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c (__finitef): + Likewise. + * sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S: New file: + POWER8 finite implementation. + * sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S: New file. + + commit 1ad8950a3ea4056ed343d681b5146f4b4aa27e10 + Author: Adhemerval Zanella + Date: Tue Feb 18 09:29:29 2014 -0500 + + PowerPC: llrint/llrintf POWER8 optimization + + This patch add a optimized llrint/llrintf implementation for POWER8 + using the new Move From VSR Doubleword instruction to gains some + cycles from FP to GRP register move. + + ChangeLog: + 2014-02-27 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile: Add llrint power8 + implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S: New file: + POWER8 llrint ifunc implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c (__lllrint): Add + POWER8 implementation. + * sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S: New file: + POWER8 llrint implementation. + + commit fe13a20c37578f08ce393ccaeb45caeb48815ca5 + Author: Adhemerval Zanella + Date: Mon Feb 17 10:44:08 2014 -0600 + + PowerPC: llround/llroundf POWER8 optimization + + This patch add a optimized llround/llroundf implementation for POWER8 + using the new Move From VSR Doubleword instruction to gains some + cycles from FP to GRP register move. + + ChangeLog: + 2014-02-27 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile: Add llround power8 + implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S: New file: + POWER8 llround ifunc implementation. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c (__lllround): Add + POWER8 implementation. + * sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S: New file: + POWER8 llround implementation. + + commit 757d9dd5c3efa56fac75965abc014faaae7b7895 + Author: Adhemerval Zanella + Date: Mon Mar 31 08:00:38 2014 -0500 + + PowerPC: Fix little endian enconding for mfvsrd + + This patch fixes the MFVSRD_R3_V1 macro that encodes 'mfvsrd r3,vs1' + (to support old binutils) for little endian. + +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile +index 4cd1c5d..3e2127b 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile +@@ -4,7 +4,8 @@ sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \ + s_copysign-ppc64 s_finite-power7 s_finite-ppc64 \ + s_finitef-ppc64 s_isinff-ppc64 s_isinf-power7 \ + s_isinf-ppc64 s_modf-power5+ s_modf-ppc64 \ +- s_modff-power5+ s_modff-ppc64 s_isnan-power8 ++ s_modff-power5+ s_modff-ppc64 s_isnan-power8 \ ++ s_isinf-power8 s_finite-power8 + + libm-sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \ + s_isnan-power5 s_isnan-ppc64 s_llround-power6x \ +@@ -22,7 +23,8 @@ libm-sysdep_routines += s_isnan-power7 s_isnan-power6x s_isnan-power6 \ + s_logbl-ppc64 s_modf-power5+ s_modf-ppc64 \ + s_modff-power5+ s_modff-ppc64 e_hypot-ppc64 \ + e_hypot-power7 e_hypotf-ppc64 e_hypotf-power7 \ +- s_isnan-power8 ++ s_isnan-power8 s_isinf-power8 s_finite-power8 \ ++ s_llrint-power8 s_llround-power8 + + CFLAGS-s_logbf-power7.c = -mcpu=power7 + CFLAGS-s_logbl-power7.c = -mcpu=power7 +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S +new file mode 100644 +index 0000000..3b9071f +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite-power8.S +@@ -0,0 +1,33 @@ ++/* isnan(). PowerPC64/POWER7 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#undef hidden_def ++#define hidden_def(name) ++#undef weak_alias ++#define weak_alias(name, alias) ++#undef strong_alias ++#define strong_alias(name, alias) ++#undef compat_symbol ++#define compat_symbol(lib, name, symbol, ver) ++ ++#define __finite __finite_power8 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c +index f79a93e..b9e908d 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c +@@ -23,10 +23,13 @@ + + extern __typeof (__finite) __finite_ppc64 attribute_hidden; + extern __typeof (__finite) __finite_power7 attribute_hidden; ++extern __typeof (__finite) __finite_power8 attribute_hidden; + + libc_ifunc (__finite, +- (hwcap & PPC_FEATURE_ARCH_2_06) +- ? __finite_power7 ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __finite_power8 : ++ (hwcap & PPC_FEATURE_ARCH_2_06) ++ ? __finite_power7 + : __finite_ppc64); + + weak_alias (__finite, finite) +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c +index a7243b5..30b34bc 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finitef.c +@@ -23,10 +23,13 @@ + extern __typeof (__finitef) __finitef_ppc64 attribute_hidden; + /* The double-precision version also works for single-precision. */ + extern __typeof (__finitef) __finite_power7 attribute_hidden; ++extern __typeof (__finitef) __finite_power8 attribute_hidden; + + libc_ifunc (__finitef, +- (hwcap & PPC_FEATURE_ARCH_2_06) +- ? __finite_power7 ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __finite_power8 : ++ (hwcap & PPC_FEATURE_ARCH_2_06) ++ ? __finite_power7 + : __finitef_ppc64); + + weak_alias (__finitef, finitef) +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S +new file mode 100644 +index 0000000..979816e +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf-power8.S +@@ -0,0 +1,33 @@ ++/* isinf(). PowerPC64/POWER8 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#undef hidden_def ++#define hidden_def(name) ++#undef weak_alias ++#define weak_alias(name, alias) ++#undef strong_alias ++#define strong_alias(name, alias) ++#undef compat_symbol ++#define compat_symbol(lib, name, alias, ver) ++ ++#define __isinf __isinf_power8 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c +index 1ee230b..e349a06 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c +@@ -23,10 +23,13 @@ + + extern __typeof (__isinf) __isinf_ppc64 attribute_hidden; + extern __typeof (__isinf) __isinf_power7 attribute_hidden; ++extern __typeof (__isinf) __isinf_power8 attribute_hidden; + + libc_ifunc (__isinf, +- (hwcap & PPC_FEATURE_ARCH_2_06) +- ? __isinf_power7 ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __isinf_power8 : ++ (hwcap & PPC_FEATURE_ARCH_2_06) ++ ? __isinf_power7 + : __isinf_ppc64); + + weak_alias (__isinf, isinf) +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c +index 1336feb..71da7a3 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinff.c +@@ -24,10 +24,13 @@ + extern __typeof (__isinff) __isinff_ppc64 attribute_hidden; + /* The double-precision version also works for single-precision. */ + extern __typeof (__isinff) __isinf_power7 attribute_hidden; ++extern __typeof (__isinff) __isinf_power8 attribute_hidden; + + libc_ifunc (__isinff, +- (hwcap & PPC_FEATURE_ARCH_2_06) +- ? __isinf_power7 ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __isinf_power8 : ++ (hwcap & PPC_FEATURE_ARCH_2_06) ++ ? __isinf_power7 + : __isinff_ppc64); + + weak_alias (__isinff, isinff) +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S +new file mode 100644 +index 0000000..3962b7d +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint-power8.S +@@ -0,0 +1,31 @@ ++/* Round double to long int. PowerPC64/POWER6X default version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#undef weak_alias ++#define weak_alias(a,b) ++#undef strong_alias ++#define strong_alias(a,b) ++#undef compat_symbol ++#define compat_symbol(a,b,c,d) ++ ++#define __llrint __llrint_power8 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c +index 5818b53..cf1b2e4 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llrint.c +@@ -30,10 +30,13 @@ + + extern __typeof (__llrint) __llrint_ppc64 attribute_hidden; + extern __typeof (__llrint) __llrint_power6x attribute_hidden; ++extern __typeof (__llrint) __llrint_power8 attribute_hidden; + + libc_ifunc (__llrint, +- (hwcap & PPC_FEATURE_POWER6_EXT) +- ? __llrint_power6x ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __llrint_power8 : ++ (hwcap & PPC_FEATURE_POWER6_EXT) ++ ? __llrint_power6x + : __llrint_ppc64); + + weak_alias (__llrint, llrint) +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S +new file mode 100644 +index 0000000..41c61a1 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround-power8.S +@@ -0,0 +1,31 @@ ++/* llround(). PowerPC64 default version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#undef weak_alias ++#define weak_alias(name, alias) ++#undef strong_alias ++#define strong_alias(name, alias) ++#undef compat_symbol ++#define compat_symbol(lib, name, alias, ver) ++ ++#define __llround __llround_power8 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c +index a4d1bf3..7dba17e 100644 +--- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c ++++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/s_llround.c +@@ -27,12 +27,15 @@ + extern __typeof (__llround) __llround_ppc64 attribute_hidden; + extern __typeof (__llround) __llround_power5plus attribute_hidden; + extern __typeof (__llround) __llround_power6x attribute_hidden; ++extern __typeof (__llround) __llround_power8 attribute_hidden; + + libc_ifunc (__llround, +- (hwcap & PPC_FEATURE_POWER6_EXT) +- ? __llround_power6x : +- (hwcap & PPC_FEATURE_POWER5_PLUS) +- ? __llround_power5plus ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __llround_power8 : ++ (hwcap & PPC_FEATURE_POWER6_EXT) ++ ? __llround_power6x : ++ (hwcap & PPC_FEATURE_POWER5_PLUS) ++ ? __llround_power5plus + : __llround_ppc64); + + weak_alias (__llround, llround) +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S +new file mode 100644 +index 0000000..3e98126 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S +@@ -0,0 +1,56 @@ ++/* isfinite(). PowerPC64/POWER8 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */ ++ ++/* int [r3] __finite ([fp1] x) */ ++ ++EALIGN (__finite, 4, 0) ++ CALL_MCOUNT 0 ++ MFVSRD_R3_V1 ++ lis r9,0x8010 ++ clrldi r3,r3,1 /* r3 = r3 & 0x8000000000000000 */ ++ rldicr r9,r9,32,31 /* r9 = (r9 << 32) & 0xffffffff */ ++ add r3,r3,r9 ++ rldicl r3,r3,1,63 ++ blr ++END (__finite) ++ ++hidden_def (__finite) ++weak_alias (__finite, finite) ++ ++/* It turns out that the 'double' version will also always work for ++ single-precision. */ ++strong_alias (__finite, __finitef) ++hidden_def (__finitef) ++weak_alias (__finitef, finitef) ++ ++#ifdef IS_IN_libm ++# if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0) ++compat_symbol (libm, __finite, __finitel, GLIBC_2_0) ++compat_symbol (libm, finite, finitel, GLIBC_2_0) ++# endif ++#else ++# if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0) ++compat_symbol (libc, __finite, __finitel, GLIBC_2_0); ++compat_symbol (libc, finite, finitel, GLIBC_2_0); ++# endif ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S +new file mode 100644 +index 0000000..54bd941 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_finitef.S +@@ -0,0 +1 @@ ++/* This function uses the same code as s_finite.S. */ +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S +new file mode 100644 +index 0000000..125de39 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S +@@ -0,0 +1,61 @@ ++/* isinf(). PowerPC64/POWER8 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */ ++ ++/* int [r3] __isinf([fp1] x) */ ++ ++EALIGN (__isinf, 4, 0) ++ CALL_MCOUNT 0 ++ MFVSRD_R3_V1 ++ lis r9,0x7ff0 /* r9 = 0x7ff0 */ ++ rldicl r10,r3,0,1 /* r10 = r3 & (0x8000000000000000) */ ++ sldi r9,r9,32 /* r9 = r9 << 52 */ ++ cmpd cr7,r10,r9 /* fp1 & 0x7ff0000000000000 ? */ ++ beq cr7,L(inf) ++ li r3,0 /* Not inf */ ++ blr ++L(inf): ++ sradi r3,r3,63 /* r3 = r3 >> 63 */ ++ ori r3,r3,1 /* r3 = r3 | 0x1 */ ++ blr ++END (__isinf) ++ ++hidden_def (__isinf) ++weak_alias (__isinf, isinf) ++ ++/* It turns out that the 'double' version will also always work for ++ single-precision. */ ++strong_alias (__isinf, __isinff) ++hidden_def (__isinff) ++weak_alias (__isinff, isinff) ++ ++#ifdef NO_LONG_DOUBLE ++strong_alias (__isinf, __isinfl) ++weak_alias (__isinf, isinfl) ++#endif ++ ++#ifndef IS_IN_libm ++# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) ++compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); ++compat_symbol (libc, isinf, isinfl, GLIBC_2_0); ++# endif ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S +new file mode 100644 +index 0000000..be759e0 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_isinff.S +@@ -0,0 +1 @@ ++/* This function uses the same code as s_isinf.S. */ +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S +index c1ca9a5..cb96d03 100644 +--- a/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S +@@ -19,8 +19,8 @@ + #include + #include + +-#define MFVSRD_R3_V1 .byte 0x7c,0x23,0x00,0x66 /* mfvsrd r3,vs1 */ +- ++#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */ ++ + /* int [r3] __isnan([f1] x) */ + + EALIGN (__isnan, 4, 0) +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S +new file mode 100644 +index 0000000..ce48d4e +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_llrint.S +@@ -0,0 +1,45 @@ ++/* Round double to long int. POWER8 PowerPC64 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */ ++ ++/* long long int[r3] __llrint (double x[fp1]) */ ++ENTRY (__llrint) ++ CALL_MCOUNT 0 ++ fctid fp1,fp1 ++ MFVSRD_R3_V1 ++ blr ++END (__llrint) ++ ++strong_alias (__llrint, __lrint) ++weak_alias (__llrint, llrint) ++weak_alias (__lrint, lrint) ++ ++#ifdef NO_LONG_DOUBLE ++strong_alias (__llrint, __llrintl) ++weak_alias (__llrint, llrintl) ++strong_alias (__lrint, __lrintl) ++weak_alias (__lrint, lrintl) ++#endif ++#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1) ++compat_symbol (libm, __llrint, llrintl, GLIBC_2_1) ++compat_symbol (libm, __lrint, lrintl, GLIBC_2_1) ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S b/sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S +new file mode 100644 +index 0000000..2aea234 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/fpu/s_llround.S +@@ -0,0 +1,47 @@ ++/* llround function. POWER8 PowerPC64 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#define MFVSRD_R3_V1 .long 0x7c230066 /* mfvsrd r3,vs1 */ ++ ++/* long long [r3] llround (float x [fp1]) */ ++ ++ENTRY (__llround) ++ CALL_MCOUNT 0 ++ frin fp1,fp1 /* Round to nearest +-0.5. */ ++ fctidz fp1,fp1 /* Convert To Integer DW round toward 0. */ ++ MFVSRD_R3_V1 ++ blr ++END (__llround) ++ ++strong_alias (__llround, __lround) ++weak_alias (__llround, llround) ++weak_alias (__lround, lround) ++ ++#ifdef NO_LONG_DOUBLE ++weak_alias (__llround, llroundl) ++strong_alias (__llround, __llroundl) ++weak_alias (__lround, lroundl) ++strong_alias (__lround, __lroundl) ++#endif ++#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1) ++compat_symbol (libm, __llround, llroundl, GLIBC_2_1) ++compat_symbol (libm, __lround, lroundl, GLIBC_2_1) ++#endif diff --git a/SOURCES/glibc-rh1240351-4.patch b/SOURCES/glibc-rh1240351-4.patch new file mode 100644 index 0000000..7b570d4 --- /dev/null +++ b/SOURCES/glibc-rh1240351-4.patch @@ -0,0 +1,741 @@ + Backport of the following patch as a prerequistite for + 96d6fd6c4060d739abb1822e7ad633af749532b2: + commit 69f13dbf06c6195de0ada8632271d58ca3cf55da + Author: Adhemerval Zanella + Date: Thu Sep 26 09:29:19 2013 -0500 + + PowerPC: strcpy/stpcpy optimization for PPC64/POWER7 + + This patch intends to unify both strcpy and stpcpy implementationsi + for PPC64 and PPC64/POWER7. The idead default powerpc64 implementation + is to provide both doubleword and word aligned memory access. + + For PPC64/POWER7 is also provide doubleword and word memory access, + remove the branch hints, use the cmpb instruction for compare + doubleword/words, and add an optimization for inputs of same alignment. + + ChangeLog: + + 2013-10-04 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/strcpy.S (strcpy): Add word load/store + to provide a boost for large inputs with word alignment. + * sysdeps/powerpc/powerpc64/stpcpy.S (__stpcpy): Rewrite + implementation based on optimized PPC64 strcpy. + * sysdeps/powerpc/powerpc64/power7/strcpy.S: New file: optimized + strcpy for PPC64/POWER7 based on both doubleword and word load/store. + * sysdeps/powerpc/powerpc64/power7/stpcpy.S: New file: optimized + stpcpy for PPC64/POWER7 based on PPC64/POWER7 strcpy. + +diff --git a/sysdeps/powerpc/powerpc64/power7/stpcpy.S b/sysdeps/powerpc/powerpc64/power7/stpcpy.S +new file mode 100644 +index 0000000..727dd06 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power7/stpcpy.S +@@ -0,0 +1,24 @@ ++/* Optimized stpcpy implementation for PowerPC64/POWER7. ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define USE_AS_STPCPY ++#include ++ ++weak_alias (__stpcpy, stpcpy) ++libc_hidden_def (__stpcpy) ++libc_hidden_builtin_def (stpcpy) +diff --git a/sysdeps/powerpc/powerpc64/power7/strcpy.S b/sysdeps/powerpc/powerpc64/power7/strcpy.S +new file mode 100644 +index 0000000..5c341a1 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power7/strcpy.S +@@ -0,0 +1,274 @@ ++/* Optimized strcpy/stpcpy implementation for PowerPC64/POWER7. ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++/* Implements the function ++ ++ char * [r3] strcpy (char *dest [r3], const char *src [r4]) ++ ++ or ++ ++ char * [r3] strcpy (char *dest [r3], const char *src [r4]) ++ ++ if USE_AS_STPCPY is defined. It tries to use aligned memory accesses ++ when possible using the following algorithm: ++ ++ if (((((uintptr_t)dst & 0x7UL) == 0) && ((uintptr_t)src & 0x7UL) == 0)) ++ goto aligned_doubleword_copy; ++ if (((((uintptr_t)dst & 0x3UL) == 0) && ((uintptr_t)src & 0x3UL) == 0)) ++ goto aligned_word_copy; ++ if (((uintptr_t)dst & 0x7UL) == ((uintptr_t)src & 0x7UL)) ++ goto same_alignment; ++ goto unaligned; ++ ++ The aligned comparison are made using cmpb instructions. */ ++ ++#ifdef USE_AS_STPCPY ++# define FUNC_NAME __stpcpy ++#else ++# define FUNC_NAME strcpy ++#endif ++ ++ .machine power7 ++EALIGN (FUNC_NAME, 4, 0) ++ CALL_MCOUNT 2 ++ ++#define rTMP r0 ++#ifdef USE_AS_STPCPY ++#define rRTN r3 /* pointer to previous word/doubleword in dest */ ++#else ++#define rRTN r12 /* pointer to previous word/doubleword in dest */ ++#endif ++#define rSRC r4 /* pointer to previous word/doubleword in src */ ++#define rMASK r5 /* mask 0xffffffff | 0xffffffffffffffff */ ++#define rWORD r6 /* current word from src */ ++#define rALT r7 /* alternate word from src */ ++#define rRTNAL r8 /* alignment of return pointer */ ++#define rSRCAL r9 /* alignment of source pointer */ ++#define rALCNT r10 /* bytes to read to reach 8 bytes alignment */ ++#define rSUBAL r11 /* doubleword minus unaligned displacement */ ++ ++#ifndef USE_AS_STPCPY ++/* Save the dst pointer to use as return value. */ ++ mr rRTN, r3 ++#endif ++ or rTMP, rSRC, rRTN ++ clrldi. rTMP, rTMP, 61 ++ bne L(check_word_alignment) ++ b L(aligned_doubleword_copy) ++ ++L(same_alignment): ++/* Src and dst with same alignment: align both to doubleword. */ ++ mr rALCNT, rRTN ++ lbz rWORD, 0(rSRC) ++ subfic rSUBAL, rRTNAL, 8 ++ addi rRTN, rRTN, 1 ++ addi rSRC, rSRC, 1 ++ cmpdi cr7, rWORD, 0 ++ stb rWORD, 0(rALCNT) ++ beq cr7, L(s2) ++ ++ add rALCNT, rALCNT, rSUBAL ++ subf rALCNT, rRTN, rALCNT ++ addi rALCNT, rALCNT, 1 ++ mtctr rALCNT ++ b L(s1) ++ ++ .align 4 ++L(s0): ++ addi rSRC, rSRC, 1 ++ lbz rWORD, -1(rSRC) ++ cmpdi cr7, rWORD, 0 ++ stb rWORD, -1(rALCNT) ++ beqlr cr7 ++ mr rRTN, rALCNT ++L(s1): ++ addi rALCNT, rRTN,1 ++ bdnz L(s0) ++ b L(aligned_doubleword_copy) ++ .align 4 ++L(s2): ++ mr rRTN, rALCNT ++ blr ++ ++/* For doubleword aligned memory, operate using doubleword load and stores. */ ++ .align 4 ++L(aligned_doubleword_copy): ++ li rMASK, 0 ++ addi rRTN, rRTN, -8 ++ ld rWORD, 0(rSRC) ++ b L(g2) ++ ++ .align 4 ++L(g0): ldu rALT, 8(rSRC) ++ stdu rWORD, 8(rRTN) ++ cmpb rTMP, rALT, rMASK ++ cmpdi rTMP, 0 ++ bne L(g1) ++ ldu rWORD, 8(rSRC) ++ stdu rALT, 8(rRTN) ++L(g2): cmpb rTMP, rWORD, rMASK ++ cmpdi rTMP, 0 /* If rTMP is 0, no null's have been found. */ ++ beq L(g0) ++ ++ mr rALT, rWORD ++/* We've hit the end of the string. Do the rest byte-by-byte. */ ++L(g1): ++#ifdef __LITTLE_ENDIAN__ ++ extrdi. rTMP, rALT, 8, 56 ++ stbu rALT, 8(rRTN) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 48 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 40 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 32 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 24 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 16 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 8 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ extrdi rTMP, rALT, 8, 0 ++ stbu rTMP, 1(rRTN) ++#else ++ extrdi. rTMP, rALT, 8, 0 ++ stbu rTMP, 8(rRTN) ++ beqlr ++ extrdi. rTMP, rALT, 8, 8 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ extrdi. rTMP, rALT, 8, 16 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ extrdi. rTMP, rALT, 8, 24 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ extrdi. rTMP, rALT, 8, 32 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ extrdi. rTMP, rALT, 8, 40 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ extrdi. rTMP, rALT, 8, 48 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ stbu rALT, 1(rRTN) ++#endif ++ blr ++ ++L(check_word_alignment): ++ clrldi. rTMP, rTMP, 62 ++ beq L(aligned_word_copy) ++ rldicl rRTNAL, rRTN, 0, 61 ++ rldicl rSRCAL, rSRC, 0, 61 ++ cmpld cr7, rSRCAL, rRTNAL ++ beq cr7, L(same_alignment) ++ b L(unaligned) ++ ++/* For word aligned memory, operate using word load and stores. */ ++ .align 4 ++L(aligned_word_copy): ++ li rMASK, 0 ++ addi rRTN, rRTN, -4 ++ lwz rWORD, 0(rSRC) ++ b L(g5) ++ ++ .align 4 ++L(g3): lwzu rALT, 4(rSRC) ++ stwu rWORD, 4(rRTN) ++ cmpb rTMP, rALT, rMASK ++ cmpwi rTMP, 0 ++ bne L(g4) ++ lwzu rWORD, 4(rSRC) ++ stwu rALT, 4(rRTN) ++L(g5): cmpb rTMP, rWORD, rMASK ++ cmpwi rTMP, 0 /* If rTMP is 0, no null in word. */ ++ beq L(g3) ++ ++ mr rALT, rWORD ++/* We've hit the end of the string. Do the rest byte-by-byte. */ ++L(g4): ++#ifdef __LITTLE_ENDIAN__ ++ rlwinm. rTMP, rALT, 0, 24, 31 ++ stbu rALT, 4(rRTN) ++ beqlr- ++ rlwinm. rTMP, rALT, 24, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ rlwinm. rTMP, rALT, 16, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ rlwinm rTMP, rALT, 8, 24, 31 ++ stbu rTMP, 1(rRTN) ++#else ++ rlwinm. rTMP, rALT, 8, 24, 31 ++ stbu rTMP, 4(rRTN) ++ beqlr ++ rlwinm. rTMP, rALT, 16, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ rlwinm. rTMP, rALT, 24, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr ++ stbu rALT, 1(rRTN) ++#endif ++ blr ++ ++/* Oh well. In this case, we just do a byte-by-byte copy. */ ++ .align 4 ++L(unaligned): ++ lbz rWORD, 0(rSRC) ++ addi rRTN, rRTN, -1 ++ cmpdi rWORD, 0 ++ beq L(u2) ++ ++ .align 5 ++L(u0): lbzu rALT, 1(rSRC) ++ stbu rWORD, 1(rRTN) ++ cmpdi rALT, 0 ++ beq L(u1) ++ lbzu rWORD, 1(rSRC) ++ stbu rALT, 1(rRTN) ++ cmpdi rWORD, 0 ++ beq L(u2) ++ lbzu rALT, 1(rSRC) ++ stbu rWORD, 1(rRTN) ++ cmpdi rALT, 0 ++ beq L(u1) ++ lbzu rWORD, 1(rSRC) ++ stbu rALT, 1(rRTN) ++ cmpdi rWORD, 0 ++ bne L(u0) ++L(u2): stbu rWORD, 1(rRTN) ++ blr ++L(u1): stbu rALT, 1(rRTN) ++ blr ++END (FUNC_NAME) ++ ++#ifndef USE_AS_STPCPY ++libc_hidden_builtin_def (strcpy) ++#endif +diff --git a/sysdeps/powerpc/powerpc64/stpcpy.S b/sysdeps/powerpc/powerpc64/stpcpy.S +index d795b61..09aa3be 100644 +--- a/sysdeps/powerpc/powerpc64/stpcpy.S ++++ b/sysdeps/powerpc/powerpc64/stpcpy.S +@@ -1,5 +1,5 @@ + /* Optimized stpcpy implementation for PowerPC64. +- Copyright (C) 1997, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. ++ Copyright (C) 1997-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -16,123 +16,9 @@ + License along with the GNU C Library; if not, see + . */ + +-#include +-#include +-#include ++#define USE_AS_STPCPY ++#include + +-/* See strlen.s for comments on how the end-of-string testing works. */ +- +-/* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */ +- +-EALIGN (BP_SYM (__stpcpy), 4, 0) +- CALL_MCOUNT 2 +- +-#define rTMP r0 +-#define rRTN r3 +-#if __BOUNDED_POINTERS__ +-# define rDEST r4 /* pointer to previous word in dest */ +-# define rSRC r5 /* pointer to previous word in src */ +-# define rLOW r11 +-# define rHIGH r12 +-#else +-# define rDEST r3 /* pointer to previous word in dest */ +-# define rSRC r4 /* pointer to previous word in src */ +-#endif +-#define rWORD r6 /* current word from src */ +-#define rFEFE r7 /* 0xfefefeff */ +-#define r7F7F r8 /* 0x7f7f7f7f */ +-#define rNEG r9 /* ~(word in src | 0x7f7f7f7f) */ +-#define rALT r10 /* alternate word from src */ +- +- CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH) +- CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH) +- STORE_RETURN_BOUNDS (rLOW, rHIGH) +- +- or rTMP, rSRC, rDEST +- clrldi. rTMP, rTMP, 62 +- addi rDEST, rDEST, -4 +- bne L(unaligned) +- +- lis rFEFE, -0x101 +- lis r7F7F, 0x7f7f +- lwz rWORD, 0(rSRC) +- addi rFEFE, rFEFE, -0x101 +- addi r7F7F, r7F7F, 0x7f7f +- b L(g2) +- +-L(g0): lwzu rALT, 4(rSRC) +- stwu rWORD, 4(rDEST) +- add rTMP, rFEFE, rALT +- nor rNEG, r7F7F, rALT +- and. rTMP, rTMP, rNEG +- bne- L(g1) +- lwzu rWORD, 4(rSRC) +- stwu rALT, 4(rDEST) +-L(g2): add rTMP, rFEFE, rWORD +- nor rNEG, r7F7F, rWORD +- and. rTMP, rTMP, rNEG +- beq+ L(g0) +- +- mr rALT, rWORD +-/* We've hit the end of the string. Do the rest byte-by-byte. */ +-L(g1): +-#ifdef __LITTLE_ENDIAN__ +- rlwinm. rTMP, rALT, 0, 24, 31 +- stbu rALT, 4(rDEST) +- beqlr- +- rlwinm. rTMP, rALT, 24, 24, 31 +- stbu rTMP, 1(rDEST) +- beqlr- +- rlwinm. rTMP, rALT, 16, 24, 31 +- stbu rTMP, 1(rDEST) +- beqlr- +- rlwinm rTMP, rALT, 8, 24, 31 +- stbu rTMP, 1(rDEST) +- blr +-#else +- rlwinm. rTMP, rALT, 8, 24, 31 +- stbu rTMP, 4(rDEST) +- beqlr- +- rlwinm. rTMP, rALT, 16, 24, 31 +- stbu rTMP, 1(rDEST) +- beqlr- +- rlwinm. rTMP, rALT, 24, 24, 31 +- stbu rTMP, 1(rDEST) +- beqlr- +- stbu rALT, 1(rDEST) +- CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt) +- STORE_RETURN_VALUE (rDEST) +- blr +-#endif +- +-/* Oh well. In this case, we just do a byte-by-byte copy. */ +- .align 4 +- nop +-L(unaligned): +- lbz rWORD, 0(rSRC) +- addi rDEST, rDEST, 3 +- cmpwi rWORD, 0 +- beq- L(u2) +- +-L(u0): lbzu rALT, 1(rSRC) +- stbu rWORD, 1(rDEST) +- cmpwi rALT, 0 +- beq- L(u1) +- nop /* Let 601 load start of loop. */ +- lbzu rWORD, 1(rSRC) +- stbu rALT, 1(rDEST) +- cmpwi rWORD, 0 +- bne+ L(u0) +-L(u2): stbu rWORD, 1(rDEST) +- CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt) +- STORE_RETURN_VALUE (rDEST) +- blr +-L(u1): stbu rALT, 1(rDEST) +- CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt) +- STORE_RETURN_VALUE (rDEST) +- blr +-END (BP_SYM (__stpcpy)) +- +-weak_alias (BP_SYM (__stpcpy), BP_SYM (stpcpy)) ++weak_alias (__stpcpy, stpcpy) + libc_hidden_def (__stpcpy) + libc_hidden_builtin_def (stpcpy) +diff --git a/sysdeps/powerpc/powerpc64/strcpy.S b/sysdeps/powerpc/powerpc64/strcpy.S +index 9434c27..793325d 100644 +--- a/sysdeps/powerpc/powerpc64/strcpy.S ++++ b/sysdeps/powerpc/powerpc64/strcpy.S +@@ -1,5 +1,5 @@ + /* Optimized strcpy implementation for PowerPC64. +- Copyright (C) 1997, 1999, 2000, 2002, 2003, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1997-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -17,52 +17,43 @@ + . */ + + #include +-#include +-#include + + /* See strlen.s for comments on how the end-of-string testing works. */ + + /* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */ + +-EALIGN (BP_SYM (strcpy), 4, 0) ++#ifdef USE_AS_STPCPY ++# define FUNC_NAME __stpcpy ++#else ++# define FUNC_NAME strcpy ++#endif ++ ++EALIGN (FUNC_NAME, 4, 0) + CALL_MCOUNT 2 + + #define rTMP r0 +-#define rRTN r3 /* incoming DEST arg preserved as result */ +-/* Note. The Bounded pointer support in this code is broken. This code +- was inherited from PPC32 and that support was never completed. +- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. +- These artifacts are left in the code as a reminder in case we need +- bounded pointer support in the future. */ +-#if __BOUNDED_POINTERS__ +-# define rDEST r4 /* pointer to previous word in dest */ +-# define rSRC r5 /* pointer to previous word in src */ +-# define rLOW r11 +-# define rHIGH r12 ++#ifdef USE_AS_STPCPY ++#define rRTN r3 /* pointer to previous word/doubleword in dest */ + #else +-# define rSRC r4 /* pointer to previous word in src */ +-# define rDEST r5 /* pointer to previous word in dest */ ++#define rRTN r12 /* pointer to previous word/doubleword in dest */ + #endif ++#define rSRC r4 /* pointer to previous word/doubleword in src */ + #define rWORD r6 /* current word from src */ +-#define rFEFE r7 /* constant 0xfefefefefefefeff (-0x0101010101010101) */ +-#define r7F7F r8 /* constant 0x7f7f7f7f7f7f7f7f */ +-#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ ++#define rFEFE r7 /* constant 0xfefefeff | 0xfefefefefefefeff */ ++#define r7F7F r8 /* constant 0x7f7f7f7f | 0x7f7f7f7f7f7f7f7f */ ++#define rNEG r9 /* ~(word in s1 | r7F7F) */ + #define rALT r10 /* alternate word from src */ + +- CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH) +- CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH) +- STORE_RETURN_BOUNDS (rLOW, rHIGH) +- +- dcbt 0,rSRC ++#ifndef USE_AS_STPCPY ++/* Save the dst pointer to use as return value. */ ++ mr rRTN, r3 ++#endif + or rTMP, rSRC, rRTN + clrldi. rTMP, rTMP, 61 +-#if __BOUNDED_POINTERS__ +- addi rDEST, rDEST, -8 +-#else +- addi rDEST, rRTN, -8 +-#endif +- dcbtst 0,rRTN +- bne L(unaligned) ++ bne L(check_word_alignment) ++ ++/* For doubleword aligned memory, operate using doubleword load and stores. */ ++ addi rRTN, rRTN, -8 + + lis rFEFE, -0x101 + lis r7F7F, 0x7f7f +@@ -75,13 +66,13 @@ EALIGN (BP_SYM (strcpy), 4, 0) + b L(g2) + + L(g0): ldu rALT, 8(rSRC) +- stdu rWORD, 8(rDEST) ++ stdu rWORD, 8(rRTN) + add rTMP, rFEFE, rALT + nor rNEG, r7F7F, rALT + and. rTMP, rTMP, rNEG + bne- L(g1) + ldu rWORD, 8(rSRC) +- stdu rALT, 8(rDEST) ++ stdu rALT, 8(rRTN) + L(g2): add rTMP, rFEFE, rWORD + nor rNEG, r7F7F, rWORD + and. rTMP, rTMP, rNEG +@@ -92,80 +83,134 @@ L(g2): add rTMP, rFEFE, rWORD + L(g1): + #ifdef __LITTLE_ENDIAN__ + extrdi. rTMP, rALT, 8, 56 +- stb rALT, 8(rDEST) ++ stbu rALT, 8(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 48 +- stb rTMP, 9(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 40 +- stb rTMP, 10(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 32 +- stb rTMP, 11(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 24 +- stb rTMP, 12(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 16 +- stb rTMP, 13(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 8 +- stb rTMP, 14(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi rTMP, rALT, 8, 0 +- stb rTMP, 15(rDEST) +- blr ++ stbu rTMP, 1(rRTN) + #else + extrdi. rTMP, rALT, 8, 0 +- stb rTMP, 8(rDEST) ++ stbu rTMP, 8(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 8 +- stb rTMP, 9(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 16 +- stb rTMP, 10(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 24 +- stb rTMP, 11(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 32 +- stb rTMP, 12(rDEST) +- beqlr- ++ stbu rTMP, 1(rRTN) ++ beqlr + extrdi. rTMP, rALT, 8, 40 +- stb rTMP, 13(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- + extrdi. rTMP, rALT, 8, 48 +- stb rTMP, 14(rDEST) ++ stbu rTMP, 1(rRTN) + beqlr- +- stb rALT, 15(rDEST) +- /* GKM FIXME: check high bound. */ ++ stbu rALT, 1(rRTN) ++#endif + blr ++ ++L(check_word_alignment): ++ clrldi. rTMP, rTMP, 62 ++ bne L(unaligned) ++ ++/* For word aligned memory, operate using word load and stores. */ ++ addi rRTN, rRTN, -4 ++ ++ lis rFEFE, -0x101 ++ lis r7F7F, 0x7f7f ++ lwz rWORD, 0(rSRC) ++ addi rFEFE, rFEFE, -0x101 ++ addi r7F7F, r7F7F, 0x7f7f ++ b L(g5) ++ ++L(g3): lwzu rALT, 4(rSRC) ++ stwu rWORD, 4(rRTN) ++ add rTMP, rFEFE, rALT ++ nor rNEG, r7F7F, rALT ++ and. rTMP, rTMP, rNEG ++ bne- L(g4) ++ lwzu rWORD, 4(rSRC) ++ stwu rALT, 4(rRTN) ++L(g5): add rTMP, rFEFE, rWORD ++ nor rNEG, r7F7F, rWORD ++ and. rTMP, rTMP, rNEG ++ beq+ L(g3) ++ ++ mr rALT, rWORD ++/* We've hit the end of the string. Do the rest byte-by-byte. */ ++L(g4): ++#ifdef __LITTLE_ENDIAN__ ++ rlwinm. rTMP, rALT, 0, 24, 31 ++ stbu rALT, 4(rRTN) ++ beqlr- ++ rlwinm. rTMP, rALT, 24, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ rlwinm. rTMP, rALT, 16, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ rlwinm rTMP, rALT, 8, 24, 31 ++ stbu rTMP, 1(rRTN) ++#else ++ rlwinm. rTMP, rALT, 8, 24, 31 ++ stbu rTMP, 4(rRTN) ++ beqlr- ++ rlwinm. rTMP, rALT, 16, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ rlwinm. rTMP, rALT, 24, 24, 31 ++ stbu rTMP, 1(rRTN) ++ beqlr- ++ stbu rALT, 1(rRTN) + #endif ++ blr + + /* Oh well. In this case, we just do a byte-by-byte copy. */ + .align 4 + nop + L(unaligned): + lbz rWORD, 0(rSRC) +- addi rDEST, rRTN, -1 ++ addi rRTN, rRTN, -1 + cmpwi rWORD, 0 + beq- L(u2) + + L(u0): lbzu rALT, 1(rSRC) +- stbu rWORD, 1(rDEST) ++ stbu rWORD, 1(rRTN) + cmpwi rALT, 0 + beq- L(u1) + nop /* Let 601 load start of loop. */ + lbzu rWORD, 1(rSRC) +- stbu rALT, 1(rDEST) ++ stbu rALT, 1(rRTN) + cmpwi rWORD, 0 + bne+ L(u0) +-L(u2): stb rWORD, 1(rDEST) +- /* GKM FIXME: check high bound. */ ++L(u2): stbu rWORD, 1(rRTN) + blr +-L(u1): stb rALT, 1(rDEST) +- /* GKM FIXME: check high bound. */ ++L(u1): stbu rALT, 1(rRTN) + blr ++END (FUNC_NAME) + +-END (BP_SYM (strcpy)) ++#ifndef USE_AS_STPCPY + libc_hidden_builtin_def (strcpy) ++#endif diff --git a/SOURCES/glibc-rh1240351-5.patch b/SOURCES/glibc-rh1240351-5.patch new file mode 100644 index 0000000..3665fc6 --- /dev/null +++ b/SOURCES/glibc-rh1240351-5.patch @@ -0,0 +1,793 @@ + Backport of the following commit: + + commit 96d6fd6c4060d739abb1822e7ad633af749532b2 + Author: Adhemerval Zanella + Date: Tue Dec 23 05:59:44 2014 -0600 + + powerpc: Optimized st{r,p}cpy for POWER8/PPC64 + + This patch adds an optimized POWER8 strcpy using unaligned accesses. + For strings up to 16 bytes the implementation first calculate the + string size, like strlen, and issues a memcpy. For larger strings, + source is first aligned to 16 bytes and then tested over a loop that + reads 16 bytes am combine the cmpb results for speedup. Special case is + added for page cross reads. + + It shows 30%-60% improvement over the optimized POWER7 one that uses + only aligned accesses. + + ChangeLog: + 2015-01-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/Makefile [sysdep_routines]: Add + strcpy-power8 and stpcpy-power8 objects. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add __strcpy_power8 and __stpcpy_power8 + implementations. + * sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S: New file: + multiarch stpcpy implementation for POWER8. + * sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S: New file; + multiarch strcpy implementation for POWER8. + * sysdeps/powerpc/powerpc64/multiarch/strcpy.c (strcpy): Add + __strcpy_power8 function. + * sysdeps/powerpc/powerpc64/power8/stpcpy.S: New file: optimized + stpcpy for POWER8. + * sysdeps/powerpc/powerpc64/power8/strcpy.S: New file: optimized + strcpy for POWER8. + * NEWS: Update. + + and the commits it depends on: + + commit a52374e82b90a6039c720f7b9b7dfa9db24ff4f0 + Author: Adhemerval Zanella + Date: Fri Dec 13 14:55:22 2013 -0500 + + PowerPC: multiarch stpcpy for PowerPC64 + + ChangeLog: + 2013-12-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/Makefile: Add stpcpy + multiarch implementations. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Likewise. + * sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.c: New file. + * sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.c: New file. + * sysdeps/powerpc/powerpc64/multiarch/stpcpy.c : New file: + multiarch stpcpy for PPC64. + + commit 7f5ec11336e46d0449a6b5a8e5a0604c3c78ecbf + Author: Adhemerval Zanella + Date: Fri Dec 13 14:54:41 2013 -0500 + + PowerPC: multiarch strcpy for PowerPC64 + + ChangeLog: + 2013-12-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/Makefile: Add strcpy + multiarch implementations. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.c: New file. + * sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.c: New file. + * sysdeps/powerpc/powerpc64/multiarch/strcpy.c : New file: + multiarch strcpy for PPC64. + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 8dceb09..1cdd5d6 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -5,6 +5,8 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ + memset-ppc64 bzero-power4 bzero-power6 bzero-power7 \ + mempcpy-power7 mempcpy-ppc64 memchr-power7 memchr-ppc64 \ + memrchr-power7 memrchr-ppc64 rawmemchr-power7 \ ++ stpcpy-power8 stpcpy-power7 stpcpy-ppc64 \ ++ strcpy-power8 strcpy-power7 strcpy-ppc64 \ + rawmemchr-ppc64 strlen-power7 strlen-ppc64 strnlen-power7 \ + strnlen-ppc64 strcasecmp-power7 strcasecmp_l-power7 \ + strncase-power7 strncase_l-power7 strncmp-power7 \ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index 2d21ce1..e89fd3e 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -34,6 +34,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + size_t i = 0; + + unsigned long int hwcap = GLRO(dl_hwcap); ++ unsigned long int hwcap2 = GLRO(dl_hwcap2); ++ + /* hwcap contains only the latest supported ISA, the code checks which is + and fills the previous supported ones. */ + if (hwcap & PPC_FEATURE_ARCH_2_06) +@@ -71,6 +73,24 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + __memset_power4) + IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ppc)) + ++ /* Support sysdeps/powerpc/powerpc64/multiarch/strcpy.c. */ ++ IFUNC_IMPL (i, name, strcpy, ++ IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07, ++ __strcpy_power8) ++ IFUNC_IMPL_ADD (array, i, strcpy, hwcap & PPC_FEATURE_HAS_VSX, ++ __strcpy_power7) ++ IFUNC_IMPL_ADD (array, i, strcpy, 1, ++ __strcpy_ppc)) ++ ++ /* Support sysdeps/powerpc/powerpc64/multiarch/stpcpy.c. */ ++ IFUNC_IMPL (i, name, stpcpy, ++ IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07, ++ __stpcpy_power8) ++ IFUNC_IMPL_ADD (array, i, stpcpy, hwcap & PPC_FEATURE_HAS_VSX, ++ __stpcpy_power7) ++ IFUNC_IMPL_ADD (array, i, stpcpy, 1, ++ __stpcpy_ppc)) ++ + /* Support sysdeps/powerpc/powerpc64/multiarch/strlen.c. */ + IFUNC_IMPL (i, name, strlen, + IFUNC_IMPL_ADD (array, i, strlen, hwcap & PPC_FEATURE_HAS_VSX, +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.S +new file mode 100644 +index 0000000..0943611 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power7.S +@@ -0,0 +1,40 @@ ++/* Optimized stpcpy implementation for POWER7. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__stpcpy_power7) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__stpcpy_power7): \ ++ cfi_startproc; \ ++ LOCALENTRY(__stpcpy_power7) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__stpcpy_power7) \ ++ END_2(__stpcpy_power7) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S +new file mode 100644 +index 0000000..66e6f70 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power8.S +@@ -0,0 +1,40 @@ ++/* Optimized stpcpy implementation for POWER8/PPC64. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__stpcpy_power8) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__stpcpy_power8): \ ++ cfi_startproc; \ ++ LOCALENTRY(__stpcpy_power8) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__stpcpy_power8) \ ++ END_2(__stpcpy_power8) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.S +new file mode 100644 +index 0000000..ac70c1b +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.S +@@ -0,0 +1,48 @@ ++/* Default stpcpy implementation for PowerPC64. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#if defined SHARED && !defined NOT_IN_libc ++# undef EALIGN ++# define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__stpcpy_ppc) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__stpcpy_ppc): \ ++ cfi_startproc; \ ++ LOCALENTRY(__stpcpy_ppc) ++ ++# undef END ++# define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__stpcpy_ppc) \ ++ END_2(__stpcpy_ppc) ++ ++# undef weak_alias ++# define weak_alias(name, alias) ++# undef libc_hidden_def ++# define libc_hidden_def(name) ++ ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ .globl __GI___stpcpy; __GI___stpcpy = __stpcpy_ppc ++#endif ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c b/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c +new file mode 100644 +index 0000000..2ab62bf +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c +@@ -0,0 +1,35 @@ ++/* Multiple versions of stpcpy. PowerPC64 version. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined SHARED && !defined NOT_IN_libc ++# define NO_MEMPCPY_STPCPY_REDIRECT ++# include ++# include ++# include "init-arch.h" ++ ++extern __typeof (__stpcpy) __stpcpy_ppc attribute_hidden; ++extern __typeof (__stpcpy) __stpcpy_power7 attribute_hidden; ++ ++libc_ifunc (__stpcpy, ++ (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __stpcpy_power7 ++ : __stpcpy_ppc); ++ ++weak_alias (__stpcpy, stpcpy) ++libc_hidden_def (stpcpy) ++#endif +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.S +new file mode 100644 +index 0000000..69851bb +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.S +@@ -0,0 +1,40 @@ ++/* Optimized strcpy implementation for POWER7. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strcpy_power7) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strcpy_power7): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strcpy_power7) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strcpy_power7) \ ++ END_2(__strcpy_power7) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S +new file mode 100644 +index 0000000..64cbc16 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S +@@ -0,0 +1,40 @@ ++/* Optimized strcpy implementation for POWER8/PPC64. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strcpy_power8) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strcpy_power8): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strcpy_power8) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strcpy_power8) \ ++ END_2(__strcpy_power8) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S +new file mode 100644 +index 0000000..e5452b1 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S +@@ -0,0 +1,43 @@ ++/* Default strcpy implementation for PowerPC64. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#if defined SHARED && !defined NOT_IN_libc ++# undef EALIGN ++# define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strcpy_ppc) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strcpy_ppc): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strcpy_ppc) ++ ++# undef END ++# define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strcpy_ppc) \ ++ END_2(__strcpy_ppc) ++ ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ .globl __GI_strcpy; __GI_strcpy = __strcpy_ppc ++#endif ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy.c b/sysdeps/powerpc/powerpc64/multiarch/strcpy.c +new file mode 100644 +index 0000000..5a86f26 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcpy.c +@@ -0,0 +1,34 @@ ++/* Multiple versions of strcpy. PowerPC64 version. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined SHARED && !defined NOT_IN_libc ++# include ++# include ++# include "init-arch.h" ++ ++extern __typeof (strcpy) __strcpy_ppc attribute_hidden; ++extern __typeof (strcpy) __strcpy_power7 attribute_hidden; ++extern __typeof (strcpy) __strcpy_power8 attribute_hidden; ++ ++libc_ifunc (strcpy, ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __strcpy_power8 : ++ (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strcpy_power7 ++ : __strcpy_ppc); ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power8/stpcpy.S b/sysdeps/powerpc/powerpc64/power8/stpcpy.S +new file mode 100644 +index 0000000..bf72065 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/stpcpy.S +@@ -0,0 +1,24 @@ ++/* Optimized stpcpy implementation for PowerPC64/POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define USE_AS_STPCPY ++#include ++ ++weak_alias (__stpcpy, stpcpy) ++libc_hidden_def (__stpcpy) ++libc_hidden_builtin_def (stpcpy) +diff --git a/sysdeps/powerpc/powerpc64/power8/strcpy.S b/sysdeps/powerpc/powerpc64/power8/strcpy.S +new file mode 100644 +index 0000000..d3e9a10 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/strcpy.S +@@ -0,0 +1,262 @@ ++/* Optimized strcpy/stpcpy implementation for PowerPC64/POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#ifdef USE_AS_STPCPY ++# define FUNC_NAME __stpcpy ++#else ++# define FUNC_NAME strcpy ++#endif ++ ++/* Implements the function ++ ++ char * [r3] strcpy (char *dest [r3], const char *src [r4]) ++ ++ or ++ ++ char * [r3] stpcpy (char *dest [r3], const char *src [r4]) ++ ++ if USE_AS_STPCPY is defined. ++ ++ The implementation uses unaligned doubleword access to avoid specialized ++ code paths depending of data alignment. Although recent powerpc64 uses ++ 64K as default, the page cross handling assumes minimum page size of ++ 4k. */ ++ ++ .machine power7 ++EALIGN (FUNC_NAME, 4, 0) ++ li r0,0 /* Doubleword with null chars to use ++ with cmpb. */ ++ ++ /* Check if the [src]+15 will cross a 4K page by checking if the bit ++ indicating the page size changes. Basically: ++ ++ uint64_t srcin = (uint64_t)src; ++ uint64_t ob = srcin & 4096UL; ++ uint64_t nb = (srcin+15UL) & 4096UL; ++ if (ob ^ nb) ++ goto pagecross; */ ++ ++ addi r9,r4,15 ++ xor r9,r9,r4 ++ rlwinm. r9,r9,0,19,19 ++ bne L(pagecross) ++ ++ /* For short string (less than 16 bytes), just calculate its size as ++ strlen and issues a memcpy if null is found. */ ++ mr r7,r4 ++ ld r12,0(r7) /* Load doubleword from memory. */ ++ cmpb r10,r12,r0 /* Check for null bytes in DWORD1. */ ++ cmpdi cr7,r10,0 /* If r10 == 0, no null's have been found. */ ++ bne cr7,L(done) ++ ++ ldu r8,8(r7) ++ cmpb r10,r8,r0 ++ cmpdi cr7,r10,0 ++ bne cr7,L(done) ++ ++ b L(loop_before) ++ ++ .align 4 ++L(pagecross): ++ clrrdi r7,r4,3 /* Align the address to doubleword boundary. */ ++ rlwinm r6,r4,3,26,28 /* Calculate padding. */ ++ li r5,-1 /* MASK = 0xffffffffffffffff. */ ++ ld r12,0(r7) /* Load doubleword from memory. */ ++#ifdef __LITTLE_ENDIAN__ ++ sld r5,r5,r6 ++#else ++ srd r5,r5,r6 /* MASK = MASK >> padding. */ ++#endif ++ orc r9,r12,r5 /* Mask bits that are not part of the string. */ ++ cmpb r10,r9,r0 /* Check for null bytes in DWORD1. */ ++ cmpdi cr7,r10,0 /* If r10 == 0, no null's have been found. */ ++ bne cr7,L(done) ++ ++ ldu r6,8(r7) ++ cmpb r10,r6,r0 ++ cmpdi cr7,r10,0 ++ bne cr7,L(done) ++ ++ ld r12,0(r7) ++ cmpb r10,r12,r0 ++ cmpdi cr7,r10,0 ++ bne cr7,L(done) ++ ++ ldu r6,8(r7) ++ cmpb r10,r6,r0 ++ cmpdi cr7,r10,0 ++ bne cr7,L(done) ++ ++ /* We checked for 24 - x bytes, with x being the source alignment ++ (0 <= x <= 16), and no zero has been found. Start the loop ++ copy with doubleword aligned address. */ ++ mr r7,r4 ++ ld r12, 0(r7) ++ ldu r8, 8(r7) ++ ++L(loop_before): ++ /* Save the two doublewords readed from source and align the source ++ to 16 bytes for the loop. */ ++ mr r11,r3 ++ std r12,0(r11) ++ std r8,8(r11) ++ addi r11,r11,16 ++ rldicl r9,r4,0,60 ++ subf r7,r9,r7 ++ subf r11,r9,r11 ++ b L(loop_start) ++ ++ .align 5 ++L(loop): ++ std r12, 0(r11) ++ std r6, 8(r11) ++ addi r11,r11,16 ++L(loop_start): ++ /* Load two doublewords, compare and merge in a ++ single register for speed. This is an attempt ++ to speed up the null-checking process for bigger strings. */ ++ ++ ld r12, 8(r7) ++ ldu r6, 16(r7) ++ cmpb r10,r12,r0 ++ cmpb r9,r6,r0 ++ or r8,r9,r10 /* Merge everything in one doubleword. */ ++ cmpdi cr7,r8,0 ++ beq cr7,L(loop) ++ ++ ++ /* OK, one (or both) of the doublewords contains a null byte. Check ++ the first doubleword and decrement the address in case the first ++ doubleword really contains a null byte. */ ++ ++ addi r4,r7,-8 ++ cmpdi cr6,r10,0 ++ addi r7,r7,-8 ++ bne cr6,L(done2) ++ ++ /* The null byte must be in the second doubleword. Adjust the address ++ again and move the result of cmpb to r10 so we can calculate the ++ length. */ ++ ++ mr r10,r9 ++ addi r7,r7,8 ++ b L(done2) ++ ++ /* r10 has the output of the cmpb instruction, that is, it contains ++ 0xff in the same position as the null byte in the original ++ doubleword from the string. Use that to calculate the length. */ ++L(done): ++ mr r11,r3 ++L(done2): ++#ifdef __LITTLE_ENDIAN__ ++ addi r9, r10, -1 /* Form a mask from trailing zeros. */ ++ andc r9, r9, r10 ++ popcntd r6, r9 /* Count the bits in the mask. */ ++#else ++ cntlzd r6,r10 /* Count leading zeros before the match. */ ++#endif ++ subf r5,r4,r7 ++ srdi r6,r6,3 /* Convert leading/trailing zeros to bytes. */ ++ add r8,r5,r6 /* Compute final length. */ ++#ifdef USE_AS_STPCPY ++ /* stpcpy returns the dest address plus the size not counting the ++ final '\0'. */ ++ add r3,r11,r8 ++#endif ++ addi r8,r8,1 /* Final '/0'. */ ++ ++ cmpldi cr6,r8,8 ++ mtocrf 0x01,r8 ++ ble cr6,L(copy_LE_8) ++ ++ cmpldi cr1,r8,16 ++ blt cr1,8f ++ ++ /* Handle copies of 0~31 bytes. */ ++ .align 4 ++L(copy_LT_32): ++ /* At least 6 bytes to go. */ ++ blt cr1,8f ++ ++ /* Copy 16 bytes. */ ++ ld r6,0(r4) ++ ld r8,8(r4) ++ addi r4,r4,16 ++ std r6,0(r11) ++ std r8,8(r11) ++ addi r11,r11,16 ++8: /* Copy 8 bytes. */ ++ bf 28,L(tail4) ++ ld r6,0(r4) ++ addi r4,r4,8 ++ std r6,0(r11) ++ addi r11,r11,8 ++ ++ .align 4 ++/* Copies 4~7 bytes. */ ++L(tail4): ++ bf 29,L(tail2) ++ lwz r6,0(r4) ++ stw r6,0(r11) ++ bf 30,L(tail5) ++ lhz r7,4(r4) ++ sth r7,4(r11) ++ bflr 31 ++ lbz r8,6(r4) ++ stb r8,6(r11) ++ blr ++ ++ .align 4 ++/* Copies 2~3 bytes. */ ++L(tail2): ++ bf 30,1f ++ lhz r6,0(r4) ++ sth r6,0(r11) ++ bflr 31 ++ lbz r7,2(r4) ++ stb r7,2(r11) ++ blr ++ ++ .align 4 ++L(tail5): ++ bf 31,1f ++ lbz r6,4(r4) ++ stb r6,4(r11) ++ blr ++ ++ .align 4 ++1: ++ bflr 31 ++ lbz r6,0(r4) ++ stb r6,0(r11) ++ blr ++ ++/* Handles copies of 0~8 bytes. */ ++ .align 4 ++L(copy_LE_8): ++ bne cr6,L(tail4) ++ ld r6,0(r4) ++ std r6,0(r11) ++ blr ++END (FUNC_NAME) ++ ++#ifndef USE_AS_STPCPY ++libc_hidden_builtin_def (strcpy) ++#endif diff --git a/SOURCES/glibc-rh1240351-6.patch b/SOURCES/glibc-rh1240351-6.patch new file mode 100644 index 0000000..bc39f54 --- /dev/null +++ b/SOURCES/glibc-rh1240351-6.patch @@ -0,0 +1,252 @@ + Backport of: + commit 94c9680945369d63ef9ed266a29f28ebaaaeb5ce + Author: Adhemerval Zanella + Date: Tue Dec 23 13:36:34 2014 -0500 + + powerpc: Optimized strcat for POWER8/PPC64 + + With new optimized strcpy for POWER8, this patch adds an optimized + strcat which uses it along with default implementation at strings/. + + ChangeLog: + 2015-01-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/Makefile [sysdep_routines]: Add + strncat-power8 object. + * sysdeps/powerpc/powerpc64/multiarch/strcat.c (strcat): Add + __strcat_power8 implementation. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add __strcat_power8 implementation. + * sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c: New file: + optimized strcat for power8. + + and its dependency: + + commit bc8ea38590070604006399e42469087e943fc8ec + Author: Vidya Ranganathan + Date: Wed Jun 11 22:21:20 2014 -0500 + + PowerPC: strcat optimization for PPC64/POWER7 + + This patch adds an ifunc power7 strcat symbol that uses the logic on + sysdeps/powerpc/strcat.c but call power7 strlen/strcpy symbols instead + of default ones. + + ChangeLog: + + 2014-07-02 Vidya Ranganathan + Adhemerval Zanella + + * sysdeps/powerpc/strcat.c: Using macro to redefine symbol name. + * sysdeps/powerpc/powerpc64/multiarch/Makefile: Add strcat multiarch + optimizations. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c: + (__libc_ifunc_impl_list): Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcat.c: New file: + multiarch strcat for PPC64. + * sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c: New file/ + * sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c: New file. + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 1cdd5d6..7ebfc7e 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -6,6 +6,7 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ + mempcpy-power7 mempcpy-ppc64 memchr-power7 memchr-ppc64 \ + memrchr-power7 memrchr-ppc64 rawmemchr-power7 \ + stpcpy-power8 stpcpy-power7 stpcpy-ppc64 \ ++ strcat-power8 strcat-power7 strcat-ppc64 \ + strcpy-power8 strcpy-power7 strcpy-ppc64 \ + rawmemchr-ppc64 strlen-power7 strlen-ppc64 strnlen-power7 \ + strnlen-ppc64 strcasecmp-power7 strcasecmp_l-power7 \ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index e89fd3e..4e5bb17 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -211,6 +211,17 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1, + __strncasecmp_l_ppc)) + ++ /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c. */ ++ IFUNC_IMPL (i, name, strcat, ++ IFUNC_IMPL_ADD (array, i, strcat, ++ hwcap2 & PPC_FEATURE2_ARCH_2_07, ++ __strcat_power8) ++ IFUNC_IMPL_ADD (array, i, strcat, ++ hwcap & PPC_FEATURE_HAS_VSX, ++ __strcat_power7) ++ IFUNC_IMPL_ADD (array, i, strcat, 1, ++ __strcat_ppc)) ++ + /* Support sysdeps/powerpc/powerpc64/multiarch/wcschr.c. */ + IFUNC_IMPL (i, name, wcschr, + IFUNC_IMPL_ADD (array, i, wcschr, +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c +new file mode 100644 +index 0000000..291a720 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c +@@ -0,0 +1,31 @@ ++/* Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#define STRCAT __strcat_power7 ++ ++#undef libc_hidden_def ++#define libc_hidden_def(name) ++ ++extern typeof (strcpy) __strcpy_power7; ++extern typeof (strlen) __strlen_power7; ++ ++#define strcpy __strcpy_power7 ++#define strlen __strlen_power7 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c +new file mode 100644 +index 0000000..6c7544c +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcat-power8.c +@@ -0,0 +1,30 @@ ++/* Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#define STRCAT __strcat_power8 ++ ++#undef libc_hidden_def ++#define libc_hidden_def(name) ++ ++extern typeof (strcpy) __strcpy_power8; ++extern typeof (strlen) __strlen_power7; ++ ++#define strcpy __strcpy_power8 ++#define strlen __strlen_power7 ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c +new file mode 100644 +index 0000000..1245764 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c +@@ -0,0 +1,29 @@ ++/* Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#define STRCAT __strcat_ppc ++#ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strcat_ppc, __GI_strcat, __strcat_ppc); ++#endif ++ ++extern __typeof (strcat) __strcat_ppc attribute_hidden; ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat.c b/sysdeps/powerpc/powerpc64/multiarch/strcat.c +new file mode 100644 +index 0000000..847a62d +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcat.c +@@ -0,0 +1,31 @@ ++/* Multiple versions of strcat. PowerPC64 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef NOT_IN_libc ++# include ++# include ++# include "init-arch.h" ++ ++extern __typeof (strcat) __strcat_ppc attribute_hidden; ++extern __typeof (strcat) __strcat_power7 attribute_hidden; ++ ++libc_ifunc (strcat, ++ (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strcat_power7 ++ : __strcat_ppc); ++#endif +diff --git a/sysdeps/powerpc/strcat.c b/sysdeps/powerpc/strcat.c +index 28575d0..393bee6 100644 +--- a/sysdeps/powerpc/strcat.c ++++ b/sysdeps/powerpc/strcat.c +@@ -18,13 +18,16 @@ + + #include + +-#undef strcat ++#ifndef STRCAT ++# undef strcat ++# define STRCAT strcat ++#endif + + /* Append SRC on the end of DEST. */ + char * +-strcat (char *dest, const char *src) ++STRCAT(char *dest, const char *src) + { + strcpy (dest + strlen (dest), src); + return dest; + } +-libc_hidden_builtin_def (strcat) ++libc_hidden_builtin_def (STRCAT) diff --git a/SOURCES/glibc-rh1240351-7.patch b/SOURCES/glibc-rh1240351-7.patch new file mode 100644 index 0000000..87feb4a --- /dev/null +++ b/SOURCES/glibc-rh1240351-7.patch @@ -0,0 +1,78 @@ + Backport of the addition of + sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c + from the following: + + commit 9f2f36e5a91c2ce6edba5415e176155eb1008ae1 + Author: Adhemerval Zanella + Date: Tue Dec 23 13:39:23 2014 -0500 + + powerpc: Optimized strncat for POWER7/PPC64 + + With 3eb38795dbbbd816 (Simplify strncat) the generic algorithms uses + strlen, strnlen, and memcpy. This is faster than POWER7 current + implementation, especially for unaligned strings (where POWER7 code + uses byte-byte operations). + + This patch removes the assembly implementation and uses a multiarch + specialization based on default algorithm calling optimized POWER7 + symbols. + + ChangeLog: + 2015-01-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c: New file. + * sysdeps/powerpc/powerpc64/multiarch/strncat-power7.S: Remove file. + * sysdeps/powerpc/powerpc64/power7/strncat.S: Likewise. + + plus the addition of strncat-power7 to + sysdeps/powerpc/powerpc64/multiarch/Makefile + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 7ebfc7e..74ae710 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -8,6 +8,7 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ + stpcpy-power8 stpcpy-power7 stpcpy-ppc64 \ + strcat-power8 strcat-power7 strcat-ppc64 \ + strcpy-power8 strcpy-power7 strcpy-ppc64 \ ++ strncat-power7 \ + rawmemchr-ppc64 strlen-power7 strlen-ppc64 strnlen-power7 \ + strnlen-ppc64 strcasecmp-power7 strcasecmp_l-power7 \ + strncase-power7 strncase_l-power7 strncmp-power7 \ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c +new file mode 100644 +index 0000000..39b1aeb +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncat-power7.c +@@ -0,0 +1,31 @@ ++/* Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#define STRNCAT __strncat_power7 ++ ++extern __typeof (strncat) __strncat_power7 attribute_hidden; ++extern __typeof (strlen) __strlen_power7 attribute_hidden; ++extern __typeof (strnlen) __strnlen_power7 attribute_hidden; ++extern __typeof (memcpy) __memcpy_power7 attribute_hidden; ++ ++#define strlen __strlen_power7 ++#define __strnlen __strnlen_power7 ++#define memcpy __memcpy_power7 ++ ++#include diff --git a/SOURCES/glibc-rh1240351-8.patch b/SOURCES/glibc-rh1240351-8.patch new file mode 100644 index 0000000..c0207ee --- /dev/null +++ b/SOURCES/glibc-rh1240351-8.patch @@ -0,0 +1,1272 @@ + Backport of: + + commit f06a4faf8a2b4d046eb40e94b47948cc47d79902 + Author: Adhemerval Zanella + Date: Wed Dec 31 11:47:41 2014 -0500 + + powerpc: Optimized st{r,p}ncpy for POWER8/PPC64 + + This patch adds an optimized POWER8 st{r,p}ncpy using unaligned accesses. + It shows 10%-80% improvement over the optimized POWER7 one that uses + only aligned accesses, specially on unaligned inputs. + + The algorithm first read and check 16 bytes (if inputs do not cross a 4K + page size). The it realign source to 16-bytes and issue a 16 bytes read + and compare loop to speedup null byte checks for large strings. Also, + different from POWER7 optimization, the null pad is done inline in the + implementation using possible unaligned accesses, instead of realying on + a memset call. Special case is added for page cross reads. + + ChangeLog: + 2015-01-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/Makefile [sysdep_routines]: + Add strncpy-power8 and stpncpy-power8 objects. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add __strncpy_power8 and stpncpy_power8 + implementations. + * sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S: New file. + * sysdeps/powerpc/powerpc64/multiarch/stpncpy.c (__stpncpy): Add + __stpncpy_power8 implementation. + * sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S: New file. + * sysdeps/powerpc/powerpc64/multiarch/strncpy.c (strncpy): Add + __strncpy_power8 implementation. + * sysdeps/powerpc/powerpc64/power8/stpncpy.S: New file. + * sysdeps/powerpc/powerpc64/power8/strncpy.S: New file. + * NEWS: Update. + + and its dependency: + + commit f360f94a05570045be615649e9a411cefba2e210 + Author: Vidya Ranganathan + Date: Mon May 5 19:10:45 2014 -0500 + + PowerPC: strncpy/stpncpy optimization for PPC64/POWER7 + + The optimization is achieved by following techniques: + > data alignment [gain from aligned memory access on read/write] + > POWER7 gains performance with loop unrolling/unwinding + [gain by reduction of branch penalty]. + > zero padding done by calling optimized memset + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 74ae710..ef39917 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -8,6 +8,8 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ + stpcpy-power8 stpcpy-power7 stpcpy-ppc64 \ + strcat-power8 strcat-power7 strcat-ppc64 \ + strcpy-power8 strcpy-power7 strcpy-ppc64 \ ++ stpncpy-power8 stpncpy-power7 stpncpy-ppc64 \ ++ strncpy-power8 strncpy-power7 strncpy-ppc64 + strncat-power7 \ + rawmemchr-ppc64 strlen-power7 strlen-ppc64 strnlen-power7 \ + strnlen-ppc64 strcasecmp-power7 strcasecmp_l-power7 \ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index 4e5bb17..23bf5dc 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -255,5 +255,27 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_IMPL_ADD (array, i, wcscpy, 1, + __wcscpy_ppc)) + ++ /* Support sysdeps/powerpc/powerpc64/multiarch/strncpy.c. */ ++ IFUNC_IMPL (i, name, strncpy, ++ IFUNC_IMPL_ADD (array, i, strncpy, ++ hwcap2 & PPC_FEATURE2_ARCH_2_07, ++ __strncpy_power8) ++ IFUNC_IMPL_ADD (array, i, strncpy, ++ hwcap & PPC_FEATURE_HAS_VSX, ++ __strncpy_power7) ++ IFUNC_IMPL_ADD (array, i, strncpy, 1, ++ __strncpy_ppc)) ++ ++ /* Support sysdeps/powerpc/powerpc64/multiarch/stpncpy.c. */ ++ IFUNC_IMPL (i, name, stpncpy, ++ IFUNC_IMPL_ADD (array, i, stpncpy, ++ hwcap2 & PPC_FEATURE2_ARCH_2_07, ++ __stpncpy_power8) ++ IFUNC_IMPL_ADD (array, i, stpncpy, ++ hwcap & PPC_FEATURE_HAS_VSX, ++ __stpncpy_power7) ++ IFUNC_IMPL_ADD (array, i, stpncpy, 1, ++ __stpncpy_ppc)) ++ + return i; + } +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S +new file mode 100644 +index 0000000..e29674f +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S +@@ -0,0 +1,44 @@ ++/* Optimized stpncpy implementation for POWER7. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#define USE_AS_STPNCPY ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__stpncpy_power7) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__stpncpy_power7): \ ++ cfi_startproc; \ ++ LOCALENTRY(__stpncpy_power7) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__stpncpy_power7) \ ++ END_2(__stpncpy_power7) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#define MEMSET __memset_power7 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S +new file mode 100644 +index 0000000..d5d835d +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S +@@ -0,0 +1,39 @@ ++/* Optimized stpncpy implementation for POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#define USE_AS_STPNCPY ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__stpncpy_power8) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__stpncpy_power8): \ ++ cfi_startproc; \ ++ LOCALENTRY(__stpncpy_power8) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__stpncpy_power8) \ ++ END_2(__stpncpy_power8) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-ppc64.c +new file mode 100644 +index 0000000..74f47a7 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-ppc64.c +@@ -0,0 +1,26 @@ ++/* Default stpncpy implementation for PowerPC64. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define STPNCPY __stpncpy_ppc ++#ifdef SHARED ++#undef libc_hidden_def ++#define libc_hidden_def(name) \ ++ __hidden_ver1 (__stpncpy_ppc, __GI___stpncpy, __stpncpy_ppc); ++#endif ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c b/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c +new file mode 100644 +index 0000000..3ee50e5 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c +@@ -0,0 +1,36 @@ ++/* Multiple versions of stpncpy. PowerPC64 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef NOT_IN_libc ++# include ++# include ++# include "init-arch.h" ++ ++extern __typeof (__stpncpy) __stpncpy_ppc attribute_hidden; ++extern __typeof (__stpncpy) __stpncpy_power7 attribute_hidden; ++extern __typeof (__stpncpy) __stpncpy_power8 attribute_hidden; ++ ++libc_ifunc (__stpncpy, ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __stpncpy_power8 : ++ (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __stpncpy_power7 ++ : __stpncpy_ppc); ++ ++weak_alias (__stpncpy, stpncpy) ++#endif +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S +new file mode 100644 +index 0000000..be349f9 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S +@@ -0,0 +1,42 @@ ++/* Optimized strncpy implementation for POWER7. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strncpy_power7) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strncpy_power7): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strncpy_power7) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strncpy_power7) \ ++ END_2(__strncpy_power7) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#define MEMSET __memset_power7 ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S +new file mode 100644 +index 0000000..ed906a4 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S +@@ -0,0 +1,40 @@ ++/* Optimized strncpy implementation for POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strncpy_power8) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strncpy_power8): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strncpy_power8) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strncpy_power8) \ ++ END_2(__strncpy_power8) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c +new file mode 100644 +index 0000000..e3111d2 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c +@@ -0,0 +1,33 @@ ++/* Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#define STRNCPY __strncpy_ppc ++#undef weak_alias ++#define weak_alias(name, aliasname) \ ++ extern __typeof (__strncpy_ppc) aliasname \ ++ __attribute__ ((weak, alias ("__strncpy_ppc"))); ++#if !defined(NOT_IN_libc) && defined(SHARED) ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1(__strncpy_ppc, __GI_strncpy, __strncpy_ppc); ++#endif ++ ++extern __typeof (strncpy) __strncpy_ppc attribute_hidden; ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy.c b/sysdeps/powerpc/powerpc64/multiarch/strncpy.c +new file mode 100644 +index 0000000..19927bc +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncpy.c +@@ -0,0 +1,38 @@ ++/* Multiple versions of strncpy. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* Define multiple versions only for definition in libc. */ ++#ifndef NOT_IN_libc ++# include ++# include ++# include "init-arch.h" ++ ++extern __typeof (strncpy) __strncpy_ppc attribute_hidden; ++extern __typeof (strncpy) __strncpy_power7 attribute_hidden; ++extern __typeof (strncpy) __strncpy_power8 attribute_hidden; ++ ++/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ++ ifunc symbol properly. */ ++libc_ifunc (strncpy, ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __strncpy_power8 : ++ (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strncpy_power7 ++ : __strncpy_ppc); ++ ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power7/stpncpy.S b/sysdeps/powerpc/powerpc64/power7/stpncpy.S +new file mode 100644 +index 0000000..a539093 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power7/stpncpy.S +@@ -0,0 +1,24 @@ ++/* Optimized stpncpy implementation for PowerPC64/POWER7. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define USE_AS_STPNCPY ++#include ++ ++weak_alias (__stpncpy, stpncpy) ++libc_hidden_def (__stpncpy) ++libc_hidden_builtin_def (stpncpy) +diff --git a/sysdeps/powerpc/powerpc64/power7/strncpy.S b/sysdeps/powerpc/powerpc64/power7/strncpy.S +new file mode 100644 +index 0000000..51860df +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power7/strncpy.S +@@ -0,0 +1,338 @@ ++/* Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++/* Implements the functions ++ ++ char * [r3] strncpy (char *dst [r3], const char *src [r4], size_t n [r5]) ++ ++ AND ++ ++ char * [r3] stpncpy (char *dst [r3], const char *src [r4], size_t n [r5]) ++ ++ The algorithm is as follows: ++ > if src and dest are 8 byte aligned, perform double word copy ++ else ++ > copy byte by byte on unaligned addresses. ++ ++ The aligned comparison are made using cmpb instructions. */ ++ ++/* The focus on optimization for performance improvements are as follows: ++ 1. data alignment [gain from aligned memory access on read/write] ++ 2. POWER7 gains performance with loop unrolling/unwinding ++ [gain by reduction of branch penalty]. ++ 3. The final pad with null bytes is done by calling an optimized ++ memset. */ ++ ++#ifdef USE_AS_STPNCPY ++# define FUNC_NAME __stpncpy ++#else ++# define FUNC_NAME strncpy ++#endif ++ ++#define FRAMESIZE (FRAME_MIN_SIZE+32) ++ ++#ifndef MEMSET ++/* For builds with no IFUNC support, local calls should be made to internal ++ GLIBC symbol (created by libc_hidden_builtin_def). */ ++# ifdef SHARED ++# define MEMSET __GI_memset ++# else ++# define MEMSET memset ++# endif ++#endif ++ ++ .machine power7 ++EALIGN(FUNC_NAME, 4, 0) ++ CALL_MCOUNT 3 ++ ++ mflr r0 /* load link register LR to r0 */ ++ or r10, r3, r4 /* to verify source and destination */ ++ rldicl. r8, r10, 0, 61 /* is double word aligned .. ? */ ++ ++ std r19, -8(r1) /* save callers register , r19 */ ++ std r18, -16(r1) /* save callers register , r18 */ ++ std r0, 16(r1) /* store the link register */ ++ stdu r1, -FRAMESIZE(r1) /* create the stack frame */ ++ ++ mr r9, r3 /* save r3 into r9 for use */ ++ mr r18, r3 /* save r3 for retCode of strncpy */ ++ bne 0, L(byte_by_byte) ++ ++ ++ srdi r11, r5, 3 /* compute count for CTR ; count = n/8 */ ++ cmpldi cr7, r11, 3 /* if count > 4 ; perform unrolling 4 times */ ++ ble 7, L(update1) ++ ++ ld r10, 0(r4) /* load doubleWord from src */ ++ cmpb r8, r10, r8 /* compare src with NULL ,we read just now */ ++ cmpdi cr7, r8, 0 /* if cmpb returned NULL ; we continue */ ++ bne cr7, L(update3) ++ ++ std r10, 0(r3) /* copy doubleword at offset=0 */ ++ ld r10, 8(r4) /* load next doubleword from offset=8 */ ++ cmpb r8, r10, r8 /* compare src with NULL , we read just now */ ++ cmpdi cr7, r8, 0 /* if cmpb returned NULL ; we continue */ ++ bne 7,L(HopBy8) ++ ++ addi r8, r11, -4 ++ mr r7, r3 ++ srdi r8, r8, 2 ++ mr r6, r4 ++ addi r8, r8, 1 ++ li r12, 0 ++ mtctr r8 ++ b L(dwordCopy) ++ ++ .p2align 4 ++L(dWordUnroll): ++ std r8, 16(r9) ++ ld r8, 24(r4) /* load dword,perform loop unrolling again */ ++ cmpb r10, r8, r10 ++ cmpdi cr7, r10, 0 ++ bne cr7, L(HopBy24) ++ ++ std r8, 24(r7) /* copy dword at offset=24 */ ++ addi r9, r9, 32 ++ addi r4, r4, 32 ++ bdz L(leftDwords) /* continue with loop on counter */ ++ ++ ld r3, 32(r6) ++ cmpb r8, r3, r10 ++ cmpdi cr7, r8, 0 ++ bne cr7, L(update2) ++ ++ std r3, 32(r7) ++ ld r10, 40(r6) ++ cmpb r8, r10, r8 ++ cmpdi cr7, r8, 0 ++ bne cr7, L(HopBy40) ++ ++ mr r6, r4 /* update values */ ++ mr r7, r9 ++ mr r11, r0 ++ mr r5, r19 ++ ++L(dwordCopy): ++ std r10, 8(r9) /* copy dword at offset=8 */ ++ addi r19, r5, -32 ++ addi r0, r11, -4 ++ ld r8, 16(r4) ++ cmpb r10, r8, r12 ++ cmpdi cr7, r10, 0 ++ beq cr7, L(dWordUnroll) ++ ++ addi r9, r9, 16 /* increment dst by 16 */ ++ addi r4, r4, 16 /* increment src by 16 */ ++ addi r5, r5, -16 /* decrement length 'n' by 16 */ ++ addi r0, r11, -2 /* decrement loop counter */ ++ ++L(dWordUnrollOFF): ++ ld r10, 0(r4) /* load first dword */ ++ li r8, 0 /* load mask */ ++ cmpb r8, r10, r8 ++ cmpdi cr7, r8, 0 ++ bne cr7, L(byte_by_byte) ++ mtctr r0 ++ li r7, 0 ++ b L(CopyDword) ++ ++ .p2align 4 ++L(loadDWordandCompare): ++ ld r10, 0(r4) ++ cmpb r8, r10, r7 ++ cmpdi cr7, r8, 0 ++ bne cr7, L(byte_by_byte) ++ ++L(CopyDword): ++ addi r9, r9, 8 ++ std r10, -8(r9) ++ addi r4, r4, 8 ++ addi r5, r5, -8 ++ bdnz L(loadDWordandCompare) ++ ++L(byte_by_byte): ++ cmpldi cr7, r5, 3 ++ ble cr7, L(verifyByte) ++ srdi r10, r5, 2 ++ mr r19, r9 ++ mtctr r10 ++ b L(firstByteUnroll) ++ ++ .p2align 4 ++L(bytes_unroll): ++ lbz r10, 1(r4) /* load byte from src */ ++ cmpdi cr7, r10, 0 /* compare for NULL */ ++ stb r10, 1(r19) /* store byte to dst */ ++ beq cr7, L(updtDestComputeN2ndByte) ++ ++ addi r4, r4, 4 /* advance src */ ++ ++ lbz r10, -2(r4) /* perform loop unrolling for byte r/w */ ++ cmpdi cr7, r10, 0 ++ stb r10, 2(r19) ++ beq cr7, L(updtDestComputeN3rdByte) ++ ++ lbz r10, -1(r4) /* perform loop unrolling for byte r/w */ ++ addi r19, r19, 4 ++ cmpdi cr7, r10, 0 ++ stb r10, -1(r19) ++ beq cr7, L(ComputeNByte) ++ ++ bdz L(update0) ++ ++L(firstByteUnroll): ++ lbz r10, 0(r4) /* perform loop unrolling for byte r/w */ ++ cmpdi cr7, 10, 0 ++ stb r10, 0(r19) ++ bne cr7, L(bytes_unroll) ++ addi r19, r19, 1 ++ ++L(ComputeNByte): ++ subf r9, r19, r9 /* compute 'n'n bytes to fill */ ++ add r8, r9, r5 ++ ++L(zeroFill): ++ cmpdi cr7, r8, 0 /* compare if length is zero */ ++ beq cr7, L(update3return) ++ ++ mr r3, r19 /* fill buffer with */ ++ li r4, 0 /* zero fill buffer */ ++ mr r5, r8 /* how many bytes to fill buffer with */ ++ bl MEMSET /* call optimized memset */ ++ nop ++ ++L(update3return): ++#ifdef USE_AS_STPNCPY ++ addi r3, r19, -1 /* update return value */ ++#endif ++ ++L(hop2return): ++#ifndef USE_AS_STPNCPY ++ mr r3, r18 /* set return value */ ++#endif ++ addi r1, r1, FRAMESIZE /* restore stack pointer */ ++ ld r0, 16(r1) /* read the saved link register */ ++ ld r18, -16(r1) /* restore callers save register, r18 */ ++ ld r19, -8(r1) /* restore callers save register, r19 */ ++ mtlr r0 /* branch to link register */ ++ blr /* return */ ++ ++ .p2align 4 ++L(update0): ++ mr r9, r19 ++ ++ .p2align 4 ++L(verifyByte): ++ rldicl. r8, r5, 0, 62 ++#ifdef USE_AS_STPNCPY ++ mr r3, r9 ++#endif ++ beq cr0, L(hop2return) ++ mtctr r8 ++ addi r4, r4, -1 ++ mr r19, r9 ++ b L(oneBYone) ++ ++ .p2align 4 ++L(proceed): ++ bdz L(done) ++ ++L(oneBYone): ++ lbzu r10, 1(r4) /* copy byte */ ++ addi r19, r19, 1 ++ addi r8, r8, -1 ++ cmpdi cr7, r10, 0 ++ stb r10, -1(r19) ++ bne cr7, L(proceed) ++ b L(zeroFill) ++ ++ .p2align 4 ++L(done): ++ addi r1, r1, FRAMESIZE /* restore stack pointer */ ++#ifdef USE_AS_STPNCPY ++ mr r3, r19 /* set the return value */ ++#else ++ mr r3, r18 /* set the return value */ ++#endif ++ ld r0, 16(r1) /* read the saved link register */ ++ ld r18, -16(r1) /* restore callers save register, r18 */ ++ ld r19, -8(r1) /* restore callers save register, r19 */ ++ mtlr r0 /* branch to link register */ ++ blr /* return */ ++ ++L(update1): ++ mr r0, r11 ++ mr r19, r5 ++ ++ .p2align 4 ++L(leftDwords): ++ cmpdi cr7, r0, 0 ++ mr r5, r19 ++ bne cr7, L(dWordUnrollOFF) ++ b L(byte_by_byte) ++ ++ .p2align 4 ++L(updtDestComputeN2ndByte): ++ addi r19, r19, 2 /* update dst by 2 */ ++ subf r9, r19, r9 /* compute distance covered */ ++ add r8, r9, r5 ++ b L(zeroFill) ++ ++ .p2align 4 ++L(updtDestComputeN3rdByte): ++ addi r19, r19, 3 /* update dst by 3 */ ++ subf r9, r19, r9 /* compute distance covered */ ++ add r8, r9, r5 ++ b L(zeroFill) ++ ++ .p2align 4 ++L(HopBy24): ++ addi r9, r9, 24 /* increment dst by 24 */ ++ addi r4, r4, 24 /* increment src by 24 */ ++ addi r5, r5, -24 /* decrement length 'n' by 24 */ ++ addi r0, r11, -3 /* decrement loop counter */ ++ b L(dWordUnrollOFF) ++ ++ .p2align 4 ++L(update2): ++ mr r5, r19 ++ b L(dWordUnrollOFF) ++ ++ .p2align 4 ++L(HopBy40): ++ addi r9, r7, 40 /* increment dst by 40 */ ++ addi r4, r6, 40 /* increment src by 40 */ ++ addi r5, r5, -40 /* decrement length 'n' by 40 */ ++ addi r0, r11, -5 /* decrement loop counter */ ++ b L(dWordUnrollOFF) ++ ++L(update3): ++ mr r0, r11 ++ b L(dWordUnrollOFF) ++ ++L(HopBy8): ++ addi r9, r3, 8 /* increment dst by 8 */ ++ addi r4, r4, 8 /* increment src by 8 */ ++ addi r5, r5, -8 /* decrement length 'n' by 8 */ ++ addi r0, r11, -1 /* decrement loop counter */ ++ b L(dWordUnrollOFF) ++END(FUNC_NAME) ++#ifndef USE_AS_STPNCPY ++libc_hidden_builtin_def (strncpy) ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power8/stpncpy.S b/sysdeps/powerpc/powerpc64/power8/stpncpy.S +new file mode 100644 +index 0000000..76a1466 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/stpncpy.S +@@ -0,0 +1,20 @@ ++/* Optimized stpncpy implementation for PowerPC64/POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define USE_AS_STPNCPY ++#include +diff --git a/sysdeps/powerpc/powerpc64/power8/strncpy.S b/sysdeps/powerpc/powerpc64/power8/strncpy.S +new file mode 100644 +index 0000000..5fda953 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/strncpy.S +@@ -0,0 +1,424 @@ ++/* Optimized strncpy/stpncpy implementation for PowerPC64/POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#ifdef USE_AS_STPNCPY ++# define FUNC_NAME __stpncpy ++#else ++# define FUNC_NAME strncpy ++#endif ++ ++/* Implements the function ++ ++ char * [r3] strncpy (char *dest [r3], const char *src [r4], size_t n [r5]) ++ ++ or ++ ++ char * [r3] stpncpy (char *dest [r3], const char *src [r4], size_t n [r5]) ++ ++ if USE_AS_STPCPY is defined. ++ ++ The implementation uses unaligned doubleword access to avoid specialized ++ code paths depending of data alignment. Although recent powerpc64 uses ++ 64K as default, the page cross handling assumes minimum page size of ++ 4k. */ ++ ++ .machine power7 ++EALIGN (FUNC_NAME, 4, 0) ++ ++ /* Check if the [src]+15 will cross a 4K page by checking if the bit ++ indicating the page size changes. Basically: ++ ++ uint64_t srcin = (uint64_t)src; ++ uint64_t ob = srcin & 4096UL; ++ uint64_t nb = (srcin+15UL) & 4096UL; ++ if (ob ^ nb) ++ goto pagecross; */ ++ ++ addi r10,r4,16 ++ rlwinm r9,r4,0,19,19 ++ ++ /* Since it is a leaf function, save some non-volatile registers on the ++ protected/red zone. */ ++ std r26,-48(r1) ++ std r27,-40(r1) ++ ++ rlwinm r8,r10,0,19,19 ++ ++ std r28,-32(r1) ++ std r29,-24(r1) ++ ++ cmpld r7,r9,r8 ++ ++ std r30,-16(r1) ++ std r31,-8(r1) ++ ++ beq cr7,L(unaligned_lt_16) ++ rldicl r9,r4,0,61 ++ subfic r8,r9,8 ++ cmpld cr7,r5,r8 ++ bgt cr7,L(pagecross) ++ ++ /* At this points there is 1 to 15 bytes to check and write. Since it could ++ be either from first unaligned 16 bytes access or from bulk copy, the code ++ uses an unrolled byte read/write instead of trying to analyze the cmpb ++ results. */ ++L(short_path): ++ mr r9,r3 ++L(short_path_1): ++ cmpdi cr7,r5,0 ++ beq cr7,L(short_path_loop_end_1) ++L(short_path_2): ++ lbz r10,0(r4) ++ cmpdi cr7,r10,0 ++ stb r10,0(r9) ++ beq cr7,L(zero_pad_start_1) ++ cmpdi cr0,r5,1 ++ addi r8,r9,1 ++ addi r6,r5,-1 ++ beq cr0,L(short_path_loop_end_0) ++ lbz r10,1(r4) ++ cmpdi cr7,r10,0 ++ stb r10,1(r9) ++ beq cr7,L(zero_pad_start_prepare_1) ++ addi r10,r5,-3 ++ b L(short_path_loop_1) ++ ++ .align 4 ++L(short_path_loop): ++ lbz r8,0(r4) ++ addi r7,r10,-2 ++ cmpdi cr5,r8,0 ++ stb r8,0(r9) ++ beq cr5,L(zero_pad_start_1) ++ beq r7,L(short_path_loop_end_0) ++ lbz r8,1(r4) ++ cmpdi cr7,r8,0 ++ stb r8,1(r9) ++ beq cr7,L(zero_pad_start) ++ mr r10,r7 ++L(short_path_loop_1): ++ addic. r5,r5,-2 ++ addi r9,r9,2 ++ cmpdi cr7,r10,0 ++ addi r4,r4,2 ++ addi r6,r9,1 ++ bne cr0,L(short_path_loop) ++#ifdef USE_AS_STPNCPY ++ mr r3,r9 ++ b L(short_path_loop_end) ++#endif ++ ++L(short_path_loop_end_0): ++#ifdef USE_AS_STPNCPY ++ addi r3,r9,1 ++ b L(short_path_loop_end) ++#endif ++L(short_path_loop_end_1): ++#ifdef USE_AS_STPNCPY ++ mr r3,r9 ++#endif ++L(short_path_loop_end): ++ /* Restore non-volatile registers. */ ++ ld r26,-48(r1) ++ ld r27,-40(r1) ++ ld r28,-32(r1) ++ ld r29,-24(r1) ++ ld r30,-16(r1) ++ ld r31,-8(r1) ++ blr ++ ++ /* This code pads the remainder dest with NULL bytes. The algorithm ++ calculate the remanining size and issues a doubleword unrolled ++ loops followed by a byte a byte set. */ ++ .align 4 ++L(zero_pad_start): ++ mr r5,r10 ++ mr r9,r6 ++L(zero_pad_start_1): ++ srdi. r8,r5,r3 ++ mr r10,r9 ++#ifdef USE_AS_STPNCPY ++ mr r3,r9 ++#endif ++ beq- cr0,L(zero_pad_loop_b_start) ++ cmpldi cr7,r8,1 ++ li cr7,0 ++ std r7,0(r9) ++ beq cr7,L(zero_pad_loop_b_prepare) ++ addic. r8,r8,-2 ++ addi r10,r9,r16 ++ std r7,8(r9) ++ beq cr0,L(zero_pad_loop_dw_2) ++ std r7,16(r9) ++ li r9,0 ++ b L(zero_pad_loop_dw_1) ++ ++ .align 4 ++L(zero_pad_loop_dw): ++ addi r10,r10,16 ++ std r9,-8(r10) ++ beq cr0,L(zero_pad_loop_dw_2) ++ std r9,0(r10) ++L(zero_pad_loop_dw_1): ++ cmpldi cr7,r8,1 ++ std r9,0(r10) ++ addic. r8,r8,-2 ++ bne cr7,L(zero_pad_loop_dw) ++ addi r10,r10,8 ++L(zero_pad_loop_dw_2): ++ rldicl r5,r5,0,61 ++L(zero_pad_loop_b_start): ++ cmpdi cr7,r5,0 ++ addi r5,r5,-1 ++ addi r9,r10,-1 ++ add r10,r10,5 ++ subf r10,r9,r10 ++ li r8,0 ++ beq- cr7,L(short_path_loop_end) ++ ++ /* Write remaining 1-8 bytes. */ ++ .align 4 ++ addi r9,r9,1 ++ mtocrf 0x1,r10 ++ bf 29,4f ++ stw r8,0(r9) ++ addi r9,r9,4 ++ ++ .align 4 ++4: bf 30,2f ++ sth r8,0(r9) ++ addi r9,r9,2 ++ ++ .align 4 ++2: bf 31,1f ++ stb r8,0(r9) ++ ++ /* Restore non-volatile registers. */ ++1: ld r26,-48(r1) ++ ld r27,-40(r1) ++ ld r28,-32(r1) ++ ld r29,-24(r1) ++ ld r30,-16(r1) ++ ld r31,-8(r1) ++ blr ++ ++ /* The common case where [src]+16 will not cross a 4K page boundary. ++ In this case the code fast check the first 16 bytes by using doubleword ++ read/compares and update destiny if neither total size or null byte ++ is found in destiny. */ ++ .align 4 ++L(unaligned_lt_16): ++ cmpldi cr7,r5,7 ++ ble cr7,L(short_path) ++ ld r7,0(r4) ++ li r8,0 ++ cmpb r8,r7,r8 ++ cmpdi cr7,r8,0 ++ bne cr7,L(short_path_prepare_2) ++ addi r6,r5,-8 ++ std r7,0(r3) ++ addi r9,r3,r8 ++ cmpldi cr7,r6,7 ++ addi r7,r4,8 ++ ble cr7,L(short_path_prepare_1_1) ++ ld r4,8(r4) ++ cmpb r8,r4,r8 ++ cmpdi cr7,r8,0 ++ bne cr7,L(short_path_prepare_2_1) ++ std r4,8(r3) ++ addi r29,r3,16 ++ addi r5,r5,-16 ++ /* Neither the null byte was found or total length was reached, ++ align to 16 bytes and issue a bulk copy/compare. */ ++ b L(align_to_16b) ++ ++ /* In the case of 4k page boundary cross, the algorithm first align ++ the address to a doubleword, calculate a mask based on alignment ++ to ignore the bytes and continue using doubleword. */ ++ .align 4 ++L(pagecross): ++ rldicr r11,r4,0,59 /* Align the address to 8 bytes boundary. */ ++ li r6,-1 /* MASK = 0xffffffffffffffffUL. */ ++ sldi r9,r9,3 /* Calculate padding. */ ++ ld r7,0(r11) /* Load doubleword from memory. */ ++#ifdef __LITTLE_ENDIAN__ ++ sld r9,r6,r9 /* MASK = MASK << padding. */ ++#else ++ srd r9,r6,r9 /* MASK = MASK >> padding. */ ++#endif ++ orc r9,r7,r9 /* Mask bits that are not part of the ++ string. */ ++ li cr7,0 ++ cmpb r9,r9,r7 /* Check for null bytes in DWORD1. */ ++ cmpdi cr7,r9,0 ++ bne cr7,L(short_path_prepare_2) ++ subf r8,r8,r5 /* Adjust total length. */ ++ cmpldi cr7,r8,8 /* Check if length was reached. */ ++ ble cr7,L(short_path_prepare_2) ++ ++ /* For next checks we have aligned address, so we check for more ++ three doublewords to make sure we can read 16 unaligned bytes ++ to start the bulk copy with 16 aligned addresses. */ ++ ld cr7,8(r11) ++ cmpb r9,r7,r9 ++ cmpdi cr7,r9,0 ++ bne cr7,L(short_path_prepare_2) ++ addi cr7,r8,-8 ++ cmpldi cr7,r7,8 ++ ble cr7,L(short_path_prepare_2) ++ ld cr7,16(r11) ++ cmpb r9,r7,r9 ++ cmpdi cr7,r9,0 ++ bne cr7,L(short_path_prepare_2) ++ addi r8,r8,-16 ++ cmpldi r7,r8,8 ++ ble cr7,L(short_path_prepare_2) ++ ld r8,24(r11) ++ cmpb r9,r8,r9 ++ cmpdi r7,r9,0 ++ bne cr7,L(short_path_prepare_2) ++ ++ /* No null byte found in the 32 bytes readed and length not reached, ++ read source again using unaligned loads and store them. */ ++ ld r9,0(r4) ++ addi r29,r3,16 ++ addi r5,r5,-16 ++ std r9,0(r3) ++ ld r9,8(r4) ++ std r9,8(r3) ++ ++ /* Align source to 16 bytes and adjust destiny and size. */ ++L(align_to_16b): ++ rldicl r9,r10,0,60 ++ rldicr r28,r10,0,59 ++ add r12,r5,r9 ++ subf r29,r9,r29 ++ ++ /* The bulk read/compare/copy loads two doublewords, compare and merge ++ in a single register for speed. This is an attempt to speed up the ++ null-checking process for bigger strings. */ ++ ++ cmpldi cr7,r12,15 ++ ble cr7,L(short_path_prepare_1_2) ++ ++ /* Main loop for large sizes, unrolled 2 times to get better use of ++ pipeline. */ ++ ld r8,0(28) ++ ld r10,8(28) ++ li r9,0 ++ cmpb r7,r8,r9 ++ cmpb r9,r10,r9 ++ or. r6,r9,r7 ++ bne cr0,L(short_path_prepare_2_3) ++ addi r5,r12,-16 ++ addi r4,r28,16 ++ std r8,0(r29) ++ std r10,8(r29) ++ cmpldi cr7,r5,15 ++ addi r9,r29,16 ++ ble cr7,L(short_path_1) ++ mr r11,r28 ++ mr r6,r29 ++ li r30,0 ++ subfic r26,r4,48 ++ subfic r27,r9,48 ++ ++ b L(loop_16b) ++ ++ .align 4 ++L(loop_start): ++ ld r31,0(r11) ++ ld r10,8(r11) ++ cmpb r0,r31,r7 ++ cmpb r8,r10,r7 ++ or. r7,r0,r8 ++ addi r5,r5,-32 ++ cmpldi cr7,r5,15 ++ add r4,r4,r26 ++ add r9,r9,r27 ++ bne cr0,L(short_path_prepare_2_2) ++ add r4,r28,r4 ++ std r31,0(r6) ++ add r9,r29,r9 ++ std r10,8(r6) ++ ble cr7,L(short_path_1) ++ ++L(loop_16b): ++ ld r10,16(r11) ++ ld r0,24(r11) ++ cmpb r8,r10,r30 ++ cmpb r7,r0,r30 ++ or. r7,r8,r7 ++ addi r12,r12,-32 ++ cmpldi r7,r12,15 ++ addi r11,r11,32 ++ bne cr0,L(short_path_2) ++ std r10,16(r6) ++ addi r6,r6,32 ++ std r0,-8(r6) ++ bgt cr7,L(loop_start) ++ ++ mr r5,r12 ++ mr r4,r11 ++ mr r9,r6 ++ b L(short_path_1) ++ ++ .align 4 ++L(short_path_prepare_1_1): ++ mr r5,r6 ++ mr r4,r7 ++ b L(short_path_1) ++L(short_path_prepare_1_2): ++ mr r5,r12 ++ mr r4,r28 ++ mr r9,r29 ++ b L(short_path_1) ++L(short_path_prepare_2): ++ mr r9,r3 ++ b L(short_path_2) ++L(short_path_prepare_2_1): ++ mr r5,r6 ++ mr r4,r7 ++ b L(short_path_2) ++L(short_path_prepare_2_2): ++ mr r5,r12 ++ mr r4,r11 ++ mr r9,r6 ++ b L(short_path_2) ++L(short_path_prepare_2_3): ++ mr r5,r12 ++ mr r4,r28 ++ mr r9,r29 ++ b L(short_path_2) ++L(zero_pad_loop_b_prepare): ++ addi r10,r9,8 ++ rldicl r5,r5,0,61 ++ b L(zero_pad_loop_b_start) ++L(zero_pad_start_prepare_1): ++ mr r5,r6 ++ mr r9,r8 ++ b L(zero_pad_start_1) ++END (FUNC_NAME) ++ ++#ifdef USE_AS_STPNCPY ++libc_hidden_def (__stpncpy) ++#else ++libc_hidden_builtin_def (strncpy) ++#endif diff --git a/SOURCES/glibc-rh1240351-9.patch b/SOURCES/glibc-rh1240351-9.patch new file mode 100644 index 0000000..4bd0515 --- /dev/null +++ b/SOURCES/glibc-rh1240351-9.patch @@ -0,0 +1,730 @@ + Backport of + commit 8bedcb5f03c62bf6001396dafdd82fbd4da7c2db + Author: Adhemerval Zanella + Date: Wed Jan 7 07:18:30 2015 -0500 + + powerpc: Optimized strcmp for POWER8/PPC64 + + This patch adds an optimized POWER8 strcmp using unaligned accesses. + The algorithm first check the initial 16 bytes, then align the first + function source and uses unaligned loads on second argument only. + Aditional checks for page boundaries are done for unaligned cases + + ChangeLog: + 2015-01-13 Adhemerval Zanella + + * sysdeps/powerpc/powerpc64/multiarch/Makefile [sysdep_routines]: + Add strcmp-power8 object. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add __strcmp_power8 implementation. + * sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S: New file. + * sysdeps/powerpc/powerpc64/multiarch/strcmp.c (strcmp): Add + __strcmp_power8 implementation. + * sysdeps/powerpc/powerpc64/power8/strcmp.S: New file. + * NEWS: Update. + + and its dependency: + commit e23d3d2690bf63207b1a47e83a94693daebbbfe5 + Author: Vidya Ranganathan + Date: Fri Jun 6 07:56:07 2014 -0500 + + PowerPC: Optimized strcmp for PPC64/POWER7 + + Optimization is achieved on 8 byte aligned strings with double word + comparison using cmpb instruction. On unaligned strings loop unrolling + is applied for Power7 gain. + + ChangeLog: + 2014-06-11 Vidya Ranganathan + + * sysdeps/powerpc/powerpc64/power7/strcmp.S: New file: Optimization. + * sysdeps/powerpc/powerpc64/multiarch/strcmp.c: New file: + multiarch strcmp for PPC64. + * sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S: New file. + * sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S: New file. + * sysdeps/powerpc/powerpc64/multiarch/Makefile: Add strcmp + multiarch optimizations. + * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c: + (__libc_ifunc_impl_list): Likewise. + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index ef39917..27c8b65 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -7,9 +7,10 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ + memrchr-power7 memrchr-ppc64 rawmemchr-power7 \ + stpcpy-power8 stpcpy-power7 stpcpy-ppc64 \ + strcat-power8 strcat-power7 strcat-ppc64 \ ++ strcmp-power8 strcmp-power7 strcmp-ppc64 \ + strcpy-power8 strcpy-power7 strcpy-ppc64 \ + stpncpy-power8 stpncpy-power7 stpncpy-ppc64 \ +- strncpy-power8 strncpy-power7 strncpy-ppc64 ++ strncpy-power8 strncpy-power7 strncpy-ppc64 \ + strncat-power7 \ + rawmemchr-ppc64 strlen-power7 strlen-ppc64 strnlen-power7 \ + strnlen-ppc64 strcasecmp-power7 strcasecmp_l-power7 \ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index 23bf5dc..2b38c71 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -277,5 +277,15 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_IMPL_ADD (array, i, stpncpy, 1, + __stpncpy_ppc)) + ++ /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c. */ ++ IFUNC_IMPL (i, name, strcmp, ++ IFUNC_IMPL_ADD (array, i, strcmp, ++ hwcap2 & PPC_FEATURE2_ARCH_2_07, ++ __strcmp_power8) ++ IFUNC_IMPL_ADD (array, i, strcmp, ++ hwcap & PPC_FEATURE_HAS_VSX, ++ __strcmp_power7) ++ IFUNC_IMPL_ADD (array, i, strcmp, 1, ++ __strcmp_ppc)) + return i; + } +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S +new file mode 100644 +index 0000000..790ce8d +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power7.S +@@ -0,0 +1,40 @@ ++/* Optimized strcmp implementation for POWER7. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strcmp_power7) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strcmp_power7): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strcmp_power7) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strcmp_power7) \ ++ END_2(__strcmp_power7) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S +new file mode 100644 +index 0000000..dc4bfac +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power8.S +@@ -0,0 +1,40 @@ ++/* Optimized strcmp implementation for POWER8/PPC64. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#undef EALIGN ++#define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strcmp_power8) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strcmp_power8): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strcmp_power8) ++ ++#undef END ++#define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strcmp_power8) \ ++ END_2(__strcmp_power8) ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S +new file mode 100644 +index 0000000..93d1277 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S +@@ -0,0 +1,43 @@ ++/* Default strcmp implementation for PowerPC64. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#if defined SHARED && !defined NOT_IN_libc ++# undef EALIGN ++# define EALIGN(name, alignt, words) \ ++ .section ".text"; \ ++ ENTRY_2(__strcmp_ppc) \ ++ .align ALIGNARG(alignt); \ ++ EALIGN_W_##words; \ ++ BODY_LABEL(__strcmp_ppc): \ ++ cfi_startproc; \ ++ LOCALENTRY(__strcmp_ppc) ++ ++# undef END ++# define END(name) \ ++ cfi_endproc; \ ++ TRACEBACK(__strcmp_ppc) \ ++ END_2(__strcmp_ppc) ++ ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ .globl __GI_strcmp; __GI_strcmp = __strcmp_ppc ++#endif ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c +new file mode 100644 +index 0000000..c711969 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c +@@ -0,0 +1,34 @@ ++/* Multiple versions of strcmp. PowerPC64 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined SHARED && !defined NOT_IN_libc ++# include ++# include ++# include "init-arch.h" ++ ++extern __typeof (strcmp) __strcmp_ppc attribute_hidden; ++extern __typeof (strcmp) __strcmp_power7 attribute_hidden; ++extern __typeof (strcmp) __strcmp_power8 attribute_hidden; ++ ++libc_ifunc (strcmp, ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __strcmp_power8 : ++ (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strcmp_power7 ++ : __strcmp_ppc); ++#endif +diff --git a/sysdeps/powerpc/powerpc64/power7/strcmp.S b/sysdeps/powerpc/powerpc64/power7/strcmp.S +new file mode 100644 +index 0000000..f16a9d8 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power7/strcmp.S +@@ -0,0 +1,195 @@ ++/* Optimized strcmp implementation for Power7 using 'cmpb' instruction ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* The optimization is achieved here through cmpb instruction. ++ 8byte aligned strings are processed with double word comparision ++ and unaligned strings are handled effectively with loop unrolling ++ technique */ ++ ++#include ++ ++/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */ ++ ++EALIGN (strcmp, 4, 0) ++ CALL_MCOUNT 2 ++ ++ or r9, r3, r4 ++ rldicl. r10, r9, 0, 61 /* are s1 and s2 8 byte aligned..? */ ++ bne cr0, L(process_unaligned_bytes) ++ ++/* process input parameters on double word aligned boundary */ ++ ld r9, 0(r4) /* load s2 at offset=0 */ ++ li r10, 0 /* load mask=0 */ ++ cmpb r10, r9, r10 /* compare bytes at s2 with mask */ ++ cmpdi cr7, r10, 0 /* is NULL found ..? is end of string HIT */ ++ bne cr7, L(process_unaligned_bytes) /* process byte by byte */ ++ ++ ld r10, 0(r3) /* load s1 at offset=0 */ ++ li r8, 0 /* load mask=0 */ ++ cmpb r8, r10, r8 /* compare bytes at s1 with mask */ ++ cmpdi cr7, r8, 0 /* is NULL found ..? is end of string HIT */ ++ bne cr7, L(process_unaligned_bytes) /* process byte by byte */ ++ ++/*s1 and s2 does not contain NULL now , so compare all 8 bytes in a GO */ ++ cmpb r9, r10, r9 /* compare s1 and s2 */ ++ cmpdi cr7, r9, -1 /* compare result with 0xFFFFFFFFFFFFFFFF */ ++ bne cr7, L(process_unaligned_bytes) /* s1,s2 mismatch found */ ++ ++ addi r5, r3, 8 /* save next offset of s2 */ ++ addi r11, r4, 8 /* save next offset of s1 */ ++ ld r8, 8(r4) /* load s2 at offset=8 */ ++ li r9, 0 /* load mask=0 */ ++ cmpb r9, r8, r9 /* compare bytes at s2 with mask */ ++ cmpdi cr7, r9, 0 /* NULL found ..? */ ++ bne cr7, L(processBytes)/* update input and process bytes one by one */ ++ ++ mr r9, r4 /* save s2 */ ++ li r10, 0 /* load mask=0 */ ++ ++ ld r7, 8(r3) /* load s1 at offset=8 */ ++ cmpb r6, r7, r10 /* compare bytes at s1 with mask */ ++ cmpdi cr7, r6, 0 /* is NULL found */ ++ bne cr7, L(processBytes)/* mismatch, so process one by one */ ++ ++L(unrollDword): ++ cmpb r8, r7, r8 /* compare s1 and s2 */ ++ cmpdi cr7, r8, -1 /* compare result with 0xFFFFFFFFFFFFFFFF */ ++ bne cr7, L(processBytes)/* mismatch with s1 and s2 */ ++ ++ addi r5, r3, 16 /* save offset=16 of s1 */ ++ addi r4, r9, 16 /* save offset=16 of s2 */ ++ ld r8, 16(r9) /* load s2 at offset=16 */ ++ cmpb r7, r8, r10 /* compare bytes at s2 with mask */ ++ cmpdi cr7, r7, 0 /* NULL found ..? */ ++ bne cr7, L(update2processBytes) ++ ++ ld r7, 16(r3) /* load s1 at offset=16 */ ++ cmpb r6, r7, r10 /* check s1 for end of string */ ++ cmpdi cr7, r6, 0 /* end of s1 ?,then handle byte by byte */ ++ bne 7,L(update2processBytes) ++ ++ cmpb r8, r7, r8 /* compare s1 and s2 double words */ ++ cmpdi cr7, r8, -1 /* compare results with 0xFFFFFFFFFFFFFFFF */ ++ bne cr7,L(update2processBytes) ++ ++ addi r5, r3, 24 /* update s1 to offset=24 */ ++ addi r4, r9, 24 /* update s2 to offset=24 */ ++ ++ ld r8, 24(r9) /* load s2 */ ++ cmpb r7, r8, r10 /* compare s2 for NULL */ ++ cmpdi cr7, r7, 0 /* verify if s2 is ending now */ ++ bne cr7,L(update2processBytes) ++ ++ ld r7, 24(r3) /* load s1 at offset=24 */ ++ cmpb r6, r7, r10 /* verify for NULL */ ++ cmpdi cr7, r6, 0 /* is NULL found */ ++ bne cr7, L(update2processBytes) ++ ++ cmpb r8, r7, r8 /* compare s1 and s2 */ ++ cmpdi cr7, r8, -1 /* are s1 and s2 same ..? */ ++ bne cr7, L(update2processBytes) ++ ++ addi r7, r9, 32 /* update s2 to next double word */ ++ addi r3, r3, 32 /* update s1 to next double word */ ++ ++ ld r8, 32(r9) /* load s2 */ ++ mr r4, r7 /* save s2 */ ++ cmpb r6, r8, r10 /* compare s2 with NULL */ ++ cmpdi cr7, r6, 0 /* end of s2 ..? */ ++ bne cr7, L(process_unaligned_bytes) ++ ++ ld r6, 0(r3) /* load and compare s1 for NULL */ ++ cmpb r5, r6, r10 ++ cmpdi cr7, r5, 0 ++ bne cr7, L(process_unaligned_bytes) ++ ++ cmpb r8, r6, r8 /* compare s1 and s2 */ ++ cmpdi cr7, r8, -1 ++ bne cr7, L(process_unaligned_bytes) ++ ++ addi r5, r3, 8 /* increment s1 and d2 here */ ++ addi r11, r9, 40 ++ ++ ld r8, 40(r9) /* process s2 now */ ++ cmpb r9, r8, r10 ++ cmpdi cr7, r9, 0 ++ bne cr7, L(processBytes) ++ ++ mr r9, r7 ++ ld r7, 8(r3) /* process s1 now */ ++ cmpb r6, r7, r10 ++ cmpdi cr7, r6, 0 ++ beq cr7, L(unrollDword) /* unroll to compare s1 and s2 */ ++ ++L(processBytes): ++ mr r4, r11 /* update input params */ ++ mr r3, r5 ++ ++ .p2align 4 ++L(process_unaligned_bytes): ++ lbz r9, 0(r3) /* load byte from s1 */ ++ lbz r10, 0(r4) /* load byte from s2 */ ++ cmpdi cr7, r9, 0 /* compare *s1 with NULL */ ++ beq cr7, L(diffOfNULL) /* if *s1 is NULL , return *s1 - *s2 */ ++ cmplw cr7, r9, r10 /* compare *s1 and *s2 */ ++ bne cr7, L(ComputeDiff) /* branch to compute difference and return */ ++ ++ lbz r9, 1(r3) /* load next byte from s1 */ ++ lbz r10, 1(r4) /* load next byte from s2 */ ++ cmpdi cr7, r9, 0 /* compare *s1 with NULL */ ++ beq cr7, L(diffOfNULL) /* if *s1 is NULL , return *s1 - *s2 */ ++ cmplw cr7, r9, r10 /* compare *s1 and *s2 */ ++ bne cr7, L(ComputeDiff) /* branch to compute difference and return */ ++ ++ lbz r9, 2(r3) /* unroll 3rd byte here */ ++ lbz r10, 2(r4) ++ cmpdi cr7, r9, 0 ++ beq cr7, L(diffOfNULL) ++ cmplw cr7, r9, r10 ++ bne 7, L(ComputeDiff) ++ ++ lbz r9, 3(r3) /* unroll 4th byte now */ ++ lbz r10, 3(r4) ++ addi r3, r3, 4 /* increment s1 by unroll factor */ ++ cmpdi cr7, r9, 0 ++ cmplw cr6, 9, r10 ++ beq cr7, L(diffOfNULL) ++ addi r4, r4, 4 /* increment s2 by unroll factor */ ++ beq cr6, L(process_unaligned_bytes) /* unroll byte processing */ ++ ++ .p2align 4 ++L(ComputeDiff): ++ extsw r9, r9 ++ subf r10, r10, r9 /* compute s1 - s2 */ ++ extsw r3, r10 ++ blr /* return */ ++ ++ .p2align 4 ++L(diffOfNULL): ++ li r9, 0 ++ subf r10, r10, r9 /* compute s1 - s2 */ ++ extsw r3, r10 /* sign extend result */ ++ blr /* return */ ++ ++ .p2align 4 ++L(update2processBytes): ++ mr r3, r5 /* update and proceed */ ++ b L(process_unaligned_bytes) ++ ++END (strcmp) ++libc_hidden_builtin_def (strcmp) +diff --git a/sysdeps/powerpc/powerpc64/power8/strcmp.S b/sysdeps/powerpc/powerpc64/power8/strcmp.S +new file mode 100644 +index 0000000..223d891 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/power8/strcmp.S +@@ -0,0 +1,257 @@ ++/* Optimized strcmp implementation for PowerPC64/POWER8. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++/* Implements the function ++ ++ size_t [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) ++ ++ The implementation uses unaligned doubleword access to avoid specialized ++ code paths depending of data alignment. Although recent powerpc64 uses ++ 64K as default, the page cross handling assumes minimum page size of ++ 4k. */ ++ ++EALIGN (strcmp, 4, 0) ++ li r0,0 ++ ++ /* Check if [s1]+32 or [s2]+32 will cross a 4K page boundary using ++ the code: ++ ++ (((size_t) s1) % PAGE_SIZE > (PAGE_SIZE - ITER_SIZE)) ++ ++ with PAGE_SIZE being 4096 and ITER_SIZE begin 32. */ ++ ++ rldicl r7,r3,0,52 ++ rldicl r9,r4,0,52 ++ cmpldi cr7,r7,4096-32 ++ bgt cr7,L(pagecross_check) ++ cmpldi cr5,r9,4096-32 ++ bgt cr5,L(pagecross_check) ++ ++ /* For short string up to 32 bytes, load both s1 and s2 using ++ unaligned dwords and compare. */ ++ ld r8,0(r3) ++ ld r10,0(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ ld r8,8(r3) ++ ld r10,8(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ ld r8,16(r3) ++ ld r10,16(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ ld r8,24(r3) ++ ld r10,24(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ addi r7,r3,32 ++ addi r4,r4,32 ++ ++L(align_8b): ++ /* Now it has checked for first 32 bytes, align source1 to doubleword ++ and adjust source2 address. */ ++ rldicl r9,r7,0,61 /* source1 alignment to doubleword */ ++ subf r4,r9,r4 /* Adjust source2 address based on source1 ++ alignment. */ ++ rldicr r7,r7,0,60 /* Align source1 to doubleword. */ ++ ++ /* At this point, source1 alignment is 0 and source2 alignment is ++ between 0 and 7. Check is source2 alignment is 0, meaning both ++ sources have the same alignment. */ ++ andi. r9,r4,0x7 ++ bne cr0,L(loop_diff_align) ++ ++ /* If both source1 and source2 are doubleword aligned, there is no ++ need for page boundary cross checks. */ ++ ++ ld r8,0(r7) ++ ld r10,0(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ .align 4 ++L(loop_equal_align): ++ ld r8,8(r7) ++ ld r10,8(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ ld r8,16(r7) ++ ld r10,16(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ ldu r8,24(r7) ++ ldu r10,24(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ ++ b L(loop_equal_align) ++ ++ /* A zero byte was found in r8 (s1 dword), r9 contains the cmpb ++ result and r10 the dword from s2. To code isolate the byte ++ up to end (including the '\0'), masking with 0xFF the remaining ++ ones: ++ ++ #if __LITTLE_ENDIAN__ ++ (__builtin_ffsl (x) - 1) = counting trailing zero bits ++ r9 = (__builtin_ffsl (r9) - 1) + 8; ++ r9 = -1UL << r9 ++ #else ++ r9 = __builtin_clzl (r9) + 8; ++ r9 = -1UL >> r9 ++ #endif ++ r8 = r8 | r9 ++ r10 = r10 | r9 */ ++ ++#ifdef __LITTLE_ENDIAN__ ++ nor r9,r9,r9 ++L(different_nocmpb): ++ neg r3,r9 ++ and r9,r9,r3 ++ cntlzd r9,r9 ++ subfic r9,r9,63 ++#else ++ not r9,r9 ++L(different_nocmpb): ++ cntlzd r9,r9 ++ subfic r9,r9,56 ++#endif ++ srd r3,r8,r9 ++ srd r10,r10,r9 ++ rldicl r10,r10,0,56 ++ rldicl r3,r3,0,56 ++ subf r3,r10,r3 ++ extsw r3,r3 ++ blr ++ ++ .align 4 ++L(pagecross_check): ++ subfic r9,r9,4096 ++ subfic r7,r7,4096 ++ cmpld cr7,r7,r9 ++ bge cr7,L(pagecross) ++ mr r7,r9 ++ ++ /* If unaligned 16 bytes reads across a 4K page boundary, it uses ++ a simple byte a byte comparison until the page alignment for s1 ++ is reached. */ ++L(pagecross): ++ add r7,r3,r7 ++ subf r9,r3,r7 ++ mtctr r9 ++ ++ .align 4 ++L(pagecross_loop): ++ /* Loads a byte from s1 and s2, compare if *s1 is equal to *s2 ++ and if *s1 is '\0'. */ ++ lbz r9,0(r3) ++ lbz r10,0(r4) ++ addi r3,r3,1 ++ addi r4,r4,1 ++ cmplw cr7,r9,r10 ++ cmpdi cr5,r9,r0 ++ bne cr7,L(pagecross_ne) ++ beq cr5,L(pagecross_nullfound) ++ bdnz L(pagecross_loop) ++ b L(align_8b) ++ ++ .align 4 ++ /* The unaligned read of source2 will cross a 4K page boundary, ++ and the different byte or NULL maybe be in the remaining page ++ bytes. Since it can not use the unaligned load, the algorithm ++ reads and compares 8 bytes to keep source1 doubleword aligned. */ ++L(check_source2_byte): ++ li r9,8 ++ mtctr r9 ++ ++ .align 4 ++L(check_source2_byte_loop): ++ lbz r9,0(r7) ++ lbz r10,0(r4) ++ addi r7,r7,1 ++ addi r4,r4,1 ++ cmplw cr7,r9,10 ++ cmpdi r5,r9,0 ++ bne cr7,L(pagecross_ne) ++ beq cr5,L(pagecross_nullfound) ++ bdnz L(check_source2_byte_loop) ++ ++ /* If source2 is unaligned to doubleword, the code needs to check ++ on each interation if the unaligned doubleword access will cross ++ a 4k page boundary. */ ++ .align 5 ++L(loop_unaligned): ++ ld r8,0(r7) ++ ld r10,0(r4) ++ cmpb r12,r8,r0 ++ cmpb r11,r8,r10 ++ orc. r9,r12,r11 ++ bne cr0,L(different_nocmpb) ++ addi r7,r7,8 ++ addi r4,r4,8 ++ ++L(loop_diff_align): ++ /* Check if [src2]+8 cross a 4k page boundary: ++ ++ srcin2 % PAGE_SIZE > (PAGE_SIZE - 8) ++ ++ with PAGE_SIZE being 4096. */ ++ rldicl r9,r4,0,52 ++ cmpldi cr7,r9,4088 ++ ble cr7,L(loop_unaligned) ++ b L(check_source2_byte) ++ ++ .align 4 ++L(pagecross_ne): ++ extsw r3,r9 ++ mr r9,r10 ++L(pagecross_retdiff): ++ subf r9,r9,r3 ++ extsw r3,r9 ++ blr ++ ++ .align 4 ++L(pagecross_nullfound): ++ li r3,0 ++ b L(pagecross_retdiff) ++END (strcmp) ++libc_hidden_builtin_def (strcmp) diff --git a/SOURCES/glibc-rh1249114.patch b/SOURCES/glibc-rh1249114.patch new file mode 100644 index 0000000..e489a37 --- /dev/null +++ b/SOURCES/glibc-rh1249114.patch @@ -0,0 +1,390 @@ +commit c283946eb7d25a856563cc5cd7d09a151b6801d0 +Author: Stefan Liebler +Date: Fri Jul 31 13:23:12 2015 +0200 + + S/390: Fix setcontext/swapcontext which are not restoring sigmask. + + 2015-03-12 Stefan Liebler + + [BZ #18080] + * sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S + (__setcontext): Use SIG_SETMASK instead of SIG_BLOCK. + * sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S + (__setcontext): Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S + (__swapcontext): Use SIG_SETMASK instead of SIG_BLOCK. + Call rt_sigprocmask syscall one time to set new signal mask + and retrieve the current signal mask instead of two calls. + * sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S + (__swapcontext): Likewise. + * stdlib/Makefile (tests): Add new testcase tst-setcontext2. + * stdlib/tst-setcontext2.c: New file. + +diff --git a/stdlib/Makefile b/stdlib/Makefile +index 5e99d7f..8f22c8d 100644 +--- a/stdlib/Makefile ++++ b/stdlib/Makefile +@@ -64,10 +64,10 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ + test-canon test-canon2 tst-strtoll tst-environ \ + tst-xpg-basename tst-random tst-random2 tst-bsearch \ + tst-limits tst-rand48 bug-strtod tst-setcontext \ +- test-a64l tst-qsort tst-system testmb2 bug-strtod2 \ +- tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 tst-rand48-2 \ +- tst-makecontext tst-strtod4 tst-strtod5 tst-qsort2 \ +- tst-makecontext2 tst-strtod6 tst-unsetenv1 \ ++ tst-setcontext2 test-a64l tst-qsort tst-system testmb2 \ ++ bug-strtod2 tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 \ ++ tst-rand48-2 tst-makecontext tst-strtod4 tst-strtod5 \ ++ tst-qsort2 tst-makecontext2 tst-strtod6 tst-unsetenv1 \ + tst-makecontext3 bug-getcontext bug-fmtmsg1 \ + tst-secure-getenv tst-strtod-overflow tst-strtod-round \ + tst-tininess tst-strtod-underflow +diff --git a/stdlib/tst-setcontext2.c b/stdlib/tst-setcontext2.c +new file mode 100644 +index 0000000..8582cc0 +--- /dev/null ++++ b/stdlib/tst-setcontext2.c +@@ -0,0 +1,230 @@ ++/* Testcase checks, if setcontext(), swapcontext() restores signal-mask ++ and if pending signals are delivered after those calls. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++volatile int global; ++volatile sig_atomic_t handlerCalled; ++ ++static void ++check (const char *funcName) ++{ ++ sigset_t set; ++ ++ /* check if SIGUSR2 is unblocked after setcontext-call. */ ++ sigprocmask (SIG_BLOCK, NULL, &set); ++ ++ if (sigismember (&set, SIGUSR2) != 0) ++ { ++ printf ("FAIL: SIGUSR2 is blocked after %s.\n", funcName); ++ exit (1); ++ } ++ ++ if (sigismember (&set, SIGUSR1) != 1) ++ { ++ printf ("FAIL: SIGUSR1 is not blocked after %s.\n", funcName); ++ exit (1); ++ } ++} ++ ++static void ++signalmask (int how, int signum) ++{ ++ sigset_t set; ++ sigemptyset (&set); ++ sigaddset (&set, signum); ++ if (sigprocmask (how, &set, NULL) != 0) ++ { ++ printf ("FAIL: sigprocmaks (%d, %d, NULL): %m\n", how, signum); ++ exit (1); ++ } ++} ++ ++static void ++signalpending (int signum, const char *msg) ++{ ++ sigset_t set; ++ sigemptyset (&set); ++ if (sigpending (&set) != 0) ++ { ++ printf ("FAIL: sigpending: %m\n"); ++ exit (1); ++ } ++ if (sigismember (&set, SIGUSR2) != 1) ++ { ++ printf ("FAIL: Signal %d is not pending %s\n", signum, msg); ++ exit (1); ++ } ++} ++ ++static void ++handler (int __attribute__ ((unused)) signum) ++{ ++ handlerCalled ++; ++} ++ ++static int ++do_test (void) ++{ ++ ucontext_t ctx, oldctx; ++ struct sigaction action; ++ pid_t pid; ++ ++ pid = getpid (); ++ ++ /* unblock SIGUSR2 */ ++ signalmask (SIG_UNBLOCK, SIGUSR2); ++ ++ /* block SIGUSR1 */ ++ signalmask (SIG_BLOCK, SIGUSR1); ++ ++ /* register handler for SIGUSR2 */ ++ action.sa_flags = 0; ++ action.sa_handler = handler; ++ sigemptyset (&action.sa_mask); ++ sigaction (SIGUSR2, &action, NULL); ++ ++ if (getcontext (&ctx) != 0) ++ { ++ printf ("FAIL: getcontext: %m\n"); ++ exit (1); ++ } ++ ++ global++; ++ ++ if (global == 1) ++ { ++ puts ("after getcontext"); ++ ++ /* block SIGUSR2 */ ++ signalmask (SIG_BLOCK, SIGUSR2); ++ ++ /* send SIGUSR2 to me */ ++ handlerCalled = 0; ++ kill (pid, SIGUSR2); ++ ++ /* was SIGUSR2 handler called? */ ++ if (handlerCalled != 0) ++ { ++ puts ("FAIL: signal handler was called, but signal was blocked."); ++ exit (1); ++ } ++ ++ /* is SIGUSR2 pending? */ ++ signalpending (SIGUSR2, "before setcontext"); ++ ++ /* SIGUSR2 will be unblocked by setcontext-call. */ ++ if (setcontext (&ctx) != 0) ++ { ++ printf ("FAIL: setcontext: %m\n"); ++ exit (1); ++ } ++ } ++ else if (global == 2) ++ { ++ puts ("after setcontext"); ++ ++ /* check SIGUSR1/2 */ ++ check ("setcontext"); ++ ++ /* was SIGUSR2 handler called? */ ++ if (handlerCalled != 1) ++ { ++ puts ("FAIL: signal handler was not called after setcontext."); ++ exit (1); ++ } ++ ++ /* block SIGUSR2 */ ++ signalmask (SIG_BLOCK, SIGUSR2); ++ ++ /* send SIGUSR2 to me */ ++ handlerCalled = 0; ++ kill (pid, SIGUSR2); ++ ++ /* was SIGUSR2 handler called? */ ++ if (handlerCalled != 0) ++ { ++ puts ("FAIL: signal handler was called, but signal was blocked."); ++ exit (1); ++ } ++ ++ /* is SIGUSR2 pending? */ ++ signalpending (SIGUSR2, "before swapcontext"); ++ ++ if (swapcontext (&oldctx, &ctx) != 0) ++ { ++ printf ("FAIL: swapcontext: %m\n"); ++ exit (1); ++ } ++ ++ puts ("after returned from swapcontext"); ++ ++ if (global != 3) ++ { ++ puts ("FAIL: returned from swapcontext without ctx-context called."); ++ exit (1); ++ } ++ ++ puts ("test succeeded"); ++ return 0; ++ } ++ else if ( global != 3 ) ++ { ++ puts ("FAIL: 'global' not incremented three times"); ++ exit (1); ++ } ++ ++ puts ("after swapcontext"); ++ /* check SIGUSR1/2 */ ++ check ("swapcontext"); ++ ++ /* was SIGUSR2 handler called? */ ++ if (handlerCalled != 1) ++ { ++ puts ("FAIL: signal handler was not called after swapcontext."); ++ exit (1); ++ } ++ ++ /* check sigmask in old context of swapcontext-call */ ++ if (sigismember (&oldctx.uc_sigmask, SIGUSR2) != 1) ++ { ++ puts ("FAIL: SIGUSR2 is not blocked in oldctx.uc_sigmask."); ++ exit (1); ++ } ++ ++ if (sigismember (&oldctx.uc_sigmask, SIGUSR1) != 1) ++ { ++ puts ("FAIL: SIGUSR1 is not blocked in oldctx.uc_sigmaks."); ++ exit (1); ++ } ++ ++ /* change to old context, which was gathered by swapcontext() call. */ ++ setcontext (&oldctx); ++ ++ puts ("FAIL: returned from setcontext (&oldctx)"); ++ exit (1); ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S +index b19fd8d..5f60f49 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S +@@ -34,7 +34,7 @@ ENTRY(__setcontext) + lr %r1,%r2 + + /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ +- la %r2,SIG_BLOCK ++ la %r2,SIG_SETMASK + la %r3,SC_MASK(%r1) + slr %r4,%r4 + lhi %r5,_NSIG8 +diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S +index 092f2bc..dc21b44 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S +@@ -24,7 +24,7 @@ + /* __swapcontext (ucontext_t *oucp, const ucontext_t *ucp) + + Saves the machine context in oucp such that when it is activated, +- it appears as if __swapcontextt() returned again, restores the ++ it appears as if __swapcontext() returned again, restores the + machine context in ucp and thereby resumes execution in that + context. + +@@ -36,13 +36,6 @@ ENTRY(__swapcontext) + lr %r1,%r2 + lr %r0,%r3 + +- /* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */ +- la %r2,SIG_BLOCK +- slr %r3,%r3 +- la %r4,SC_MASK(%r1) +- lhi %r5,_NSIG8 +- svc SYS_ify(rt_sigprocmask) +- + /* Store fpu context. */ + stfpc SC_FPC(%r1) + std %f0,SC_FPRS(%r1) +@@ -71,11 +64,12 @@ ENTRY(__swapcontext) + /* Store general purpose registers. */ + stm %r0,%r15,SC_GPRS(%r1) + +- /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ +- la %r2,SIG_BLOCK ++ /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, ++ sigsetsize). */ ++ la %r2,SIG_SETMASK + lr %r5,%r0 + la %r3,SC_MASK(%r5) +- slr %r4,%r4 ++ la %r4,SC_MASK(%r1) + lhi %r5,_NSIG8 + svc SYS_ify(rt_sigprocmask) + +diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S +index b9a55ed..004eafc 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S +@@ -34,7 +34,7 @@ ENTRY(__setcontext) + lgr %r1,%r2 + + /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ +- la %r2,SIG_BLOCK ++ la %r2,SIG_SETMASK + la %r3,SC_MASK(%r1) + slgr %r4,%r4 + lghi %r5,_NSIG8 +diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S +index 6e2630c..2688762 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S +@@ -24,7 +24,7 @@ + /* __swapcontext (ucontext_t *oucp, const ucontext_t *ucp) + + Saves the machine context in oucp such that when it is activated, +- it appears as if __swapcontextt() returned again, restores the ++ it appears as if __swapcontext() returned again, restores the + machine context in ucp and thereby resumes execution in that + context. + +@@ -36,13 +36,6 @@ ENTRY(__swapcontext) + lgr %r1,%r2 + lgr %r0,%r3 + +- /* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */ +- la %r2,SIG_BLOCK +- slgr %r3,%r3 +- la %r4,SC_MASK(%r1) +- lghi %r5,_NSIG8 +- svc SYS_ify(rt_sigprocmask) +- + /* Store fpu context. */ + stfpc SC_FPC(%r1) + std %f0,SC_FPRS(%r1) +@@ -71,12 +64,13 @@ ENTRY(__swapcontext) + /* Store general purpose registers. */ + stmg %r0,%r15,SC_GPRS(%r1) + +- /* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */ +- la %r2,SIG_BLOCK ++ /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, ++ sigsetsize). */ ++ la %r2,SIG_SETMASK + lgr %r5,%r0 + la %r3,SC_MASK(%r5) ++ la %r4,SC_MASK(%r1) + lghi %r5,_NSIG8 +- slgr %r4,%r4 + svc SYS_ify(rt_sigprocmask) + + /* Load fpu context. */ diff --git a/SOURCES/glibc-rh1249115.patch b/SOURCES/glibc-rh1249115.patch new file mode 100644 index 0000000..166b038 --- /dev/null +++ b/SOURCES/glibc-rh1249115.patch @@ -0,0 +1,151 @@ +commit 7cdd140cbccc8eb62a20d12a03bed83765cbc066 +Author: Stefan Liebler +Date: Fri Jul 31 13:42:52 2015 +0200 + + S390: Fix "backtrace() returns infinitely deep stack frames with makecontext()" [BZ #18508]. + + On s390/s390x backtrace(buffer, size) returns the series of called functions until + "makecontext_ret" and additional entries (up to "size") with "makecontext_ret". + GDB-backtrace is also warning: + "Backtrace stopped: previous frame identical to this frame (corrupt stack?)" + + To reproduce this scenario you have to setup a new context with makecontext() + and activate it with setcontext(). See e.g. cf() function in testcase stdlib/tst-makecontext.c. + Or see bug in libgo "Bug 66303 - runtime.Caller() returns infinitely deep stack frames + on s390x " (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66303). + + This patch omits the cfi_startproc/cfi_endproc directives in ENTRY/END macro of + __makecontext_ret. Thus no frame information is generated in .eh_frame and backtrace + stops after __makecontext_ret. There is also no .eh_frame info for _start or + thread_start functions. + + ChangeLog: + + [BZ #18508] + * stdlib/Makefile ($(objpfx)tst-makecontext3): + Depend on $(libdl). + * stdlib/tst-makecontext.c (cf): Test if _Unwind_Backtrace + is not called infinitely times. + (backtrace_helper): New function. + (trace_arg): New struct. + (st1): Enlarge stack size. + * sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S: + (__makecontext_ret): Omit cfi_startproc and cfi_endproc. + * sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S: + Likewise. + +diff --git a/stdlib/Makefile b/stdlib/Makefile +index 8f22c8d..c1e80d7 100644 +--- a/stdlib/Makefile ++++ b/stdlib/Makefile +@@ -154,3 +154,4 @@ $(objpfx)bug-getcontext: $(link-libm) + $(objpfx)tst-strtod-round: $(link-libm) + $(objpfx)tst-tininess: $(link-libm) + $(objpfx)tst-strtod-underflow: $(link-libm) ++$(objpfx)tst-makecontext: $(libdl) +diff --git a/stdlib/tst-makecontext.c b/stdlib/tst-makecontext.c +index eb6e89b..1420857 100644 +--- a/stdlib/tst-makecontext.c ++++ b/stdlib/tst-makecontext.c +@@ -19,23 +19,62 @@ + #include + #include + #include ++#include ++#include ++#include ++#include + + ucontext_t ucp; +-char st1[8192]; ++char st1[16384]; + __thread int thr; + + int somevar = -76; + long othervar = -78L; + ++struct trace_arg ++{ ++ int cnt, size; ++}; ++ ++static _Unwind_Reason_Code ++backtrace_helper (struct _Unwind_Context *ctx, void *a) ++{ ++ struct trace_arg *arg = a; ++ if (++arg->cnt == arg->size) ++ return _URC_END_OF_STACK; ++ return _URC_NO_REASON; ++} ++ + void + cf (int i) + { ++ struct trace_arg arg = { .size = 100, .cnt = -1 }; ++ void *handle; ++ _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *); ++ + if (i != othervar || thr != 94) + { + printf ("i %d thr %d\n", i, thr); + exit (1); + } + ++ /* Test if callback function of _Unwind_Backtrace is not called infinitely ++ times. See Bug 18508 or gcc bug "Bug 66303 - runtime.Caller() returns ++ infinitely deep stack frames on s390x.". ++ The go runtime calls backtrace_full() in ++ /libbacktrace/backtrace.c, which uses _Unwind_Backtrace(). */ ++ handle = dlopen (LIBGCC_S_SO, RTLD_LAZY); ++ if (handle != NULL) ++ { ++ unwind_backtrace = dlsym (handle, "_Unwind_Backtrace"); ++ if (unwind_backtrace != NULL) ++ { ++ unwind_backtrace (backtrace_helper, &arg); ++ assert (arg.cnt != -1 && arg.cnt < 100); ++ } ++ dlclose (handle); ++ } ++ + /* Since uc_link below has been set to NULL, setcontext is supposed to + terminate the process normally after this function returns. */ + } +diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S b/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S +index ab172bb..365c2b0 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S +@@ -17,6 +17,14 @@ + + #include + ++/* We do not want .eh_frame info so that __makecontext_ret stops unwinding ++ if backtrace was called within a context created by makecontext. (There ++ is also no .eh_frame info for _start or thread_start.) */ ++#undef cfi_startproc ++#define cfi_startproc ++#undef cfi_endproc ++#define cfi_endproc ++ + ENTRY(__makecontext_ret) + basr %r14,%r7 + ltr %r8,%r8 /* Check whether uc_link is 0. */ +diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S b/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S +index cbd88e1..c4a43bd 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S +@@ -17,6 +17,14 @@ + + #include + ++/* We do not want .eh_frame info so that __makecontext_ret stops unwinding ++ if backtrace was called within a context created by makecontext. (There ++ is also no .eh_frame info for _start or thread_start.) */ ++#undef cfi_startproc ++#define cfi_startproc ++#undef cfi_endproc ++#define cfi_endproc ++ + ENTRY(__makecontext_ret) + basr %r14,%r7 + ltgr %r8,%r8 /* Check whether uc_link is 0. */ diff --git a/SOURCES/glibc-rh1255822.patch b/SOURCES/glibc-rh1255822.patch new file mode 100644 index 0000000..d14f700 --- /dev/null +++ b/SOURCES/glibc-rh1255822.patch @@ -0,0 +1,34 @@ +commit a3b473373ee43a292f5ec68a7fda6b9cfb26a9b0 +Author: Florian Weimer +Date: Tue Jun 21 21:29:21 2016 +0200 + + malloc: Avoid premature fallback to mmap [BZ #20284] + + Before this change, the while loop in reused_arena which avoids + returning a corrupt arena would never execute its body if the selected + arena were not corrupt. As a result, result == begin after the loop, + and the function returns NULL, triggering fallback to mmap. + +Index: glibc-2.17-c758a686/malloc/arena.c +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/arena.c ++++ glibc-2.17-c758a686/malloc/arena.c +@@ -907,14 +907,12 @@ reused_arena (mstate avoid_arena) + { + result = result->next; + if (result == begin) +- break; ++ /* We looped around the arena list. We could not find any ++ arena that was either not corrupted or not the one we ++ wanted to avoid. */ ++ return NULL; + } + +- /* We could not find any arena that was either not corrupted or not the one +- we wanted to avoid. */ +- if (result == begin || result == avoid_arena) +- return NULL; +- + /* No arena available without contention. Wait for the next in line. */ + LIBC_PROBE (memory_arena_reuse_wait, 3, &result->mutex, result, avoid_arena); + (void)mutex_lock(&result->mutex); diff --git a/SOURCES/glibc-rh1256317-0.patch b/SOURCES/glibc-rh1256317-0.patch new file mode 100644 index 0000000..232d76b --- /dev/null +++ b/SOURCES/glibc-rh1256317-0.patch @@ -0,0 +1,162 @@ +commit ac63a0783cdee8454c84fc45f37330d98b6039e7 +Author: Dmitry V. Levin +Date: Fri Jun 5 22:20:13 2015 +0000 + + Prepare for restoration of .interp section in libpthread.so + + Make runtime-linker.h available outside $(elf-objpfx) by moving + the file to $(common-objpfx) and the rules for it to Makerules. + + Tested for x86_64 and x86 (testsuite, and that no compiled code + changed by the patch). + + * Makeconfig (+interp): Remove unused variable. + * elf/Makefile ($(objpfx)interp.os): Define for [$(build-shared) = yes] + only. Depend on $(common-objpfx)runtime-linker.h instead of + $(elf-objpfx)runtime-linker.h. + ($(elf-objpfx)runtime-linker.h): Rename to + $(common-objpfx)runtime-linker.h and move ... + * Makerules [$(build-shared) = yes]: ... here. + * elf/interp.c: Include instead of + . + +commit 78ad175b3060aae058ed5d05ced2bc58714901cd +Author: Gleb Fotengauer-Malinovskiy +Date: Tue Jun 2 21:04:06 2015 +0300 + + nptl: restore .interp section in libpthread.so + + In commit 02657da2cf4457804ed938ee08b8316249126444, .interp section + was removed from libpthread.so. This led to an error: + + $ /lib64/libpthread.so.0 + Native POSIX Threads Library by Ulrich Drepper et al + Copyright (C) 2015 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. + There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A + PARTICULAR PURPOSE. + Forced unwind support included. + Segmentation fault + + (gdb) bt + #0 0x00000000000055a6 in _exit@plt () + + Unfortunately, there is no way to add a regression test for the bug + because .interp specifies the path to dynamic linker of the target + system. + + [BZ #18479] + * nptl/pt-interp.c: New file. + * nptl/Makefile (libpthread-routines, libpthread-shared-only-routines): + Add pt-interp. + [$(build-shared) = yes] ($(objpfx)pt-interp.os): Depend on + $(common-objpfx)runtime-linker.h. + +Index: glibc-2.17-c758a686/nptl/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/Makefile ++++ glibc-2.17-c758a686/nptl/Makefile +@@ -30,7 +30,7 @@ routines = alloca_cutoff forward libc-lo + libc-cleanup + shared-only-routines = forward + +-libpthread-routines = nptl-init vars events version \ ++libpthread-routines = nptl-init vars events version pt-interp \ + pthread_create pthread_exit pthread_detach \ + pthread_join pthread_tryjoin pthread_timedjoin \ + pthread_self pthread_equal pthread_yield \ +@@ -131,7 +131,8 @@ libpthread-routines = nptl-init vars eve + # pthread_setgid pthread_setegid pthread_setregid \ + # pthread_setresgid + +-libpthread-shared-only-routines = version pt-allocrtsig unwind-forcedunwind ++libpthread-shared-only-routines = version pt-interp pt-allocrtsig \ ++ unwind-forcedunwind + libpthread-static-only-routines = pthread_atfork + + # Since cancellation handling is in large parts handled using exceptions +@@ -591,6 +592,8 @@ $(objpfx)banner.h: Banner + generated += banner.h + # Give libpthread.so an entry point and make it directly runnable itself. + LDFLAGS-pthread.so += -e __nptl_main ++# pt-interp.c exists just to get the runtime linker path into libpthread.so. ++$(objpfx)pt-interp.os: $(common-objpfx)runtime-linker.h + endif + + ifeq ($(run-built-tests),yes) +Index: glibc-2.17-c758a686/nptl/pt-interp.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/nptl/pt-interp.c +@@ -0,0 +1 @@ ++#include +Index: glibc-2.17-c758a686/Makeconfig +=================================================================== +--- glibc-2.17-c758a686.orig/Makeconfig ++++ glibc-2.17-c758a686/Makeconfig +@@ -566,7 +566,6 @@ endif + # Variants of the two previous definitions for statically linking programs. + +prectorT = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbeginT.o` + +postctorT = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtend.o` +-+interp = $(addprefix $(elf-objpfx),interp.os) + csu-objpfx = $(common-objpfx)csu/ + elf-objpfx = $(common-objpfx)elf/ + +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -344,16 +344,10 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld + $(READELF) -s $@ \ + | $(AWK) '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }' + ++ifeq (yes,$(build-shared)) + # interp.c exists just to get the runtime linker path into libc.so. +-$(objpfx)interp.os: $(elf-objpfx)runtime-linker.h +- +-$(elf-objpfx)runtime-linker.h: $(elf-objpfx)runtime-linker.st; @: +-$(elf-objpfx)runtime-linker.st: $(common-objpfx)config.make +- $(name-target-directory) +- echo '#define RUNTIME_LINKER "$(rtlddir)/$(rtld-installed-name)"' \ +- > ${@:st=T} +- $(move-if-change) ${@:st=T} ${@:st=h} +- touch $@ ++$(objpfx)interp.os: $(common-objpfx)runtime-linker.h ++endif + + ifneq (ld.so,$(rtld-installed-name)) + # Make sure ld.so.1 exists in the build directory so we can link +Index: glibc-2.17-c758a686/elf/interp.c +=================================================================== +--- glibc-2.17-c758a686.orig/elf/interp.c ++++ glibc-2.17-c758a686/elf/interp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#include ++#include + + const char __invoke_dynamic_linker__[] __attribute__ ((section (".interp"))) + = RUNTIME_LINKER; +Index: glibc-2.17-c758a686/Makerules +=================================================================== +--- glibc-2.17-c758a686.orig/Makerules ++++ glibc-2.17-c758a686/Makerules +@@ -123,6 +123,16 @@ $(common-objpfx)libc-abis.stamp: $(..)sc + common-generated += $(common-objpfx)libc-abis.h + endif # avoid-generated + ++ifeq (yes,$(build-shared)) ++$(common-objpfx)runtime-linker.h: $(common-objpfx)runtime-linker.stamp; @: ++$(common-objpfx)runtime-linker.stamp: $(common-objpfx)config.make ++ $(make-target-directory) ++ echo '#define RUNTIME_LINKER "$(rtlddir)/$(rtld-installed-name)"' \ ++ > ${@:stamp=T} ++ $(move-if-change) ${@:stamp=T} ${@:stamp=h} ++ touch $@ ++endif ++ + # Make sure the subdirectory for object files gets created. + ifdef objpfx + ifeq (,$(wildcard $(objpfx).)) diff --git a/SOURCES/glibc-rh1256317-1.patch b/SOURCES/glibc-rh1256317-1.patch new file mode 100644 index 0000000..a12d571 --- /dev/null +++ b/SOURCES/glibc-rh1256317-1.patch @@ -0,0 +1,46 @@ +commit 7a9ebfa159f392fcf1c3aa172fc5bd6bd1eeea63 +Author: Siddhesh Poyarekar +Date: Mon Nov 24 15:24:34 2014 +0530 + + Use IS_IN internally only + + This change is only useful for the conformance tests since the headers + changed are not installed. The conformance tests fail due to IS_IN + not being defined, so wrap it with a check to make sure that _ISOMAC + is defined. + + * include/bits/stdlib-float.h: Use IS_IN only if _ISOMAC is + defined. + * include/mqueue.h: Likewise. + * include/stdlib.h: Likewise. + +Index: glibc-2.17-c758a686/include/bits/stdlib-float.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/bits/stdlib-float.h ++++ glibc-2.17-c758a686/include/bits/stdlib-float.h +@@ -1,4 +1,8 @@ +-/* No floating-point inline functions in rtld. */ +-#if !IS_IN (rtld) ++/* No floating-point inline functions in rtld and for the conform tests. */ ++#ifdef _ISOMAC + # include ++#else ++# if !IS_IN (rtld) ++# include ++# endif + #endif +Index: glibc-2.17-c758a686/include/mqueue.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/mqueue.h ++++ glibc-2.17-c758a686/include/mqueue.h +@@ -1,7 +1,9 @@ + #include + +-#if IS_IN (librt) ++#ifndef _ISOMAC ++# if IS_IN (librt) + hidden_proto (mq_timedsend) + hidden_proto (mq_timedreceive) + hidden_proto (mq_setattr) ++# endif + #endif diff --git a/SOURCES/glibc-rh1256317-10.patch b/SOURCES/glibc-rh1256317-10.patch new file mode 100644 index 0000000..44f609d --- /dev/null +++ b/SOURCES/glibc-rh1256317-10.patch @@ -0,0 +1,46 @@ +commit fb6784e3068a747ead34e6dee6a9a1978668a955 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 12:33:44 2014 +0530 + + Remove IS_IN_ldconfig + + Replace with IS_IN (ldconfig). No change in generated code. + + * elf/Makefile (CFLAGS-ldconfig.c): Remove definition of + IS_IN_ldconfig. + * sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c: Use IS_IN. + * sysdeps/unix/sysv/linux/x86_64/dl-procinfo.h: Likewise. + +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -437,7 +437,7 @@ $(objpfx)pldd: $(pldd-modules:%=$(objpfx + + SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"' + CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \ +- -D'SLIBDIR="$(slibdir)"' -DIS_IN_ldconfig=1 -DNOT_IN_libc=1 ++ -D'SLIBDIR="$(slibdir)"' -DNOT_IN_libc + libof-ldconfig = ldconfig + CFLAGS-dl-cache.c = $(SYSCONF-FLAGS) + CFLAGS-cache.c = $(SYSCONF-FLAGS) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c +@@ -1,4 +1,4 @@ +-#ifdef IS_IN_ldconfig ++#if IS_IN (ldconfig) + # include + #else + # include +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.h +@@ -1,4 +1,4 @@ +-#ifdef IS_IN_ldconfig ++#if IS_IN (ldconfig) + # include + #else + # include diff --git a/SOURCES/glibc-rh1256317-11.patch b/SOURCES/glibc-rh1256317-11.patch new file mode 100644 index 0000000..26430d8 --- /dev/null +++ b/SOURCES/glibc-rh1256317-11.patch @@ -0,0 +1,41 @@ +commit 2886d2d14dd7de6339b04505c5d2f9fc5c844751 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 12:21:01 2014 +0530 + + Remove IS_IN_libc + + Replace it with IS_IN (libc) and remove the one place that it + is defined in. The generated code remains unchanged on x86_64. + + * include/shlib-compat.h [!NOT_IN_libc]: Remove. + * nss/nss_files/files-parse.c (IS_IN_libc): Replace with + IS_IN (libc). + +Index: glibc-2.17-c758a686/include/shlib-compat.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/shlib-compat.h ++++ glibc-2.17-c758a686/include/shlib-compat.h +@@ -49,10 +49,6 @@ + && (!(ABI_##lib##_##obsoleted - 0) \ + || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0)))) + +-# ifndef NOT_IN_libc +-# define IS_IN_libc 1 +-# endif +- + /* That header also defines symbols like `VERSION_libm_GLIBC_2_1' to + the version set name to use for e.g. symbols first introduced into + libm in the GLIBC_2.1 version. Definitions of symbols with explicit +Index: glibc-2.17-c758a686/nss/nss_files/files-parse.c +=================================================================== +--- glibc-2.17-c758a686.orig/nss/nss_files/files-parse.c ++++ glibc-2.17-c758a686/nss/nss_files/files-parse.c +@@ -72,7 +72,7 @@ struct parser_data + /* Export the line parser function so it can be used in nss_db. */ + # define parser_stclass /* Global */ + # define parse_line CONCAT(_nss_files_parse_,ENTNAME) +-# ifdef IS_IN_libc ++# if IS_IN (libc) + /* We are defining one of the functions that actually lives in libc + because it is used to implement fget*ent and suchlike. */ + # define nss_files_parse_hidden_def(name) libc_hidden_def (name) diff --git a/SOURCES/glibc-rh1256317-12.patch b/SOURCES/glibc-rh1256317-12.patch new file mode 100644 index 0000000..c16d689 --- /dev/null +++ b/SOURCES/glibc-rh1256317-12.patch @@ -0,0 +1,25 @@ +commit 9a4848572bec992781311995e9e5e46eb226ce97 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 12:04:26 2014 +0530 + + Define IN_MODULE for translation units that define NOT_IN_libc + + Make sure that all instances where NOT_IN_libc is defined also defines + IN_MODULE to facilitate removal NOT_IN_libc in future passes. + + Verified that the generated code is unchanged on x86_64. + + * elf/Makefile (libof-sotruss-lib): Set as extramodules. + +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -98,6 +98,7 @@ extra-objs += sotruss-lib.os sotruss-lib + install-others += $(inst_auditdir)/sotruss-lib.so + install-bin-script += sotruss + generated += sotruss ++libof-sotruss-lib = extramodules + CPPFLAGS-sotruss-lib = -DNOT_IN_libc + $(objpfx)sotruss-lib.so: $(objpfx)sotruss-lib.os + $(build-module-asneeded) diff --git a/SOURCES/glibc-rh1256317-13.patch b/SOURCES/glibc-rh1256317-13.patch new file mode 100644 index 0000000..427e8a3 --- /dev/null +++ b/SOURCES/glibc-rh1256317-13.patch @@ -0,0 +1,154 @@ +commit a10178bda190a62e7e3f56773f55f23cf06848a7 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 12:03:11 2014 +0530 + + Remove IN_LIB + + Replace with IS_IN and IS_IN_LIB macros instead. This change results + in a change in generated code, because it fixes a subtle bug. The bug + was introduced when systemtap probes were added to lowlevellock.h, + which resulted in stap-probe.h being included in a number of places. + stap-probe.h always defines IN_LIB, which breaks a check in errno.h + and netdb.h since they rely on that macro to decide whether to + implement an internal version of a declaration or an external one. + + The components that see a code change due to this are: + + iconv_prog + libmemusage.so + libpcprofile.so + libSegFault.so + libutil.so.1 + locale + localedef + nscd + + All other built components (i.e. libc, libpthread, etc.) remain + unchanged by this on x86_64. + + * elf/Makefile (CPPFLAGS-.os): Remove IN_LIB. + * elf/rtld-Rules (rtld-CPPFLAGS): Likewise. + * extra-lib.mk (CPPFLAGS-$(lib)): Likewise. + * include/libc-symbols.h (IS_IN_LIB): New macro. + * include/errno.h: Use IS_IN_LIB instead of IN_LIB. + * include/netdb.h: Likewise. + * include/stap-probe.h: Remove all uses of IN_LIB. + +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -443,7 +443,7 @@ CFLAGS-cache.c = $(SYSCONF-FLAGS) + CFLAGS-rtld.c = $(SYSCONF-FLAGS) + + CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ +- -DNOT_IN_libc=1 -DIS_IN_rtld=1 -DIN_LIB=rtld) ++ -DNOT_IN_libc=1 -DIS_IN_rtld=1) + + # Disable any optimization which might result in function calls during early + # dynamic loader startup. We disable -ftree-loop-distribute-patterns which +Index: glibc-2.17-c758a686/elf/rtld-Rules +=================================================================== +--- glibc-2.17-c758a686.orig/elf/rtld-Rules ++++ glibc-2.17-c758a686/elf/rtld-Rules +@@ -134,6 +134,6 @@ lib := rtld + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + + # This here is the whole point of all the shenanigans. +-rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1 -DIN_LIB=rtld ++rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1 + + endif +Index: glibc-2.17-c758a686/extra-lib.mk +=================================================================== +--- glibc-2.17-c758a686.orig/extra-lib.mk ++++ glibc-2.17-c758a686/extra-lib.mk +@@ -101,4 +101,4 @@ ifneq (,$(cpp-srcs-left)) + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + endif + +-CPPFLAGS-$(lib) := -DNOT_IN_libc=1 -DIS_IN_$(lib)=1 -DIN_LIB=$(lib) ++CPPFLAGS-$(lib) := -DNOT_IN_libc=1 -DIS_IN_$(lib)=1 +Index: glibc-2.17-c758a686/include/errno.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/errno.h ++++ glibc-2.17-c758a686/include/errno.h +@@ -17,7 +17,7 @@ + # define errno rtld_errno + extern int rtld_errno attribute_hidden; + +-# elif !defined NOT_IN_libc || defined IN_LIB ++# elif !defined NOT_IN_libc || IS_IN_LIB + + # include + +@@ -29,7 +29,7 @@ extern int rtld_errno attribute_hidden; + # endif + extern __thread int errno attribute_tls_model_ie; + +-# endif /* !NOT_IN_libc || IN_LIB */ ++# endif /* !NOT_IN_libc || IS_IN_LIB */ + + # define __set_errno(val) (errno = (val)) + +Index: glibc-2.17-c758a686/include/libc-symbols.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/libc-symbols.h ++++ glibc-2.17-c758a686/include/libc-symbols.h +@@ -23,6 +23,11 @@ + #define IN_MODULE PASTE_NAME (MODULE_, MODULE_NAME) + #define IS_IN(lib) (IN_MODULE == MODULE_##lib) + ++/* Returns true if the current module is a versioned library. Versioned ++ library names culled from shlib-versions files are assigned a MODULE_* ++ value lower than MODULE_LIBS_BEGIN. */ ++#define IS_IN_LIB (IN_MODULE > MODULE_LIBS_BEGIN) ++ + #define PASTE_NAME(a,b) PASTE_NAME1 (a,b) + #define PASTE_NAME1(a,b) a##b + +Index: glibc-2.17-c758a686/include/netdb.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/netdb.h ++++ glibc-2.17-c758a686/include/netdb.h +@@ -3,7 +3,7 @@ + + #ifndef _ISOMAC + /* Macros for accessing h_errno from inside libc. */ +-# if !defined NOT_IN_libc || defined IN_LIB ++# if !defined NOT_IN_libc || IS_IN_LIB + # undef h_errno + # ifdef _LIBC_REENTRANT + # include +@@ -16,7 +16,7 @@ extern __thread int h_errno attribute_tl + # else + extern int h_errno; + # endif /* _LIBC_REENTRANT */ +-# endif /* !NOT_IN_libc || IN_LIB */ ++# endif /* !NOT_IN_libc || IS_IN_LIB */ + # define __set_h_errno(x) (h_errno = (x)) + + libc_hidden_proto (hstrerror) +Index: glibc-2.17-c758a686/include/stap-probe.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/stap-probe.h ++++ glibc-2.17-c758a686/include/stap-probe.h +@@ -32,18 +32,6 @@ + STAP_PROBEn (provider, name, arg1, ..., argn). For "provider" we paste + in MODULE_NAME (libc, libpthread, etc.) automagically. */ + +-# ifndef NOT_IN_libc +-# define IN_LIB libc +-# elif !defined IN_LIB +-/* This is intentionally defined with extra unquoted commas in it so +- that macro substitution will bomb out when it is used. We don't +- just use #error here, so that this header can be included by +- other headers that use LIBC_PROBE inside their own macros. We +- only want such headers to fail to compile if those macros are +- actually used in a context where IN_LIB has not been defined. */ +-# define IN_LIB ,,,missing -DIN_LIB=... -- not extra-lib.mk?,,, +-# endif +- + # define LIBC_PROBE(name, n, ...) \ + LIBC_PROBE_1 (MODULE_NAME, name, n, ## __VA_ARGS__) + diff --git a/SOURCES/glibc-rh1256317-14.patch b/SOURCES/glibc-rh1256317-14.patch new file mode 100644 index 0000000..8baf8fb --- /dev/null +++ b/SOURCES/glibc-rh1256317-14.patch @@ -0,0 +1,106 @@ +Again we have to fix librtkaio to use MODULE_NAME definitions to +work around the changes we are making and preserve ABI/API. + +commit 279bc5b3c384c09746fbadb2b68c6db9e833c064 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 11:42:00 2014 +0530 + + Use MODULE_NAME in stap-probe instead of IN_LIB + + Define MODULE_NAME in the build command and define IN_MODULE using + MODULE_NAME. Verified that the generated code is unchanged on x86_64. + + * Makeconfig (module-cppflags-real): Define MODULE_NAME + instead of IN_MODULE. + * include/libc-symbols.h (IN_MODULE): Define using + MODULE_NAME. + (PASTE_NAME, PASTE_NAME1): New macros. + * include/stap-probe.h (LIBC_PROBE_1): Use MODULE_NAME instead + of IN_LIB. + (STAP_PROBE_ASM): Likewise. + +Index: glibc-2.17-c758a686/Makeconfig +=================================================================== +--- glibc-2.17-c758a686.orig/Makeconfig ++++ glibc-2.17-c758a686/Makeconfig +@@ -741,7 +741,7 @@ in-module = $(subst -,_,$(firstword $(li + libc)) + + module-cppflags-real = -include $(common-objpfx)libc-modules.h \ +- -DIN_MODULE=MODULE_$(in-module) ++ -DMODULE_NAME=$(in-module) + + # We don't need libc-modules.h and the MODULE_NAME definition for .v.i + # files. These targets don't (and will likely never need to) use the IS_IN +@@ -940,7 +940,7 @@ postclean-generated += soversions.mk sov + before-compile += $(common-objpfx)libc-modules.h + ifeq ($(soversions.mk-done),t) + # Generate a header with macro definitions for use with the IS_IN macro. +-# These are the possible values for the IN_MODULE macro defined when building ++# These are the possible values for the MODULE_NAME macro defined when building + # sources, to identify which module the translation unit is going to be built + # into. + $(common-objpfx)libc-modules.h: $(common-objpfx)libc-modules.stmp; @: +Index: glibc-2.17-c758a686/include/libc-symbols.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/libc-symbols.h ++++ glibc-2.17-c758a686/include/libc-symbols.h +@@ -20,8 +20,12 @@ + #ifndef _LIBC_SYMBOLS_H + #define _LIBC_SYMBOLS_H 1 + ++#define IN_MODULE PASTE_NAME (MODULE_, MODULE_NAME) + #define IS_IN(lib) (IN_MODULE == MODULE_##lib) + ++#define PASTE_NAME(a,b) PASTE_NAME1 (a,b) ++#define PASTE_NAME1(a,b) a##b ++ + /* This file's macros are included implicitly in the compilation of every + file in the C library by -imacros. + +Index: glibc-2.17-c758a686/include/stap-probe.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/stap-probe.h ++++ glibc-2.17-c758a686/include/stap-probe.h +@@ -30,7 +30,7 @@ + + Systemtap's header defines the macros STAP_PROBE (provider, name) and + STAP_PROBEn (provider, name, arg1, ..., argn). For "provider" we paste +- in the IN_LIB name (libc, libpthread, etc.) automagically. */ ++ in MODULE_NAME (libc, libpthread, etc.) automagically. */ + + # ifndef NOT_IN_libc + # define IN_LIB libc +@@ -45,7 +45,7 @@ + # endif + + # define LIBC_PROBE(name, n, ...) \ +- LIBC_PROBE_1 (IN_LIB, name, n, ## __VA_ARGS__) ++ LIBC_PROBE_1 (MODULE_NAME, name, n, ## __VA_ARGS__) + + # define LIBC_PROBE_1(lib, name, n, ...) \ + STAP_PROBE##n (lib, name, ## __VA_ARGS__) +@@ -53,7 +53,7 @@ + # define STAP_PROBE0 STAP_PROBE + + # define LIBC_PROBE_ASM(name, template) \ +- STAP_PROBE_ASM (IN_LIB, name, template) ++ STAP_PROBE_ASM (MODULE_NAME, name, template) + + # define LIBC_PROBE_ASM_OPERANDS STAP_PROBE_ASM_OPERANDS + +Index: glibc-2.17-c758a686/rtkaio/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/rtkaio/Makefile ++++ glibc-2.17-c758a686/rtkaio/Makefile +@@ -70,7 +70,9 @@ CFLAGS-kaio_librt-cancellation.c = -fasy + LDFLAGS-rtkaio.so = -Wl,-soname=lib$(libprefix)rt.so$(librt.so-version) \ + -Wl,--enable-new-dtags,-z,nodelete + CPPFLAGS-librtkaio += -UIN_MODULE -DIN_MODULE=MODULE_librt \ +- -UIS_IN_librt -DIS_IN_librt=1 -I$(..)rt ++ -UMODULE_NAME -DMODULE_NAME=librt \ ++ -UIS_IN_librt -DIS_IN_librt=1 \ ++ -I$(..)rt + + rpath-dirs := $(patsubst rt,rtkaio,$(rpath-dirs)) + diff --git a/SOURCES/glibc-rh1256317-15.patch b/SOURCES/glibc-rh1256317-15.patch new file mode 100644 index 0000000..a481ce0 --- /dev/null +++ b/SOURCES/glibc-rh1256317-15.patch @@ -0,0 +1,220 @@ +commit 130ac68ca25c9aa65e027e3e37337bc048205c69 +Author: Siddhesh Poyarekar +Date: Wed Nov 19 12:16:00 2014 +0530 + + Auto-generate libc-modules.h + + Remove libc-modules.h from the tree and auto-generate it from + soversions.i and the list of modules in the built-modules variable + defined in Makeconfig. Macros generated have increasing numbered + values, with built-modules having lower values starting from 1, + following which a separator value LIBS_BEGIN is added and then finally + the library names from soversions.i are appended to the list. This + allows us to conveniently differentiate between the versioned + libraries and other built modules, which is needed in errno.h and + netdb.h to decide whether to use an internal symbol or an external + one. + + Verified that generated code remains unchanged on x86_64. + + * Makeconfig (built-modules): List non-library modules to be + built. + (module-cppflags): Include libc-modules.h for + everything except shlib-versions.v.i. + (CPPFLAGS): Use it. + (before-compile): Add libc-modules.h. + ($(common-objpfx)libc-modules.h, + $(common-objpfx)libc-modules.stmp): New targets. + (common-generated): Add libc-modules.h and libc-modules.stmp. + ($(common-objpfx)Versions.v.i): Depend on libc-modules.h. + * include/libc-symbols.h: Don't include libc-modules.h. + * include/libc-modules.h: Remove file. + * scripts/gen-libc-modules.awk: New script to generate + libc-modules.h. + * sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls): + Depend on libc-modules.stmp. + +commit 8a257e2cb50cd8e8e3e2368d80bf325ea4086cf9 +Author: Roland McGrath +Date: Thu Apr 9 14:42:29 2015 -0700 + + Omit libc-modules.h for all .v.i files. + +Index: glibc-2.17-c758a686/Makeconfig +=================================================================== +--- glibc-2.17-c758a686.orig/Makeconfig ++++ glibc-2.17-c758a686/Makeconfig +@@ -730,19 +730,34 @@ endif # $(+cflags) == "" + # of many little headers in the include directory. + libio-include = -I$(..)libio + ++# List of non-library modules that we build. ++built-modules = iconvprogs iconvdata ldconfig lddlibc4 libmemusage \ ++ libSegFault libpcprofile librpcsvc locale-programs \ ++ memusagestat nonlib nscd extramodules libnldbl ++ + in-module = $(subst -,_,$(firstword $(libof-$(basename $(@F))) \ + $(libof-$( ${@:stmp=T} ++ $(move-if-change) ${@:stmp=T} ${@:stmp=h} ++ touch $@ ++ ++endif ++ ++common-generated += libc-modules.h libc-modules.stmp ++ + # Generate the header containing the names of all shared libraries. + # We use a stamp file to avoid unnecessary recompilations. + before-compile += $(common-objpfx)gnu/lib-names.h +Index: glibc-2.17-c758a686/include/libc-modules.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/libc-modules.h ++++ /dev/null +@@ -1,41 +0,0 @@ +-/* Valid values for the IN_MODULE macro, which is defined for each source file +- during compilation to indicate which module it is to be built into. +- +- TODO: This file should eventually be auto-generated. */ +-#define MODULE_libc 1 +-#define MODULE_libpthread 2 +-#define MODULE_rtld 3 +-#define MODULE_libdl 4 +-#define MODULE_libm 5 +-#define MODULE_iconvprogs 6 +-#define MODULE_iconvdata 7 +-#define MODULE_lddlibc4 8 +-#define MODULE_locale_programs 9 +-#define MODULE_memusagestat 10 +-#define MODULE_libutil 12 +-#define MODULE_libBrokenLocale 13 +-#define MODULE_libmemusage 15 +-#define MODULE_libresolv 16 +-#define MODULE_libnss_db 17 +-#define MODULE_libnss_files 18 +-#define MODULE_libnss_dns 19 +-#define MODULE_libnss_compat 20 +-#define MODULE_libnss_hesiod 21 +-#define MODULE_libnss_nis 22 +-#define MODULE_libnss_nisplus 23 +-#define MODULE_libanl 24 +-#define MODULE_librt 25 +-#define MODULE_libSegFault 26 +-#define MODULE_libthread_db 27 +-#define MODULE_libcidn 28 +-#define MODULE_libcrypt 29 +-#define MODULE_libnsl 30 +-#define MODULE_libpcprofile 31 +-#define MODULE_librpcsvc 32 +-#define MODULE_nscd 33 +-#define MODULE_ldconfig 34 +-#define MODULE_libnldbl 35 +- +-/* Catch-all for test modules and other binaries. */ +-#define MODULE_nonlib 98 +-#define MODULE_extramodules 99 +Index: glibc-2.17-c758a686/include/libc-symbols.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/libc-symbols.h ++++ glibc-2.17-c758a686/include/libc-symbols.h +@@ -20,9 +20,6 @@ + #ifndef _LIBC_SYMBOLS_H + #define _LIBC_SYMBOLS_H 1 + +-/* Pull in definitions for the MODULE_* macros. */ +-#include +- + #define IS_IN(lib) (IN_MODULE == MODULE_##lib) + + /* This file's macros are included implicitly in the compilation of every +Index: glibc-2.17-c758a686/scripts/gen-libc-modules.awk +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/scripts/gen-libc-modules.awk +@@ -0,0 +1,34 @@ ++# Generate a header file that defines the MODULE_* macros for each library and ++# module we build in glibc. The library names are pulled in from soversions.i ++# and the additional modules are passed in the BUILDLIST variable. ++BEGIN { ++ # BUILDLIST is set from the build-list variable in Makeconfig and is a space ++ # separated list of non-library modules that we build in glibc. ++ num = split (buildlist, libs, " ") ++ # Separate the built modules from the libraries. ++ libs[++num] = "LIBS_BEGIN" ++} ++ ++# Skip over comments. ++$1 == "#" { ++ next ++} ++ ++# We have only one special case in soversions.i parsing, which is to replace ld ++# with rtld since that's what we call it throughout the sources. ++match (FILENAME, ".*soversions.i") { ++ name = $2 ++ if (name == "ld") ++ name = "rtld" ++ ++ # Library names are not duplicated in soversions.i. ++ libs[++num] = name ++} ++ ++# Finally, print out the header file. ++END { ++ printf ("/* AUTOGENERATED BY gen-libc-modules.awk, DO NOT EDIT. */\n\n") ++ for (l in libs) { ++ printf ("#define MODULE_%s %d\n", libs[l], l) ++ } ++} +Index: glibc-2.17-c758a686/sysdeps/unix/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/Makefile ++++ glibc-2.17-c758a686/sysdeps/unix/Makefile +@@ -77,7 +77,8 @@ compile-syscall = $(COMPILE.S) -o $@ -x + + ifndef avoid-generated + $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \ +- $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) ++ $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) \ ++ $(common-objpfx)libc-modules.stmp + for dir in $(+sysdep_dirs); do \ + test -f $$dir/syscalls.list && \ + { sysdirs='$(sysdirs)' \ diff --git a/SOURCES/glibc-rh1256317-16.patch b/SOURCES/glibc-rh1256317-16.patch new file mode 100644 index 0000000..28a5cfa --- /dev/null +++ b/SOURCES/glibc-rh1256317-16.patch @@ -0,0 +1,43 @@ +In order to ensure ABI compatibility between staged builds it was +required that rtkaio/Makefile define both IN_MODULE=MODULE_librt +and IS_IN_librt in order to get both the right set of versioned +symbols and enable cancellation correctly. The changes to rtkaio/Makefile +are Red Hat internal changes. + +commit 286663c34b006c1409df4a71f89d6d4d5d01df09 +Author: Siddhesh Poyarekar +Date: Wed Nov 19 12:15:01 2014 +0530 + + Fix -Wundef warning in SHLIB_COMPAT + + Replace the IS_IN_##lib with IS_IN(lib). Verified that the generated + code remains the same. + + * include/shlib-compat.h (_SHLIB_COMPAT): Use IS_IN. +Index: glibc-2.17-c758a686/include/shlib-compat.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/shlib-compat.h ++++ glibc-2.17-c758a686/include/shlib-compat.h +@@ -45,7 +45,7 @@ + # define SHLIB_COMPAT(lib, introduced, obsoleted) \ + _SHLIB_COMPAT (lib, introduced, obsoleted) + # define _SHLIB_COMPAT(lib, introduced, obsoleted) \ +- ((IS_IN_##lib - 0) \ ++ (IS_IN (lib) \ + && (!(ABI_##lib##_##obsoleted - 0) \ + || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0)))) + +Index: glibc-2.17-c758a686/rtkaio/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/rtkaio/Makefile ++++ glibc-2.17-c758a686/rtkaio/Makefile +@@ -69,7 +69,8 @@ CFLAGS-kaio_librt-cancellation.c = -fasy + + LDFLAGS-rtkaio.so = -Wl,-soname=lib$(libprefix)rt.so$(librt.so-version) \ + -Wl,--enable-new-dtags,-z,nodelete +-CPPFLAGS-librtkaio += -DIS_IN_librt=1 -I$(..)rt ++CPPFLAGS-librtkaio += -UIN_MODULE -DIN_MODULE=MODULE_librt \ ++ -UIS_IN_librt -DIS_IN_librt=1 -I$(..)rt + + rpath-dirs := $(patsubst rt,rtkaio,$(rpath-dirs)) + diff --git a/SOURCES/glibc-rh1256317-17.patch b/SOURCES/glibc-rh1256317-17.patch new file mode 100644 index 0000000..7e2c51a --- /dev/null +++ b/SOURCES/glibc-rh1256317-17.patch @@ -0,0 +1,467 @@ +commit 9cd4747089e6b0d6ed6b2b6c75798912489c7bab +Author: Siddhesh Poyarekar +Date: Wed Nov 19 12:13:54 2014 +0530 + + Add new macro IN_MODULE to identify module in which source is built + + The current scheme to identify which module a translation unit is + built in depends on defining multiple macros IS_IN_* and also defining + NOT_IN_libc if we're building a non-libc module. In addition, there + is an IN_LIB macro that does effectively the same thing, but for + different modules (notably the systemtap probes). This macro scheme + unifies both ideas to use just one macro IN_MODULE and assign it a + value depending on the module it is being built into. If the module + is not defined, it defaults to MODULE_libc. + + Patches that follow will replace uses of IS_IN_* variables with the + IS_IN() macro. libc-symbols.h has been converted already to give an + example of how such a transition will look. + + Verified that there are no relevant binary changes. One source change + that will crop up repeatedly is that of nscd_stat, since it uses the + build timestamp as a constant in its logic. + + * Makeconfig (in-module): Get value of libof set for the + translation unit. + (CPPFLAGS): Use $(in-module). + * Makerules: Don't suffix routine names for nonlib. + * include/libc-modules.h: New file. + * include/libc-symbols.h: Include libc-modules.h + (IS_IN): New macro to replace IS_IN_* macros. + * elf/Makefile: Set libof-* for each routine. + * elf/rtld-Rules: Likewise. + * extra-modules.mk: Likewise. + * iconv/Makefile: Likewise. + * iconvdata/Makefile: Likewise. + * locale/Makefile: Likewise. + * malloc/Makefile: Likewise. + * nss/Makefile: Likewise. + * sysdeps/gnu/Makefile: Likewise. + * sysdeps/ieee754/ldbl-opt/Makefile: Likewise. + * sysdeps/unix/sysv/linux/Makefile: Likewise. + * sysdeps/s390/s390-64/Makefile: Likewise. + * nscd/Makefile: Set libof-* for each routine. Set CFLAGS and + CPPFLAGS for nscd instead of nonlib. + +Index: glibc-2.17-c758a686/Makeconfig +=================================================================== +--- glibc-2.17-c758a686.orig/Makeconfig ++++ glibc-2.17-c758a686/Makeconfig +@@ -730,6 +730,11 @@ endif # $(+cflags) == "" + # of many little headers in the include directory. + libio-include = -I$(..)libio + ++in-module = $(subst -,_,$(firstword $(libof-$(basename $(@F))) \ ++ $(libof-$( ++ ++#define IS_IN(lib) (IN_MODULE == MODULE_##lib) ++ + /* This file's macros are included implicitly in the compilation of every + file in the C library by -imacros. + +@@ -450,7 +455,7 @@ for linking") + If the function should be internal to multiple objects, say ld.so and + libc.so, the best way is to use: + +- #if !defined NOT_IN_libc || defined IS_IN_rtld ++ #if IS_IN (libc) || IS_IN (rtld) + hidden_proto (foo) + #endif + +@@ -561,7 +566,7 @@ for linking") + # define libc_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # define rtld_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define rtld_hidden_def(name) hidden_def (name) + # define rtld_hidden_weak(name) hidden_weak (name) +@@ -579,7 +584,7 @@ for linking") + # define rtld_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # define libm_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libm_hidden_def(name) hidden_def (name) + # define libm_hidden_weak(name) hidden_weak (name) +@@ -597,7 +602,7 @@ for linking") + # define libm_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_libresolv ++#if IS_IN (libresolv) + # define libresolv_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libresolv_hidden_def(name) hidden_def (name) + # define libresolv_hidden_weak(name) hidden_weak (name) +@@ -615,7 +620,7 @@ for linking") + # define libresolv_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_librt ++#if IS_IN (librt) + # define librt_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define librt_hidden_def(name) hidden_def (name) + # define librt_hidden_weak(name) hidden_weak (name) +@@ -633,7 +638,7 @@ for linking") + # define librt_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_libdl ++#if IS_IN (libdl) + # define libdl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libdl_hidden_def(name) hidden_def (name) + # define libdl_hidden_weak(name) hidden_weak (name) +@@ -651,7 +656,7 @@ for linking") + # define libdl_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_libnss_files ++#if IS_IN (libnss_files) + # define libnss_files_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libnss_files_hidden_def(name) hidden_def (name) + # define libnss_files_hidden_weak(name) hidden_weak (name) +@@ -669,7 +674,7 @@ for linking") + # define libnss_files_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_libnsl ++#if IS_IN (libnsl) + # define libnsl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libnsl_hidden_def(name) hidden_def (name) + # define libnsl_hidden_weak(name) hidden_weak (name) +@@ -687,7 +692,7 @@ for linking") + # define libnsl_hidden_data_ver(local, name) + #endif + +-#ifdef IS_IN_libnss_nisplus ++#if IS_IN (libnss_nisplus) + # define libnss_nisplus_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libnss_nisplus_hidden_def(name) hidden_def (name) + # define libnss_nisplus_hidden_weak(name) hidden_weak (name) +@@ -713,7 +718,7 @@ for linking") + # define HIDDEN_BUILTIN_JUMPTARGET(name) HIDDEN_JUMPTARGET(name) + #endif + +-#ifdef IS_IN_libutil ++#if IS_IN (libutil) + # define libutil_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libutil_hidden_def(name) hidden_def (name) + # define libutil_hidden_weak(name) hidden_weak (name) +Index: glibc-2.17-c758a686/locale/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/locale/Makefile ++++ glibc-2.17-c758a686/locale/Makefile +@@ -95,8 +95,8 @@ CFLAGS-locfile.c = -Wno-write-strings -W + CFLAGS-charmap-dir.c = -Wno-write-strings + + # This makes sure -DNOT_IN_libc et al are passed for all these modules. +-cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \ +- $(locale-modules) $(lib-modules)) ++cpp-srcs-left := $(localedef-modules) $(localedef-aux) $(locale-modules) \ ++ $(lib-modules) + lib := locale-programs + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + +Index: glibc-2.17-c758a686/malloc/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/Makefile ++++ glibc-2.17-c758a686/malloc/Makefile +@@ -97,6 +97,11 @@ endif + do-memusagestat: $(objpfx)memusagestat + + memusagestat-modules = memusagestat ++ ++cpp-srcs-left := $(memusagestat-modules) ++lib := memusagestat ++include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) ++ + $(objpfx)memusagestat: $(memusagestat-modules:%=$(objpfx)%.o) + $(LINK.o) -o $@ $^ $(libgd-LDFLAGS) -lgd -lpng -lz -lm + +Index: glibc-2.17-c758a686/nscd/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nscd/Makefile ++++ glibc-2.17-c758a686/nscd/Makefile +@@ -79,26 +79,25 @@ CFLAGS-nscd_gethst_r.c = -fexceptions + CFLAGS-nscd_getai.c = -fexceptions + CFLAGS-nscd_initgroups.c = -fexceptions + +-CPPFLAGS-nonlib += -DIS_IN_nscd=1 -D_FORTIFY_SOURCE=2 ++CPPFLAGS-nscd += -DIS_IN_nscd=1 -D_FORTIFY_SOURCE=2 -DNOT_IN_libc=1 + + ifeq (yesyes,$(have-fpie)$(build-shared)) +-CFLAGS-nonlib += $(pie-ccflag) ++CFLAGS-nscd += $(pie-ccflag) + endif + ifeq (yes,$(have-ssp)) +-CFLAGS-nonlib += -fstack-protector ++CFLAGS-nscd += -fstack-protector + endif + ifeq (yes,$(have-ssp-strong)) +-CFLAGS-nonlib += -fstack-protector-strong ++CFLAGS-nscd += -fstack-protector-strong + endif + + ifeq (yesyes,$(have-fpie)$(build-shared)) + LDFLAGS-nscd = -Wl,-z,now + endif + +-# This makes sure CPPFLAGS-nonlib and CFLAGS-nonlib are passed +-# for all these modules. +-cpp-srcs-left := $(nscd-modules:=.c) +-lib := nonlib ++# Set libof-nscd. ++cpp-srcs-left := $(nscd-modules) ++lib := nscd + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + + $(objpfx)nscd: $(nscd-modules:%=$(objpfx)%.o) +Index: glibc-2.17-c758a686/nss/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nss/Makefile ++++ glibc-2.17-c758a686/nss/Makefile +@@ -108,7 +108,8 @@ $(objpfx)makedb: $(makedb-modules:%=$(ob + $(inst_vardbdir)/Makefile: db-Makefile $(+force) + $(do-install) + +-CFLAGS-nss_test1.c = -DNOT_IN_libc=1 ++libof-nss_test1 = extramodules ++CPPFLAGS-nss_test1 = -DNOT_IN_libc=1 + $(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(common-objpfx)libc.so \ + $(common-objpfx)libc_nonshared.a + $(build-module) +Index: glibc-2.17-c758a686/stdlib/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/stdlib/Makefile ++++ glibc-2.17-c758a686/stdlib/Makefile +@@ -138,6 +138,7 @@ LDFLAGS-tst-putenv = $(no-as-needed) + + $(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os + $(build-module) ++libof-tst-putenvmod = extramodules + CFLAGS-tst-putenvmod.c = -DNOT_IN_libc=1 + + ifeq ($(build-shared),yes) +Index: glibc-2.17-c758a686/sysdeps/gnu/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/gnu/Makefile ++++ glibc-2.17-c758a686/sysdeps/gnu/Makefile +@@ -30,6 +30,8 @@ ifeq ($(subdir),stdio-common) + + errlist-c = $(firstword $(wildcard $(addsuffix /errlist.c,$(sysdirs) .))) + ++libof-errlist-compat = extramodules ++ + ifeq ($(versioning),yes) + $(objpfx)errlist-compat.c: $(errlist-c) $(..)sysdeps/gnu/errlist-compat.awk \ + $(common-objpfx)Versions.v.i $(before-compile) +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/Makefile ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/Makefile +@@ -28,6 +28,10 @@ s390x-iconv-modules = ISO-8859-1_CP037_Z + extra-modules-left += $(s390x-iconv-modules) + include extra-module.mk + ++cpp-srcs-left := $(foreach mod,$(s390x-iconv-modules),$($(mod)-routines)) ++lib := iconvdata ++include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) ++ + extra-objs += $(addsuffix .so, $(s390x-iconv-modules)) + install-others += $(patsubst %, $(inst_gconvdir)/%.so, $(s390x-iconv-modules)) + +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/Makefile ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/Makefile +@@ -159,6 +159,7 @@ ifeq ($(subdir),elf) + sysdep-rtld-routines += dl-brk dl-sbrk dl-getcwd dl-openat64 dl-opendir \ + dl-fxstatat64 + ++libof-lddlibc4 = lddlibc4 + CPPFLAGS-lddlibc4 += -DNOT_IN_libc + endif + diff --git a/SOURCES/glibc-rh1256317-18.patch b/SOURCES/glibc-rh1256317-18.patch new file mode 100644 index 0000000..f7cd4c6 --- /dev/null +++ b/SOURCES/glibc-rh1256317-18.patch @@ -0,0 +1,51 @@ +commit d330b980e9ee2349492087a279a9c7bf294f6b47 +Author: Siddhesh Poyarekar +Date: Tue Sep 16 22:20:45 2014 +0530 + + Remove CFLAGS for interp.c + + Replace it with including an auto-generated linker-runtime.h. + Build-tested on x86_64 and found that there was no change in the + generated code. + + * elf/Makefile (CFLAGS-interp.c): Remove. + ($(elf-objpfx)runtime-linker.h): Generate header with linker + path string. + * elf/interp.c: Include generated runtime-linker.h + +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -344,9 +344,16 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld + $(READELF) -s $@ \ + | $(AWK) '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }' + +-# interp.c exists just to get this string into the libraries. +-CFLAGS-interp.c = -D'RUNTIME_LINKER="$(rtlddir)/$(rtld-installed-name)"' +-$(objpfx)interp.os: $(common-objpfx)config.make ++# interp.c exists just to get the runtime linker path into libc.so. ++$(objpfx)interp.os: $(elf-objpfx)runtime-linker.h ++ ++$(elf-objpfx)runtime-linker.h: $(elf-objpfx)runtime-linker.st; @: ++$(elf-objpfx)runtime-linker.st: $(common-objpfx)config.make ++ $(name-target-directory) ++ echo '#define RUNTIME_LINKER "$(rtlddir)/$(rtld-installed-name)"' \ ++ > ${@:st=T} ++ $(move-if-change) ${@:st=T} ${@:st=h} ++ touch $@ + + ifneq (ld.so,$(rtld-installed-name)) + # Make sure ld.so.1 exists in the build directory so we can link +Index: glibc-2.17-c758a686/elf/interp.c +=================================================================== +--- glibc-2.17-c758a686.orig/elf/interp.c ++++ glibc-2.17-c758a686/elf/interp.c +@@ -16,5 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + ++#include ++ + const char __invoke_dynamic_linker__[] __attribute__ ((section (".interp"))) + = RUNTIME_LINKER; diff --git a/SOURCES/glibc-rh1256317-19.patch b/SOURCES/glibc-rh1256317-19.patch new file mode 100644 index 0000000..c23c58e --- /dev/null +++ b/SOURCES/glibc-rh1256317-19.patch @@ -0,0 +1,254 @@ +commit 02657da2cf4457804ed938ee08b8316249126444 +Author: Siddhesh Poyarekar +Date: Tue Sep 16 22:19:22 2014 +0530 + + Include .interp section only for libc.so + + Barring libc.so and libdl.so, none of the libraries have any entry + points, so it is pointless to add a .interp section for them. The + libdl.so entry point (in dlfcn/eval.c) is also defunct, so remove that + file as well. + + Build tested for x86_64, ppc64 and s390x. I have not moved + CFLAGS-interp.c to CPPFLAGS-interp.c isnce I'll be removing it + completely in a follow-up patch. + + Siddhesh + + * Makerules (lib%.so): Don't include $(+interp) in + prerequisites. + * elf/Makefile (CFLAGS-interp.c): Don't define NOT_IN_libc. + * dlfcn/eval.c: Remove file. + +Index: glibc-2.17-c758a686/Makerules +=================================================================== +--- glibc-2.17-c758a686.orig/Makerules ++++ glibc-2.17-c758a686/Makerules +@@ -461,7 +461,7 @@ link-libc-deps = $(common-objpfx)libc.so + # build shared libraries in place from the installed *_pic.a files. + # $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies + # on other shared objects. +-lib%.so: lib%_pic.a $(+preinit) $(+postinit) $(+interp) ++lib%.so: lib%_pic.a $(+preinit) $(+postinit) + $(build-shlib) + + define build-shlib-helper +Index: glibc-2.17-c758a686/dlfcn/eval.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/eval.c ++++ /dev/null +@@ -1,200 +0,0 @@ +-/* You don't really want to know what this hack is for. +- Copyright (C) 1996, 1997, 2000, 2001 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-static void *funcall (char **stringp) __attribute_noinline__; +-static void *eval (char **stringp); +- +- +-long int weak_function +-__strtol_internal (const char *nptr, char **endptr, int base, int group) +-{ +- unsigned long int result = 0; +- long int sign = 1; +- +- while (*nptr == ' ' || *nptr == '\t') +- ++nptr; +- +- if (*nptr == '-') +- { +- sign = -1; +- ++nptr; +- } +- else if (*nptr == '+') +- ++nptr; +- +- if (*nptr < '0' || *nptr > '9') +- { +- if (endptr != NULL) +- *endptr = (char *) nptr; +- return 0L; +- } +- +- assert (base == 0); +- base = 10; +- if (*nptr == '0') +- { +- if (nptr[1] == 'x' || nptr[1] == 'X') +- { +- base = 16; +- nptr += 2; +- } +- else +- base = 8; +- } +- +- while (*nptr >= '0' && *nptr <= '9') +- { +- unsigned long int digval = *nptr - '0'; +- if (result > LONG_MAX / 10 +- || (sign > 0 ? result == LONG_MAX / 10 && digval > LONG_MAX % 10 +- : (result == ((unsigned long int) LONG_MAX + 1) / 10 +- && digval > ((unsigned long int) LONG_MAX + 1) % 10))) +- { +- errno = ERANGE; +- return sign > 0 ? LONG_MAX : LONG_MIN; +- } +- result *= base; +- result += digval; +- ++nptr; +- } +- +- return (long int) result * sign; +-} +- +- +-static void * +-funcall (char **stringp) +-{ +- void *args[strlen (*stringp)], **ap = args; +- void *argcookie = &args[1]; +- +- do +- { +- /* Evaluate the next token. */ +- *ap++ = eval (stringp); +- +- /* Whitespace is irrelevant. */ +- while (isspace (**stringp)) +- ++*stringp; +- +- /* Terminate at closing paren or end of line. */ +- } while (**stringp != '\0' && **stringp != ')'); +- if (**stringp != '\0') +- /* Swallow closing paren. */ +- ++*stringp; +- +- if (args[0] == NULL) +- { +- static const char unknown[] = "Unknown function\n"; +- write (1, unknown, sizeof unknown - 1); +- return NULL; +- } +- +- /* Do it to it. */ +- __builtin_return (__builtin_apply (args[0], +- &argcookie, +- (char *) ap - (char *) &args[1])); +-} +- +-static void * +-eval (char **stringp) +-{ +- void *value; +- char *p = *stringp, c; +- +- /* Whitespace is irrelevant. */ +- while (isspace (*p)) +- ++p; +- +- switch (*p) +- { +- case '"': +- /* String constant. */ +- value = ++p; +- do +- if (*p == '\\') +- { +- switch (*strcpy (p, p + 1)) +- { +- case 't': +- *p = '\t'; +- break; +- case 'n': +- *p = '\n'; +- break; +- } +- ++p; +- } +- while (*p != '\0' && *p++ != '"'); +- if (p[-1] == '"') +- p[-1] = '\0'; +- break; +- +- case '(': +- *stringp = ++p; +- return funcall (stringp); +- +- default: +- /* Try to parse it as a number. */ +- value = (void *) __strtol_internal (p, stringp, 0, 0); +- if (*stringp != p) +- return value; +- +- /* Anything else is a symbol that produces its address. */ +- value = p; +- do +- ++p; +- while (*p != '\0' && !isspace (*p) && (!ispunct (*p) || *p == '_')); +- c = *p; +- *p = '\0'; +- value = dlsym (NULL, value); +- *p = c; +- break; +- } +- +- *stringp = p; +- return value; +-} +- +- +-extern void _start (void) __attribute__ ((noreturn)); +-void +-__attribute__ ((noreturn)) +-_start (void) +-{ +- char *buf = NULL; +- size_t bufsz = 0; +- +- while (__getdelim (&buf, &bufsz, '\n', stdin) > 0) +- { +- char *p = buf; +- eval (&p); +- } +- +- exit (0); +-} +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -345,8 +345,7 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld + | $(AWK) '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }' + + # interp.c exists just to get this string into the libraries. +-CFLAGS-interp.c = -D'RUNTIME_LINKER="$(rtlddir)/$(rtld-installed-name)"' \ +- -DNOT_IN_libc=1 ++CFLAGS-interp.c = -D'RUNTIME_LINKER="$(rtlddir)/$(rtld-installed-name)"' + $(objpfx)interp.os: $(common-objpfx)config.make + + ifneq (ld.so,$(rtld-installed-name)) diff --git a/SOURCES/glibc-rh1256317-2.patch b/SOURCES/glibc-rh1256317-2.patch new file mode 100644 index 0000000..dc9445e --- /dev/null +++ b/SOURCES/glibc-rh1256317-2.patch @@ -0,0 +1,7228 @@ +commit 4f41c682f3f0a0ad69eeac38a6b270f4362c3a02 +Author: Siddhesh Poyarekar +Date: Mon Nov 24 15:03:45 2014 +0530 + + Remove NOT_IN_libc + + Replace with !IS_IN (libc). This completes the transition from + the IS_IN/NOT_IN macros to the IN_MODULE macro set. + + The generated code is unchanged on x86_64. + + * stdlib/isomac.c (fmt): Replace NOT_IN_libc with IN_MODULE. + (get_null_defines): Adjust. + * sunrpc/Makefile: Adjust comment. + * Makerules (CPPFLAGS-nonlib): Remove NOT_IN_libc. + * elf/Makefile (CPPFLAGS-sotruss-lib): Likewise. + (CFLAGS-interp.c): Likewise. + (CFLAGS-ldconfig.c): Likewise. + (CPPFLAGS-.os): Likewise. + * elf/rtld-Rules (rtld-CPPFLAGS): Likewise. + * extra-lib.mk (CPPFLAGS-$(lib)): Likewise. + * extra-modules.mk (extra-modules.mk): Likewise. + * iconv/Makefile (CPPFLAGS-iconvprogs): Likewise. + * locale/Makefile (CPPFLAGS-locale_programs): Likewise. + * malloc/Makefile (CPPFLAGS-memusagestat): Likewise. + * nscd/Makefile (CPPFLAGS-nscd): Likewise. + * nss/Makefile (CPPFLAGS-nss_test1): Likewise. + * stdlib/Makefile (CFLAGS-tst-putenvmod.c): Likewise. + * sysdeps/gnu/Makefile ($(objpfx)errlist-compat.c): Likewise. + * sysdeps/unix/sysv/linux/Makefile (CPPFLAGS-lddlibc4): Likewise. + * iconvdata/Makefile (CPPFLAGS): Likewise. + (cpp-srcs-left): Add libof for all iconvdata routines. + * bits/stdio-lock.h: Replace NOT_IN_libc with IS_IN. + * include/assert.h: Likewise. + * include/ctype.h: Likewise. + * include/errno.h: Likewise. + * include/libc-symbols.h: Likewise. + * include/math.h: Likewise. + * include/netdb.h: Likewise. + * include/resolv.h: Likewise. + * include/stdio.h: Likewise. + * include/stdlib.h: Likewise. + * include/string.h: Likewise. + * include/sys/stat.h: Likewise. + * include/wctype.h: Likewise. + * intl/l10nflist.c: Likewise. + * libidn/idn-stub.c: Likewise. + * libio/libioP.h: Likewise. + * nptl/libc_multiple_threads.c: Likewise. + * nptl/pthreadP.h: Likewise. + * posix/regex_internal.h: Likewise. + * resolv/res_hconf.c: Likewise. + * sysdeps/arm/armv7/multiarch/memcpy.S: Likewise. + * sysdeps/arm/memmove.S: Likewise. + * sysdeps/arm/sysdep.h: Likewise. + * sysdeps/generic/_itoa.h: Likewise. + * sysdeps/generic/symbol-hacks.h: Likewise. + * sysdeps/gnu/errlist.awk: Likewise. + * sysdeps/gnu/errlist.c: Likewise. + * sysdeps/i386/i586/memcpy.S: Likewise. + * sysdeps/i386/i586/memset.S: Likewise. + * sysdeps/i386/i686/memcpy.S: Likewise. + * sysdeps/i386/i686/memmove.S: Likewise. + * sysdeps/i386/i686/mempcpy.S: Likewise. + * sysdeps/i386/i686/memset.S: Likewise. + * sysdeps/i386/i686/multiarch/bcopy.S: Likewise. + * sysdeps/i386/i686/multiarch/bzero.S: Likewise. + * sysdeps/i386/i686/multiarch/memchr-sse2-bsf.S: Likewise. + * sysdeps/i386/i686/multiarch/memchr-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/memchr.S: Likewise. + * sysdeps/i386/i686/multiarch/memcmp-sse4.S: Likewise. + * sysdeps/i386/i686/multiarch/memcmp-ssse3.S: Likewise. + * sysdeps/i386/i686/multiarch/memcmp.S: Likewise. + * sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S: Likewise. + * sysdeps/i386/i686/multiarch/memcpy-ssse3.S: Likewise. + * sysdeps/i386/i686/multiarch/memcpy.S: Likewise. + * sysdeps/i386/i686/multiarch/memcpy_chk.S: Likewise. + * sysdeps/i386/i686/multiarch/memmove.S: Likewise. + * sysdeps/i386/i686/multiarch/memmove_chk.S: Likewise. + * sysdeps/i386/i686/multiarch/mempcpy.S: Likewise. + * sysdeps/i386/i686/multiarch/mempcpy_chk.S: Likewise. + * sysdeps/i386/i686/multiarch/memrchr-c.c: Likewise. + * sysdeps/i386/i686/multiarch/memrchr-sse2-bsf.S: Likewise. + * sysdeps/i386/i686/multiarch/memrchr-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/memrchr.S: Likewise. + * sysdeps/i386/i686/multiarch/memset-sse2-rep.S: Likewise. + * sysdeps/i386/i686/multiarch/memset-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/memset.S: Likewise. + * sysdeps/i386/i686/multiarch/memset_chk.S: Likewise. + * sysdeps/i386/i686/multiarch/rawmemchr.S: Likewise. + * sysdeps/i386/i686/multiarch/strcat-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/strcat-ssse3.S: Likewise. + * sysdeps/i386/i686/multiarch/strcat.S: Likewise. + * sysdeps/i386/i686/multiarch/strchr-sse2-bsf.S: Likewise. + * sysdeps/i386/i686/multiarch/strchr-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/strchr.S: Likewise. + * sysdeps/i386/i686/multiarch/strcmp-sse4.S: Likewise. + * sysdeps/i386/i686/multiarch/strcmp-ssse3.S: Likewise. + * sysdeps/i386/i686/multiarch/strcmp.S: Likewise. + * sysdeps/i386/i686/multiarch/strcpy-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/strcpy-ssse3.S: Likewise. + * sysdeps/i386/i686/multiarch/strcpy.S: Likewise. + * sysdeps/i386/i686/multiarch/strcspn.S: Likewise. + * sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S: Likewise. + * sysdeps/i386/i686/multiarch/strlen-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/strlen.S: Likewise. + * sysdeps/i386/i686/multiarch/strnlen.S: Likewise. + * sysdeps/i386/i686/multiarch/strrchr-sse2-bsf.S: Likewise. + * sysdeps/i386/i686/multiarch/strrchr-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/strrchr.S: Likewise. + * sysdeps/i386/i686/multiarch/strspn.S: Likewise. + * sysdeps/i386/i686/multiarch/wcschr-c.c: Likewise. + * sysdeps/i386/i686/multiarch/wcschr-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/wcschr.S: Likewise. + * sysdeps/i386/i686/multiarch/wcscmp-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/wcscmp.S: Likewise. + * sysdeps/i386/i686/multiarch/wcscpy-c.c: Likewise. + * sysdeps/i386/i686/multiarch/wcscpy-ssse3.S: Likewise. + * sysdeps/i386/i686/multiarch/wcscpy.S: Likewise. + * sysdeps/i386/i686/multiarch/wcslen-c.c: Likewise. + * sysdeps/i386/i686/multiarch/wcslen-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/wcslen.S: Likewise. + * sysdeps/i386/i686/multiarch/wcsrchr-c.c: Likewise. + * sysdeps/i386/i686/multiarch/wcsrchr-sse2.S: Likewise. + * sysdeps/i386/i686/multiarch/wcsrchr.S: Likewise. + * sysdeps/i386/i686/multiarch/wmemcmp-c.c: Likewise. + * sysdeps/i386/i686/multiarch/wmemcmp.S: Likewise. + * sysdeps/ia64/fpu/libm-symbols.h: Likewise. + * sysdeps/nptl/bits/libc-lock.h: Likewise. + * sysdeps/nptl/bits/libc-lockP.h: Likewise. + * sysdeps/nptl/bits/stdio-lock.h: Likewise. + * sysdeps/posix/closedir.c: Likewise. + * sysdeps/posix/opendir.c: Likewise. + * sysdeps/posix/readdir.c: Likewise. + * sysdeps/posix/rewinddir.c: Likewise. + * sysdeps/powerpc/novmx-sigjmp.c: Likewise. + * sysdeps/powerpc/powerpc32/__longjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/bsd-_setjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/__longjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/setjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/bzero.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memchr.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memcmp-ppc32.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memcmp.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memcpy-ppc32.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memcpy.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memmove.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/mempcpy.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memrchr-ppc32.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memrchr.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memset-ppc32.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/memset.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/rawmemchr.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strcasecmp.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strcasecmp_l.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strchr.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strchrnul.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strlen-ppc32.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strlen.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strncase.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strncase_l.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strncmp-ppc32.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strncmp.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/strnlen.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/wcschr.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/wordcopy.c: Likewise. + * sysdeps/powerpc/powerpc32/power6/memset.S: Likewise. + * sysdeps/powerpc/powerpc32/setjmp.S: Likewise. + * sysdeps/powerpc/powerpc64/__longjmp.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/bzero.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memchr.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memcmp.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memcpy.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memmove-ppc64.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memmove.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/mempcpy.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memrchr.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/memset.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/stpcpy.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/stpncpy.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcat.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strchr.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strchrnul.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcmp.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcpy.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strcspn.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strlen.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strncase.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strncase_l.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strncat.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strncmp.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strncpy.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strnlen.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strpbrk.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strrchr-ppc64.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strrchr.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strspn-ppc64.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/strspn.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/wcschr.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/wcscpy.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c: Likewise. + * sysdeps/powerpc/powerpc64/multiarch/wordcopy.c: Likewise. + * sysdeps/powerpc/powerpc64/setjmp.S: Likewise. + * sysdeps/s390/s390-32/multiarch/ifunc-resolve.c: Likewise. + * sysdeps/s390/s390-32/multiarch/memcmp.S: Likewise. + * sysdeps/s390/s390-32/multiarch/memcpy.S: Likewise. + * sysdeps/s390/s390-32/multiarch/memset.S: Likewise. + * sysdeps/s390/s390-64/multiarch/ifunc-resolve.c: Likewise. + * sysdeps/s390/s390-64/multiarch/memcmp.S: Likewise. + * sysdeps/s390/s390-64/multiarch/memcpy.S: Likewise. + * sysdeps/s390/s390-64/multiarch/memset.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memcpy-niagara4.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memcpy.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memset-niagara1.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memset-niagara4.S: Likewise. + * sysdeps/sparc/sparc64/multiarch/memset.S: Likewise. + * sysdeps/unix/alpha/sysdep.S: Likewise. + * sysdeps/unix/alpha/sysdep.h: Likewise. + * sysdeps/unix/make-syscalls.sh: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/alpha/vfork.S: Likewise. + * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/getpid.c: Likewise. + * sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. + * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/lowlevellock-futex.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/microblaze/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/not-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/longjmp_chk.c: Likewise. + * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S: Likewise. + * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Likewise. + * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sh/vfork.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/brk.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/tile/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/tile/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/tile/waitpid.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise. + * sysdeps/wordsize-32/symbol-hacks.h: Likewise. + * sysdeps/x86_64/memcpy.S: Likewise. + * sysdeps/x86_64/memmove.c: Likewise. + * sysdeps/x86_64/memset.S: Likewise. + * sysdeps/x86_64/multiarch/init-arch.h: Likewise. + * sysdeps/x86_64/multiarch/memcmp-sse4.S: Likewise. + * sysdeps/x86_64/multiarch/memcmp-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/memcmp.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy-ssse3-back.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy_chk.S: Likewise. + * sysdeps/x86_64/multiarch/memmove.c: Likewise. + * sysdeps/x86_64/multiarch/mempcpy.S: Likewise. + * sysdeps/x86_64/multiarch/mempcpy_chk.S: Likewise. + * sysdeps/x86_64/multiarch/memset-avx2.S: Likewise. + * sysdeps/x86_64/multiarch/memset.S: Likewise. + * sysdeps/x86_64/multiarch/memset_chk.S: Likewise. + * sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S: Likewise. + * sysdeps/x86_64/multiarch/strcat-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/strcat.S: Likewise. + * sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S: Likewise. + * sysdeps/x86_64/multiarch/strchr.S: Likewise. + * sysdeps/x86_64/multiarch/strcmp-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/strcmp.S: Likewise. + * sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: Likewise. + * sysdeps/x86_64/multiarch/strcpy-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/strcpy.S: Likewise. + * sysdeps/x86_64/multiarch/strcspn.S: Likewise. + * sysdeps/x86_64/multiarch/strspn.S: Likewise. + * sysdeps/x86_64/multiarch/wcscpy-c.c: Likewise. + * sysdeps/x86_64/multiarch/wcscpy-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/wcscpy.S: Likewise. + * sysdeps/x86_64/multiarch/wmemcmp-c.c: Likewise. + * sysdeps/x86_64/multiarch/wmemcmp.S: Likewise. + * sysdeps/x86_64/strcmp.S: Likewise. + +Index: glibc-2.17-c758a686/bits/stdio-lock.h +=================================================================== +--- glibc-2.17-c758a686.orig/bits/stdio-lock.h ++++ glibc-2.17-c758a686/bits/stdio-lock.h +@@ -44,7 +44,7 @@ __libc_lock_define_recursive (typedef, _ + #define _IO_cleanup_region_end(_doit) \ + __libc_cleanup_region_end (_doit) + +-#if defined _LIBC && !defined NOT_IN_libc ++#if defined _LIBC && IS_IN (libc) + # define _IO_acquire_lock(_fp) \ + _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, (_fp)); \ + _IO_flockfile (_fp) +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -99,7 +99,6 @@ install-others += $(inst_auditdir)/sotru + install-bin-script += sotruss + generated += sotruss + libof-sotruss-lib = extramodules +-CPPFLAGS-sotruss-lib = -DNOT_IN_libc + $(objpfx)sotruss-lib.so: $(objpfx)sotruss-lib.os + $(build-module-asneeded) + $(objpfx)sotruss-lib.so: $(common-objpfx)libc.so $(objpfx)ld.so \ +@@ -437,15 +436,12 @@ $(objpfx)pldd: $(pldd-modules:%=$(objpfx + + SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"' + CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \ +- -D'SLIBDIR="$(slibdir)"' -DNOT_IN_libc ++ -D'SLIBDIR="$(slibdir)"' + libof-ldconfig = ldconfig + CFLAGS-dl-cache.c = $(SYSCONF-FLAGS) + CFLAGS-cache.c = $(SYSCONF-FLAGS) + CFLAGS-rtld.c = $(SYSCONF-FLAGS) + +-CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ +- -DNOT_IN_libc=1) +- + # Disable any optimization which might result in function calls during early + # dynamic loader startup. We disable -ftree-loop-distribute-patterns which + # might convert code into calls to functions like memcpy or memset when the PLT +Index: glibc-2.17-c758a686/elf/rtld-Rules +=================================================================== +--- glibc-2.17-c758a686.orig/elf/rtld-Rules ++++ glibc-2.17-c758a686/elf/rtld-Rules +@@ -128,12 +128,10 @@ ifdef rtld-depfiles + -include $(rtld-depfiles) + endif + ++# This here is the whole point of all the shenanigans. + # Set libof-* for each routine. + cpp-srcs-left := $(rtld-modules:%.os=%) + lib := rtld + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + +-# This here is the whole point of all the shenanigans. +-rtld-CPPFLAGS := -DNOT_IN_libc=1 +- + endif +Index: glibc-2.17-c758a686/extra-lib.mk +=================================================================== +--- glibc-2.17-c758a686.orig/extra-lib.mk ++++ glibc-2.17-c758a686/extra-lib.mk +@@ -100,5 +100,3 @@ cpp-srcs-left := $($(lib)-routines) $($( + ifneq (,$(cpp-srcs-left)) + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + endif +- +-CPPFLAGS-$(lib) := -DNOT_IN_libc=1 +Index: glibc-2.17-c758a686/extra-modules.mk +=================================================================== +--- glibc-2.17-c758a686.orig/extra-modules.mk ++++ glibc-2.17-c758a686/extra-modules.mk +@@ -7,4 +7,3 @@ module := $(firstword $(extra-modules-le + extra-modules-left := $(filter-out $(module),$(extra-modules-left)) + + libof-$(notdir $(module)) := extramodules +-CPPFLAGS-$(module).c += -DNOT_IN_libc +Index: glibc-2.17-c758a686/iconv/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/iconv/Makefile ++++ glibc-2.17-c758a686/iconv/Makefile +@@ -53,8 +53,6 @@ CFLAGS-gconv_cache.c += -DGCONV_DIR='"$( + CFLAGS-gconv_conf.c = -DGCONV_PATH='"$(gconvdir)"' + CFLAGS-iconvconfig.c = -DGCONV_PATH='"$(gconvdir)"' -DGCONV_DIR='"$(gconvdir)"' + +-CPPFLAGS-iconvprogs = -DNOT_IN_libc +- + # Set libof-* for each routine. + cpp-srcs-left := $(iconv_prog-modules) $(iconvconfig-modules) + lib := iconvprogs +Index: glibc-2.17-c758a686/iconvdata/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/iconvdata/Makefile ++++ glibc-2.17-c758a686/iconvdata/Makefile +@@ -76,9 +76,6 @@ endif + test-srcs := tst-table-from tst-table-to + endif + +-# No code here is in libc.so. +-CPPFLAGS += -DNOT_IN_libc +- + libJIS-routines := jis0201 jis0208 jis0212 + libKSC-routines := ksc5601 + libGB-routines := gb2312 +@@ -267,7 +264,9 @@ endif # build-shared = yes + include ../Rules + + # Set libof-* for each routine. +-cpp-srcs-left := $(modules) $(generated-modules) ++cpp-srcs-left := $(modules) $(generated-modules) $(libJIS-routines) \ ++ $(libKSC-routines) $(libGB-routines) $(libCNS-routines) \ ++ $(libISOIR165-routines) $(libJISX0213-routines) + lib := iconvdata + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + +Index: glibc-2.17-c758a686/include/assert.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/assert.h ++++ glibc-2.17-c758a686/include/assert.h +@@ -20,7 +20,7 @@ extern void __assert_fail_base (const ch + const char *function) + __THROW __attribute__ ((__noreturn__)); + +-# if !defined NOT_IN_libc || IS_IN (rtld) ++# if IS_IN (libc) || IS_IN (rtld) + hidden_proto (__assert_fail) + hidden_proto (__assert_perror_fail) + # endif +Index: glibc-2.17-c758a686/include/errno.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/errno.h ++++ glibc-2.17-c758a686/include/errno.h +@@ -17,19 +17,19 @@ + # define errno rtld_errno + extern int rtld_errno attribute_hidden; + +-# elif !defined NOT_IN_libc || IS_IN_LIB ++# elif IS_IN_LIB + + # include + + # undef errno +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define errno __libc_errno + # else + # define errno errno /* For #ifndef errno tests. */ + # endif + extern __thread int errno attribute_tls_model_ie; + +-# endif /* !NOT_IN_libc || IS_IN_LIB */ ++# endif /* IS_IN_LIB */ + + # define __set_errno(val) (errno = (val)) + +Index: glibc-2.17-c758a686/include/math.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/math.h ++++ glibc-2.17-c758a686/include/math.h +@@ -6,7 +6,7 @@ + /* Now define the internal interfaces. */ + extern int __matherr (struct exception *__exc); + +-# if !defined NOT_IN_libc || IS_IN (libm) ++# if IS_IN (libc) || IS_IN (libm) + hidden_proto (__finite) + hidden_proto (__isinf) + hidden_proto (__isnan) +Index: glibc-2.17-c758a686/include/stdio.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/stdio.h ++++ glibc-2.17-c758a686/include/stdio.h +@@ -117,7 +117,7 @@ extern const char *const _sys_errlist_in + extern int _sys_nerr_internal attribute_hidden; + + libc_hidden_proto (__asprintf) +-# if !defined NOT_IN_libc ++# if IS_IN (libc) + extern _IO_FILE *_IO_new_fopen (const char*, const char*); + # define fopen(fname, mode) _IO_new_fopen (fname, mode) + extern _IO_FILE *_IO_new_fdopen (int, const char*); +Index: glibc-2.17-c758a686/include/string.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/string.h ++++ glibc-2.17-c758a686/include/string.h +@@ -57,7 +57,7 @@ extern __typeof (strcasecmp_l) __strcase + extern __typeof (strncasecmp_l) __strncasecmp_l; + + /* Alternative version which doesn't pollute glibc's namespace. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # undef strndupa + # define strndupa(s, n) \ + (__extension__ \ +Index: glibc-2.17-c758a686/include/sys/stat.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/sys/stat.h ++++ glibc-2.17-c758a686/include/sys/stat.h +@@ -12,7 +12,7 @@ extern __mode_t __umask (__mode_t __mask + extern int __mkdir (const char *__path, __mode_t __mode); + extern int __mknod (const char *__path, + __mode_t __mode, __dev_t __dev); +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + hidden_proto (__fxstat) + hidden_proto (__fxstat64) + hidden_proto (__lxstat) +Index: glibc-2.17-c758a686/include/wctype.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/wctype.h ++++ glibc-2.17-c758a686/include/wctype.h +@@ -89,7 +89,7 @@ libc_hidden_proto (__towupper_l) + + /* The spec says that isdigit must only match the decimal digits. We + can check this without a memory access. */ +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # undef iswdigit + # define iswdigit(c) ({ wint_t __c = (c); __c >= L'0' && __c <= L'9'; }) + # undef iswdigit_l +Index: glibc-2.17-c758a686/intl/l10nflist.c +=================================================================== +--- glibc-2.17-c758a686.orig/intl/l10nflist.c ++++ glibc-2.17-c758a686/intl/l10nflist.c +@@ -324,7 +324,7 @@ _nl_normalize_codeset (codeset, name_len + char *retval; + char *wp; + size_t cnt; +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + locale_t locale = newlocale (0, "C", NULL); + #else + # define locale _nl_C_locobj_ptr +Index: glibc-2.17-c758a686/libidn/idn-stub.c +=================================================================== +--- glibc-2.17-c758a686.orig/libidn/idn-stub.c ++++ glibc-2.17-c758a686/libidn/idn-stub.c +@@ -130,7 +130,7 @@ __idna_to_ascii_lz (const char *input, c + } + + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + libc_freeres_fn (unload_libidn) + { + if (h != NULL && h != (void *) 1l) +Index: glibc-2.17-c758a686/libio/libioP.h +=================================================================== +--- glibc-2.17-c758a686.orig/libio/libioP.h ++++ glibc-2.17-c758a686/libio/libioP.h +@@ -900,7 +900,7 @@ _IO_acquire_lock_clear_flags2_fct (_IO_F + _IO_funlockfile (fp); + } + +-#if !defined _IO_MTSAFE_IO && !defined NOT_IN_libc ++#if !defined _IO_MTSAFE_IO && IS_IN (libc) + # define _IO_acquire_lock(_fp) \ + do { \ + _IO_FILE *_IO_acquire_lock_file = NULL +Index: glibc-2.17-c758a686/malloc/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/Makefile ++++ glibc-2.17-c758a686/malloc/Makefile +@@ -56,8 +56,6 @@ extra-objs = mcheck-init.o libmcheck.a + # Include the cleanup handler. + aux := set-freeres thread-freeres + +-CPPFLAGS-memusagestat = -DNOT_IN_libc +- + # The Perl script to analyze the output of the mtrace functions. + ifneq ($(PERL),no) + install-bin-script = mtrace +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/libc_multiple_threads.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/libc_multiple_threads.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/libc_multiple_threads.c +@@ -18,7 +18,7 @@ + + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifndef TLS_MULTIPLE_THREADS_IN_TCB + /* Variable set to a nonzero value either if more than one thread runs or ran, + or if a single-threaded process is trying to cancel itself. See +Index: glibc-2.17-c758a686/nptl/pthreadP.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/pthreadP.h ++++ glibc-2.17-c758a686/nptl/pthreadP.h +@@ -273,7 +273,7 @@ __do_cancel (void) + #define CANCEL_RESET(oldtype) \ + __pthread_disable_asynccancel (oldtype) + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + /* Same as CANCEL_ASYNC, but for use in libc.so. */ + # define LIBC_CANCEL_ASYNC() \ + __libc_enable_asynccancel () +Index: glibc-2.17-c758a686/nscd/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nscd/Makefile ++++ glibc-2.17-c758a686/nscd/Makefile +@@ -79,7 +79,7 @@ CFLAGS-nscd_gethst_r.c = -fexceptions + CFLAGS-nscd_getai.c = -fexceptions + CFLAGS-nscd_initgroups.c = -fexceptions + +-CPPFLAGS-nscd += -D_FORTIFY_SOURCE=2 -DNOT_IN_libc ++CPPFLAGS-nscd += -D_FORTIFY_SOURCE=2 + + ifeq (yesyes,$(have-fpie)$(build-shared)) + CFLAGS-nscd += $(pie-ccflag) +Index: glibc-2.17-c758a686/posix/regex_internal.h +=================================================================== +--- glibc-2.17-c758a686.orig/posix/regex_internal.h ++++ glibc-2.17-c758a686/posix/regex_internal.h +@@ -385,7 +385,7 @@ typedef struct re_dfa_t re_dfa_t; + # endif + #endif + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr, + int new_buf_len) + internal_function; +@@ -735,7 +735,7 @@ re_string_wchar_at (const re_string_t *p + return (wint_t) pstr->wcs[idx]; + } + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + static int + internal_function __attribute ((pure)) + re_string_elem_size_at (const re_string_t *pstr, int idx) +Index: glibc-2.17-c758a686/stdlib/isomac.c +=================================================================== +--- glibc-2.17-c758a686.orig/stdlib/isomac.c ++++ glibc-2.17-c758a686/stdlib/isomac.c +@@ -176,7 +176,8 @@ static char *macros[] = + /* Format string to build command to invoke compiler. */ + static const char fmt[] = "\ + echo \"#include <%s>\" |\ +-%s -E -dM -ansi -pedantic %s -D_LIBC -D_ISOMAC -DNOT_IN_libc -I. \ ++%s -E -dM -ansi -pedantic %s -D_LIBC -D_ISOMAC \ ++-DIN_MODULE=MODULE_extramodules -I. \ + -isystem `%s --print-prog-name=include` - 2> /dev/null > %s"; + + +@@ -304,7 +305,7 @@ get_null_defines (void) + ; + result[result_len] = xstrndup (start, end - start); + +- if (strcmp (result[result_len], "NOT_IN_libc") != 0) ++ if (strcmp (result[result_len], "IN_MODULE") != 0) + { + if (first) + { +Index: glibc-2.17-c758a686/sunrpc/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sunrpc/Makefile ++++ glibc-2.17-c758a686/sunrpc/Makefile +@@ -168,7 +168,7 @@ $(cross-rpcgen-objs): $(objpfx)cross-%.o + $(objpfx)cross-rpcgen: $(cross-rpcgen-objs) + $(BUILD_CC) $^ $(BUILD_LDFLAGS) -o $@ + +-# This makes sure -DNOT_IN_libc is passed for all these modules. ++# This makes sure -DIN_MODULE is passed for all these modules. + cpp-srcs-left := $(rpcgen-objs:.o=.c) + lib := nonlib + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) +Index: glibc-2.17-c758a686/ports/sysdeps/arm/memmove.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/arm/memmove.S ++++ glibc-2.17-c758a686/ports/sysdeps/arm/memmove.S +@@ -65,7 +65,7 @@ ENTRY(memmove) + + subs ip, r0, r1 + cmphi r2, ip +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + bls memcpy + #else + bls HIDDEN_JUMPTARGET(memcpy) +Index: glibc-2.17-c758a686/sysdeps/generic/_itoa.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/generic/_itoa.h ++++ glibc-2.17-c758a686/sysdeps/generic/_itoa.h +@@ -46,12 +46,12 @@ extern char *_itoa (unsigned long long i + + extern const char _itoa_upper_digits[]; + extern const char _itoa_lower_digits[]; +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + hidden_proto (_itoa_upper_digits) + hidden_proto (_itoa_lower_digits) + #endif + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + extern char *_itoa_word (_ITOA_WORD_TYPE value, char *buflim, + unsigned int base, int upper_case); + #else +Index: glibc-2.17-c758a686/sysdeps/generic/symbol-hacks.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/generic/symbol-hacks.h ++++ glibc-2.17-c758a686/sysdeps/generic/symbol-hacks.h +@@ -1,6 +1,6 @@ + /* Some compiler optimizations may transform loops into memset/memmove + calls and without proper declaration it may generate PLT calls. */ +-#if !defined __ASSEMBLER__ && !defined NOT_IN_libc && defined SHARED ++#if !defined __ASSEMBLER__ && IS_IN (libc) && defined SHARED + asm ("memmove = __GI_memmove"); + asm ("memset = __GI_memset"); + asm ("memcpy = __GI_memcpy"); +Index: glibc-2.17-c758a686/sysdeps/gnu/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/gnu/Makefile ++++ glibc-2.17-c758a686/sysdeps/gnu/Makefile +@@ -41,7 +41,7 @@ $(objpfx)errlist-compat.c: $(errlist-c) + endif + $(make-target-directory) + $(AWK) -v maxerr=`\ +- $(CC) -S $(CPPFLAGS) $(CFLAGS) -DNOT_IN_libc -DEMIT_ERR_MAX $< -o - \ ++ $(CC) -S $(CPPFLAGS) $(CFLAGS) -DEMIT_ERR_MAX $< -o - \ + | sed -n 's/^.*@@@[^0-9]*\([0-9]*\)[^0-9]*@@@.*$$/\1/p'` \ + -f $(..)sysdeps/gnu/errlist-compat.awk \ + $(wildcard $(sysdirs:=/Versions)) > $@T +Index: glibc-2.17-c758a686/sysdeps/i386/i586/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i586/memset.S ++++ glibc-2.17-c758a686/sysdeps/i386/i586/memset.S +@@ -37,7 +37,7 @@ + #endif + + .text +-#if defined PIC && !defined NOT_IN_libc && !BZERO_P ++#if defined PIC && IS_IN (libc) && !BZERO_P + ENTRY (__memset_chk) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/memset.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/memset.S +@@ -38,7 +38,7 @@ + #endif + + .text +-#if defined PIC && !defined NOT_IN_libc && !BZERO_P ++#if defined PIC && IS_IN (libc) && !BZERO_P + ENTRY_CHK (__memset_chk) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) +@@ -105,7 +105,7 @@ ENTRY (BP_SYM (memset)) + END (BP_SYM (memset)) + libc_hidden_builtin_def (memset) + +-#if defined PIC && !defined NOT_IN_libc && !BZERO_P ++#if defined PIC && IS_IN (libc) && !BZERO_P + strong_alias (__memset_chk, __memset_zero_constant_len_parameter) + .section .gnu.warning.__memset_zero_constant_len_parameter + .string "memset used with constant zero length parameter; this could be due to transposed parameters" +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bcopy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/bcopy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bcopy.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(bcopy) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bzero.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/bzero.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bzero.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(__bzero) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr-sse2-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memchr-sse2-bsf.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr-sse2-bsf.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memchr-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define CFI_POP(REG) \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (REG) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp-sse4.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcmp-sse4.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp-sse4.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcmp-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(memcmp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S +@@ -19,7 +19,7 @@ + + #include + +-#if !defined NOT_IN_libc \ ++#if IS_IN (libc) \ + && (defined SHARED \ + || defined USE_AS_MEMMOVE \ + || !defined USE_MULTIARCH) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if !defined NOT_IN_libc \ ++#if IS_IN (libc) \ + && (defined SHARED \ + || defined USE_AS_MEMMOVE \ + || !defined USE_MULTIARCH) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. In static binaries we need memcpy before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + .text + ENTRY(memcpy) + .type memcpy, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy_chk.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. There are no multiarch memcpy functions for static binaries. + */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(__memcpy_chk) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memmove.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(memmove) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memmove_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove_chk.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(__memmove_chk) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/mempcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. In static binaries we need mempcpy before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + .text + ENTRY(__mempcpy) + .type __mempcpy, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/mempcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy_chk.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. There are no multiarch mempcpy functions for static binaries. + */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(__mempcpy_chk) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memrchr-c.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr-c.c +@@ -1,4 +1,4 @@ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define MEMRCHR __memrchr_ia32 + # include + extern void *__memrchr_ia32 (const void *, int, size_t); +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr-sse2-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memrchr-sse2-bsf.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr-sse2-bsf.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memrchr-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + # define CFI_PUSH(REG) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memrchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define CFI_POP(REG) \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (REG) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset-sse2-rep.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset-sse2-rep.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset-sse2-rep.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + #include + #include "asm-syntax.h" +@@ -79,7 +79,7 @@ + #endif + + .section .text.sse2,"ax",@progbits +-#if defined SHARED && !defined NOT_IN_libc && !defined USE_AS_BZERO ++#if defined SHARED && IS_IN (libc) && !defined USE_AS_BZERO + ENTRY (__memset_chk_sse2_rep) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + #include + #include "asm-syntax.h" +@@ -79,7 +79,7 @@ + #endif + + .section .text.sse2,"ax",@progbits +-#if defined SHARED && !defined NOT_IN_libc && !defined USE_AS_BZERO ++#if defined SHARED && IS_IN (libc) && !defined USE_AS_BZERO + ENTRY (__memset_chk_sse2) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(memset) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset_chk.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(__memset_chk) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/rawmemchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/rawmemchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/rawmemchr.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define CFI_POP(REG) \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (REG) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcat-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat-sse2.S +@@ -18,7 +18,7 @@ + . */ + + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcat-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat-ssse3.S +@@ -18,7 +18,7 @@ + . */ + + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcat.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat.S +@@ -43,7 +43,7 @@ + /* Define multiple versions only for the definition in libc. Don't + define multiple versions for strncat in static library since we + need strncat before the initialization happened. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # ifdef SHARED + .text +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr-sse2-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strchr-sse2-bsf.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr-sse2-bsf.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strchr-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(strchr) + .type strchr, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp-sse4.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcmp-sse4.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp-sse4.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + #include + #include "asm-syntax.h" +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcmp-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + #include + #include "asm-syntax.h" +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp.S +@@ -50,7 +50,7 @@ + /* Define multiple versions only for the definition in libc. Don't + define multiple versions for strncmp in static library since we + need strncmp before the initialization happened. */ +-#if (defined SHARED || !defined USE_AS_STRNCMP) && !defined NOT_IN_libc ++#if (defined SHARED || !defined USE_AS_STRNCMP) && IS_IN (libc) + # ifdef SHARED + .text + ENTRY(STRCMP) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcpy-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy-sse2.S +@@ -18,7 +18,7 @@ + . */ + + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcpy-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy-ssse3.S +@@ -18,7 +18,7 @@ + . */ + + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # ifndef USE_AS_STRCAT + # include +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy.S +@@ -59,7 +59,7 @@ + /* Define multiple versions only for the definition in libc. Don't + define multiple versions for strncpy in static library since we + need strncpy before the initialization happened. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # ifdef SHARED + .text +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcspn.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcspn.S +@@ -41,7 +41,7 @@ + /* Define multiple versions only for the definition in libc. Don't + define multiple versions for strpbrk in static library since we + need strpbrk before the initialization happened. */ +-#if (defined SHARED || !defined USE_AS_STRPBRK) && !defined NOT_IN_libc ++#if (defined SHARED || !defined USE_AS_STRPBRK) && IS_IN (libc) + # ifdef SHARED + .text + ENTRY(STRCSPN) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + + #include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strlen-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen-sse2.S +@@ -19,7 +19,7 @@ + + /* for strlen only SHARED version is optimized, for strcat, strncat, strnlen both STATIC and SHARED are optimized */ + +-#if (defined USE_AS_STRNLEN || defined USE_AS_STRCAT || defined SHARED) && !defined NOT_IN_libc ++#if (defined USE_AS_STRNLEN || defined USE_AS_STRCAT || defined SHARED) && IS_IN (libc) + + # ifndef USE_AS_STRCAT + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strlen.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in libc and for the + DSO. In static binaries, we need strlen before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + .text + ENTRY(strlen) + .type strlen, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strnlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strnlen.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strnlen.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(__strnlen) + .type __strnlen, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr-sse2-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strrchr-sse2-bsf.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr-sse2-bsf.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strrchr-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strrchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(strrchr) + .type strrchr, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strspn.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strspn.S +@@ -26,7 +26,7 @@ + #include + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(strspn) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcschr-c.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr-c.c +@@ -1,6 +1,6 @@ + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + # undef libc_hidden_def + # define libc_hidden_def(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcschr-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + # define CFI_PUSH(REG) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcschr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(wcschr) + .type wcschr, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscmp-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in libc and for the + DSO. In static binaries, we need wcscmp before the initialization + happened. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(wcscmp) + .type wcscmp, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscpy-c.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy-c.c +@@ -1,4 +1,4 @@ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define wcscpy __wcscpy_ia32 + #endif + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscpy-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + # define CFI_PUSH(REG) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(wcscpy) + .type wcscpy, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcslen-c.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen-c.c +@@ -1,6 +1,6 @@ + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define WCSLEN __wcslen_ia32 + #endif + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcslen-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # define STR 4 + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcslen.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(__wcslen) + .type __wcslen, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcsrchr-c.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr-c.c +@@ -1,4 +1,4 @@ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define wcsrchr __wcsrchr_ia32 + #endif + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr-sse2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcsrchr-sse2.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr-sse2.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # define CFI_PUSH(REG) \ + cfi_adjust_cfa_offset (4); \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcsrchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr.S +@@ -21,7 +21,7 @@ + #include + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(wcsrchr) + .type wcsrchr, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wmemcmp-c.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp-c.c +@@ -1,6 +1,6 @@ + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define WMEMCMP __wmemcmp_ia32 + #endif + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wmemcmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp.S +@@ -23,7 +23,7 @@ + + /* Define multiple versions only for the definition in libc. */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(wmemcmp) + .type wmemcmp, @gnu_indirect_function +Index: glibc-2.17-c758a686/ports/sysdeps/ia64/fpu/libm-symbols.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/ia64/fpu/libm-symbols.h ++++ glibc-2.17-c758a686/ports/sysdeps/ia64/fpu/libm-symbols.h +@@ -53,6 +53,6 @@ + ASM_SIZE_DIRECTIVE(__ieee754_##name); \ + .type __ieee754_##name, @function + +-#if defined ASSEMBLER && !defined NOT_IN_libc ++#if defined ASSEMBLER && IS_IN (libc) + # define __libm_error_support HIDDEN_JUMPTARGET(__libm_error_support) + #endif +Index: glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/pthread/bits/libc-lock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lock.h +@@ -26,7 +26,7 @@ + + /* Mutex type. */ + #if defined _LIBC || defined _IO_MTSAFE_IO +-# if (defined NOT_IN_libc && !IS_IN (libpthread)) || !defined _LIBC ++# if (!IS_IN (libc) && !IS_IN (libpthread)) || !defined _LIBC + typedef struct { pthread_mutex_t mutex; } __libc_lock_recursive_t; + # else + typedef struct { int lock; int cnt; void *owner; } __libc_lock_recursive_t; +@@ -47,7 +47,7 @@ typedef struct __libc_lock_recursive_opa + + /* Define an initialized recursive lock variable NAME with storage + class CLASS. */ +-#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) ++#if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) + # if LLL_LOCK_INITIALIZER == 0 + # define __libc_lock_define_initialized_recursive(CLASS,NAME) \ + CLASS __libc_lock_recursive_t NAME; +@@ -65,7 +65,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Initialize a recursive mutex. */ +-#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) ++#if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) + # define __libc_lock_init_recursive(NAME) \ + ((NAME) = (__libc_lock_recursive_t) _LIBC_LOCK_RECURSIVE_INITIALIZER, 0) + #else +@@ -83,7 +83,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Finalize recursive named lock. */ +-#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) ++#if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) + # define __libc_lock_fini_recursive(NAME) ((void) 0) + #else + # define __libc_lock_fini_recursive(NAME) \ +@@ -91,7 +91,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Lock the recursive named lock variable. */ +-#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) ++#if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) + # define __libc_lock_lock_recursive(NAME) \ + do { \ + void *self = THREAD_SELF; \ +@@ -108,7 +108,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Try to lock the recursive named lock variable. */ +-#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) ++#if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) + # define __libc_lock_trylock_recursive(NAME) \ + ({ \ + int result = 0; \ +@@ -133,7 +133,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Unlock the recursive named lock variable. */ +-#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) ++#if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) + /* We do no error checking here. */ + # define __libc_lock_unlock_recursive(NAME) \ + do { \ +Index: glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lockP.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/pthread/bits/libc-lockP.h ++++ glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lockP.h +@@ -35,7 +35,7 @@ + #include + + /* Mutex type. */ +-#if defined NOT_IN_libc && !IS_IN (libpthread) ++#if !IS_IN (libc) && !IS_IN (libpthread) + typedef pthread_mutex_t __libc_lock_t; + #else + typedef int __libc_lock_t; +@@ -69,7 +69,7 @@ typedef pthread_key_t __libc_key_t; + initialized locks must be set to one due to the lack of normal + atomic operations.) */ + +-#if !defined NOT_IN_libc || IS_IN (libpthread) ++#if IS_IN (libc) || IS_IN (libpthread) + # if LLL_LOCK_INITIALIZER == 0 + # define __libc_lock_define_initialized(CLASS,NAME) \ + CLASS __libc_lock_t NAME; +@@ -113,7 +113,7 @@ typedef pthread_key_t __libc_key_t; + #endif + + /* Call thread functions through the function pointer table. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # define PTFAVAIL(NAME) __libc_pthread_functions_init + # define __libc_ptf_call(FUNC, ARGS, ELSE) \ + (__libc_pthread_functions_init ? PTHFCT_CALL (ptr_##FUNC, ARGS) : ELSE) +@@ -130,13 +130,13 @@ typedef pthread_key_t __libc_key_t; + + /* Initialize the named lock variable, leaving it in a consistent, unlocked + state. */ +-#if !defined NOT_IN_libc || IS_IN (libpthread) ++#if IS_IN (libc) || IS_IN (libpthread) + # define __libc_lock_init(NAME) ((NAME) = LLL_LOCK_INITIALIZER, 0) + #else + # define __libc_lock_init(NAME) \ + __libc_maybe_call (__pthread_mutex_init, (&(NAME), NULL), 0) + #endif +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + /* ((NAME) = (__libc_rwlock_t) PTHREAD_RWLOCK_INITIALIZER, 0) is + inefficient. */ + # define __libc_rwlock_init(NAME) \ +@@ -149,13 +149,13 @@ typedef pthread_key_t __libc_key_t; + /* Finalize the named lock variable, which must be locked. It cannot be + used again until __libc_lock_init is called again on it. This must be + called on a lock variable before the containing storage is reused. */ +-#if !defined NOT_IN_libc || IS_IN (libpthread) ++#if IS_IN (libc) || IS_IN (libpthread) + # define __libc_lock_fini(NAME) ((void) 0) + #else + # define __libc_lock_fini(NAME) \ + __libc_maybe_call (__pthread_mutex_destroy, (&(NAME)), 0) + #endif +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # define __libc_rwlock_fini(NAME) ((void) 0) + #else + # define __libc_rwlock_fini(NAME) \ +@@ -163,7 +163,7 @@ typedef pthread_key_t __libc_key_t; + #endif + + /* Lock the named lock variable. */ +-#if !defined NOT_IN_libc || IS_IN (libpthread) ++#if IS_IN (libc) || IS_IN (libpthread) + # ifndef __libc_lock_lock + # define __libc_lock_lock(NAME) \ + ({ lll_lock (NAME, LLL_PRIVATE); 0; }) +@@ -179,7 +179,7 @@ typedef pthread_key_t __libc_key_t; + __libc_ptf_call (__pthread_rwlock_wrlock, (&(NAME)), 0) + + /* Try to lock the named lock variable. */ +-#if !defined NOT_IN_libc || IS_IN (libpthread) ++#if IS_IN (libc) || IS_IN (libpthread) + # ifndef __libc_lock_trylock + # define __libc_lock_trylock(NAME) \ + lll_trylock (NAME) +@@ -198,7 +198,7 @@ typedef pthread_key_t __libc_key_t; + __libc_maybe_call (__pthread_mutex_trylock, (&(NAME).mutex), 0) + + /* Unlock the named lock variable. */ +-#if !defined NOT_IN_libc || IS_IN (libpthread) ++#if IS_IN (libc) || IS_IN (libpthread) + # define __libc_lock_unlock(NAME) \ + lll_unlock (NAME, LLL_PRIVATE) + #else +Index: glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/stdio-lock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/pthread/bits/stdio-lock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/stdio-lock.h +@@ -84,7 +84,7 @@ typedef struct { int lock; int cnt; void + #define _IO_cleanup_region_end(_doit) \ + __libc_cleanup_region_end (_doit) + +-#if defined _LIBC && !defined NOT_IN_libc ++#if defined _LIBC && IS_IN (libc) + + # ifdef __EXCEPTIONS + # define _IO_acquire_lock(_fp) \ +Index: glibc-2.17-c758a686/sysdeps/posix/closedir.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/closedir.c ++++ glibc-2.17-c758a686/sysdeps/posix/closedir.c +@@ -44,7 +44,7 @@ __closedir (DIR *dirp) + + fd = dirp->fd; + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + __libc_lock_fini (dirp->lock); + #endif + +Index: glibc-2.17-c758a686/sysdeps/posix/opendir.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/opendir.c ++++ glibc-2.17-c758a686/sysdeps/posix/opendir.c +@@ -223,7 +223,7 @@ __alloc_dir (int fd, bool close_fd, int + } + + dirp->fd = fd; +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + __libc_lock_init (dirp->lock); + #endif + dirp->allocation = allocation; +Index: glibc-2.17-c758a686/sysdeps/posix/readdir.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/readdir.c ++++ glibc-2.17-c758a686/sysdeps/posix/readdir.c +@@ -40,7 +40,7 @@ __READDIR (DIR *dirp) + DIRENT_TYPE *dp; + int saved_errno = errno; + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + __libc_lock_lock (dirp->lock); + #endif + +@@ -110,7 +110,7 @@ __READDIR (DIR *dirp) + /* Skip deleted files. */ + } while (dp->d_ino == 0); + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + __libc_lock_unlock (dirp->lock); + #endif + +Index: glibc-2.17-c758a686/sysdeps/posix/rewinddir.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/rewinddir.c ++++ glibc-2.17-c758a686/sysdeps/posix/rewinddir.c +@@ -26,7 +26,7 @@ void + rewinddir (dirp) + DIR *dirp; + { +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + __libc_lock_lock (dirp->lock); + #endif + (void) __lseek (dirp->fd, (off_t) 0, SEEK_SET); +@@ -34,7 +34,7 @@ rewinddir (dirp) + dirp->offset = 0; + dirp->size = 0; + dirp->errcode = 0; +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + __libc_lock_unlock (dirp->lock); + #endif + } +Index: glibc-2.17-c758a686/sysdeps/powerpc/novmx-sigjmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/novmx-sigjmp.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/novmx-sigjmp.c +@@ -20,7 +20,7 @@ + + #include + #include +-#if !defined NOT_IN_libc && defined SHARED ++#if IS_IN (libc) && defined SHARED + # if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) + # include + # include +@@ -41,4 +41,4 @@ __novmx__sigjmp_save (__novmx__sigjmp_bu + } + + # endif /* SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) */ +-#endif /* !NOT_IN_libc && SHARED */ ++#endif /* IS_IN (libc) && SHARED */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/__longjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/__longjmp.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/__longjmp.S +@@ -19,11 +19,11 @@ + #include + #include + +-#if defined NOT_IN_libc ++#if !IS_IN (libc) + /* Build a non-versioned object for rtld-*. */ + # include "__longjmp-common.S" + +-#else /* !NOT_IN_libc */ ++#else /* !IS_IN (libc) */ + strong_alias (__vmx__longjmp, __longjmp); + # define __longjmp __vmx__longjmp + # include "__longjmp-common.S" +@@ -35,4 +35,4 @@ strong_alias (__vmx__longjmp, __longjmp) + # define __longjmp __novmx__longjmp + # include "__longjmp-common.S" + # endif +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-_setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/bsd-_setjmp.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-_setjmp.S +@@ -21,7 +21,7 @@ + #include + #include + +-#if defined NOT_IN_libc ++#if !IS_IN (libc) + /* Build a non-versioned object for rtld-*. */ + ENTRY (BP_SYM (_setjmp)) + li r4,0 /* Set second argument to 0. */ +@@ -55,4 +55,4 @@ ENTRY (BP_SYM (__vmx_setjmp)) + b BP_SYM (__vmx__sigsetjmp@local) + END (BP_SYM (__vmx_setjmp)) + libc_hidden_def (__vmx_setjmp) +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/fpu/__longjmp.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp.S +@@ -20,11 +20,11 @@ + #include + #include + +-#if defined NOT_IN_libc ++#if !IS_IN (libc) + /* Build a non-versioned object for rtld-*. */ + # include "__longjmp-common.S" + +-#else /* !NOT_IN_libc */ ++#else /* !IS_IN (libc) */ + /* Build a versioned object for libc. */ + versioned_symbol (libc, __vmx__longjmp, __longjmp, GLIBC_2_3_4); + # define __longjmp __vmx__longjmp +@@ -38,4 +38,4 @@ compat_symbol (libc, __novmx__longjmp, _ + # define __longjmp __novmx__longjmp + # include "__longjmp-common.S" + # endif +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/fpu/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp.S +@@ -20,11 +20,11 @@ + #include + #include + +-#if defined NOT_IN_libc ++#if !IS_IN (libc) + /* Build a non-versioned object for rtld-*. */ + # include "setjmp-common.S" + +-#else /* !NOT_IN_libc */ ++#else /* !IS_IN (libc) */ + /* Build a versioned object for libc. */ + versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) + # define __sigsetjmp __vmx__sigsetjmp +@@ -41,4 +41,4 @@ compat_symbol (libc, __novmx__sigsetjmp, + # define __sigjmp_save __novmx__sigjmp_save + # include "setjmp-common.S" + # endif +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power6/memset.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memset.S +@@ -230,7 +230,7 @@ L(nzCacheAligned128): + ori r1,r1,0 + stw rCHR,60(rMEMP3) + blt cr6,L(cacheAligned1) +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + lfd 0,-128(rMEMP) + #endif + b L(nzCacheAligned256) +@@ -238,7 +238,7 @@ L(nzCacheAligned128): + L(nzCacheAligned256): + cmplwi cr1,rLEN,256 + addi rMEMP3,rMEMP,64 +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + /* When we are not in libc we should use only GPRs to avoid the FPU lock + interrupt. */ + stw rCHR,0(rMEMP) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp.S +@@ -19,11 +19,11 @@ + #include + #include + +-#if defined NOT_IN_libc ++#if !IS_IN (libc) + /* Build a non-versioned object for rtld-*. */ + # include "setjmp-common.S" + +-#else /* !NOT_IN_libc */ ++#else /* !IS_IN (libc) */ + /* Build a versioned object for libc. */ + versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) + # define __sigsetjmp __vmx__sigsetjmp +@@ -40,4 +40,4 @@ compat_symbol (libc, __novmx__sigsetjmp, + # define __sigjmp_save __novmx__sigjmp_save + # include "setjmp-common.S" + # endif +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/__longjmp.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp.S +@@ -20,11 +20,11 @@ + #include + #include + +-#if defined NOT_IN_libc ++#if !IS_IN (libc) + /* Build a non-versioned object for rtld-*. */ + # include "__longjmp-common.S" + +-#else /* !NOT_IN_libc */ ++#else /* IS_IN (libc) */ + strong_alias (__vmx__longjmp, __longjmp) + # define __longjmp __vmx__longjmp + # include "__longjmp-common.S" +@@ -36,4 +36,4 @@ strong_alias (__vmx__longjmp, __longjmp) + # define __longjmp __novmx__longjmp + # include "__longjmp-common.S" + # endif +-#endif /* !NOT_IN_libc */ ++#endif /* IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/bzero.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/bzero.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/bzero.c +@@ -17,7 +17,7 @@ + . */ + + /* Define multiple versions only for definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memchr.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c +@@ -22,7 +22,7 @@ + #define weak_alias(name, aliasname) \ + extern __typeof (__memcmp_ppc) aliasname \ + __attribute__ ((weak, alias ("__memcmp_ppc"))); +-#if !defined(NOT_IN_libc) && defined(SHARED) ++#if IS_IN (libc) && defined(SHARED) + # undef libc_hidden_builtin_def + # define libc_hidden_builtin_def(name) \ + __hidden_ver1(__memcmp_ppc, __GI_memcmp, __memcmp_ppc); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memcmp.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcmp.c +@@ -17,7 +17,7 @@ + . */ + + /* Define multiple versions only for definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S +@@ -18,7 +18,7 @@ + + #include + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # undef EALIGN + # define EALIGN(name, alignt, words) \ + .section ".text"; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memcpy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memcpy.c +@@ -19,7 +19,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. In static binaries we need memcpy before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + /* Redefine memcpy so that the compiler won't complain about the type + mismatch with the IFUNC selector in strong_alias, below. */ + # undef memcpy +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memrchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memrchr.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memrchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S +@@ -29,7 +29,7 @@ ENTRY (__bzero_ppc) + END_GEN_TB (__bzero_ppc,TB_TOCLESS) + + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # undef EALIGN + # define EALIGN(name, alignt, words) \ + .section ".text"; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memset.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/memset.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/memset.c +@@ -17,7 +17,7 @@ + . */ + + /* Define multiple versions only for definition in libc. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + /* Redefine memset so that the compiler won't complain about the type + mismatch with the IFUNC selector in strong_alias, below. */ + # undef memset +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/stpcpy-ppc64.S +@@ -18,7 +18,7 @@ + + #include + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # undef EALIGN + # define EALIGN(name, alignt, words) \ + .section ".text"; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # define NO_MEMPCPY_STPCPY_REDIRECT + # include + # include +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/stpncpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # define strcasecmp __strcasecmp_ppc + extern __typeof (__strcasecmp) __strcasecmp_ppc attribute_hidden; +@@ -26,7 +26,7 @@ extern __typeof (__strcasecmp) __strcase + #include + #undef strcasecmp + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include "init-arch.h" + +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # define strcasecmp_l __strcasecmp_l_ppc + extern __typeof (__strcasecmp_l) __strcasecmp_l_ppc attribute_hidden; +@@ -26,7 +26,7 @@ extern __typeof (__strcasecmp_l) __strca + #include + #undef strcasecmp_l + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include "init-arch.h" + +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcat.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strcat.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcat.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strchr.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strchr.c +@@ -17,7 +17,7 @@ + . */ + + /* Define multiple versions only for definition in libc. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcmp-ppc64.S +@@ -18,7 +18,7 @@ + + #include + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # undef EALIGN + # define EALIGN(name, alignt, words) \ + .section ".text"; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strcmp.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S +@@ -18,7 +18,7 @@ + + #include + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # undef EALIGN + # define EALIGN(name, alignt, words) \ + .section ".text"; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strcpy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strcpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S +@@ -18,7 +18,7 @@ + + #include + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # undef ENTRY + # define ENTRY(name) \ + .section ".text"; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strlen.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strlen.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strlen.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + /* Redefine strlen so that the compiler won't complain about the type + mismatch with the IFUNC selector in strong_alias, below. */ + # undef strlen +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncase.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strncase.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncase.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # define strncasecmp __strncasecmp_ppc + extern __typeof (__strncasecmp) __strncasecmp_ppc attribute_hidden; +@@ -26,7 +26,7 @@ extern __typeof (__strncasecmp) __strnca + #include + #undef strncasecmp + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include "init-arch.h" + +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncase_l.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strncase_l.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncase_l.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # define strncasecmp_l __strncasecmp_l_ppc + extern __typeof (__strncasecmp_l) __strncasecmp_l_ppc attribute_hidden; +@@ -26,7 +26,7 @@ extern __typeof (__strncasecmp_l) __strn + #include + #undef strncasecmp_l + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include "init-arch.h" + +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S +@@ -17,7 +17,7 @@ + + #include + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + #undef EALIGN + #define EALIGN(name,alignt,words) \ + .section ".text"; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strncmp.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +@@ -17,7 +17,7 @@ + . */ + + /* Define multiple versions only for definition in libc. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncpy-ppc64.c +@@ -22,7 +22,7 @@ + #define weak_alias(name, aliasname) \ + extern __typeof (__strncpy_ppc) aliasname \ + __attribute__ ((weak, alias ("__strncpy_ppc"))); +-#if !defined(NOT_IN_libc) && defined(SHARED) ++#if IS_IN (libc) && defined(SHARED) + # undef libc_hidden_builtin_def + # define libc_hidden_builtin_def(name) \ + __hidden_ver1(__strncpy_ppc, __GI_strncpy, __strncpy_ppc); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strncpy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strncpy.c +@@ -17,7 +17,7 @@ + . */ + + /* Define multiple versions only for definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strnlen.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/strnlen.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/strnlen.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wcschr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/wcschr.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wcschr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wcscpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/wcscpy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wcscpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wcsrchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include "init-arch.h" +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wordcopy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/multiarch/wordcopy.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/multiarch/wordcopy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include + # include +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp.S +@@ -20,11 +20,11 @@ + #include + #include + +-#if defined NOT_IN_libc ++#if !IS_IN (libc) + /* Build a non-versioned object for rtld-*. */ + # include "setjmp-common.S" + +-#else /* !NOT_IN_libc */ ++#else /* !IS_IN (libc) */ + /* Build a versioned object for libc. */ + versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4) + versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4) +@@ -54,4 +54,4 @@ compat_symbol (libc, __novmx__sigsetjmp, + # include "setjmp-common.S" + strong_alias (__novmxsetjmp, __novmx__setjmp) + # endif +-#endif /* !NOT_IN_libc */ ++#endif /* IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S +@@ -35,7 +35,7 @@ + #define XCC xcc + #endif + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + + .register %g2,#scratch + .register %g3,#scratch +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S +@@ -137,7 +137,7 @@ + LOAD(ldd, base + 0x28, %x5); \ + LOAD(ldd, base + 0x30, %x6); + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + + .register %g2,#scratch + .register %g3,#scratch +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-niagara4.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memcpy-niagara4.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-niagara4.S +@@ -46,7 +46,7 @@ + #define STORE(type,src,addr) type src, [addr] + #define STORE_INIT(src,addr) stxa src, [addr] STORE_ASI + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + + .register %g2,#scratch + .register %g3,#scratch +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S +@@ -30,7 +30,7 @@ + #define XCC xcc + #endif + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + + .register %g2,#scratch + .register %g3,#scratch +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memcpy.S +@@ -20,7 +20,7 @@ + + #include + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(memcpy) + .type memcpy, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memset-niagara1.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memset-niagara1.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memset-niagara1.S +@@ -28,7 +28,7 @@ + #define XCC xcc + #endif + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + + .register %g2,#scratch + +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memset-niagara4.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memset-niagara4.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memset-niagara4.S +@@ -21,7 +21,7 @@ + + #define ASI_BLK_INIT_QUAD_LDD_P 0xe2 + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + + .register %g2, #scratch + .register %g3, #scratch +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc64/multiarch/memset.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/multiarch/memset.S +@@ -20,7 +20,7 @@ + + #include + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(memset) + .type memset, @gnu_indirect_function +Index: glibc-2.17-c758a686/ports/sysdeps/unix/alpha/sysdep.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/alpha/sysdep.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/alpha/sysdep.S +@@ -29,7 +29,7 @@ + .text + #endif + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + #else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/sysdeps/unix/make-syscalls.sh +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/make-syscalls.sh ++++ glibc-2.17-c758a686/sysdeps/unix/make-syscalls.sh +@@ -100,7 +100,7 @@ emit_weak_aliases() + *@@*) + base=`echo $name | sed 's/@@.*//'` + ver=`echo $name | sed 's/.*@@//;s/\./_/g'` +- echo " echo '#ifndef NOT_IN_libc'; \\" ++ echo " echo '#if IS_IN (libc)'; \\" + if test -z "$vcount" ; then + source=$strong + vcount=1 +@@ -117,7 +117,7 @@ emit_weak_aliases() + *@*) + base=`echo $name | sed 's/@.*//'` + ver=`echo $name | sed 's/.*@//;s/\./_/g'` +- echo " echo '#ifndef NOT_IN_libc'; \\" ++ echo " echo '#if IS_IN (libc)'; \\" + if test -z "$vcount" ; then + source=$strong + vcount=1 +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/Makefile ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/Makefile +@@ -160,7 +160,6 @@ sysdep-rtld-routines += dl-brk dl-sbrk d + dl-fxstatat64 + + libof-lddlibc4 = lddlibc4 +-CPPFLAGS-lddlibc4 += -DNOT_IN_libc + endif + + ifeq ($(subdir),rt) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -85,7 +85,7 @@ ENTRY (name); \ + # define CENABLE bl __pthread_enable_asynccancel + # define CDISABLE bl __pthread_disable_asynccancel + # define __local_multiple_threads __pthread_multiple_threads +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE bl __libc_enable_asynccancel + # define CDISABLE bl __libc_disable_asynccancel + # define __local_multiple_threads __libc_multiple_threads +@@ -96,7 +96,7 @@ ENTRY (name); \ + # error Unsupported library + # endif + +-# if IS_IN (libpthread) || !defined NOT_IN_libc ++# if IS_IN (libpthread) || IS_IN (libc) + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -93,7 +93,7 @@ + # define ret_ERRVAL ret + + # define SYSCALL_ERROR .Lsyscall_error +-# if NOT_IN_libc ++# if !IS_IN (libc) + # if RTLD_PRIVATE_ERRNO + # define SYSCALL_ERROR_HANDLER \ + .Lsyscall_error: \ +@@ -325,7 +325,7 @@ + + /* Pointer mangling is supported for AArch64. */ + #if (IS_IN (rtld)) || \ +- (!defined SHARED && (!defined NOT_IN_libc \ ++ (!defined SHARED && (IS_IN (libc) \ + || IS_IN (libpthread))) + # ifdef __ASSEMBLER__ + # define PTR_MANGLE(dst, src, guard, tmp) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + /* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END + besides "ret". */ +@@ -109,7 +109,7 @@ __LABEL($multi_error) \ + # define __local_enable_asynccancel __pthread_enable_asynccancel + # define __local_disable_asynccancel __pthread_disable_asynccancel + # define __local_multiple_threads __pthread_multiple_threads +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define __local_enable_asynccancel __libc_enable_asynccancel + # define __local_disable_asynccancel __libc_disable_asynccancel + # define __local_multiple_threads __libc_multiple_threads +@@ -128,7 +128,7 @@ __LABEL($multi_error) \ + # define CDISABLE jsr ra, __local_disable_asynccancel; ldgp ra, 0(gp) + # endif + +-# if IS_IN (libpthread) || !defined NOT_IN_libc ++# if IS_IN (libpthread) || IS_IN (libc) + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + /* NOTE: We do mark syscalls with unwind annotations, for the benefit of + cancellation; but they're really only accurate at the point of the +@@ -190,7 +190,7 @@ + # define CENABLE bl PLTJMP(__pthread_enable_asynccancel) + # define CDISABLE bl PLTJMP(__pthread_disable_asynccancel) + # define __local_multiple_threads __pthread_multiple_threads +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE bl PLTJMP(__libc_enable_asynccancel) + # define CDISABLE bl PLTJMP(__libc_disable_asynccancel) + # define __local_multiple_threads __libc_multiple_threads +@@ -201,7 +201,7 @@ + # error Unsupported library + # endif + +-# if IS_IN (libpthread) || !defined NOT_IN_libc ++# if IS_IN (libpthread) || IS_IN (libc) + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/arm/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/sysdep.h +@@ -104,7 +104,7 @@ + + #define ret_ERRVAL PSEUDO_RET_NOERRNO + +-#if NOT_IN_libc ++#if !IS_IN (libc) + # define SYSCALL_ERROR __local_syscall_error + # if RTLD_PRIVATE_ERRNO + # define SYSCALL_ERROR_HANDLER \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/getpid.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/getpid.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/getpid.c +@@ -21,7 +21,7 @@ + #include + + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + static inline __attribute__((always_inline)) pid_t really_getpid (pid_t oldval); + + static inline __attribute__((always_inline)) pid_t +@@ -48,7 +48,7 @@ really_getpid (pid_t oldval) + pid_t + __getpid (void) + { +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + INTERNAL_SYSCALL_DECL (err); + pid_t result = INTERNAL_SYSCALL (getpid, err, 0); + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h +@@ -56,7 +56,7 @@ + /* Initialize locks to zero. */ + #define LLL_MUTEX_LOCK_INITIALIZER (0) + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # ifndef NO_ERROR + # define NO_ERROR -0x1000 +@@ -216,7 +216,7 @@ L(pre_end): ASM_LINE_SEP \ + # define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \ + bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP + # endif +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # ifdef PIC + # define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \ + bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP +@@ -246,7 +246,7 @@ L(pre_end): ASM_LINE_SEP \ + + # if IS_IN (libpthread) + # define __local_multiple_threads __pthread_multiple_threads +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define __local_multiple_threads __libc_multiple_threads + # elif IS_IN (librt) + # define __local_multiple_threads __librt_multiple_threads +@@ -271,7 +271,7 @@ L(pre_end): ASM_LINE_SEP \ + # define NO_CANCELLATION 1 + + #endif +-/* !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) */ ++/* IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) */ + + #ifndef __ASSEMBLER__ + # define RTLD_SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S +@@ -115,7 +115,7 @@ __lll_lock_wait_private: + cfi_endproc + .size __lll_lock_wait_private,.-__lll_lock_wait_private + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl __lll_lock_wait + .type __lll_lock_wait,@function + .hidden __lll_lock_wait +@@ -361,7 +361,7 @@ __lll_unlock_wake_private: + cfi_endproc + .size __lll_unlock_wake_private,.-__lll_unlock_wake_private + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl __lll_unlock_wake + .type __lll_unlock_wake,@function + .hidden __lll_unlock_wake +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +@@ -71,7 +71,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +@@ -245,7 +245,7 @@ LLL_STUB_UNWIND_INFO_END + value is zero. In case the operation failed, the cmpxchg instruction + has loaded the current value of the memory work which is guaranteed + to be nonzero. */ +-#if defined NOT_IN_libc || defined UP ++#if !IS_IN (libc) || defined UP + # define __lll_trylock_asm LOCK_INSTR "cmpxchgl %2, %1" + #else + # define __lll_trylock_asm "cmpl $0, %%gs:%P5\n\t" \ +@@ -283,7 +283,7 @@ LLL_STUB_UNWIND_INFO_END + : "memory"); \ + ret; }) + +-#if defined NOT_IN_libc || defined UP ++#if !IS_IN (libc) || defined UP + # define __lll_lock_asm_start LOCK_INSTR "cmpxchgl %1, %2\n\t" + #else + # define __lll_lock_asm_start "cmpl $0, %%gs:%P6\n\t" \ +@@ -452,7 +452,7 @@ LLL_STUB_UNWIND_INFO_END + : "memory"); \ + result; }) + +-#if defined NOT_IN_libc || defined UP ++#if !IS_IN (libc) || defined UP + # define __lll_unlock_asm LOCK_INSTR "subl $1, %0\n\t" + #else + # define __lll_unlock_asm "cmpl $0, %%gs:%P3\n\t" \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -111,7 +111,7 @@ + # if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel; + # define CDISABLE call __pthread_disable_asynccancel +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE call __libc_enable_asynccancel; + # define CDISABLE call __libc_disable_asynccancel + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/i386/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +@@ -36,7 +36,7 @@ + #define SYS_ify(syscall_name) __NR_##syscall_name + + #if defined USE_DL_SYSINFO \ +- && (!defined NOT_IN_libc || IS_IN (libpthread)) ++ && (IS_IN (libc) || IS_IN (libpthread)) + # define I386_USE_SYSENTER 1 + #else + # undef I386_USE_SYSENTER +@@ -117,7 +117,7 @@ + + # elif defined _LIBC_REENTRANT + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h +@@ -22,11 +22,11 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSDEP_CANCEL_ERRNO __libc_errno + # else + # define SYSDEP_CANCEL_ERRNO errno +@@ -163,7 +163,7 @@ __GC_##name: \ + # if IS_IN (libpthread) + # define CENABLE br.call.sptk.many b0 = __pthread_enable_asynccancel + # define CDISABLE br.call.sptk.many b0 = __pthread_disable_asynccancel +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE br.call.sptk.many b0 = __libc_enable_asynccancel + # define CDISABLE br.call.sptk.many b0 = __libc_disable_asynccancel + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/sysdep.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.S +@@ -34,7 +34,7 @@ ENTRY(__syscall_error) + st4 [r2]=r8 + mov r8=-1 + #else +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +@@ -61,7 +61,7 @@ + #endif + + #if defined USE_DL_SYSINFO \ +- && (!defined NOT_IN_libc \ ++ && (IS_IN (libc) \ + || IS_IN (libpthread) || IS_IN (librt)) + # define IA64_USE_NEW_STUB + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h +@@ -35,7 +35,7 @@ + + /* We define __rtld_* copies for rtld. + We need them visible in libc to initialize. */ +-# if IS_IN (rtld) || !defined NOT_IN_libc ++# if IS_IN (rtld) || IS_IN (libc) + extern void *__rtld___vdso_read_tp; + extern void *__rtld___vdso_atomic_cmpxchg_32; + extern void *__rtld___vdso_atomic_barrier; +@@ -44,7 +44,7 @@ extern void *__rtld___vdso_atomic_barrie + extern void __vdso_read_tp_stub (void); + extern void __vdso_atomic_cmpxchg_32_stub (void); + extern void __vdso_atomic_barrier_stub (void); +-# endif /* IS_IN (rtld) || !NOT_IN_libc */ ++# endif /* IS_IN (rtld) || IS_IN (libc) */ + + /* RTLD should only use its own copies. */ + # if !IS_IN (rtld) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -103,7 +103,7 @@ + # if IS_IN (libpthread) + # define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel) +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE PSEUDO_JMP (__libc_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel) + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/sysdep.h +@@ -102,7 +102,7 @@ SYSCALL_ERROR_LABEL: \ + move.l %d0, %a0; \ + rts; + # elif defined _LIBC_REENTRANT +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h +@@ -27,7 +27,7 @@ + happen before any instructions. So we use cfi_same_value instead of + cfi_restore. */ + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + #ifdef __PIC__ + # undef PSEUDO +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # ifdef __PIC__ + # define PSEUDO_CPLOAD .cpload t9; +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/not-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/not-cancel.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/not-cancel.h +@@ -27,7 +27,7 @@ + INLINE_SYSCALL (open, 2, (const char *) (name), (flags)) + + /* Uncancelable openat. */ +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + extern int __openat_nocancel (int fd, const char *fname, int oflag, + mode_t mode) attribute_hidden; + extern int __openat64_nocancel (int fd, const char *fname, int oflag, +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -84,7 +84,7 @@ + # if IS_IN (libpthread) + # define CENABLE bl __pthread_enable_asynccancel@local + # define CDISABLE bl __pthread_disable_asynccancel@local +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE bl __libc_enable_asynccancel@local + # define CDISABLE bl __libc_disable_asynccancel@local + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # ifdef HAVE_ASM_GLOBAL_DOT_NAME + # define DASHDASHPFX(str) .__##str +@@ -107,7 +107,7 @@ + # define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel); nop + # define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel); nop + # endif +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # ifdef SHARED + # define CENABLE bl JUMPTARGET(__libc_enable_asynccancel) + # define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h +@@ -51,7 +51,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -78,7 +78,7 @@ L(pseudo_end): + # if IS_IN (libpthread) + # define CENABLE __pthread_enable_asynccancel + # define CDISABLE __pthread_disable_asynccancel +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE __libc_enable_asynccancel + # define CDISABLE __libc_disable_asynccancel + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S +@@ -31,7 +31,7 @@ + .text + ENTRY(__syscall_error) + #ifndef PIC +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +@@ -54,7 +54,7 @@ ENTRY(__syscall_error) + br %r14 + 1: .long rtld_errno - 0b + # else +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +@@ -106,7 +106,7 @@ + br %r14; \ + 2: .long rtld_errno-1b + # elif defined _LIBC_REENTRANT +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -73,7 +73,7 @@ L(pseudo_end): + # define CENABLE __pthread_enable_asynccancel + # define CDISABLE __pthread_disable_asynccancel + # define __local_multiple_threads __pthread_multiple_threads +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE __libc_enable_asynccancel + # define CDISABLE __libc_disable_asynccancel + # define __local_multiple_threads __libc_multiple_threads +@@ -111,7 +111,7 @@ L(pseudo_end): + #define LR7_6 lg %r7,56+160(%r15); \ + cfi_restore (%r7); + +-# if IS_IN (libpthread) || !defined NOT_IN_libc ++# if IS_IN (libpthread) || IS_IN (libc) + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S +@@ -32,7 +32,7 @@ + .text + ENTRY(__syscall_error) + #ifndef PIC +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +@@ -55,7 +55,7 @@ ENTRY(__syscall_error) + lghi %r2,-1 + br %r14 + # else +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +@@ -114,7 +114,7 @@ + lghi %r2,-1; \ + br %r14 + # elif defined _LIBC_REENTRANT +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +@@ -172,7 +172,7 @@ __lll_lock_wait_private: + cfi_endproc + .size __lll_lock_wait_private,.-__lll_lock_wait_private + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl __lll_lock_wait + .type __lll_lock_wait,@function + .hidden __lll_lock_wait +@@ -454,7 +454,7 @@ __lll_unlock_wake_private: + cfi_endproc + .size __lll_unlock_wake_private,.-__lll_unlock_wake_private + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl __lll_unlock_wake + .type __lll_unlock_wake,@function + .hidden __lll_unlock_wake +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # define _IMM12 #-12 + # define _IMM16 #-16 +@@ -108,7 +108,7 @@ + # if IS_IN (libpthread) + # define __local_enable_asynccancel __pthread_enable_asynccancel + # define __local_disable_asynccancel __pthread_disable_asynccancel +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define __local_enable_asynccancel __libc_enable_asynccancel + # define __local_disable_asynccancel __libc_disable_asynccancel + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sh/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sh/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sh/sysdep.h +@@ -116,7 +116,7 @@ + + # elif defined _LIBC_REENTRANT + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h +@@ -56,7 +56,7 @@ extern void __cpu_relax (void); + #define BUSY_WAIT_NOP __cpu_relax () + #endif + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -71,7 +71,7 @@ __##syscall_name##_nocancel: \ + # if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel + # define CDISABLE call __pthread_disable_asynccancel +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE call __libc_enable_asynccancel + # define CDISABLE call __libc_disable_asynccancel + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +@@ -80,7 +80,7 @@ ENTRY(name); \ + mov -1, %o0; + # elif defined _LIBC_REENTRANT + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S +@@ -89,7 +89,7 @@ ENTRY (__brk) + #endif + st %o0, [%g1] + #else +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + call HIDDEN_JUMPTARGET(__errno_location) + #else + call __errno_location +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -69,7 +69,7 @@ __##syscall_name##_nocancel: \ + # if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel + # define CDISABLE call __pthread_disable_asynccancel +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE call __libc_enable_asynccancel + # define CDISABLE call __libc_disable_asynccancel + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +@@ -90,7 +90,7 @@ ENTRY(name); \ + mov -1, %o0; + # elif defined _LIBC_REENTRANT + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + /* Allow hacking in some extra code if desired. */ + #ifndef PSEUDO_EXTRA +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/sysdep.h +@@ -45,7 +45,7 @@ + #ifndef PIC + /* For static code, on error jump to __syscall_error directly. */ + # define SYSCALL_ERROR_NAME __syscall_error +-#elif !defined NOT_IN_libc || IS_IN (libpthread) ++#elif IS_IN (libc) || IS_IN (libpthread) + /* Use the internal name for libc/libpthread shared objects. */ + # define SYSCALL_ERROR_NAME __GI___syscall_error + #else +@@ -205,7 +205,7 @@ + #endif /* not __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && IS_IN (rtld) ++#if !IS_IN (libc) && IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S +@@ -1,7 +1,7 @@ + /* + extern pid_t __waitpid_nocancel (pid_t, int *, int) attribute_hidden; + */ +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + /* Call __NR_wait4, providing fourth argument (struct rusage *) as NULL. */ + #define PSEUDO_EXTRA move r3, zero; +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S +@@ -108,7 +108,7 @@ __lll_lock_wait_private: + cfi_endproc + .size __lll_lock_wait_private,.-__lll_lock_wait_private + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl __lll_lock_wait + .type __lll_lock_wait,@function + .hidden __lll_lock_wait +@@ -348,7 +348,7 @@ __lll_unlock_wake_private: + cfi_endproc + .size __lll_unlock_wake_private,.-__lll_unlock_wake_private + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl __lll_unlock_wake + .type __lll_unlock_wake,@function + .hidden __lll_unlock_wake +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +@@ -72,7 +72,7 @@ + + #ifndef __ASSEMBLER__ + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +@@ -243,7 +243,7 @@ LLL_STUB_UNWIND_INFO_END + value is zero. In case the operation failed, the cmpxchg instruction + has loaded the current value of the memory work which is guaranteed + to be nonzero. */ +-#if defined NOT_IN_libc || defined UP ++#if !IS_IN (libc) || defined UP + # define __lll_trylock_asm LOCK_INSTR "cmpxchgl %2, %1" + #else + # define __lll_trylock_asm "cmpl $0, __libc_multiple_threads(%%rip)\n\t" \ +@@ -280,7 +280,7 @@ LLL_STUB_UNWIND_INFO_END + : "memory"); \ + ret; }) + +-#if defined NOT_IN_libc || defined UP ++#if !IS_IN (libc) || defined UP + # define __lll_lock_asm_start LOCK_INSTR "cmpxchgl %4, %2\n\t" \ + "jnz 1f\n\t" + #else +@@ -450,7 +450,7 @@ LLL_STUB_UNWIND_INFO_END + : "memory", "cx", "cc", "r10", "r11"); \ + result; }) + +-#if defined NOT_IN_libc || defined UP ++#if !IS_IN (libc) || defined UP + # define __lll_unlock_asm_start LOCK_INSTR "decl %0\n\t" \ + "jne 1f\n\t" + #else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + /* The code to disable cancellation depends on the fact that the called + functions are special. They don't modify registers other than %rax +@@ -63,7 +63,7 @@ + # define CENABLE call __pthread_enable_asynccancel; + # define CDISABLE call __pthread_disable_asynccancel; + # define __local_multiple_threads __pthread_multiple_threads +-# elif !defined NOT_IN_libc ++# elif IS_IN (libc) + # define CENABLE call __libc_enable_asynccancel; + # define CDISABLE call __libc_disable_asynccancel; + # define __local_multiple_threads __libc_multiple_threads +@@ -74,7 +74,7 @@ + # error Unsupported library + # endif + +-# if IS_IN (libpthread) || !defined NOT_IN_libc ++# if IS_IN (libpthread) || IS_IN (libc) + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/x86_64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/sysdep.h +@@ -117,7 +117,7 @@ + neg %eax; \ + movl %eax, (%rcx) + # else +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define SYSCALL_ERROR_ERRNO __libc_errno + # else + # define SYSCALL_ERROR_ERRNO errno +Index: glibc-2.17-c758a686/sysdeps/wordsize-32/symbol-hacks.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/wordsize-32/symbol-hacks.h ++++ glibc-2.17-c758a686/sysdeps/wordsize-32/symbol-hacks.h +@@ -23,7 +23,7 @@ + therefore we get PLTs. Unnecessarily so. Changing gcc is a big + task which might not be worth it so we play tricks with the + assembler. */ +-#if !defined __ASSEMBLER__ && !defined in_divdi3_c && !defined NOT_IN_libc && defined SHARED ++#if !defined __ASSEMBLER__ && !defined in_divdi3_c && IS_IN (libc) && defined SHARED + asm ("__divdi3 = __divdi3_internal"); + asm ("__udivdi3 = __udivdi3_internal"); + asm ("__moddi3 = __moddi3_internal"); +Index: glibc-2.17-c758a686/sysdeps/x86_64/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/memcpy.S +@@ -30,7 +30,7 @@ + # define RETVAL (0) + #else + # define RETVAL (-8) +-# if defined SHARED && !defined USE_MULTIARCH && !defined NOT_IN_libc ++# if defined SHARED && !defined USE_MULTIARCH && IS_IN (libc) + # define memcpy __memcpy + # undef libc_hidden_builtin_def + # define libc_hidden_builtin_def(name) \ +@@ -44,7 +44,7 @@ + + .text + +-#if defined PIC && !defined NOT_IN_libc ++#if defined PIC && IS_IN (libc) + ENTRY_CHK (__memcpy_chk) + + cmpq %rdx, %rcx +@@ -253,14 +253,14 @@ L(32after): + /* Handle blocks smaller than 1/2 L1. */ + + L(fasttry): /* first 1/2 L1 */ +-#ifndef NOT_IN_libc /* only up to this algorithm outside of libc.so */ ++#if IS_IN (libc) /* only up to this algorithm outside of libc.so */ + mov __x86_64_data_cache_size_half(%rip), %R11_LP + cmpq %rdx, %r11 /* calculate the smaller of */ + cmovaq %rdx, %r11 /* remaining bytes and 1/2 L1 */ + #endif + + L(fast): /* good ol' MOVS */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + movq %r11, %rcx + andq $-8, %r11 + #else +@@ -275,7 +275,7 @@ L(fast): /* good ol' MOVS */ + .p2align 4,, 4 + + L(fastskip): +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + subq %r11, %rdx /* check for more */ + testq $-8, %rdx + jnz L(fastafter) +@@ -294,7 +294,7 @@ L(fastskip): + #endif + retq /* exit */ + +-#ifndef NOT_IN_libc /* none of the algorithms below for RTLD */ ++#if IS_IN (libc) /* none of the algorithms below for RTLD */ + + .p2align 4 + +@@ -570,13 +570,13 @@ L(NTskip): + #endif + retq /* exit */ + +-#endif /* !NOT_IN_libc */ ++#endif /* IS_IN (libc) */ + + END(memcpy) + + #ifndef USE_AS_MEMPCPY + libc_hidden_builtin_def (memcpy) +-# if defined SHARED && !defined USE_MULTIARCH && !defined NOT_IN_libc ++# if defined SHARED && !defined USE_MULTIARCH && IS_IN (libc) + # undef memcpy + # include + versioned_symbol (libc, __memcpy, memcpy, GLIBC_2_14); +Index: glibc-2.17-c758a686/sysdeps/x86_64/memmove.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/memmove.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/memmove.c +@@ -17,7 +17,7 @@ + + #include "string/memmove.c" + +-#if !defined memmove && !defined NOT_IN_libc ++#if !defined memmove && IS_IN (libc) + #include + + #if SHLIB_COMPAT (libc, GLIBC_2_2_5, GLIBC_2_14) +Index: glibc-2.17-c758a686/sysdeps/x86_64/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/memset.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/memset.S +@@ -23,7 +23,7 @@ + #define __STOS_UPPER_BOUNDARY $65536 + + .text +-#if !defined NOT_IN_libc && !defined USE_MULTIARCH ++#if IS_IN (libc) && !defined USE_MULTIARCH + ENTRY(__bzero) + mov %rsi,%rdx /* Adjust parameter. */ + xorl %esi,%esi /* Fill with 0s. */ +@@ -32,7 +32,7 @@ END(__bzero) + weak_alias (__bzero, bzero) + #endif + +-#if defined PIC && !defined NOT_IN_libc ++#if defined PIC && IS_IN (libc) + ENTRY_CHK (__memset_chk) + cmpq %rdx, %rcx + jb HIDDEN_JUMPTARGET (__chk_fail) +@@ -1354,7 +1354,7 @@ L(8byte_nt_move_skip): + END (memset) + libc_hidden_builtin_def (memset) + +-#if defined PIC && !defined NOT_IN_libc && !defined USE_MULTIARCH ++#if defined PIC && IS_IN (libc) && !defined USE_MULTIARCH + strong_alias (__memset_chk, __memset_zero_constant_len_parameter) + .section .gnu.warning.__memset_zero_constant_len_parameter + .string "memset used with constant zero length parameter; this could be due to transposed parameters" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/init-arch.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/init-arch.h ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/init-arch.h +@@ -141,7 +141,7 @@ extern void __init_cpu_features (void) a + extern const struct cpu_features *__get_cpu_features (void) + __attribute__ ((const)); + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define __get_cpu_features() (&__cpu_features) + # endif + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp-sse4.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcmp-sse4.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp-sse4.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcmp-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(memcmp) + .type memcmp, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S +@@ -19,7 +19,7 @@ + + #include + +-#if !defined NOT_IN_libc \ ++#if IS_IN (libc) \ + && (defined SHARED \ + || defined USE_AS_MEMMOVE \ + || !defined USE_MULTIARCH) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy-ssse3.S +@@ -19,7 +19,7 @@ + + #include + +-#if !defined NOT_IN_libc \ ++#if IS_IN (libc) \ + && (defined SHARED \ + || defined USE_AS_MEMMOVE \ + || !defined USE_MULTIARCH) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy.S +@@ -25,7 +25,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. In static binaries we need memcpy before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + .text + ENTRY(__new_memcpy) + .type __new_memcpy, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. There are no multiarch memcpy functions for static binaries. + */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(__memcpy_chk) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memmove.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove.c +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define MEMMOVE __memmove_sse2 + # ifdef SHARED + # undef libc_hidden_builtin_def +@@ -39,7 +39,7 @@ extern __typeof (__redirect_memmove) __m + + #include "string/memmove.c" + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + # include "init-arch.h" + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/mempcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. In static binaries we need mempcpy before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + ENTRY(__mempcpy) + .type __mempcpy, @gnu_indirect_function + cmpl $0, KIND_OFFSET+__cpu_features(%rip) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/mempcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy_chk.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in lib and for + DSO. There are no multiarch mempcpy functions for static binaries. + */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + .text + ENTRY(__mempcpy_chk) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memset.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset.S +@@ -21,7 +21,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + ENTRY(memset) + .type memset, @gnu_indirect_function + cmpl $0, __cpu_features+KIND_OFFSET(%rip) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memset_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset_chk.S +@@ -21,7 +21,7 @@ + #include + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + ENTRY(__memset_chk) + .type __memset_chk, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcat-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcat.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat.S +@@ -43,7 +43,7 @@ + + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(STRCAT) + .type STRCAT, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # include + # include "asm-syntax.h" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strchr.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strchr.S +@@ -21,7 +21,7 @@ + + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(strchr) + .type strchr, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcmp-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcmp-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcmp-ssse3.S +@@ -1,4 +1,4 @@ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define USE_SSSE3 1 + # define STRCMP __strcmp_ssse3 + # include "../strcmp.S" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcmp.S +@@ -79,7 +79,7 @@ + /* Define multiple versions only for the definition in libc. Don't + define multiple versions for strncmp in static library since we + need strncmp before the initialization happened. */ +-#if (defined SHARED || !defined USE_AS_STRNCMP) && !defined NOT_IN_libc ++#if (defined SHARED || !defined USE_AS_STRNCMP) && IS_IN (libc) + .text + ENTRY(STRCMP) + .type STRCMP, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # ifndef USE_AS_STRCAT + # include +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcpy-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + # ifndef USE_AS_STRCAT + # include +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy.S +@@ -57,7 +57,7 @@ + + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(STRCPY) + .type STRCPY, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcspn.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcspn.S +@@ -41,7 +41,7 @@ + /* Define multiple versions only for the definition in libc. Don't + define multiple versions for strpbrk in static library since we + need strpbrk before the initialization happened. */ +-#if (defined SHARED || !defined USE_AS_STRPBRK) && !defined NOT_IN_libc ++#if (defined SHARED || !defined USE_AS_STRPBRK) && IS_IN (libc) + .text + ENTRY(STRCSPN) + .type STRCSPN, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strspn.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strspn.S +@@ -26,7 +26,7 @@ + #include + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(strspn) + .type strspn, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/wcscpy-c.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy-c.c +@@ -1,4 +1,4 @@ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define wcscpy __wcscpy_sse2 + #endif + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy-ssse3.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/wcscpy-ssse3.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy-ssse3.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + .section .text.ssse3,"ax",@progbits +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/wcscpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + .text + ENTRY(wcscpy) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wmemcmp-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/wmemcmp-c.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wmemcmp-c.c +@@ -1,4 +1,4 @@ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + # define WMEMCMP __wmemcmp_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wmemcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/wmemcmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wmemcmp.S +@@ -22,7 +22,7 @@ + #include + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(wmemcmp) + .type wmemcmp, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/strcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/strcmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/strcmp.S +@@ -129,7 +129,7 @@ libc_hidden_def (__strncasecmp) + #endif + + ENTRY (BP_SYM (STRCMP)) +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + /* Simple version since we can't use SSE registers in ld.so. */ + L(oop): movb (%rdi), %al + cmpb (%rsi), %al +@@ -147,7 +147,7 @@ L(neq): movl $1, %eax + cmovbl %ecx, %eax + ret + END (BP_SYM (STRCMP)) +-#else /* NOT_IN_libc */ ++#else /* !IS_IN (libc) */ + # ifdef USE_AS_STRCASECMP_L + /* We have to fall back on the C implementation for locales + with encodings not matching ASCII for single bytes. */ +@@ -2303,5 +2303,5 @@ LABEL(unaligned_table): + .int LABEL(ashr_14) - LABEL(unaligned_table) + .int LABEL(ashr_15) - LABEL(unaligned_table) + .int LABEL(ashr_0) - LABEL(unaligned_table) +-#endif /* NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ + libc_hidden_builtin_def (STRCMP) +Index: glibc-2.17-c758a686/ChangeLog +=================================================================== +--- glibc-2.17-c758a686.orig/ChangeLog ++++ glibc-2.17-c758a686/ChangeLog +@@ -4849,7 +4849,7 @@ + + * libio/genops.c (_IO_unbuffer_write): Conditionalize locking code on + [_IO_MTSAFE_IO]. +- * libio/libioP.h [!_IO_MTSAFE_IO && !NOT_IN_libc] ++ * libio/libioP.h [!_IO_MTSAFE_IO && !IS_IN (libc)] + (_IO_acquire_lock, _IO_acquire_lock_clear_flags2, _IO_release_lock): + New macros. + +@@ -5014,7 +5014,7 @@ + including . + + * sysdeps/x86_64/multiarch/memmove.c: Don't include . +- [!NOT_IN_libc]: Move #define and #undef of memmove to just before ++ [!IS_IN (libc)]: Move #define and #undef of memmove to just before + and after including . Move declarations of + __memmove_sse2, __memmove_ssse3, and __memmove_ssse3_back + to before #include "string/memmove.c". +@@ -7322,7 +7322,7 @@ + 2012-05-30 Richard Henderson + + * sysdeps/unix/make-syscalls.sh: Protect symbol_version output +- with #ifndef NOT_IN_libc. ++ with #if IS_IN (libc). + + * scripts/abilist.awk: Accept 8 fields. Handle Alpha functions + marked to avoid plt entry. +Index: glibc-2.17-c758a686/ChangeLog.13 +=================================================================== +--- glibc-2.17-c758a686.orig/ChangeLog.13 ++++ glibc-2.17-c758a686/ChangeLog.13 +@@ -2465,7 +2465,7 @@ + ($(objpfx)errlist.d): Depend on $(..)sysdeps/gnu/errlist-compat.c. + * sysdeps/gnu/errlist.awk: Make output define _sys_errlist_internal + and _sys_nerr_internal instead of anything else. Make it include +- "errlist-compat.c" if [!NOT_IN_libc && !ERRLIST_NO_COMPAT]. ++ "errlist-compat.c" if [!IS_IN (libc) && !ERRLIST_NO_COMPAT]. + Make it emit some asm magic if [EMIT_ERR_MAX]. + * sysdeps/gnu/errlist.c: Regenerated. + * sysdeps/gnu/errlist-compat.awk: New file. +Index: glibc-2.17-c758a686/ChangeLog.14 +=================================================================== +--- glibc-2.17-c758a686.orig/ChangeLog.14 ++++ glibc-2.17-c758a686/ChangeLog.14 +@@ -2058,13 +2058,13 @@ + * sysdeps/powerpc/powerpc64/__longjmp-common.S: New file. + * sysdeps/powerpc/powerpc64/__longjmp.S [NOT_IN_libc](__longjmp): + Non-versioned __longjmp for rtld-__longjmp. +- [!NOT_IN_libc](__vmx__longjmp): Add VMX reg support and define as ++ [!IS_IN (libc)](__vmx__longjmp): Add VMX reg support and define as + default version of __longjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)] + (__novmx__longjmp): Original version of __longjmp. + * sysdeps/powerpc/powerpc64/bsd-_setjmp.S [NOT_IN_libc](_setjmp): + Non-versioned _setjmp for rtld-_setjmp. +- [!NOT_IN_libc](__vmx_setjmp): Branch to __vmx__sigsetjmp and define ++ [!IS_IN (libc)](__vmx_setjmp): Branch to __vmx__sigsetjmp and define + as default version of _setjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)] + (__novmx_setjmp): Original version of _setjmp. +@@ -2075,7 +2075,7 @@ + * sysdeps/powerpc/powerpc64/setjmp-common.S: New file. + * sysdeps/powerpc/powerpc64/setjmp.S [NOT_IN_libc](__setjmp): + Non-versioned __sigsetjmp for rtld-setjmp. +- [!NOT_IN_libc](__vmx__sigsetjmp): Add VMX reg support and define ++ [!IS_IN (libc)](__vmx__sigsetjmp): Add VMX reg support and define + as default version of __sigsetjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)] + (__novmx__sigsetjmp): Original version of __sigsetjmp. +@@ -2083,13 +2083,13 @@ + * sysdeps/powerpc/powerpc32/__longjmp-common.S: New File + * sysdeps/powerpc/powerpc32/__longjmp.S [NOT_IN_libc](__longjmp): + Non-versioned __longjmp for rtld-__longjmp. +- [!NOT_IN_libc](__vmx__longjmp): Add VMX reg support and define as ++ [!IS_IN (libc)](__vmx__longjmp): Add VMX reg support and define as + default version of __longjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)] + (__novmx__longjmp): Original version of __longjmp. + * sysdeps/powerpc/powerpc32/bsd-_setjmp.S [NOT_IN_libc](_setjmp): + Non-versioned _setjmp for rtld-_setjmp. +- [!NOT_IN_libc](__vmx_setjmp): Branch to __vmx__sigsetjmp and define ++ [!IS_IN (libc)](__vmx_setjmp): Branch to __vmx__sigsetjmp and define + as default version of _setjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)] + (__novmx_setjmp): Original version of _setjmp. +@@ -2100,21 +2100,21 @@ + * sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S: New file. + * sysdeps/powerpc/powerpc32/fpu/__longjmp.S [NOT_IN_libc](__longjmp): + Non-versioned __longjmp for rtld-__longjmp. +- [!NOT_IN_libc](__vmx__longjmp): Add VMX reg support and define as ++ [!IS_IN (libc)](__vmx__longjmp): Add VMX reg support and define as + default version of __longjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)] + (__novmx__longjmp): Original version of __longjmp. + * sysdeps/powerpc/powerpc32/fpu/setjmp-common.S: New file. + * sysdeps/powerpc/powerpc32/fpu/setjmp.S [NOT_IN_libc](__setjmp): + Non-versioned __sigsetjmp for rtld-setjmp. +- [!NOT_IN_libc](__vmx__sigsetjmp): Add VMX reg support and define ++ [!IS_IN (libc)](__vmx__sigsetjmp): Add VMX reg support and define + as default version of __sigsetjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)] + (__novmx__sigsetjmp): Original version of __sigsetjmp. + * sysdeps/powerpc/powerpc32/setjmp-common.S: New file. + * sysdeps/powerpc/powerpc32/setjmp.S [NOT_IN_libc](__setjmp): + Non-versioned __sigsetjmp for rtld-setjmp. +- [!NOT_IN_libc](__vmx__sigsetjmp): Add VMX reg support and define ++ [!IS_IN (libc)](__vmx__sigsetjmp): Add VMX reg support and define + as default version of __sigsetjmp. + [SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)] + (__novmx__sigsetjmp): Original version of __sigsetjmp. +Index: glibc-2.17-c758a686/csu/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/csu/Makefile ++++ glibc-2.17-c758a686/csu/Makefile +@@ -146,13 +146,13 @@ $(objpfx)version-info.h: $(common-objpfx + linux*) version=`(printf '%s\n%s\n' \ + '#include ' \ + UTS_RELEASE \ +- | $(CC) $(CPPFLAGS) -O -E -P - -DNOT_IN_libc=1 | \ ++ | $(CC) $(CPPFLAGS) -O -E -P - | \ + sed -e 's/"\([^"]*\)".*/\1/p' -e d) 2>/dev/null`;\ + if [ -z "$$version" ]; then \ + version=`(printf '%s\n%s\n' \ + '#include ' \ + LINUX_VERSION_CODE \ +- | $(CC) $(CPPFLAGS) -O -E -P - -DNOT_IN_libc=1 \ ++ | $(CC) $(CPPFLAGS) -O -E -P - \ + | sed -n -e '/^[123456789].*/p' \ + | awk '{v=$$1; \ + printf("%d.%d.%d\n", \ +Index: glibc-2.17-c758a686/nptl/ChangeLog +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/ChangeLog ++++ glibc-2.17-c758a686/nptl/ChangeLog +@@ -11683,7 +11683,7 @@ + 2002-12-16 Jakub Jelinek + + * libc-cancellation.c: Guard both function with +- #if !defined NOT_IN_libc. ++ #if IS_IN (libc). + * Makefile (libpthread-routines): Use ptw-, not pt- prefix for the + automatically provided pthread wrappers. + * pthreadP.h (LIBC_CANCEL_ASYNC, LIBC_CANCEL_RESET): Define to +Index: glibc-2.17-c758a686/nptl/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/Makefile ++++ glibc-2.17-c758a686/nptl/Makefile +@@ -134,8 +134,6 @@ libpthread-routines = nptl-init vars eve + libpthread-shared-only-routines = version pt-allocrtsig unwind-forcedunwind + libpthread-static-only-routines = pthread_atfork + +-CFLAGS-pthread_atfork.c = -DNOT_IN_libc +- + # Since cancellation handling is in large parts handled using exceptions + # we have to compile some files with exception handling enabled, some + # even with asynchronous unwind tables. +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h +@@ -19,7 +19,7 @@ + + #include + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + extern int __open_nocancel (const char *, int, ...) attribute_hidden; + extern int __close_nocancel (int) attribute_hidden; + extern int __read_nocancel (int, void *, size_t) attribute_hidden; +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +@@ -52,7 +52,7 @@ + #define LLL_PRIVATE 0 + #define LLL_SHARED FUTEX_PRIVATE_FLAG + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h +@@ -49,7 +49,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) ++#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -103,7 +103,7 @@ + # define CDISABLE call +__libc_disable_asynccancel,[],0; + # endif + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + # define __local_multiple_threads __libc_multiple_threads + #elif IS_IN (libpthread) + # define __local_multiple_threads __pthread_multiple_threads +@@ -118,7 +118,7 @@ + p_header.data.multiple_threads) == 0, 1) + # else + extern int __local_multiple_threads +-# if !defined NOT_IN_libc || IS_IN (libpthread) ++# if IS_IN (libc) || IS_IN (libpthread) + attribute_hidden; + # else + ; +@@ -130,7 +130,7 @@ extern int __local_multiple_threads + # define SINGLE_THREAD_P \ + mov (+__local_multiple_threads),d0; \ + cmp 0,d0 +-# elif !defined NOT_IN_libc || IS_IN (libpthread) ++# elif IS_IN (libc) || IS_IN (libpthread) + # define SINGLE_THREAD_P \ + movm [a2],(sp); \ + 1: mov pc,a2; \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +@@ -48,7 +48,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h +@@ -48,7 +48,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || IS_IN (rtld) ++#if IS_IN (libc) || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/memrchr-ppc32.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power4/multiarch/memrchr-ppc32.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/memrchr-ppc32.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define MEMRCHR __memrchr_ppc + # include + extern void *__memrchr_ppc (const void *, int, size_t); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c +@@ -17,7 +17,7 @@ + + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # ifdef SHARED + # undef libc_hidden_def + # define libc_hidden_def(name) \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c +@@ -17,7 +17,7 @@ + + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define WCSCPY __wcscpy_ppc + #endif + +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c +@@ -17,7 +17,7 @@ + + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # define WCSRCHR __wcsrchr_ppc + #endif + +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memccpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memccpy-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memccpy-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define MEMCCPY __memccpy_c + # undef weak_alias + # define weak_alias(a, b) +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memccpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memccpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memccpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -153,4 +153,4 @@ ENTRY(__memccpy_vx) + lghi %r2,0 /* Return null. */ + br %r14 + END(__memccpy_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memccpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memccpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memccpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__memccpy, memccpy) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memchr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memchr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memchr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -154,6 +154,6 @@ END(__memchr_vx) + # define memchr __memchr_c + # undef libc_hidden_builtin_def + # define libc_hidden_builtin_def(name) strong_alias(__memchr_c, __GI_memchr) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ + + #include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memchr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memrchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memrchr-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memrchr-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define MEMRCHR __memrchr_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memrchr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memrchr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memrchr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -157,4 +157,4 @@ ENTRY(__memrchr_vx) + clgijhe %r4,64,.Lloop64 /* If n >= 64 -> loop64. */ + j .Llt64 + END(__memrchr_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/memrchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/memrchr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/memrchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__memrchr, memrchr) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/rawmemchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/rawmemchr-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/rawmemchr-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + + # define RAWMEMCHR __rawmemchr_c +@@ -31,4 +31,4 @@ + extern __typeof (rawmemchr) __rawmemchr_c attribute_hidden; + + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/rawmemchr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/rawmemchr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/rawmemchr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -89,4 +89,4 @@ ENTRY(__rawmemchr_vx) + la %r2,0(%r5,%r2) /* Return pointer to character. */ + br %r14 + END(__rawmemchr_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/rawmemchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/rawmemchr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/rawmemchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__rawmemchr, rawmemchr) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT &&!defined NOT_IN_libc ) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT &&IS_IN (libc) ) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/stpcpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/stpcpy-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/stpcpy-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STPCPY __stpcpy_c + # undef libc_hidden_def + # undef weak_alias +@@ -31,4 +31,4 @@ + + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/stpcpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/stpcpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/stpcpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -101,4 +101,4 @@ ENTRY(__stpcpy_vx) + la %r2,0(%r5,%r2) /* Return pointer to zero. */ + br %r14 + END(__stpcpy_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/stpcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/stpcpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/stpcpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -26,4 +26,4 @@ libc_hidden_builtin_def (stpcpy) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/stpncpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/stpncpy-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/stpncpy-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STPNCPY __stpncpy_c + # ifdef SHARED + # undef libc_hidden_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/stpncpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/stpncpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/stpncpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -197,4 +197,4 @@ ENTRY(__stpncpy_vx) + vl %v16,0(%r5,%r3) /* Load s. */ + j .Llt64 + END(__stpncpy_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/stpncpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/stpncpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/stpncpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__stpncpy, stpncpy) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcat-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcat-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcat-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRCAT __strcat_c + # ifdef SHARED + # undef libc_hidden_builtin_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcat-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcat-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcat-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -158,4 +158,4 @@ ENTRY(__strcat_vx) + lgr %r2,%r0 /* Load saved dest-ptr. */ + br %r14 + END(__strcat_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcat.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcat.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcat.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__strcat, strcat) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strchr-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strchr-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRCHR __strchr_c + # undef weak_alias + # ifdef SHARED +@@ -26,4 +26,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strchr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strchr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strchr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -97,4 +97,4 @@ ENTRY(__strchr_vx) + lghi %r2,0 /* Return null if character not found. */ + br %r14 + END(__strchr_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strchr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (strchr, index) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strchrnul-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strchrnul-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strchrnul-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRCHRNUL __strchrnul_c + # define __strchrnul STRCHRNUL + # undef weak_alias +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strchrnul-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strchrnul-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strchrnul-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -90,4 +90,4 @@ ENTRY(__strchrnul_vx) + .Lend: + br %r14 + END(__strchrnul_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strchrnul.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strchrnul.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strchrnul.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__strchrnul, strchrnul) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcmp-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcmp-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcmp-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -111,6 +111,6 @@ END(__strcmp_vx) + # define strcmp __strcmp_c + # undef libc_hidden_builtin_def + # define libc_hidden_builtin_def(name) strong_alias(__strcmp_c, __GI_strcmp) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ + + #include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcmp.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -103,7 +103,7 @@ END(__strcpy_vx) + # define strcpy __strcpy_c + # undef libc_hidden_builtin_def + # define libc_hidden_builtin_def(name) strong_alias(__strcpy_c, __GI_strcpy) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ + + /* Include mvst-strcpy-implementation in s390-32/s390-64 subdirectory. */ + #include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcspn-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcspn-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcspn-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRCSPN __strcspn_c + # ifdef SHARED + # undef libc_hidden_builtin_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcspn-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcspn-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcspn-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -278,4 +278,4 @@ ENTRY(__strcspn_vx) + vlgvg %r9,%v31,1 + br %r14 + END(__strcspn_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strcspn.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strcspn.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strcspn.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__strcspn, strcspn) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strlen-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strlen-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strlen-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRLEN __strlen_c + # ifdef SHARED + # undef libc_hidden_builtin_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strlen-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strlen-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strlen-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -81,4 +81,4 @@ ENTRY(__strlen_vx) + algr %r2,%r5 + br %r14 + END(__strlen_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strlen.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strlen.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strlen.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__strlen, strlen) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncat-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncat-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncat-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRNCAT __strncat_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncat-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncat-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncat-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -236,4 +236,4 @@ ENTRY(__strncat_vx) + vl %v16,0(%r5,%r3) /* Load s. */ + j .Lcpy_lt64 + END(__strncat_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncat.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncat.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncat.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__strncat, strncat) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncmp-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncmp-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncmp-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRNCMP __strncmp_c + # ifdef SHARED + # undef libc_hidden_builtin_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncmp-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncmp-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncmp-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -134,4 +134,4 @@ ENTRY(__strncmp_vx) + lghi %r2,0 + br %r14 + END(__strncmp_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncmp.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -27,4 +27,4 @@ s390_vx_libc_ifunc2 (__strncmp, strncmp) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -201,7 +201,7 @@ END(__strncpy_vx) + # define strncpy __strncpy_c + # undef libc_hidden_builtin_def + # define libc_hidden_builtin_def(name) strong_alias(__strncpy_c, __GI_strncpy) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ + + /* Include strncpy-implementation in s390-32/s390-64 subdirectory. */ + #include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strncpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strncpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strncpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strnlen-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strnlen-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strnlen-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRNLEN __strnlen_c + # ifdef SHARED + # undef libc_hidden_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strnlen-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strnlen-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strnlen-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -131,4 +131,4 @@ ENTRY(__strnlen_vx) + + j .Llt64 + END(__strnlen_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strnlen.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strnlen.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strnlen.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -26,4 +26,4 @@ libc_hidden_def (strnlen) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strpbrk-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strpbrk-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strpbrk-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRPBRK __strpbrk_c + # ifdef SHARED + # undef libc_hidden_builtin_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strpbrk-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strpbrk-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strpbrk-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -299,4 +299,4 @@ ENTRY(__strpbrk_vx) + lgr %r2,%r1 + br %r14 + END(__strpbrk_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strpbrk.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strpbrk.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strpbrk.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__strpbrk, strpbrk) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strrchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strrchr-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strrchr-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRRCHR __strrchr_c + # undef weak_alias + # ifdef SHARED +@@ -26,4 +26,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strrchr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strrchr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strrchr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -177,4 +177,4 @@ ENTRY(__strrchr_vx) + .byte 0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08 + .byte 0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00 + END(__strrchr_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strrchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strrchr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strrchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (strrchr, rindex) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strspn-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strspn-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strspn-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define STRSPN __strspn_c + # ifdef SHARED + # undef libc_hidden_builtin_def +@@ -25,4 +25,4 @@ + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strspn-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strspn-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strspn-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -253,4 +253,4 @@ ENTRY(__strspn_vx) + j .Lslow_next_acc_notonbb /* ... and search for zero in + fully loaded vreg again. */ + END(__strspn_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/strspn.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/strspn.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/strspn.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__strspn, strspn) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpcpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcpcpy-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpcpy-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCPCPY __wcpcpy_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpcpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcpcpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpcpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -111,4 +111,4 @@ ENTRY(__wcpcpy_vx) + .Lfallback: + jg __wcpcpy_c + END(__wcpcpy_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcpcpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpcpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__wcpcpy, wcpcpy) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpncpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcpncpy-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpncpy-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCPNCPY __wcpncpy_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpncpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcpncpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpncpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -219,4 +219,4 @@ ENTRY(__wcpncpy_vx) + .Lfallback: + jg __wcpncpy_c + END(__wcpncpy_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpncpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcpncpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcpncpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__wcpncpy, wcpncpy) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscat-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscat-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscat-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSCAT __wcscat_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscat-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscat-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscat-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -172,4 +172,4 @@ ENTRY(__wcscat_vx) + .Lfallback: + jg __wcscat_c + END(__wcscat_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscat.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscat.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscat.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__wcscat, wcscat) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcschr-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschr-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSCHR __wcschr_c + + # include +@@ -28,4 +28,4 @@ extern __typeof (wcschr) __wcschr_c; + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcschr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -100,4 +100,4 @@ ENTRY(__wcschr_vx) + .Lfallback: + jg __wcschr_c + END(__wcschr_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcschr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcschr, wcschr) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschrnul-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcschrnul-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschrnul-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSCHRNUL __wcschrnul_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschrnul-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcschrnul-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschrnul-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -94,4 +94,4 @@ ENTRY(__wcschrnul_vx) + .Lfallback: + jg __wcschrnul_c + END(__wcschrnul_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschrnul.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcschrnul.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcschrnul.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__wcschrnul, wcschrnul) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscmp-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscmp-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscmp-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSCMP __wcscmp_c + + # include +@@ -27,4 +27,4 @@ extern __typeof (wcscmp) __wcscmp_c; + __hidden_ver1 (__wcscmp_c, __GI_wcscmp, __wcscmp_c); + # endif /* SHARED */ + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscmp-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscmp-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscmp-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -128,4 +128,4 @@ ENTRY(__wcscmp_vx) + lghi %r2,0 + br %r14 + END(__wcscmp_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscmp.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcscmp, wcscmp) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscpy-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscpy-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSCPY __wcscpy_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -108,4 +108,4 @@ ENTRY(__wcscpy_vx) + .Lfallback: + jg __wcscpy_c + END(__wcscpy_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcscpy, wcscpy) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscspn-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscspn-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscspn-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSCSPN __wcscspn_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscspn-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscspn-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscspn-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -290,4 +290,4 @@ ENTRY(__wcscspn_vx) + .Lfallback: + jg __wcscspn_c + END(__wcscspn_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscspn.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcscspn.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcscspn.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcscspn, wcscspn) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcslen-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcslen-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcslen-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSLEN __wcslen_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcslen-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcslen-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcslen-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -88,4 +88,4 @@ ENTRY(__wcslen_vx) + .Lfallback: + jg __wcslen_c + END(__wcslen_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcslen.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcslen.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcslen.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__wcslen, wcslen) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncat-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncat-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncat-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSNCAT __wcsncat_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncat-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncat-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncat-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -262,4 +262,4 @@ ENTRY(__wcsncat_vx) + .Lfallback: + jg __wcsncat_c + END(__wcsncat_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncat.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncat.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncat.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcsncat, wcsncat) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncmp-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncmp-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncmp-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSNCMP __wcsncmp_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncmp-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncmp-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncmp-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -174,4 +174,4 @@ ENTRY(__wcsncmp_vx) + locgrl %r2,%r1 + br %r14 + END(__wcsncmp_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncmp.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcsncmp, wcsncmp) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncpy-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncpy-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncpy-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSNCPY __wcsncpy_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncpy-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncpy-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncpy-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -220,4 +220,4 @@ ENTRY(__wcsncpy_vx) + jg __wcsncpy_c + END(__wcsncpy_vx) + +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsncpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsncpy.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__wcsncpy, wcsncpy) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsnlen-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsnlen-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsnlen-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSNLEN __wcsnlen_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsnlen-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsnlen-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsnlen-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -148,4 +148,4 @@ ENTRY(__wcsnlen_vx) + .Lfallback: + jg __wcsnlen_c + END(__wcsnlen_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsnlen.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsnlen.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsnlen.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -25,4 +25,4 @@ weak_alias (__wcsnlen, wcsnlen) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcspbrk-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcspbrk-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcspbrk-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSPBRK __wcspbrk_c + + # include +@@ -28,4 +28,4 @@ extern __typeof (wcspbrk) __wcspbrk_c; + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcspbrk-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcspbrk-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcspbrk-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -312,4 +312,4 @@ ENTRY(__wcspbrk_vx) + .Lfallback: + jg __wcspbrk_c + END(__wcspbrk_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcspbrk.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcspbrk.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcspbrk.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcspbrk, wcspbrk) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsrchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsrchr-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsrchr-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSRCHR __wcsrchr_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsrchr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsrchr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsrchr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -187,4 +187,4 @@ ENTRY(__wcsrchr_vx) + .Lfallback: + jg __wcsrchr_c + END(__wcsrchr_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsrchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsrchr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsrchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcsrchr, wcsrchr) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsspn-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsspn-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsspn-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WCSSPN __wcsspn_c + + # include +@@ -28,4 +28,4 @@ extern __typeof (wcsspn) __wcsspn_c; + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsspn-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsspn-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsspn-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -267,4 +267,4 @@ ENTRY(__wcsspn_vx) + .Lfallback: + jg __wcsspn_c + END(__wcsspn_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsspn.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wcsspn.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wcsspn.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wcsspn, wcsspn) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemchr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemchr-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemchr-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WMEMCHR __wmemchr_c + + # include +@@ -28,4 +28,4 @@ extern __typeof (wmemchr) __wmemchr_c; + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemchr-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemchr-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemchr-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -163,4 +163,4 @@ ENTRY(__wmemchr_vx) + .Lfallback: + jg __wmemchr_c + END(__wmemchr_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemchr.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemchr.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemchr.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wmemchr, wmemchr) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemcmp-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemcmp-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemcmp-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WMEMCMP __wmemcmp_c + + # include +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemcmp-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemcmp-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemcmp-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -146,4 +146,4 @@ ENTRY(__wmemcmp_vx) + la %r3,0(%r5,%r3) + j .Lremaining + END(__wmemcmp_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemcmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemcmp.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemcmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wmemcmp, wmemcmp) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemset-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemset-c.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemset-c.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # define WMEMSET __wmemset_c + + # include +@@ -28,4 +28,4 @@ extern __typeof (wmemset) __wmemset_c; + # endif /* SHARED */ + + # include +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemset-vx.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemset-vx.S ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemset-vx.S +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + + # include "sysdep.h" + # include "asm-syntax.h" +@@ -139,4 +139,4 @@ ENTRY(__wmemset_vx) + srlg %r4,%r4,2 /* Convert byte-count to character-count. */ + jg __wmemset_c + END(__wmemset_vx) +-#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ +Index: glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemset.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/multiarch/wmemset.c ++++ glibc-2.17-c758a686/sysdeps/s390/multiarch/wmemset.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) + # include + # include + +@@ -24,4 +24,4 @@ s390_vx_libc_ifunc2 (__wmemset, wmemset) + + #else + # include +-#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcmp-s390.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/multiarch/memcmp-s390.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcmp-s390.S +@@ -27,7 +27,7 @@ + + .text + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + ENTRY(__memcmp_z196) + .machine "z196" +@@ -92,11 +92,11 @@ ENTRY(__memcmp_z10) + clc 0(1,%r3),0(%r2) + END(__memcmp_z10) + +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ + + #include "../memcmp.S" + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl memcmp + .set memcmp,__memcmp_default + .weak bcmp +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/multiarch/memcmp.c ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + s390_libc_ifunc (memcmp) +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcpy-s390.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/multiarch/memcpy-s390.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcpy-s390.S +@@ -27,7 +27,7 @@ + + .text + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + + ENTRY(__memcpy_z196) + .machine "z196" +@@ -88,11 +88,11 @@ ENTRY(__memcpy_z10) + mvc 0(1,%r1),0(%r3) + END(__memcpy_z10) + +-#endif /* SHARED && !defined NOT_IN_libc */ ++#endif /* SHARED && IS_IN (libc) */ + + #include "../memcpy.S" + +-#if !defined SHARED || defined NOT_IN_libc ++#if !defined SHARED || !IS_IN (libc) + .globl memcpy + .set memcpy,__memcpy_default + #endif +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/multiarch/memcpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memcpy.c +@@ -17,7 +17,7 @@ + . */ + + /* In the static lib memcpy is needed before the reloc is resolved. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # include + + s390_libc_ifunc (memcpy) +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memset-s390.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/multiarch/memset-s390.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memset-s390.S +@@ -27,7 +27,7 @@ + + .text + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + ENTRY(__memset_z196) + .machine "z196" +@@ -103,11 +103,11 @@ ENTRY(__memset_mvcle) + br %r14 + END(__memset_mvcle) + +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ + + #include "../memset.S" + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl memset + .set memset,__memset_default + #endif +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memset.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/multiarch/memset.c ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/multiarch/memset.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + s390_libc_ifunc (memset) +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S +@@ -27,7 +27,7 @@ + + .text + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + ENTRY(__memcmp_z196) + .machine "z196" +@@ -89,11 +89,11 @@ ENTRY(__memcmp_z10) + clc 0(1,%r3),0(%r2) + END(__memcmp_z10) + +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ + + #include "../memcmp.S" + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl memcmp + .set memcmp,__memcmp_default + .weak bcmp +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/multiarch/memcmp.c ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcmp.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + s390_libc_ifunc (memcmp) +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S +@@ -27,7 +27,7 @@ + + .text + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + + ENTRY(__memcpy_z196) + .machine "z196" +@@ -84,11 +84,11 @@ ENTRY(__memcpy_z10) + mvc 0(1,%r1),0(%r3) + END(__memcpy_z10) + +-#endif /* SHARED && !defined NOT_IN_libc */ ++#endif /* SHARED && IS_IN (libc) */ + + #include "../memcpy.S" + +-#if !defined SHARED || defined NOT_IN_libc ++#if !defined SHARED || !IS_IN (libc) + .globl memcpy + .set memcpy,__memcpy_default + #endif +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcpy.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/multiarch/memcpy.c ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memcpy.c +@@ -17,7 +17,7 @@ + . */ + + /* In the static lib memcpy is needed before the reloc is resolved. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + # include + + s390_libc_ifunc (memcpy) +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memset-s390x.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/multiarch/memset-s390x.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memset-s390x.S +@@ -27,7 +27,7 @@ + + .text + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + ENTRY(__memset_z196) + .machine "z196" +@@ -99,11 +99,11 @@ ENTRY(__memset_mvcle) + br %r14 + END(__memset_mvcle) + +-#endif /* !NOT_IN_libc */ ++#endif /* !IS_IN (libc) */ + + #include "../memset.S" + +-#ifdef NOT_IN_libc ++#if !IS_IN (libc) + .globl memset + .set memset,__memset_default + #endif +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memset.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/multiarch/memset.c ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/multiarch/memset.c +@@ -16,7 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # include + + s390_libc_ifunc (memset) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset-x86-64.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memset-x86-64.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset-x86-64.S +@@ -1,6 +1,6 @@ + #include + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + # undef ENTRY_CHK + # define ENTRY_CHK(name) \ + .type __memset_chk_x86_64, @function; \ +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rawmemchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/rawmemchr.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rawmemchr.S +@@ -23,7 +23,7 @@ + + + /* Define multiple versions only for the definition in lib. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + .text + ENTRY(rawmemchr) + .type rawmemchr, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S +@@ -19,7 +19,7 @@ + + /* only for strlen case we don't use optimized version for STATIC build just for SHARED */ + +-#if (defined SHARED || defined USE_AS_STRCAT || defined USE_AS_STRNLEN) && !defined NOT_IN_libc ++#if (defined SHARED || defined USE_AS_STRCAT || defined USE_AS_STRNLEN) && IS_IN (libc) + + # ifndef USE_AS_STRCAT + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen-sse2-pminub.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strlen-sse2-pminub.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen-sse2-pminub.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if !defined NOT_IN_libc && (defined SHARED || defined USE_AS_STRCAT) ++#if IS_IN (libc) && (defined SHARED || defined USE_AS_STRCAT) + + # ifndef USE_AS_STRCAT + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen-sse4.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strlen-sse4.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen-sse4.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + + #include + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strlen.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen.S +@@ -25,7 +25,7 @@ + /* Define multiple versions only for the definition in libc and for + the DSO. In static binaries we need strlen before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + .text + ENTRY(strlen) + .type strlen, @gnu_indirect_function +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strnlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strnlen.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strnlen.S +@@ -22,7 +22,7 @@ + + + /* Define multiple versions only for the definition in libc. */ +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + + .text + ENTRY(__strnlen) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strrchr-sse2-no-bsf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strrchr-sse2-no-bsf.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strrchr-sse2-no-bsf.S +@@ -17,7 +17,7 @@ + License along with the GNU C Library; if not, see + . */ + +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + + # include + # include "asm-syntax.h" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strrchr.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strrchr.S +@@ -24,7 +24,7 @@ + /* Define multiple versions only for the definition in libc and for + the DSO. In static binaries we need strrchr before the initialization + happened. */ +-#if defined SHARED && !defined NOT_IN_libc ++#if defined SHARED && IS_IN (libc) + .text + ENTRY(strrchr) + .type strrchr, @gnu_indirect_function +Index: glibc-2.17-c758a686/Makerules +=================================================================== +--- glibc-2.17-c758a686.orig/Makerules ++++ glibc-2.17-c758a686/Makerules +@@ -1156,9 +1156,6 @@ lib := nonlib + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + endif + +-# The include magic above causes those files to use this variable for flags. +-CPPFLAGS-nonlib = -DNOT_IN_libc=1 +- + + ifeq ($(versioning),yes) + # Generate normalized lists of symbols, versions, and data sizes. +Index: glibc-2.17-c758a686/include/ctype.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/ctype.h ++++ glibc-2.17-c758a686/include/ctype.h +@@ -7,7 +7,7 @@ libc_hidden_proto (__ctype_init) + + extern int __isctype (int __c, int __mask); + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + + /* These accessors are used by the optimized macros to find the + thread-local cache of ctype information from the current thread's +@@ -46,13 +46,13 @@ __ctype_tolower_loc (void) + return __libc_tsd_address (const int32_t *, CTYPE_TOLOWER); + } + +-# endif /* Not NOT_IN_libc. */ ++# endif /* IS_IN (libc) */ + #endif + + #include + + #ifndef _ISOMAC +-# if !defined __NO_CTYPE && !defined NOT_IN_libc ++# if !defined __NO_CTYPE && IS_IN (libc) + /* The spec says that isdigit must only match the decimal digits. We + can check this without a memory access. */ + # undef isdigit +Index: glibc-2.17-c758a686/include/libc-symbols.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/libc-symbols.h ++++ glibc-2.17-c758a686/include/libc-symbols.h +@@ -548,7 +548,7 @@ for linking") + # define hidden_nolink(name, lib, version) + #endif + +-#if !defined NOT_IN_libc ++#if IS_IN (libc) + # define libc_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libc_hidden_def(name) hidden_def (name) + # define libc_hidden_weak(name) hidden_weak (name) +Index: glibc-2.17-c758a686/include/netdb.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/netdb.h ++++ glibc-2.17-c758a686/include/netdb.h +@@ -3,11 +3,11 @@ + + #ifndef _ISOMAC + /* Macros for accessing h_errno from inside libc. */ +-# if !defined NOT_IN_libc || IS_IN_LIB ++# if IS_IN_LIB + # undef h_errno + # ifdef _LIBC_REENTRANT + # include +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define h_errno __libc_h_errno + # else + # define h_errno h_errno /* For #ifndef h_errno tests. */ +@@ -16,7 +16,7 @@ extern __thread int h_errno attribute_tl + # else + extern int h_errno; + # endif /* _LIBC_REENTRANT */ +-# endif /* !NOT_IN_libc || IS_IN_LIB */ ++# endif /* IS_IN_LIB */ + # define __set_h_errno(x) (h_errno = (x)) + + libc_hidden_proto (hstrerror) +Index: glibc-2.17-c758a686/include/resolv.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/resolv.h ++++ glibc-2.17-c758a686/include/resolv.h +@@ -16,7 +16,7 @@ + # ifdef _LIBC_REENTRANT + # include + # undef _res +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # define __resp __libc_resp + # endif + # define _res (*__resp) +Index: glibc-2.17-c758a686/include/stdlib.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/stdlib.h ++++ glibc-2.17-c758a686/include/stdlib.h +@@ -216,7 +216,7 @@ extern int __qfcvt_r (long double __valu + int *__restrict __decpt, int *__restrict __sign, + char *__restrict __buf, size_t __len); + +-# ifndef NOT_IN_libc ++# if IS_IN (libc) + # undef MB_CUR_MAX + # define MB_CUR_MAX (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)) + +Index: glibc-2.17-c758a686/locale/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/locale/Makefile ++++ glibc-2.17-c758a686/locale/Makefile +@@ -88,13 +88,13 @@ CPPFLAGS-locale-programs = -DLOCALE_PATH + -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ + -DREPERTOIREMAP_PATH='"$(i18ndir)/repertoiremaps"' \ + -DLOCSRCDIR='"$(i18ndir)/locales"' \ +- -DHAVE_CONFIG_H -DNOT_IN_libc ++ -DHAVE_CONFIG_H + + CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts + CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts + CFLAGS-charmap-dir.c = -Wno-write-strings + +-# This makes sure -DNOT_IN_libc et al are passed for all these modules. ++# Set libof-* for each routine. + cpp-srcs-left := $(localedef-modules) $(localedef-aux) $(locale-modules) \ + $(lib-modules) + lib := locale-programs +Index: glibc-2.17-c758a686/nss/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nss/Makefile ++++ glibc-2.17-c758a686/nss/Makefile +@@ -109,7 +109,6 @@ $(inst_vardbdir)/Makefile: db-Makefile $ + $(do-install) + + libof-nss_test1 = extramodules +-CPPFLAGS-nss_test1 = -DNOT_IN_libc=1 + $(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(common-objpfx)libc.so \ + $(common-objpfx)libc_nonshared.a + $(build-module) +Index: glibc-2.17-c758a686/resolv/res_hconf.c +=================================================================== +--- glibc-2.17-c758a686.orig/resolv/res_hconf.c ++++ glibc-2.17-c758a686/resolv/res_hconf.c +@@ -359,7 +359,7 @@ _res_hconf_init (void) + } + + +-#ifndef NOT_IN_libc ++#if IS_IN (libc) + /* List of known interfaces. */ + libc_freeres_ptr ( + static struct netaddr +Index: glibc-2.17-c758a686/stdlib/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/stdlib/Makefile ++++ glibc-2.17-c758a686/stdlib/Makefile +@@ -139,7 +139,6 @@ LDFLAGS-tst-putenv = $(no-as-needed) + $(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os + $(build-module) + libof-tst-putenvmod = extramodules +-CFLAGS-tst-putenvmod.c = -DNOT_IN_libc=1 + + ifeq ($(build-shared),yes) + link-libm = $(common-objpfx)math/libm.so +Index: glibc-2.17-c758a686/sysdeps/gnu/errlist.awk +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/gnu/errlist.awk ++++ glibc-2.17-c758a686/sysdeps/gnu/errlist.awk +@@ -109,7 +109,7 @@ END { + print " (sizeof _sys_errlist_internal / sizeof _sys_errlist_internal [0])"; + print "const int _sys_nerr_internal = NERR;" + print ""; +- print "#if !defined NOT_IN_libc && !ERRLIST_NO_COMPAT"; ++ print "#if IS_IN (libc) && !ERRLIST_NO_COMPAT"; + print "# include "; + print "#endif"; + print ""; +Index: glibc-2.17-c758a686/sysdeps/gnu/errlist.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/gnu/errlist.c ++++ glibc-2.17-c758a686/sysdeps/gnu/errlist.c +@@ -1479,7 +1479,7 @@ TRANS error; @pxref{Cancel AIO Operation + (sizeof _sys_errlist_internal / sizeof _sys_errlist_internal [0]) + const int _sys_nerr_internal = NERR; + +-#if !defined NOT_IN_libc && !ERRLIST_NO_COMPAT ++#if IS_IN (libc) && !ERRLIST_NO_COMPAT + # include + #endif + +Index: glibc-2.17-c758a686/sysdeps/i386/i586/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i586/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i586/memcpy.S +@@ -34,7 +34,7 @@ + #define LEN SRC+PTR_SIZE + + .text +-#if defined PIC && !defined NOT_IN_libc ++#if defined PIC && IS_IN (libc) + ENTRY (__memcpy_chk) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/memcpy.S +@@ -30,7 +30,7 @@ + #define LEN SRC+PTR_SIZE + + .text +-#if defined PIC && !defined NOT_IN_libc ++#if defined PIC && IS_IN (libc) + ENTRY_CHK (__memcpy_chk) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/memmove.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/memmove.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/memmove.S +@@ -37,7 +37,7 @@ + # define SRC DEST+PTR_SIZE + # define LEN SRC+PTR_SIZE + +-# if defined PIC && !defined NOT_IN_libc ++# if defined PIC && IS_IN (libc) + ENTRY_CHK (__memmove_chk) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/mempcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/mempcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/mempcpy.S +@@ -30,7 +30,7 @@ + #define LEN SRC+PTR_SIZE + + .text +-#if defined PIC && !defined NOT_IN_libc ++#if defined PIC && IS_IN (libc) + ENTRY_CHK (__mempcpy_chk) + movl 12(%esp), %eax + cmpl %eax, 16(%esp) diff --git a/SOURCES/glibc-rh1256317-20.patch b/SOURCES/glibc-rh1256317-20.patch new file mode 100644 index 0000000..8426653 --- /dev/null +++ b/SOURCES/glibc-rh1256317-20.patch @@ -0,0 +1,54 @@ +commit 318c7a5846bbfaab567c92b37941000dfc0c00c0 +Author: Siddhesh Poyarekar +Date: Thu Aug 21 10:27:13 2014 +0530 + + Remove redundant CPPFLAGS for some programs + + These programs get the NOT_IN_libc twice, once through the 'other' + target and another explicitly. Remove the explicitly added CPFLAG. + + * catgets/Makefile (CPPFLAGS-gencat): Remove. + * iconv/Makefile (CPPFLAGS-iconv_prog): Likewise. + (CPPFLAGS-iconvconfig): Likewise. + * timezone/Makefile (CPPFLAGS-zic): Likewise. + +Index: glibc-2.17-c758a686/catgets/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/catgets/Makefile ++++ glibc-2.17-c758a686/catgets/Makefile +@@ -42,8 +42,6 @@ $(objpfx)gencat: $(gencat-modules:%=$(ob + catgets-CPPFLAGS := -DNLSPATH='"$(msgcatdir)/%L/%N:$(msgcatdir)/%L/LC_MESSAGES/%N:$(msgcatdir)/%l/%N:$(msgcatdir)/%l/LC_MESSAGES/%N:"' \ + -DHAVE_CONFIG_H + +-CPPFLAGS-gencat = -DNOT_IN_libc +- + generated = de.msg test1.cat test1.h test2.cat test2.h sample.SJIS.cat \ + test-gencat.h + generated-dirs = de +Index: glibc-2.17-c758a686/iconv/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/iconv/Makefile ++++ glibc-2.17-c758a686/iconv/Makefile +@@ -53,9 +53,7 @@ CFLAGS-gconv_cache.c += -DGCONV_DIR='"$( + CFLAGS-gconv_conf.c = -DGCONV_PATH='"$(gconvdir)"' + CFLAGS-iconvconfig.c = -DGCONV_PATH='"$(gconvdir)"' -DGCONV_DIR='"$(gconvdir)"' + +-CPPFLAGS-iconv_prog = -DNOT_IN_libc + CPPFLAGS-iconv_charmap = -DNOT_IN_libc +-CPPFLAGS-iconvconfig = -DNOT_IN_libc + CPPFLAGS-linereader = -DNOT_IN_libc + CPPFLAGS-strtab = -DNOT_IN_libc + CPPFLAGS-charmap = -DNOT_IN_libc +Index: glibc-2.17-c758a686/timezone/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/timezone/Makefile ++++ glibc-2.17-c758a686/timezone/Makefile +@@ -42,8 +42,6 @@ all: # Make this the default target; it + + include ../Makeconfig # Get objpfx defined so we can use it below. + +-CPPFLAGS-zic = -DNOT_IN_libc +- + ifeq ($(have-ksh),yes) + install-bin-script = tzselect + generated += tzselect diff --git a/SOURCES/glibc-rh1256317-21.patch b/SOURCES/glibc-rh1256317-21.patch new file mode 100644 index 0000000..a1a4a1e --- /dev/null +++ b/SOURCES/glibc-rh1256317-21.patch @@ -0,0 +1,509 @@ +commit eb72478a286e0104f5636d21d86407b4c0e89fa1 +Author: Siddhesh Poyarekar +Date: Thu Aug 21 10:26:46 2014 +0530 + + Remove unnecessary uses of NOT_IN_libc + + If a IS_IN_* macro is defined, then NOT_IN_libc is always defined, + except obviously for IS_IN_libc. There's no need to check for both. + Verified on x86_64 and i686 that the source is unchanged. + + * include/libc-symbols.h: Remove unnecessary check for + NOT_IN_libc. + * nptl/pthreadP.h: Likewise. + * sysdeps/aarch64/setjmp.S: Likewise. + * sysdeps/alpha/setjmp.S: Likewise. + * sysdeps/arm/sysdep.h: Likewise. + * sysdeps/i386/setjmp.S: Likewise. + * sysdeps/m68k/setjmp.c: Likewise. + * sysdeps/posix/getcwd.c: Likewise. + * sysdeps/powerpc/powerpc32/setjmp-common.S: Likewise. + * sysdeps/powerpc/powerpc64/setjmp-common.S: Likewise. + * sysdeps/s390/s390-32/setjmp.S: Likewise. + * sysdeps/s390/s390-64/setjmp.S: Likewise. + * sysdeps/sh/sh3/setjmp.S: Likewise. + * sysdeps/sh/sh4/setjmp.S: Likewise. + * sysdeps/unix/alpha/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/setjmp.S: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/tile/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise. + * sysdeps/x86_64/setjmp.S: Likewise. +Index: glibc-2.17-c758a686/include/libc-symbols.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/libc-symbols.h ++++ glibc-2.17-c758a686/include/libc-symbols.h +@@ -561,7 +561,7 @@ for linking") + # define libc_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + # define rtld_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define rtld_hidden_def(name) hidden_def (name) + # define rtld_hidden_weak(name) hidden_weak (name) +@@ -579,7 +579,7 @@ for linking") + # define rtld_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_libm ++#ifdef IS_IN_libm + # define libm_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libm_hidden_def(name) hidden_def (name) + # define libm_hidden_weak(name) hidden_weak (name) +@@ -597,7 +597,7 @@ for linking") + # define libm_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_libresolv ++#ifdef IS_IN_libresolv + # define libresolv_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libresolv_hidden_def(name) hidden_def (name) + # define libresolv_hidden_weak(name) hidden_weak (name) +@@ -615,7 +615,7 @@ for linking") + # define libresolv_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_librt ++#ifdef IS_IN_librt + # define librt_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define librt_hidden_def(name) hidden_def (name) + # define librt_hidden_weak(name) hidden_weak (name) +@@ -633,7 +633,7 @@ for linking") + # define librt_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_libdl ++#ifdef IS_IN_libdl + # define libdl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libdl_hidden_def(name) hidden_def (name) + # define libdl_hidden_weak(name) hidden_weak (name) +@@ -651,7 +651,7 @@ for linking") + # define libdl_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_libnss_files ++#ifdef IS_IN_libnss_files + # define libnss_files_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libnss_files_hidden_def(name) hidden_def (name) + # define libnss_files_hidden_weak(name) hidden_weak (name) +@@ -669,7 +669,7 @@ for linking") + # define libnss_files_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_libnsl ++#ifdef IS_IN_libnsl + # define libnsl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libnsl_hidden_def(name) hidden_def (name) + # define libnsl_hidden_weak(name) hidden_weak (name) +@@ -687,7 +687,7 @@ for linking") + # define libnsl_hidden_data_ver(local, name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_libnss_nisplus ++#ifdef IS_IN_libnss_nisplus + # define libnss_nisplus_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libnss_nisplus_hidden_def(name) hidden_def (name) + # define libnss_nisplus_hidden_weak(name) hidden_weak (name) +@@ -713,7 +713,7 @@ for linking") + # define HIDDEN_BUILTIN_JUMPTARGET(name) HIDDEN_JUMPTARGET(name) + #endif + +-#if defined NOT_IN_libc && defined IS_IN_libutil ++#ifdef IS_IN_libutil + # define libutil_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) + # define libutil_hidden_def(name) hidden_def (name) + # define libutil_hidden_weak(name) hidden_weak (name) +Index: glibc-2.17-c758a686/nptl/pthreadP.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/pthreadP.h ++++ glibc-2.17-c758a686/nptl/pthreadP.h +@@ -239,7 +239,7 @@ extern void __pthread_register_cancel (_ + __cleanup_fct_attribute; + extern void __pthread_unregister_cancel (__pthread_unwind_buf_t *__buf) + __cleanup_fct_attribute; +-#if defined NOT_IN_libc && defined IS_IN_libpthread ++#ifdef IS_IN_libpthread + hidden_proto (__pthread_unwind) + hidden_proto (__pthread_unwind_next) + hidden_proto (__pthread_register_cancel) +@@ -283,13 +283,13 @@ __do_cancel (void) + # define LIBC_CANCEL_HANDLED() \ + __asm (".globl " __SYMBOL_PREFIX "__libc_enable_asynccancel"); \ + __asm (".globl " __SYMBOL_PREFIX "__libc_disable_asynccancel") +-#elif defined NOT_IN_libc && defined IS_IN_libpthread ++#elif defined IS_IN_libpthread + # define LIBC_CANCEL_ASYNC() CANCEL_ASYNC () + # define LIBC_CANCEL_RESET(val) CANCEL_RESET (val) + # define LIBC_CANCEL_HANDLED() \ + __asm (".globl " __SYMBOL_PREFIX "__pthread_enable_asynccancel"); \ + __asm (".globl " __SYMBOL_PREFIX "__pthread_disable_asynccancel") +-#elif defined NOT_IN_libc && defined IS_IN_librt ++#elif defined IS_IN_librt + # define LIBC_CANCEL_ASYNC() \ + __librt_enable_asynccancel () + # define LIBC_CANCEL_RESET(val) \ +@@ -344,7 +344,7 @@ extern int __make_stacks_executable (voi + + /* longjmp handling. */ + extern void __pthread_cleanup_upto (__jmp_buf target, char *targetframe); +-#if defined NOT_IN_libc && defined IS_IN_libpthread ++#ifdef IS_IN_libpthread + hidden_proto (__pthread_cleanup_upto) + #endif + +@@ -489,7 +489,7 @@ extern int __pthread_enable_asynccancel + extern void __pthread_disable_asynccancel (int oldtype) + internal_function attribute_hidden; + +-#if defined NOT_IN_libc && defined IS_IN_libpthread ++#ifdef IS_IN_libpthread + hidden_proto (__pthread_mutex_init) + hidden_proto (__pthread_mutex_destroy) + hidden_proto (__pthread_mutex_lock) +Index: glibc-2.17-c758a686/sysdeps/posix/getcwd.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/getcwd.c ++++ glibc-2.17-c758a686/sysdeps/posix/getcwd.c +@@ -206,7 +206,7 @@ extern char *alloca (); + + #ifdef __ASSUME_ATFCTS + # define __have_atfcts 1 +-#elif defined NOT_IN_libc && defined IS_IN_rtld ++#elif defined IS_IN_rtld + static int __rtld_have_atfcts; + # define __have_atfcts __rtld_have_atfcts + #endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/setjmp-common.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S +@@ -212,7 +212,7 @@ L(no_vmx): + #else + li r6,0 + #endif +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + li r3,0 + blr + #elif defined SHARED +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/setjmp.S +@@ -57,7 +57,7 @@ ENTRY(__sigsetjmp) + #endif + std %f4,40(%r2) + std %f6,48(%r2) +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + lhi %r2,0 + br %r14 +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/setjmp.S +@@ -63,7 +63,7 @@ ENTRY(__sigsetjmp) + std %f13,120(%r2) + std %f14,128(%r2) + std %f15,136(%r2) +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + lghi %r2,0 + br %r14 +Index: glibc-2.17-c758a686/sysdeps/sh/sh3/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sh/sh3/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/sh/sh3/setjmp.S +@@ -46,7 +46,7 @@ ENTRY (__sigsetjmp) + mov.l r9, @-r4 + mov.l r8, @-r4 + +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + rts + mov #0, r0 +Index: glibc-2.17-c758a686/sysdeps/sh/sh4/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sh/sh4/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/sh/sh4/setjmp.S +@@ -55,7 +55,7 @@ ENTRY (__sigsetjmp) + mov.l r9, @-r4 + mov.l r8, @-r4 + +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + rts + mov #0, r0 +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/i386/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +@@ -521,7 +521,7 @@ asm (".L__X'%ebx = 1\n\t" + + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. Using a global variable + is too complicated here since we have no PC-relative addressing mode. */ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +@@ -272,7 +272,7 @@ + + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +@@ -282,7 +282,7 @@ + + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +@@ -367,7 +367,7 @@ + _ret; }) + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +@@ -373,7 +373,7 @@ + _ret; }) + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sh/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sh/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sh/sysdep.h +@@ -338,7 +338,7 @@ + #endif /* __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. Using a global variable + is too complicated here since we have no PC-relative addressing mode. */ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +@@ -126,7 +126,7 @@ ENTRY(name); \ + #endif /* __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +@@ -141,7 +141,7 @@ ENTRY(name); \ + #define STACK_BIAS 2047 + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/x86_64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/sysdep.h +@@ -395,7 +395,7 @@ + + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + # ifdef __ASSEMBLER__ +Index: glibc-2.17-c758a686/sysdeps/x86_64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/setjmp.S +@@ -54,7 +54,7 @@ ENTRY (__sigsetjmp) + #endif + movq %rax, (JB_PC*8)(%rdi) + +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + xorl %eax, %eax + retq +Index: glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/aarch64/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +@@ -58,7 +58,7 @@ ENTRY (__sigsetjmp) + mov x2, sp + str x2, [x0, #JB_SP<<3] + #endif +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask */ + mov w0, #0 + RET +Index: glibc-2.17-c758a686/ports/sysdeps/alpha/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/alpha/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/alpha/setjmp.S +@@ -86,7 +86,7 @@ $sigsetjmp_local: + ldq ra, 0(sp) + addq sp, 16, sp + ret +-#elif defined NOT_IN_libc && defined IS_IN_rtld ++#elif defined IS_IN_rtld + /* In ld.so we never save the signal mask. */ + mov 0, v0 + ret +Index: glibc-2.17-c758a686/ports/sysdeps/m68k/setjmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/m68k/setjmp.c ++++ glibc-2.17-c758a686/ports/sysdeps/m68k/setjmp.c +@@ -57,7 +57,7 @@ __sigsetjmp (jmp_buf env, int savemask) + : : "m" (env[0].__jmpbuf[0].__fpregs[0])); + #endif + +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + return 0; + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/alpha/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/alpha/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/alpha/sysdep.h +@@ -346,7 +346,7 @@ __LABEL(name) \ + + #include + +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + # ifdef __ASSEMBLER__ + # define PTR_MANGLE(dst, src, tmp) \ + ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \ +Index: glibc-2.17-c758a686/sysdeps/i386/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/setjmp.S +@@ -51,7 +51,7 @@ ENTRY (BP_SYM (__sigsetjmp)) + LEAVE /* pop frame pointer to prepare for tail-call. */ + movl %ebp, (JB_BP*4)(%eax) /* Save caller's frame pointer. */ + +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + xorl %eax, %eax + ret +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp-common.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/setjmp-common.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp-common.S +@@ -64,7 +64,7 @@ ENTRY (BP_SYM (__sigsetjmp)) + stw r29,((JB_GPRS+15)*4)(3) + stw r30,((JB_GPRS+16)*4)(3) + stw r31,((JB_GPRS+17)*4)(3) +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + li r3,0 + blr + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -324,8 +324,9 @@ + #endif /* __ASSEMBLER__ */ + + /* Pointer mangling is supported for AArch64. */ +-#if (defined NOT_IN_libc && defined IS_IN_rtld) || \ +- (!defined SHARED && (!defined NOT_IN_libc || defined IS_IN_libpthread)) ++#if (defined IS_IN_rtld) || \ ++ (!defined SHARED && (!defined NOT_IN_libc \ ++ || defined IS_IN_libpthread)) + # ifdef __ASSEMBLER__ + # define PTR_MANGLE(dst, src, guard, tmp) \ + LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S +@@ -179,7 +179,7 @@ ENTRY(__sigsetjmp) + ;; + st8.nta [r2]=r25 // ar.unat + st8.nta [r3]=in0 // &__jmp_buf +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* In ld.so we never save the signal mask. */ + ;; + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +@@ -62,7 +62,7 @@ + + #if defined USE_DL_SYSINFO \ + && (!defined NOT_IN_libc \ +- || defined IS_IN_libpthread || defined IS_IN_librt) ++ || IS_IN (libpthread) || defined IS_IN_librt) + # define IA64_USE_NEW_STUB + #else + # undef IA64_USE_NEW_STUB +@@ -361,7 +361,7 @@ + #endif /* not __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#ifdef IS_IN_rtld + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else diff --git a/SOURCES/glibc-rh1256317-3.patch b/SOURCES/glibc-rh1256317-3.patch new file mode 100644 index 0000000..e314e01 --- /dev/null +++ b/SOURCES/glibc-rh1256317-3.patch @@ -0,0 +1,24 @@ +commit 76ca86a506a81d8a08655fb331162926569a47d6 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 21:24:22 2014 +0530 + + Remove last place for definition of IS_IN_* macros + + Ignoring IS_IN_build, which has a different purpose altogether, this + patch removes the last bit of IS_IN_* macro definitions. Now barring + NOT_IN_libc, all cases use the IN_MODULE scheme. + + Generated code unchanged on x86_64. + + * extra-lib.mk (CPPFLAGS-$(lib)): Remove IS_IN_$(lib). + +Index: glibc-2.17-c758a686/extra-lib.mk +=================================================================== +--- glibc-2.17-c758a686.orig/extra-lib.mk ++++ glibc-2.17-c758a686/extra-lib.mk +@@ -101,4 +101,4 @@ ifneq (,$(cpp-srcs-left)) + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + endif + +-CPPFLAGS-$(lib) := -DNOT_IN_libc=1 -DIS_IN_$(lib)=1 ++CPPFLAGS-$(lib) := -DNOT_IN_libc=1 diff --git a/SOURCES/glibc-rh1256317-4.patch b/SOURCES/glibc-rh1256317-4.patch new file mode 100644 index 0000000..6156feb --- /dev/null +++ b/SOURCES/glibc-rh1256317-4.patch @@ -0,0 +1,1239 @@ +commit a38484851aa244e1d5c48405f0e26fe93fa8d3b5 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 21:09:43 2014 +0530 + + Remove IS_IN_rtld + + Replace with IS_IN (rtld). Generated code is unchanged on + x86_64. + + * elf/Makefile (CPPFLAGS-.os): Remove IS_IN_rtld. + * elf/dl-open.c: Use IS_IN (rtld) instead if IS_IN_rtld. + * elf/rtld-Rules: Likewise. + * elf/setup-vdso.h: Likewise. + * include/assert.h: Likewise. + * include/bits/stdlib-float.h: Likewise. + * include/errno.h: Likewise. + * include/sys/stat.h: Likewise. + * include/unistd.h: Likewise. + * sysdeps/aarch64/setjmp.S: Likewise. + * sysdeps/alpha/setjmp.S: Likewise. + * sysdeps/arm/__longjmp.S: Likewise. + * sysdeps/arm/aeabi_unwind_cpp_pr1.c: Likewise. + * sysdeps/arm/setjmp.S: Likewise. + * sysdeps/arm/sysdep.h: Likewise. + * sysdeps/generic/_itoa.h: Likewise. + * sysdeps/generic/dl-sysdep.h: Likewise. + * sysdeps/generic/ldsodefs.h: Likewise. + * sysdeps/i386/dl-tls.h: Likewise. + * sysdeps/i386/setjmp.S: Likewise. + * sysdeps/m68k/setjmp.c: Likewise. + * sysdeps/mach/hurd/dl-execstack.c: Likewise. + * sysdeps/mach/hurd/opendir.c: Likewise. + * sysdeps/posix/getcwd.c: Likewise. + * sysdeps/posix/opendir.c: Likewise. + * sysdeps/posix/profil.c: Likewise. + * sysdeps/powerpc/dl-procinfo.h: Likewise. + * sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/setjmp-common.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h: Likewise. + * sysdeps/powerpc/powerpc32/setjmp-common.S: Likewise. + * sysdeps/powerpc/powerpc64/__longjmp-common.S: Likewise. + * sysdeps/powerpc/powerpc64/setjmp-common.S: Likewise. + * sysdeps/s390/dl-tls.h: Likewise. + * sysdeps/s390/s390-32/setjmp.S: Likewise. + * sysdeps/s390/s390-64/setjmp.S: Likewise. + * sysdeps/sh/sh3/setjmp.S: Likewise. + * sysdeps/sh/sh4/setjmp.S: Likewise. + * sysdeps/unix/alpha/sysdep.h: Likewise. + * sysdeps/unix/arm/sysdep.S: Likewise. + * sysdeps/unix/i386/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/getcwd.c: Likewise. + * sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/setjmp.S: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/lowlevellock-futex.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/m68k-helpers.S: Likewise. + * sysdeps/unix/sysv/linux/microblaze/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/tile/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/tile/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise. + * sysdeps/unix/x86_64/sysdep.S: Likewise. + * sysdeps/x86_64/setjmp.S: Likewise. + +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -444,7 +444,7 @@ CFLAGS-cache.c = $(SYSCONF-FLAGS) + CFLAGS-rtld.c = $(SYSCONF-FLAGS) + + CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ +- -DNOT_IN_libc=1 -DIS_IN_rtld=1) ++ -DNOT_IN_libc=1) + + # Disable any optimization which might result in function calls during early + # dynamic loader startup. We disable -ftree-loop-distribute-patterns which +Index: glibc-2.17-c758a686/elf/dl-open.c +=================================================================== +--- glibc-2.17-c758a686.orig/elf/dl-open.c ++++ glibc-2.17-c758a686/elf/dl-open.c +@@ -741,7 +741,7 @@ _dl_show_scope (struct link_map *l, int + _dl_debug_printf ("\n"); + } + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* Return non-zero if ADDR lies within one of L's segments. */ + int + internal_function +Index: glibc-2.17-c758a686/elf/rtld-Rules +=================================================================== +--- glibc-2.17-c758a686.orig/elf/rtld-Rules ++++ glibc-2.17-c758a686/elf/rtld-Rules +@@ -134,6 +134,6 @@ lib := rtld + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + + # This here is the whole point of all the shenanigans. +-rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1 ++rtld-CPPFLAGS := -DNOT_IN_libc=1 + + endif +Index: glibc-2.17-c758a686/elf/setup-vdso.h +=================================================================== +--- glibc-2.17-c758a686.orig/elf/setup-vdso.h ++++ glibc-2.17-c758a686/elf/setup-vdso.h +@@ -101,7 +101,7 @@ setup_vdso (struct link_map *main_map __ + /* Add the vDSO to the object list. */ + _dl_add_to_namespace_list (l, LM_ID_BASE); + +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + /* Rearrange the list so this DSO appears after rtld_map. */ + assert (l->l_next == NULL); + assert (l->l_prev == main_map); +Index: glibc-2.17-c758a686/include/assert.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/assert.h ++++ glibc-2.17-c758a686/include/assert.h +@@ -20,7 +20,7 @@ extern void __assert_fail_base (const ch + const char *function) + __THROW __attribute__ ((__noreturn__)); + +-# if !defined NOT_IN_libc || defined IS_IN_rtld ++# if !defined NOT_IN_libc || IS_IN (rtld) + hidden_proto (__assert_fail) + hidden_proto (__assert_perror_fail) + # endif +Index: glibc-2.17-c758a686/include/bits/stdlib-float.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/bits/stdlib-float.h ++++ glibc-2.17-c758a686/include/bits/stdlib-float.h +@@ -1,4 +1,4 @@ + /* No floating-point inline functions in rtld. */ +-#ifndef IS_IN_rtld ++#if !IS_IN (rtld) + # include + #endif +Index: glibc-2.17-c758a686/include/errno.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/errno.h ++++ glibc-2.17-c758a686/include/errno.h +@@ -4,7 +4,7 @@ + + #if defined _ERRNO_H && !defined _ISOMAC && !defined __cplusplus + +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + # include + # endif + +Index: glibc-2.17-c758a686/include/sys/stat.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/sys/stat.h ++++ glibc-2.17-c758a686/include/sys/stat.h +@@ -12,7 +12,7 @@ extern __mode_t __umask (__mode_t __mask + extern int __mkdir (const char *__path, __mode_t __mode); + extern int __mknod (const char *__path, + __mode_t __mode, __dev_t __dev); +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + hidden_proto (__fxstat) + hidden_proto (__fxstat64) + hidden_proto (__lxstat) +Index: glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/aarch64/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +@@ -58,7 +58,7 @@ ENTRY (__sigsetjmp) + mov x2, sp + str x2, [x0, #JB_SP<<3] + #endif +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask */ + mov w0, #0 + RET +Index: glibc-2.17-c758a686/ports/sysdeps/alpha/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/alpha/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/alpha/setjmp.S +@@ -86,7 +86,7 @@ $sigsetjmp_local: + ldq ra, 0(sp) + addq sp, 16, sp + ret +-#elif defined IS_IN_rtld ++#elif IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + mov 0, v0 + ret +Index: glibc-2.17-c758a686/ports/sysdeps/arm/__longjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/arm/__longjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/arm/__longjmp.S +@@ -52,7 +52,7 @@ ENTRY (__longjmp) + #endif + + #ifdef NEED_HWCAP +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + ldr a2, 1f + ldr a3, .Lrtld_local_ro + 0: add a2, pc, a2 +@@ -104,7 +104,7 @@ ENTRY (__longjmp) + DO_RET(lr) + + #ifdef NEED_HWCAP +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 + .Lrtld_local_ro: + .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) +Index: glibc-2.17-c758a686/ports/sysdeps/arm/aeabi_unwind_cpp_pr1.c +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/arm/aeabi_unwind_cpp_pr1.c ++++ glibc-2.17-c758a686/ports/sysdeps/arm/aeabi_unwind_cpp_pr1.c +@@ -27,7 +27,7 @@ attribute_hidden + void + __aeabi_unwind_cpp_pr0 (void) + { +-#ifndef IS_IN_rtld ++#if !IS_IN (rtld) + abort (); + #endif + } +@@ -36,7 +36,7 @@ attribute_hidden + void + __aeabi_unwind_cpp_pr1 (void) + { +-#ifndef IS_IN_rtld ++#if !IS_IN (rtld) + abort (); + #endif + } +@@ -45,7 +45,7 @@ attribute_hidden + void + __aeabi_unwind_cpp_pr2 (void) + { +-#ifndef IS_IN_rtld ++#if !IS_IN (rtld) + abort (); + #endif + } +Index: glibc-2.17-c758a686/ports/sysdeps/arm/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/arm/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/arm/setjmp.S +@@ -35,7 +35,7 @@ ENTRY (__sigsetjmp) + + #ifdef NEED_HWCAP + /* Check if we have a VFP unit. */ +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + ldr a3, 1f + ldr a4, .Lrtld_local_ro + 0: add a3, pc, a3 +@@ -90,7 +90,7 @@ ENTRY (__sigsetjmp) + B PLTJMP(C_SYMBOL_NAME(__sigjmp_save)) + + #ifdef NEED_HWCAP +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 + .Lrtld_local_ro: + .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) +Index: glibc-2.17-c758a686/sysdeps/generic/_itoa.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/generic/_itoa.h ++++ glibc-2.17-c758a686/sysdeps/generic/_itoa.h +@@ -46,7 +46,7 @@ extern char *_itoa (unsigned long long i + + extern const char _itoa_upper_digits[]; + extern const char _itoa_lower_digits[]; +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + hidden_proto (_itoa_upper_digits) + hidden_proto (_itoa_lower_digits) + #endif +Index: glibc-2.17-c758a686/sysdeps/generic/dl-sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/generic/dl-sysdep.h ++++ glibc-2.17-c758a686/sysdeps/generic/dl-sysdep.h +@@ -27,7 +27,7 @@ + all the libc functions that ld.so uses are called without PLT and always + get the versions linked into ld.so rather than the libc ones. */ + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # define RTLD_PRIVATE_ERRNO 1 + #else + # define RTLD_PRIVATE_ERRNO 0 +Index: glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/generic/ldsodefs.h ++++ glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h +@@ -246,7 +246,7 @@ typedef void (*receiver_fct) (int, const + # define GL(name) _##name + #else + # define EXTERN +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + # define GL(name) _rtld_local._##name + # else + # define GL(name) _rtld_global._##name +@@ -415,7 +415,7 @@ struct rtld_global + #ifdef SHARED + }; + # define __rtld_global_attribute__ +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + # ifdef HAVE_SDATA_SECTION + # define __rtld_local_attribute__ \ + __attribute__ ((visibility ("hidden"), section (".sdata"))) +@@ -434,7 +434,7 @@ extern struct rtld_global _rtld_global _ + #ifndef SHARED + # define GLRO(name) _##name + #else +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + # define GLRO(name) _rtld_local_ro._##name + # else + # define GLRO(name) _rtld_global_ro._##name +@@ -593,7 +593,7 @@ struct rtld_global_ro + EXTERN int _dl_pointer_guard; + }; + # define __rtld_global_attribute__ +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + # define __rtld_local_attribute__ __attribute__ ((visibility ("hidden"))) + extern struct rtld_global_ro _rtld_local_ro + attribute_relro __rtld_local_attribute__; +@@ -610,7 +610,7 @@ extern const struct rtld_global_ro _rtld + #endif + #undef EXTERN + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* This is the initial value of GL(dl_error_catch_tsd). + A non-TLS libpthread will change it. */ + extern void **_dl_initial_error_catch_tsd (void) __attribute__ ((const)) +@@ -641,7 +641,7 @@ extern char **_dl_argv + attribute_relro + #endif + ; +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + extern char **_dl_argv_internal attribute_hidden + # ifndef DL_ARGV_NOT_RELRO + attribute_relro +@@ -655,7 +655,7 @@ extern char **_dl_argv_internal attribut + /* Flag set at startup and cleared when the last initializer has run. */ + extern int _dl_starting_up; + weak_extern (_dl_starting_up) +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + extern int _dl_starting_up_internal attribute_hidden; + #endif + +Index: glibc-2.17-c758a686/sysdeps/i386/dl-tls.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/dl-tls.h ++++ glibc-2.17-c758a686/sysdeps/i386/dl-tls.h +@@ -32,7 +32,7 @@ extern void *___tls_get_addr (tls_index + extern void *___tls_get_addr_internal (tls_index *ti) + __attribute__ ((__regparm__ (1))) attribute_hidden; + +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + /* The special thing about the x86 TLS ABI is that we have two + variants of the __tls_get_addr function with different calling + conventions. The GNU version, which we are mostly concerned here, +Index: glibc-2.17-c758a686/sysdeps/i386/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/setjmp.S +@@ -51,7 +51,7 @@ ENTRY (BP_SYM (__sigsetjmp)) + LEAVE /* pop frame pointer to prepare for tail-call. */ + movl %ebp, (JB_BP*4)(%eax) /* Save caller's frame pointer. */ + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + xorl %eax, %eax + ret +Index: glibc-2.17-c758a686/ports/sysdeps/m68k/setjmp.c +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/m68k/setjmp.c ++++ glibc-2.17-c758a686/ports/sysdeps/m68k/setjmp.c +@@ -57,7 +57,7 @@ __sigsetjmp (jmp_buf env, int savemask) + : : "m" (env[0].__jmpbuf[0].__fpregs[0])); + #endif + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + return 0; + #else +Index: glibc-2.17-c758a686/sysdeps/mach/hurd/dl-execstack.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/mach/hurd/dl-execstack.c ++++ glibc-2.17-c758a686/sysdeps/mach/hurd/dl-execstack.c +@@ -34,7 +34,7 @@ _dl_make_stack_executable (void **stack_ + return EPERM; + *stack_endp = NULL; + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + if (__mprotect ((void *)_dl_hurd_data->stack_base, _dl_hurd_data->stack_size, + PROT_READ|PROT_WRITE|PROT_EXEC) != 0) + return errno; +Index: glibc-2.17-c758a686/sysdeps/mach/hurd/opendir.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/mach/hurd/opendir.c ++++ glibc-2.17-c758a686/sysdeps/mach/hurd/opendir.c +@@ -82,7 +82,7 @@ __opendirat (int dfd, const char *name) + + int flags = O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC; + int fd; +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + assert (dfd == AT_FDCWD); + fd = open_not_cancel_2 (name, flags); + #else +Index: glibc-2.17-c758a686/sysdeps/posix/getcwd.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/getcwd.c ++++ glibc-2.17-c758a686/sysdeps/posix/getcwd.c +@@ -206,7 +206,7 @@ extern char *alloca (); + + #ifdef __ASSUME_ATFCTS + # define __have_atfcts 1 +-#elif defined IS_IN_rtld ++#elif IS_IN (rtld) + static int __rtld_have_atfcts; + # define __have_atfcts __rtld_have_atfcts + #endif +Index: glibc-2.17-c758a686/sysdeps/posix/opendir.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/opendir.c ++++ glibc-2.17-c758a686/sysdeps/posix/opendir.c +@@ -121,7 +121,7 @@ __opendirat (int dfd, const char *name) + flags |= O_CLOEXEC; + #endif + int fd; +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + assert (dfd == AT_FDCWD); + fd = open_not_cancel_2 (name, flags); + #else +Index: glibc-2.17-c758a686/sysdeps/posix/profil.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/posix/profil.c ++++ glibc-2.17-c758a686/sysdeps/posix/profil.c +@@ -65,7 +65,7 @@ __profil (u_short *sample_buffer, size_t + { + struct sigaction act; + struct itimerval timer; +-#ifndef IS_IN_rtld ++#if !IS_IN (rtld) + static struct sigaction oact; + static struct itimerval otimer; + # define oact_ptr &oact +Index: glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/dl-procinfo.h ++++ glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.h +@@ -166,7 +166,7 @@ _dl_string_platform (const char *str) + return -1; + } + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + static inline int + __attribute__ ((unused)) + _dl_procinfo (unsigned int type, unsigned long int word) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S +@@ -37,7 +37,7 @@ ENTRY (BP_SYM (__longjmp)) + addis r5,r5,_GLOBAL_OFFSET_TABLE_-got_label@ha + addi r5,r5,_GLOBAL_OFFSET_TABLE_-got_label@l + # ifdef SHARED +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + /* Inside ld.so we use the local alias to avoid runtime GOT + relocations. */ + lwz r5,_rtld_local_ro@got(r5) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S +@@ -90,7 +90,7 @@ ENTRY (BP_SYM (__sigsetjmp)) + mtlr r6 + cfi_same_value (lr) + # ifdef SHARED +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + /* Inside ld.so we use the local alias to avoid runtime GOT + relocations. */ + lwz r5,_rtld_local_ro@got(r5) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h +@@ -21,7 +21,7 @@ + the dl_hwcap field. The assembly is to make the compiler not optimize the + test (&_rtld_global_ro != NULL), which is always true in ISO C (but not + in that case since _rtld_global_ro might not been realocated yet). */ +-#if defined(SHARED) && !defined(IS_IN_rtld) ++#if defined(SHARED) && !IS_IN (rtld) + # define __GLRO(value) \ + ({ volatile void **__p = (volatile void**)(&_rtld_global_ro); \ + unsigned long int __ret; \ +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp-common.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/setjmp-common.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp-common.S +@@ -64,7 +64,7 @@ ENTRY (BP_SYM (__sigsetjmp)) + stw r29,((JB_GPRS+15)*4)(3) + stw r30,((JB_GPRS+16)*4)(3) + stw r31,((JB_GPRS+17)*4)(3) +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + li r3,0 + blr + #else +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/__longjmp-common.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S +@@ -31,7 +31,7 @@ + .section ".toc","aw" + .LC__dl_hwcap: + # ifdef SHARED +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + /* Inside ld.so we use the local alias to avoid runtime GOT + relocations. */ + .tc _rtld_local_ro[TC],_rtld_local_ro +@@ -132,7 +132,7 @@ L(no_vmx): + ld r0,(JB_LR*8)(r3) + ld r14,((JB_GPRS+0)*8)(r3) + lfd fp14,((JB_FPRS+0)*8)(r3) +-#if defined SHARED && !defined IS_IN_rtld ++#if defined SHARED && !IS_IN (rtld) + std r2,FRAME_TOC_SAVE(r1) /* Restore the callers TOC save area. */ + #endif + ld r15,((JB_GPRS+1)*8)(r3) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/setjmp-common.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S +@@ -30,7 +30,7 @@ + .section ".toc","aw" + .LC__dl_hwcap: + # ifdef SHARED +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + /* Inside ld.so we use the local alias to avoid runtime GOT + relocations. */ + .tc _rtld_local_ro[TC],_rtld_local_ro +@@ -50,7 +50,7 @@ ENTRY (setjmp) + b JUMPTARGET (GLUE(__sigsetjmp,_ent)) + END (setjmp) + +-#if defined SHARED && !defined IS_IN_rtld && !defined __NO_VMX__ ++#if defined SHARED && !IS_IN (rtld) && !defined __NO_VMX__ + /* When called from within libc we need a special version of _setjmp + that saves r2 since the call won't go via a plt call stub. See + bugz #269. __GI__setjmp is used in csu/libc-start.c when +@@ -82,7 +82,7 @@ JUMPTARGET(GLUE(__sigsetjmp,_ent)): + std r1,(JB_GPR1*8)(3) + #endif + mflr r0 +-#if defined SHARED && !defined IS_IN_rtld ++#if defined SHARED && !IS_IN (rtld) + ld r5,FRAME_TOC_SAVE(r1) /* Retrieve the callers TOC. */ + std r5,(JB_GPR2*8)(3) + #else +@@ -212,7 +212,7 @@ L(no_vmx): + #else + li r6,0 + #endif +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + li r3,0 + blr + #elif defined SHARED +Index: glibc-2.17-c758a686/sysdeps/s390/dl-tls.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/dl-tls.h ++++ glibc-2.17-c758a686/sysdeps/s390/dl-tls.h +@@ -29,7 +29,7 @@ typedef struct + + extern unsigned long __tls_get_offset (unsigned long got_offset); + +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + + # include + +@@ -78,9 +78,9 @@ __tls_get_offset:\n\ + 1: .long __tls_get_addr - 0b\n\ + "); + # endif +-# else /* IS_IN_rtld */ ++# else /* IS_IN (rtld) */ + extern void *__tls_get_addr_internal (tls_index *ti); +-# endif /* !IS_IN_rtld */ ++# endif /* !IS_IN (rtld) */ + + # define GET_ADDR_OFFSET \ + (ti->ti_offset - (unsigned long) __builtin_thread_pointer ()) +Index: glibc-2.17-c758a686/sysdeps/s390/s390-32/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-32/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/setjmp.S +@@ -57,7 +57,7 @@ ENTRY(__sigsetjmp) + #endif + std %f4,40(%r2) + std %f6,48(%r2) +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + lhi %r2,0 + br %r14 +Index: glibc-2.17-c758a686/sysdeps/s390/s390-64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/s390/s390-64/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/setjmp.S +@@ -63,7 +63,7 @@ ENTRY(__sigsetjmp) + std %f13,120(%r2) + std %f14,128(%r2) + std %f15,136(%r2) +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + lghi %r2,0 + br %r14 +Index: glibc-2.17-c758a686/sysdeps/sh/sh3/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sh/sh3/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/sh/sh3/setjmp.S +@@ -46,7 +46,7 @@ ENTRY (__sigsetjmp) + mov.l r9, @-r4 + mov.l r8, @-r4 + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + rts + mov #0, r0 +Index: glibc-2.17-c758a686/sysdeps/sh/sh4/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sh/sh4/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/sh/sh4/setjmp.S +@@ -55,7 +55,7 @@ ENTRY (__sigsetjmp) + mov.l r9, @-r4 + mov.l r8, @-r4 + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + rts + mov #0, r0 +Index: glibc-2.17-c758a686/ports/sysdeps/unix/alpha/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/alpha/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/alpha/sysdep.h +@@ -26,7 +26,7 @@ + # include + #endif + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # include /* Defines RTLD_PRIVATE_ERRNO. */ + #endif + +@@ -346,7 +346,7 @@ __LABEL(name) \ + + #include + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # ifdef __ASSEMBLER__ + # define PTR_MANGLE(dst, src, tmp) \ + ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/arm/sysdep.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/arm/sysdep.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/arm/sysdep.S +@@ -21,7 +21,7 @@ + #define _ERRNO_H + #include + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # include /* Defines RTLD_PRIVATE_ERRNO. */ + #endif + +Index: glibc-2.17-c758a686/sysdeps/unix/i386/sysdep.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/i386/sysdep.S ++++ glibc-2.17-c758a686/sysdeps/unix/i386/sysdep.S +@@ -22,7 +22,7 @@ + #include + #include + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # include /* Defines RTLD_PRIVATE_ERRNO. */ + #endif + +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -324,7 +324,7 @@ + #endif /* __ASSEMBLER__ */ + + /* Pointer mangling is supported for AArch64. */ +-#if (defined IS_IN_rtld) || \ ++#if (IS_IN (rtld)) || \ + (!defined SHARED && (!defined NOT_IN_libc \ + || IS_IN (libpthread))) + # ifdef __ASSEMBLER__ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/getcwd.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/getcwd.c ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/getcwd.c +@@ -33,7 +33,7 @@ + + /* If we compile the file for use in ld.so we don't need the feature + that getcwd() allocates the buffers itself. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # define NO_ALLOCATION 1 + #endif + +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h +@@ -56,7 +56,7 @@ + /* Initialize locks to zero. */ + #define LLL_MUTEX_LOCK_INITIALIZER (0) + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +@@ -71,7 +71,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/i386/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +@@ -521,7 +521,7 @@ asm (".L__X'%ebx = 1\n\t" + + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. Using a global variable + is too complicated here since we have no PC-relative addressing mode. */ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S +@@ -179,7 +179,7 @@ ENTRY(__sigsetjmp) + ;; + st8.nta [r2]=r25 // ar.unat + st8.nta [r3]=in0 // &__jmp_buf +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + ;; + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +@@ -361,7 +361,7 @@ + #endif /* not __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/bits/m68k-vdso.h +@@ -23,7 +23,7 @@ + + #ifdef SHARED + +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + # define M68K_VDSO_SYMBOL(name) __rtld_##name + # define STR_M68K_VDSO_SYMBOL(name) "__rtld_" #name + # else +@@ -35,7 +35,7 @@ + + /* We define __rtld_* copies for rtld. + We need them visible in libc to initialize. */ +-# if defined IS_IN_rtld || !defined NOT_IN_libc ++# if IS_IN (rtld) || !defined NOT_IN_libc + extern void *__rtld___vdso_read_tp; + extern void *__rtld___vdso_atomic_cmpxchg_32; + extern void *__rtld___vdso_atomic_barrier; +@@ -44,14 +44,14 @@ extern void *__rtld___vdso_atomic_barrie + extern void __vdso_read_tp_stub (void); + extern void __vdso_atomic_cmpxchg_32_stub (void); + extern void __vdso_atomic_barrier_stub (void); +-# endif /* IS_IN_rtld || !NOT_IN_libc */ ++# endif /* IS_IN (rtld) || !NOT_IN_libc */ + + /* RTLD should only use its own copies. */ +-# ifndef IS_IN_rtld ++# if !IS_IN (rtld) + extern void *__vdso_read_tp; + extern void *__vdso_atomic_cmpxchg_32; + extern void *__vdso_atomic_barrier; +-# endif /* !IS_IN_rtld */ ++# endif /* !IS_IN (rtld) */ + + # endif /* !__ASSEMBLER__ */ + +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/m68k-helpers.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/m68k-helpers.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/m68k-helpers.S +@@ -51,7 +51,7 @@ END (__vdso_read_tp_stub) + equivalent helper function (which clobbers fewer registers than + a normal function call) in a vdso; tail call to the + helper. */ +-# ifdef IS_IN_rtld ++# if IS_IN (rtld) + /* rtld gets a hidden copy of __m68k_read_tp. */ + .hidden __m68k_read_tp + # endif +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +@@ -272,7 +272,7 @@ + + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +@@ -282,7 +282,7 @@ + + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h +@@ -51,7 +51,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +@@ -367,7 +367,7 @@ + _ret; }) + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +@@ -373,7 +373,7 @@ + _ret; }) + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sh/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sh/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sh/sysdep.h +@@ -338,7 +338,7 @@ + #endif /* __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. Using a global variable + is too complicated here since we have no PC-relative addressing mode. */ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h +@@ -56,7 +56,7 @@ extern void __cpu_relax (void); + #define BUSY_WAIT_NOP __cpu_relax () + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +@@ -22,7 +22,7 @@ + + #include + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # include /* Defines RTLD_PRIVATE_ERRNO. */ + #endif + #include +@@ -126,7 +126,7 @@ ENTRY(name); \ + #endif /* __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +@@ -22,7 +22,7 @@ + + #include + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # include /* Defines RTLD_PRIVATE_ERRNO. */ + #endif + #include +@@ -141,7 +141,7 @@ ENTRY(name); \ + #define STACK_BIAS 2047 + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/sysdep.h +@@ -205,7 +205,7 @@ + #endif /* not __ASSEMBLER__ */ + + /* Pointer mangling support. */ +-#if defined NOT_IN_libc && defined IS_IN_rtld ++#if defined NOT_IN_libc && IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + #else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +@@ -72,7 +72,7 @@ + + #ifndef __ASSEMBLER__ + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/x86_64/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/sysdep.h +@@ -24,7 +24,7 @@ + #include + #include + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # include /* Defines RTLD_PRIVATE_ERRNO. */ + #endif + +@@ -395,7 +395,7 @@ + + + /* Pointer mangling support. */ +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ + # ifdef __ASSEMBLER__ +Index: glibc-2.17-c758a686/sysdeps/unix/x86_64/sysdep.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/x86_64/sysdep.S ++++ glibc-2.17-c758a686/sysdeps/unix/x86_64/sysdep.S +@@ -22,7 +22,7 @@ + #include + #include + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # include /* Defines RTLD_PRIVATE_ERRNO. */ + #endif + +Index: glibc-2.17-c758a686/sysdeps/x86_64/setjmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/setjmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/setjmp.S +@@ -54,7 +54,7 @@ ENTRY (__sigsetjmp) + #endif + movq %rax, (JB_PC*8)(%rdi) + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + xorl %eax, %eax + retq +Index: glibc-2.17-c758a686/include/unistd.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/unistd.h ++++ glibc-2.17-c758a686/include/unistd.h +@@ -151,7 +151,7 @@ libc_hidden_proto (__sbrk) + environment variables that normally affect them. */ + extern int __libc_enable_secure attribute_relro; + extern int __libc_enable_secure_decided; +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + /* XXX The #ifdef should go. */ + extern int __libc_enable_secure_internal attribute_relro attribute_hidden; + #endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h +@@ -27,7 +27,7 @@ + all the libc functions that ld.so uses are called without PLT and always + get the versions linked into ld.so rather than the libc ones. */ + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # define RTLD_PRIVATE_ERRNO 1 + #else + # define RTLD_PRIVATE_ERRNO 0 +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +@@ -52,7 +52,7 @@ + #define LLL_PRIVATE 0 + #define LLL_SHARED FUTEX_PRIVATE_FLAG + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h +@@ -49,7 +49,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +@@ -48,7 +48,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h +@@ -27,7 +27,7 @@ + all the libc functions that ld.so uses are called without PLT and always + get the versions linked into ld.so rather than the libc ones. */ + +-#ifdef IS_IN_rtld ++#if IS_IN (rtld) + # define RTLD_PRIVATE_ERRNO 1 + #else + # define RTLD_PRIVATE_ERRNO 0 +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h +@@ -48,7 +48,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/lowlevellock.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/lowlevellock.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/lowlevellock.h +@@ -50,7 +50,7 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + +-#if !defined NOT_IN_libc || defined IS_IN_rtld ++#if !defined NOT_IN_libc || IS_IN (rtld) + /* In libc.so or ld.so all futexes are private. */ + # ifdef __ASSUME_PRIVATE_FUTEX + # define __lll_private_flag(fl, private) \ diff --git a/SOURCES/glibc-rh1256317-5.patch b/SOURCES/glibc-rh1256317-5.patch new file mode 100644 index 0000000..a5a0ddf --- /dev/null +++ b/SOURCES/glibc-rh1256317-5.patch @@ -0,0 +1,861 @@ +commit a109996ef96b065c8374c486e80ee3bf23c69edd +Author: Siddhesh Poyarekar +Date: Thu Nov 20 21:04:47 2014 +0530 + + Remove IS_IN_libm + + Replace with IS_IN (libm). Generated code unchanged on x86_64. + + * include/math.h: Use IS_IN instead of IS_IN_libm. + * sysdeps/alpha/fpu/s_copysign.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_copysignl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_finitel.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_fmal.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_frexpl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_isinfl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_isnanl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_modfl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_signbitl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_copysignl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_finitel.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_frexpl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_isinfl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_isnanl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_modfl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_scalbnl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/s_signbitl.c: Likewise. + * sysdeps/ieee754/ldbl-64-128/w_scalblnl.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_copysign.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_finite.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_frexp.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_isinf.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_isnan.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_ldexp.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_ldexpl.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_modf.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_scalbln.c: Likewise. + * sysdeps/ieee754/ldbl-opt/s_scalbn.c: Likewise. + * sysdeps/powerpc/power5+/fpu/s_modf.c: Likewise. + * sysdeps/powerpc/powerpc32/fpu/s_copysign.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/s_copysignl.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_copysign.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_finite.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isinf.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_isnan.c: Likewise. + * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_modf.c: Likewise. + * sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc32/power6/fpu/s_copysign.S: Likewise. + * sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S: Likewise. + * sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S: Likewise. + * sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c: Likewise. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c: Likewise. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c: Likewise. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c: Likewise. + * sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c: Likewise. + * sysdeps/powerpc/powerpc64/fpu/s_copysign.S: Likewise. + * sysdeps/powerpc/powerpc64/fpu/s_copysignl.S: Likewise. + * sysdeps/powerpc/powerpc64/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S: Likewise. + * sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S: Likewise. + * sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S: Likewise. + * sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S: Likewise. + * sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S: Likewise. + * sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S: Likewise. + * sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S: Likewise. + * sysdeps/sparc/sparc32/fpu/s_signbitl.S: Likewise. + * sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S: Likewise. + * sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S: Likewise. + +Index: glibc-2.17-c758a686/include/math.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/math.h ++++ glibc-2.17-c758a686/include/math.h +@@ -6,7 +6,7 @@ + /* Now define the internal interfaces. */ + extern int __matherr (struct exception *__exc); + +-# if !defined NOT_IN_libc || defined IS_IN_libm ++# if !defined NOT_IN_libc || IS_IN (libm) + hidden_proto (__finite) + hidden_proto (__isinf) + hidden_proto (__isnan) +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c +@@ -34,7 +34,7 @@ long double __copysignl(long double x, l + return x; + } + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __copysignl, copysignl); + #else + long_double_symbol (libc, __copysignl, copysignl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_finitel.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_finitel.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_finitel.c +@@ -40,7 +40,7 @@ ___finitel (long double x) + } + hidden_ver (___finitel, __finitel) + weak_alias (___finitel, ____finitel) +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, ____finitel, finitel); + long_double_symbol (libm, ___finitel, __finitel); + #else +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fmal.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_fmal.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fmal.c +@@ -37,7 +37,7 @@ __fmal (long double x, long double y, lo + + return (x * y) + z; + } +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __fmal, fmal); + #else + long_double_symbol (libc, __fmal, fmal); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c +@@ -141,7 +141,7 @@ long double __frexpl(long double x, int + *eptr = expon; + return x; + } +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __frexpl, frexpl); + #else + long_double_symbol (libc, __frexpl, frexpl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinfl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_isinfl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinfl.c +@@ -33,7 +33,7 @@ ___isinfl (long double x) + return ~mask & (hx >> 62); + } + hidden_ver (___isinfl, __isinfl) +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + weak_alias (___isinfl, ____isinfl) + long_double_symbol (libc, ___isinfl, isinfl); + long_double_symbol (libc, ____isinfl, __isinfl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isnanl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_isnanl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isnanl.c +@@ -39,7 +39,7 @@ ___isnanl (long double x) + return (int) (hx >> 63); + } + hidden_ver (___isnanl, __isnanl) +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + weak_alias (___isnanl, ____isnanl) + long_double_symbol (libc, ___isnanl, isnanl); + long_double_symbol (libc, ____isnanl, __isnanl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_modfl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c +@@ -89,7 +89,7 @@ long double __modfl(long double x, long + } + } + } +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __modfl, modfl); + #else + long_double_symbol (libc, __modfl, modfl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c +@@ -102,7 +102,7 @@ long double __scalbnl (long double x, in + x = ldbl_pack (xhi, xlo); + return x*twolm54; + } +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __scalbnl, scalbnl); + #else + long_double_symbol (libc, __scalbnl, scalbnl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_signbitl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-128ibm/s_signbitl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_signbitl.c +@@ -31,7 +31,7 @@ ___signbitl (long double x) + EXTRACT_WORDS64 (e, xhi); + return e < 0; + } +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, ___signbitl, __signbitl); + #else + long_double_symbol (libc, ___signbitl, __signbitl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_copysignl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_copysignl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_copysignl.c +@@ -2,7 +2,7 @@ + #undef weak_alias + #define weak_alias(n,a) + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __copysignl, copysignl); + #else + long_double_symbol (libc, __copysignl, copysignl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_finitel.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_finitel.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_finitel.c +@@ -8,7 +8,7 @@ + #undef __finitel + hidden_ver (___finitel, __finitel) + _weak_alias (___finitel, ____finitel) +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, ____finitel, finitel); + long_double_symbol (libm, ___finitel, __finitel); + #else +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_frexpl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_frexpl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_frexpl.c +@@ -2,7 +2,7 @@ + #undef weak_alias + #define weak_alias(n,a) + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __frexpl, frexpl); + #else + long_double_symbol (libc, __frexpl, frexpl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_isinfl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_isinfl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_isinfl.c +@@ -1,5 +1,5 @@ + #include +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # undef weak_alias + # define weak_alias(n,a) + # undef hidden_def +@@ -7,7 +7,7 @@ + # define __isinfl(arg) ___isinfl(arg) + #endif + #include +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # undef __isinfl + hidden_ver (___isinfl, __isinfl) + _weak_alias (___isinfl, ____isinfl) +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_isnanl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_isnanl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_isnanl.c +@@ -1,5 +1,5 @@ + #include +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # undef weak_alias + # define weak_alias(n,a) + # undef hidden_def +@@ -7,7 +7,7 @@ + # define __isnanl(arg) ___isnanl(arg) + #endif + #include +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # undef __isnanl + hidden_ver (___isnanl, __isnanl) + _weak_alias (___isnanl, ____isnanl) +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_modfl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_modfl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_modfl.c +@@ -2,7 +2,7 @@ + #undef weak_alias + #define weak_alias(n,a) + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __modfl, modfl); + #else + long_double_symbol (libc, __modfl, modfl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_scalbnl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_scalbnl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_scalbnl.c +@@ -2,7 +2,7 @@ + #undef weak_alias + #define weak_alias(n,a) + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __scalbnl, scalbnl); + #else + long_double_symbol (libc, __scalbnl, scalbnl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_signbitl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_signbitl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_signbitl.c +@@ -4,7 +4,7 @@ + #define __signbitl(arg) ___signbitl(arg) + #include + #undef __signbitl +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, ___signbitl, __signbitl); + #else + long_double_symbol (libc, ___signbitl, __signbitl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_copysign.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_copysign.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_copysign.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __copysign, copysignl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_finite.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_finite.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_finite.c +@@ -1,7 +1,7 @@ + #include + #include + weak_alias (__finite, ___finite) +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1) + compat_symbol (libm, __finite, __finitel, GLIBC_2_1); + # endif +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_frexp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_frexp.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_frexp.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __frexp, frexpl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_isinf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_isinf.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_isinf.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); + compat_symbol (libc, isinf, isinfl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_isnan.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_isnan.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_isnan.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_ldexp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_ldexp.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_ldexp.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __ldexp, ldexpl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_ldexpl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_ldexpl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_ldexpl.c +@@ -2,7 +2,7 @@ + #undef weak_alias + #define weak_alias(n,a) + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __ldexpl, ldexpl); + #else + long_double_symbol (libc, __ldexpl, ldexpl); +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_modf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_modf.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_modf.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __modf, modfl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_scalbln.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_scalbln.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_scalbln.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + #if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1) + compat_symbol (libm, __scalbln, scalblnl, GLIBC_2_1); + #endif +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_scalbn.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-opt/s_scalbn.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-opt/s_scalbn.c +@@ -1,6 +1,6 @@ + #include + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __scalbn, scalbnl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/power5+/fpu/s_modf.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/power5+/fpu/s_modf.c +@@ -49,7 +49,7 @@ weak_alias (__modf, modf) + strong_alias (__modf, __modfl) + weak_alias (__modf, modfl) + #endif +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __modf, modfl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysign.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/fpu/s_copysign.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysign.S +@@ -50,7 +50,7 @@ strong_alias(__copysign,__copysignf) + weak_alias (__copysign,copysignl) + strong_alias(__copysign,__copysignl) + #endif +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __copysign, copysignl, GLIBC_2_0) + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysignl.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/fpu/s_copysignl.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysignl.S +@@ -42,7 +42,7 @@ L(0): bgelr cr6 + blr + END (__copysignl) + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __copysignl, copysignl) + #else + long_double_symbol (libc, __copysignl, copysignl) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_isnan.S +@@ -48,7 +48,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S +@@ -52,7 +52,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_copysign.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power6/fpu/s_copysign.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_copysign.S +@@ -47,7 +47,7 @@ strong_alias (__copysign, __copysignl) + weak_alias (__copysign, copysignl) + #endif + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0) + compat_symbol (libm, copysign, copysignl, GLIBC_2_0) + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S +@@ -52,7 +52,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S +@@ -78,7 +78,7 @@ strong_alias (__finite, __finitel) + weak_alias (__finite, finitel) + #endif + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0) + compat_symbol (libm, finite, finitel, GLIBC_2_0) + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S +@@ -77,7 +77,7 @@ strong_alias (__isinf, __isinfl) + weak_alias (__isinf, isinfl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); + compat_symbol (libc, isinf, isinfl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S +@@ -82,7 +82,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_copysign.c +@@ -42,7 +42,7 @@ weak_alias (__copysign, copysign) + weak_alias (__copysign,copysignl) + strong_alias(__copysign,__copysignl) + #endif +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __copysign, copysignl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c +@@ -39,7 +39,7 @@ strong_alias (__finite, __finitel) + weak_alias (__finite, finitel) + #endif + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0) + compat_symbol (libm, finite, finitel, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c +@@ -39,7 +39,7 @@ strong_alias (__isinf, __isinfl) + weak_alias (__isinf, isinfl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0) + compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); + compat_symbol (libc, isinf, isinfl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c +@@ -48,7 +48,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/multiarch/s_modf.c +@@ -35,7 +35,7 @@ weak_alias (__modf, modf) + strong_alias (__modf, __modfl) + weak_alias (__modf, modfl) + #endif +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __modf, modfl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysign.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/s_copysign.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysign.S +@@ -50,7 +50,7 @@ strong_alias(__copysign,__copysignf) + weak_alias (__copysign,copysignl) + strong_alias(__copysign,__copysignl) + #endif +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __copysign, copysignl, GLIBC_2_0) + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysignl.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/s_copysignl.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysignl.S +@@ -43,7 +43,7 @@ L(0): + blr + END (__copysignl) + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __copysignl, copysignl) + #else + long_double_symbol (libc, __copysignl, copysignl) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_isnan.S +@@ -47,7 +47,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power5/fpu/s_isnan.S +@@ -51,7 +51,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/fpu/s_copysign.S +@@ -47,7 +47,7 @@ strong_alias (__copysign, __copysignl) + weak_alias (__copysign, copysignl) + #endif + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0) + compat_symbol (libm, copysign, copysignl, GLIBC_2_0) + # endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/fpu/s_isnan.S +@@ -50,7 +50,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6x/fpu/s_isnan.S +@@ -49,7 +49,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S +@@ -57,7 +57,7 @@ strong_alias (__finite, __finitef) + hidden_def (__finitef) + weak_alias (__finitef, finitef) + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0) + compat_symbol (libm, __finite, __finitel, GLIBC_2_0) + compat_symbol (libm, finite, finitel, GLIBC_2_0) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S +@@ -61,7 +61,7 @@ strong_alias (__isinf, __isinfl) + weak_alias (__isinf, isinfl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); + compat_symbol (libc, isinf, isinfl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isnan.S +@@ -60,7 +60,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power8/fpu/s_finite.S +@@ -43,7 +43,7 @@ strong_alias (__finite, __finitef) + hidden_def (__finitef) + weak_alias (__finitef, finitef) + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0) + compat_symbol (libm, __finite, __finitel, GLIBC_2_0) + compat_symbol (libm, finite, finitel, GLIBC_2_0) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power8/fpu/s_isinf.S +@@ -53,7 +53,7 @@ strong_alias (__isinf, __isinfl) + weak_alias (__isinf, isinfl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); + compat_symbol (libc, isinf, isinfl, GLIBC_2_0); +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power8/fpu/s_isnan.S +@@ -45,7 +45,7 @@ strong_alias (__isnan, __isnanl) + weak_alias (__isnan, isnanl) + #endif + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); +Index: glibc-2.17-c758a686/ports/sysdeps/alpha/fpu/s_copysign.c +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/alpha/fpu/s_copysign.c ++++ glibc-2.17-c758a686/ports/sysdeps/alpha/fpu/s_copysign.c +@@ -30,7 +30,7 @@ weak_alias (__copysign, copysign) + strong_alias (__copysign, __copysignl) + weak_alias (__copysign, copysignl) + #endif +-#ifdef IS_IN_libm ++#if IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) + compat_symbol (libm, __copysign, copysignl, GLIBC_2_0); + # endif +Index: glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_scalblnl.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/ieee754/ldbl-64-128/s_scalblnl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-64-128/s_scalblnl.c +@@ -2,7 +2,7 @@ + #undef weak_alias + #define weak_alias(n,a) + #include +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, __scalblnl, scalblnl); + #else + long_double_symbol (libc, __scalblnl, scalblnl); +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc32/fpu/s_signbitl.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc32/fpu/s_signbitl.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc32/fpu/s_signbitl.S +@@ -25,7 +25,7 @@ ENTRY (___signbitl) + srl %o1, 31, %o0 + END (___signbitl) + +-#ifdef IS_IN_libm ++#if IS_IN (libm) + long_double_symbol (libm, ___signbitl, __signbitl); + #else + long_double_symbol (libc, ___signbitl, __signbitl); +Index: glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S +@@ -32,7 +32,7 @@ END (__isnan) + hidden_def (__isnan) + weak_alias (__isnan, isnan) + +-#ifndef IS_IN_libm ++#if !IS_IN (libm) + # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) + compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); + compat_symbol (libc, isnan, isnanl, GLIBC_2_0); diff --git a/SOURCES/glibc-rh1256317-6.patch b/SOURCES/glibc-rh1256317-6.patch new file mode 100644 index 0000000..2a1ce72 --- /dev/null +++ b/SOURCES/glibc-rh1256317-6.patch @@ -0,0 +1,914 @@ +commit ce9f10f7f0cc83df3e307a18e480587c3b404321 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 14:22:40 2014 +0530 + + Remove IS_IN_libpthread + + Replace with IS_IN (libpthread). Generated code unchanged on + x86_64. + + * nptl/lowlevellock.c: Use IS_IN instead of IS_IN_libpthread. + * nptl/pthreadP.h: Likewise. + * nptl_db/structs.def: Likewise. + * sysdeps/arm/sysdep.h: Likewise. + * sysdeps/nptl/bits/libc-lock.h: Likewise. + * sysdeps/nptl/bits/libc-lockP.h: Likewise. + * sysdeps/sparc/sparc32/lowlevellock.c: Likewise. + * sysdeps/unix/alpha/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/not-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/tile/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/tile/waitpid.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. + +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/lowlevellock.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/lowlevellock.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/lowlevellock.c +@@ -37,7 +37,7 @@ __lll_lock_wait_private (int *futex) + + + /* These functions don't get included in libc.so */ +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + void + __lll_lock_wait (int *futex, int private) + { +Index: glibc-2.17-c758a686/nptl/pthreadP.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/pthreadP.h ++++ glibc-2.17-c758a686/nptl/pthreadP.h +@@ -225,7 +225,7 @@ extern int __pthread_debug attribute_hid + + extern void __pthread_unwind (__pthread_unwind_buf_t *__buf) + __cleanup_fct_attribute __attribute ((__noreturn__)) +-#if !defined SHARED && !defined IS_IN_libpthread ++#if !defined SHARED && !IS_IN (libpthread) + weak_function + #endif + ; +@@ -239,7 +239,7 @@ extern void __pthread_register_cancel (_ + __cleanup_fct_attribute; + extern void __pthread_unregister_cancel (__pthread_unwind_buf_t *__buf) + __cleanup_fct_attribute; +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + hidden_proto (__pthread_unwind) + hidden_proto (__pthread_unwind_next) + hidden_proto (__pthread_register_cancel) +@@ -283,7 +283,7 @@ __do_cancel (void) + # define LIBC_CANCEL_HANDLED() \ + __asm (".globl " __SYMBOL_PREFIX "__libc_enable_asynccancel"); \ + __asm (".globl " __SYMBOL_PREFIX "__libc_disable_asynccancel") +-#elif defined IS_IN_libpthread ++#elif IS_IN (libpthread) + # define LIBC_CANCEL_ASYNC() CANCEL_ASYNC () + # define LIBC_CANCEL_RESET(val) CANCEL_RESET (val) + # define LIBC_CANCEL_HANDLED() \ +@@ -344,7 +344,7 @@ extern int __make_stacks_executable (voi + + /* longjmp handling. */ + extern void __pthread_cleanup_upto (__jmp_buf target, char *targetframe); +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + hidden_proto (__pthread_cleanup_upto) + #endif + +@@ -489,7 +489,7 @@ extern int __pthread_enable_asynccancel + extern void __pthread_disable_asynccancel (int oldtype) + internal_function attribute_hidden; + +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + hidden_proto (__pthread_mutex_init) + hidden_proto (__pthread_mutex_destroy) + hidden_proto (__pthread_mutex_lock) +@@ -528,7 +528,7 @@ extern int __librt_enable_asynccancel (v + extern void __librt_disable_asynccancel (int oldtype) + internal_function attribute_hidden; + +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + /* Special versions which use non-exported functions. */ + extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer, + void (*routine) (void *), void *arg) +Index: glibc-2.17-c758a686/nptl_db/structs.def +=================================================================== +--- glibc-2.17-c758a686.orig/nptl_db/structs.def ++++ glibc-2.17-c758a686/nptl_db/structs.def +@@ -31,7 +31,7 @@ + #endif + + #ifndef DB_RTLD_GLOBAL_FIELD +-# if !defined IS_IN_libpthread ++# if !IS_IN (libpthread) + # define DB_RTLD_GLOBAL_FIELD(field) \ + DB_STRUCT_FIELD (rtld_global, _##field) \ + DB_MAIN_VARIABLE (_##field) +@@ -98,11 +98,11 @@ DB_STRUCT_ARRAY_FIELD (dtv, dtv) + #define pointer_val pointer.val /* Field of anonymous struct in dtv_t. */ + DB_STRUCT_FIELD (dtv_t, pointer_val) + DB_STRUCT_FIELD (dtv_t, counter) +-#if !defined IS_IN_libpthread || TLS_TCB_AT_TP ++#if !IS_IN (libpthread) || TLS_TCB_AT_TP + DB_STRUCT_FIELD (pthread, dtvp) + #endif + +-#if !(defined IS_IN_libpthread && !defined SHARED) ++#if !(IS_IN (libpthread) && !defined SHARED) + DB_STRUCT (rtld_global) + DB_RTLD_VARIABLE (_rtld_global) + #endif +Index: glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lock.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/pthread/bits/libc-lock.h ++++ glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lock.h +@@ -26,7 +26,7 @@ + + /* Mutex type. */ + #if defined _LIBC || defined _IO_MTSAFE_IO +-# if (defined NOT_IN_libc && !defined IS_IN_libpthread) || !defined _LIBC ++# if (defined NOT_IN_libc && !IS_IN (libpthread)) || !defined _LIBC + typedef struct { pthread_mutex_t mutex; } __libc_lock_recursive_t; + # else + typedef struct { int lock; int cnt; void *owner; } __libc_lock_recursive_t; +@@ -47,7 +47,7 @@ typedef struct __libc_lock_recursive_opa + + /* Define an initialized recursive lock variable NAME with storage + class CLASS. */ +-#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) ++#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) + # if LLL_LOCK_INITIALIZER == 0 + # define __libc_lock_define_initialized_recursive(CLASS,NAME) \ + CLASS __libc_lock_recursive_t NAME; +@@ -65,7 +65,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Initialize a recursive mutex. */ +-#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) ++#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) + # define __libc_lock_init_recursive(NAME) \ + ((NAME) = (__libc_lock_recursive_t) _LIBC_LOCK_RECURSIVE_INITIALIZER, 0) + #else +@@ -83,7 +83,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Finalize recursive named lock. */ +-#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) ++#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) + # define __libc_lock_fini_recursive(NAME) ((void) 0) + #else + # define __libc_lock_fini_recursive(NAME) \ +@@ -91,7 +91,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Lock the recursive named lock variable. */ +-#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) ++#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) + # define __libc_lock_lock_recursive(NAME) \ + do { \ + void *self = THREAD_SELF; \ +@@ -108,7 +108,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Try to lock the recursive named lock variable. */ +-#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) ++#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) + # define __libc_lock_trylock_recursive(NAME) \ + ({ \ + int result = 0; \ +@@ -133,7 +133,7 @@ typedef struct __libc_lock_recursive_opa + #endif + + /* Unlock the recursive named lock variable. */ +-#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) ++#if defined _LIBC && (!defined NOT_IN_libc || IS_IN (libpthread)) + /* We do no error checking here. */ + # define __libc_lock_unlock_recursive(NAME) \ + do { \ +Index: glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lockP.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/pthread/bits/libc-lockP.h ++++ glibc-2.17-c758a686/nptl/sysdeps/pthread/bits/libc-lockP.h +@@ -35,7 +35,7 @@ + #include + + /* Mutex type. */ +-#if defined NOT_IN_libc && !defined IS_IN_libpthread ++#if defined NOT_IN_libc && !IS_IN (libpthread) + typedef pthread_mutex_t __libc_lock_t; + #else + typedef int __libc_lock_t; +@@ -69,7 +69,7 @@ typedef pthread_key_t __libc_key_t; + initialized locks must be set to one due to the lack of normal + atomic operations.) */ + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread ++#if !defined NOT_IN_libc || IS_IN (libpthread) + # if LLL_LOCK_INITIALIZER == 0 + # define __libc_lock_define_initialized(CLASS,NAME) \ + CLASS __libc_lock_t NAME; +@@ -130,7 +130,7 @@ typedef pthread_key_t __libc_key_t; + + /* Initialize the named lock variable, leaving it in a consistent, unlocked + state. */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread ++#if !defined NOT_IN_libc || IS_IN (libpthread) + # define __libc_lock_init(NAME) ((NAME) = LLL_LOCK_INITIALIZER, 0) + #else + # define __libc_lock_init(NAME) \ +@@ -149,7 +149,7 @@ typedef pthread_key_t __libc_key_t; + /* Finalize the named lock variable, which must be locked. It cannot be + used again until __libc_lock_init is called again on it. This must be + called on a lock variable before the containing storage is reused. */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread ++#if !defined NOT_IN_libc || IS_IN (libpthread) + # define __libc_lock_fini(NAME) ((void) 0) + #else + # define __libc_lock_fini(NAME) \ +@@ -163,7 +163,7 @@ typedef pthread_key_t __libc_key_t; + #endif + + /* Lock the named lock variable. */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread ++#if !defined NOT_IN_libc || IS_IN (libpthread) + # ifndef __libc_lock_lock + # define __libc_lock_lock(NAME) \ + ({ lll_lock (NAME, LLL_PRIVATE); 0; }) +@@ -179,7 +179,7 @@ typedef pthread_key_t __libc_key_t; + __libc_ptf_call (__pthread_rwlock_wrlock, (&(NAME)), 0) + + /* Try to lock the named lock variable. */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread ++#if !defined NOT_IN_libc || IS_IN (libpthread) + # ifndef __libc_lock_trylock + # define __libc_lock_trylock(NAME) \ + lll_trylock (NAME) +@@ -198,7 +198,7 @@ typedef pthread_key_t __libc_key_t; + __libc_maybe_call (__pthread_mutex_trylock, (&(NAME).mutex), 0) + + /* Unlock the named lock variable. */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread ++#if !defined NOT_IN_libc || IS_IN (libpthread) + # define __libc_lock_unlock(NAME) \ + lll_unlock (NAME, LLL_PRIVATE) + #else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -81,7 +81,7 @@ ENTRY (name); \ + # define UNDOCARGS_5 UNDOCARGS_3; ldp x3, x4, [sp, 32] + # define UNDOCARGS_6 UNDOCARGS_4; ldp x4, x5, [sp, 40] + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE bl __pthread_enable_asynccancel + # define CDISABLE bl __pthread_disable_asynccancel + # define __local_multiple_threads __pthread_multiple_threads +@@ -96,7 +96,7 @@ ENTRY (name); \ + # error Unsupported library + # endif + +-# if defined IS_IN_libpthread || !defined NOT_IN_libc ++# if IS_IN (libpthread) || !defined NOT_IN_libc + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -326,7 +326,7 @@ + /* Pointer mangling is supported for AArch64. */ + #if (defined IS_IN_rtld) || \ + (!defined SHARED && (!defined NOT_IN_libc \ +- || defined IS_IN_libpthread)) ++ || IS_IN (libpthread))) + # ifdef __ASSEMBLER__ + # define PTR_MANGLE(dst, src, guard, tmp) \ + LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + /* NOTE: We do mark syscalls with unwind annotations, for the benefit of + cancellation; but they're really only accurate at the point of the +@@ -186,7 +186,7 @@ + # define RESTORE_LR_6 \ + RESTORE_LR_0 + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE bl PLTJMP(__pthread_enable_asynccancel) + # define CDISABLE bl PLTJMP(__pthread_disable_asynccancel) + # define __local_multiple_threads __pthread_multiple_threads +@@ -201,7 +201,7 @@ + # error Unsupported library + # endif + +-# if defined IS_IN_libpthread || !defined NOT_IN_libc ++# if IS_IN (libpthread) || !defined NOT_IN_libc + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -108,7 +108,7 @@ + # define _POPCARGS_6 _POPCARGS_5; popl %ebp; \ + cfi_adjust_cfa_offset (-4); cfi_restore (ebp); + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel; + # define CDISABLE call __pthread_disable_asynccancel + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/i386/sysdep.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/sysdep.h +@@ -36,7 +36,7 @@ + #define SYS_ify(syscall_name) __NR_##syscall_name + + #if defined USE_DL_SYSINFO \ +- && (!defined NOT_IN_libc || defined IS_IN_libpthread) ++ && (!defined NOT_IN_libc || IS_IN (libpthread)) + # define I386_USE_SYSENTER 1 + #else + # undef I386_USE_SYSENTER +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/not-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/not-cancel.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/not-cancel.h +@@ -27,7 +27,7 @@ + INLINE_SYSCALL (open, 2, (const char *) (name), (flags)) + + /* Uncancelable openat. */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + extern int __openat_nocancel (int fd, const char *fname, int oflag, + mode_t mode) attribute_hidden; + extern int __openat64_nocancel (int fd, const char *fname, int oflag, +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -81,7 +81,7 @@ + # define DOCARGS_6 stw 8,40(1); DOCARGS_5 + # define UNDOCARGS_6 lwz 8,40(1); UNDOCARGS_5 + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE bl __pthread_enable_asynccancel@local + # define CDISABLE bl __pthread_disable_asynccancel@local + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # ifdef HAVE_ASM_GLOBAL_DOT_NAME + # define DASHDASHPFX(str) .__##str +@@ -99,7 +99,7 @@ + # define DOCARGS_6 std 8,CANCEL_PARM_SAVE+40(1); DOCARGS_5 + # define UNDOCARGS_6 ld 8,CANCEL_PARM_SAVE+40(1); UNDOCARGS_5 + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # ifdef SHARED + # define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel) + # define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -75,7 +75,7 @@ L(pseudo_check): \ + .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \ + L(pseudo_end): + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE __pthread_enable_asynccancel + # define CDISABLE __pthread_disable_asynccancel + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -69,7 +69,7 @@ L(pseudo_check): \ + .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \ + L(pseudo_end): + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE __pthread_enable_asynccancel + # define CDISABLE __pthread_disable_asynccancel + # define __local_multiple_threads __pthread_multiple_threads +@@ -111,7 +111,7 @@ L(pseudo_end): + #define LR7_6 lg %r7,56+160(%r15); \ + cfi_restore (%r7); + +-# if defined IS_IN_libpthread || !defined NOT_IN_libc ++# if IS_IN (libpthread) || !defined NOT_IN_libc + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S +@@ -21,7 +21,7 @@ + #include + #include "lowlevellock.h" + +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + # ifdef SHARED + # define __pthread_unwind __GI___pthread_unwind + # endif +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + /* The code to disable cancellation depends on the fact that the called + functions are special. They don't modify registers other than %rax +@@ -59,7 +59,7 @@ + jae SYSCALL_ERROR_LABEL + + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel; + # define CDISABLE call __pthread_disable_asynccancel; + # define __local_multiple_threads __pthread_multiple_threads +@@ -74,7 +74,7 @@ + # error Unsupported library + # endif + +-# if defined IS_IN_libpthread || !defined NOT_IN_libc ++# if IS_IN (libpthread) || !defined NOT_IN_libc + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h +@@ -19,7 +19,7 @@ + + #include + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + extern int __open_nocancel (const char *, int, ...) attribute_hidden; + extern int __close_nocancel (int) attribute_hidden; + extern int __read_nocancel (int, void *, size_t) attribute_hidden; +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c +@@ -35,7 +35,7 @@ __lll_lock_wait_private (int *futex) + + + /* These functions don't get included in libc.so */ +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + void + __lll_lock_wait (int *futex, int private) + { +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # define _IMM12 #-12 + # define _IMM16 #-16 +@@ -105,7 +105,7 @@ + # define LOAD_ARGS_5 LOAD_ARGS_4 + # define LOAD_ARGS_6 LOAD_ARGS_5 + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define __local_enable_asynccancel __pthread_enable_asynccancel + # define __local_disable_asynccancel __pthread_disable_asynccancel + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c +@@ -37,7 +37,7 @@ __lll_lock_wait_private (int *futex) + + + /* These functions don't get included in libc.so */ +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + void + __lll_lock_wait (int *futex, int private) + { +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -68,7 +68,7 @@ __##syscall_name##_nocancel: \ + restore %g0, %l1, %o0; + + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel + # define CDISABLE call __pthread_disable_asynccancel + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -66,7 +66,7 @@ __##syscall_name##_nocancel: \ + 2: jmpl %i7 + 8, %g0; \ + restore %g0, %l1, %o0; + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel + # define CDISABLE call __pthread_disable_asynccancel + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + /* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END + besides "ret". */ +@@ -105,7 +105,7 @@ __LABEL($multi_error) \ + # define LOAD_ARGS_5 LOAD_ARGS_4; ldq a4, 40(sp) + # define LOAD_ARGS_6 LOAD_ARGS_5; ldq a5, 48(sp) + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define __local_enable_asynccancel __pthread_enable_asynccancel + # define __local_disable_asynccancel __pthread_disable_asynccancel + # define __local_multiple_threads __pthread_multiple_threads +@@ -128,7 +128,7 @@ __LABEL($multi_error) \ + # define CDISABLE jsr ra, __local_disable_asynccancel; ldgp ra, 0(gp) + # endif + +-# if defined IS_IN_libpthread || !defined NOT_IN_libc ++# if IS_IN (libpthread) || !defined NOT_IN_libc + # ifndef __ASSEMBLER__ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -79,7 +79,7 @@ + # define LOAD_ARGS_5 LOAD_ARGS_4 + # define LOAD_ARGS_6 LOAD_ARGS_5 + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE call __pthread_enable_asynccancel,[],0; + # define CDISABLE call __pthread_disable_asynccancel,[],0; + # elif IS_IN (librt) +@@ -105,7 +105,7 @@ + + #if !defined NOT_IN_libc + # define __local_multiple_threads __libc_multiple_threads +-#elif defined IS_IN_libpthread ++#elif IS_IN (libpthread) + # define __local_multiple_threads __pthread_multiple_threads + #else + # define __local_multiple_threads __librt_multiple_threads +@@ -118,7 +118,7 @@ + p_header.data.multiple_threads) == 0, 1) + # else + extern int __local_multiple_threads +-# if !defined NOT_IN_libc || defined IS_IN_libpthread ++# if !defined NOT_IN_libc || IS_IN (libpthread) + attribute_hidden; + # else + ; +@@ -130,7 +130,7 @@ extern int __local_multiple_threads + # define SINGLE_THREAD_P \ + mov (+__local_multiple_threads),d0; \ + cmp 0,d0 +-# elif !defined NOT_IN_libc || defined IS_IN_libpthread ++# elif !defined NOT_IN_libc || IS_IN (libpthread) + # define SINGLE_THREAD_P \ + movm [a2],(sp); \ + 1: mov pc,a2; \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c +@@ -85,7 +85,7 @@ __lll_timedlock_wait (lll_lock_t *futex, + + + /* These don't get included in libc.so */ +-#ifdef IS_IN_libpthread ++#if IS_IN (libpthread) + int + lll_unlock_wake_cb (lll_lock_t *futex) + { +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # ifndef NO_ERROR + # define NO_ERROR -0x1000 +@@ -204,7 +204,7 @@ L(pre_end): ASM_LINE_SEP \ + # define POPARGS_6 POPARGS_5 ldw -56(%sr0,%sp), %r21 ASM_LINE_SEP \ + .cfi_restore 21 ASM_LINE_SEP + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # ifdef PIC + # define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \ + bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP +@@ -244,7 +244,7 @@ L(pre_end): ASM_LINE_SEP \ + # error Unsupported library + # endif + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define __local_multiple_threads __pthread_multiple_threads + # elif !defined NOT_IN_libc + # define __local_multiple_threads __libc_multiple_threads +@@ -271,7 +271,7 @@ L(pre_end): ASM_LINE_SEP \ + # define NO_CANCELLATION 1 + + #endif +-/* !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) */ ++/* !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) */ + + #ifndef __ASSEMBLER__ + # define RTLD_SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + +@@ -160,7 +160,7 @@ __GC_##name: \ + # undef PSEUDO_END + # define PSEUDO_END(name) .endp + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE br.call.sptk.many b0 = __pthread_enable_asynccancel + # define CDISABLE br.call.sptk.many b0 = __pthread_disable_asynccancel + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -100,7 +100,7 @@ + # define PSEUDO_JMP(sym) jbsr sym + # endif + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel) + # elif !defined NOT_IN_libc +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h +@@ -27,7 +27,7 @@ + happen before any instructions. So we use cfi_same_value instead of + cfi_restore. */ + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + #ifdef __PIC__ + # undef PSEUDO +@@ -146,7 +146,7 @@ + # define SAVESTK PTR_SUBU sp, STKSPACE; cfi_adjust_cfa_offset(STKSPACE) + # define RESTORESTK PTR_ADDU sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE) + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE PTR_LA t9, __pthread_enable_asynccancel; jalr t9 + # define CDISABLE PTR_LA t9, __pthread_disable_asynccancel; jalr t9 + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + # ifdef __PIC__ + # define PSEUDO_CPLOAD .cpload t9; +@@ -152,7 +152,7 @@ + # define PSEUDO_JMP(sym) jal sym; + # endif + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel) + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + /* Allow hacking in some extra code if desired. */ + #ifndef PSEUDO_EXTRA +@@ -117,7 +117,7 @@ + + # define STKSPACE (13 * REGSIZE) + +-# ifdef IS_IN_libpthread ++# if IS_IN (libpthread) + # define CENABLE jal __pthread_enable_asynccancel + # define CDISABLE jal __pthread_disable_asynccancel + # elif IS_IN (librt) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S +@@ -1,7 +1,7 @@ + /* + extern pid_t __waitpid_nocancel (pid_t, int *, int) attribute_hidden; + */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) ++#if !defined NOT_IN_libc || IS_IN (libpthread) || IS_IN (librt) + + /* Call __NR_wait4, providing fourth argument (struct rusage *) as NULL. */ + #define PSEUDO_EXTRA move r3, zero; +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/sysdep.h +@@ -45,7 +45,7 @@ + #ifndef PIC + /* For static code, on error jump to __syscall_error directly. */ + # define SYSCALL_ERROR_NAME __syscall_error +-#elif !defined NOT_IN_libc || defined IS_IN_libpthread ++#elif !defined NOT_IN_libc || IS_IN (libpthread) + /* Use the internal name for libc/libpthread shared objects. */ + # define SYSCALL_ERROR_NAME __GI___syscall_error + #else diff --git a/SOURCES/glibc-rh1256317-7.patch b/SOURCES/glibc-rh1256317-7.patch new file mode 100644 index 0000000..ef5ceac --- /dev/null +++ b/SOURCES/glibc-rh1256317-7.patch @@ -0,0 +1,546 @@ +commit 016afc75cd45dfaf49c0aa7a9befda77ab933846 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 13:26:25 2014 +0530 + + Remove IS_IN_librt + + Replace with IS_IN (librt). Generated code unchanged on x86_64 + + * include/mqueue.h: Use IS_IN instead of IS_IN_librt. + * nptl/pthreadP.h: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/not-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/tile/waitpid.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. + +Index: glibc-2.17-c758a686/include/mqueue.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/mqueue.h ++++ glibc-2.17-c758a686/include/mqueue.h +@@ -1,6 +1,6 @@ + #include + +-#ifdef IS_IN_librt ++#if IS_IN (librt) + hidden_proto (mq_timedsend) + hidden_proto (mq_timedreceive) + hidden_proto (mq_setattr) +Index: glibc-2.17-c758a686/nptl/pthreadP.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/pthreadP.h ++++ glibc-2.17-c758a686/nptl/pthreadP.h +@@ -289,7 +289,7 @@ __do_cancel (void) + # define LIBC_CANCEL_HANDLED() \ + __asm (".globl " __SYMBOL_PREFIX "__pthread_enable_asynccancel"); \ + __asm (".globl " __SYMBOL_PREFIX "__pthread_disable_asynccancel") +-#elif defined IS_IN_librt ++#elif IS_IN (librt) + # define LIBC_CANCEL_ASYNC() \ + __librt_enable_asynccancel () + # define LIBC_CANCEL_RESET(val) \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -89,7 +89,7 @@ ENTRY (name); \ + # define CENABLE bl __libc_enable_asynccancel + # define CDISABLE bl __libc_disable_asynccancel + # define __local_multiple_threads __libc_multiple_threads +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE bl __librt_enable_asynccancel + # define CDISABLE bl __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + /* NOTE: We do mark syscalls with unwind annotations, for the benefit of + cancellation; but they're really only accurate at the point of the +@@ -194,7 +194,7 @@ + # define CENABLE bl PLTJMP(__libc_enable_asynccancel) + # define CDISABLE bl PLTJMP(__libc_disable_asynccancel) + # define __local_multiple_threads __libc_multiple_threads +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE bl PLTJMP(__librt_enable_asynccancel) + # define CDISABLE bl PLTJMP(__librt_disable_asynccancel) + # else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -114,7 +114,7 @@ + # elif !defined NOT_IN_libc + # define CENABLE call __libc_enable_asynccancel; + # define CDISABLE call __libc_disable_asynccancel +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE call __librt_enable_asynccancel; + # define CDISABLE call __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/not-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/not-cancel.h ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/not-cancel.h +@@ -27,7 +27,7 @@ + INLINE_SYSCALL (open, 2, (const char *) (name), (flags)) + + /* Uncancelable openat. */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + extern int __openat_nocancel (int fd, const char *fname, int oflag, + mode_t mode) attribute_hidden; + extern int __openat64_nocancel (int fd, const char *fname, int oflag, +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -87,7 +87,7 @@ + # elif !defined NOT_IN_libc + # define CENABLE bl __libc_enable_asynccancel@local + # define CDISABLE bl __libc_disable_asynccancel@local +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE bl __librt_enable_asynccancel@local + # define CDISABLE bl __librt_disable_asynccancel@local + # else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # ifdef HAVE_ASM_GLOBAL_DOT_NAME + # define DASHDASHPFX(str) .__##str +@@ -115,7 +115,7 @@ + # define CENABLE bl JUMPTARGET(__libc_enable_asynccancel); nop + # define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel); nop + # endif +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # ifdef SHARED + # define CENABLE bl JUMPTARGET(__librt_enable_asynccancel) + # define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel) +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -81,7 +81,7 @@ L(pseudo_end): + # elif !defined NOT_IN_libc + # define CENABLE __libc_enable_asynccancel + # define CDISABLE __libc_disable_asynccancel +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE __librt_enable_asynccancel + # define CDISABLE __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -77,7 +77,7 @@ L(pseudo_end): + # define CENABLE __libc_enable_asynccancel + # define CDISABLE __libc_disable_asynccancel + # define __local_multiple_threads __libc_multiple_threads +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE __librt_enable_asynccancel + # define CDISABLE __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + /* The code to disable cancellation depends on the fact that the called + functions are special. They don't modify registers other than %rax +@@ -67,7 +67,7 @@ + # define CENABLE call __libc_enable_asynccancel; + # define CDISABLE call __libc_disable_asynccancel; + # define __local_multiple_threads __libc_multiple_threads +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE call __librt_enable_asynccancel; + # define CDISABLE call __librt_disable_asynccancel; + # else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h +@@ -19,7 +19,7 @@ + + #include + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + extern int __open_nocancel (const char *, int, ...) attribute_hidden; + extern int __close_nocancel (int) attribute_hidden; + extern int __read_nocancel (int, void *, size_t) attribute_hidden; +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # define _IMM12 #-12 + # define _IMM16 #-16 +@@ -111,7 +111,7 @@ + # elif !defined NOT_IN_libc + # define __local_enable_asynccancel __libc_enable_asynccancel + # define __local_disable_asynccancel __libc_disable_asynccancel +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define __local_enable_asynccancel __librt_enable_asynccancel + # define __local_disable_asynccancel __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -74,7 +74,7 @@ __##syscall_name##_nocancel: \ + # elif !defined NOT_IN_libc + # define CENABLE call __libc_enable_asynccancel + # define CDISABLE call __libc_disable_asynccancel +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE call __librt_enable_asynccancel + # define CDISABLE call __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -72,7 +72,7 @@ __##syscall_name##_nocancel: \ + # elif !defined NOT_IN_libc + # define CENABLE call __libc_enable_asynccancel + # define CDISABLE call __libc_disable_asynccancel +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE call __librt_enable_asynccancel + # define CDISABLE call __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h +@@ -21,7 +21,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + /* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END + besides "ret". */ +@@ -113,7 +113,7 @@ __LABEL($multi_error) \ + # define __local_enable_asynccancel __libc_enable_asynccancel + # define __local_disable_asynccancel __libc_disable_asynccancel + # define __local_multiple_threads __libc_multiple_threads +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define __local_enable_asynccancel __librt_enable_asynccancel + # define __local_disable_asynccancel __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h +@@ -23,7 +23,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -82,7 +82,7 @@ + # ifdef IS_IN_libpthread + # define CENABLE call __pthread_enable_asynccancel,[],0; + # define CDISABLE call __pthread_disable_asynccancel,[],0; +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # ifdef PIC + # define CENABLE movm [a2],(sp); \ + 1: mov pc,a2; \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # ifndef NO_ERROR + # define NO_ERROR -0x1000 +@@ -228,7 +228,7 @@ L(pre_end): ASM_LINE_SEP \ + # define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \ + bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP + # endif +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # ifdef PIC + # define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \ + bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP +@@ -248,7 +248,7 @@ L(pre_end): ASM_LINE_SEP \ + # define __local_multiple_threads __pthread_multiple_threads + # elif !defined NOT_IN_libc + # define __local_multiple_threads __libc_multiple_threads +-# elif IS_IN_librt ++# elif IS_IN (librt) + # define __local_multiple_threads __librt_multiple_threads + # else + # error Unsupported library +@@ -271,7 +271,7 @@ L(pre_end): ASM_LINE_SEP \ + # define NO_CANCELLATION 1 + + #endif +-/* !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt */ ++/* !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) */ + + #ifndef __ASSEMBLER__ + # define RTLD_SINGLE_THREAD_P \ +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + +@@ -166,7 +166,7 @@ __GC_##name: \ + # elif !defined NOT_IN_libc + # define CENABLE br.call.sptk.many b0 = __libc_enable_asynccancel + # define CDISABLE br.call.sptk.many b0 = __libc_disable_asynccancel +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE br.call.sptk.many b0 = __librt_enable_asynccancel + # define CDISABLE br.call.sptk.many b0 = __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h +@@ -62,7 +62,7 @@ + + #if defined USE_DL_SYSINFO \ + && (!defined NOT_IN_libc \ +- || IS_IN (libpthread) || defined IS_IN_librt) ++ || IS_IN (libpthread) || IS_IN (librt)) + # define IA64_USE_NEW_STUB + #else + # undef IA64_USE_NEW_STUB +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/m68k/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +@@ -106,7 +106,7 @@ + # elif !defined NOT_IN_libc + # define CENABLE PSEUDO_JMP (__libc_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel) +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE PSEUDO_JMP (__librt_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel) + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h +@@ -27,7 +27,7 @@ + happen before any instructions. So we use cfi_same_value instead of + cfi_restore. */ + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + #ifdef __PIC__ + # undef PSEUDO +@@ -149,7 +149,7 @@ + # ifdef IS_IN_libpthread + # define CENABLE PTR_LA t9, __pthread_enable_asynccancel; jalr t9 + # define CDISABLE PTR_LA t9, __pthread_disable_asynccancel; jalr t9 +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE PTR_LA t9, __librt_enable_asynccancel; jalr t9 + # define CDISABLE PTR_LA t9, __librt_disable_asynccancel; jalr t9 + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + # ifdef __PIC__ + # define PSEUDO_CPLOAD .cpload t9; +@@ -155,7 +155,7 @@ + # ifdef IS_IN_libpthread + # define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel) +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE PSEUDO_JMP (__librt_enable_asynccancel) + # define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel) + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/sysdep-cancel.h +@@ -22,7 +22,7 @@ + # include + #endif + +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + /* Allow hacking in some extra code if desired. */ + #ifndef PSEUDO_EXTRA +@@ -120,7 +120,7 @@ + # ifdef IS_IN_libpthread + # define CENABLE jal __pthread_enable_asynccancel + # define CDISABLE jal __pthread_disable_asynccancel +-# elif defined IS_IN_librt ++# elif IS_IN (librt) + # define CENABLE jal __librt_enable_asynccancel + # define CDISABLE jal __librt_disable_asynccancel + # else +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/tile/nptl/waitpid.S +@@ -1,7 +1,7 @@ + /* + extern pid_t __waitpid_nocancel (pid_t, int *, int) attribute_hidden; + */ +-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt ++#if !defined NOT_IN_libc || defined IS_IN_libpthread || IS_IN (librt) + + /* Call __NR_wait4, providing fourth argument (struct rusage *) as NULL. */ + #define PSEUDO_EXTRA move r3, zero; diff --git a/SOURCES/glibc-rh1256317-8.patch b/SOURCES/glibc-rh1256317-8.patch new file mode 100644 index 0000000..ed35874 --- /dev/null +++ b/SOURCES/glibc-rh1256317-8.patch @@ -0,0 +1,135 @@ +commit 9b42a0b3a3cc037e6bdd62869d91cb19c80aa0e5 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 13:17:21 2014 +0530 + + Remove IS_IN_libdl + + Replace with IS_IN (libdl). No changes to generated code on x86_64. + + * dlfcn/dladdr.c: Use IS_IN. + * dlfcn/dladdr1.c: Likewise. + * dlfcn/dlclose.c: Likewise. + * dlfcn/dlerror.c: Likewise. + * dlfcn/dlinfo.c: Likewise. + * dlfcn/dlmopen.c: Likewise. + * dlfcn/dlopen.c: Likewise. + * dlfcn/dlsym.c: Likewise. + * dlfcn/dlvsym.c: Likewise. + +Index: glibc-2.17-c758a686/dlfcn/dladdr.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dladdr.c ++++ glibc-2.17-c758a686/dlfcn/dladdr.c +@@ -19,7 +19,7 @@ + + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + int + dladdr (const void *address, Dl_info *info) +Index: glibc-2.17-c758a686/dlfcn/dladdr1.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dladdr1.c ++++ glibc-2.17-c758a686/dlfcn/dladdr1.c +@@ -18,7 +18,7 @@ + + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + int + dladdr1 (const void *address, Dl_info *info, void **extra, int flags) +Index: glibc-2.17-c758a686/dlfcn/dlclose.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dlclose.c ++++ glibc-2.17-c758a686/dlfcn/dlclose.c +@@ -20,7 +20,7 @@ + #include + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + int + dlclose (void *handle) +Index: glibc-2.17-c758a686/dlfcn/dlerror.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dlerror.c ++++ glibc-2.17-c758a686/dlfcn/dlerror.c +@@ -25,7 +25,7 @@ + #include + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + char * + dlerror (void) +Index: glibc-2.17-c758a686/dlfcn/dlinfo.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dlinfo.c ++++ glibc-2.17-c758a686/dlfcn/dlinfo.c +@@ -21,7 +21,7 @@ + #include + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + int + dlinfo (void *handle, int request, void *arg) +Index: glibc-2.17-c758a686/dlfcn/dlmopen.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dlmopen.c ++++ glibc-2.17-c758a686/dlfcn/dlmopen.c +@@ -23,7 +23,7 @@ + #include + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + void * + dlmopen (Lmid_t nsid, const char *file, int mode) +Index: glibc-2.17-c758a686/dlfcn/dlopen.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dlopen.c ++++ glibc-2.17-c758a686/dlfcn/dlopen.c +@@ -22,7 +22,7 @@ + #include + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + void * + dlopen (const char *file, int mode) +Index: glibc-2.17-c758a686/dlfcn/dlsym.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dlsym.c ++++ glibc-2.17-c758a686/dlfcn/dlsym.c +@@ -21,7 +21,7 @@ + + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + void * + dlsym (void *handle, const char *name) +Index: glibc-2.17-c758a686/dlfcn/dlvsym.c +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/dlvsym.c ++++ glibc-2.17-c758a686/dlfcn/dlvsym.c +@@ -21,7 +21,7 @@ + + #include + +-#if !defined SHARED && defined IS_IN_libdl ++#if !defined SHARED && IS_IN (libdl) + + void * + weak_function diff --git a/SOURCES/glibc-rh1256317-9.patch b/SOURCES/glibc-rh1256317-9.patch new file mode 100644 index 0000000..548191a --- /dev/null +++ b/SOURCES/glibc-rh1256317-9.patch @@ -0,0 +1,74 @@ +commit 85f36372aa9b7c4f8e1ebb6a3bf2c0785a019612 +Author: Siddhesh Poyarekar +Date: Thu Nov 20 13:12:02 2014 +0530 + + Remove IS_IN_nscd + + Replace with IS_IN (nscd). Generated code unchanged on x86_64. + + * include/ifaddrs.h: Use IS_IN. + * inet/check_pf.c: Likewise. + * sysdeps/unix/sysv/linux/check_pf.c: Likewise. + * nscd/Makefile (CPPFLAGS-nscd): Remove IS_IN_nscd. + +Index: glibc-2.17-c758a686/include/ifaddrs.h +=================================================================== +--- glibc-2.17-c758a686.orig/include/ifaddrs.h ++++ glibc-2.17-c758a686/include/ifaddrs.h +@@ -26,7 +26,7 @@ extern void __check_native (uint32_t a1_ + uint32_t a2_index, int *a2_native) + attribute_hidden; + +-#ifdef IS_IN_nscd ++#if IS_IN (nscd) + extern uint32_t __bump_nl_timestamp (void) attribute_hidden; + #endif + +Index: glibc-2.17-c758a686/inet/check_pf.c +=================================================================== +--- glibc-2.17-c758a686.orig/inet/check_pf.c ++++ glibc-2.17-c758a686/inet/check_pf.c +@@ -62,7 +62,7 @@ __free_in6ai (struct in6addrinfo *in6ai) + } + + +-#ifdef IS_IN_nscd ++#if IS_IN (nscd) + uint32_t + __bump_nl_timestamp (void) + { +Index: glibc-2.17-c758a686/nscd/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nscd/Makefile ++++ glibc-2.17-c758a686/nscd/Makefile +@@ -79,7 +79,7 @@ CFLAGS-nscd_gethst_r.c = -fexceptions + CFLAGS-nscd_getai.c = -fexceptions + CFLAGS-nscd_initgroups.c = -fexceptions + +-CPPFLAGS-nscd += -DIS_IN_nscd=1 -D_FORTIFY_SOURCE=2 -DNOT_IN_libc=1 ++CPPFLAGS-nscd += -D_FORTIFY_SOURCE=2 -DNOT_IN_libc + + ifeq (yesyes,$(have-fpie)$(build-shared)) + CFLAGS-nscd += $(pie-ccflag) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/check_pf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/check_pf.c ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/check_pf.c +@@ -65,7 +65,7 @@ libc_freeres_ptr (static struct cached_d + __libc_lock_define_initialized (static, lock); + + +-#ifdef IS_IN_nscd ++#if IS_IN (nscd) + static uint32_t nl_timestamp; + + uint32_t +@@ -81,7 +81,7 @@ __bump_nl_timestamp (void) + static inline uint32_t + get_nl_timestamp (void) + { +-#ifdef IS_IN_nscd ++#if IS_IN (nscd) + return nl_timestamp; + #elif defined USE_NSCD + return __nscd_get_nl_timestamp (); diff --git a/SOURCES/glibc-rh1268008-1.patch b/SOURCES/glibc-rh1268008-1.patch new file mode 100644 index 0000000..720315d --- /dev/null +++ b/SOURCES/glibc-rh1268008-1.patch @@ -0,0 +1,98 @@ +From c58ed232c3d94c9ad7b4acddb8593ae0b1f9db10 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:16:32 +0200 +Subject: [PATCH 01/30] S/390: Unify 31 and 64 bit configure.in + +upstream-commit-id: 579db35a068e70a4f3112000778138ede6994ac0 + +This patch is needed to prepare for the optimized string function patchset. +The configure fragments for s390-32/64 are identical and thus unified to one +configure file. + +--- + sysdeps/s390/configure | 5 +++++ + sysdeps/s390/configure.in | 6 ++++++ + sysdeps/s390/s390-32/configure | 5 ----- + sysdeps/s390/s390-32/configure.in | 6 ------ + sysdeps/s390/s390-64/configure | 5 ----- + sysdeps/s390/s390-64/configure.in | 6 ------ + 6 files changed, 11 insertions(+), 22 deletions(-) + create mode 100644 sysdeps/s390/configure + create mode 100644 sysdeps/s390/configure.in + delete mode 100644 sysdeps/s390/s390-32/configure + delete mode 100644 sysdeps/s390/s390-32/configure.in + delete mode 100644 sysdeps/s390/s390-64/configure + delete mode 100644 sysdeps/s390/s390-64/configure.in + +diff --git a/sysdeps/s390/configure b/sysdeps/s390/configure +new file mode 100644 +index 0000000..669bb9b +--- /dev/null ++++ b/sysdeps/s390/configure +@@ -0,0 +1,5 @@ ++# This file is generated from configure.in by Autoconf. DO NOT EDIT! ++ # Local configure fragment for sysdeps/s390. ++ ++$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h ++ +diff --git a/sysdeps/s390/configure.in b/sysdeps/s390/configure.in +new file mode 100644 +index 0000000..b5af4e1 +--- /dev/null ++++ b/sysdeps/s390/configure.in +@@ -0,0 +1,6 @@ ++GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. ++# Local configure fragment for sysdeps/s390. ++ ++dnl It is always possible to access static and hidden symbols in an ++dnl position independent way. ++AC_DEFINE(PI_STATIC_AND_HIDDEN) +diff --git a/sysdeps/s390/s390-32/configure b/sysdeps/s390/s390-32/configure +deleted file mode 100644 +index 669bb9b..0000000 +--- a/sysdeps/s390/s390-32/configure ++++ /dev/null +@@ -1,5 +0,0 @@ +-# This file is generated from configure.in by Autoconf. DO NOT EDIT! +- # Local configure fragment for sysdeps/s390. +- +-$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h +- +diff --git a/sysdeps/s390/s390-32/configure.in b/sysdeps/s390/s390-32/configure.in +deleted file mode 100644 +index b5af4e1..0000000 +--- a/sysdeps/s390/s390-32/configure.in ++++ /dev/null +@@ -1,6 +0,0 @@ +-GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +-# Local configure fragment for sysdeps/s390. +- +-dnl It is always possible to access static and hidden symbols in an +-dnl position independent way. +-AC_DEFINE(PI_STATIC_AND_HIDDEN) +diff --git a/sysdeps/s390/s390-64/configure b/sysdeps/s390/s390-64/configure +deleted file mode 100644 +index 669bb9b..0000000 +--- a/sysdeps/s390/s390-64/configure ++++ /dev/null +@@ -1,5 +0,0 @@ +-# This file is generated from configure.in by Autoconf. DO NOT EDIT! +- # Local configure fragment for sysdeps/s390. +- +-$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h +- +diff --git a/sysdeps/s390/s390-64/configure.in b/sysdeps/s390/s390-64/configure.in +deleted file mode 100644 +index b5af4e1..0000000 +--- a/sysdeps/s390/s390-64/configure.in ++++ /dev/null +@@ -1,6 +0,0 @@ +-GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +-# Local configure fragment for sysdeps/s390. +- +-dnl It is always possible to access static and hidden symbols in an +-dnl position independent way. +-AC_DEFINE(PI_STATIC_AND_HIDDEN) +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-10.patch b/SOURCES/glibc-rh1268008-10.patch new file mode 100644 index 0000000..1f65fbd --- /dev/null +++ b/SOURCES/glibc-rh1268008-10.patch @@ -0,0 +1,479 @@ +From cca51a74315c37614042113b004505b150d305d7 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:54:21 +0200 +Subject: [PATCH 10/30] S390: Optimize strlen and wcslen. + +upstream-commit-id: 9472f35a0a6dbbda82ce103aaf0f5013f5d46e34 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00089.html + +This patch provides optimized versions of strlen and wcslen with the z13 vector +instructions. +The helper macro IFUNC_VX_IMPL is introduced and is used to register all +___c() and ___vx() functions within __libc_ifunc_impl_list() +to the ifunc test framework. + +ChangeLog: + + * sysdeps/s390/multiarch/Makefile: New File. + * sysdeps/s390/multiarch/strlen-c.c: Likewise. + * sysdeps/s390/multiarch/strlen-vx.S: Likewise. + * sysdeps/s390/multiarch/strlen.c: Likewise. + * sysdeps/s390/multiarch/wcslen-c.c: Likewise. + * sysdeps/s390/multiarch/wcslen-vx.S: Likewise. + * sysdeps/s390/multiarch/wcslen.c: Likewise. + * string/strlen.c (STRLEN): Define and use macro. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (IFUNC_VX_IMPL): New macro function. + (__libc_ifunc_impl_list): Add ifunc test for strlen, wcslen. + * benchtests/Makefile (wcsmbs-bench): New variable. + (string-bench-all): Added wcsmbs-bench. + * benchtests/bench-wcslen.c: New File. +--- + benchtests/Makefile | 3 +- + benchtests/bench-wcslen.c | 20 +++++++ + string/strlen.c | 7 ++- + sysdeps/s390/multiarch/Makefile | 7 +++ + sysdeps/s390/multiarch/ifunc-impl-list.c | 14 +++++ + sysdeps/s390/multiarch/strlen-c.c | 28 ++++++++++ + sysdeps/s390/multiarch/strlen-vx.S | 84 +++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strlen.c | 27 ++++++++++ + sysdeps/s390/multiarch/wcslen-c.c | 25 +++++++++ + sysdeps/s390/multiarch/wcslen-vx.S | 91 ++++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcslen.c | 28 ++++++++++ + 11 files changed, 331 insertions(+), 3 deletions(-) + create mode 100644 benchtests/bench-wcslen.c + create mode 100644 sysdeps/s390/multiarch/Makefile + create mode 100644 sysdeps/s390/multiarch/strlen-c.c + create mode 100644 sysdeps/s390/multiarch/strlen-vx.S + create mode 100644 sysdeps/s390/multiarch/strlen.c + create mode 100644 sysdeps/s390/multiarch/wcslen-c.c + create mode 100644 sysdeps/s390/multiarch/wcslen-vx.S + create mode 100644 sysdeps/s390/multiarch/wcslen.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 9b02bc7..09ab87f 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,8 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-string-bench-all := $(string-bench) ++wcsmbs-bench := wcslen ++string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod + +diff --git a/benchtests/bench-wcslen.c b/benchtests/bench-wcslen.c +new file mode 100644 +index 0000000..4e9d085 +--- /dev/null ++++ b/benchtests/bench-wcslen.c +@@ -0,0 +1,20 @@ ++/* Measure wcslen functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strlen.c" +diff --git a/string/strlen.c b/string/strlen.c +index 5c1efda..d682693 100644 +--- a/string/strlen.c ++++ b/string/strlen.c +@@ -23,11 +23,14 @@ + + #undef strlen + ++#ifndef STRLEN ++# define STRLEN strlen ++#endif ++ + /* Return the length of the null-terminated string STR. Scan for + the null terminator quickly by testing four bytes at a time. */ + size_t +-strlen (str) +- const char *str; ++STRLEN (const char *str) + { + const char *char_ptr; + const unsigned long int *longword_ptr; +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +new file mode 100644 +index 0000000..3a98098 +--- /dev/null ++++ b/sysdeps/s390/multiarch/Makefile +@@ -0,0 +1,7 @@ ++ifeq ($(subdir),string) ++sysdep_routines += strlen strlen-vx strlen-c ++endif ++ ++ifeq ($(subdir),wcsmbs) ++sysdep_routines += wcslen wcslen-vx wcslen-c ++endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index c330904..e9639ef 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -18,6 +18,7 @@ + + #include + #include ++#include + #include + #include + +@@ -70,5 +71,18 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + + #endif /* SHARED */ + ++#ifdef HAVE_S390_VX_ASM_SUPPORT ++ ++# define IFUNC_VX_IMPL(FUNC) \ ++ IFUNC_IMPL (i, name, FUNC, \ ++ IFUNC_IMPL_ADD (array, i, FUNC, dl_hwcap & HWCAP_S390_VX, \ ++ __##FUNC##_vx) \ ++ IFUNC_IMPL_ADD (array, i, FUNC, 1, __##FUNC##_c)) ++ ++ IFUNC_VX_IMPL (strlen); ++ IFUNC_VX_IMPL (wcslen); ++ ++#endif /* HAVE_S390_VX_ASM_SUPPORT */ ++ + return i; + } +diff --git a/sysdeps/s390/multiarch/strlen-c.c b/sysdeps/s390/multiarch/strlen-c.c +new file mode 100644 +index 0000000..1cbe959 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strlen-c.c +@@ -0,0 +1,28 @@ ++/* Default strlen implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRLEN __strlen_c ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strlen_c, __GI_strlen, __strlen_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strlen-vx.S b/sysdeps/s390/multiarch/strlen-vx.S +new file mode 100644 +index 0000000..1a5cb23 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strlen-vx.S +@@ -0,0 +1,84 @@ ++/* Vector optimized 32/64 bit S/390 version of strlen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t strlen (const char *s) ++ Returns length of string s. ++ ++ Register usage: ++ -r1=bytes to 4k-byte boundary ++ -r2=s ++ -r3=tmp ++ -r4=tmp ++ -r5=current_len and return_value ++ -v16=part of s ++*/ ++ENTRY(__strlen_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfenezb %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r4,%v16,7 /* Load zero index or 16 if not found. */ ++ clr %r4,%r1 /* If found zero within loaded bytes? */ ++ locgrl %r2,%r4 /* Then copy return value. */ ++ blr %r14 /* And return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r3,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r3 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find zero in 16 byte aligned loop. */ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezbs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No zero found -> loop. */ ++ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r2,%v16,7 /* Load byte index of zero. */ ++ algr %r2,%r5 ++ br %r14 ++END(__strlen_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strlen.c b/sysdeps/s390/multiarch/strlen.c +new file mode 100644 +index 0000000..ba5863f +--- /dev/null ++++ b/sysdeps/s390/multiarch/strlen.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of strlen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strlen, strlen) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcslen-c.c b/sysdeps/s390/multiarch/wcslen-c.c +new file mode 100644 +index 0000000..6dd011e +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcslen-c.c +@@ -0,0 +1,25 @@ ++/* Default wcslen implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSLEN __wcslen_c ++ ++# include ++extern __typeof (__wcslen) __wcslen_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcslen-vx.S b/sysdeps/s390/multiarch/wcslen-vx.S +new file mode 100644 +index 0000000..579e66b +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcslen-vx.S +@@ -0,0 +1,91 @@ ++/* Vector optimized 32/64 bit S/390 version of wcslen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t wcslen (const wchar_t *s) ++ Returns length of string s. ++ ++ Register usage: ++ -r1=bytes to 4k-byte boundary ++ -r2=s ++ -r3=tmp ++ -r4=tmp ++ -r5=current_len and return_value ++ -v16=part of s ++*/ ++ENTRY(__wcslen_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ vfenezf %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r4,%v16,7 /* Load zero index or 16 if not found. */ ++ clr %r4,%r1 /* If found zero within loaded bytes? */ ++ locgrl %r2,%r4 /* Then copy return value. */ ++ jl .Lend /* And return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r3,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r3 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezfs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No zero found -> loop. */ ++ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r2,%v16,7 /* Load byte index of zero. */ ++ algr %r2,%r5 ++.Lend: ++ srlg %r2,%r2,2 /* Convert byte-count to character-count. */ ++ br %r14 ++.Lfallback: ++ jg __wcslen_c ++END(__wcslen_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcslen.c b/sysdeps/s390/multiarch/wcslen.c +new file mode 100644 +index 0000000..a7be73e +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcslen.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of wcslen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__wcslen) ++weak_alias (__wcslen, wcslen) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-11.patch b/SOURCES/glibc-rh1268008-11.patch new file mode 100644 index 0000000..6e9fa72 --- /dev/null +++ b/SOURCES/glibc-rh1268008-11.patch @@ -0,0 +1,962 @@ +From 1a569200bc2875ffc474587fb6ec599aac4bad9b Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:56:59 +0200 +Subject: [PATCH 11/30] S390: Optimize strnlen and wcsnlen. + +upstream-commit-id: fcf40ebe2682fd65d64f94d69a3df798960cf1b7 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00082.html + +This patch provides optimized versions of strnlen and wcsnlen with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strnlen-c.c: New File. + * sysdeps/s390/multiarch/strnlen-vx.S: Likewise. + * sysdeps/s390/multiarch/strnlen.c: Likewise. + * sysdeps/s390/multiarch/wcsnlen-c.c: Likewise. + * sysdeps/s390/multiarch/wcsnlen-vx.S: Likewise. + * sysdeps/s390/multiarch/wcsnlen.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strnlen and + wcsnlen functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strnlen, wcsnlen. + * wcsmbs/wcsnlen.c: Use WCSNLEN if defined. + * string/test-strnlen.c: Add wcsnlen support. + * wcsmbs/test-wcsnlen.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcsnlen. + * benchtests/bench-strnlen.c: Add wcsnlen support. + * benchtests/bench-wcsnlen.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcsnlen. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strnlen.c | 73 +++++++++------ + benchtests/bench-wcsnlen.c | 20 ++++ + string/test-strnlen.c | 87 +++++++++++------- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strnlen-c.c | 28 ++++++ + sysdeps/s390/multiarch/strnlen-vx.S | 134 +++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strnlen.c | 29 ++++++ + sysdeps/s390/multiarch/wcsnlen-c.c | 25 +++++ + sysdeps/s390/multiarch/wcsnlen-vx.S | 151 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcsnlen.c | 28 ++++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcsnlen-ifunc.c | 20 ++++ + wcsmbs/test-wcsnlen.c | 20 ++++ + wcsmbs/wcsnlen.c | 7 +- + 16 files changed, 571 insertions(+), 64 deletions(-) + create mode 100644 benchtests/bench-wcsnlen.c + create mode 100644 sysdeps/s390/multiarch/strnlen-c.c + create mode 100644 sysdeps/s390/multiarch/strnlen-vx.S + create mode 100644 sysdeps/s390/multiarch/strnlen.c + create mode 100644 sysdeps/s390/multiarch/wcsnlen-c.c + create mode 100644 sysdeps/s390/multiarch/wcsnlen-vx.S + create mode 100644 sysdeps/s390/multiarch/wcsnlen.c + create mode 100644 wcsmbs/test-wcsnlen-ifunc.c + create mode 100644 wcsmbs/test-wcsnlen.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 09ab87f..7bb2eef 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen ++wcsmbs-bench := wcslen wcsnlen + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strnlen.c b/benchtests/bench-strnlen.c +index 793f9be..cbdce75 100644 +--- a/benchtests/bench-strnlen.c ++++ b/benchtests/bench-strnlen.c +@@ -1,5 +1,5 @@ + /* Measure strlen functions. +- Copyright (C) 2013 Free Software Foundation, Inc. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -17,17 +17,36 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strnlen" ++#ifndef WIDE ++# define TEST_NAME "strnlen" ++#else ++# define TEST_NAME "wcsnlen" ++#endif /* WIDE */ + #include "bench-string.h" + +-typedef size_t (*proto_t) (const char *, size_t); +-size_t simple_strnlen (const char *, size_t); +- +-IMPL (simple_strnlen, 0) +-IMPL (strnlen, 1) ++#ifndef WIDE ++# define STRNLEN strnlen ++# define CHAR char ++# define BIG_CHAR CHAR_MAX ++# define MIDDLE_CHAR 127 ++# define SIMPLE_STRNLEN simple_strnlen ++#else ++# include ++# define STRNLEN wcsnlen ++# define CHAR wchar_t ++# define BIG_CHAR WCHAR_MAX ++# define MIDDLE_CHAR 1121 ++# define SIMPLE_STRNLEN simple_wcsnlen ++#endif /* WIDE */ ++ ++typedef size_t (*proto_t) (const CHAR *, size_t); ++size_t SIMPLE_STRNLEN (const CHAR *, size_t); ++ ++IMPL (SIMPLE_STRNLEN, 0) ++IMPL (STRNLEN, 1) + + size_t +-simple_strnlen (const char *s, size_t maxlen) ++SIMPLE_STRNLEN (const CHAR *s, size_t maxlen) + { + size_t i; + +@@ -36,7 +55,7 @@ simple_strnlen (const char *s, size_t maxlen) + } + + static void +-do_one_test (impl_t *impl, const char *s, size_t maxlen, size_t exp_len) ++do_one_test (impl_t *impl, const CHAR *s, size_t maxlen, size_t exp_len) + { + size_t len = CALL (impl, s, maxlen), i, iters = INNER_LOOP_ITERS; + timing_t start, stop, cur; +@@ -66,18 +85,20 @@ do_test (size_t align, size_t len, size_t maxlen, int max_char) + { + size_t i; + +- align &= 7; +- if (align + len >= page_size) ++ align &= 63; ++ if ((align + len) * sizeof (CHAR) >= page_size) + return; + ++ CHAR *buf = (CHAR *) (buf1); ++ + for (i = 0; i < len; ++i) +- buf1[align + i] = 1 + 7 * i % max_char; +- buf1[align + len] = 0; ++ buf[align + i] = 1 + 7 * i % max_char; ++ buf[align + len] = 0; + + printf ("Length %4zd, alignment %2zd:", len, align); + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char *) (buf1 + align), maxlen, MIN (len, maxlen)); ++ do_one_test (impl, (CHAR *) (buf + align), maxlen, MIN (len, maxlen)); + + putchar ('\n'); + } +@@ -96,34 +117,34 @@ test_main (void) + + for (i = 1; i < 8; ++i) + { +- do_test (0, i, i - 1, 127); +- do_test (0, i, i, 127); +- do_test (0, i, i + 1, 127); ++ do_test (0, i, i - 1, MIDDLE_CHAR); ++ do_test (0, i, i, MIDDLE_CHAR); ++ do_test (0, i, i + 1, MIDDLE_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (i, i, i - 1, 127); +- do_test (i, i, i, 127); +- do_test (i, i, i + 1, 127); ++ do_test (i, i, i - 1, MIDDLE_CHAR); ++ do_test (i, i, i, MIDDLE_CHAR); ++ do_test (i, i, i + 1, MIDDLE_CHAR); + } + + for (i = 2; i <= 10; ++i) + { +- do_test (0, 1 << i, 5000, 127); +- do_test (1, 1 << i, 5000, 127); ++ do_test (0, 1 << i, 5000, MIDDLE_CHAR); ++ do_test (1, 1 << i, 5000, MIDDLE_CHAR); + } + + for (i = 1; i < 8; ++i) +- do_test (0, i, 5000, 255); ++ do_test (0, i, 5000, BIG_CHAR); + + for (i = 1; i < 8; ++i) +- do_test (i, i, 5000, 255); ++ do_test (i, i, 5000, BIG_CHAR); + + for (i = 2; i <= 10; ++i) + { +- do_test (0, 1 << i, 5000, 255); +- do_test (1, 1 << i, 5000, 255); ++ do_test (0, 1 << i, 5000, BIG_CHAR); ++ do_test (1, 1 << i, 5000, BIG_CHAR); + } + + return ret; +diff --git a/benchtests/bench-wcsnlen.c b/benchtests/bench-wcsnlen.c +new file mode 100644 +index 0000000..2b5a51c +--- /dev/null ++++ b/benchtests/bench-wcsnlen.c +@@ -0,0 +1,20 @@ ++/* Measure wcsnlen functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strnlen.c" +diff --git a/string/test-strnlen.c b/string/test-strnlen.c +index ae959bf..43db896 100644 +--- a/string/test-strnlen.c ++++ b/string/test-strnlen.c +@@ -1,5 +1,5 @@ + /* Test and measure strlen functions. +- Copyright (C) 1999-2012 Free Software Foundation, Inc. ++ Copyright (C) 1999-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Jakub Jelinek , 1999. + +@@ -18,17 +18,36 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strnlen" ++#ifndef WIDE ++# define TEST_NAME "strnlen" ++#else ++# define TEST_NAME "wcsnlen" ++#endif /* !WIDE */ + #include "test-string.h" + +-typedef size_t (*proto_t) (const char *, size_t); +-size_t simple_strnlen (const char *, size_t); +- +-IMPL (simple_strnlen, 0) +-IMPL (strnlen, 1) ++#ifndef WIDE ++# define STRNLEN strnlen ++# define CHAR char ++# define BIG_CHAR CHAR_MAX ++# define MIDDLE_CHAR 127 ++# define SIMPLE_STRNLEN simple_strnlen ++#else ++# include ++# define STRNLEN wcsnlen ++# define CHAR wchar_t ++# define BIG_CHAR WCHAR_MAX ++# define MIDDLE_CHAR 1121 ++# define SIMPLE_STRNLEN simple_wcsnlen ++#endif /* !WIDE */ ++ ++typedef size_t (*proto_t) (const CHAR *, size_t); ++size_t SIMPLE_STRNLEN (const CHAR *, size_t); ++ ++IMPL (SIMPLE_STRNLEN, 0) ++IMPL (STRNLEN, 1) + + size_t +-simple_strnlen (const char *s, size_t maxlen) ++SIMPLE_STRNLEN (const CHAR *s, size_t maxlen) + { + size_t i; + +@@ -37,7 +56,7 @@ simple_strnlen (const char *s, size_t maxlen) + } + + static void +-do_one_test (impl_t *impl, const char *s, size_t maxlen, size_t exp_len) ++do_one_test (impl_t *impl, const CHAR *s, size_t maxlen, size_t exp_len) + { + size_t len = CALL (impl, s, maxlen); + if (len != exp_len) +@@ -54,23 +73,25 @@ do_test (size_t align, size_t len, size_t maxlen, int max_char) + { + size_t i; + +- align &= 7; +- if (align + len >= page_size) ++ align &= 63; ++ if ((align + len) * sizeof (CHAR) >= page_size) + return; + ++ CHAR *buf = (CHAR *) (buf1); ++ + for (i = 0; i < len; ++i) +- buf1[align + i] = 1 + 7 * i % max_char; +- buf1[align + len] = 0; ++ buf[align + i] = 1 + 7 * i % max_char; ++ buf[align + len] = 0; + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char *) (buf1 + align), maxlen, MIN (len, maxlen)); ++ do_one_test (impl, (CHAR *) (buf + align), maxlen, MIN (len, maxlen)); + } + + static void + do_random_tests (void) + { + size_t i, j, n, align, len; +- unsigned char *p = buf1 + page_size - 512; ++ CHAR *p = (CHAR *) (buf1 + page_size - 512 * sizeof (CHAR)); + + for (n = 0; n < ITERATIONS; n++) + { +@@ -97,25 +118,25 @@ do_random_tests (void) + FOR_EACH_IMPL (impl, 1) + { + if (len > 0 +- && CALL (impl, (char *) (p + align), len - 1) != len - 1) ++ && CALL (impl, (CHAR *) (p + align), len - 1) != len - 1) + { + error (0, 0, "Iteration %zd (limited) - wrong result in function %s (%zd) %zd != %zd, p %p", + n, impl->name, align, +- CALL (impl, (char *) (p + align), len - 1), len - 1, p); ++ CALL (impl, (CHAR *) (p + align), len - 1), len - 1, p); + ret = 1; + } +- if (CALL (impl, (char *) (p + align), len) != len) ++ if (CALL (impl, (CHAR *) (p + align), len) != len) + { + error (0, 0, "Iteration %zd (exact) - wrong result in function %s (%zd) %zd != %zd, p %p", + n, impl->name, align, +- CALL (impl, (char *) (p + align), len), len, p); ++ CALL (impl, (CHAR *) (p + align), len), len, p); + ret = 1; + } +- if (CALL (impl, (char *) (p + align), len + 1) != len) ++ if (CALL (impl, (CHAR *) (p + align), len + 1) != len) + { + error (0, 0, "Iteration %zd (long) - wrong result in function %s (%zd) %zd != %zd, p %p", + n, impl->name, align, +- CALL (impl, (char *) (p + align), len + 1), len, p); ++ CALL (impl, (CHAR *) (p + align), len + 1), len, p); + ret = 1; + } + } +@@ -136,34 +157,34 @@ test_main (void) + + for (i = 1; i < 8; ++i) + { +- do_test (0, i, i - 1, 127); +- do_test (0, i, i, 127); +- do_test (0, i, i + 1, 127); ++ do_test (0, i, i - 1, MIDDLE_CHAR); ++ do_test (0, i, i, MIDDLE_CHAR); ++ do_test (0, i, i + 1, MIDDLE_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (i, i, i - 1, 127); +- do_test (i, i, i, 127); +- do_test (i, i, i + 1, 127); ++ do_test (i, i, i - 1, MIDDLE_CHAR); ++ do_test (i, i, i, MIDDLE_CHAR); ++ do_test (i, i, i + 1, MIDDLE_CHAR); + } + + for (i = 2; i <= 10; ++i) + { +- do_test (0, 1 << i, 5000, 127); +- do_test (1, 1 << i, 5000, 127); ++ do_test (0, 1 << i, 5000, MIDDLE_CHAR); ++ do_test (1, 1 << i, 5000, MIDDLE_CHAR); + } + + for (i = 1; i < 8; ++i) +- do_test (0, i, 5000, 255); ++ do_test (0, i, 5000, BIG_CHAR); + + for (i = 1; i < 8; ++i) +- do_test (i, i, 5000, 255); ++ do_test (i, i, 5000, BIG_CHAR); + + for (i = 2; i <= 10; ++i) + { +- do_test (0, 1 << i, 5000, 255); +- do_test (1, 1 << i, 5000, 255); ++ do_test (0, 1 << i, 5000, BIG_CHAR); ++ do_test (1, 1 << i, 5000, BIG_CHAR); + } + + do_random_tests (); +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 3a98098..3397f24 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -1,7 +1,9 @@ + ifeq ($(subdir),string) +-sysdep_routines += strlen strlen-vx strlen-c ++sysdep_routines += strlen strlen-vx strlen-c \ ++ strnlen strnlen-vx strnlen-c + endif + + ifeq ($(subdir),wcsmbs) +-sysdep_routines += wcslen wcslen-vx wcslen-c ++sysdep_routines += wcslen wcslen-vx wcslen-c \ ++ wcsnlen wcsnlen-vx wcsnlen-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index e9639ef..bc17c59 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -82,6 +82,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strlen); + IFUNC_VX_IMPL (wcslen); + ++ IFUNC_VX_IMPL (strnlen); ++ IFUNC_VX_IMPL (wcsnlen); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strnlen-c.c b/sysdeps/s390/multiarch/strnlen-c.c +new file mode 100644 +index 0000000..50fc688 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strnlen-c.c +@@ -0,0 +1,28 @@ ++/* Default strnlen implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRNLEN __strnlen_c ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__strnlen_c, __GI_strnlen, __strnlen_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strnlen-vx.S b/sysdeps/s390/multiarch/strnlen-vx.S +new file mode 100644 +index 0000000..8c15621 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strnlen-vx.S +@@ -0,0 +1,134 @@ ++/* Vector optimized 32/64 bit S/390 version of strnlen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t strnlen (const char *s, size_t maxlen) ++ Returns the number of characters in s or at most maxlen. ++ ++ Register usage: ++ -r1=tmp ++ -r2=address of string ++ -r3=maxlen (number of characters to be read) ++ -r4=tmp ++ -r5=current_len and return_value ++ -v16=part of s ++*/ ++ENTRY(__strnlen_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r3,%r3 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r3,0 /* if maxlen == 0, return 0. */ ++ locgre %r2,%r3 ++ ber %r14 ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r1,%r1 /* Convert 32bit to 64bit. */ ++ ++ vfenezb %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ clgr %r1,%r3 ++ locgrh %r1,%r3 /* loaded_byte_count ++ = min (loaded_byte_count, maxlen) */ ++ ++ vlgvb %r5,%v16,7 /* Load zero index or 16 if not found. */ ++ clr %r5,%r1 /* If found zero within loaded bytes? */ ++ locgrl %r2,%r5 /* Then copy return value. */ ++ blr %r14 /* And return. */ ++ ++ clgr %r1,%r3 /* If loaded_byte_count == maxlen? */ ++ locgre %r2,%r3 /* Then copy return value. */ ++ ber %r14 /* And return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r3,.Lloop64 ++ ++ /* Find zero in max 64byte with aligned s. */ ++.Llt64: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezbs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound /* Jump away if zero was found. */ ++ aghi %r5,16 ++ clgrjhe %r5,%r3,.Lfound /* current_len >= maxlen -> end. */ ++ vl %v16,0(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound ++ aghi %r5,16 ++ clgrjhe %r5,%r3,.Lfound ++ vl %v16,0(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound ++ aghi %r5,16 ++ clgrjhe %r5,%r3,.Lfound ++ vl %v16,0(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ j .Lfound ++ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r4,%v16,7 /* Load byte index of zero or 16 if no zero. */ ++ algr %r5,%r4 ++ ++ clgr %r5,%r3 ++ locgrh %r5,%r3 /* Return min (current_len, maxlen). */ ++ lgr %r2,%r5 ++ br %r14 ++ ++ /* Find zero in 16 byte aligned loop. */ ++.Lloop64: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezbs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Lfound48 ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r3,.Lloop64 ++ ++ j .Llt64 ++END(__strnlen_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strnlen.c b/sysdeps/s390/multiarch/strnlen.c +new file mode 100644 +index 0000000..f036fcd +--- /dev/null ++++ b/sysdeps/s390/multiarch/strnlen.c +@@ -0,0 +1,29 @@ ++/* Multiple versions of strnlen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__strnlen) ++weak_alias (__strnlen, strnlen) ++libc_hidden_def (strnlen) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcsnlen-c.c b/sysdeps/s390/multiarch/wcsnlen-c.c +new file mode 100644 +index 0000000..6d8b537 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsnlen-c.c +@@ -0,0 +1,25 @@ ++/* Default wcsnlen implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSNLEN __wcsnlen_c ++ ++# include ++extern __typeof (__wcsnlen) __wcsnlen_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcsnlen-vx.S b/sysdeps/s390/multiarch/wcsnlen-vx.S +new file mode 100644 +index 0000000..8c21630 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsnlen-vx.S +@@ -0,0 +1,151 @@ ++/* Vector optimized 32/64 bit S/390 version of wcsnlen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t wcsnlen (const wchar_t *s, size_t maxlen) ++ Returns the number of characters in s or at most maxlen. ++ ++ Register usage: ++ -r1=tmp ++ -r2=address of string ++ -r3=maxlen (number of characters to be read) ++ -r4=tmp ++ -r5=current_len and return_value ++ -v16=part of s ++*/ ++ENTRY(__wcsnlen_vx) ++ ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r3,%r3 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r3,0 /* if maxlen == 0, return 0. */ ++ locgre %r2,%r3 ++ ber %r14 ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r1,%r1 /* Convert 32bit to 64bit. */ ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ /* Check range of maxlen and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r3,49152 /* Test bit 0 or 1 of maxlen. */ ++ lghi %r4,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r3,49152 /* Test bit 0 or 1 of maxlen. */ ++ llilf %r4,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r3,%r3,2 /* Convert character-count to byte-count. */ ++ locgrne %r3,%r4 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ vfenezf %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ clgr %r1,%r3 ++ locgrh %r1,%r3 /* loaded_byte_count ++ = min (loaded_byte_count, maxlen) */ ++ ++ vlgvb %r5,%v16,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Lend /* Found zero within loaded bytes -> return. */ ++ ++ clgr %r1,%r3 /* If loaded_byte_count == maxlen -> end. */ ++ locgre %r5,%r3 ++ je .Lend ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r3,.Lloop64 ++ ++ /* Find zero in max 64byte with aligned s. */ ++.Llt64: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezfs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound /* Jump away if zero was found. */ ++ aghi %r5,16 ++ clgrjhe %r5,%r3,.Lfound /* If current_len >= maxlen -> end. */ ++ vl %v16,0(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound ++ aghi %r5,16 ++ clgrjhe %r5,%r3,.Lfound ++ vl %v16,0(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound ++ aghi %r5,16 ++ clgrjhe %r5,%r3,.Lfound ++ vl %v16,0(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ j .Lfound ++ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r4,%v16,7 /* Load byte index of zero or 16 if no zero. */ ++ algr %r5,%r4 ++ ++ clgr %r5,%r3 ++ locgrh %r5,%r3 /* Return min (current_len, maxlen). */ ++.Lend: ++ srlg %r2,%r5,2 /* Convert byte-count to character-count. */ ++ br %r14 ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop64: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezfs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Lfound48 ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r3,.Lloop64 ++ ++ j .Llt64 ++ ++.Lfallback: ++ jg __wcsnlen_c ++END(__wcsnlen_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcsnlen.c b/sysdeps/s390/multiarch/wcsnlen.c +new file mode 100644 +index 0000000..fbb0cab +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsnlen.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of wcsnlen. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__wcsnlen) ++weak_alias (__wcsnlen, wcsnlen) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 54994e2..ec0b050 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -41,7 +41,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + isoc99_swscanf isoc99_vswscanf \ + mbrtoc16 c16rtomb + +-strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy ++strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcsnlen-ifunc.c b/wcsmbs/test-wcsnlen-ifunc.c +new file mode 100644 +index 0000000..8aa528e +--- /dev/null ++++ b/wcsmbs/test-wcsnlen-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcsnlen function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcsnlen.c" +diff --git a/wcsmbs/test-wcsnlen.c b/wcsmbs/test-wcsnlen.c +new file mode 100644 +index 0000000..262ab30 +--- /dev/null ++++ b/wcsmbs/test-wcsnlen.c +@@ -0,0 +1,20 @@ ++/* Test wcsnlen function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strnlen.c" +diff --git a/wcsmbs/wcsnlen.c b/wcsmbs/wcsnlen.c +index dff1b45..e803920 100644 +--- a/wcsmbs/wcsnlen.c ++++ b/wcsmbs/wcsnlen.c +@@ -18,8 +18,11 @@ + + #include + ++#ifdef WCSNLEN ++# define __wcsnlen WCSNLEN ++#endif + +-/* Copy SRC to DEST. */ ++/* Return length of string S at most maxlen. */ + size_t + __wcsnlen (s, maxlen) + const wchar_t *s; +@@ -44,4 +47,6 @@ __wcsnlen (s, maxlen) + + return len; + } ++#ifndef WCSNLEN + weak_alias (__wcsnlen, wcsnlen) ++#endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-12.patch b/SOURCES/glibc-rh1268008-12.patch new file mode 100644 index 0000000..893d4b7 --- /dev/null +++ b/SOURCES/glibc-rh1268008-12.patch @@ -0,0 +1,502 @@ +From 4c98816d5248bed13b1d8388efc0c47fe869300f Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:02:10 +0200 +Subject: [PATCH 12/30] S390: Optimize strcpy and wcscpy. + +upstream-commit-id: 680df122ab8a07806cb38d044292896334f76c01 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00157.html + +This patch provides optimized versions of strcpy and wcscpy with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strcpy-vx.S: New File. + * sysdeps/s390/multiarch/strcpy.c: Likewise. + * sysdeps/s390/multiarch/wcscpy-c.c: Likewise. + * sysdeps/s390/multiarch/wcscpy-vx.S: Likewise. + * sysdeps/s390/multiarch/wcscpy.c: Likewise. + * sysdeps/s390/s390-32/multiarch/strcpy.c: Likewise. + * sysdeps/s390/s390-64/multiarch/strcpy.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strcpy and + wcscpy functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strcpy, wcscpy. + * benchtests/bench-wcscpy.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcscpy. +--- + benchtests/Makefile | 2 +- + benchtests/bench-wcscpy.c | 20 ++++++ + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strcpy-vx.S | 109 ++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strcpy.c | 24 +++++++ + sysdeps/s390/multiarch/wcscpy-c.c | 25 +++++++ + sysdeps/s390/multiarch/wcscpy-vx.S | 111 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcscpy.c | 27 ++++++++ + sysdeps/s390/s390-32/multiarch/strcpy.c | 21 ++++++ + sysdeps/s390/s390-64/multiarch/strcpy.c | 21 ++++++ + 11 files changed, 366 insertions(+), 3 deletions(-) + create mode 100644 benchtests/bench-wcscpy.c + create mode 100644 sysdeps/s390/multiarch/strcpy-vx.S + create mode 100644 sysdeps/s390/multiarch/strcpy.c + create mode 100644 sysdeps/s390/multiarch/wcscpy-c.c + create mode 100644 sysdeps/s390/multiarch/wcscpy-vx.S + create mode 100644 sysdeps/s390/multiarch/wcscpy.c + create mode 100644 sysdeps/s390/s390-32/multiarch/strcpy.c + create mode 100644 sysdeps/s390/s390-64/multiarch/strcpy.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 7bb2eef..1dda844 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen wcsnlen ++wcsmbs-bench := wcslen wcsnlen wcscpy + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-wcscpy.c b/benchtests/bench-wcscpy.c +new file mode 100644 +index 0000000..62c5825 +--- /dev/null ++++ b/benchtests/bench-wcscpy.c +@@ -0,0 +1,20 @@ ++/* Measure wcscpy functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strcpy.c" +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 3397f24..e2202b7 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -1,9 +1,11 @@ + ifeq ($(subdir),string) + sysdep_routines += strlen strlen-vx strlen-c \ +- strnlen strnlen-vx strnlen-c ++ strnlen strnlen-vx strnlen-c \ ++ strcpy strcpy-vx + endif + + ifeq ($(subdir),wcsmbs) + sysdep_routines += wcslen wcslen-vx wcslen-c \ +- wcsnlen wcsnlen-vx wcsnlen-c ++ wcsnlen wcsnlen-vx wcsnlen-c \ ++ wcscpy wcscpy-vx wcscpy-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index bc17c59..c9228d6 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -85,6 +85,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strnlen); + IFUNC_VX_IMPL (wcsnlen); + ++ IFUNC_VX_IMPL (strcpy); ++ IFUNC_VX_IMPL (wcscpy); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strcpy-vx.S b/sysdeps/s390/multiarch/strcpy-vx.S +new file mode 100644 +index 0000000..a8243b0 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcpy-vx.S +@@ -0,0 +1,109 @@ ++/* Vector optimized 32/64 bit S/390 version of strcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char * strcpy (const char *dest, const char *src) ++ Copy string src to dest. ++ ++ Register usage: ++ -r1=tmp ++ -r2=dest and return_value ++ -r3=src ++ -r4=tmp ++ -r5=current_len ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++*/ ++ENTRY(__strcpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Lfound_align /* If found zero within loaded bytes, ++ copy bytes before and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r4 /* Compute highest index to 16byte boundary. */ ++ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16_0 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3)/* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezbs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ j .Lloop /* No zero found -> loop. */ ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++.Lfound_v16_0: ++ la %r3,0(%r5,%r2) ++ vlgvb %r4,%v17,7 /* Load byte index of zero. */ ++ vstl %v16,%r4,0(%r3) /* Store characters including zero. */ ++ br %r14 ++ ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ la %r3,16(%r5,%r2) ++ vlgvb %r4,%v17,7 /* Load byte index of zero. */ ++ vstl %v18,%r4,0(%r3) /* Store characters including zero. */ ++ br %r14 ++ ++.Lfound_align: ++ vstl %v16,%r5,0(%r2) /* Copy characters including zero. */ ++ br %r14 ++END(__strcpy_vx) ++ ++/* Use mvst-strcpy-implementation as default implementation. */ ++# define strcpy __strcpy_c ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) strong_alias(__strcpy_c, __GI_strcpy) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++ ++/* Include mvst-strcpy-implementation in s390-32/s390-64 subdirectory. */ ++#include +diff --git a/sysdeps/s390/multiarch/strcpy.c b/sysdeps/s390/multiarch/strcpy.c +new file mode 100644 +index 0000000..2e00ddf +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcpy.c +@@ -0,0 +1,24 @@ ++/* Multiple versions of strcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strcpy, strcpy) ++#endif +diff --git a/sysdeps/s390/multiarch/wcscpy-c.c b/sysdeps/s390/multiarch/wcscpy-c.c +new file mode 100644 +index 0000000..ca219dd +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscpy-c.c +@@ -0,0 +1,25 @@ ++/* Default wcscpy implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSCPY __wcscpy_c ++ ++# include ++extern __typeof (wcscpy) __wcscpy_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcscpy-vx.S b/sysdeps/s390/multiarch/wcscpy-vx.S +new file mode 100644 +index 0000000..6ec10bf +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscpy-vx.S +@@ -0,0 +1,111 @@ ++/* Vector optimized 32/64 bit S/390 version of wcscpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char * wcscpy (const wchar_t *dest, const wchar_t *src) ++ Copy string src to dest. ++ ++ Register usage: ++ -r0=border-len for switching to vector-instructions ++ -r1=tmp ++ -r2=dest and return value ++ -r3=src ++ -r4=tmp ++ -r5=current_len ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++*/ ++ENTRY(__wcscpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ tmll %r3,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Lfound_align /* If found zero within loaded bytes, ++ copy bytes before and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r4 /* Compute highest index to 16byte boundary. */ ++ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16_0 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezfs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ j .Lloop /* No zero found -> loop. */ ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++.Lfound_v16_0: ++ la %r3,0(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ vstl %v16,%r1,0(%r3) /* Copy characters including zero. */ ++ br %r14 ++ ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ la %r3,16(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ vstl %v18,%r1,0(%r3) /* Copy characters including zero. */ ++ br %r14 ++ ++.Lfound_align: ++ aghi %r5,3 /* Also copy remaining bytes of zero. */ ++ vstl %v16,%r5,0(%r2) /* Copy characters including zero. */ ++ br %r14 ++ ++.Lfallback: ++ jg __wcscpy_c ++END(__wcscpy_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcscpy.c b/sysdeps/s390/multiarch/wcscpy.c +new file mode 100644 +index 0000000..b3a057a +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscpy.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcscpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcscpy, wcscpy) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/s390-32/multiarch/strcpy.c b/sysdeps/s390/s390-32/multiarch/strcpy.c +new file mode 100644 +index 0000000..b02c392 +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/strcpy.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of strcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/strcpy.S will be used. */ ++#include +diff --git a/sysdeps/s390/s390-64/multiarch/strcpy.c b/sysdeps/s390/s390-64/multiarch/strcpy.c +new file mode 100644 +index 0000000..b02c392 +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/strcpy.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of strcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/strcpy.S will be used. */ ++#include +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-13.patch b/SOURCES/glibc-rh1268008-13.patch new file mode 100644 index 0000000..34e6a6c --- /dev/null +++ b/SOURCES/glibc-rh1268008-13.patch @@ -0,0 +1,707 @@ +From 9912e5a176f76caf6db58f9f2e9793b08ce3c957 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:04:59 +0200 +Subject: [PATCH 13/30] S390: Optimize stpcpy and wcpcpy. + +upstream-commit-id: 8ade3db78db17e0112648d302f98eda115949cd5 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00154.html + +This patch provides optimized versions of stpcpy and wcpcpy with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/stpcpy-c.c: New File. + * sysdeps/s390/multiarch/stpcpy-vx.S: Likewise. + * sysdeps/s390/multiarch/stpcpy.c: Likewise. + * sysdeps/s390/multiarch/wcpcpy-c.c: Likewise. + * sysdeps/s390/multiarch/wcpcpy-vx.S: Likewise. + * sysdeps/s390/multiarch/wcpcpy.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add stpcpy and + wcpcpy functions. + * string/stpcpy.c: Use STPCPY if defined. + * wcsmbs/wcpcpy.c: Use WCPCPY if defined. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for stpcpy, wcpcpy. + * string/test-stpcpy.c: Add wcpcpy support. + * wcsmbs/test-wcpcpy.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcpcpy. + * benchtests/bench-stpcpy.c: Add wcpcpy support. + * benchtests/bench-wcpcpy.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcpcpy. +--- + benchtests/Makefile | 2 +- + benchtests/bench-stpcpy.c | 33 ++++++--- + benchtests/bench-wcpcpy.c | 20 ++++++ + string/stpcpy.c | 6 ++ + string/test-stpcpy.c | 33 ++++++--- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/stpcpy-c.c | 34 +++++++++ + sysdeps/s390/multiarch/stpcpy-vx.S | 104 ++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/stpcpy.c | 29 ++++++++ + sysdeps/s390/multiarch/wcpcpy-c.c | 25 +++++++ + sysdeps/s390/multiarch/wcpcpy-vx.S | 114 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcpcpy.c | 28 ++++++++ + wcsmbs/Makefile | 3 +- + wcsmbs/test-wcpcpy-ifunc.c | 20 ++++++ + wcsmbs/test-wcpcpy.c | 20 ++++++ + wcsmbs/wcpcpy.c | 6 +- + 17 files changed, 463 insertions(+), 23 deletions(-) + create mode 100644 benchtests/bench-wcpcpy.c + create mode 100644 sysdeps/s390/multiarch/stpcpy-c.c + create mode 100644 sysdeps/s390/multiarch/stpcpy-vx.S + create mode 100644 sysdeps/s390/multiarch/stpcpy.c + create mode 100644 sysdeps/s390/multiarch/wcpcpy-c.c + create mode 100644 sysdeps/s390/multiarch/wcpcpy-vx.S + create mode 100644 sysdeps/s390/multiarch/wcpcpy.c + create mode 100644 wcsmbs/test-wcpcpy-ifunc.c + create mode 100644 wcsmbs/test-wcpcpy.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 1dda844..1b491c6 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen wcsnlen wcscpy ++wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-stpcpy.c b/benchtests/bench-stpcpy.c +index 0645298..f950c92 100644 +--- a/benchtests/bench-stpcpy.c ++++ b/benchtests/bench-stpcpy.c +@@ -18,19 +18,34 @@ + + #define STRCPY_RESULT(dst, len) ((dst) + (len)) + #define TEST_MAIN +-#define TEST_NAME "stpcpy" ++#ifndef WIDE ++# define TEST_NAME "stpcpy" ++#else ++# define TEST_NAME "wcpcpy" ++#endif /* WIDE */ + #include "bench-string.h" +- +-char *simple_stpcpy (char *, const char *); +- +-IMPL (simple_stpcpy, 0) +-IMPL (stpcpy, 1) +- +-char * +-simple_stpcpy (char *dst, const char *src) ++#ifndef WIDE ++# define CHAR char ++# define SIMPLE_STPCPY simple_stpcpy ++# define STPCPY stpcpy ++#else ++# include ++# define CHAR wchar_t ++# define SIMPLE_STPCPY simple_wcpcpy ++# define STPCPY wcpcpy ++#endif /* WIDE */ ++ ++CHAR *SIMPLE_STPCPY (CHAR *, const CHAR *); ++ ++IMPL (SIMPLE_STPCPY, 0) ++IMPL (STPCPY, 1) ++ ++CHAR * ++SIMPLE_STPCPY (CHAR *dst, const CHAR *src) + { + while ((*dst++ = *src++) != '\0'); + return dst - 1; + } + ++#undef CHAR + #include "bench-strcpy.c" +diff --git a/benchtests/bench-wcpcpy.c b/benchtests/bench-wcpcpy.c +new file mode 100644 +index 0000000..cfbfccf +--- /dev/null ++++ b/benchtests/bench-wcpcpy.c +@@ -0,0 +1,20 @@ ++/* Measure wcpcpy functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-stpcpy.c" +diff --git a/string/stpcpy.c b/string/stpcpy.c +index b0a83ba..69d150f 100644 +--- a/string/stpcpy.c ++++ b/string/stpcpy.c +@@ -28,6 +28,12 @@ + # define __stpcpy stpcpy + #endif + ++#ifdef STPCPY ++extern __typeof (__stpcpy) STPCPY; ++# undef __stpcpy ++# define __stpcpy STPCPY ++#endif ++ + /* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ + char * + __stpcpy (dest, src) +diff --git a/string/test-stpcpy.c b/string/test-stpcpy.c +index 6a7af0c..962e5d6 100644 +--- a/string/test-stpcpy.c ++++ b/string/test-stpcpy.c +@@ -19,19 +19,34 @@ + + #define STRCPY_RESULT(dst, len) ((dst) + (len)) + #define TEST_MAIN +-#define TEST_NAME "stpcpy" ++#ifndef WIDE ++# define TEST_NAME "stpcpy" ++#else ++# define TEST_NAME "wcpcpy" ++#endif /* !WIDE */ + #include "test-string.h" +- +-char *simple_stpcpy (char *, const char *); +- +-IMPL (simple_stpcpy, 0) +-IMPL (stpcpy, 1) +- +-char * +-simple_stpcpy (char *dst, const char *src) ++#ifndef WIDE ++# define CHAR char ++# define SIMPLE_STPCPY simple_stpcpy ++# define STPCPY stpcpy ++#else ++# include ++# define CHAR wchar_t ++# define SIMPLE_STPCPY simple_wcpcpy ++# define STPCPY wcpcpy ++#endif /* !WIDE */ ++ ++CHAR *SIMPLE_STPCPY (CHAR *, const CHAR *); ++ ++IMPL (SIMPLE_STPCPY, 0) ++IMPL (STPCPY, 1) ++ ++CHAR * ++SIMPLE_STPCPY (CHAR *dst, const CHAR *src) + { + while ((*dst++ = *src++) != '\0'); + return dst - 1; + } + ++#undef CHAR + #include "test-strcpy.c" +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index e2202b7..5b57342 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -1,11 +1,13 @@ + ifeq ($(subdir),string) + sysdep_routines += strlen strlen-vx strlen-c \ + strnlen strnlen-vx strnlen-c \ +- strcpy strcpy-vx ++ strcpy strcpy-vx \ ++ stpcpy stpcpy-vx stpcpy-c + endif + + ifeq ($(subdir),wcsmbs) + sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsnlen wcsnlen-vx wcsnlen-c \ +- wcscpy wcscpy-vx wcscpy-c ++ wcscpy wcscpy-vx wcscpy-c \ ++ wcpcpy wcpcpy-vx wcpcpy-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index c9228d6..a402301 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -88,6 +88,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strcpy); + IFUNC_VX_IMPL (wcscpy); + ++ IFUNC_VX_IMPL (stpcpy); ++ IFUNC_VX_IMPL (wcpcpy); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/stpcpy-c.c b/sysdeps/s390/multiarch/stpcpy-c.c +new file mode 100644 +index 0000000..4679ec6 +--- /dev/null ++++ b/sysdeps/s390/multiarch/stpcpy-c.c +@@ -0,0 +1,34 @@ ++/* Default stpcpy implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STPCPY __stpcpy_c ++# undef libc_hidden_def ++# undef weak_alias ++# undef libc_hidden_builtin_def ++# ifdef SHARED ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__stpcpy_c, __GI___stpcpy, __stpcpy_c); ++# define libc_hidden_builtin_def(name) \ ++ strong_alias (__stpcpy_c, __stpcpy_c_1); \ ++ __hidden_ver1 (__stpcpy_c_1, __GI_stpcpy, __stpcpy_c_1); ++# endif /* SHARED */ ++ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/stpcpy-vx.S b/sysdeps/s390/multiarch/stpcpy-vx.S +new file mode 100644 +index 0000000..661ad15 +--- /dev/null ++++ b/sysdeps/s390/multiarch/stpcpy-vx.S +@@ -0,0 +1,104 @@ ++/* Vector optimized 32/64 bit S/390 version of stpcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char * stpcpy (const char *dest, const char *src) ++ Copy string src to dest returning a pointer to its end. ++ ++ Register usage: ++ -r1=tmp ++ -r2=dest and return value ++ -r3=src ++ -r4=tmp ++ -r5=current_len ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++*/ ++ENTRY(__stpcpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Lfound_align /* If found zero within loaded bytes, ++ copy bytes before and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r4 /* Compute highest index to 16byte boundary. */ ++ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16_0 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezbs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ j .Lloop /* No zero found -> loop. */ ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++.Lfound_v16_0: ++ la %r3,0(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ vstl %v16,%r1,0(%r3) /* Copy characters including zero. */ ++ la %r2,0(%r1,%r3) /* Return pointer to zero. */ ++ br %r14 ++ ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ la %r3,16(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ vstl %v18,%r1,0(%r3) /* Copy characters including zero. */ ++ la %r2,0(%r1,%r3) /* Return pointer to zero. */ ++ br %r14 ++ ++.Lfound_align: ++ vstl %v16,%r5,0(%r2) /* Copy characters including zero. */ ++ la %r2,0(%r5,%r2) /* Return pointer to zero. */ ++ br %r14 ++END(__stpcpy_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/stpcpy.c b/sysdeps/s390/multiarch/stpcpy.c +new file mode 100644 +index 0000000..7dc85a0 +--- /dev/null ++++ b/sysdeps/s390/multiarch/stpcpy.c +@@ -0,0 +1,29 @@ ++/* Multiple versions of stpcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__stpcpy) ++weak_alias (__stpcpy, stpcpy) ++libc_hidden_builtin_def (stpcpy) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcpcpy-c.c b/sysdeps/s390/multiarch/wcpcpy-c.c +new file mode 100644 +index 0000000..7349f34 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcpcpy-c.c +@@ -0,0 +1,25 @@ ++/* Default wcslen implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCPCPY __wcpcpy_c ++ ++# include ++extern __typeof (__wcpcpy) __wcpcpy_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcpcpy-vx.S b/sysdeps/s390/multiarch/wcpcpy-vx.S +new file mode 100644 +index 0000000..195b836 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcpcpy-vx.S +@@ -0,0 +1,114 @@ ++/* Vector optimized 32/64 bit S/390 version of wcpcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t * wcpcpy (const wchar_t *dest, const wchar_t *src) ++ Copy string src to dest returning a pointer to its end. ++ ++ Register usage: ++ -r0=border-len for switching to vector-instructions ++ -r1=tmp ++ -r2=dest and return value ++ -r3=src ++ -r4=tmp ++ -r5=current_len ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++*/ ++ENTRY(__wcpcpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ tmll %r3,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Lfound_align /* If found zero within loaded bytes, ++ copy bytes before and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r4 /* Compute highest index to 16byte boundary. */ ++ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16_0 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezfs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ j .Lloop /* No zero found -> loop. */ ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++.Lfound_v16_0: ++ la %r3,0(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ vstl %v16,%r1,0(%r3) /* Copy characters including zero. */ ++ lay %r2,-3(%r1,%r3) /* Return pointer to zero. */ ++ br %r14 ++ ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ la %r3,16(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ vstl %v18,%r1,0(%r3) /* Copy characters including zero. */ ++ lay %r2,-3(%r1,%r3) /* Return pointer to zero. */ ++ br %r14 ++ ++.Lfound_align: ++ aghi %r5,3 /* Also copy remaining bytes of zero. */ ++ vstl %v16,%r5,0(%r2) /* Copy characters including zero. */ ++ lay %r2,-3(%r5,%r2) /* Return pointer to zero. */ ++ br %r14 ++ ++.Lfallback: ++ jg __wcpcpy_c ++END(__wcpcpy_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcpcpy.c b/sysdeps/s390/multiarch/wcpcpy.c +new file mode 100644 +index 0000000..46bf8e8 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcpcpy.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of wcpcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__wcpcpy) ++weak_alias (__wcpcpy, wcpcpy) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index ec0b050..3b91b6d 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -41,7 +41,8 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + isoc99_swscanf isoc99_vswscanf \ + mbrtoc16 c16rtomb + +-strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen ++strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ ++ wcpcpy + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcpcpy-ifunc.c b/wcsmbs/test-wcpcpy-ifunc.c +new file mode 100644 +index 0000000..aa39062 +--- /dev/null ++++ b/wcsmbs/test-wcpcpy-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcpcpy function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcpcpy.c" +diff --git a/wcsmbs/test-wcpcpy.c b/wcsmbs/test-wcpcpy.c +new file mode 100644 +index 0000000..2cf91a1 +--- /dev/null ++++ b/wcsmbs/test-wcpcpy.c +@@ -0,0 +1,20 @@ ++/* Test wcspcpy functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-stpcpy.c" +diff --git a/wcsmbs/wcpcpy.c b/wcsmbs/wcpcpy.c +index eaaab2c..f67ba62 100644 +--- a/wcsmbs/wcpcpy.c ++++ b/wcsmbs/wcpcpy.c +@@ -21,7 +21,9 @@ + #define __need_ptrdiff_t + #include + +- ++#ifdef WCPCPY ++# define __wcpcpy WCPCPY ++#endif + /* Copy SRC to DEST, returning the address of the terminating L'\0' in + DEST. */ + wchar_t * +@@ -43,4 +45,6 @@ __wcpcpy (dest, src) + return wcp; + } + ++#ifndef WCPCPY + weak_alias (__wcpcpy, wcpcpy) ++#endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-14.patch b/SOURCES/glibc-rh1268008-14.patch new file mode 100644 index 0000000..89e9f67 --- /dev/null +++ b/SOURCES/glibc-rh1268008-14.patch @@ -0,0 +1,1238 @@ +From 74fa8494fa732a0bd63b14b60ea0f1e542e0cee6 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:09:04 +0200 +Subject: [PATCH 14/30] S390: Optimize strncpy and wcsncpy. + +upstream-commit-id: d183b96ee6dc694e95f212c9272a178163351b19 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00160.html + +This patch provides optimized versions of strncpy and wcsncpy with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strncpy-vx.S: New File. + * sysdeps/s390/multiarch/strncpy.c: Likewise. + * sysdeps/s390/multiarch/wcsncpy-c.c: Likewise. + * sysdeps/s390/multiarch/wcsncpy-vx.S: Likewise. + * sysdeps/s390/multiarch/wcsncpy.c: Likewise. + * sysdeps/s390/s390-32/multiarch/strncpy.c: Likewise. + * sysdeps/s390/s390-64/multiarch/strncpy.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strncpy and + wcsncpy functions. + * wcsmbs/wcsncpy.c: Use WCSNCPY if defined. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strncpy, wcsncpy. + * string/test-strncpy.c: Add wcsncpy support. + * wcsmbs/test-wcsncpy.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcsncpy. + * benchtests/bench-strncpy.c: Add wcsncpy support. + * benchtests/bench-wcsncpy.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcsncpy +--- + benchtests/Makefile | 2 +- + benchtests/bench-strncpy.c | 108 ++++++++++----- + benchtests/bench-wcsncpy.c | 20 +++ + string/test-strncpy.c | 129 +++++++++++------- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strncpy-vx.S | 207 ++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strncpy.c | 24 ++++ + sysdeps/s390/multiarch/wcsncpy-c.c | 25 ++++ + sysdeps/s390/multiarch/wcsncpy-vx.S | 223 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcsncpy.c | 28 ++++ + sysdeps/s390/s390-32/multiarch/strncpy.c | 21 +++ + sysdeps/s390/s390-64/multiarch/strncpy.c | 21 +++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcsncpy-ifunc.c | 20 +++ + wcsmbs/test-wcsncpy.c | 20 +++ + wcsmbs/wcsncpy.c | 5 + + 17 files changed, 778 insertions(+), 86 deletions(-) + create mode 100644 benchtests/bench-wcsncpy.c + create mode 100644 sysdeps/s390/multiarch/strncpy-vx.S + create mode 100644 sysdeps/s390/multiarch/strncpy.c + create mode 100644 sysdeps/s390/multiarch/wcsncpy-c.c + create mode 100644 sysdeps/s390/multiarch/wcsncpy-vx.S + create mode 100644 sysdeps/s390/multiarch/wcsncpy.c + create mode 100644 sysdeps/s390/s390-32/multiarch/strncpy.c + create mode 100644 sysdeps/s390/s390-64/multiarch/strncpy.c + create mode 100644 wcsmbs/test-wcsncpy-ifunc.c + create mode 100644 wcsmbs/test-wcsncpy.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 1b491c6..f898258 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy ++wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strncpy.c b/benchtests/bench-strncpy.c +index 645925b..2cfd56a 100644 +--- a/benchtests/bench-strncpy.c ++++ b/benchtests/bench-strncpy.c +@@ -1,5 +1,5 @@ + /* Measure strncpy functions. +- Copyright (C) 2013 Free Software Foundation, Inc. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -16,23 +16,56 @@ + License along with the GNU C Library; if not, see + . */ + ++#ifdef WIDE ++# include ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++# define MEMCMP wmemcmp ++# define MEMSET wmemset ++# define STRNLEN wcsnlen ++#else ++# define CHAR char ++# define UCHAR unsigned char ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++# define MEMCMP memcmp ++# define MEMSET memset ++# define STRNLEN strnlen ++#endif /* !WIDE */ ++ + #ifndef STRNCPY_RESULT + # define STRNCPY_RESULT(dst, len, n) dst + # define TEST_MAIN +-# define TEST_NAME "strncpy" ++# ifndef WIDE ++# define TEST_NAME "strncpy" ++# else ++# define TEST_NAME "wcsncpy" ++# endif /* WIDE */ + # include "bench-string.h" + +-char *simple_strncpy (char *, const char *, size_t); +-char *stupid_strncpy (char *, const char *, size_t); +- +-IMPL (stupid_strncpy, 0) +-IMPL (simple_strncpy, 0) +-IMPL (strncpy, 1) +- +-char * +-simple_strncpy (char *dst, const char *src, size_t n) ++# ifndef WIDE ++# define SIMPLE_STRNCPY simple_strncpy ++# define STUPID_STRNCPY stupid_strncpy ++# define STRNCPY strncpy ++# else ++# define SIMPLE_STRNCPY simple_wcsncpy ++# define STUPID_STRNCPY stupid_wcsncpy ++# define STRNCPY wcsncpy ++# endif /* WIDE */ ++ ++CHAR *SIMPLE_STRNCPY (CHAR *, const CHAR *, size_t); ++CHAR *STUPID_STRNCPY (CHAR *, const CHAR *, size_t); ++ ++IMPL (STUPID_STRNCPY, 0) ++IMPL (SIMPLE_STRNCPY, 0) ++IMPL (STRNCPY, 1) ++ ++CHAR * ++SIMPLE_STRNCPY (CHAR *dst, const CHAR *src, size_t n) + { +- char *ret = dst; ++ CHAR *ret = dst; + while (n--) + if ((*dst++ = *src++) == '\0') + { +@@ -43,10 +76,10 @@ simple_strncpy (char *dst, const char *src, size_t n) + return ret; + } + +-char * +-stupid_strncpy (char *dst, const char *src, size_t n) ++CHAR * ++STUPID_STRNCPY (CHAR *dst, const CHAR *src, size_t n) + { +- size_t nc = strnlen (src, n); ++ size_t nc = STRNLEN (src, n); + size_t i; + + for (i = 0; i < nc; ++i) +@@ -55,12 +88,12 @@ stupid_strncpy (char *dst, const char *src, size_t n) + dst[i] = '\0'; + return dst; + } +-#endif ++#endif /* !STRNCPY_RESULT */ + +-typedef char *(*proto_t) (char *, const char *, size_t); ++typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t); + + static void +-do_one_test (impl_t *impl, char *dst, const char *src, size_t len, size_t n) ++do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, size_t len, size_t n) + { + size_t i, iters = INNER_LOOP_ITERS; + timing_t start, stop, cur; +@@ -73,7 +106,7 @@ do_one_test (impl_t *impl, char *dst, const char *src, size_t len, size_t n) + return; + } + +- if (memcmp (dst, src, len > n ? n : len) != 0) ++ if (memcmp (dst, src, (len > n ? n : len) * sizeof (CHAR)) != 0) + { + error (0, 0, "Wrong result in function %s", impl->name); + ret = 1; +@@ -109,23 +142,24 @@ static void + do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + + align1 &= 7; +- if (align1 + len >= page_size) ++ if ((align1 + len) * sizeof (CHAR) >= page_size) + return; + + align2 &= 7; +- if (align2 + len >= page_size) ++ if ((align2 + len) * sizeof (CHAR) >= page_size) + return; + +- s1 = (char *) (buf1 + align1); +- s2 = (char *) (buf2 + align2); ++ s1 = (CHAR *) (buf1 + align1); ++ s2 = (CHAR *) (buf2 + align2); + + for (i = 0; i < len; ++i) + s1[i] = 32 + 23 * i % (max_char - 32); + s1[len] = 0; +- for (i = len + 1; i + align1 < page_size && i < len + 64; ++i) ++ for (i = len + 1; (i + align1) * sizeof (CHAR) < page_size && i < len + 64; ++ ++i) + s1[i] = 32 + 32 * i % (max_char - 32); + + printf ("Length %4zd, n %4zd, alignment %2zd/%2zd:", len, n, align1, align2); +@@ -150,22 +184,22 @@ test_main (void) + + for (i = 1; i < 8; ++i) + { +- do_test (i, i, 16, 16, 127); +- do_test (i, i, 16, 16, 255); +- do_test (i, 2 * i, 16, 16, 127); +- do_test (2 * i, i, 16, 16, 255); +- do_test (8 - i, 2 * i, 1 << i, 2 << i, 127); +- do_test (2 * i, 8 - i, 2 << i, 1 << i, 127); +- do_test (8 - i, 2 * i, 1 << i, 2 << i, 255); +- do_test (2 * i, 8 - i, 2 << i, 1 << i, 255); ++ do_test (i, i, 16, 16, SMALL_CHAR); ++ do_test (i, i, 16, 16, BIG_CHAR); ++ do_test (i, 2 * i, 16, 16, SMALL_CHAR); ++ do_test (2 * i, i, 16, 16, BIG_CHAR); ++ do_test (8 - i, 2 * i, 1 << i, 2 << i, SMALL_CHAR); ++ do_test (2 * i, 8 - i, 2 << i, 1 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 1 << i, 2 << i, BIG_CHAR); ++ do_test (2 * i, 8 - i, 2 << i, 1 << i, BIG_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (0, 0, 4 << i, 8 << i, 127); +- do_test (0, 0, 16 << i, 8 << i, 127); +- do_test (8 - i, 2 * i, 4 << i, 8 << i, 127); +- do_test (8 - i, 2 * i, 16 << i, 8 << i, 127); ++ do_test (0, 0, 4 << i, 8 << i, SMALL_CHAR); ++ do_test (0, 0, 16 << i, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 4 << i, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 16 << i, 8 << i, SMALL_CHAR); + } + + return ret; +diff --git a/benchtests/bench-wcsncpy.c b/benchtests/bench-wcsncpy.c +new file mode 100644 +index 0000000..d6f63c9 +--- /dev/null ++++ b/benchtests/bench-wcsncpy.c +@@ -0,0 +1,20 @@ ++/* Measure wcsncpy functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strncpy.c" +diff --git a/string/test-strncpy.c b/string/test-strncpy.c +index a623093..bdccc98 100644 +--- a/string/test-strncpy.c ++++ b/string/test-strncpy.c +@@ -17,23 +17,56 @@ + License along with the GNU C Library; if not, see + . */ + ++#ifdef WIDE ++# include ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++# define MEMCMP wmemcmp ++# define MEMSET wmemset ++# define STRNLEN wcsnlen ++#else ++# define CHAR char ++# define UCHAR unsigned char ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++# define MEMCMP memcmp ++# define MEMSET memset ++# define STRNLEN strnlen ++#endif /* !WIDE */ ++ ++ + #ifndef STRNCPY_RESULT + # define STRNCPY_RESULT(dst, len, n) dst + # define TEST_MAIN +-# define TEST_NAME "strncpy" ++# ifndef WIDE ++# define TEST_NAME "strncpy" ++# else ++# define TEST_NAME "wcsncpy" ++# endif /* WIDE */ + # include "test-string.h" ++# ifndef WIDE ++# define SIMPLE_STRNCPY simple_strncpy ++# define STUPID_STRNCPY stupid_strncpy ++# define STRNCPY strncpy ++# else ++# define SIMPLE_STRNCPY simple_wcsncpy ++# define STUPID_STRNCPY stupid_wcsncpy ++# define STRNCPY wcsncpy ++# endif /* WIDE */ + +-char *simple_strncpy (char *, const char *, size_t); +-char *stupid_strncpy (char *, const char *, size_t); ++CHAR *SIMPLE_STRNCPY (CHAR *, const CHAR *, size_t); ++CHAR *STUPID_STRNCPY (CHAR *, const CHAR *, size_t); + +-IMPL (stupid_strncpy, 0) +-IMPL (simple_strncpy, 0) +-IMPL (strncpy, 1) ++IMPL (STUPID_STRNCPY, 0) ++IMPL (SIMPLE_STRNCPY, 0) ++IMPL (STRNCPY, 1) + +-char * +-simple_strncpy (char *dst, const char *src, size_t n) ++CHAR * ++SIMPLE_STRNCPY (CHAR *dst, const CHAR *src, size_t n) + { +- char *ret = dst; ++ CHAR *ret = dst; + while (n--) + if ((*dst++ = *src++) == '\0') + { +@@ -44,10 +77,10 @@ simple_strncpy (char *dst, const char *src, size_t n) + return ret; + } + +-char * +-stupid_strncpy (char *dst, const char *src, size_t n) ++CHAR * ++STUPID_STRNCPY (CHAR *dst, const CHAR *src, size_t n) + { +- size_t nc = strnlen (src, n); ++ size_t nc = STRNLEN (src, n); + size_t i; + + for (i = 0; i < nc; ++i) +@@ -56,12 +89,12 @@ stupid_strncpy (char *dst, const char *src, size_t n) + dst[i] = '\0'; + return dst; + } +-#endif ++#endif /* !STRNCPY_RESULT */ + +-typedef char *(*proto_t) (char *, const char *, size_t); ++typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t); + + static void +-do_one_test (impl_t *impl, char *dst, const char *src, size_t len, size_t n) ++do_one_test (impl_t *impl, CHAR *dst, const char *src, size_t len, size_t n) + { + if (CALL (impl, dst, src, n) != STRNCPY_RESULT (dst, len, n)) + { +@@ -71,7 +104,7 @@ do_one_test (impl_t *impl, char *dst, const char *src, size_t len, size_t n) + return; + } + +- if (memcmp (dst, src, len > n ? n : len) != 0) ++ if (memcmp (dst, src, (len > n ? n : len) * sizeof (CHAR)) != 0) + { + error (0, 0, "Wrong result in function %s", impl->name); + ret = 1; +@@ -96,23 +129,26 @@ static void + do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + ++/* For wcsncpy: align1 and align2 here mean alignment not in bytes, ++ but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)). */ + align1 &= 7; +- if (align1 + len >= page_size) ++ if ((align1 + len) * sizeof (CHAR) >= page_size) + return; + + align2 &= 7; +- if (align2 + len >= page_size) ++ if ((align2 + len) * sizeof (CHAR) >= page_size) + return; + +- s1 = (char *) (buf1 + align1); +- s2 = (char *) (buf2 + align2); ++ s1 = (CHAR *) (buf1) + align1; ++ s2 = (CHAR *) (buf2) + align2; + + for (i = 0; i < len; ++i) + s1[i] = 32 + 23 * i % (max_char - 32); + s1[len] = 0; +- for (i = len + 1; i + align1 < page_size && i < len + 64; ++i) ++ for (i = len + 1; (i + align1) * sizeof (CHAR) < page_size && i < len + 64; ++ ++i) + s1[i] = 32 + 32 * i % (max_char - 32); + + FOR_EACH_IMPL (impl, 0) +@@ -123,12 +159,16 @@ static void + do_random_tests (void) + { + size_t i, j, n, align1, align2, len, size, mode; +- unsigned char *p1 = buf1 + page_size - 512; +- unsigned char *p2 = buf2 + page_size - 512; +- unsigned char *res; ++ UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512; ++ UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512; ++ UCHAR *res; + + for (n = 0; n < ITERATIONS; n++) + { ++ /* For wcsncpy: align1 and align2 here mean align not in bytes, ++ but in wchar_ts, in bytes it will equal to align * (sizeof ++ (wchar_t)). */ ++ + mode = random (); + if (mode & 1) + { +@@ -166,7 +206,7 @@ do_random_tests (void) + { + size = random () & 511; + if (size + j > 512) +- size = 512 - j - (random() & 31); ++ size = 512 - j - (random () & 31); + } + else + size = 512 - j; +@@ -182,18 +222,17 @@ do_random_tests (void) + p1[i] = 0; + else + { +- p1[i] = random () & 255; ++ p1[i] = random () & BIG_CHAR; + if (i >= align1 && i < len + align1 && !p1[i]) +- p1[i] = (random () & 127) + 3; ++ p1[i] = (random () & SMALL_CHAR) + 3; + } + } + + FOR_EACH_IMPL (impl, 1) + { +- memset (p2 - 64, '\1', 512 + 64); +- res = (unsigned char *) CALL (impl, +- (char *) (p2 + align2), +- (char *) (p1 + align1), size); ++ MEMSET (p2 - 64, '\1', 512 + 64); ++ res = (UCHAR *) CALL (impl, (CHAR *) (p2 + align2), ++ (CHAR *) (p1 + align1), size); + if (res != STRNCPY_RESULT (p2 + align2, len, size)) + { + error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd) %p != %p", +@@ -235,7 +274,7 @@ do_random_tests (void) + j = len + 1; + if (size < j) + j = size; +- if (memcmp (p1 + align1, p2 + align2, j)) ++ if (MEMCMP (p1 + align1, p2 + align2, j)) + { + error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)", + n, impl->name, align1, align2, len); +@@ -259,22 +298,22 @@ test_main (void) + + for (i = 1; i < 8; ++i) + { +- do_test (i, i, 16, 16, 127); +- do_test (i, i, 16, 16, 255); +- do_test (i, 2 * i, 16, 16, 127); +- do_test (2 * i, i, 16, 16, 255); +- do_test (8 - i, 2 * i, 1 << i, 2 << i, 127); +- do_test (2 * i, 8 - i, 2 << i, 1 << i, 127); +- do_test (8 - i, 2 * i, 1 << i, 2 << i, 255); +- do_test (2 * i, 8 - i, 2 << i, 1 << i, 255); ++ do_test (i, i, 16, 16, SMALL_CHAR); ++ do_test (i, i, 16, 16, BIG_CHAR); ++ do_test (i, 2 * i, 16, 16, SMALL_CHAR); ++ do_test (2 * i, i, 16, 16, BIG_CHAR); ++ do_test (8 - i, 2 * i, 1 << i, 2 << i, SMALL_CHAR); ++ do_test (2 * i, 8 - i, 2 << i, 1 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 1 << i, 2 << i, BIG_CHAR); ++ do_test (2 * i, 8 - i, 2 << i, 1 << i, BIG_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (0, 0, 4 << i, 8 << i, 127); +- do_test (0, 0, 16 << i, 8 << i, 127); +- do_test (8 - i, 2 * i, 4 << i, 8 << i, 127); +- do_test (8 - i, 2 * i, 16 << i, 8 << i, 127); ++ do_test (0, 0, 4 << i, 8 << i, SMALL_CHAR); ++ do_test (0, 0, 16 << i, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 4 << i, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 16 << i, 8 << i, SMALL_CHAR); + } + + do_random_tests (); +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 5b57342..0dff2dc 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -2,12 +2,14 @@ ifeq ($(subdir),string) + sysdep_routines += strlen strlen-vx strlen-c \ + strnlen strnlen-vx strnlen-c \ + strcpy strcpy-vx \ +- stpcpy stpcpy-vx stpcpy-c ++ stpcpy stpcpy-vx stpcpy-c \ ++ strncpy strncpy-vx + endif + + ifeq ($(subdir),wcsmbs) + sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsnlen wcsnlen-vx wcsnlen-c \ + wcscpy wcscpy-vx wcscpy-c \ +- wcpcpy wcpcpy-vx wcpcpy-c ++ wcpcpy wcpcpy-vx wcpcpy-c \ ++ wcsncpy wcsncpy-vx wcsncpy-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index a402301..940421d 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -91,6 +91,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (stpcpy); + IFUNC_VX_IMPL (wcpcpy); + ++ IFUNC_VX_IMPL (strncpy); ++ IFUNC_VX_IMPL (wcsncpy); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strncpy-vx.S b/sysdeps/s390/multiarch/strncpy-vx.S +new file mode 100644 +index 0000000..c18b9b7 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncpy-vx.S +@@ -0,0 +1,207 @@ ++/* Vector optimized 32/64 bit S/390 version of strncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char * strncpy (const char *dest, const char *src, size_t n) ++ Copy at most n characters of string src to dest. ++ ++ Register usage: ++ -r0=dest pointer for return ++ -r1=tmp, zero byte index ++ -r2=dest ++ -r3=src ++ -r4=n ++ -r5=current_len ++ -r6=tmp, loaded bytes ++ -r7=tmp, border ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++ -v31=register save area for r6, r7 ++*/ ++ENTRY(__strncpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r4,0 ++ ber %r14 /* Nothing to do, if n == 0. */ ++ lgr %r0,%r2 /* Save destination pointer for return. */ ++ vlvgp %v31,%r6,%r7 /* Save registers. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r6,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r6,%r6 /* Convert 32bit to 64bit. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ clgrjle %r4,%r6,.Lremaining_v16 /* If n <= loaded-bytes ++ -> process remaining. */ ++ ++ /* n > loaded-byte-count. */ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r1,%r6,.Lfound_v16_store /* Found zero within loaded bytes, ++ copy and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r7,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r7 /* Compute highest index to 16byte boundary. */ ++ ++ /* Zero not found and n > loaded-byte-count. */ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Now we are 16byte aligned, so we can load ++ a full vreg without page fault. */ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ clgijl %r4,17,.Lremaining_v16 /* If n <= 16, process remaining ++ bytes. */ ++.Llt64: ++ lgr %r7,%r4 ++ slgfi %r7,16 /* border_len = n - 16. */ ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 /* If current_len >= border ++ then process remaining bytes. */ ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v18 ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18 ++ vl %v16,16(%r5,%r3) ++ vst %v18,0(%r5,%r2) ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 ++ vfenezbs %v17,%v16,%v16 ++ je .Lfound_v16 ++ vl %v18,16(%r5,%r3) ++ vst %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Lremaining_v18: ++ vlr %v16,%v18 ++.Lremaining_v16: ++ /* v16 contains the remaining bytes [1...16]. ++ Store remaining bytes and append string-termination. */ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ slgrk %r7,%r4,%r5 /* Remaining bytes = maxlen - current_len. */ ++ aghi %r7,-1 /* vstl needs highest index. */ ++ la %r2,0(%r5,%r2) /* vstl has no index register. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ /* Zero in remaining bytes? -> jump away (zero-index < max-index) ++ Do not jump away if zero-index == max-index, ++ but simply copy zero with vstl below. */ ++ clrjl %r1,%r7,.Lfound_v16_store ++ vstl %v16,%r7,0(%r2) /* Store remaining bytes without null ++ termination!. */ ++.Lend: ++ /* Restore saved registers. */ ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++ j .Lfound_v16 ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ aghi %r5,16 ++.Lfound_v18: ++ vlr %v16,%v18 ++.Lfound_v16: ++ /* v16 contains a zero. Store remaining bytes to zero. current_len ++ has not reached border, thus checking for n is not needed! */ ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ la %r2,0(%r5,%r2) /* vstl has no support for index-register. */ ++.Lfound_v16_store: ++ vstl %v16,%r1,0(%r2) /* Copy characters including zero. */ ++ /* Fill remaining bytes with zero - remaining count always > 0. */ ++ algr %r5,%r1 /* Remaining bytes (=%r4) = ... */ ++ slgr %r4,%r5 /* = n - (current_len + zero_index + 1). */ ++ la %r2,0(%r1,%r2) /* Pointer to zero. start filling beyond. */ ++ aghi %r4,-2 /* mvc with exrl needs count - 1. ++ (additional -1, see remaining bytes above) */ ++ srlg %r6,%r4,8 /* Split into 256 byte blocks. */ ++ ltgr %r6,%r6 ++ je .Lzero_lt256 ++.Lzero_loop256: ++ mvc 1(256,%r2),0(%r2) /* Fill 256 zeros at once. */ ++ la %r2,256(%r2) ++ brctg %r6,.Lzero_loop256 /* Loop until all blocks are processed. */ ++.Lzero_lt256: ++ exrl %r4,.Lmvc_lt256 ++ j .Lend ++.Lmvc_lt256: ++ mvc 1(1,%r2),0(%r2) ++ ++.Lloop64: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezbs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ j .Llt64 ++END(__strncpy_vx) ++ ++# define strncpy __strncpy_c ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) strong_alias(__strncpy_c, __GI_strncpy) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++ ++/* Include strncpy-implementation in s390-32/s390-64 subdirectory. */ ++#include +diff --git a/sysdeps/s390/multiarch/strncpy.c b/sysdeps/s390/multiarch/strncpy.c +new file mode 100644 +index 0000000..0b0c308 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncpy.c +@@ -0,0 +1,24 @@ ++/* Multiple versions of strncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strncpy, strncpy) ++#endif +diff --git a/sysdeps/s390/multiarch/wcsncpy-c.c b/sysdeps/s390/multiarch/wcsncpy-c.c +new file mode 100644 +index 0000000..a46e4ac +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncpy-c.c +@@ -0,0 +1,25 @@ ++/* Default wcsncpy implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSNCPY __wcsncpy_c ++ ++# include ++extern __typeof (__wcsncpy) __wcsncpy_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcsncpy-vx.S b/sysdeps/s390/multiarch/wcsncpy-vx.S +new file mode 100644 +index 0000000..072a2d4 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncpy-vx.S +@@ -0,0 +1,223 @@ ++/* Vector optimized 32/64 bit S/390 version of wcsncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t *wcsncpy (const wchar_t *dest, const wchar_t *src, size_t n) ++ Copy at most n characters of string src to dest. ++ ++ Register usage: ++ -r0=dest pointer for return ++ -r1=tmp, zero byte index ++ -r2=dest ++ -r3=src ++ -r4=n ++ -r5=current_len ++ -r6=tmp, loaded bytes ++ -r7=tmp, border ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++ -v31=register save area for r6, r7 ++*/ ++ENTRY(__wcsncpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r4,0 ++ ber %r14 /* Nothing to do, if n == 0. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ ++ tmll %r3,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ vlvgp %v31,%r6,%r7 /* Save registers. */ ++ lgr %r0,%r2 /* Save destination pointer for return. */ ++ ++ lcbb %r6,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r6,%r6 /* Convert 32bit to 64bit. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ /* Check range of maxlen and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r4,49152 /* Test bit 0 or 1 of n. */ ++ lghi %r1,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r4,49152 /* Test bit 0 or 1 of n. */ ++ llilf %r1,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r4,%r4,2 /* Convert character-count to byte-count. */ ++ locgrne %r4,%r1 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ clgrjle %r4,%r6,.Lremaining_v16 /* If n <= loaded-bytes ++ -> process remaining. */ ++ ++ /* n > loaded-byte-count. */ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ clrjl %r1,%r6,.Lfound_v16_store /* Found zero within loaded bytes, ++ copy and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r7,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r7 /* Compute highest index to 16byte boundary. */ ++ ++ /* Zero not found and n > loaded-byte-count. */ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Now we are 16byte aligned, so we can load ++ a full vreg without page fault. */ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ clgijl %r4,17,.Lremaining_v16 /* If n <=16, process remaining ++ bytes. */ ++.Llt64: ++ lgr %r7,%r4 ++ slgfi %r7,16 /* border_len = maxlen - 16. */ ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 /* If current_len >= border ++ then process remaining bytes. */ ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v18 ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18 ++ vl %v16,16(%r5,%r3) ++ vst %v18,0(%r5,%r2) ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 ++ vfenezfs %v17,%v16,%v16 ++ je .Lfound_v16 ++ vl %v18,16(%r5,%r3) ++ vst %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Lremaining_v18: ++ vlr %v16,%v18 ++.Lremaining_v16: ++ /* v16 contains the remaining bytes [1...16]. ++ Store remaining bytes and append string-termination. */ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ slgrk %r7,%r4,%r5 /* Remaining bytes = maxlen - current_len. */ ++ aghi %r7,-1 /* vstl needs highest index. */ ++ la %r2,0(%r5,%r2) /* vstl has no index register. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ /* Zero in remaining bytes? -> jump away (zero-index < max-index) ++ Do not jump away if zero-index == max-index, ++ but simply copy zero with vstl below. */ ++ clrjl %r1,%r7,.Lfound_v16_store ++ vstl %v16,%r7,0(%r2) /* Store remaining bytes without null ++ termination!. */ ++.Lend: ++ /* Restore saved registers. */ ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++ j .Lfound_v16 ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ aghi %r5,16 ++.Lfound_v18: ++ vlr %v16,%v18 ++.Lfound_v16: ++ /* v16 contains a zero. Store remaining bytes to zero. current_len ++ has not reached border, thus checking for n is not needed! */ ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ la %r2,0(%r5,%r2) /* vstl has no support for index-register. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++.Lfound_v16_store: ++ vstl %v16,%r1,0(%r2) /* Copy characters including zero. */ ++ /* Fill remaining bytes with zero - remaining count always > 0. */ ++ algr %r5,%r1 /* Remaining bytes (=%r4) = ... */ ++ slgr %r4,%r5 /* = maxlen - (currlen + zero_index + 1). */ ++ la %r2,0(%r1,%r2) /* Pointer to zero. start filling beyond. */ ++ aghi %r4,-2 /* mvc with exrl needs count - 1. ++ (additional -1, see remaining bytes above) */ ++ srlg %r6,%r4,8 /* Split into 256 byte blocks. */ ++ ltgr %r6,%r6 ++ je .Lzero_lt256 ++.Lzero_loop256: ++ mvc 1(256,%r2),0(%r2) /* Fill 256 zeros at once. */ ++ la %r2,256(%r2) ++ brctg %r6,.Lzero_loop256 /* Loop until all blocks are processed. */ ++.Lzero_lt256: ++ exrl %r4,.Lmvc_lt256 ++ j .Lend ++.Lmvc_lt256: ++ mvc 1(1,%r2),0(%r2) ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop64: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezfs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ j .Llt64 ++ ++.Lfallback: ++ jg __wcsncpy_c ++END(__wcsncpy_vx) ++ ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcsncpy.c b/sysdeps/s390/multiarch/wcsncpy.c +new file mode 100644 +index 0000000..99aa344 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncpy.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of wcsncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__wcsncpy) ++weak_alias (__wcsncpy, wcsncpy) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/s390-32/multiarch/strncpy.c b/sysdeps/s390/s390-32/multiarch/strncpy.c +new file mode 100644 +index 0000000..bc9c336 +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/strncpy.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of strncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/strncpy.S will be used. */ ++#include +diff --git a/sysdeps/s390/s390-64/multiarch/strncpy.c b/sysdeps/s390/s390-64/multiarch/strncpy.c +new file mode 100644 +index 0000000..bc9c336 +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/strncpy.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of strncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/strncpy.S will be used. */ ++#include +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 3b91b6d..c26ab0c 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy ++ wcpcpy wcsncpy + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcsncpy-ifunc.c b/wcsmbs/test-wcsncpy-ifunc.c +new file mode 100644 +index 0000000..0141b38 +--- /dev/null ++++ b/wcsmbs/test-wcsncpy-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcsncpy function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcsncpy.c" +diff --git a/wcsmbs/test-wcsncpy.c b/wcsmbs/test-wcsncpy.c +new file mode 100644 +index 0000000..27de6f8 +--- /dev/null ++++ b/wcsmbs/test-wcsncpy.c +@@ -0,0 +1,20 @@ ++/* Test wcsncpy functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strncpy.c" +diff --git a/wcsmbs/wcsncpy.c b/wcsmbs/wcsncpy.c +index f134c36..2e3cebe 100644 +--- a/wcsmbs/wcsncpy.c ++++ b/wcsmbs/wcsncpy.c +@@ -18,6 +18,9 @@ + + #include + ++#ifdef WCSNCPY ++# define __wcsncpy WCSNCPY ++#endif + + /* Copy no more than N wide-characters of SRC to DEST. */ + wchar_t * +@@ -83,4 +86,6 @@ __wcsncpy (dest, src, n) + + return s; + } ++#ifndef WCSNCPY + weak_alias (__wcsncpy, wcsncpy) ++#endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-15.patch b/SOURCES/glibc-rh1268008-15.patch new file mode 100644 index 0000000..70454f9 --- /dev/null +++ b/SOURCES/glibc-rh1268008-15.patch @@ -0,0 +1,915 @@ +From b403bd489e63561185fda4d7d1de2b1f627608d9 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:10:59 +0200 +Subject: [PATCH 15/30] S390: Optimize stpncpy and wcpncpy. + +upstream-commit-id: b3a0c176d1185621c4dd2bb3a51ec961bdb29123 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00158.html + +This patch provides optimized versions of stpncpy and wcpncpy with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/stpncpy-c.c: New File. + * sysdeps/s390/multiarch/stpncpy-vx.S: Likewise. + * sysdeps/s390/multiarch/stpncpy.c: Likewise. + * sysdeps/s390/multiarch/wcpncpy-c.c: Likewise. + * sysdeps/s390/multiarch/wcpncpy-vx.S: Likewise. + * sysdeps/s390/multiarch/wcpncpy.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add stpncpy and + wcpncpy functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for stpncpy, wcpncpy. + * wcsmbs/wcpncpy.c: Use WCPNCPY if defined. + * string/test-stpncpy.c: Add wcpncpy support. + * wcsmbs/test-wcpncpy.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcpncpy. + * benchtests/bench-stpncpy.c: Add wcpncpy support. + * benchtests/bench-wcpncpy.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcpncpy. +--- + benchtests/Makefile | 2 +- + benchtests/bench-stpncpy.c | 40 ++++-- + benchtests/bench-wcpncpy.c | 20 +++ + string/test-stpncpy.c | 40 ++++-- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/stpncpy-c.c | 28 ++++ + sysdeps/s390/multiarch/stpncpy-vx.S | 200 ++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/stpncpy.c | 28 ++++ + sysdeps/s390/multiarch/wcpncpy-c.c | 25 ++++ + sysdeps/s390/multiarch/wcpncpy-vx.S | 222 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcpncpy.c | 28 ++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcpncpy-ifunc.c | 20 +++ + wcsmbs/test-wcpncpy.c | 20 +++ + wcsmbs/wcpncpy.c | 5 + + 16 files changed, 663 insertions(+), 26 deletions(-) + create mode 100644 benchtests/bench-wcpncpy.c + create mode 100644 sysdeps/s390/multiarch/stpncpy-c.c + create mode 100644 sysdeps/s390/multiarch/stpncpy-vx.S + create mode 100644 sysdeps/s390/multiarch/stpncpy.c + create mode 100644 sysdeps/s390/multiarch/wcpncpy-c.c + create mode 100644 sysdeps/s390/multiarch/wcpncpy-vx.S + create mode 100644 sysdeps/s390/multiarch/wcpncpy.c + create mode 100644 wcsmbs/test-wcpncpy-ifunc.c + create mode 100644 wcsmbs/test-wcpncpy.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index f898258..dfab95f 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy ++wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-stpncpy.c b/benchtests/bench-stpncpy.c +index 65ed800..e428102 100644 +--- a/benchtests/bench-stpncpy.c ++++ b/benchtests/bench-stpncpy.c +@@ -18,18 +18,36 @@ + + #define STRNCPY_RESULT(dst, len, n) ((dst) + ((len) > (n) ? (n) : (len))) + #define TEST_MAIN +-#define TEST_NAME "stpncpy" ++#ifndef WIDE ++# define TEST_NAME "stpncpy" ++#else ++# define TEST_NAME "wcpncpy" ++#endif /* WIDE */ + #include "bench-string.h" ++#ifndef WIDE ++# define CHAR char ++# define SIMPLE_STPNCPY simple_stpncpy ++# define STUPID_STPNCPY stupid_stpncpy ++# define STPNCPY stpncpy ++# define STRNLEN strnlen ++#else ++# include ++# define CHAR wchar_t ++# define SIMPLE_STPNCPY simple_wcpncpy ++# define STUPID_STPNCPY stupid_wcpncpy ++# define STPNCPY wcpncpy ++# define STRNLEN wcsnlen ++#endif /* WIDE */ + +-char *simple_stpncpy (char *, const char *, size_t); +-char *stupid_stpncpy (char *, const char *, size_t); ++CHAR *SIMPLE_STPNCPY (CHAR *, const CHAR *, size_t); ++CHAR *STUPID_STPNCPY (CHAR *, const CHAR *, size_t); + +-IMPL (stupid_stpncpy, 0) +-IMPL (simple_stpncpy, 0) +-IMPL (stpncpy, 1) ++IMPL (STUPID_STPNCPY, 0) ++IMPL (SIMPLE_STPNCPY, 0) ++IMPL (STPNCPY, 1) + +-char * +-simple_stpncpy (char *dst, const char *src, size_t n) ++CHAR * ++SIMPLE_STPNCPY (CHAR *dst, const CHAR *src, size_t n) + { + while (n--) + if ((*dst++ = *src++) == '\0') +@@ -43,10 +61,10 @@ simple_stpncpy (char *dst, const char *src, size_t n) + return dst; + } + +-char * +-stupid_stpncpy (char *dst, const char *src, size_t n) ++CHAR * ++STUPID_STPNCPY (CHAR *dst, const CHAR *src, size_t n) + { +- size_t nc = strnlen (src, n); ++ size_t nc = STRNLEN (src, n); + size_t i; + + for (i = 0; i < nc; ++i) +diff --git a/benchtests/bench-wcpncpy.c b/benchtests/bench-wcpncpy.c +new file mode 100644 +index 0000000..8aa529e +--- /dev/null ++++ b/benchtests/bench-wcpncpy.c +@@ -0,0 +1,20 @@ ++/* Measure wcpncpy functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-stpncpy.c" +diff --git a/string/test-stpncpy.c b/string/test-stpncpy.c +index 8647299..69c8181 100644 +--- a/string/test-stpncpy.c ++++ b/string/test-stpncpy.c +@@ -19,18 +19,36 @@ + + #define STRNCPY_RESULT(dst, len, n) ((dst) + ((len) > (n) ? (n) : (len))) + #define TEST_MAIN +-#define TEST_NAME "stpncpy" ++#ifndef WIDE ++# define TEST_NAME "stpncpy" ++#else ++# define TEST_NAME "wcpncpy" ++#endif /* WIDE */ + #include "test-string.h" ++#ifndef WIDE ++# define CHAR char ++# define SIMPLE_STPNCPY simple_stpncpy ++# define STUPID_STPNCPY stupid_stpncpy ++# define STPNCPY stpncpy ++# define STRNLEN strnlen ++#else ++# include ++# define CHAR wchar_t ++# define SIMPLE_STPNCPY simple_wcpncpy ++# define STUPID_STPNCPY stupid_wcpncpy ++# define STPNCPY wcpncpy ++# define STRNLEN wcsnlen ++#endif /* WIDE */ + +-char *simple_stpncpy (char *, const char *, size_t); +-char *stupid_stpncpy (char *, const char *, size_t); ++CHAR *SIMPLE_STPNCPY (CHAR *, const CHAR *, size_t); ++CHAR *STUPID_STPNCPY (CHAR *, const CHAR *, size_t); + +-IMPL (stupid_stpncpy, 0) +-IMPL (simple_stpncpy, 0) +-IMPL (stpncpy, 1) ++IMPL (STUPID_STPNCPY, 0) ++IMPL (SIMPLE_STPNCPY, 0) ++IMPL (STPNCPY, 1) + +-char * +-simple_stpncpy (char *dst, const char *src, size_t n) ++CHAR * ++SIMPLE_STPNCPY (CHAR *dst, const CHAR *src, size_t n) + { + while (n--) + if ((*dst++ = *src++) == '\0') +@@ -44,10 +62,10 @@ simple_stpncpy (char *dst, const char *src, size_t n) + return dst; + } + +-char * +-stupid_stpncpy (char *dst, const char *src, size_t n) ++CHAR * ++STUPID_STPNCPY (CHAR *dst, const CHAR *src, size_t n) + { +- size_t nc = strnlen (src, n); ++ size_t nc = STRNLEN (src, n); + size_t i; + + for (i = 0; i < nc; ++i) +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 0dff2dc..98b588f 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -3,7 +3,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strnlen strnlen-vx strnlen-c \ + strcpy strcpy-vx \ + stpcpy stpcpy-vx stpcpy-c \ +- strncpy strncpy-vx ++ strncpy strncpy-vx \ ++ stpncpy stpncpy-vx stpncpy-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -11,5 +12,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsnlen wcsnlen-vx wcsnlen-c \ + wcscpy wcscpy-vx wcscpy-c \ + wcpcpy wcpcpy-vx wcpcpy-c \ +- wcsncpy wcsncpy-vx wcsncpy-c ++ wcsncpy wcsncpy-vx wcsncpy-c \ ++ wcpncpy wcpncpy-vx wcpncpy-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index 940421d..ca69983 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -94,6 +94,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strncpy); + IFUNC_VX_IMPL (wcsncpy); + ++ IFUNC_VX_IMPL (stpncpy); ++ IFUNC_VX_IMPL (wcpncpy); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/stpncpy-c.c b/sysdeps/s390/multiarch/stpncpy-c.c +new file mode 100644 +index 0000000..40dd8bd +--- /dev/null ++++ b/sysdeps/s390/multiarch/stpncpy-c.c +@@ -0,0 +1,28 @@ ++/* Default stpncpy implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STPNCPY __stpncpy_c ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__stpncpy_c, __GI___stpncpy, __stpncpy_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/stpncpy-vx.S b/sysdeps/s390/multiarch/stpncpy-vx.S +new file mode 100644 +index 0000000..36f6b93 +--- /dev/null ++++ b/sysdeps/s390/multiarch/stpncpy-vx.S +@@ -0,0 +1,200 @@ ++/* Vector optimized 32/64 bit S/390 version of stpncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char * stpncpy (char *dest, const char *src, size_t n) ++ Copies at most n characters of string src to dest ++ returning a pointer to its end or dest+n ++ if src is smaller than n. ++ ++ Register usage: ++ -%r0 = return value ++ -%r1 = zero byte index ++ -%r2 = curr dst pointer ++ -%r3 = curr src pointer ++ -%r4 = n ++ -%r5 = current_len ++ -%r6 = loaded bytes ++ -%r7 = border, tmp ++*/ ++ENTRY(__stpncpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r4,0 ++ ber %r14 /* Nothing to do, if n == 0. */ ++ ++ la %r0,0(%r4,%r2) /* Save destination pointer + n for return. */ ++ vlvgp %v31,%r6,%r7 /* Save registers. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r6,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r6,%r6 /* Convert 32bit to 64bit. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ clgrjle %r4,%r6,.Lremaining_v16 /* If n <= loaded-bytes ++ -> process remaining. */ ++ ++ /* n > loaded-byte-count */ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r1,%r6,.Lfound_v16_store /* Found zero within loaded bytes, ++ copy and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r7,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r7 /* Compute highest index to 16byte boundary. */ ++ ++ /* Zero not found and n > loaded-byte-count. */ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Now we are 16byte aligned, so we can load a full vreg ++ without page fault. */ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ clgijl %r4,17,.Lremaining_v16 /* If n <= 16, process remaining ++ bytes. */ ++.Llt64: ++ lgr %r7,%r4 ++ slgfi %r7,16 /* border_len = n - 16. */ ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 /* If current_len >= border ++ then process remaining bytes. */ ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Save previous part without zero to dst. */ ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v18 ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18 ++ vl %v16,16(%r5,%r3) ++ vst %v18,0(%r5,%r2) ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 ++ vfenezbs %v17,%v16,%v16 ++ je .Lfound_v16 ++ vl %v18,16(%r5,%r3) ++ vst %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Lremaining_v18: ++ vlr %v16,%v18 ++.Lremaining_v16: ++ /* v16 contains the remaining bytes [1...16]. ++ Store remaining bytes and append string-termination. */ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ slgrk %r7,%r4,%r5 /* Remaining bytes = maxlen - current_len */ ++ aghi %r7,-1 /* vstl needs highest index. */ ++ la %r2,0(%r5,%r2) /* vstl has no index register. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ /* Zero in remaining bytes? -> jump away (zero-index <= max-index). */ ++ clrjle %r1,%r7,.Lfound_v16_store ++ vstl %v16,%r7,0(%r2) /* Store remaining bytes without null ++ termination! */ ++.Lend: ++ /* Restore saved registers. */ ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++ j .Lfound_v16 ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ aghi %r5,16 ++.Lfound_v18: ++ vlr %v16,%v18 ++.Lfound_v16: ++ /* v16 contains a zero. Store remaining bytes to zero. current_len ++ has not reached border, thus checking for n is not needed! */ ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ la %r2,0(%r5,%r2) /* vstl has no support for index-register. */ ++.Lfound_v16_store: ++ vstl %v16,%r1,0(%r2) /* Copy characters including zero. */ ++ /* Fill remaining bytes with zero - remaining count always > 0. */ ++ algr %r5,%r1 /* Remaining bytes (=%r4) = ... */ ++ slgr %r4,%r5 /* = maxlen - (currlen + zero_index + 1) */ ++ la %r2,0(%r1,%r2) /* Pointer to zero. start filling beyond. */ ++ lgr %r0,%r2 /* Save return-pointer to found zero. */ ++ clgije %r4,1,.Lend /* Skip zero-filling, if found zero is last ++ possible character. ++ (1 is substracted from r4 below!). */ ++ aghi %r4,-2 /* mvc with exrl needs count - 1. ++ (additional -1, see remaining bytes above) */ ++ srlg %r6,%r4,8 /* Split into 256 byte blocks. */ ++ ltgr %r6,%r6 ++ je .Lzero_lt256 ++.Lzero_loop256: ++ mvc 1(256,%r2),0(%r2) /* Fill 256 zeros at once. */ ++ la %r2,256(%r2) ++ brctg %r6,.Lzero_loop256 /* Loop until all blocks are processed. */ ++.Lzero_lt256: ++ exrl %r4,.Lmvc_lt256 ++ j .Lend ++.Lmvc_lt256: ++ mvc 1(1,%r2),0(%r2) ++ ++.Lloop64: ++ vl %v16,0(%r5,%r3) ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Save previous part without zero to dst. */ ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezbs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezbs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ j .Llt64 ++END(__stpncpy_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/stpncpy.c b/sysdeps/s390/multiarch/stpncpy.c +new file mode 100644 +index 0000000..894a33b +--- /dev/null ++++ b/sysdeps/s390/multiarch/stpncpy.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of stpncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__stpncpy) ++weak_alias (__stpncpy, stpncpy) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcpncpy-c.c b/sysdeps/s390/multiarch/wcpncpy-c.c +new file mode 100644 +index 0000000..e49b2ef +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcpncpy-c.c +@@ -0,0 +1,25 @@ ++/* Default wcsncpy implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCPNCPY __wcpncpy_c ++ ++# include ++extern __typeof (__wcpncpy) __wcpncpy_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcpncpy-vx.S b/sysdeps/s390/multiarch/wcpncpy-vx.S +new file mode 100644 +index 0000000..335ea58 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcpncpy-vx.S +@@ -0,0 +1,222 @@ ++/* Vector optimized 32/64 bit S/390 version of wcpncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t * wcpncpy (wchar_t *dest, const wchar_t *src, size_t n) ++ Copies at most n characters of string src to dest ++ returning a pointer to its end or dest+n ++ if src is smaller than n. ++ ++ Register usage: ++ -%r0 = return value ++ -%r1 = zero byte index ++ -%r2 = curr dst pointer ++ -%r3 = curr src pointer ++ -%r4 = n ++ -%r5 = current_len ++ -%r6 = loaded bytes ++ -%r7 = border, tmp ++*/ ++ENTRY(__wcpncpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r4,0 ++ ber %r14 /* Nothing to do, if n == 0. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ ++ tmll %r3,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ vlvgp %v31,%r6,%r7 /* Save registers. */ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ lcbb %r6,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r6,%r6 /* Convert 32bit to 64bit. */ ++ ++ /* Check range of maxlen and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ lghi %r1,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ llilf %r1,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r4,%r4,2 /* Convert character-count to byte-count. */ ++ locgrne %r4,%r1 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ la %r0,0(%r4,%r2) /* Save destination pointer + n for return. */ ++ ++ clgrjle %r4,%r6,.Lremaining_v16 /* If n <= loaded-bytes ++ -> process remaining. */ ++ ++ /* n > loaded-byte-count */ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ clrjl %r1,%r6,.Lfound_v16_store /* Found zero within loaded bytes, ++ copy and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r7,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r7 /* Compute highest index to 16byte boundary. */ ++ ++ /* Zero not found and n > loaded-byte-count. */ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Now we are 16byte aligned, so we can load a full vreg ++ without page fault. */ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ clgijl %r4,17,.Lremaining_v16 /* If n <=16, ++ process remaining bytes. */ ++.Llt64: ++ lgr %r7,%r4 ++ slgfi %r7,16 /* border_len = n - 16. */ ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 /* If current_len >= border ++ then process remaining bytes. */ ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v18 ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18 ++ vl %v16,16(%r5,%r3) ++ vst %v18,0(%r5,%r2) ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lremaining_v16 ++ vfenezfs %v17,%v16,%v16 ++ je .Lfound_v16 ++ vl %v18,16(%r5,%r3) ++ vst %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Lremaining_v18: ++ vlr %v16,%v18 ++.Lremaining_v16: ++ /* v16 contains the remaining bytes [1...16]. ++ Store remaining bytes and append string-termination. */ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ slgrk %r7,%r4,%r5 /* Remaining bytes = maxlen - current_len */ ++ aghi %r7,-1 /* vstl needs highest index. */ ++ la %r2,0(%r5,%r2) /* vstl has no index register. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ /* Zero in remaining bytes? -> jump away (zero-index <= max-index). */ ++ clrjle %r1,%r7,.Lfound_v16_store ++ vstl %v16,%r7,0(%r2) /* Store remaining bytes without null ++ termination! */ ++.Lend: ++ /* Restore saved registers. */ ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lfound_v16_32: ++ aghi %r5,32 ++ j .Lfound_v16 ++.Lfound_v18_48: ++ aghi %r5,32 ++.Lfound_v18_16: ++ aghi %r5,16 ++.Lfound_v18: ++ vlr %v16,%v18 ++.Lfound_v16: ++ /* v16 contains a zero. Store remaining bytes to zero. current_len ++ has not reached border, thus checking for n is not needed! */ ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ la %r2,0(%r5,%r2) /* vstl has no support for index-register. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++.Lfound_v16_store: ++ vstl %v16,%r1,0(%r2) /* Copy characters including zero. */ ++ /* Fill remaining bytes with zero - remaining byte count always > 0. */ ++ algr %r5,%r1 /* Remaining bytes (=%r4) = ... */ ++ slgr %r4,%r5 /* = n - (currlen + zero_index + 1) */ ++ la %r2,0(%r1,%r2) /* Pointer to zero. start filling beyond. */ ++ lay %r0,-3(%r2) /* Save return-pointer to found zero. */ ++ clgije %r4,1,.Lend /* Skip zero-filling, if found-zero is last ++ possible character. ++ (1 is substracted from r4 below!). */ ++ aghi %r4,-2 /* mvc with exrl needs count - 1. ++ (additional -1, see remaining bytes above) */ ++ srlg %r6,%r4,8 /* Split into 256 byte blocks. */ ++ ltgr %r6,%r6 ++ je .Lzero_lt256 ++.Lzero_loop256: ++ mvc 1(256,%r2),0(%r2) /* Fill 256 zeros at once. */ ++ la %r2,256(%r2) ++ brctg %r6,.Lzero_loop256 /* Loop until all blocks are processed. */ ++.Lzero_lt256: ++ exrl %r4,.Lmvc_lt256 ++ j .Lend ++.Lmvc_lt256: ++ mvc 1(1,%r2),0(%r2) ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lloop64: ++ vl %v16,0(%r5,%r3) ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lfound_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezfs %v17,%v16,%v16 ++ je .Lfound_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezfs %v17,%v18,%v18 ++ je .Lfound_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lloop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ j .Llt64 ++ ++.Lfallback: ++ jg __wcpncpy_c ++END(__wcpncpy_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcpncpy.c b/sysdeps/s390/multiarch/wcpncpy.c +new file mode 100644 +index 0000000..3db7b8b +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcpncpy.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of wcpncpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__wcpncpy) ++weak_alias (__wcpncpy, wcpncpy) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index c26ab0c..89b5b3b 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy wcsncpy ++ wcpcpy wcsncpy wcpncpy + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcpncpy-ifunc.c b/wcsmbs/test-wcpncpy-ifunc.c +new file mode 100644 +index 0000000..0685487 +--- /dev/null ++++ b/wcsmbs/test-wcpncpy-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcpncpy function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcpncpy.c" +diff --git a/wcsmbs/test-wcpncpy.c b/wcsmbs/test-wcpncpy.c +new file mode 100644 +index 0000000..de302b4 +--- /dev/null ++++ b/wcsmbs/test-wcpncpy.c +@@ -0,0 +1,20 @@ ++/* Test wcpncpy functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-stpncpy.c" +diff --git a/wcsmbs/wcpncpy.c b/wcsmbs/wcpncpy.c +index 2fab857..6337a87 100644 +--- a/wcsmbs/wcpncpy.c ++++ b/wcsmbs/wcpncpy.c +@@ -18,6 +18,9 @@ + + #include + ++#ifdef WCPNCPY ++# define __wcpncpy WCPNCPY ++#endif + + /* Copy no more than N wide-characters of SRC to DEST, returning the + address of the last character written into DEST. */ +@@ -82,4 +85,6 @@ __wcpncpy (dest, src, n) + return dest - 1; + } + ++#ifndef WCPNCPY + weak_alias (__wcpncpy, wcpncpy) ++#endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-16.patch b/SOURCES/glibc-rh1268008-16.patch new file mode 100644 index 0000000..350acf4 --- /dev/null +++ b/SOURCES/glibc-rh1268008-16.patch @@ -0,0 +1,1101 @@ +From 43b14a5489db870aeeda0766bde25e29747f6864 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:13:14 +0200 +Subject: [PATCH 16/30] S390: Optimize strcat and wcscat. + +upstream-commit-id: d626a24f235dbd4c446b241211a9a264a1eedb9e +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00155.html + +This patch provides optimized versions of strcat and wcscat with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strcat-c.c: New File. + * sysdeps/s390/multiarch/strcat-vx.S: Likewise. + * sysdeps/s390/multiarch/strcat.c: Likewise. + * sysdeps/s390/multiarch/wcscat-c.c: Likewise. + * sysdeps/s390/multiarch/wcscat-vx.S: Likewise. + * sysdeps/s390/multiarch/wcscat.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strcat and + wcscat functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strcat, wcscat. + * string/strcat.c (STRCAT): Define and use macro. + * wcsmbs/wcscat.c: Use WCSCAT if defined. + * string/test-strcat.c: Add wcscat support. + * wcsmbs/test-wcscat.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcscat. + * benchtests/bench-strcat.c: Add wcscat support. + * benchtests/bench-wcscat.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcscat. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strcat.c | 90 ++++++++++------ + benchtests/bench-wcscat.c | 20 ++++ + string/strcat.c | 8 +- + string/test-strcat.c | 124 ++++++++++++++-------- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strcat-c.c | 28 +++++ + sysdeps/s390/multiarch/strcat-vx.S | 161 ++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strcat.c | 27 +++++ + sysdeps/s390/multiarch/wcscat-c.c | 25 +++++ + sysdeps/s390/multiarch/wcscat-vx.S | 175 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcscat.c | 28 +++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcscat-ifunc.c | 20 ++++ + wcsmbs/test-wcscat.c | 20 ++++ + wcsmbs/wcscat.c | 5 + + 17 files changed, 660 insertions(+), 84 deletions(-) + create mode 100644 benchtests/bench-wcscat.c + create mode 100644 sysdeps/s390/multiarch/strcat-c.c + create mode 100644 sysdeps/s390/multiarch/strcat-vx.S + create mode 100644 sysdeps/s390/multiarch/strcat.c + create mode 100644 sysdeps/s390/multiarch/wcscat-c.c + create mode 100644 sysdeps/s390/multiarch/wcscat-vx.S + create mode 100644 sysdeps/s390/multiarch/wcscat.c + create mode 100644 wcsmbs/test-wcscat-ifunc.c + create mode 100644 wcsmbs/test-wcscat.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index dfab95f..91db23c 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy ++wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strcat.c b/benchtests/bench-strcat.c +index 6602009..1abf6d3 100644 +--- a/benchtests/bench-strcat.c ++++ b/benchtests/bench-strcat.c +@@ -1,5 +1,5 @@ + /* Measure strcat functions. +- Copyright (C) 2013 Free Software Foundation, Inc. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -17,19 +17,45 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strcat" ++#ifndef WIDE ++# define TEST_NAME "strcat" ++#else ++# define TEST_NAME "wcscat" ++#endif /* WIDE */ + #include "bench-string.h" + +-typedef char *(*proto_t) (char *, const char *); +-char *simple_strcat (char *, const char *); +- +-IMPL (simple_strcat, 0) +-IMPL (strcat, 1) +- +-char * +-simple_strcat (char *dst, const char *src) ++#ifndef WIDE ++# define STRCAT strcat ++# define CHAR char ++# define sfmt "s" ++# define SIMPLE_STRCAT simple_strcat ++# define STRLEN strlen ++# define STRCMP strcmp ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define STRCAT wcscat ++# define CHAR wchar_t ++# define sfmt "ls" ++# define SIMPLE_STRCAT simple_wcscat ++# define STRLEN wcslen ++# define STRCMP wcscmp ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ ++ ++ ++typedef CHAR *(*proto_t) (CHAR *, const CHAR *); ++CHAR *SIMPLE_STRCAT (CHAR *, const CHAR *); ++ ++IMPL (SIMPLE_STRCAT, 0) ++IMPL (STRCAT, 1) ++ ++CHAR * ++SIMPLE_STRCAT (CHAR *dst, const CHAR *src) + { +- char *ret = dst; ++ CHAR *ret = dst; + while (*dst++ != '\0'); + --dst; + while ((*dst++ = *src++) != '\0'); +@@ -37,9 +63,9 @@ simple_strcat (char *dst, const char *src) + } + + static void +-do_one_test (impl_t *impl, char *dst, const char *src) ++do_one_test (impl_t *impl, CHAR *dst, const CHAR *src) + { +- size_t k = strlen (dst), i, iters = INNER_LOOP_ITERS; ++ size_t k = STRLEN (dst), i, iters = INNER_LOOP_ITERS; + timing_t start, stop, cur; + + if (CALL (impl, dst, src) != dst) +@@ -50,9 +76,9 @@ do_one_test (impl_t *impl, char *dst, const char *src) + return; + } + +- if (strcmp (dst + k, src) != 0) ++ if (STRCMP (dst + k, src) != 0) + { +- error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"", ++ error (0, 0, "Wrong result in function %s dst \"%" sfmt "\" src \"%" sfmt "\"", + impl->name, dst, src); + ret = 1; + return; +@@ -75,18 +101,18 @@ static void + do_test (size_t align1, size_t align2, size_t len1, size_t len2, int max_char) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + + align1 &= 7; +- if (align1 + len1 >= page_size) ++ if ((align1 + len1) * sizeof (CHAR) >= page_size) + return; + + align2 &= 7; +- if (align2 + len1 + len2 >= page_size) ++ if ((align2 + len1 + len2) * sizeof (CHAR) >= page_size) + return; + +- s1 = (char *) (buf1 + align1); +- s2 = (char *) (buf2 + align2); ++ s1 = (CHAR *) (buf1) + align1; ++ s2 = (CHAR *) (buf2) + align2; + + for (i = 0; i < len1; ++i) + s1[i] = 32 + 23 * i % (max_char - 32); +@@ -120,26 +146,26 @@ test_main (void) + + for (i = 0; i < 16; ++i) + { +- do_test (0, 0, i, i, 127); +- do_test (0, 0, i, i, 255); +- do_test (0, i, i, i, 127); +- do_test (i, 0, i, i, 255); ++ do_test (0, 0, i, i, SMALL_CHAR); ++ do_test (0, 0, i, i, BIG_CHAR); ++ do_test (0, i, i, i, SMALL_CHAR); ++ do_test (i, 0, i, i, BIG_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (0, 0, 8 << i, 8 << i, 127); +- do_test (8 - i, 2 * i, 8 << i, 8 << i, 127); +- do_test (0, 0, 8 << i, 2 << i, 127); +- do_test (8 - i, 2 * i, 8 << i, 2 << i, 127); ++ do_test (0, 0, 8 << i, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 8 << i, SMALL_CHAR); ++ do_test (0, 0, 8 << i, 2 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 2 << i, SMALL_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (i, 2 * i, 8 << i, 1, 127); +- do_test (2 * i, i, 8 << i, 1, 255); +- do_test (i, i, 8 << i, 10, 127); +- do_test (i, i, 8 << i, 10, 255); ++ do_test (i, 2 * i, 8 << i, 1, SMALL_CHAR); ++ do_test (2 * i, i, 8 << i, 1, BIG_CHAR); ++ do_test (i, i, 8 << i, 10, SMALL_CHAR); ++ do_test (i, i, 8 << i, 10, BIG_CHAR); + } + + return ret; +diff --git a/benchtests/bench-wcscat.c b/benchtests/bench-wcscat.c +new file mode 100644 +index 0000000..cd0dbc0 +--- /dev/null ++++ b/benchtests/bench-wcscat.c +@@ -0,0 +1,20 @@ ++/* Measure wcscat functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strcat.c" +diff --git a/string/strcat.c b/string/strcat.c +index f9e4bc6..017bb41 100644 +--- a/string/strcat.c ++++ b/string/strcat.c +@@ -20,11 +20,13 @@ + + #undef strcat + ++#ifndef STRCAT ++# define STRCAT strcat ++#endif ++ + /* Append SRC on the end of DEST. */ + char * +-strcat (dest, src) +- char *dest; +- const char *src; ++STRCAT (char *dest, const char *src) + { + char *s1 = dest; + const char *s2 = src; +diff --git a/string/test-strcat.c b/string/test-strcat.c +index 2dc189a..a822733 100644 +--- a/string/test-strcat.c ++++ b/string/test-strcat.c +@@ -18,19 +18,52 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strcat" ++#ifndef WIDE ++# define TEST_NAME "strcat" ++#else ++# define TEST_NAME "wcscat" ++#endif /* WIDE */ + #include "test-string.h" + +-typedef char *(*proto_t) (char *, const char *); +-char *simple_strcat (char *, const char *); ++#ifndef WIDE ++# define STRCAT strcat ++# define CHAR char ++# define UCHAR unsigned char ++# define sfmt "s" ++# define SIMPLE_STRCAT simple_strcat ++# define STRLEN strlen ++# define STRCMP strcmp ++# define MEMSET memset ++# define MEMCPY memcpy ++# define MEMCMP memcmp ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define STRCAT wcscat ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define sfmt "ls" ++# define SIMPLE_STRCAT simple_wcscat ++# define STRLEN wcslen ++# define STRCMP wcscmp ++# define MEMSET wmemset ++# define MEMCPY wmemcpy ++# define MEMCMP wmemcmp ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ + +-IMPL (simple_strcat, 0) +-IMPL (strcat, 1) ++typedef CHAR *(*proto_t) (CHAR *, const CHAR *); ++CHAR *SIMPLE_STRCAT (CHAR *, const CHAR *); + +-char * +-simple_strcat (char *dst, const char *src) ++IMPL (SIMPLE_STRCAT, 0) ++IMPL (STRCAT, 1) ++ ++CHAR * ++SIMPLE_STRCAT (CHAR *dst, const CHAR *src) + { +- char *ret = dst; ++ CHAR *ret = dst; + while (*dst++ != '\0'); + --dst; + while ((*dst++ = *src++) != '\0'); +@@ -38,9 +71,9 @@ simple_strcat (char *dst, const char *src) + } + + static void +-do_one_test (impl_t *impl, char *dst, const char *src) ++do_one_test (impl_t *impl, CHAR *dst, const char *src) + { +- size_t k = strlen (dst); ++ size_t k = STRLEN (dst); + if (CALL (impl, dst, src) != dst) + { + error (0, 0, "Wrong result in function %s %p %p", impl->name, +@@ -49,9 +82,9 @@ do_one_test (impl_t *impl, char *dst, const char *src) + return; + } + +- if (strcmp (dst + k, src) != 0) ++ if (STRCMP (dst + k, src) != 0) + { +- error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"", ++ error (0, 0, "Wrong result in function %s dst \"%" sfmt "\" src \"%" sfmt "\"", + impl->name, dst, src); + ret = 1; + return; +@@ -62,18 +95,18 @@ static void + do_test (size_t align1, size_t align2, size_t len1, size_t len2, int max_char) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + + align1 &= 7; +- if (align1 + len1 >= page_size) ++ if ((align1 + len1) * sizeof (CHAR) >= page_size) + return; + + align2 &= 7; +- if (align2 + len1 + len2 >= page_size) ++ if ((align2 + len1 + len2) * sizeof (CHAR) >= page_size) + return; + +- s1 = (char *) (buf1 + align1); +- s2 = (char *) (buf2 + align2); ++ s1 = (CHAR *) (buf1) + align1; ++ s2 = (CHAR *) (buf2) + align2; + + for (i = 0; i < len1; ++i) + s1[i] = 32 + 23 * i % (max_char - 32); +@@ -93,9 +126,10 @@ static void + do_random_tests (void) + { + size_t i, j, n, align1, align2, len1, len2; +- unsigned char *p1 = buf1 + page_size - 512; +- unsigned char *p2 = buf2 + page_size - 512; +- unsigned char *res; ++ UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512; ++ UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512; ++ UCHAR *p3 = (UCHAR *) buf1; ++ UCHAR *res; + + for (n = 0; n < ITERATIONS; n++) + { +@@ -132,26 +166,26 @@ do_random_tests (void) + p1[i] = 0; + else + { +- p1[i] = random () & 255; ++ p1[i] = random () & BIG_CHAR; + if (i >= align1 && i < len1 + align1 && !p1[i]) +- p1[i] = (random () & 127) + 3; ++ p1[i] = (random () & SMALL_CHAR) + 3; + } + } + for (i = 0; i < len2; i++) + { +- buf1[i] = random () & 255; +- if (!buf1[i]) +- buf1[i] = (random () & 127) + 3; ++ p3[i] = random () & BIG_CHAR; ++ if (!p3[i]) ++ p3[i] = (random () & SMALL_CHAR) + 3; + } +- buf1[len2] = 0; ++ p3[len2] = 0; + + FOR_EACH_IMPL (impl, 1) + { +- memset (p2 - 64, '\1', align2 + 64); +- memset (p2 + align2 + len2 + 1, '\1', 512 - align2 - len2 - 1); +- memcpy (p2 + align2, buf1, len2 + 1); +- res = (unsigned char *) CALL (impl, (char *) (p2 + align2), +- (char *) (p1 + align1)); ++ MEMSET (p2 - 64, '\1', align2 + 64); ++ MEMSET (p2 + align2 + len2 + 1, '\1', 512 - align2 - len2 - 1); ++ MEMCPY (p2 + align2, p3, len2 + 1); ++ res = (UCHAR *) CALL (impl, (CHAR *) (p2 + align2), ++ (CHAR *) (p1 + align1)); + if (res != p2 + align2) + { + error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd %zd) %p != %p", +@@ -169,7 +203,7 @@ do_random_tests (void) + break; + } + } +- if (memcmp (p2 + align2, buf1, len2)) ++ if (MEMCMP (p2 + align2, p3, len2)) + { + error (0, 0, "Iteration %zd - garbage in string before, %s (%zd, %zd, %zd, %zd)", + n, impl->name, align1, align2, len1, len2); +@@ -185,7 +219,7 @@ do_random_tests (void) + break; + } + } +- if (memcmp (p1 + align1, p2 + align2 + len2, len1 + 1)) ++ if (MEMCMP (p1 + align1, p2 + align2 + len2, len1 + 1)) + { + error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd, %zd)", + n, impl->name, align1, align2, len1, len2); +@@ -209,26 +243,26 @@ test_main (void) + + for (i = 0; i < 16; ++i) + { +- do_test (0, 0, i, i, 127); +- do_test (0, 0, i, i, 255); +- do_test (0, i, i, i, 127); +- do_test (i, 0, i, i, 255); ++ do_test (0, 0, i, i, SMALL_CHAR); ++ do_test (0, 0, i, i, BIG_CHAR); ++ do_test (0, i, i, i, SMALL_CHAR); ++ do_test (i, 0, i, i, BIG_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (0, 0, 8 << i, 8 << i, 127); +- do_test (8 - i, 2 * i, 8 << i, 8 << i, 127); +- do_test (0, 0, 8 << i, 2 << i, 127); +- do_test (8 - i, 2 * i, 8 << i, 2 << i, 127); ++ do_test (0, 0, 8 << i, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 8 << i, SMALL_CHAR); ++ do_test (0, 0, 8 << i, 2 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 2 << i, SMALL_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (i, 2 * i, 8 << i, 1, 127); +- do_test (2 * i, i, 8 << i, 1, 255); +- do_test (i, i, 8 << i, 10, 127); +- do_test (i, i, 8 << i, 10, 255); ++ do_test (i, 2 * i, 8 << i, 1, SMALL_CHAR); ++ do_test (2 * i, i, 8 << i, 1, BIG_CHAR); ++ do_test (i, i, 8 << i, 10, SMALL_CHAR); ++ do_test (i, i, 8 << i, 10, BIG_CHAR); + } + + do_random_tests (); +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 98b588f..6283999 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -4,7 +4,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strcpy strcpy-vx \ + stpcpy stpcpy-vx stpcpy-c \ + strncpy strncpy-vx \ +- stpncpy stpncpy-vx stpncpy-c ++ stpncpy stpncpy-vx stpncpy-c \ ++ strcat strcat-vx strcat-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -13,5 +14,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcscpy wcscpy-vx wcscpy-c \ + wcpcpy wcpcpy-vx wcpcpy-c \ + wcsncpy wcsncpy-vx wcsncpy-c \ +- wcpncpy wcpncpy-vx wcpncpy-c ++ wcpncpy wcpncpy-vx wcpncpy-c \ ++ wcscat wcscat-vx wcscat-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index ca69983..ccf4dea 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -97,6 +97,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (stpncpy); + IFUNC_VX_IMPL (wcpncpy); + ++ IFUNC_VX_IMPL (strcat); ++ IFUNC_VX_IMPL (wcscat); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strcat-c.c b/sysdeps/s390/multiarch/strcat-c.c +new file mode 100644 +index 0000000..da4fad8 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcat-c.c +@@ -0,0 +1,28 @@ ++/* Default strcat implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRCAT __strcat_c ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strcat_c, __GI_strcat, __strcat_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strcat-vx.S b/sysdeps/s390/multiarch/strcat-vx.S +new file mode 100644 +index 0000000..3915097 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcat-vx.S +@@ -0,0 +1,161 @@ ++/* Vector optimized 32/64 bit S/390 version of strcat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char * strcat (const char *dest, const char *src) ++ Concatenate two strings. ++ ++ Register usage: ++ -r0=saved dest pointer for return ++ -r1=tmp ++ -r2=dest ++ -r3=src ++ -r4=tmp ++ -r5=current_len ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++*/ ++ENTRY(__strcat_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ lgr %r0,%r2 /* Save destination pointer for return. */ ++ ++ /* STRLEN ++ r1 = loaded bytes (tmp) ++ r4 = zero byte index (tmp) ++ r2 = dst ++ */ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfenezb %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v16,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Llen_end /* Found zero within loaded bytes, end. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r1 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Llen_loop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezbs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Llen_found /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Llen_found16 ++ vl %v16,32(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Llen_found32 ++ vl %v16,48(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Llen_found48 ++ ++ aghi %r5,64 ++ j .Llen_loop /* No zero -> loop. */ ++ ++.Llen_found48: ++ aghi %r5,16 ++.Llen_found32: ++ aghi %r5,16 ++.Llen_found16: ++ aghi %r5,16 ++.Llen_found: ++ vlgvb %r4,%v16,7 /* Load byte index of zero. */ ++ algr %r5,%r4 ++ ++.Llen_end: ++ /* STRCPY ++ %r1 = loaded bytes (tmp) ++ %r4 = zero byte index (tmp) ++ %r3 = curr src pointer ++ %r2 = curr dst pointer ++ */ ++ la %r2,0(%r5,%r2) /* strcpy at end of dst-string. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Lcpy_found_align /* If found zero within loaded bytes, ++ copy bytes before and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r4 /* Compute highest index to 16byte boundary. */ ++ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lcpy_loop: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lcpy_found_v16_0 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3)/* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezbs %v17,%v18,%v18 ++ je .Lcpy_found_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezbs %v17,%v16,%v16 ++ je .Lcpy_found_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezbs %v17,%v18,%v18 ++ je .Lcpy_found_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ j .Lcpy_loop /* No zero -> loop. */ ++ ++.Lcpy_found_v16_32: ++ aghi %r5,32 ++.Lcpy_found_v16_0: ++ la %r4,0(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ vstl %v16,%r1,0(%r4) /* Copy characters including zero. */ ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lcpy_found_v18_48: ++ aghi %r5,32 ++.Lcpy_found_v18_16: ++ la %r4,16(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ vstl %v18,%r1,0(%r4) /* Copy characters including zero. */ ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lcpy_found_align: ++ vstl %v16,%r5,0(%r2) /* Copy characters including zero. */ ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++END(__strcat_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strcat.c b/sysdeps/s390/multiarch/strcat.c +new file mode 100644 +index 0000000..8b5c47e +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcat.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of strcat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strcat, strcat) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcscat-c.c b/sysdeps/s390/multiarch/wcscat-c.c +new file mode 100644 +index 0000000..49fb64b +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscat-c.c +@@ -0,0 +1,25 @@ ++/* Default wcscat implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSCAT __wcscat_c ++ ++# include ++extern __typeof (__wcscat) __wcscat_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcscat-vx.S b/sysdeps/s390/multiarch/wcscat-vx.S +new file mode 100644 +index 0000000..7ee185f +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscat-vx.S +@@ -0,0 +1,175 @@ ++/* Vector optimized 32/64 bit S/390 version of wcscat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t * wcscat (wchar_t *dest, const wchar_t *src) ++ Concatenate two strings. ++ ++ Register usage: ++ -r0=saved dest pointer for return ++ -r1=tmp ++ -r2=dest ++ -r3=src ++ -r4=tmp ++ -r5=current_len ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++*/ ++ENTRY(__wcscat_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ /* __wcslen_c can handle non 4byte aligned pointers, ++ but __wcscpy_c not. Thus if either src or dest is ++ not 4byte aligned, use __wcscat_c. */ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ tmll %r3,3 /* Test if src is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ lgr %r0,%r2 /* Save destination pointer for return. */ ++ ++ /* WCSLEN ++ r1 = loaded bytes (tmp) ++ r4 = zero byte index (tmp) ++ r2 = dst ++ */ ++ ++ vfenezf %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v16,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Llen_end /* Found zero within loaded bytes, end. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r1 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Llen_loop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezfs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Llen_found /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Llen_found16 ++ vl %v16,32(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Llen_found32 ++ vl %v16,48(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Llen_found48 ++ ++ aghi %r5,64 ++ j .Llen_loop /* No zero -> loop. */ ++ ++.Llen_found48: ++ aghi %r5,16 ++.Llen_found32: ++ aghi %r5,16 ++.Llen_found16: ++ aghi %r5,16 ++.Llen_found: ++ vlgvb %r4,%v16,7 /* Load byte index of zero. */ ++ algr %r5,%r4 ++ ++.Llen_end: ++ /* WCSCPY ++ %r1 = loaded bytes (tmp) ++ %r4 = zero byte index (tmp) ++ %r3 = curr src pointer ++ %r2 = curr dst pointer ++ */ ++ la %r2,0(%r5,%r2) /* strcpy at end of dst-string. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Lcpy_found_align /* If found zero within loaded bytes, ++ copy bytes before and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r4 /* Compute highest index to 16byte boundary. */ ++ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lcpy_loop: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lcpy_found_v16_0 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Save previous part without zero to dst. */ ++ vfenezfs %v17,%v18,%v18 ++ je .Lcpy_found_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezfs %v17,%v16,%v16 ++ je .Lcpy_found_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezfs %v17,%v18,%v18 ++ je .Lcpy_found_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ j .Lcpy_loop /* No zero -> loop. */ ++ ++.Lcpy_found_v16_32: ++ aghi %r5,32 ++.Lcpy_found_v16_0: ++ la %r4,0(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ vstl %v16,%r1,0(%r4) /* Copy characters including zero. */ ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lcpy_found_v18_48: ++ aghi %r5,32 ++.Lcpy_found_v18_16: ++ la %r4,16(%r5,%r2) ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ vstl %v18,%r1,0(%r4) /* Copy characters including zero. */ ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lcpy_found_align: ++ aghi %r5,3 /* Also copy remaining bytes of found zero. */ ++ vstl %v16,%r5,0(%r2) /* Copy characters including zero. */ ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++.Lfallback: ++ jg __wcscat_c ++END(__wcscat_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcscat.c b/sysdeps/s390/multiarch/wcscat.c +new file mode 100644 +index 0000000..c6fdaa7 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscat.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of wcscat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__wcscat) ++weak_alias (__wcscat, wcscat) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 89b5b3b..9bfc78c 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy wcsncpy wcpncpy ++ wcpcpy wcsncpy wcpncpy wcscat + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcscat-ifunc.c b/wcsmbs/test-wcscat-ifunc.c +new file mode 100644 +index 0000000..53305c6 +--- /dev/null ++++ b/wcsmbs/test-wcscat-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcscat function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcscat.c" +diff --git a/wcsmbs/test-wcscat.c b/wcsmbs/test-wcscat.c +new file mode 100644 +index 0000000..9bab33b +--- /dev/null ++++ b/wcsmbs/test-wcscat.c +@@ -0,0 +1,20 @@ ++/* Test wcscat functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strcat.c" +diff --git a/wcsmbs/wcscat.c b/wcsmbs/wcscat.c +index 0d34d76..4eb2d93 100644 +--- a/wcsmbs/wcscat.c ++++ b/wcsmbs/wcscat.c +@@ -18,6 +18,9 @@ + + #include + ++#ifdef WCSCAT ++# define __wcscat WCSCAT ++#endif + + /* Append SRC on the end of DEST. */ + wchar_t * +@@ -47,4 +50,6 @@ __wcscat (dest, src) + + return dest; + } ++#ifndef WCSCAT + weak_alias (__wcscat, wcscat) ++#endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-17.patch b/SOURCES/glibc-rh1268008-17.patch new file mode 100644 index 0000000..6379a13 --- /dev/null +++ b/SOURCES/glibc-rh1268008-17.patch @@ -0,0 +1,1257 @@ +From 712d46fa89e1341b3bffc27ca2ab5d892e4b14e1 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:16:05 +0200 +Subject: [PATCH 17/30] S390: Optimize strncat wcsncat. + +upstream-commit-id: e1fe91180e4e29549f35f8ecd705b0bb4f208606 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00162.html + +This patch provides optimized versions of strncat and wcsncat with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strncat-c.c: New File. + * sysdeps/s390/multiarch/strncat-vx.S: Likewise. + * sysdeps/s390/multiarch/strncat.c: Likewise. + * sysdeps/s390/multiarch/wcsncat-c.c: Likewise. + * sysdeps/s390/multiarch/wcsncat-vx.S: Likewise. + * sysdeps/s390/multiarch/wcsncat.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strncat and + wcsncat functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strncat, wcsncat. + * wcsmbs/wcsncat.c (WCSNCAT): Define and use macro. + * string/test-strncat.c: Add wcsncat support. + * wcsmbs/test-wcsncat.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcsncat. + * benchtests/bench-strncat.c: Add wcsncat support. + * benchtests/bench-wcsncat.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcsncat. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strncat.c | 99 +++++++----- + benchtests/bench-wcsncat.c | 20 +++ + string/test-strncat.c | 132 +++++++++------ + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strncat-c.c | 23 +++ + sysdeps/s390/multiarch/strncat-vx.S | 239 ++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strncat.c | 27 ++++ + sysdeps/s390/multiarch/wcsncat-c.c | 25 +++ + sysdeps/s390/multiarch/wcsncat-vx.S | 265 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcsncat.c | 27 ++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcsncat-ifunc.c | 20 +++ + wcsmbs/test-wcsncat.c | 20 +++ + wcsmbs/wcsncat.c | 5 +- + 16 files changed, 823 insertions(+), 92 deletions(-) + create mode 100644 benchtests/bench-wcsncat.c + create mode 100644 sysdeps/s390/multiarch/strncat-c.c + create mode 100644 sysdeps/s390/multiarch/strncat-vx.S + create mode 100644 sysdeps/s390/multiarch/strncat.c + create mode 100644 sysdeps/s390/multiarch/wcsncat-c.c + create mode 100644 sysdeps/s390/multiarch/wcsncat-vx.S + create mode 100644 sysdeps/s390/multiarch/wcsncat.c + create mode 100644 wcsmbs/test-wcsncat-ifunc.c + create mode 100644 wcsmbs/test-wcsncat.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 91db23c..fd8b7ee 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat ++wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strncat.c b/benchtests/bench-strncat.c +index 2a17817..8f3339d 100644 +--- a/benchtests/bench-strncat.c ++++ b/benchtests/bench-strncat.c +@@ -1,5 +1,5 @@ + /* Measure strncat functions. +- Copyright (C) 2013 Free Software Foundation, Inc. ++ Copyright (C) 2013-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -17,33 +17,58 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strncat" ++#ifndef WIDE ++# define TEST_NAME "strncat" ++#else ++# define TEST_NAME "wcsncat" ++#endif /* WIDE */ + #include "bench-string.h" + +-typedef char *(*proto_t) (char *, const char *, size_t); +-char *stupid_strncat (char *, const char *, size_t); +-char *simple_strncat (char *, const char *, size_t); +- +-IMPL (stupid_strncat, 0) +-IMPL (strncat, 2) +- +-char * +-stupid_strncat (char *dst, const char *src, size_t n) ++#ifndef WIDE ++# define STRNCAT strncat ++# define CHAR char ++# define SIMPLE_STRNCAT simple_strncat ++# define STUPID_STRNCAT stupid_strncat ++# define STRLEN strlen ++# define MEMCMP memcmp ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define STRNCAT wcsncat ++# define CHAR wchar_t ++# define SIMPLE_STRNCAT simple_wcsncat ++# define STUPID_STRNCAT stupid_wcsncat ++# define STRLEN wcslen ++# define MEMCMP wmemcmp ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ ++ ++typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t); ++CHAR *STUPID_STRNCAT (CHAR *, const CHAR *, size_t); ++CHAR *SIMPLE_STRNCAT (CHAR *, const CHAR *, size_t); ++ ++IMPL (STUPID_STRNCAT, 0) ++IMPL (STRNCAT, 2) ++ ++CHAR * ++STUPID_STRNCAT (CHAR *dst, const CHAR *src, size_t n) + { +- char *ret = dst; ++ CHAR *ret = dst; + while (*dst++ != '\0'); + --dst; + while (n--) +- if ( (*dst++ = *src++) == '\0') ++ if ((*dst++ = *src++) == '\0') + return ret; + *dst = '\0'; + return ret; + } + + static void +-do_one_test (impl_t *impl, char *dst, const char *src, size_t n) ++do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, size_t n) + { +- size_t k = strlen (dst), i, iters = INNER_LOOP_ITERS; ++ size_t k = STRLEN (dst), i, iters = INNER_LOOP_ITERS; + timing_t start, stop, cur; + + if (CALL (impl, dst, src, n) != dst) +@@ -54,10 +79,10 @@ do_one_test (impl_t *impl, char *dst, const char *src, size_t n) + return; + } + +- size_t len = strlen (src); +- if (memcmp (dst + k, src, len + 1 > n ? n : len + 1) != 0) ++ size_t len = STRLEN (src); ++ if (MEMCMP (dst + k, src, len + 1 > n ? n : len + 1) != 0) + { +- error (0, 0, "Incorrect cancatination in function %s", ++ error (0, 0, "Incorrect concatenation in function %s", + impl->name); + ret = 1; + return; +@@ -88,20 +113,20 @@ do_test (size_t align1, size_t align2, size_t len1, size_t len2, + size_t n, int max_char) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + + align1 &= 7; +- if (align1 + len1 >= page_size) ++ if ((align1 + len1) * sizeof (CHAR) >= page_size) + return; +- if (align1 + n > page_size) ++ if ((align1 + n) * sizeof (CHAR) > page_size) + return; + align2 &= 7; +- if (align2 + len1 + len2 >= page_size) ++ if ((align2 + len1 + len2) * sizeof (CHAR) >= page_size) + return; +- if (align2 + len1 + n > page_size) ++ if ((align2 + len1 + n) * sizeof (CHAR) > page_size) + return; +- s1 = (char *) (buf1 + align1); +- s2 = (char *) (buf2 + align2); ++ s1 = (CHAR *) (buf1) + align1; ++ s2 = (CHAR *) (buf2) + align2; + + for (i = 0; i < len1; ++i) + s1[i] = 32 + 23 * i % (max_char - 32); +@@ -136,25 +161,25 @@ main (void) + + for (n = 2; n <= 2048; n*=4) + { +- do_test (0, 2, 2, 2, n, 127); +- do_test (0, 0, 4, 4, n, 127); +- do_test (4, 0, 4, 4, n, 255); +- do_test (0, 0, 8, 8, n, 127); +- do_test (0, 8, 8, 8, n, 127); ++ do_test (0, 2, 2, 2, n, SMALL_CHAR); ++ do_test (0, 0, 4, 4, n, SMALL_CHAR); ++ do_test (4, 0, 4, 4, n, BIG_CHAR); ++ do_test (0, 0, 8, 8, n, SMALL_CHAR); ++ do_test (0, 8, 8, 8, n, SMALL_CHAR); + + for (i = 1; i < 8; ++i) + { +- do_test (0, 0, 8 << i, 8 << i, n, 127); +- do_test (8 - i, 2 * i, 8 << i, 8 << i, n, 127); +- do_test (0, 0, 8 << i, 2 << i, n, 127); +- do_test (8 - i, 2 * i, 8 << i, 2 << i, n, 127); ++ do_test (0, 0, 8 << i, 8 << i, n, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 8 << i, n, SMALL_CHAR); ++ do_test (0, 0, 8 << i, 2 << i, n, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 2 << i, n, SMALL_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (i, 2 * i, 8 << i, 1, n, 127); +- do_test (2 * i, i, 8 << i, 1, n, 255); +- do_test (i, i, 8 << i, 10, n, 127); ++ do_test (i, 2 * i, 8 << i, 1, n, SMALL_CHAR); ++ do_test (2 * i, i, 8 << i, 1, n, BIG_CHAR); ++ do_test (i, i, 8 << i, 10, n, SMALL_CHAR); + } + } + +diff --git a/benchtests/bench-wcsncat.c b/benchtests/bench-wcsncat.c +new file mode 100644 +index 0000000..b9d7c3f +--- /dev/null ++++ b/benchtests/bench-wcsncat.c +@@ -0,0 +1,20 @@ ++/* Measure wcsncat functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strncat.c" +diff --git a/string/test-strncat.c b/string/test-strncat.c +index 2bfe25f..790d8aa 100644 +--- a/string/test-strncat.c ++++ b/string/test-strncat.c +@@ -17,33 +17,64 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strncat" ++#ifndef WIDE ++# define TEST_NAME "strncat" ++#else ++# define TEST_NAME "wcsncat" ++#endif /* WIDE */ + #include "test-string.h" + +-typedef char *(*proto_t) (char *, const char *, size_t); +-char *stupid_strncat (char *, const char *, size_t); +-char *simple_strncat (char *, const char *, size_t); ++#ifndef WIDE ++# define STRNCAT strncat ++# define CHAR char ++# define UCHAR unsigned char ++# define SIMPLE_STRNCAT simple_strncat ++# define STUPID_STRNCAT stupid_strncat ++# define STRLEN strlen ++# define MEMSET memset ++# define MEMCPY memcpy ++# define MEMCMP memcmp ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define STRNCAT wcsncat ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define SIMPLE_STRNCAT simple_wcsncat ++# define STUPID_STRNCAT stupid_wcsncat ++# define STRLEN wcslen ++# define MEMSET wmemset ++# define MEMCPY wmemcpy ++# define MEMCMP wmemcmp ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ + +-IMPL (stupid_strncat, 0) +-IMPL (strncat, 2) ++typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t); ++CHAR *STUPID_STRNCAT (CHAR *, const CHAR *, size_t); ++CHAR *SIMPLE_STRNCAT (CHAR *, const CHAR *, size_t); + +-char * +-stupid_strncat (char *dst, const char *src, size_t n) ++IMPL (STUPID_STRNCAT, 0) ++IMPL (STRNCAT, 2) ++ ++CHAR * ++STUPID_STRNCAT (CHAR *dst, const CHAR *src, size_t n) + { +- char *ret = dst; ++ CHAR *ret = dst; + while (*dst++ != '\0'); + --dst; + while (n--) +- if ( (*dst++ = *src++) == '\0') ++ if ((*dst++ = *src++) == '\0') + return ret; + *dst = '\0'; + return ret; + } + + static void +-do_one_test (impl_t *impl, char *dst, const char *src, size_t n) ++do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, size_t n) + { +- size_t k = strlen (dst); ++ size_t k = STRLEN (dst); + if (CALL (impl, dst, src, n) != dst) + { + error (0, 0, "Wrong result in function %s %p != %p", impl->name, +@@ -52,10 +83,10 @@ do_one_test (impl_t *impl, char *dst, const char *src, size_t n) + return; + } + +- size_t len = strlen (src); +- if (memcmp (dst + k, src, len + 1 > n ? n : len + 1) != 0) ++ size_t len = STRLEN (src); ++ if (MEMCMP (dst + k, src, len + 1 > n ? n : len + 1) != 0) + { +- error (0, 0, "Incorrect cancatination in function %s", ++ error (0, 0, "Incorrect concatenation in function %s", + impl->name); + ret = 1; + return; +@@ -74,20 +105,20 @@ do_test (size_t align1, size_t align2, size_t len1, size_t len2, + size_t n, int max_char) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + + align1 &= 7; +- if (align1 + len1 >= page_size) ++ if ((align1 + len1) * sizeof (CHAR) >= page_size) + return; +- if (align1 + n > page_size) ++ if ((align1 + n) * sizeof (CHAR) > page_size) + return; + align2 &= 7; +- if (align2 + len1 + len2 >= page_size) ++ if ((align2 + len1 + len2) * sizeof (CHAR) >= page_size) + return; +- if (align2 + len1 + n > page_size) ++ if ((align2 + len1 + n) * sizeof (CHAR) > page_size) + return; +- s1 = (char *) (buf1 + align1); +- s2 = (char *) (buf2 + align2); ++ s1 = (CHAR *) (buf1) + align1; ++ s2 = (CHAR *) (buf2) + align2; + + for (i = 0; i < len1; ++i) + s1[i] = 32 + 23 * i % (max_char - 32); +@@ -107,9 +138,10 @@ static void + do_random_tests (void) + { + size_t i, j, n, align1, align2, len1, len2, N; +- unsigned char *p1 = buf1 + page_size - 512; +- unsigned char *p2 = buf2 + page_size - 512; +- unsigned char *res; ++ UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512; ++ UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512; ++ UCHAR *p3 = (UCHAR *) buf1; ++ UCHAR *res; + fprintf (stdout, "Number of iterations in random test = %zd\n", + ITERATIONS); + for (n = 0; n < ITERATIONS; n++) +@@ -148,26 +180,26 @@ do_random_tests (void) + p1[i] = 0; + else + { +- p1[i] = random () & 255; ++ p1[i] = random () & BIG_CHAR; + if (i >= align1 && i < len1 + align1 && !p1[i]) +- p1[i] = (random () & 127) + 3; ++ p1[i] = (random () & SMALL_CHAR) + 3; + } + } + for (i = 0; i < len2; i++) + { +- buf1[i] = random () & 255; +- if (!buf1[i]) +- buf1[i] = (random () & 127) + 3; ++ p3[i] = random () & BIG_CHAR; ++ if (!p3[i]) ++ p3[i] = (random () & SMALL_CHAR) + 3; + } +- buf1[len2] = 0; ++ p3[len2] = 0; + + FOR_EACH_IMPL (impl, 1) + { +- memset (p2 - 64, '\1', align2 + 64); +- memset (p2 + align2 + len2 + 1, '\1', 512 - align2 - len2 - 1); +- memcpy (p2 + align2, buf1, len2 + 1); +- res = (unsigned char *) CALL (impl, (char *) (p2 + align2), +- (char *) (p1 + align1), N); ++ MEMSET (p2 - 64, '\1', align2 + 64); ++ MEMSET (p2 + align2 + len2 + 1, '\1', 512 - align2 - len2 - 1); ++ MEMCPY (p2 + align2, p3, len2 + 1); ++ res = (UCHAR *) CALL (impl, (CHAR *) (p2 + align2), ++ (CHAR *) (p1 + align1), N); + if (res != p2 + align2) + { + error (0, 0, "Iteration %zd - wrong result in function %s " +@@ -187,7 +219,7 @@ do_random_tests (void) + break; + } + } +- if (memcmp (p2 + align2, buf1, len2)) ++ if (MEMCMP (p2 + align2, p3, len2)) + { + error (0, 0, "Iteration %zd - garbage in string before, %s " + "(%zd, %zd, %zd, %zd, %zd)", +@@ -220,7 +252,7 @@ do_random_tests (void) + ret = 1; + } + } +- if (memcmp (p1 + align1, p2 + align2 + len2, ++ if (MEMCMP (p1 + align1, p2 + align2 + len2, + (len1 + 1) > N ? N : len1 + 1)) + { + error (0, 0, "Iteration %zd - different strings, %s " +@@ -246,25 +278,25 @@ main (void) + + for (n = 2; n <= 2048; n*=4) + { +- do_test (0, 2, 2, 2, n, 127); +- do_test (0, 0, 4, 4, n, 127); +- do_test (4, 0, 4, 4, n, 255); +- do_test (0, 0, 8, 8, n, 127); +- do_test (0, 8, 8, 8, n, 127); ++ do_test (0, 2, 2, 2, n, SMALL_CHAR); ++ do_test (0, 0, 4, 4, n, SMALL_CHAR); ++ do_test (4, 0, 4, 4, n, BIG_CHAR); ++ do_test (0, 0, 8, 8, n, SMALL_CHAR); ++ do_test (0, 8, 8, 8, n, SMALL_CHAR); + + for (i = 1; i < 8; ++i) + { +- do_test (0, 0, 8 << i, 8 << i, n, 127); +- do_test (8 - i, 2 * i, 8 << i, 8 << i, n, 127); +- do_test (0, 0, 8 << i, 2 << i, n, 127); +- do_test (8 - i, 2 * i, 8 << i, 2 << i, n, 127); ++ do_test (0, 0, 8 << i, 8 << i, n, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 8 << i, n, SMALL_CHAR); ++ do_test (0, 0, 8 << i, 2 << i, n, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, 2 << i, n, SMALL_CHAR); + } + + for (i = 1; i < 8; ++i) + { +- do_test (i, 2 * i, 8 << i, 1, n, 127); +- do_test (2 * i, i, 8 << i, 1, n, 255); +- do_test (i, i, 8 << i, 10, n, 127); ++ do_test (i, 2 * i, 8 << i, 1, n, SMALL_CHAR); ++ do_test (2 * i, i, 8 << i, 1, n, BIG_CHAR); ++ do_test (i, i, 8 << i, 10, n, SMALL_CHAR); + } + } + +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 6283999..33c1398 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -5,7 +5,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + stpcpy stpcpy-vx stpcpy-c \ + strncpy strncpy-vx \ + stpncpy stpncpy-vx stpncpy-c \ +- strcat strcat-vx strcat-c ++ strcat strcat-vx strcat-c \ ++ strncat strncat-vx strncat-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -15,5 +16,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcpcpy wcpcpy-vx wcpcpy-c \ + wcsncpy wcsncpy-vx wcsncpy-c \ + wcpncpy wcpncpy-vx wcpncpy-c \ +- wcscat wcscat-vx wcscat-c ++ wcscat wcscat-vx wcscat-c \ ++ wcsncat wcsncat-vx wcsncat-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index ccf4dea..1e57c0e 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -100,6 +100,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strcat); + IFUNC_VX_IMPL (wcscat); + ++ IFUNC_VX_IMPL (strncat); ++ IFUNC_VX_IMPL (wcsncat); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strncat-c.c b/sysdeps/s390/multiarch/strncat-c.c +new file mode 100644 +index 0000000..f90f0e0 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncat-c.c +@@ -0,0 +1,23 @@ ++/* Default strncat implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRNCAT __strncat_c ++ ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/strncat-vx.S b/sysdeps/s390/multiarch/strncat-vx.S +new file mode 100644 +index 0000000..7f35696 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncat-vx.S +@@ -0,0 +1,239 @@ ++/* Vector optimized 32/64 bit S/390 version of strncat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char * strncat (const char *dest, const char *src, size_t n) ++ Concatenate two strings - at most n characters of src. ++ ++ Register usage: ++ -r0=saved dest pointer for return ++ -r1=tmp ++ -r2=dest ++ -r3=src ++ -r4=n ++ -r5=current_len ++ -r6=tmp ++ -r7=tmp ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++ -v31=register save area for r6, r7 ++*/ ++ENTRY(__strncat_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r4,0 ++ ber %r14 /* Nothing to do, if n == 0. */ ++ lgr %r0,%r2 /* Save destination pointer for return. */ ++ vlvgp %v31,%r6,%r7 /* Save registers. */ ++ ++ /* STRLEN ++ %r1 = loaded bytes (tmp) ++ %r6 = zero byte index (tmp) ++ %r2 = dst ++ */ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfenezb %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v16,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Llen_end /* Found zero within loaded bytes, end. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r1 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Llen_loop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezbs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Llen_found /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Llen_found16 ++ vl %v16,32(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Llen_found32 ++ vl %v16,48(%r5,%r2) ++ vfenezbs %v16,%v16,%v16 ++ je .Llen_found48 ++ ++ aghi %r5,64 ++ j .Llen_loop /* No zero -> loop. */ ++ ++.Llen_found48: ++ aghi %r5,16 ++.Llen_found32: ++ aghi %r5,16 ++.Llen_found16: ++ aghi %r5,16 ++.Llen_found: ++ vlgvb %r1,%v16,7 /* Load byte index of zero. */ ++ algr %r5,%r1 ++ ++.Llen_end: ++ /* STRCPY ++ %r1 = zero byte index (tmp) ++ %r6 = loaded bytes (tmp) ++ %r3 = curr src pointer ++ %r2 = curr dst pointer ++ %r7 = border, tmp ++ */ ++ la %r2,0(%r5,%r2) /* strcpy at end of dst-string. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r6,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r6,%r6 /* Convert 32bit to 64bit. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ clgrjle %r4,%r6,.Lcpy_remaining_v16 /* If n <= loaded-bytes ++ -> process remaining. */ ++ ++ /* n > loaded-byte-count. */ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r1,%r6,.Lcpy_found_v16_store /* Found zero within loaded ++ bytes, copy and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r7,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r7 /* Compute highest index to 16byte boundary. */ ++ ++ /* Zero not found and n > loaded-byte-count. */ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* ++ Now we are 16byte aligned, so we can load a full vreg ++ without page fault. ++ */ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lcpy_loop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ clgijl %r4,17,.Lcpy_remaining_v16 /* If n <=16, ++ process remaining bytes. */ ++.Lcpy_lt64: ++ lgr %r7,%r4 ++ slgfi %r7,16 /* border_len = n - 16. */ ++ ++ /* If current_len >= border then process remaining bytes. */ ++ clgrjhe %r5,%r7,.Lcpy_remaining_v16 ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lcpy_found_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lcpy_remaining_v18 ++ vfenezbs %v17,%v18,%v18 ++ je .Lcpy_found_v18 ++ vl %v16,16(%r5,%r3) ++ vst %v18,0(%r5,%r2) ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lcpy_remaining_v16 ++ vfenezbs %v17,%v16,%v16 ++ je .Lcpy_found_v16 ++ vl %v18,16(%r5,%r3) ++ vst %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Lcpy_remaining_v18: ++ vlr %v16,%v18 ++.Lcpy_remaining_v16: ++ /* v16 contains the remaining bytes [1...16]. ++ Store remaining bytes and append string-termination. */ ++ vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ slgrk %r7,%r4,%r5 /* Remaining bytes = maxlen - current_len. */ ++ aghi %r7,-1 /* vstl needs highest index. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ la %r2,0(%r5,%r2) /* vstl has no index register. */ ++ /* Zero-index within remaining-bytes, store up to zero and end. */ ++ clgrjle %r1,%r7,.Lcpy_found_v16_store ++ vstl %v16,%r7,0(%r2) /* Store remaining bytes. */ ++ lghi %r1,0 ++ stc %r1,1(%r7,%r2) /* Store string-null-termination beyond n. */ ++.Lcpy_end: ++ /* Restore saved registers. */ ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lcpy_found_v16_32: ++ aghi %r5,32 ++ j .Lcpy_found_v16 ++.Lcpy_found_v18_48: ++ aghi %r5,32 ++.Lcpy_found_v18_16: ++ aghi %r5,16 ++.Lcpy_found_v18: ++ vlr %v16,%v18 ++.Lcpy_found_v16: ++ /* v16 contains a zero. Store remaining bytes to zero. current_len ++ has not reached border, thus checking for n is not needed! */ ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ la %r2,0(%r5,%r2) ++.Lcpy_found_v16_store: ++ vstl %v16,%r1,0(%r2) /* Copy characters including zero. */ ++ j .Lcpy_end ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lcpy_loop64: ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lcpy_found_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ ++ vfenezbs %v17,%v18,%v18 ++ je .Lcpy_found_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezbs %v17,%v16,%v16 ++ je .Lcpy_found_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezbs %v17,%v18,%v18 ++ je .Lcpy_found_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lcpy_loop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ j .Lcpy_lt64 ++END(__strncat_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strncat.c b/sysdeps/s390/multiarch/strncat.c +new file mode 100644 +index 0000000..82e87ad +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncat.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of strncat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strncat, strncat) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcsncat-c.c b/sysdeps/s390/multiarch/wcsncat-c.c +new file mode 100644 +index 0000000..4938ef2 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncat-c.c +@@ -0,0 +1,25 @@ ++/* Default wcsncat implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSNCAT __wcsncat_c ++ ++# include ++extern __typeof (wcsncat) __wcsncat_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcsncat-vx.S b/sysdeps/s390/multiarch/wcsncat-vx.S +new file mode 100644 +index 0000000..7e0653e +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncat-vx.S +@@ -0,0 +1,265 @@ ++/* Vector optimized 32/64 bit S/390 version of wcsncat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t * wcsncat (wchar_t *dest, const wchar_t *src, size_t n) ++ Concatenate two strings - at most n characters of src. ++ ++ Register usage: ++ -r0=saved dest pointer for return ++ -r1=tmp ++ -r2=dest ++ -r3=src ++ -r4=n ++ -r5=current_len ++ -r6=tmp ++ -r7=tmp ++ -v16=part of src ++ -v17=index of zero ++ -v18=part of src ++ -v31=register save area for r6, r7 ++*/ ++ENTRY(__wcsncat_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgfi %r4,0 ++ ber %r14 /* Nothing to do, if n == 0. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ /* If either src or dest is not 4byte aligned, use __wcsncat_c. */ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ tmll %r3,3 /* Test if src is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ lgr %r0,%r2 /* Save destination pointer for return. */ ++ vlvgp %v31,%r6,%r7 /* Save registers. */ ++ ++ /* WCSLEN ++ %r1 = loaded bytes (tmp) ++ %r6 = zero byte index (tmp) ++ %r2 = dst ++ */ ++ vfenezf %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r5,%v16,7 /* Load zero index or 16 if not found. */ ++ clrjl %r5,%r1,.Llen_end /* Found zero within loaded bytes, end. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r1 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find zero in 16byte aligned loop. */ ++.Llen_loop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfenezfs %v16,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Llen_found /* Jump away if zero was found. */ ++ vl %v16,16(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Llen_found16 ++ vl %v16,32(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Llen_found32 ++ vl %v16,48(%r5,%r2) ++ vfenezfs %v16,%v16,%v16 ++ je .Llen_found48 ++ ++ aghi %r5,64 ++ j .Llen_loop /* No zero -> loop. */ ++ ++.Llen_found48: ++ aghi %r5,16 ++.Llen_found32: ++ aghi %r5,16 ++.Llen_found16: ++ aghi %r5,16 ++.Llen_found: ++ vlgvb %r1,%v16,7 /* Load byte index of zero. */ ++ algr %r5,%r1 ++ ++.Llen_end: ++ /* WCSNCPY ++ %r1 = zero byte index (tmp) ++ %r6 = loaded bytes (tmp) ++ %r3 = curr src pointer ++ %r2 = curr dst pointer ++ %r7 = border, tmp ++ */ ++ la %r2,0(%r5,%r2) /* strcpy at end of dst-string. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r6,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r6,%r6 /* Convert 32bit to 64bit. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ /* Check range of maxlen and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ lghi %r1,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ llilf %r1,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r4,%r4,2 /* Convert character-count to byte-count. */ ++ locgrne %r4,%r1 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ clgrjle %r4,%r6,.Lcpy_remaining_v16 /* If n <= loaded-bytes ++ -> process remaining. */ ++ ++ /* n > loaded-byte-count. */ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ clrjl %r1,%r6,.Lcpy_found_v16_store /* Found zero within loaded bytes, ++ copy and return. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,15 /* current_len = 15. */ ++ slr %r5,%r1 /* Compute highest index to 16byte boundary. * ++ ++ /* Zero not found and maxlen > loaded-byte-count. */ ++ vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ ++ ahi %r5,1 /* Start loop at next character. */ ++ ++ /* ++ Now we are 16byte aligned, so we can load a full vreg ++ without page fault. ++ */ ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lcpy_loop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ clgijl %r4,17,.Lcpy_remaining_v16 /* If n <=16, ++ process remaining bytes. */ ++.Lcpy_lt64: ++ lgr %r7,%r4 ++ slgfi %r7,16 /* border_len = n - 16. */ ++ ++ clgrjhe %r5,%r7,.Lcpy_remaining_v16 ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lcpy_found_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Save previous part without zero to dst. */ ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lcpy_remaining_v18 ++ vfenezfs %v17,%v18,%v18 ++ je .Lcpy_found_v18 ++ vl %v16,16(%r5,%r3) ++ vst %v18,0(%r5,%r2) ++ aghi %r5,16 ++ ++ clgrjhe %r5,%r7,.Lcpy_remaining_v16 ++ vfenezfs %v17,%v16,%v16 ++ je .Lcpy_found_v16 ++ vl %v18,16(%r5,%r3) ++ vst %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Lcpy_remaining_v18: ++ vlr %v16,%v18 ++.Lcpy_remaining_v16: ++ /* v16 contains the remaining bytes [1...16]. ++ Store remaining bytes and append string-termination. */ ++ vfenezf %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ slgrk %r7,%r4,%r5 /* Remaining bytes = maxlen - current_len. */ ++ aghi %r7,-1 /* vstl needs highest index. */ ++ vlgvb %r1,%v17,7 /* Load zero index or 16 if not found. */ ++ la %r2,0(%r5,%r2) /* vstl has no index register. */ ++ /* Zero-index within remaining-bytes, store up to zero and end. */ ++ clgrjle %r1,%r7,.Lcpy_found_v16_store ++ vstl %v16,%r7,0(%r2) /* Store remaining bytes. */ ++ lghi %r1,0 ++ st %r1,1(%r7,%r2) /* Store string-null-termination beyond n. */ ++.Lcpy_end: ++ /* Restore saved registers. */ ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ lgr %r2,%r0 /* Load saved dest-ptr. */ ++ br %r14 ++ ++.Lcpy_found_v16_32: ++ aghi %r5,32 ++ j .Lcpy_found_v16 ++.Lcpy_found_v18_48: ++ aghi %r5,32 ++.Lcpy_found_v18_16: ++ aghi %r5,16 ++.Lcpy_found_v18: ++ vlr %v16,%v18 ++.Lcpy_found_v16: ++ /* v16 contains a zero. Store remaining bytes to zero. current_len ++ has not reached border, thus checking for n is not needed! */ ++ vlgvb %r1,%v17,7 /* Load byte index of zero. */ ++ la %r2,0(%r5,%r2) ++.Lcpy_found_v16_store: ++ aghi %r1,3 /* Also copy remaining bytes of zero. */ ++ vstl %v16,%r1,0(%r2) /* Copy characters including zero. */ ++ j .Lcpy_end ++ ++ /* Find zero in 16byte aligned loop. */ ++.Lcpy_loop2: ++ vl %v16,16(%r5,%r3) ++ vst %v18,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Lcpy_loop64: ++ vl %v16,0(%r5,%r3) ++ vfenezfs %v17,%v16,%v16 /* Find element not equal with zero search. */ ++ je .Lcpy_found_v16 /* Jump away if zero was found. */ ++ vl %v18,16(%r5,%r3) /* Load next part of s. */ ++ vst %v16,0(%r5,%r2) /* Save previous part without zero to dst. */ ++ vfenezfs %v17,%v18,%v18 ++ je .Lcpy_found_v18_16 ++ vl %v16,32(%r5,%r3) ++ vst %v18,16(%r5,%r2) ++ vfenezfs %v17,%v16,%v16 ++ je .Lcpy_found_v16_32 ++ vl %v18,48(%r5,%r3) ++ vst %v16,32(%r5,%r2) ++ vfenezfs %v17,%v18,%v18 ++ je .Lcpy_found_v18_48 ++ vst %v18,48(%r5,%r2) ++ ++ aghi %r5,64 ++ lgr %r1,%r5 /* If %r5 + 64 < maxlen? -> loop64. */ ++ aghi %r1,64 ++ clgrjl %r1,%r4,.Lcpy_loop64 ++ ++ vl %v16,0(%r5,%r3) /* Load s. */ ++ j .Lcpy_lt64 ++ ++.Lfallback: ++ jg __wcsncat_c ++END(__wcsncat_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcsncat.c b/sysdeps/s390/multiarch/wcsncat.c +new file mode 100644 +index 0000000..621444d +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncat.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcsncat. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcsncat, wcsncat) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 9bfc78c..44b1502 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy wcsncpy wcpncpy wcscat ++ wcpcpy wcsncpy wcpncpy wcscat wcsncat + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcsncat-ifunc.c b/wcsmbs/test-wcsncat-ifunc.c +new file mode 100644 +index 0000000..5497f7d +--- /dev/null ++++ b/wcsmbs/test-wcsncat-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcsncat function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcsncat.c" +diff --git a/wcsmbs/test-wcsncat.c b/wcsmbs/test-wcsncat.c +new file mode 100644 +index 0000000..8b91a18 +--- /dev/null ++++ b/wcsmbs/test-wcsncat.c +@@ -0,0 +1,20 @@ ++/* Test wcsncat functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strncat.c" +diff --git a/wcsmbs/wcsncat.c b/wcsmbs/wcsncat.c +index 2131466..21a3a1e 100644 +--- a/wcsmbs/wcsncat.c ++++ b/wcsmbs/wcsncat.c +@@ -18,10 +18,13 @@ + + #include + ++#ifndef WCSNCAT ++# define WCSNCAT wcsncat ++#endif + + /* Append no more than N wide-character of SRC onto DEST. */ + wchar_t * +-wcsncat (dest, src, n) ++WCSNCAT (dest, src, n) + wchar_t *dest; + const wchar_t *src; + size_t n; +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-18.patch b/SOURCES/glibc-rh1268008-18.patch new file mode 100644 index 0000000..0ff8f31 --- /dev/null +++ b/SOURCES/glibc-rh1268008-18.patch @@ -0,0 +1,586 @@ +From 111012ea9031349ebbd7cc992b71662bdd10397c Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:18:25 +0200 +Subject: [PATCH 18/30] S390: Optimize strcmp and wcscmp. + +upstream-commit-id: 63724a6db60f98e91da474d11d83a19aa10fc54e +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00084.html + +This patch provides optimized versions of strcmp and wcscmp with the z13 +vector instructions. + +The architecture specific string.h had a typo, which leads to ommiting the +inline version in this file if __USE_STRING_INLINES is defined. +Tested this inline version by tweaking test-strcmp.c. + +ChangeLog: + + * sysdeps/s390/multiarch/strcmp-vx.S: New File. + * sysdeps/s390/multiarch/strcmp.c: Likewise. + * sysdeps/s390/multiarch/wcscmp-c.c: Likewise. + * sysdeps/s390/multiarch/wcscmp-vx.S: Likewise. + * sysdeps/s390/multiarch/wcscmp.c: Likewise. + * sysdeps/s390/s390-32/multiarch/strcmp.c: Likewise. + * sysdeps/s390/s390-64/multiarch/strcmp.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strcmp and + wcscmp functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strcmp, wcscmp. + * string/strcmp.c (STRCMP): Define and use macro. + * benchtests/bench-wcscmp.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcscmp. + * sysdeps/s390/bits/string.h: Fix typo: _HAVE_STRING_ARCH_strcmp + instead of _HAVE_STRING_ARCH_memchr. +--- + benchtests/Makefile | 3 +- + benchtests/bench-wcscmp.c | 20 +++++ + string/strcmp.c | 6 +- + sysdeps/s390/bits/string.h | 4 +- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strcmp-vx.S | 116 +++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strcmp.c | 26 ++++++ + sysdeps/s390/multiarch/wcscmp-c.c | 30 +++++++ + sysdeps/s390/multiarch/wcscmp-vx.S | 131 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcscmp.c | 27 +++++++ + sysdeps/s390/s390-32/multiarch/strcmp.c | 21 +++++ + sysdeps/s390/s390-64/multiarch/strcmp.c | 21 +++++ + 13 files changed, 408 insertions(+), 6 deletions(-) + create mode 100644 benchtests/bench-wcscmp.c + create mode 100644 sysdeps/s390/multiarch/strcmp-vx.S + create mode 100644 sysdeps/s390/multiarch/strcmp.c + create mode 100644 sysdeps/s390/multiarch/wcscmp-c.c + create mode 100644 sysdeps/s390/multiarch/wcscmp-vx.S + create mode 100644 sysdeps/s390/multiarch/wcscmp.c + create mode 100644 sysdeps/s390/s390-32/multiarch/strcmp.c + create mode 100644 sysdeps/s390/s390-64/multiarch/strcmp.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index fd8b7ee..f6333eb 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -38,7 +38,8 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strcat strchr strchrnul strcmp strcpy strcspn strlen \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok +-wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat ++wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ ++ wcsncmp + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-wcscmp.c b/benchtests/bench-wcscmp.c +new file mode 100644 +index 0000000..bd483a2 +--- /dev/null ++++ b/benchtests/bench-wcscmp.c +@@ -0,0 +1,20 @@ ++/* Measure wcscmp functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strcmp.c" +diff --git a/string/strcmp.c b/string/strcmp.c +index 8229d7c..5384db9 100644 +--- a/string/strcmp.c ++++ b/string/strcmp.c +@@ -20,11 +20,15 @@ + + #undef strcmp + ++#ifndef STRCMP ++# define STRCMP strcmp ++#endif ++ + /* Compare S1 and S2, returning less than, equal to or + greater than zero if S1 is lexicographically less than, + equal to or greater than S2. */ + int +-strcmp (p1, p2) ++STRCMP (p1, p2) + const char *p1; + const char *p2; + { +diff --git a/sysdeps/s390/bits/string.h b/sysdeps/s390/bits/string.h +index f3070f1..037aa71 100644 +--- a/sysdeps/s390/bits/string.h ++++ b/sysdeps/s390/bits/string.h +@@ -226,8 +226,8 @@ memchr (const void *__str, int __c, size_t __n) + } + #endif + +-/* Search N bytes of S for C. */ +-#define _HAVE_STRING_ARCH_memchr 1 ++/* Compare S1 and S2. */ ++#define _HAVE_STRING_ARCH_strchr 1 + #ifndef _FORCE_INLINES + __STRING_INLINE int + strcmp (const char *__s1, const char *__s2) +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 33c1398..d8fbd55 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -6,7 +6,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strncpy strncpy-vx \ + stpncpy stpncpy-vx stpncpy-c \ + strcat strcat-vx strcat-c \ +- strncat strncat-vx strncat-c ++ strncat strncat-vx strncat-c \ ++ strcmp strcmp-vx + endif + + ifeq ($(subdir),wcsmbs) +@@ -17,5 +18,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsncpy wcsncpy-vx wcsncpy-c \ + wcpncpy wcpncpy-vx wcpncpy-c \ + wcscat wcscat-vx wcscat-c \ +- wcsncat wcsncat-vx wcsncat-c ++ wcsncat wcsncat-vx wcsncat-c \ ++ wcscmp wcscmp-vx wcscmp-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index 1e57c0e..196d3ec 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -103,6 +103,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strncat); + IFUNC_VX_IMPL (wcsncat); + ++ IFUNC_VX_IMPL (strcmp); ++ IFUNC_VX_IMPL (wcscmp); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strcmp-vx.S b/sysdeps/s390/multiarch/strcmp-vx.S +new file mode 100644 +index 0000000..57fce75 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcmp-vx.S +@@ -0,0 +1,116 @@ ++/* Vector optimized 32/64 bit S/390 version of strcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* int strcmp (const char *s1, const char *s2) ++ Compare two strings ++ ++ Register usage: ++ -r1=loaded byte count s1 ++ -r2=s1 ++ -r3=s2 ++ -r4=loaded byte coutn s2, tmp ++ -r5=current_len ++ -v16=part of s1 ++ -v17=part of s2 ++ -v18=index of unequal ++*/ ++ENTRY(__strcmp_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++.Lloop: ++ vlbb %v16,0(%r5,%r2),6 /* Load s1 to block boundary. */ ++ vlbb %v17,0(%r5,%r3),6 /* Load s2 to block boundary. */ ++ lcbb %r1,0(%r5,%r2),6 /* Get loaded byte count of s1. */ ++ jo .Llt16_1 /* Jump away if vr is not fully loaded. */ ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 /* Jump away if vr is not fully loaded. */ ++ /* Both vrs are fully loaded. */ ++ aghi %r5,16 ++ vfenezbs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r1,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezbs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r1,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezbs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r1,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezbs %v18,%v16,%v17 ++ jno .Lfound ++ j .Lloop ++ ++.Llt16_1: ++ lcbb %r4,0(%r5,%r3),6 /* Get loaded byte count of s2. */ ++.Llt16_2: ++ clr %r1,%r4 ++ locrh %r1,%r4 /* Get minimum of bytes loaded in s1/2. */ ++ algfr %r5,%r1 /* Add smallest loaded bytes to current_len. */ ++ vfenezbs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ vlgvb %r4,%v18,7 /* Get not equal index or 16 if all equal. */ ++ clrjl %r4,%r1,.Lfound /* Jump away if miscompare is within loaded ++ bytes. */ ++ j .Lloop ++ ++.Lfound: ++ je .Lend_equal ++ lghi %r2,1 ++ lghi %r1,-1 ++ locgrl %r2,%r1 ++ br %r14 ++.Lend_equal: ++ lghi %r2,0 ++ br %r14 ++END(__strcmp_vx) ++ ++# define strcmp __strcmp_c ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) strong_alias(__strcmp_c, __GI_strcmp) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++ ++#include +diff --git a/sysdeps/s390/multiarch/strcmp.c b/sysdeps/s390/multiarch/strcmp.c +new file mode 100644 +index 0000000..dd462a2 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcmp.c +@@ -0,0 +1,26 @@ ++/* Multiple versions of strcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++ ++# undef strcmp ++s390_vx_libc_ifunc2 (__strcmp, strcmp) ++#endif +diff --git a/sysdeps/s390/multiarch/wcscmp-c.c b/sysdeps/s390/multiarch/wcscmp-c.c +new file mode 100644 +index 0000000..8358e1f +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscmp-c.c +@@ -0,0 +1,30 @@ ++/* Default wcscmp implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSCMP __wcscmp_c ++ ++# include ++extern __typeof (wcscmp) __wcscmp_c; ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__wcscmp_c, __GI_wcscmp, __wcscmp_c); ++# endif /* SHARED */ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcscmp-vx.S b/sysdeps/s390/multiarch/wcscmp-vx.S +new file mode 100644 +index 0000000..2c9e610 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscmp-vx.S +@@ -0,0 +1,131 @@ ++/* Vector optimized 32/64 bit S/390 version of wcscmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* int wcscmp (const wchar_t *s1, const wchar_t *s2) ++ Compare two strings ++ ++ Register usage: ++ -r1=loaded byte count s1 ++ -r2=s1 ++ -r3=s2 ++ -r4=loaded byte coutn s2, tmp ++ -r5=current_len ++ -v16=part of s1 ++ -v17=part of s2 ++ -v18=index of unequal ++*/ ++ENTRY(__wcscmp_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++.Lloop: ++ vlbb %v16,0(%r5,%r2),6 /* Load s1 to block boundary. */ ++ vlbb %v17,0(%r5,%r3),6 /* Load s2 to block boundary. */ ++ lcbb %r1,0(%r5,%r2),6 /* Get loaded byte count of s1. */ ++ jo .Llt16_1 /* Jump away if vr is not fully loaded. */ ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 /* Jump away if vr is not fully loaded. */ ++ /* Both vrs are fully loaded. */ ++ aghi %r5,16 ++ vfenezfs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r1,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezfs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r1,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezfs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r1,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r4,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezfs %v18,%v16,%v17 ++ jno .Lfound ++ j .Lloop ++ ++.Lcmp_one_char: ++ /* At least one of both strings is not 4-byte aligned ++ and there is no full character before next block-boundary. ++ Compare one character to get over the boundary and ++ proceed with normal loop! */ ++ vlef %v16,0(%r5,%r2),0 /* Load one character. */ ++ vlef %v17,0(%r5,%r3),0 ++ lghi %r1,4 /* Loaded byte count is 4. */ ++ j .Llt_cmp /* Proceed with comparision. */ ++ ++.Llt16_1: ++ lcbb %r4,0(%r5,%r3),6 /* Get loaded byte count of s2. */ ++.Llt16_2: ++ clr %r1,%r4 ++ locrh %r1,%r4 /* Get minimum of bytes loaded in s1/2. */ ++ nill %r1,65532 /* Align bytes loaded to full characters. */ ++ jz .Lcmp_one_char /* Jump away if no full char is available. */ ++.Llt_cmp: ++ algfr %r5,%r1 /* Add smallest loaded bytes to current_len. */ ++ vfenezfs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ vlgvb %r4,%v18,7 /* Get not equal index or 16 if all equal. */ ++ clrjl %r4,%r1,.Lfound /* Jump away if miscompare is within loaded ++ bytes. */ ++ j .Lloop ++ ++.Lfound: ++ /* vfenezf found an unequal element or zero. ++ This instruction compares unsigned words, but wchar_t is signed. ++ Thus we have to compare the found element again. */ ++ vlgvb %r4,%v18,7 /* Extract not equal byte-index, */ ++ srl %r4,2 /* Convert it to character-index. */ ++ vlgvf %r3,%v16,0(%r4) /* Load character-values. */ ++ vlgvf %r4,%v17,0(%r4) ++ cr %r3,%r4 ++ je .Lend_equal ++ lghi %r2,1 ++ lghi %r1,-1 ++ locgrl %r2,%r1 ++ br %r14 ++.Lend_equal: ++ lghi %r2,0 ++ br %r14 ++END(__wcscmp_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcscmp.c b/sysdeps/s390/multiarch/wcscmp.c +new file mode 100644 +index 0000000..99bae4f +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscmp.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcscmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcscmp, wcscmp) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/s390-32/multiarch/strcmp.c b/sysdeps/s390/s390-32/multiarch/strcmp.c +new file mode 100644 +index 0000000..1598bbc +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/strcmp.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of strcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/strcmp.S will be used. */ ++#include +diff --git a/sysdeps/s390/s390-64/multiarch/strcmp.c b/sysdeps/s390/s390-64/multiarch/strcmp.c +new file mode 100644 +index 0000000..1598bbc +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/strcmp.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of strcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/strcmp.S will be used. */ ++#include +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-19.patch b/SOURCES/glibc-rh1268008-19.patch new file mode 100644 index 0000000..eb308c8 --- /dev/null +++ b/SOURCES/glibc-rh1268008-19.patch @@ -0,0 +1,1314 @@ +From 1026f1e15a84134fd19f58c98af85ec9474f7722 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:21:50 +0200 +Subject: [PATCH 19/30] S390: Optimize strncmp and wcsncmp. (AND COMMON-CODE + WCSNCMP - picked form upstream) + +upstream-commit-id: cee82e70ccb7b2f054cd781b0a603ae244523e72 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00087.html + +common-code wcsncmp: +upstream-commit-id: 920a0395ba9fa5949ec87aaf5daa0259da16749d +https://www.sourceware.org/ml/libc-alpha/2015-04/msg00098.html + +This patch provides optimized versions of strncmp and wcsncmp with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strncmp-c.c: New File. + * sysdeps/s390/multiarch/strncmp-vx.S: Likewise. + * sysdeps/s390/multiarch/strncmp.c: Likewise. + * sysdeps/s390/multiarch/wcsncmp-c.c: Likewise. + * sysdeps/s390/multiarch/wcsncmp-vx.S: Likewise. + * sysdeps/s390/multiarch/wcsncmp.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strncmp and + wcsncmp functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strncmp, wcsncmp. + * wcsmbs/wcsncmp.c (WCSNCMP): Define and use macro. + * benchtests/bench-strncmp.c: Add wcsncmp support. + * benchtests/bench-wcsncmp.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcsncmp. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strncmp.c | 104 +++++++++++++----- + benchtests/bench-wcsncmp.c | 20 ++++ + localedata/tests-mbwc/dat_wcsncmp.c | 18 ++-- + localedata/tests-mbwc/tst_wcsncmp.c | 2 + + string/strncmp.c | 2 +- + string/test-strncmp.c | 175 +++++++++++++++++++++--------- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strncmp-c.c | 28 +++++ + sysdeps/s390/multiarch/strncmp-vx.S | 137 ++++++++++++++++++++++++ + sysdeps/s390/multiarch/strncmp.c | 30 ++++++ + sysdeps/s390/multiarch/wcsncmp-c.c | 25 +++++ + sysdeps/s390/multiarch/wcsncmp-vx.S | 177 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcsncmp.c | 27 +++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcsncmp-ifunc.c | 20 ++++ + wcsmbs/test-wcsncmp.c | 2 + + wcsmbs/wcsncmp.c | 41 +++---- + 19 files changed, 716 insertions(+), 105 deletions(-) + create mode 100644 benchtests/bench-wcsncmp.c + create mode 100644 sysdeps/s390/multiarch/strncmp-c.c + create mode 100644 sysdeps/s390/multiarch/strncmp-vx.S + create mode 100644 sysdeps/s390/multiarch/strncmp.c + create mode 100644 sysdeps/s390/multiarch/wcsncmp-c.c + create mode 100644 sysdeps/s390/multiarch/wcsncmp-vx.S + create mode 100644 sysdeps/s390/multiarch/wcsncmp.c + create mode 100644 wcsmbs/test-wcsncmp-ifunc.c + create mode 100644 wcsmbs/test-wcsncmp.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index f6333eb..f6342da 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp ++ wcsncmp wcsncmp + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strncmp.c b/benchtests/bench-strncmp.c +index 25df3db..496ed68 100644 +--- a/benchtests/bench-strncmp.c ++++ b/benchtests/bench-strncmp.c +@@ -17,17 +17,66 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strncmp" ++#ifdef WIDE ++# define TEST_NAME "wcsncmp" ++#else ++# define TEST_NAME "strncmp" ++#endif /* !WIDE */ + #include "bench-string.h" + +-typedef int (*proto_t) (const char *, const char *, size_t); +-int simple_strncmp (const char *, const char *, size_t); +-int stupid_strncmp (const char *, const char *, size_t); ++#ifdef WIDE ++# include ++ ++# define L(str) L##str ++# define STRNCMP wcsncmp ++# define SIMPLE_STRNCMP simple_wcsncmp ++# define STUPID_STRNCMP stupid_wcsncmp ++# define CHAR wchar_t ++# define CHARBYTES 4 ++/* Wcsncmp uses signed semantics for comparison, not unsigned. ++ Avoid using substraction since possible overflow. */ ++int ++simple_wcsncmp (const CHAR *s1, const CHAR *s2, size_t n) ++{ ++ wchar_t c1, c2; ++ while (n--) ++ { ++ c1 = *s1++; ++ c2 = *s2++; ++ if (c1 == L ('\0') || c1 != c2) ++ return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); ++ } ++ return 0; ++} + +-IMPL (stupid_strncmp, 0) +-IMPL (simple_strncmp, 0) +-IMPL (strncmp, 1) ++int ++stupid_wcsncmp (const CHAR *s1, const CHAR *s2, size_t n) ++{ ++ wchar_t c1, c2; ++ size_t ns1 = wcsnlen (s1, n) + 1, ns2 = wcsnlen (s2, n) + 1; ++ ++ n = ns1 < n ? ns1 : n; ++ n = ns2 < n ? ns2 : n; + ++ while (n--) ++ { ++ c1 = *s1++; ++ c2 = *s2++; ++ if (c1 != c2) ++ return c1 > c2 ? 1 : -1; ++ } ++ return 0; ++} ++ ++#else ++# define L(str) str ++# define STRNCMP strncmp ++# define SIMPLE_STRNCMP simple_strncmp ++# define STUPID_STRNCMP stupid_strncmp ++# define CHAR char ++# define CHARBYTES 1 ++ ++/* Strncmp uses unsigned semantics for comparison. */ + int + simple_strncmp (const char *s1, const char *s2, size_t n) + { +@@ -49,9 +98,16 @@ stupid_strncmp (const char *s1, const char *s2, size_t n) + while (n-- && (ret = *(unsigned char *) s1++ - * (unsigned char *) s2++) == 0); + return ret; + } ++#endif /* !WIDE */ ++ ++typedef int (*proto_t) (const CHAR *, const CHAR *, size_t); ++ ++IMPL (STUPID_STRNCMP, 0) ++IMPL (SIMPLE_STRNCMP, 0) ++IMPL (STRNCMP, 1) + + static void +-do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n, ++do_one_test (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t n, + int exp_result) + { + size_t i, iters = INNER_LOOP_ITERS; +@@ -74,12 +130,12 @@ do_test_limit (size_t align1, size_t align2, size_t len, size_t n, int max_char, + int exp_result) + { + size_t i, align_n; +- char *s1, *s2; ++ CHAR *s1, *s2; + + if (n == 0) + { +- s1 = (char*)(buf1 + page_size); +- s2 = (char*)(buf2 + page_size); ++ s1 = (CHAR*)(buf1 + page_size); ++ s2 = (CHAR*)(buf2 + page_size); + printf ("Length %4zd/%4zd:", len, n); + + FOR_EACH_IMPL (impl, 0) +@@ -92,16 +148,16 @@ do_test_limit (size_t align1, size_t align2, size_t len, size_t n, int max_char, + + align1 &= 15; + align2 &= 15; +- align_n = (page_size - n) & 15; ++ align_n = (page_size - n * CHARBYTES) & 15; + +- s1 = (char*)(buf1 + page_size - n); +- s2 = (char*)(buf2 + page_size - n); ++ s1 = (CHAR*)(buf1 + page_size - n * CHARBYTES); ++ s2 = (CHAR*)(buf2 + page_size - n * CHARBYTES); + + if (align1 < align_n) +- s1 -= (align_n - align1); ++ s1 = (CHAR *) ((char *) s1 - (align_n - align1)); + + if (align2 < align_n) +- s2 -= (align_n - align2); ++ s2 = (CHAR *) ((char *) s2 - (align_n - align2)); + + for (i = 0; i < n; i++) + s1[i] = s2[i] = 1 + 23 * i % max_char; +@@ -129,24 +185,24 @@ do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char, + int exp_result) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + + if (n == 0) + return; + +- align1 &= 7; +- if (align1 + n + 1 >= page_size) ++ align1 &= 63; ++ if (align1 + (n + 1) * CHARBYTES >= page_size) + return; + + align2 &= 7; +- if (align2 + n + 1 >= page_size) ++ if (align2 + (n + 1) * CHARBYTES >= page_size) + return; + +- s1 = (char*)(buf1 + align1); +- s2 = (char*)(buf2 + align2); ++ s1 = (CHAR*)(buf1 + align1); ++ s2 = (CHAR*)(buf2 + align2); + + for (i = 0; i < n; i++) +- s1[i] = s2[i] = 1 + 23 * i % max_char; ++ s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % max_char; + + s1[n] = 24 + exp_result; + s2[n] = 23; +@@ -162,7 +218,7 @@ do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char, + printf ("Length %4zd/%4zd, alignment %2zd/%2zd:", len, n, align1, align2); + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char*)s1, (char*)s2, n, exp_result); ++ do_one_test (impl, s1, s2, n, exp_result); + + putchar ('\n'); + } +diff --git a/benchtests/bench-wcsncmp.c b/benchtests/bench-wcsncmp.c +new file mode 100644 +index 0000000..8720060 +--- /dev/null ++++ b/benchtests/bench-wcsncmp.c +@@ -0,0 +1,20 @@ ++/* Measure wcsncmp functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strncmp.c" +diff --git a/localedata/tests-mbwc/dat_wcsncmp.c b/localedata/tests-mbwc/dat_wcsncmp.c +index 167ce48..f468a8b 100644 +--- a/localedata/tests-mbwc/dat_wcsncmp.c ++++ b/localedata/tests-mbwc/dat_wcsncmp.c +@@ -33,7 +33,7 @@ TST_WCSNCMP tst_wcsncmp_loc [] = { + }, + { /*input.*/ { { 0x00D1,0x00D2,0x00D3,0x0000 }, + { 0x0000,0x00D2,0x00D3,0x0000 }, 3 }, /* #06 */ +- /*expect*/ { 0,1,0x00D1, }, ++ /*expect*/ { 0,1,1, }, + }, + { /*input.*/ { { 0x00D1,0x00D2,0x00D3,0x0000 }, + { 0x00D1,0x00D2,0x00D9,0x0000 }, 2 }, /* #07 */ +@@ -41,11 +41,11 @@ TST_WCSNCMP tst_wcsncmp_loc [] = { + }, + { /*input.*/ { { 0x00D1,0x00D2,0x00D3,0x0000 }, + { 0x00D1,0x00D2,0x00D9,0x0000 }, 3 }, /* #08 */ +- /*expect*/ { 0,1,-0x0006, }, ++ /*expect*/ { 0,1,-1, }, + }, + { /*input.*/ { { 0x00D1,0x00D2,0x00D3,0x0000 }, + { 0x00D1,0x00D2,0x0000 }, 4 }, /* #09 */ +- /*expect*/ { 0,1,0x00D3, }, ++ /*expect*/ { 0,1,1, }, + }, + { .is_last = 1 } + } +@@ -75,7 +75,7 @@ TST_WCSNCMP tst_wcsncmp_loc [] = { + }, + { /*input.*/ { { 0x0041,0x0042,0x0043,0x0000 }, + { 0x0000,0x0042,0x0043,0x0000 }, 3 }, /* #06 */ +- /*expect*/ { 0,1,0x0041, }, ++ /*expect*/ { 0,1,1, }, + }, + { /*input.*/ { { 0x0041,0x0042,0x0043,0x0000 }, + { 0x0041,0x0042,0x0049,0x0000 }, 2 }, /* #07 */ +@@ -83,11 +83,11 @@ TST_WCSNCMP tst_wcsncmp_loc [] = { + }, + { /*input.*/ { { 0x0041,0x0042,0x0043,0x0000 }, + { 0x0041,0x0042,0x0049,0x0000 }, 3 }, /* #08 */ +- /*expect*/ { 0,1,-0x0006, }, ++ /*expect*/ { 0,1,-1, }, + }, + { /*input.*/ { { 0x0041,0x0042,0x0043,0x0000 }, + { 0x0041,0x0042,0x0000 }, 4 }, /* #09 */ +- /*expect*/ { 0,1,0x0043, }, ++ /*expect*/ { 0,1,1, }, + }, + { .is_last = 1 } + } +@@ -117,7 +117,7 @@ TST_WCSNCMP tst_wcsncmp_loc [] = { + }, + { /*input.*/ { { 0x3041,0x3042,0x3043,0x0000 }, + { 0x0000,0x3042,0x3043,0x0000 }, 3 }, /* #06 */ +- /*expect*/ { 0,1,0x3041, }, ++ /*expect*/ { 0,1,1, }, + }, + { /*input.*/ { { 0x3041,0x3042,0x3043,0x0000 }, + { 0x3041,0x3042,0x3049,0x0000 }, 2 }, /* #07 */ +@@ -125,11 +125,11 @@ TST_WCSNCMP tst_wcsncmp_loc [] = { + }, + { /*input.*/ { { 0x3041,0x3042,0x3043,0x0000 }, + { 0x3041,0x3042,0x3049,0x0000 }, 3 }, /* #08 */ +- /*expect*/ { 0,1,-0x0006, }, ++ /*expect*/ { 0,1,-1, }, + }, + { /*input.*/ { { 0x3041,0x3042,0x3043,0x0000 }, + { 0x3041,0x3042,0x0000 }, 4 }, /* #09 */ +- /*expect*/ { 0,1,0x3043, }, ++ /*expect*/ { 0,1,1, }, + }, + { .is_last = 1 } + } +diff --git a/localedata/tests-mbwc/tst_wcsncmp.c b/localedata/tests-mbwc/tst_wcsncmp.c +index d046ecd..e378efb 100644 +--- a/localedata/tests-mbwc/tst_wcsncmp.c ++++ b/localedata/tests-mbwc/tst_wcsncmp.c +@@ -24,6 +24,8 @@ tst_wcsncmp (FILE * fp, int debug_flg) + ws2 = TST_INPUT (wcsncmp).ws2; + n = TST_INPUT (wcsncmp).n; + ret = wcsncmp (ws1, ws2, n); ++ ret = (ret > 0 ? 1 : ret < 0 ? -1 : 0); ++ + + if (debug_flg) + { +diff --git a/string/strncmp.c b/string/strncmp.c +index d79305a..bd52138 100644 +--- a/string/strncmp.c ++++ b/string/strncmp.c +@@ -21,7 +21,7 @@ + #undef strncmp + + #ifndef STRNCMP +-#define STRNCMP strncmp ++# define STRNCMP strncmp + #endif + + /* Compare no more than N characters of S1 and S2, +diff --git a/string/test-strncmp.c b/string/test-strncmp.c +index 7169593..950bf24 100644 +--- a/string/test-strncmp.c ++++ b/string/test-strncmp.c +@@ -1,5 +1,5 @@ + /* Test and measure strncmp functions. +- Copyright (C) 1999-2012 Free Software Foundation, Inc. ++ Copyright (C) 1999-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Jakub Jelinek , 1999. + +@@ -18,18 +18,82 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strncmp" ++#ifdef WIDE ++# define TEST_NAME "wcsncmp" ++#else ++# define TEST_NAME "strncmp" ++#endif + #include "test-string.h" + +-typedef int (*proto_t) (const char *, const char *, size_t); +-int simple_strncmp (const char *, const char *, size_t); +-int stupid_strncmp (const char *, const char *, size_t); ++#ifdef WIDE ++# include ++ ++# define L(str) L##str ++# define STRNCMP wcsncmp ++# define STRCPY wcscpy ++# define STRDUP wcsdup ++# define MEMCPY wmemcpy ++# define SIMPLE_STRNCMP simple_wcsncmp ++# define STUPID_STRNCMP stupid_wcsncmp ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define CHARBYTES 4 ++# define CHAR__MAX WCHAR_MAX ++# define CHAR__MIN WCHAR_MIN ++ ++/* Wcsncmp uses signed semantics for comparison, not unsigned. ++ Avoid using substraction since possible overflow */ ++int ++simple_wcsncmp (const CHAR *s1, const CHAR *s2, size_t n) ++{ ++ wchar_t c1, c2; ++ ++ while (n--) ++ { ++ c1 = *s1++; ++ c2 = *s2++; ++ if (c1 == L('\0') || c1 != c2) ++ return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); ++ } ++ return 0; ++} + +-IMPL (stupid_strncmp, 0) +-IMPL (simple_strncmp, 0) +-IMPL (strncmp, 1) + + int ++stupid_wcsncmp (const CHAR *s1, const CHAR *s2, size_t n) ++{ ++ wchar_t c1, c2; ++ size_t ns1 = wcsnlen (s1, n) + 1, ns2 = wcsnlen (s2, n) + 1; ++ ++ n = ns1 < n ? ns1 : n; ++ n = ns2 < n ? ns2 : n; ++ ++ while (n--) ++ { ++ c1 = *s1++; ++ c2 = *s2++; ++ if (c1 != c2) ++ return c1 > c2 ? 1 : -1; ++ } ++ return 0; ++} ++ ++#else ++# define L(str) str ++# define STRNCMP strncmp ++# define STRCPY strcpy ++# define STRDUP strdup ++# define MEMCPY memcpy ++# define SIMPLE_STRNCMP simple_strncmp ++# define STUPID_STRNCMP stupid_strncmp ++# define CHAR char ++# define UCHAR unsigned char ++# define CHARBYTES 1 ++# define CHAR__MAX CHAR_MAX ++# define CHAR__MIN CHAR_MIN ++ ++/* Strncmp uses unsigned semantics for comparison. */ ++int + simple_strncmp (const char *s1, const char *s2, size_t n) + { + int ret = 0; +@@ -50,9 +114,16 @@ stupid_strncmp (const char *s1, const char *s2, size_t n) + while (n-- && (ret = *(unsigned char *) s1++ - * (unsigned char *) s2++) == 0); + return ret; + } ++#endif ++ ++typedef int (*proto_t) (const CHAR *, const CHAR *, size_t); ++ ++IMPL (STUPID_STRNCMP, 0) ++IMPL (SIMPLE_STRNCMP, 0) ++IMPL (STRNCMP, 1) + + static int +-check_result (impl_t *impl, const char *s1, const char *s2, size_t n, ++check_result (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t n, + int exp_result) + { + int result = CALL (impl, s1, s2, n); +@@ -70,7 +141,7 @@ check_result (impl_t *impl, const char *s1, const char *s2, size_t n, + } + + static void +-do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n, ++do_one_test (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t n, + int exp_result) + { + if (check_result (impl, s1, s2, n, exp_result) < 0) +@@ -82,12 +153,12 @@ do_test_limit (size_t align1, size_t align2, size_t len, size_t n, int max_char, + int exp_result) + { + size_t i, align_n; +- char *s1, *s2; ++ CHAR *s1, *s2; + + if (n == 0) + { +- s1 = (char*)(buf1 + page_size); +- s2 = (char*)(buf2 + page_size); ++ s1 = (CHAR*) (buf1 + page_size); ++ s2 = (CHAR*) (buf2 + page_size); + + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, n, 0); +@@ -97,16 +168,16 @@ do_test_limit (size_t align1, size_t align2, size_t len, size_t n, int max_char, + + align1 &= 15; + align2 &= 15; +- align_n = (page_size - n) & 15; ++ align_n = (page_size - n * CHARBYTES) & 15; + +- s1 = (char*)(buf1 + page_size - n); +- s2 = (char*)(buf2 + page_size - n); ++ s1 = (CHAR*) (buf1 + page_size - n * CHARBYTES); ++ s2 = (CHAR*) (buf2 + page_size - n * CHARBYTES); + + if (align1 < align_n) +- s1 -= (align_n - align1); ++ s1 = (CHAR *) ((char *) s1 - (align_n - align1)); + + if (align2 < align_n) +- s2 -= (align_n - align2); ++ s2 = (CHAR *) ((char *) s2 - (align_n - align2)); + + for (i = 0; i < n; i++) + s1[i] = s2[i] = 1 + 23 * i % max_char; +@@ -130,24 +201,24 @@ do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char, + int exp_result) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + + if (n == 0) + return; + +- align1 &= 7; +- if (align1 + n + 1 >= page_size) ++ align1 &= 63; ++ if (align1 + (n + 1) * CHARBYTES >= page_size) + return; + + align2 &= 7; +- if (align2 + n + 1 >= page_size) ++ if (align2 + (n + 1) * CHARBYTES >= page_size) + return; + +- s1 = (char*)(buf1 + align1); +- s2 = (char*)(buf2 + align2); ++ s1 = (CHAR*) (buf1 + align1); ++ s2 = (CHAR*) (buf2 + align2); + + for (i = 0; i < n; i++) +- s1[i] = s2[i] = 1 + 23 * i % max_char; ++ s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % max_char; + + s1[n] = 24 + exp_result; + s2[n] = 23; +@@ -161,19 +232,20 @@ do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char, + s2[n - 1] -= exp_result; + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char*)s1, (char*)s2, n, exp_result); ++ do_one_test (impl, s1, s2, n, exp_result); + } + + static void +-do_page_test (size_t offset1, size_t offset2, char *s2) ++do_page_test (size_t offset1, size_t offset2, CHAR *s2) + { +- char *s1; ++ CHAR *s1; + int exp_result; + +- if (offset1 >= page_size || offset2 >= page_size) ++ if (offset1 * CHARBYTES >= page_size || offset2 * CHARBYTES >= page_size) + return; + +- s1 = (char *) (buf1 + offset1); ++ s1 = (CHAR *) buf1; ++ s1 += offset1; + s2 += offset2; + + exp_result= *s1; +@@ -191,8 +263,8 @@ do_random_tests (void) + size_t i, j, n, align1, align2, pos, len1, len2, size; + int result; + long r; +- unsigned char *p1 = buf1 + page_size - 512; +- unsigned char *p2 = buf2 + page_size - 512; ++ UCHAR *p1 = (UCHAR *) (buf1 + page_size - 512 * CHARBYTES); ++ UCHAR *p2 = (UCHAR *) (buf2 + page_size - 512 * CHARBYTES); + + for (n = 0; n < ITERATIONS; n++) + { +@@ -240,7 +312,7 @@ do_random_tests (void) + } + + result = 0; +- memcpy (p2 + align2, p1 + align1, pos); ++ MEMCPY (p2 + align2, p1 + align1, pos); + if (pos < len1) + { + if (p2[align2 + pos] == p1[align1 + pos]) +@@ -263,7 +335,7 @@ do_random_tests (void) + + FOR_EACH_IMPL (impl, 1) + { +- r = CALL (impl, (char*)(p1 + align1), (char*)(p2 + align2), size); ++ r = CALL (impl, (CHAR *)(p1 + align1), (CHAR *)(p2 + align2), size); + /* Test whether on 64-bit architectures where ABI requires + callee to promote has the promotion been done. */ + asm ("" : "=g" (r) : "0" (r)); +@@ -282,19 +354,26 @@ do_random_tests (void) + static void + check1 (void) + { +- char *s1 = (char *)(buf1 + 0xb2c); +- char *s2 = (char *)(buf1 + 0xfd8); +- size_t i; ++ CHAR *s1 = (CHAR *)(buf1 + 0xb2c); ++ CHAR *s2 = (CHAR *)(buf1 + 0xfd8); ++ size_t i, offset; + int exp_result; + +- strcpy(s1, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrs"); +- strcpy(s2, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkLMNOPQRSTUV"); ++ strcpy(s1, L("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrs")); ++ strcpy(s2, L("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkLMNOPQRSTUV")); ++ ++ /* Check possible overflow bug for wcsncmp */ ++ s1[4] = CHAR__MAX; ++ s2[4] = CHAR__MIN; + +- for (i = 0; i < 80; i++) ++ for (offset = 0; offset < 6; offset++) + { +- exp_result = simple_strncmp (s1, s2, i); +- FOR_EACH_IMPL (impl, 0) +- check_result (impl, s1, s2, i, exp_result); ++ for (i = 0; i < 80; i++) ++ { ++ exp_result = SIMPLE_STRNCMP (s1 + offset, s2 + offset, i); ++ FOR_EACH_IMPL (impl, 0) ++ check_result (impl, s1 + offset, s2 + offset, i, exp_result); ++ } + } + } + +@@ -302,17 +381,17 @@ static void + check2 (void) + { + size_t i; +- char *s1, *s2; ++ CHAR *s1, *s2; + +- s1 = (char *) buf1; +- for (i = 0; i < page_size - 1; i++) ++ s1 = (CHAR *) buf1; ++ for (i = 0; i < (page_size / CHARBYTES) - 1; i++) + s1[i] = 23; + s1[i] = 0; + +- s2 = strdup (s1); ++ s2 = STRDUP (s1); + + for (i = 0; i < 64; ++i) +- do_page_test (3990 + i, 2635, s2); ++ do_page_test ((3988 / CHARBYTES) + i, (2636 / CHARBYTES), s2); + + free (s2); + } +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index d8fbd55..d77bee5 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -7,7 +7,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + stpncpy stpncpy-vx stpncpy-c \ + strcat strcat-vx strcat-c \ + strncat strncat-vx strncat-c \ +- strcmp strcmp-vx ++ strcmp strcmp-vx \ ++ strncmp strncmp-vx strncmp-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -19,5 +20,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcpncpy wcpncpy-vx wcpncpy-c \ + wcscat wcscat-vx wcscat-c \ + wcsncat wcsncat-vx wcsncat-c \ +- wcscmp wcscmp-vx wcscmp-c ++ wcscmp wcscmp-vx wcscmp-c \ ++ wcsncmp wcsncmp-vx wcsncmp-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index 196d3ec..5bfc493 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -106,6 +106,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strcmp); + IFUNC_VX_IMPL (wcscmp); + ++ IFUNC_VX_IMPL (strncmp); ++ IFUNC_VX_IMPL (wcsncmp); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strncmp-c.c b/sysdeps/s390/multiarch/strncmp-c.c +new file mode 100644 +index 0000000..75da859 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncmp-c.c +@@ -0,0 +1,28 @@ ++/* Default strncmp implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRNCMP __strncmp_c ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strncmp_c, __GI_strncmp, __strncmp_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strncmp-vx.S b/sysdeps/s390/multiarch/strncmp-vx.S +new file mode 100644 +index 0000000..36e99b8 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncmp-vx.S +@@ -0,0 +1,137 @@ ++/* Vector optimized 32/64 bit S/390 version of strncmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* int strncmp (const char *s1, const char *s2, size_t n) ++ Compare at most n characters of two strings. ++ ++ Register usage: ++ -r0=tmp ++ -r1=tmp ++ -r2=s1 ++ -r3=s2 ++ -r4=n ++ -r5=current_len ++ -v16=part of s1 ++ -v17=part of s2 ++ -v18=index of unequal ++*/ ++ENTRY(__strncmp_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgije %r4,0,.Lend_equal /* Nothing to do if n == 0, */ ++ lghi %r5,0 /* current_len = 0. */ ++ ++.Lloop: ++ vlbb %v16,0(%r5,%r2),6 /* Load s1 to block boundary. */ ++ vlbb %v17,0(%r5,%r3),6 /* Load s2 to block boundary. */ ++ lcbb %r0,0(%r5,%r2),6 /* Get loaded byte count of s1. */ ++ jo .Llt16_1 /* Jump away if vr is not fully loaded. */ ++ lcbb %r1,0(%r5,%r3),6 /* Get loaded byte count of s2. */ ++ jo .Llt16_2 /* Jump away if vr is not fully loaded. */ ++ aghi %r5,16 /* Both vrs are fully loaded. */ ++ clgrjhe %r5,%r4,.Llastcmp /* If current_len >= n ->last compare. */ ++ vfenezbs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r0,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r1,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp ++ vfenezbs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r0,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r1,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp ++ vfenezbs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vlbb %v16,0(%r5,%r2),6 ++ vlbb %v17,0(%r5,%r3),6 ++ lcbb %r0,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r1,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp ++ vfenezbs %v18,%v16,%v17 ++ jno .Lfound ++ j .Lloop ++ ++.Llt16_1: ++ lcbb %r1,0(%r5,%r3),6 /* Get loaded byte count ofs2. */ ++.Llt16_2: ++ clr %r0,%r1 /* Compare logical. */ ++ locrh %r0,%r1 /* Compute minimum of bytes loaded. */ ++ algfr %r5,%r0 /* Add smallest loaded bytes to current_len. */ ++ clgrj %r5,%r4,10,.Llastcmp /* If current_len >= n ->last compare. */ ++ vfenezbs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ vlgvb %r1,%v18,7 /* Get not equal index or 16 if all equal. */ ++ clrjl %r1,%r0,.Lfound /* Jump away if miscompare is within ++ loaded bytes (index < loaded-bytes) */ ++ j .Lloop ++ ++.Llastcmp: ++ /* Use comparision result only if located within first n characters. ++ %r0: loaded byte count in vreg; ++ %r5: current_len; ++ %r4: n; ++ (current_len - n): [0...16[ ++ First ignored match index: loaded bytes - (current_len-n): ]0...16] ++ */ ++ slgr %r5,%r4 /* %r5 = current_len - n. */ ++ slr %r0,%r5 /* %r0 = first ignored match index. */ ++ vfenezbs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ vlgvb %r1,%v18,7 /* Get not equal index or 16 if all equal. */ ++ clrjl %r1,%r0,.Lfound /* Jump away if miscompare is within ++ loaded bytes and below n bytes. */ ++ j .Lend_equal /* Miscompare after n-bytes -> end equal. */ ++ ++.Lfound: ++ /* Difference or end of string. */ ++ je .Lend_equal ++ lghi %r2,1 ++ lghi %r1,-1 ++ locgrl %r2,%r1 ++ br %r14 ++.Lend_equal: ++ lghi %r2,0 ++ br %r14 ++END(__strncmp_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strncmp.c b/sysdeps/s390/multiarch/strncmp.c +new file mode 100644 +index 0000000..1e1e05a +--- /dev/null ++++ b/sysdeps/s390/multiarch/strncmp.c +@@ -0,0 +1,30 @@ ++/* Multiple versions of strncmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++ ++# undef strcmp ++extern __typeof (strncmp) __strncmp; ++s390_vx_libc_ifunc2 (__strncmp, strncmp) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcsncmp-c.c b/sysdeps/s390/multiarch/wcsncmp-c.c +new file mode 100644 +index 0000000..058cd0c +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncmp-c.c +@@ -0,0 +1,25 @@ ++/* Default wcsncmp implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSNCMP __wcsncmp_c ++ ++# include ++extern __typeof (wcsncmp) __wcsncmp_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcsncmp-vx.S b/sysdeps/s390/multiarch/wcsncmp-vx.S +new file mode 100644 +index 0000000..9a44424 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncmp-vx.S +@@ -0,0 +1,177 @@ ++/* Vector optimized 32/64 bit S/390 version of wcsncmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* int wcsncmp (const wchar_t *s1, const wchar_t *s2, size_t n) ++ Compare at most n characters of two strings. ++ ++ Register usage: ++ -r0=tmp ++ -r1=tmp ++ -r2=s1 ++ -r3=s2 ++ -r4=n ++ -r5=current_len ++ -v16=part of s1 ++ -v17=part of s2 ++ -v18=index of unequal ++*/ ++ENTRY(__wcsncmp_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgije %r4,0,.Lend_equal /* Nothing to do if n == 0. */ ++ ++ /* Check range of n and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ lghi %r1,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ llilf %r1,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r4,%r4,2 /* Convert character-count to byte-count. */ ++ locgrne %r4,%r1 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ /* Check first character without vector load. */ ++ lghi %r5,4 /* current_len = 4 bytes. */ ++ /* Check s1/2[0]. */ ++ lt %r0,0(%r2) ++ l %r1,0(%r3) ++ je .Lend_cmp_one_char ++ crjne %r0,%r1,.Lend_cmp_one_char ++ ++.Lloop: ++ vlbb %v17,0(%r5,%r3),6 /* Load s2 to block boundary. */ ++ vlbb %v16,0(%r5,%r2),6 /* Load s1 to block boundary. */ ++ lcbb %r0,0(%r5,%r2),6 /* Get loaded byte count of s1. */ ++ jo .Llt16_1 /* Jump away if vector not fully loaded. */ ++ lcbb %r1,0(%r5,%r3),6 /* Get loaded byte count of s2. */ ++ jo .Llt16_2 /* Jump away if vector not fully loaded. */ ++ aghi %r5,16 /* Both vectors are fully loaded. */ ++ vfenezfs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ clgrjhe %r5,%r4,.Llastcmp /* If current_len >= n ->last compare. */ ++ jno .Lfound ++ ++ vlbb %v17,0(%r5,%r3),6 ++ vlbb %v16,0(%r5,%r2),6 ++ lcbb %r0,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r1,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezfs %v18,%v16,%v17 ++ clgrjhe %r5,%r4,.Llastcmp ++ jno .Lfound ++ ++ vlbb %v17,0(%r5,%r3),6 ++ vlbb %v16,0(%r5,%r2),6 ++ lcbb %r0,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r1,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezfs %v18,%v16,%v17 ++ clgrjhe %r5,%r4,.Llastcmp ++ jno .Lfound ++ ++ vlbb %v17,0(%r5,%r3),6 ++ vlbb %v16,0(%r5,%r2),6 ++ lcbb %r0,0(%r5,%r2),6 ++ jo .Llt16_1 ++ lcbb %r1,0(%r5,%r3),6 ++ jo .Llt16_2 ++ aghi %r5,16 ++ vfenezfs %v18,%v16,%v17 ++ clgrjhe %r5,%r4,.Llastcmp ++ jno .Lfound ++ ++ j .Lloop ++ ++.Llt16_1: ++ lcbb %r1,0(%r5,%r3),6 /* Get loaded byte count of s2. */ ++.Llt16_2: ++ clr %r0,%r1 /* Compare logical. */ ++ locrh %r0,%r1 /* Compute minimum of bytes loaded. */ ++ nill %r0,65532 /* Align bytes loaded to full characters. */ ++ jz .Lcmp_one_char /* Jump away if no full char is available. */ ++.Llt_cmp: ++ algfr %r5,%r0 /* Add smallest loaded bytes to current_len. */ ++ vfenezfs %v18,%v16,%v17 /* Compare not equal with zero search. */ ++ clgrj %r5,%r4,10,.Llastcmp /* If current_len >= n -> last compare */ ++ vlgvb %r1,%v18,7 /* Get not equal index or 16 if all equal. */ ++ clrjl %r1,%r0,.Lfound /* Jump away if miscompare is within ++ loaded bytes; (index < loaded-bytes) */ ++ j .Lloop ++ ++.Lcmp_one_char: ++ /* At least one of both strings is not 4-byte aligned ++ and there is no full character before next block-boundary. ++ Compare one character to get over the boundary and ++ proceed with normal loop! */ ++ vlef %v16,0(%r5,%r2),0 /* Load one character. */ ++ lghi %r0,4 /* Loaded byte count is 4. */ ++ vlef %v17,0(%r5,%r3),0 ++ j .Llt_cmp /* Proceed with comparision. */ ++ ++.Llastcmp: ++ /* Use comparision result only if located within first n characters. ++ %r0: loaded byte count in vreg; ++ %r5: current_len; ++ %r4: n; ++ (current_len - n): [0...16[ ++ First ignored match index: loaded bytes - (current_len-n): ]0...16] ++ */ ++ slgr %r5,%r4 /* %r5 = current_len - n. */ ++ slr %r0,%r5 /* %r0 = first ignored match index. */ ++ vlgvb %r4,%v18,7 /* Get not equal index or 16 if all equal. */ ++ clrjl %r4,%r0,.Lfound2 /* Jump away if miscompare is within ++ loaded bytes and below n bytes. */ ++.Lend_equal: ++ lghi %r2,0 ++ br %r14 ++ ++.Lfound: ++ /* Difference or end of string. */ ++ /* vfenezf found an unequal element or zero. ++ This instruction compares unsigned words, but wchar_t is signed. ++ Thus we have to compare the found element again. */ ++ vlgvb %r4,%v18,7 /* Extract not equal byte-index. */ ++.Lfound2: ++ srl %r4,2 /* And convert it to character-index. */ ++ vlgvf %r0,%v16,0(%r4) /* Load character-values. */ ++ vlgvf %r1,%v17,0(%r4) ++.Lend_cmp_one_char: ++ cr %r0,%r1 ++ je .Lend_equal ++ lghi %r2,1 ++ lghi %r1,-1 ++ locgrl %r2,%r1 ++ br %r14 ++END(__wcsncmp_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcsncmp.c b/sysdeps/s390/multiarch/wcsncmp.c +new file mode 100644 +index 0000000..0d79661 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsncmp.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcsncmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcsncmp, wcsncmp) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 44b1502..611b2c9 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -41,7 +41,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + isoc99_swscanf isoc99_vswscanf \ + mbrtoc16 c16rtomb + +-strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ ++strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ + wcpcpy wcsncpy wcpncpy wcscat wcsncat + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ +diff --git a/wcsmbs/test-wcsncmp-ifunc.c b/wcsmbs/test-wcsncmp-ifunc.c +new file mode 100644 +index 0000000..35176f0 +--- /dev/null ++++ b/wcsmbs/test-wcsncmp-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcsncmp function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcsncmp.c" +diff --git a/wcsmbs/test-wcsncmp.c b/wcsmbs/test-wcsncmp.c +new file mode 100644 +index 0000000..07757d8 +--- /dev/null ++++ b/wcsmbs/test-wcsncmp.c +@@ -0,0 +1,2 @@ ++#define WIDE 1 ++#include "../string/test-strncmp.c" +diff --git a/wcsmbs/wcsncmp.c b/wcsmbs/wcsncmp.c +index 7f1704f..1522b6f 100644 +--- a/wcsmbs/wcsncmp.c ++++ b/wcsmbs/wcsncmp.c +@@ -18,53 +18,56 @@ + + #include + ++#ifndef WCSNCMP ++# define WCSNCMP wcsncmp ++#endif + + /* Compare no more than N characters of S1 and S2, + returning less than, equal to or greater than zero + if S1 is lexicographically less than, equal to or + greater than S2. */ + int +-wcsncmp (s1, s2, n) ++WCSNCMP (s1, s2, n) + const wchar_t *s1; + const wchar_t *s2; + size_t n; + { +- wint_t c1 = L'\0'; +- wint_t c2 = L'\0'; ++ wchar_t c1 = L'\0'; ++ wchar_t c2 = L'\0'; + + if (n >= 4) + { + size_t n4 = n >> 2; + do + { +- c1 = (wint_t) *s1++; +- c2 = (wint_t) *s2++; ++ c1 = *s1++; ++ c2 = *s2++; + if (c1 == L'\0' || c1 != c2) +- return c1 - c2; +- c1 = (wint_t) *s1++; +- c2 = (wint_t) *s2++; ++ return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); ++ c1 = *s1++; ++ c2 = *s2++; + if (c1 == L'\0' || c1 != c2) +- return c1 - c2; +- c1 = (wint_t) *s1++; +- c2 = (wint_t) *s2++; ++ return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); ++ c1 = *s1++; ++ c2 = *s2++; + if (c1 == L'\0' || c1 != c2) +- return c1 - c2; +- c1 = (wint_t) *s1++; +- c2 = (wint_t) *s2++; ++ return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); ++ c1 = *s1++; ++ c2 = *s2++; + if (c1 == L'\0' || c1 != c2) +- return c1 - c2; ++ return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); + } while (--n4 > 0); + n &= 3; + } + + while (n > 0) + { +- c1 = (wint_t) *s1++; +- c2 = (wint_t) *s2++; ++ c1 = *s1++; ++ c2 = *s2++; + if (c1 == L'\0' || c1 != c2) +- return c1 - c2; ++ return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); + n--; + } + +- return c1 - c2; ++ return 0; + } +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-2.patch b/SOURCES/glibc-rh1268008-2.patch new file mode 100644 index 0000000..4eeb4b2 --- /dev/null +++ b/SOURCES/glibc-rh1268008-2.patch @@ -0,0 +1,53 @@ +From 0d53b09f7052ae07d4e1dd96908a406d7841eab2 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:28:40 +0200 +Subject: [PATCH 02/30] S/390: Use attribute_hidden in ifunc-resolve.c + +upstream-commit-id: 5f67c04f5e076d3cfc4d810e7f5d65ce1788b749 +https://sourceware.org/ml/libc-alpha/2013-03/msg00085.html + +This patch is needed to prepare for the optimized string function patchset. +Make the declarations of the optimized functions hidden in order to prevent +GOT slots being generated for them. +--- + sysdeps/s390/s390-32/multiarch/ifunc-resolve.c | 6 +++--- + sysdeps/s390/s390-64/multiarch/ifunc-resolve.c | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c b/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c +index f1bf8a3..42ca8da 100644 +--- a/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c ++++ b/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c +@@ -34,9 +34,9 @@ + \ + /* Make the declarations of the optimized functions hidden in order + to prevent GOT slots being generated for them. */ \ +- extern __attribute__((visibility("hidden"))) void *FUNC##_z196; \ +- extern __attribute__((visibility("hidden"))) void *FUNC##_z10; \ +- extern __attribute__((visibility("hidden"))) void *FUNC##_g5; \ ++ extern void *FUNC##_z196 attribute_hidden; \ ++ extern void *FUNC##_z10 attribute_hidden; \ ++ extern void *FUNC##_g5 attribute_hidden; \ + \ + void *resolve_##FUNC (unsigned long int dl_hwcap) \ + { \ +diff --git a/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c b/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c +index 5f56764..8db2c38 100644 +--- a/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c ++++ b/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c +@@ -34,9 +34,9 @@ + \ + /* Make the declarations of the optimized functions hidden in order + to prevent GOT slots being generated for them. */ \ +- extern __attribute__((visibility("hidden"))) void *FUNC##_z196; \ +- extern __attribute__((visibility("hidden"))) void *FUNC##_z10; \ +- extern __attribute__((visibility("hidden"))) void *FUNC##_z900; \ ++ extern void *FUNC##_z196 attribute_hidden; \ ++ extern void *FUNC##_z10 attribute_hidden; \ ++ extern void *FUNC##_z900 attribute_hidden; \ + \ + void *resolve_##FUNC (unsigned long int dl_hwcap) \ + { \ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-20.patch b/SOURCES/glibc-rh1268008-20.patch new file mode 100644 index 0000000..917dc1d --- /dev/null +++ b/SOURCES/glibc-rh1268008-20.patch @@ -0,0 +1,500 @@ +From 0b3ff29b298c488ab995d4224da2cc36fb56ddce Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 11:25:00 +0200 +Subject: [PATCH 20/30] S390: Optimize strchr and wcschr. + +upstream-commit-id: cf150d45a97c6bb8410d6d3acf6e1560e8fe96cc +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00094.html + +This patch provides optimized versions of strchr and wcschr with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strchr-c.c: New File. + * sysdeps/s390/multiarch/strchr-vx.S: Likewise. + * sysdeps/s390/multiarch/strchr.c: Likewise. + * sysdeps/s390/multiarch/wcschr-c.c: Likewise. + * sysdeps/s390/multiarch/wcschr-vx.S: Likewise. + * sysdeps/s390/multiarch/wcschr.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strchr and + wcschr functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strchr, wcschr. + * string/strchr.c (STRCHR): Define and use macro. + * benchtests/bench-wcschr.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcschr. +--- + benchtests/Makefile | 2 +- + benchtests/bench-wcschr.c | 20 ++++++ + string/strchr.c | 8 ++- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strchr-c.c | 29 +++++++++ + sysdeps/s390/multiarch/strchr-vx.S | 100 ++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strchr.c | 28 +++++++++ + sysdeps/s390/multiarch/wcschr-c.c | 31 ++++++++++ + sysdeps/s390/multiarch/wcschr-vx.S | 103 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcschr.c | 27 ++++++++ + 11 files changed, 351 insertions(+), 6 deletions(-) + create mode 100644 benchtests/bench-wcschr.c + create mode 100644 sysdeps/s390/multiarch/strchr-c.c + create mode 100644 sysdeps/s390/multiarch/strchr-vx.S + create mode 100644 sysdeps/s390/multiarch/strchr.c + create mode 100644 sysdeps/s390/multiarch/wcschr-c.c + create mode 100644 sysdeps/s390/multiarch/wcschr-vx.S + create mode 100644 sysdeps/s390/multiarch/wcschr.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index f6342da..bcb0288 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp wcsncmp ++ wcsncmp wcsncmp wcschr + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-wcschr.c b/benchtests/bench-wcschr.c +new file mode 100644 +index 0000000..4287724 +--- /dev/null ++++ b/benchtests/bench-wcschr.c +@@ -0,0 +1,20 @@ ++/* Measure wcschr functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strchr.c" +diff --git a/string/strchr.c b/string/strchr.c +index 9d18b7e..69a9cd9 100644 +--- a/string/strchr.c ++++ b/string/strchr.c +@@ -27,11 +27,13 @@ + + #undef strchr + ++#ifndef STRCHR ++# define STRCHR strchr ++#endif ++ + /* Find the first occurrence of C in S. */ + char * +-strchr (s, c_in) +- const char *s; +- int c_in; ++STRCHR (const char *s, int c_in) + { + const unsigned char *char_ptr; + const unsigned long int *longword_ptr; +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index d77bee5..1a3673b 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -8,7 +8,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strcat strcat-vx strcat-c \ + strncat strncat-vx strncat-c \ + strcmp strcmp-vx \ +- strncmp strncmp-vx strncmp-c ++ strncmp strncmp-vx strncmp-c \ ++ strchr strchr-vx strchr-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -21,5 +22,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcscat wcscat-vx wcscat-c \ + wcsncat wcsncat-vx wcsncat-c \ + wcscmp wcscmp-vx wcscmp-c \ +- wcsncmp wcsncmp-vx wcsncmp-c ++ wcsncmp wcsncmp-vx wcsncmp-c \ ++ wcschr wcschr-vx wcschr-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index 5bfc493..b0782ff 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -109,6 +109,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strncmp); + IFUNC_VX_IMPL (wcsncmp); + ++ IFUNC_VX_IMPL (strchr); ++ IFUNC_VX_IMPL (wcschr); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strchr-c.c b/sysdeps/s390/multiarch/strchr-c.c +new file mode 100644 +index 0000000..4384e6b +--- /dev/null ++++ b/sysdeps/s390/multiarch/strchr-c.c +@@ -0,0 +1,29 @@ ++/* Default strchr implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRCHR __strchr_c ++# undef weak_alias ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strchr_c, __GI_strchr, __strchr_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strchr-vx.S b/sysdeps/s390/multiarch/strchr-vx.S +new file mode 100644 +index 0000000..26180df +--- /dev/null ++++ b/sysdeps/s390/multiarch/strchr-vx.S +@@ -0,0 +1,100 @@ ++/* Vector optimized 32/64 bit S/390 version of strchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char *strchr (const char *s, int c) ++ Locate character in string. ++ ++ Register usage: ++ -r1=tmp ++ -r2=s ++ -r3=c ++ -r4=tmp ++ -r5=current_len ++ -v16=part of s ++ -v17=index of unequal ++ -v18=replicated c ++*/ ++ENTRY(__strchr_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ vlvgb %v18,%r3,0 /* Generate vector which elements are all c. ++ If c > 255, c will be truncated. */ ++ vrepb %v18,%v18,0 ++ ++ vfeezbs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ vlgvb %r4,%v16,7 /* Load byte index of character or zero. */ ++ clrjl %r4,%r1,.Lfound /* Return if c/zero is in loaded bytes. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find c/zero in 16 byte aligned loop */ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfeezbs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ jno .Lfound /* Found c/zero (cc=0|1|2). */ ++ vl %v16,16(%r5,%r2) ++ vfeezbs %v16,%v16,%v18 ++ jno .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeezbs %v16,%v16,%v18 ++ jno .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeezbs %v16,%v16,%v18 ++ jno .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No character and no zero -> loop. */ ++ ++.Lfound48: ++ la %r5,16(%r5) /* Use la since aghi would clobber cc. */ ++.Lfound32: ++ la %r5,16(%r5) ++.Lfound16: ++ la %r5,16(%r5) ++.Lfound: ++ je .Lzero /* Found zero, but no c before that zero. */ ++ ++.Lcharacter: ++ vlgvb %r4,%v16,7 /* Load byte index of character. */ ++ algr %r5,%r4 ++ la %r2,0(%r5,%r2) /* Return pointer to character. */ ++ br %r14 ++ ++.Lzero: ++ llgcr %r3,%r3 /* char c_char = (char) c. */ ++ clije %r3,0,.Lcharacter /* Found zero and c is zero. */ ++ lghi %r2,0 /* Return null if character not found. */ ++ br %r14 ++END(__strchr_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strchr.c b/sysdeps/s390/multiarch/strchr.c +new file mode 100644 +index 0000000..e2a310f +--- /dev/null ++++ b/sysdeps/s390/multiarch/strchr.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of strchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strchr, strchr) ++weak_alias (strchr, index) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcschr-c.c b/sysdeps/s390/multiarch/wcschr-c.c +new file mode 100644 +index 0000000..ad7415e +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcschr-c.c +@@ -0,0 +1,31 @@ ++/* Default wcschr implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSCHR __wcschr_c ++ ++# include ++extern __typeof (wcschr) __wcschr_c; ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__wcschr_c, __GI_wcschr, __wcschr_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcschr-vx.S b/sysdeps/s390/multiarch/wcschr-vx.S +new file mode 100644 +index 0000000..c1b3f6b +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcschr-vx.S +@@ -0,0 +1,103 @@ ++/* Vector optimized 32/64 bit S/390 version of wcschr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t *wcschr (const wchar_t *s, wchar_t c) ++ Locate character in string. ++ ++ Register usage: ++ -r1=tmp ++ -r2=s ++ -r3=c ++ -r4=tmp ++ -r5=current_len ++ -v16=part of s ++ -v17=index of unequal ++ -v18=replicated c ++*/ ++ENTRY(__wcschr_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ vlvgf %v18,%r3,0 /* Generate vector which elements are all c. */ ++ vrepf %v18,%v18,0 ++ ++ vfeezfs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ vlgvb %r4,%v16,7 /* Load byte index of character or zero. */ ++ clrjl %r4,%r1,.Lfound /* Return if c/zero is in loaded bytes. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find c/zero in 16byte aligned loop */ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfeezfs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ jno .Lfound /* Found c/zero (cc=0|1|2). */ ++ vl %v16,16(%r5,%r2) ++ vfeezfs %v16,%v16,%v18 ++ jno .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeezfs %v16,%v16,%v18 ++ jno .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeezfs %v16,%v16,%v18 ++ jno .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No character and no zero -> loop. */ ++ ++.Lfound48: ++ la %r5,16(%r5) /* Use la since aghi would clobber cc. */ ++.Lfound32: ++ la %r5,16(%r5) ++.Lfound16: ++ la %r5,16(%r5) ++.Lfound: ++ je .Lzero /* Found zero, but no c before that zero. */ ++ ++.Lcharacter: ++ vlgvb %r4,%v16,7 /* Load byte index of character. */ ++ algr %r5,%r4 ++ la %r2,0(%r5,%r2) /* Return pointer to character. */ ++ br %r14 ++ ++.Lzero: ++ clije %r3,0,.Lcharacter /* Found zero and c is zero. */ ++ lghi %r2,0 /* Return null if character not found. */ ++ br %r14 ++.Lfallback: ++ jg __wcschr_c ++END(__wcschr_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcschr.c b/sysdeps/s390/multiarch/wcschr.c +new file mode 100644 +index 0000000..9c8c097 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcschr.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcschr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcschr, wcschr) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-21.patch b/SOURCES/glibc-rh1268008-21.patch new file mode 100644 index 0000000..b07aa73 --- /dev/null +++ b/SOURCES/glibc-rh1268008-21.patch @@ -0,0 +1,664 @@ +From 24020ef9258267c5d65ab37dbf118bf52e4995d2 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 12:40:02 +0200 +Subject: [PATCH 21/30] S390: Optimize strchrnul and wcschrnul. + +upstream-commit-id: d23d4ef19f1f5463745f2af205acb8c4975fd680 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00098.html + +This patch provides optimized versions of strchrnul and wcschrnul with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strchrnul-c.c: New File. + * sysdeps/s390/multiarch/strchrnul-vx.S: Likewise. + * sysdeps/s390/multiarch/strchrnul.c: Likewise. + * sysdeps/s390/multiarch/wcschrnul-c.c: Likewise. + * sysdeps/s390/multiarch/wcschrnul-vx.S: Likewise. + * sysdeps/s390/multiarch/wcschrnul.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strchrnul and + wcschrnul functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strchrnul, wcschrnul. + * wcsmbs/wcschrnul.c: Use WCSCHRNUL if defined. + * string/test-strchr.c: Add wcschrnul support. + * wcsmbs/test-wcschrnul.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcschrnul. + * benchtests/bench-strchr.c: Add wcschrnul support. + * benchtests/bench-wcschrnul.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcschrnul. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strchr.c | 22 ++++++-- + benchtests/bench-wcschrnul.c | 20 +++++++ + string/test-strchr.c | 24 ++++++-- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strchrnul-c.c | 26 +++++++++ + sysdeps/s390/multiarch/strchrnul-vx.S | 93 ++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strchrnul.c | 28 +++++++++ + sysdeps/s390/multiarch/wcschrnul-c.c | 25 ++++++++ + sysdeps/s390/multiarch/wcschrnul-vx.S | 97 ++++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcschrnul.c | 28 +++++++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcschrnul-ifunc.c | 20 +++++++ + wcsmbs/test-wcschrnul.c | 20 +++++++ + wcsmbs/wcschrnul.c | 5 ++ + 16 files changed, 405 insertions(+), 16 deletions(-) + create mode 100644 benchtests/bench-wcschrnul.c + create mode 100644 sysdeps/s390/multiarch/strchrnul-c.c + create mode 100644 sysdeps/s390/multiarch/strchrnul-vx.S + create mode 100644 sysdeps/s390/multiarch/strchrnul.c + create mode 100644 sysdeps/s390/multiarch/wcschrnul-c.c + create mode 100644 sysdeps/s390/multiarch/wcschrnul-vx.S + create mode 100644 sysdeps/s390/multiarch/wcschrnul.c + create mode 100644 wcsmbs/test-wcschrnul-ifunc.c + create mode 100644 wcsmbs/test-wcschrnul.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index bcb0288..d34bb3d 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp wcsncmp wcschr ++ wcsncmp wcsncmp wcschr wcschrnul + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strchr.c b/benchtests/bench-strchr.c +index d432ba5..9b1aaf9 100644 +--- a/benchtests/bench-strchr.c ++++ b/benchtests/bench-strchr.c +@@ -22,10 +22,14 @@ + # define TEST_NAME "strchrnul" + # else + # define TEST_NAME "strchr" +-# endif ++# endif /* !USE_FOR_STRCHRNUL */ + #else +-# define TEST_NAME "wcschr" +-#endif ++# ifdef USE_FOR_STRCHRNUL ++# define TEST_NAME "wcschrnul" ++# else ++# define TEST_NAME "wcschr" ++# endif /* !USE_FOR_STRCHRNUL */ ++#endif /* WIDE */ + #include "bench-string.h" + + #ifndef WIDE +@@ -44,20 +48,26 @@ + # define UCHAR unsigned char + #else + # include +-# define STRCHR wcschr ++# ifdef USE_FOR_STRCHRNUL ++# define STRCHR wcschrnul ++# define stupid_STRCHR stupid_WCSCHRNUL ++# define simple_STRCHR simple_WCSCHRNUL ++# else ++# define STRCHR wcschr ++# endif /* !USE_FOR_STRCHRNUL */ + # define STRLEN wcslen + # define CHAR wchar_t + # define BIG_CHAR WCHAR_MAX + # define MIDDLE_CHAR 1121 + # define SMALL_CHAR 851 + # define UCHAR wchar_t +-#endif ++#endif /* WIDE */ + + #ifdef USE_FOR_STRCHRNUL + # define NULLRET(endptr) endptr + #else + # define NULLRET(endptr) NULL +-#endif ++#endif /* !USE_FOR_STRCHRNUL */ + + + typedef CHAR *(*proto_t) (const CHAR *, int); +diff --git a/benchtests/bench-wcschrnul.c b/benchtests/bench-wcschrnul.c +new file mode 100644 +index 0000000..124b602 +--- /dev/null ++++ b/benchtests/bench-wcschrnul.c +@@ -0,0 +1,20 @@ ++/* Measure wcschrnul functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strchrnul.c" +diff --git a/string/test-strchr.c b/string/test-strchr.c +index b84e138..1cd14d7 100644 +--- a/string/test-strchr.c ++++ b/string/test-strchr.c +@@ -26,8 +26,12 @@ + # define TEST_NAME "strchr" + # endif + #else +-# define TEST_NAME "wcschr" +-#endif ++# ifdef USE_FOR_STRCHRNUL ++# define TEST_NAME "wcschrnul" ++# else ++# define TEST_NAME "wcschr" ++# endif /* !USE_FOR_STRCHRNUL */ ++#endif /* WIDE */ + #include "test-string.h" + + #ifndef WIDE +@@ -44,15 +48,23 @@ + # define MIDDLE_CHAR 127 + # define SMALL_CHAR 23 + # define UCHAR unsigned char ++# define L(s) s + #else + # include +-# define STRCHR wcschr ++# ifdef USE_FOR_STRCHRNUL ++# define STRCHR wcschrnul ++# define stupid_STRCHR stupid_WCSCHRNUL ++# define simple_STRCHR simple_WCSCHRNUL ++# else ++# define STRCHR wcschr ++# endif /* !USE_FOR_STRCHRNUL */ + # define STRLEN wcslen + # define CHAR wchar_t + # define BIG_CHAR WCHAR_MAX + # define MIDDLE_CHAR 1121 + # define SMALL_CHAR 851 + # define UCHAR wchar_t ++# define L(s) L ## s + #endif + + #ifdef USE_FOR_STRCHRNUL +@@ -219,9 +231,9 @@ do_random_tests (void) + static void + check1 (void) + { +- char s[] __attribute__((aligned(16))) = "\xff"; +- char c = '\xfe'; +- char *exp_result = stupid_STRCHR (s, c); ++ CHAR s[] __attribute__((aligned(16))) = L ("\xff"); ++ CHAR c = L ('\xfe'); ++ CHAR *exp_result = stupid_STRCHR (s, c); + + FOR_EACH_IMPL (impl, 0) + check_result (impl, s, c, exp_result); +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 1a3673b..b6b64c9 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -9,7 +9,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strncat strncat-vx strncat-c \ + strcmp strcmp-vx \ + strncmp strncmp-vx strncmp-c \ +- strchr strchr-vx strchr-c ++ strchr strchr-vx strchr-c \ ++ strchrnul strchrnul-vx strchrnul-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -23,5 +24,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsncat wcsncat-vx wcsncat-c \ + wcscmp wcscmp-vx wcscmp-c \ + wcsncmp wcsncmp-vx wcsncmp-c \ +- wcschr wcschr-vx wcschr-c ++ wcschr wcschr-vx wcschr-c \ ++ wcschrnul wcschrnul-vx wcschrnul-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index b0782ff..ea474a8 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -112,6 +112,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strchr); + IFUNC_VX_IMPL (wcschr); + ++ IFUNC_VX_IMPL (strchrnul); ++ IFUNC_VX_IMPL (wcschrnul); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strchrnul-c.c b/sysdeps/s390/multiarch/strchrnul-c.c +new file mode 100644 +index 0000000..7615217 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strchrnul-c.c +@@ -0,0 +1,26 @@ ++/* Default strchrnul implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRCHRNUL __strchrnul_c ++# define __strchrnul STRCHRNUL ++# undef weak_alias ++# define weak_alias(name, alias) ++ ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/strchrnul-vx.S b/sysdeps/s390/multiarch/strchrnul-vx.S +new file mode 100644 +index 0000000..2c5f167 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strchrnul-vx.S +@@ -0,0 +1,93 @@ ++/* Vector optimized 32/64 bit S/390 version of strchrnul. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char *strchrnul (const char *s, int c) ++ Returns pointer to first c or to \0 if c not found. ++ ++ Register usage: ++ -r1=tmp ++ -r2=s and return pointer ++ -r3=c ++ -r4=tmp ++ -r5=current_len ++ -v16=part of s ++ -v18=vector with c replicated in every byte ++*/ ++ENTRY(__strchrnul_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ vlvgb %v18,%r3,0 /* Generate vector which elements are all c. ++ If c > 255, c will be truncated. */ ++ vrepb %v18,%v18,0 ++ ++ vfeezbs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ vlgvb %r4,%v16,7 /* Load byte index of character or zero. */ ++ clrjl %r4,%r1,.Lfound /* Return if c/zero is in loaded bytes. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find c/zero in 16byte aligned loop */ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s */ ++ vfeezbs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ jno .Lfound /* Found c/zero (cc=0|1|2). */ ++ vl %v16,16(%r5,%r2) ++ vfeezbs %v16,%v16,%v18 ++ jno .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeezbs %v16,%v16,%v18 ++ jno .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeezbs %v16,%v16,%v18 ++ jno .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No character and no zero -> loop. */ ++ ++ /* Found character or zero */ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r1,%v16,7 /* Load byte index of character. */ ++ algr %r5,%r1 ++ la %r2,0(%r5,%r2) /* Return pointer to character. */ ++ ++.Lend: ++ br %r14 ++END(__strchrnul_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strchrnul.c b/sysdeps/s390/multiarch/strchrnul.c +new file mode 100644 +index 0000000..73fcf19 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strchrnul.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of strchrnul. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__strchrnul) ++weak_alias (__strchrnul, strchrnul) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcschrnul-c.c b/sysdeps/s390/multiarch/wcschrnul-c.c +new file mode 100644 +index 0000000..31fa416 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcschrnul-c.c +@@ -0,0 +1,25 @@ ++/* Default wcschrnul implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSCHRNUL __wcschrnul_c ++ ++# include ++extern __typeof (__wcschrnul) __wcschrnul_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcschrnul-vx.S b/sysdeps/s390/multiarch/wcschrnul-vx.S +new file mode 100644 +index 0000000..a89aee0 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcschrnul-vx.S +@@ -0,0 +1,97 @@ ++/* Vector optimized 32/64 bit S/390 version of wcschrnul. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t* wcschrnul (const wchar_t *s, wchar_t c) ++ Returns pointer to first c or to \0 if c not found. ++ ++ Register usage: ++ -r1=tmp ++ -r2=s and return pointer ++ -r3=c ++ -r4=tmp ++ -r5=current_len ++ -v16=part of s ++ -v18=vector with c replicated in every byte ++*/ ++ENTRY(__wcschrnul_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ vlvgf %v18,%r3,0 /* Generate vector which elements are all c. */ ++ vrepf %v18,%v18,0 ++ ++ vfeezfs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ vlgvb %r4,%v16,7 /* Load byte index of character or zero. */ ++ clrjl %r4,%r1,.Lfound /* Return if c/zero is in loaded bytes. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find c/zero in 16byte aligned loop */ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfeezfs %v16,%v16,%v18 /* Find element equal with zero search. */ ++ jno .Lfound /* Found c/zero (cc=0|1|2). */ ++ vl %v16,16(%r5,%r2) ++ vfeezfs %v16,%v16,%v18 ++ jno .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeezfs %v16,%v16,%v18 ++ jno .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeezfs %v16,%v16,%v18 ++ jno .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No character and no zero -> loop. */ ++ ++ /* Found character or zero */ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r1,%v16,7 /* Load byte index of character. */ ++ algr %r5,%r1 ++ la %r2,0(%r5,%r2) /* Return pointer to character. */ ++ ++.Lend: ++ br %r14 ++.Lfallback: ++ jg __wcschrnul_c ++END(__wcschrnul_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcschrnul.c b/sysdeps/s390/multiarch/wcschrnul.c +new file mode 100644 +index 0000000..644258b +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcschrnul.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of wcschrnul. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__wcschrnul) ++weak_alias (__wcschrnul, wcschrnul) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 611b2c9..de3635d 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy wcsncpy wcpncpy wcscat wcsncat ++ wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcschrnul-ifunc.c b/wcsmbs/test-wcschrnul-ifunc.c +new file mode 100644 +index 0000000..e64a1e4 +--- /dev/null ++++ b/wcsmbs/test-wcschrnul-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcschrnul function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcschrnul.c" +diff --git a/wcsmbs/test-wcschrnul.c b/wcsmbs/test-wcschrnul.c +new file mode 100644 +index 0000000..baea763 +--- /dev/null ++++ b/wcsmbs/test-wcschrnul.c +@@ -0,0 +1,20 @@ ++/* Test wcschrnul functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strchrnul.c" +diff --git a/wcsmbs/wcschrnul.c b/wcsmbs/wcschrnul.c +index 04db8f1..1e4c44f 100644 +--- a/wcsmbs/wcschrnul.c ++++ b/wcsmbs/wcschrnul.c +@@ -17,6 +17,9 @@ + + #include + ++#ifdef WCSCHRNUL ++# define __wcschrnul WCSCHRNUL ++#endif + + /* Find the first occurrence of WC in WCS. */ + wchar_t * +@@ -32,4 +35,6 @@ __wcschrnul (wcs, wc) + + return (wchar_t *) wcs; + } ++#ifndef WCSCHRNUL + weak_alias (__wcschrnul, wcschrnul) ++#endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-22.patch b/SOURCES/glibc-rh1268008-22.patch new file mode 100644 index 0000000..0b388fa --- /dev/null +++ b/SOURCES/glibc-rh1268008-22.patch @@ -0,0 +1,658 @@ +From cb5e8d0ec1a4c4eb09da45015755e3d18b3a086b Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 12:43:56 +0200 +Subject: [PATCH 22/30] S390: Optimize strrchr and wcsrchr. + +upstream-commit-id: f40132d4bda984479bac89dfcd6968e9ff56e088 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00101.html + +This patch provides optimized versions of strrchr and wcsrchr with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strrchr-c.c: New File. + * sysdeps/s390/multiarch/strrchr-vx.S: Likewise. + * sysdeps/s390/multiarch/strrchr.c: Likewise. + * sysdeps/s390/multiarch/wcsrchr-c.c: Likewise. + * sysdeps/s390/multiarch/wcsrchr-vx.S: Likewise. + * sysdeps/s390/multiarch/wcsrchr.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strrchr and + wcsrchr functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strrchr, wcsrchr. + * benchtests/bench-wcsrchr.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcsrchr. +--- + benchtests/Makefile | 2 +- + benchtests/bench-wcsrchr.c | 20 ++++ + string/strrchr.c | 6 +- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strrchr-c.c | 29 +++++ + sysdeps/s390/multiarch/strrchr-vx.S | 180 +++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strrchr.c | 28 +++++ + sysdeps/s390/multiarch/wcsrchr-c.c | 25 ++++ + sysdeps/s390/multiarch/wcsrchr-vx.S | 190 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcsrchr.c | 27 +++++ + 11 files changed, 512 insertions(+), 4 deletions(-) + create mode 100644 benchtests/bench-wcsrchr.c + create mode 100644 sysdeps/s390/multiarch/strrchr-c.c + create mode 100644 sysdeps/s390/multiarch/strrchr-vx.S + create mode 100644 sysdeps/s390/multiarch/strrchr.c + create mode 100644 sysdeps/s390/multiarch/wcsrchr-c.c + create mode 100644 sysdeps/s390/multiarch/wcsrchr-vx.S + create mode 100644 sysdeps/s390/multiarch/wcsrchr.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index d34bb3d..6444394 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp wcsncmp wcschr wcschrnul ++ wcsncmp wcsncmp wcschr wcschrnul wcsrchr + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-wcsrchr.c b/benchtests/bench-wcsrchr.c +new file mode 100644 +index 0000000..0d3923f +--- /dev/null ++++ b/benchtests/bench-wcsrchr.c +@@ -0,0 +1,20 @@ ++/* Measure wcsrchr functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strrchr.c" +diff --git a/string/strrchr.c b/string/strrchr.c +index a986ff9..03f3957 100644 +--- a/string/strrchr.c ++++ b/string/strrchr.c +@@ -19,9 +19,13 @@ + + #undef strrchr + ++#ifndef STRRCHR ++# define STRRCHR strrchr ++#endif ++ + /* Find the last occurrence of C in S. */ + char * +-strrchr (const char *s, int c) ++STRRCHR (const char *s, int c) + { + register const char *found, *p; + +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index b6b64c9..b8b141e 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -10,7 +10,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strcmp strcmp-vx \ + strncmp strncmp-vx strncmp-c \ + strchr strchr-vx strchr-c \ +- strchrnul strchrnul-vx strchrnul-c ++ strchrnul strchrnul-vx strchrnul-c \ ++ strrchr strrchr-vx strrchr-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -25,5 +26,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcscmp wcscmp-vx wcscmp-c \ + wcsncmp wcsncmp-vx wcsncmp-c \ + wcschr wcschr-vx wcschr-c \ +- wcschrnul wcschrnul-vx wcschrnul-c ++ wcschrnul wcschrnul-vx wcschrnul-c \ ++ wcsrchr wcsrchr-vx wcsrchr-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index ea474a8..ee84d80 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -115,6 +115,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strchrnul); + IFUNC_VX_IMPL (wcschrnul); + ++ IFUNC_VX_IMPL (strrchr); ++ IFUNC_VX_IMPL (wcsrchr); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strrchr-c.c b/sysdeps/s390/multiarch/strrchr-c.c +new file mode 100644 +index 0000000..b035cdc +--- /dev/null ++++ b/sysdeps/s390/multiarch/strrchr-c.c +@@ -0,0 +1,29 @@ ++/* Default strrchr implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRRCHR __strrchr_c ++# undef weak_alias ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strrchr_c, __GI_strrchr, __strrchr_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strrchr-vx.S b/sysdeps/s390/multiarch/strrchr-vx.S +new file mode 100644 +index 0000000..dbc183b +--- /dev/null ++++ b/sysdeps/s390/multiarch/strrchr-vx.S +@@ -0,0 +1,180 @@ ++/* Vector optimized 32/64 bit S/390 version of strrchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char *strrchr (const char *s, int c) ++ Locate the last character c in string. ++ ++ Register usage: ++ -r0=loaded bytes in first part of s. ++ -r1=pointer to last occurence of c or NULL if not found. ++ -r2=s ++ -r3=c ++ -r4=tmp ++ -r5=current_len ++ -v16=part of s ++ -v17=index of found element ++ -v18=replicated c ++ -v19=part of s with last occurence of c. ++ -v20=permute pattern ++*/ ++ENTRY(__strrchr_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vlvgb %v18,%r3,0 /* Generate vector which elements are all c. ++ if c > 255, c will be truncated. */ ++ vrepb %v18,%v18,0 ++ ++ lghi %r1,-1 /* Currently no c found. */ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ vfeezbs %v17,%v16,%v18 /* Find element equal or zero. */ ++ vlgvb %r4,%v17,7 /* Load byte index of c/zero or 16. */ ++ clrjl %r4,%r0,.Lfound_first_part /* Found c/zero in loaded bytes. */ ++.Lalign: ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfeezbs %v17,%v16,%v18 /* Find element equal with zero search. */ ++ jno .Lfound /* Found c/zero (cc=0|1|2). */ ++ vl %v16,16(%r5,%r2) ++ vfeezbs %v17,%v16,%v18 ++ jno .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeezbs %v17,%v16,%v18 ++ jno .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeezbs %v17,%v16,%v18 ++ jno .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No character and no zero -> loop. */ ++ ++.Lfound48: ++ la %r5,16(%r5) /* Use la since aghi would clobber cc. */ ++.Lfound32: ++ la %r5,16(%r5) ++.Lfound16: ++ la %r5,16(%r5) ++.Lfound: ++ je .Lzero /* Found zero, but no c before that zero. */ ++ /* Save this part of s to check for further matches after reaching ++ the end of the complete string. */ ++ vlr %v19,%v16 ++ lgr %r1,%r5 ++ ++ jh .Lzero /* Found a zero after the found c. */ ++ aghi %r5,16 /* Start search of next part of s. */ ++ j .Lloop ++ ++.Lfound_first_part: ++ /* This code is only executed if the found c/zero is whithin loaded ++ bytes. If no c/zero was found (cc==3) the found index = 16, thus ++ this code is not called. ++ Resulting condition code of vector find element equal: ++ cc==0: no c, found zero ++ cc==1: c found, no zero ++ cc==2: c found, found zero after c ++ cc==3: no c, no zero (this case can be ignored). */ ++ je .Lzero /* Found zero, but no c before that zero. */ ++ ++ locgrne %r1,%r5 /* Mark c as found in first part of s. */ ++ vlr %v19,%v16 ++ ++ jl .Lalign /* No zero (e.g. if vr was fully loaded) ++ -> Align and loop afterwards. */ ++ ++ /* Found a zero in vr. If vr was not fully loaded due to block ++ boundary, the remaining bytes are filled with zero and we can't ++ rely on zero indication of condition code here! */ ++ ++ vfenezb %v17,%v16,%v16 /* Find zero. */ ++ vlgvb %r4,%v17,7 /* Load byte index of zero or 16. */ ++ clrjl %r4,%r0,.Lzero /* Zero within loaded bytes -> end. */ ++ j .Lalign /* Align and loop afterwards. */ ++ ++.Lend_searched_zero: ++ vlgvb %r4,%v17,7 /* Load byte index of zero. */ ++ algr %r5,%r4 ++ la %r2,0(%r5,%r2) /* Return pointer to zero. */ ++ br %r14 ++ ++.Lzero: ++ /* Reached end of string. Check if one c was found before. */ ++ clije %r3,0,.Lend_searched_zero /* Found zero and c is zero. */ ++ ++ cgfi %r1,-1 /* No c found -> return NULL. */ ++ locghie %r2,0 ++ ber %r14 ++ ++ larl %r3,.Lpermute_mask /* Load permute mask. */ ++ vl %v20,0(%r3) ++ ++ /* c was found and is part of v19. */ ++ vfenezb %v17,%v19,%v19 /* Find zero. */ ++ vlgvb %r4,%v17,7 /* Load byte index of zero or 16. */ ++ ++ clgfi %r5,0 /* Loaded byte count in v19 is 16, ... */ ++ lochine %r0,16 /* ... if v19 is not the first part of s. */ ++ ahi %r0,-1 /* Convert byte count to highest index. */ ++ ++ clr %r0,%r4 ++ locrl %r4,%r0 /* r4 = min (zero-index, highest-index). */ ++ ++ /* Right-shift of v19 to mask bytes after zero. */ ++ clije %r4,15,.Lzero_permute /* No shift is needed if highest index ++ in vr is 15. */ ++ lhi %r0,15 ++ slr %r0,%r4 /* Compute byte count for vector shift right. */ ++ sll %r0,3 /* Convert to bit count. */ ++ vlvgb %v17,%r0,7 ++ vsrlb %v19,%v19,%v17 /* Vector shift right by byte by number of bytes ++ specified in bits 1-4 of byte 7 in v17. */ ++ ++ /* Reverse bytes in v19. */ ++.Lzero_permute: ++ vperm %v19,%v19,%v19,%v20 /* Permute v19 to reversed order. */ ++ ++ /* Find c in reversed v19. */ ++ vfeeb %v19,%v19,%v18 /* Find c. */ ++ la %r2,0(%r1,%r2) ++ vlgvb %r3,%v19,7 /* Load byte index of c. */ ++ ++ /* Compute index in real s and return. */ ++ slgr %r4,%r3 ++ la %r2,0(%r4,%r2) /* Return pointer to zero. */ ++ br %r14 ++.Lpermute_mask: ++ .byte 0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08 ++ .byte 0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00 ++END(__strrchr_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strrchr.c b/sysdeps/s390/multiarch/strrchr.c +new file mode 100644 +index 0000000..dc4efd3 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strrchr.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of strrchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strrchr, strrchr) ++weak_alias (strrchr, rindex) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcsrchr-c.c b/sysdeps/s390/multiarch/wcsrchr-c.c +new file mode 100644 +index 0000000..8f66600 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsrchr-c.c +@@ -0,0 +1,25 @@ ++/* Default wcsrchr implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSRCHR __wcsrchr_c ++ ++# include ++extern __typeof (wcsrchr) __wcsrchr_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcsrchr-vx.S b/sysdeps/s390/multiarch/wcsrchr-vx.S +new file mode 100644 +index 0000000..efb7701 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsrchr-vx.S +@@ -0,0 +1,190 @@ ++/* Vector optimized 32/64 bit S/390 version of wcsrchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t *wcsrchr (const wchar_t *s, wchar_t c) ++ Locate the last character c in string. ++ ++ Register usage: ++ -r0=loaded bytes in first part of s. ++ -r1=pointer to last occurence of c or NULL if not found. ++ -r2=s ++ -r3=c ++ -r4=tmp ++ -r5=current_len ++ -v16=part of s ++ -v17=index of found element ++ -v18=replicated c ++ -v19=part of s with last occurence of c. ++ -v20=permute pattern ++*/ ++ENTRY(__wcsrchr_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ vlvgf %v18,%r3,0 /* Generate vector which elements are all c. */ ++ vrepf %v18,%v18,0 ++ ++ lghi %r1,-1 /* Currently no c found. */ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ vfeezfs %v17,%v16,%v18 /* Find element equal or zero. */ ++ vlgvb %r4,%v17,7 /* Load byte index of c/zero or 16. */ ++ clrjl %r4,%r0,.Lfound_first_part /* Found c/zero in loaded bytes. */ ++.Lalign: ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 /* current_len = 16. */ ++ slr %r5,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfeezfs %v17,%v16,%v18 /* Find element equal with zero search. */ ++ jno .Lfound /* Found c/zero (cc=0|1|2). */ ++ vl %v16,16(%r5,%r2) ++ vfeezfs %v17,%v16,%v18 ++ jno .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeezfs %v17,%v16,%v18 ++ jno .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeezfs %v17,%v16,%v18 ++ jno .Lfound48 ++ ++ aghi %r5,64 ++ j .Lloop /* No character and no zero -> loop. */ ++ ++.Lfound48: ++ la %r5,16(%r5) /* Use la since aghi would clobber cc. */ ++.Lfound32: ++ la %r5,16(%r5) ++.Lfound16: ++ la %r5,16(%r5) ++.Lfound: ++ je .Lzero /* Found zero, but no c before that zero. */ ++ /* Save this part of s to check for further matches after reaching ++ the end of the complete string. */ ++ vlr %v19,%v16 ++ lgr %r1,%r5 ++ ++ jh .Lzero /* Found a zero after the found c. */ ++ aghi %r5,16 /* Start search of next part of s. */ ++ j .Lloop ++ ++.Lfound_first_part: ++ /* This code is only executed if the found c/zero is whithin loaded ++ bytes. If no c/zero was found (cc==3) the found index = 16, thus ++ this code is not called. ++ Resulting condition code of vector find element equal: ++ cc==0: no c, found zero ++ cc==1: c found, no zero ++ cc==2: c found, found zero after c ++ cc==3: no c, no zero (this case can be ignored). */ ++ je .Lzero /* Found zero, but no c before that zero. */ ++ ++ locgrne %r1,%r5 /* Mark c as found in first part of s. */ ++ vlr %v19,%v16 ++ ++ jl .Lalign /* No zero (e.g. if vr was fully loaded) ++ -> Align and loop afterwards. */ ++ ++ /* Found a zero in vr. If vr was not fully loaded due to block ++ boundary, the remaining bytes are filled with zero and we can't ++ rely on zero indication of condition code here! */ ++ ++ vfenezf %v17,%v16,%v16 ++ vlgvb %r4,%v17,7 /* Load byte index of zero or 16. */ ++ clrjl %r4,%r0,.Lzero /* Zero within loaded bytes -> end. */ ++ j .Lalign /* Align and loop afterwards. */ ++ ++.Lend_searched_zero: ++ vlgvb %r4,%v17,7 /* Load byte index of zero. */ ++ algr %r5,%r4 ++ la %r2,0(%r5,%r2) /* Return pointer to zero. */ ++ br %r14 ++ ++.Lzero: ++ /* Reached end of string. Check if one c was found before. */ ++ clije %r3,0,.Lend_searched_zero /* Found zero and c is zero. */ ++ ++ cgfi %r1,-1 /* No c found -> return NULL. */ ++ locghie %r2,0 ++ ber %r14 ++ ++ larl %r3,.Lpermute_mask /* Load permute mask. */ ++ vl %v20,0(%r3) ++ ++ /* c was found and is part of v19. */ ++ vfenezf %v17,%v19,%v19 /* Find zero. */ ++ vlgvb %r4,%v17,7 /* Load byte index of zero or 16. */ ++ ahi %r4,3 /* Found zero index is first byte, ++ thus highest byte index is last byte of ++ wchar_t zero. */ ++ ++ clgfi %r5,0 /* Loaded byte count in v19 is 16, ... */ ++ lochine %r0,16 /* ... if v19 is not the first part of s. */ ++ ahi %r0,-1 /* Convert byte count to highest index. */ ++ ++ clr %r0,%r4 ++ locrl %r4,%r0 /* r4 = min (zero-index, highest-index). */ ++ ++ /* Right-shift of v19 to mask bytes after zero. */ ++ clije %r4,15,.Lzero_permute /* No shift is needed if highest index ++ in vr is 15. */ ++ lhi %r0,15 ++ slr %r0,%r4 /* Compute byte count for vector shift left. */ ++ sll %r0,3 /* Convert to bit count. */ ++ vlvgb %v17,%r0,7 ++ vsrlb %v19,%v19,%v17 /* Vector shift right by byte by number of bytes ++ specified in bits 1-4 of byte 7 in v17. */ ++ ++ /* Reverse bytes in v19. */ ++.Lzero_permute: ++ vperm %v19,%v19,%v19,%v20 /* Permute v19 to reversed order. */ ++ ++ /* Find c in reversed v19. */ ++ vfeef %v19,%v19,%v18 /* Find c. */ ++ la %r2,0(%r1,%r2) ++ vlgvb %r3,%v19,7 /* Load byte index of c. */ ++ ++ /* Compute index in real s and return. */ ++ slgr %r4,%r3 ++ lay %r2,-3(%r4,%r2) /* Return pointer to zero. -3 is needed, ++ because the found byte index is reversed in ++ vector-register. Thus point to first byte of ++ wchar_t. */ ++ br %r14 ++.Lpermute_mask: ++ .byte 0x0C,0x0D,0x0E,0x0F,0x08,0x09,0x0A,0x0B ++ .byte 0x04,0x05,0x06,0x07,0x00,0x01,0x02,0x03 ++.Lfallback: ++ jg __wcsrchr_c ++END(__wcsrchr_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcsrchr.c b/sysdeps/s390/multiarch/wcsrchr.c +new file mode 100644 +index 0000000..db3f467 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsrchr.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcsrchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcsrchr, wcsrchr) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-23.patch b/SOURCES/glibc-rh1268008-23.patch new file mode 100644 index 0000000..eeaad59 --- /dev/null +++ b/SOURCES/glibc-rh1268008-23.patch @@ -0,0 +1,1236 @@ +From 67611d45bb5e464f2e80782ec37ce3548459cf57 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 12:56:03 +0200 +Subject: [PATCH 23/30] S390: Optimize strspn and wcsspn. + +upstream-commit-id: f1ffad98be7ec4111fbd1cd1f58f3e3343257519 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00095.html + +This patch provides optimized versions of strspn and wcsspn with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strspn-c.c: New File. + * sysdeps/s390/multiarch/strspn-vx.S: Likewise. + * sysdeps/s390/multiarch/strspn.c: Likewise. + * sysdeps/s390/multiarch/wcsspn-c.c: Likewise. + * sysdeps/s390/multiarch/wcsspn-vx.S: Likewise. + * sysdeps/s390/multiarch/wcsspn.c: Likewise. + * wcsmbs/wcsspn.c: Use WCSSPN if defined. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strspn and + wcsspn functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strspn, wcsspn. + * string/test-strspn.c: Add wcsspn support. + * wcsmbs/test-wcsspn.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcsspn. + * benchtests/bench-strspn.c: Add wcsspn support. + * benchtests/bench-wcsspn.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcsspn. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strspn.c | 71 +++++--- + benchtests/bench-wcsspn.c | 20 +++ + string/strspn.c | 7 +- + string/test-strspn.c | 100 +++++++----- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strspn-c.c | 28 ++++ + sysdeps/s390/multiarch/strspn-vx.S | 256 +++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strspn.c | 27 ++++ + sysdeps/s390/multiarch/wcsspn-c.c | 31 ++++ + sysdeps/s390/multiarch/wcsspn-vx.S | 270 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcsspn.c | 27 ++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcsspn-ifunc.c | 20 +++ + wcsmbs/test-wcsspn.c | 20 +++ + wcsmbs/wcsspn.c | 3 + + 17 files changed, 827 insertions(+), 66 deletions(-) + create mode 100644 benchtests/bench-wcsspn.c + create mode 100644 sysdeps/s390/multiarch/strspn-c.c + create mode 100644 sysdeps/s390/multiarch/strspn-vx.S + create mode 100644 sysdeps/s390/multiarch/strspn.c + create mode 100644 sysdeps/s390/multiarch/wcsspn-c.c + create mode 100644 sysdeps/s390/multiarch/wcsspn-vx.S + create mode 100644 sysdeps/s390/multiarch/wcsspn.c + create mode 100644 wcsmbs/test-wcsspn-ifunc.c + create mode 100644 wcsmbs/test-wcsspn.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 6444394..337b2a1 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp wcsncmp wcschr wcschrnul wcsrchr ++ wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strspn.c b/benchtests/bench-strspn.c +index 634bca1..e1f2272 100644 +--- a/benchtests/bench-strspn.c ++++ b/benchtests/bench-strspn.c +@@ -17,22 +17,47 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strspn" ++#ifndef WIDE ++# define TEST_NAME "strspn" ++#else ++# define TEST_NAME "wcsspn" ++#endif /* WIDE */ + #include "bench-string.h" + +-typedef size_t (*proto_t) (const char *, const char *); +-size_t simple_strspn (const char *, const char *); +-size_t stupid_strspn (const char *, const char *); +- +-IMPL (stupid_strspn, 0) +-IMPL (simple_strspn, 0) +-IMPL (strspn, 1) ++#ifndef WIDE ++# define STRSPN strspn ++# define CHAR char ++# define SIMPLE_STRSPN simple_strspn ++# define STUPID_STRSPN stupid_strspn ++# define STRLEN strlen ++# define STRCHR strchr ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define STRSPN wcsspn ++# define CHAR wchar_t ++# define SIMPLE_STRSPN simple_wcsspn ++# define STUPID_STRSPN stupid_wcsspn ++# define STRLEN wcslen ++# define STRCHR wcschr ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ ++ ++typedef size_t (*proto_t) (const CHAR *, const CHAR *); ++size_t SIMPLE_STRSPN (const CHAR *, const CHAR *); ++size_t STUPID_STRSPN (const CHAR *, const CHAR *); ++ ++IMPL (STUPID_STRSPN, 0) ++IMPL (SIMPLE_STRSPN, 0) ++IMPL (STRSPN, 1) + + size_t +-simple_strspn (const char *s, const char *acc) ++SIMPLE_STRSPN (const CHAR *s, const CHAR *acc) + { +- const char *r, *str = s; +- char c; ++ const CHAR *r, *str = s; ++ CHAR c; + + while ((c = *s++) != '\0') + { +@@ -46,9 +71,9 @@ simple_strspn (const char *s, const char *acc) + } + + size_t +-stupid_strspn (const char *s, const char *acc) ++STUPID_STRSPN (const CHAR *s, const CHAR *acc) + { +- size_t ns = strlen (s), nacc = strlen (acc); ++ size_t ns = STRLEN (s), nacc = STRLEN (acc); + size_t i, j; + + for (i = 0; i < ns; ++i) +@@ -63,7 +88,7 @@ stupid_strspn (const char *s, const char *acc) + } + + static void +-do_one_test (impl_t *impl, const char *s, const char *acc, size_t exp_res) ++do_one_test (impl_t *impl, const CHAR *s, const CHAR *acc, size_t exp_res) + { + size_t res = CALL (impl, s, acc), i, iters = INNER_LOOP_ITERS; + timing_t start, stop, cur; +@@ -92,34 +117,34 @@ static void + do_test (size_t align, size_t pos, size_t len) + { + size_t i; +- char *acc, *s; ++ CHAR *acc, *s; + + align &= 7; +- if (align + pos + 10 >= page_size || len > 240 || ! len) ++ if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240 || ! len) + return; + +- acc = (char *) (buf2 + (random () & 255)); +- s = (char *) (buf1 + align); ++ acc = (CHAR *) (buf2) + (random () & BIG_CHAR); ++ s = (CHAR *) (buf1) + align; + + for (i = 0; i < len; ++i) + { +- acc[i] = random () & 255; ++ acc[i] = random () & BIG_CHAR; + if (!acc[i]) +- acc[i] = random () & 255; ++ acc[i] = random () & BIG_CHAR; + if (!acc[i]) +- acc[i] = 1 + (random () & 127); ++ acc[i] = 1 + (random () & SMALL_CHAR); + } + acc[len] = '\0'; + + for (i = 0; i < pos; ++i) + s[i] = acc[random () % len]; +- s[pos] = random () & 255; ++ s[pos] = random () & BIG_CHAR; + if (strchr (acc, s[pos])) + s[pos] = '\0'; + else + { + for (i = pos + 1; i < pos + 10; ++i) +- s[i] = random () & 255; ++ s[i] = random () & BIG_CHAR; + s[i] = '\0'; + } + +diff --git a/benchtests/bench-wcsspn.c b/benchtests/bench-wcsspn.c +new file mode 100644 +index 0000000..7bdef50 +--- /dev/null ++++ b/benchtests/bench-wcsspn.c +@@ -0,0 +1,20 @@ ++/* Measure wcsspn functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strspn.c" +diff --git a/string/strspn.c b/string/strspn.c +index 48624aa..f0ac9db 100644 +--- a/string/strspn.c ++++ b/string/strspn.c +@@ -18,13 +18,14 @@ + #include + + #undef strspn ++#ifndef STRSPN ++#define STRSPN strspn ++#endif + + /* Return the length of the maximum initial segment + of S which contains only characters in ACCEPT. */ + size_t +-strspn (s, accept) +- const char *s; +- const char *accept; ++STRSPN (const char *s, const char *accept) + { + const char *p; + const char *a; +diff --git a/string/test-strspn.c b/string/test-strspn.c +index 0d6cd19..306958e 100644 +--- a/string/test-strspn.c ++++ b/string/test-strspn.c +@@ -18,22 +18,49 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "strspn" ++#ifndef WIDE ++# define TEST_NAME "strspn" ++#else ++# define TEST_NAME "wcsspn" ++#endif /* WIDE */ + #include "test-string.h" + +-typedef size_t (*proto_t) (const char *, const char *); +-size_t simple_strspn (const char *, const char *); +-size_t stupid_strspn (const char *, const char *); +- +-IMPL (stupid_strspn, 0) +-IMPL (simple_strspn, 0) +-IMPL (strspn, 1) ++#ifndef WIDE ++# define STRSPN strspn ++# define CHAR char ++# define UCHAR unsigned char ++# define SIMPLE_STRSPN simple_strspn ++# define STUPID_STRSPN stupid_strspn ++# define STRLEN strlen ++# define STRCHR strchr ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define STRSPN wcsspn ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define SIMPLE_STRSPN simple_wcsspn ++# define STUPID_STRSPN stupid_wcsspn ++# define STRLEN wcslen ++# define STRCHR wcschr ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ ++ ++typedef size_t (*proto_t) (const CHAR *, const CHAR *); ++size_t SIMPLE_STRSPN (const CHAR *, const CHAR *); ++size_t STUPID_STRSPN (const CHAR *, const CHAR *); ++ ++IMPL (STUPID_STRSPN, 0) ++IMPL (SIMPLE_STRSPN, 0) ++IMPL (STRSPN, 1) + + size_t +-simple_strspn (const char *s, const char *acc) ++SIMPLE_STRSPN (const CHAR *s, const CHAR *acc) + { +- const char *r, *str = s; +- char c; ++ const CHAR *r, *str = s; ++ CHAR c; + + while ((c = *s++) != '\0') + { +@@ -47,9 +74,9 @@ simple_strspn (const char *s, const char *acc) + } + + size_t +-stupid_strspn (const char *s, const char *acc) ++STUPID_STRSPN (const CHAR *s, const CHAR *acc) + { +- size_t ns = strlen (s), nacc = strlen (acc); ++ size_t ns = STRLEN (s), nacc = STRLEN (acc); + size_t i, j; + + for (i = 0; i < ns; ++i) +@@ -64,7 +91,7 @@ stupid_strspn (const char *s, const char *acc) + } + + static void +-do_one_test (impl_t *impl, const char *s, const char *acc, size_t exp_res) ++do_one_test (impl_t *impl, const CHAR *s, const CHAR *acc, size_t exp_res) + { + size_t res = CALL (impl, s, acc); + if (res != exp_res) +@@ -80,34 +107,34 @@ static void + do_test (size_t align, size_t pos, size_t len) + { + size_t i; +- char *acc, *s; ++ CHAR *acc, *s; + + align &= 7; +- if (align + pos + 10 >= page_size || len > 240 || ! len) ++ if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240 || ! len) + return; + +- acc = (char *) (buf2 + (random () & 255)); +- s = (char *) (buf1 + align); ++ acc = (CHAR *) (buf2) + (random () & 255); ++ s = (CHAR *) (buf1) + align; + + for (i = 0; i < len; ++i) + { +- acc[i] = random () & 255; ++ acc[i] = random () & BIG_CHAR; + if (!acc[i]) +- acc[i] = random () & 255; ++ acc[i] = random () & BIG_CHAR; + if (!acc[i]) +- acc[i] = 1 + (random () & 127); ++ acc[i] = 1 + (random () & SMALL_CHAR); + } + acc[len] = '\0'; + + for (i = 0; i < pos; ++i) + s[i] = acc[random () % len]; +- s[pos] = random () & 255; +- if (strchr (acc, s[pos])) ++ s[pos] = random () & BIG_CHAR; ++ if (STRCHR (acc, s[pos])) + s[pos] = '\0'; + else + { + for (i = pos + 1; i < pos + 10; ++i) +- s[i] = random () & 255; ++ s[i] = random () & BIG_CHAR; + s[i] = '\0'; + } + +@@ -119,8 +146,8 @@ static void + do_random_tests (void) + { + size_t i, j, n, align, pos, alen, len; +- unsigned char *p = buf1 + page_size - 512; +- unsigned char *acc; ++ UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; ++ UCHAR *acc; + + for (n = 0; n < ITERATIONS; n++) + { +@@ -138,14 +165,14 @@ do_random_tests (void) + len = random () & 511; + if (len + align >= 512) + len = 511 - align - (random () & 7); +- acc = buf2 + page_size - alen - 1 - (random () & 7); ++ acc = (UCHAR *) (buf2 + page_size) - alen - 1 - (random () & 7); + for (i = 0; i < alen; ++i) + { +- acc[i] = random () & 255; ++ acc[i] = random () & BIG_CHAR; + if (!acc[i]) +- acc[i] = random () & 255; ++ acc[i] = random () & BIG_CHAR; + if (!acc[i]) +- acc[i] = 1 + (random () & 127); ++ acc[i] = 1 + (random () & SMALL_CHAR); + } + acc[i] = '\0'; + j = (pos > len ? pos : len) + align + 64; +@@ -158,26 +185,27 @@ do_random_tests (void) + p[i] = '\0'; + else if (i == pos + align) + { +- p[i] = random () & 255; +- if (strchr ((char *) acc, p[i])) ++ p[i] = random () & BIG_CHAR; ++ if (STRCHR ((CHAR *) acc, p[i])) + p[i] = '\0'; + } + else if (i < align || i > pos + align) +- p[i] = random () & 255; ++ p[i] = random () & BIG_CHAR; + else + p[i] = acc [random () % alen]; + } + + FOR_EACH_IMPL (impl, 1) +- if (CALL (impl, (char *) (p + align), +- (char *) acc) != (pos < len ? pos : len)) ++ if (CALL (impl, (CHAR *) (p + align), ++ (CHAR *) acc) != (pos < len ? pos : len)) + { + error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %p, %zd, %zd, %zd) %zd != %zd", + n, impl->name, align, acc, alen, pos, len, +- CALL (impl, (char *) (p + align), (char *) acc), ++ CALL (impl, (CHAR *) (p + align), (CHAR *) acc), + (pos < len ? pos : len)); + ret = 1; + } ++ + } + } + +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index b8b141e..9403169 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -11,7 +11,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strncmp strncmp-vx strncmp-c \ + strchr strchr-vx strchr-c \ + strchrnul strchrnul-vx strchrnul-c \ +- strrchr strrchr-vx strrchr-c ++ strrchr strrchr-vx strrchr-c \ ++ strspn strspn-vx strspn-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -27,5 +28,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsncmp wcsncmp-vx wcsncmp-c \ + wcschr wcschr-vx wcschr-c \ + wcschrnul wcschrnul-vx wcschrnul-c \ +- wcsrchr wcsrchr-vx wcsrchr-c ++ wcsrchr wcsrchr-vx wcsrchr-c \ ++ wcsspn wcsspn-vx wcsspn-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index ee84d80..cbedf64 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -118,6 +118,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strrchr); + IFUNC_VX_IMPL (wcsrchr); + ++ IFUNC_VX_IMPL (strspn); ++ IFUNC_VX_IMPL (wcsspn); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strspn-c.c b/sysdeps/s390/multiarch/strspn-c.c +new file mode 100644 +index 0000000..8a7d342 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strspn-c.c +@@ -0,0 +1,28 @@ ++/* Default strspn implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRSPN __strspn_c ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strspn_c, __GI_strspn, __strspn_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strspn-vx.S b/sysdeps/s390/multiarch/strspn-vx.S +new file mode 100644 +index 0000000..df22347 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strspn-vx.S +@@ -0,0 +1,256 @@ ++/* Vector optimized 32/64 bit S/390 version of strspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t strspn (const char *s, const char * accept) ++ The strspn() function calculates the length of the initial segment ++ of s which consists entirely of characters in accept. ++ ++ This method checks the length of accept string. If it fits entirely ++ in one vector register, a fast algorithm is used, which does not need ++ to check multiple parts of accept-string. Otherwise a slower full ++ check of accept-string is used. ++ ++ register overview: ++ r3: pointer to start of accept-string ++ r2: pointer to start of search-string ++ r4: loaded byte count of vl search-string ++ r0: found byte index ++ r1: current return len of s ++ v16: search-string ++ v17: accept-string ++ v18: temp-vreg ++ ++ ONLY FOR SLOW: ++ v19: first accept-string ++ v20: zero for preparing acc-vector ++ v21: global mask; 1 indicates a match between ++ search-string-vreg and any accept-character ++ v22: current mask; 1 indicates a match between ++ search-string-vreg and any accept-character in current acc-vreg ++ v30, v31: for re-/storing registers r6, r8, r9 ++ r5: current len of accept-string ++ r6: zero-index in search-string or 16 if no zero ++ or min(zero-index, loaded byte count) ++ r8: >0, if former accept-string-part contains a zero, ++ otherwise =0; ++ r9: loaded byte count of vlbb accept-string ++*/ ++ENTRY(__strspn_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ /* ++ Check if accept-string fits in one vreg: ++ ---------------------------------------- ++ */ ++ vlbb %v17,0(%r3),6 /* Load accept. */ ++ lcbb %r4,0(%r3),6 ++ jo .Lcheck_onbb /* Special case if accept lays ++ on block-boundary. */ ++.Lcheck_notonbb: ++ vistrbs %v17,%v17 /* Fill with zeros after first zero. */ ++ je .Lfast /* Zero found -> accept fits in one vreg. */ ++ j .Lslow /* No zero -> accept exceeds one vreg. */ ++ ++.Lcheck_onbb: ++ /* Accept lays on block-boundary. */ ++ vfenezb %v18,%v17,%v17 /* Search zero in loaded accept bytes. */ ++ vlgvb %r0,%v18,7 /* Get index of zero or 16 if not found. */ ++ clrjl %r0,%r4,.Lcheck_notonbb /* Zero index < loaded bytes count -> ++ Accept fits in one vreg; ++ Fill with zeros and proceed ++ with FAST. */ ++ vl %v17,0(%r3) /* Load accept, which exceeds loaded bytes. */ ++ j .Lcheck_notonbb /* Check if accept fits in one vreg. */ ++ ++ ++ /* ++ Search s for accept in one vreg ++ ------------------------------- ++ */ ++.Lfast: ++ /* Complete accept-string is in v17 and remaining bytes are zero. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfaezbs %v16,%v16,%v17,8 /* Find first element in v16 ++ unequal to any in v17 ++ or first zero element. */ ++ vlgvb %r0,%v16,7 /* Load byte index of found element. */ ++ /* If found index is within loaded bytes (%r0 < %r1), ++ return with found element index (=equal count). */ ++ clr %r0,%r1 ++ locgrl %r2,%r0 ++ blr %r14 ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r1,16 /* current_len = 16. */ ++ slr %r1,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++.Lfast_loop: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ vfaezbs %v16,%v16,%v17,8 /* Find first element in v16 ++ unequal to any in v17 ++ or first zero element. */ ++ jno .Lfast_loop_found ++ vl %v16,16(%r1,%r2) ++ vfaezbs %v16,%v16,%v17,8 ++ jno .Lfast_loop_found16 ++ vl %v16,32(%r1,%r2) ++ vfaezbs %v16,%v16,%v17,8 ++ jno .Lfast_loop_found32 ++ vl %v16,48(%r1,%r2) ++ vfaezbs %v16,%v16,%v17,8 ++ jno .Lfast_loop_found48 ++ ++ aghi %r1,64 ++ j .Lfast_loop /* Loop if no element was unequal to accept ++ and not zero. */ ++ ++ /* Found unequal or zero element. */ ++.Lfast_loop_found48: ++ aghi %r1,16 ++.Lfast_loop_found32: ++ aghi %r1,16 ++.Lfast_loop_found16: ++ aghi %r1,16 ++.Lfast_loop_found: ++ vlgvb %r0,%v16,7 /* Load byte index of found element. */ ++ algrk %r2,%r1,%r0 /* And add it to current len. */ ++ br %r14 ++ ++ ++ /* ++ Search s for accept in multiple vregs ++ ------------------------------------- ++ */ ++.Lslow: ++ /* Save registers. */ ++ vlvgg %v30,%r6,0 ++ vlvgp %v31,%r8,%r9 ++ lghi %r1,0 /* current_len = 0. */ ++ ++ /* Accept in v17 without zero. */ ++ vlr %v19,%v17 /* Save first acc-part for a fast reload. */ ++ vzero %v20 /* Zero for preparing acc-vector. */ ++ ++ /* Align s to 16 byte. */ ++ risbg %r0,%r2,60,128+63,0 /* Test if s is aligned and ++ %r0 = bits 60-63 'and' 15 */ ++ je .Lslow_loop_str /* If s is aligned, loop aligned */ ++ lghi %r4,15 ++ slr %r4,%r0 /* Compute highest index to load (15-x). */ ++ vll %v16,%r4,0(%r2) /* Load up to 16byte boundary (vll needs ++ highest index, left bytes are 0). */ ++ ahi %r4,1 /* Work with loaded byte count. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept-string to zero. */ ++ vfenezb %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 ++ if there is no zero. */ ++ clr %r4,%r6 /* cc==1 if loaded byte count < zero-index. */ ++ locrl %r6,%r4 /* Load on cc==1. */ ++ j .Lslow_loop_acc ++ ++ /* Process s in 16byte aligned loop. */ ++.Lslow_next_str: ++ vlr %v17,%v19 /* Load first part of accept (no zero). */ ++ algfr %r1,%r4 /* Add loaded byte count to current len. */ ++.Lslow_loop_str: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ lghi %r4,16 /* Loaded byte count is 16. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept-string to zero. */ ++ vfenezb %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ ++.Lslow_loop_acc: ++ vfaeb %v22,%v16,%v17,4 /* Create matching-mask (1 in mask -> ++ character matches any accepted character in ++ this accept-string-part) IN=0, RT=1. */ ++ vo %v21,%v21,%v22 /* global-mask = global- | matching-mask. */ ++ vfenezb %v18,%v21,%v21 /* Find first zero in global-mask. */ ++ vlgvb %r0,%v18,7 /* Get first found zero-index ++ (= first mismatch). */ ++ clrjl %r0,%r6,.Lslow_next_acc /* Mismatch-index < min(lbc,zero-index) ++ -> Process this string-part ++ with next acc-part. */ ++ clrjhe %r0,%r4,.Lslow_next_str /* Found-index >= loaded byte count ++ -> All loaded bytes are matching ++ any accept-character ++ and are not zero. */ ++ /* All bytes are matching any characters in accept-string ++ and search-string is fully processed (found-index == zero-index) */ ++.Lslow_add_lbc_end: ++ algrk %r2,%r1,%r0 /* Add matching characters to current_len. */ ++ /* Restore registers. */ ++ vlgvg %r6,%v30,0 ++ vlgvg %r8,%v31,0 ++ vlgvg %r9,%v31,1 ++ br %r14 ++ ++ ++ ++.Lslow_next_acc: ++ clijh %r8,0,.Lslow_add_lbc_end /* There was a zero in last acc-part ++ -> Add found index to current len ++ and end. */ ++ vlbb %v17,16(%r5,%r3),6 /* Load next accept part. */ ++ aghi %r5,16 /* Add current_len of accept-string. */ ++ lcbb %r9,0(%r5,%r3),6 /* Get loaded byte count of accept-string. */ ++ jo .Lslow_next_acc_onbb /* Jump away if accept-string is ++ on block-boundary. */ ++.Lslow_next_acc_notonbb: ++ vistrbs %v17,%v17 /* Fill with zeros after first zero. */ ++ jo .Lslow_loop_acc /* No zero found -> no preparation needed. */ ++ ++.Lslow_next_acc_prepare_zero: ++ /* Zero in accept-part: fill zeros with first-accept-character. */ ++ vlgvb %r8,%v17,0 /* Load first element of acc-part. */ ++ clije %r8,0,.Lslow_add_lbc_end /* End if zero is first character ++ in this part of accept-string. */ ++ /* r8>0 -> zero found in this acc-part. */ ++ vrepb %v18,%v17,0 /* Replicate first char accross all chars. */ ++ vceqb %v22,%v20,%v17 /* Create a mask (v22) of null chars ++ by comparing with 0 (v20). */ ++ vsel %v17,%v18,%v17,%v22 /* Replace null chars with first char. */ ++ j .Lslow_loop_acc /* Accept part is prepared -> process. */ ++ ++.Lslow_next_acc_onbb: ++ vfenezb %v18,%v17,%v17 /* Find zero in loaded bytes of accept part. */ ++ vlgvb %r8,%v18,7 /* Load byte index of zero. */ ++ clrjl %r8,%r9,.Lslow_next_acc_notonbb /* Found a zero in loaded bytes ++ -> Prepare vr. */ ++ vl %v17,0(%r5,%r3) /* Load over boundary ... */ ++ lghi %r8,0 /* r8=0 -> no zero in this part of acc, ++ Check for zero is in jump-target. */ ++ j .Lslow_next_acc_notonbb /* ... and search for zero in ++ fully loaded vreg again. */ ++END(__strspn_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strspn.c b/sysdeps/s390/multiarch/strspn.c +new file mode 100644 +index 0000000..48dd77b +--- /dev/null ++++ b/sysdeps/s390/multiarch/strspn.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of strspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strspn, strspn) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcsspn-c.c b/sysdeps/s390/multiarch/wcsspn-c.c +new file mode 100644 +index 0000000..93af16c +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsspn-c.c +@@ -0,0 +1,31 @@ ++/* Default wcsspn implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSSPN __wcsspn_c ++ ++# include ++extern __typeof (wcsspn) __wcsspn_c; ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__wcsspn_c, __GI_wcsspn, __wcsspn_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcsspn-vx.S b/sysdeps/s390/multiarch/wcsspn-vx.S +new file mode 100644 +index 0000000..4ed8e84 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsspn-vx.S +@@ -0,0 +1,270 @@ ++/* Vector optimized 32/64 bit S/390 version of wcsspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t wcsspn (const wchar_t *s, const wchar_t * accept) ++ The wcsspn() function calculates the length of the initial segment ++ of s which consists entirely of characters in accept. ++ ++ This method checks the length of accept string. If it fits entirely ++ in one vector register, a fast algorithm is used, which does not need ++ to check multiple parts of accept-string. Otherwise a slower full ++ check of accept-string is used. ++ ++ register overview: ++ r3: pointer to start of accept-string ++ r2: pointer to start of search-string ++ r4: loaded byte count of vl search-string ++ r0: found byte index ++ r1: current return len of s ++ v16: search-string ++ v17: accept-string ++ v18: temp-vreg ++ ++ ONLY FOR SLOW: ++ v19: first accept-string ++ v20: zero for preparing acc-vector ++ v21: global mask; 1 indicates a match between ++ search-string-vreg and any accept-character ++ v22: current mask; 1 indicates a match between ++ search-string-vreg and any accept-character in current acc-vreg ++ v30, v31: for re-/storing registers r6, r8, r9 ++ r5: current len of accept-string ++ r6: zero-index in search-string or 16 if no zero ++ or min(zero-index, loaded byte count) ++ r8: >0, if former accept-string-part contains a zero, ++ otherwise =0; ++ r9: loaded byte count of vlbb accept-string ++*/ ++ENTRY(__wcsspn_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ /* ++ Check if accept-string fits in one vreg: ++ ---------------------------------------- ++ */ ++ vlbb %v17,0(%r3),6 /* Load accept. */ ++ lcbb %r4,0(%r3),6 ++ jo .Lcheck_onbb /* Special case if accept lays ++ on block-boundary. */ ++.Lcheck_notonbb: ++ vistrfs %v17,%v17 /* Fill with zeros after first zero. */ ++ je .Lfast /* Zero found -> accept fits in one vreg. */ ++ j .Lslow /* No zero -> accept exceeds one vreg. */ ++ ++.Lcheck_onbb: ++ /* Accept lays on block-boundary. */ ++ nill %r4,65532 /* Recognize only fully loaded characters. */ ++ je .Lcheck_onbb2 /* Reload vr if no full wchar_t. */ ++ vfenezf %v18,%v17,%v17 /* Search zero in loaded accept bytes. */ ++ vlgvb %r0,%v18,7 /* Get index of zero or 16 if not found. */ ++ clrjl %r0,%r4,.Lcheck_notonbb /* Zero index < loaded bytes count -> ++ Accept fits in one vreg; ++ Fill with zeros and proceed ++ with FAST. */ ++.Lcheck_onbb2: ++ vl %v17,0(%r3) /* Load accept, which exceeds loaded bytes. */ ++ j .Lcheck_notonbb /* Check if accept fits in one vreg. */ ++ ++ ++ /* ++ Search s for accept in one vreg ++ ------------------------------- ++ */ ++.Lfast: ++ /* Complete accept-string in v17 and remaining bytes are zero. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfaezfs %v16,%v16,%v17,8 /* Find first element in v16 ++ unequal to any in v17 ++ or first zero element. */ ++ ++ vlgvb %r0,%v16,7 /* Load byte index of found element. */ ++ /* If found index is within loaded bytes (%r0 < %r1), ++ return with found element index (=equal count). */ ++ clr %r0,%r1 ++ srlg %r0,%r0,2 /* Convert byte-count to character-count. */ ++ locgrl %r2,%r0 ++ blr %r14 ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r1,16 /* current_len = 16. */ ++ slr %r1,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++.Lfast_loop: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ vfaezfs %v16,%v16,%v17,8 /* Find first element in v16 ++ unequal to any in v17 ++ or first zero element. */ ++ jno .Lfast_loop_found ++ vl %v16,16(%r1,%r2) ++ vfaezfs %v16,%v16,%v17,8 ++ jno .Lfast_loop_found16 ++ vl %v16,32(%r1,%r2) ++ vfaezfs %v16,%v16,%v17,8 ++ jno .Lfast_loop_found32 ++ vl %v16,48(%r1,%r2) ++ vfaezfs %v16,%v16,%v17,8 ++ jno .Lfast_loop_found48 ++ ++ aghi %r1,64 ++ j .Lfast_loop /* Loop if no element was unequal to accept ++ and not zero. */ ++ ++ /* Found unequal or zero element. */ ++.Lfast_loop_found48: ++ aghi %r1,16 ++.Lfast_loop_found32: ++ aghi %r1,16 ++.Lfast_loop_found16: ++ aghi %r1,16 ++.Lfast_loop_found: ++ vlgvb %r0,%v16,7 /* Load byte index of found element. */ ++ algrk %r2,%r1,%r0 /* And add it to current len. */ ++ srlg %r2,%r2,2 /* Convert byte-count to character-count. */ ++ br %r14 ++ ++ ++ /* ++ Search s for accept in multiple vregs ++ ------------------------------------- ++ */ ++.Lslow: ++ /* Save registers. */ ++ vlvgg %v30,%r6,0 ++ vlvgp %v31,%r8,%r9 ++ lghi %r1,0 /* Zero out current len. */ ++ ++ /* accept in v17 without zero. */ ++ vlr %v19,%v17 /* Save first acc-part for a fast reload. */ ++ vzero %v20 /* Zero for preparing acc-vector. */ ++ ++ /* Align s to 16 byte. */ ++ risbg %r0,%r2,60,128+63,0 /* Test if s is aligned and ++ %r0 = bits 60-63 'and' 15. */ ++ je .Lslow_loop_str /* If s is aligned, loop aligned */ ++ lghi %r4,15 ++ slr %r4,%r0 /* Compute highest index to load (15-x). */ ++ vll %v16,%r4,0(%r2) /* Load up to 16byte boundary (vll needs ++ highest index, remaining bytes are 0). */ ++ aghi %r4,1 /* Work with loaded byte count. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept-string to zero. */ ++ vfenezf %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 ++ if there is no zero. */ ++ clr %r4,%r6 /* cc==1 if loaded byte count < zero-index. */ ++ locrl %r6,%r4 /* Load on cc==1. */ ++ j .Lslow_loop_acc ++ ++ /* Process s in 16byte aligned loop. */ ++.Lslow_next_str: ++ vlr %v17,%v19 /* Load first part of accept (no zero). */ ++ algfr %r1,%r4 /* Add loaded byte count to current len. */ ++.Lslow_loop_str: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ lghi %r4,16 /* Loaded byte count is 16. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept-string to zero. */ ++ vfenezf %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ ++.Lslow_loop_acc: ++ vfaef %v22,%v16,%v17,4 /* Create matching-mask (1 in mask -> ++ character matches any accepted character in ++ this accept-string-part) IN=0, RT=1. */ ++ vo %v21,%v21,%v22 /* global-mask = global- | matching-mask. */ ++ vfenezf %v18,%v21,%v21 /* Find first zero in global-mask. */ ++ vlgvb %r0,%v18,7 /* Get first found zero-index ++ (= first mismatch). */ ++ clrjl %r0,%r6,.Lslow_next_acc /* Mismatch-index < min(lbc,zero-index) ++ -> Process this string-part ++ with next acc-part. */ ++ clrjhe %r0,%r4,.Lslow_next_str /* Found-index >= loaded byte count ++ -> All loaded bytes are matching ++ any accept-character ++ and are not zero. */ ++ /* All bytes are matching any characters in accept-string ++ and search-string is fully processed (found-index == zero-index). */ ++.Lslow_add_lbc_end: ++ algrk %r2,%r1,%r0 /* Add matching characters to current len. */ ++ srlg %r2,%r2,2 /* Convert byte-count to character-count. */ ++ /* Restore registers. */ ++ vlgvg %r6,%v30,0 ++ vlgvg %r8,%v31,0 ++ vlgvg %r9,%v31,1 ++ br %r14 ++ ++.Lslow_next_acc: ++ clijh %r8,0,.Lslow_add_lbc_end /* There was a zero in last acc-part ++ -> Add found index to current len ++ and end. */ ++ vlbb %v17,16(%r5,%r3),6 /* Load next accept part. */ ++ aghi %r5,16 /* Increment current len of accept-string. */ ++ lcbb %r9,0(%r5,%r3),6 /* Get loaded byte count of accept-string. */ ++ jo .Lslow_next_acc_onbb /* Jump away if accept-string is ++ on block-boundary. */ ++.Lslow_next_acc_notonbb: ++ vistrfs %v17,%v17 /* Fill with zeros after first zero. */ ++ jo .Lslow_loop_acc /* No zero found -> no preparation needed. */ ++ ++.Lslow_next_acc_prepare_zero: ++ /* Zero in accept-part: fill zeros with first-accept-character. */ ++ vlgvf %r8,%v17,0 /* Load first element of acc-part. */ ++ clije %r8,0,.Lslow_add_lbc_end /* End if zero is first character ++ in this part of accept-string. */ ++ /* r8>0 -> zero found in this acc-part. */ ++ vrepf %v18,%v17,0 /* Replicate first char accross all chars. */ ++ vceqf %v22,%v20,%v17 /* Create a mask (v22) of null chars ++ by comparing with 0 (v20). */ ++ vsel %v17,%v18,%v17,%v22 /* Replace null chars with first char. */ ++ j .Lslow_loop_acc /* Accept part is prepared -> process. */ ++ ++.Lslow_next_acc_onbb: ++ nill %r9,65532 /* Recognize only fully loaded characters. */ ++ je .Lslow_next_acc_onbb2 /* Reload vr, if we loaded no full ++ wchar_t. */ ++ vfenezf %v18,%v17,%v17 /* Find zero in loaded bytes of accept part. */ ++ vlgvb %r8,%v18,7 /* Load byte index of zero. */ ++ clrjl %r8,%r9,.Lslow_next_acc_notonbb /* Found a zero in loaded bytes ++ -> Prepare vreg. */ ++.Lslow_next_acc_onbb2: ++ vl %v17,0(%r5,%r3) /* Load over boundary ... */ ++ lghi %r8,0 /* r8=0 -> no zero in this part of acc, ++ check for zero is in jump-target. */ ++ j .Lslow_next_acc_notonbb /* ... and search for zero in ++ fully loaded vreg again. */ ++.Lfallback: ++ jg __wcsspn_c ++END(__wcsspn_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcsspn.c b/sysdeps/s390/multiarch/wcsspn.c +new file mode 100644 +index 0000000..3b3041c +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcsspn.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcsspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcsspn, wcsspn) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index de3635d..843a23c 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul ++ wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcsspn-ifunc.c b/wcsmbs/test-wcsspn-ifunc.c +new file mode 100644 +index 0000000..73f288f +--- /dev/null ++++ b/wcsmbs/test-wcsspn-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcsspn function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcsspn.c" +diff --git a/wcsmbs/test-wcsspn.c b/wcsmbs/test-wcsspn.c +new file mode 100644 +index 0000000..171043c +--- /dev/null ++++ b/wcsmbs/test-wcsspn.c +@@ -0,0 +1,20 @@ ++/* Test wcsspn functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strspn.c" +diff --git a/wcsmbs/wcsspn.c b/wcsmbs/wcsspn.c +index dad72b4..3e84726 100644 +--- a/wcsmbs/wcsspn.c ++++ b/wcsmbs/wcsspn.c +@@ -18,6 +18,9 @@ + + #include + ++#ifdef WCSSPN ++# define wcsspn WCSSPN ++#endif + + /* Return the length of the maximum initial segment + of WCS which contains only wide-characters in ACCEPT. */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-24.patch b/SOURCES/glibc-rh1268008-24.patch new file mode 100644 index 0000000..2b355e6 --- /dev/null +++ b/SOURCES/glibc-rh1268008-24.patch @@ -0,0 +1,1403 @@ +From 685417419834a85cd5d59787c25e487cd7129890 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 12:58:39 +0200 +Subject: [PATCH 24/30] S390: Optimize strpbrk and wcspbrk. + +upstream-commit-id: f0ba659847446eec3b2477d60c97c77ef4680e81 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00091.html + +This patch provides optimized versions of strpbrk and wcspbrk with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strpbrk-c.c: New File. + * sysdeps/s390/multiarch/strpbrk-vx.S: Likewise. + * sysdeps/s390/multiarch/strpbrk.c: Likewise. + * sysdeps/s390/multiarch/wcspbrk-c.c: Likewise. + * sysdeps/s390/multiarch/wcspbrk-vx.S: Likewise. + * sysdeps/s390/multiarch/wcspbrk.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strpbrk and + wcspbrk functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strpbrk, wcspbrk. + * wcsmbs/wcspbrk.c: Use WCSPBRK if defined. + * string/test-strpbrk.c: Add wcspbrk support. + * wcsmbs/test-wcspbrk.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcspbrk. + * benchtests/bench-strpbrk.c: Add wcspbrk support. + * benchtests/bench-wcspbrk.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcspbrk. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strpbrk.c | 100 ++++++---- + benchtests/bench-wcspbrk.c | 20 ++ + string/strpbrk.c | 8 +- + string/test-strpbrk.c | 130 ++++++++----- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strpbrk-c.c | 28 +++ + sysdeps/s390/multiarch/strpbrk-vx.S | 302 +++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strpbrk.c | 27 +++ + sysdeps/s390/multiarch/wcspbrk-c.c | 31 +++ + sysdeps/s390/multiarch/wcspbrk-vx.S | 315 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcspbrk.c | 27 +++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wcspbrk-ifunc.c | 20 ++ + wcsmbs/test-wcspbrk.c | 20 ++ + wcsmbs/wcspbrk.c | 3 + + 17 files changed, 953 insertions(+), 91 deletions(-) + create mode 100644 benchtests/bench-wcspbrk.c + create mode 100644 sysdeps/s390/multiarch/strpbrk-c.c + create mode 100644 sysdeps/s390/multiarch/strpbrk-vx.S + create mode 100644 sysdeps/s390/multiarch/strpbrk.c + create mode 100644 sysdeps/s390/multiarch/wcspbrk-c.c + create mode 100644 sysdeps/s390/multiarch/wcspbrk-vx.S + create mode 100644 sysdeps/s390/multiarch/wcspbrk.c + create mode 100644 wcsmbs/test-wcspbrk-ifunc.c + create mode 100644 wcsmbs/test-wcspbrk.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 337b2a1..015b5d6 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn ++ wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strpbrk.c b/benchtests/bench-strpbrk.c +index fe966be..f2db902 100644 +--- a/benchtests/bench-strpbrk.c ++++ b/benchtests/bench-strpbrk.c +@@ -16,50 +16,80 @@ + License along with the GNU C Library; if not, see + . */ + ++#ifndef WIDE ++# define CHAR char ++# define STRLEN strlen ++# define STRCHR strchr ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define CHAR wchar_t ++# define STRLEN wcslen ++# define STRCHR wcschr ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ ++ + #ifndef STRPBRK_RESULT + # define STRPBRK_RESULT(s, pos) ((s)[(pos)] ? (s) + (pos) : NULL) +-# define RES_TYPE char * ++# define RES_TYPE CHAR * + # define TEST_MAIN +-# define TEST_NAME "strpbrk" ++# ifndef WIDE ++# define TEST_NAME "strpbrk" ++# else ++# define TEST_NAME "wcspbrk" ++# endif /* WIDE */ + # include "bench-string.h" + +-typedef char *(*proto_t) (const char *, const char *); +-char *simple_strpbrk (const char *, const char *); +-char *stupid_strpbrk (const char *, const char *); +- +-IMPL (stupid_strpbrk, 0) +-IMPL (simple_strpbrk, 0) +-IMPL (strpbrk, 1) +- +-char * +-simple_strpbrk (const char *s, const char *rej) ++# ifndef WIDE ++# define STRPBRK strpbrk ++# define SIMPLE_STRPBRK simple_strpbrk ++# define STUPID_STRPBRK stupid_strpbrk ++# else ++# include ++# define STRPBRK wcspbrk ++# define SIMPLE_STRPBRK simple_wcspbrk ++# define STUPID_STRPBRK stupid_wcspbrk ++# endif /* WIDE */ ++ ++typedef CHAR *(*proto_t) (const CHAR *, const CHAR *); ++CHAR *SIMPLE_STRPBRK (const CHAR *, const CHAR *); ++CHAR *STUPID_STRPBRK (const CHAR *, const CHAR *); ++ ++IMPL (STUPID_STRPBRK, 0) ++IMPL (SIMPLE_STRPBRK, 0) ++IMPL (STRPBRK, 1) ++ ++CHAR * ++SIMPLE_STRPBRK (const CHAR *s, const CHAR *rej) + { +- const char *r; +- char c; ++ const CHAR *r; ++ CHAR c; + + while ((c = *s++) != '\0') + for (r = rej; *r != '\0'; ++r) + if (*r == c) +- return (char *) s - 1; ++ return (CHAR *) s - 1; + return NULL; + } + +-char * +-stupid_strpbrk (const char *s, const char *rej) ++CHAR * ++STUPID_STRPBRK (const CHAR *s, const CHAR *rej) + { +- size_t ns = strlen (s), nrej = strlen (rej); ++ size_t ns = STRLEN (s), nrej = STRLEN (rej); + size_t i, j; + + for (i = 0; i < ns; ++i) + for (j = 0; j < nrej; ++j) + if (s[i] == rej[j]) +- return (char *) s + i; ++ return (CHAR *) s + i; + return NULL; + } +-#endif ++#endif /* !STRPBRK_RESULT */ + + static void +-do_one_test (impl_t *impl, const char *s, const char *rej, RES_TYPE exp_res) ++do_one_test (impl_t *impl, const CHAR *s, const CHAR *rej, RES_TYPE exp_res) + { + RES_TYPE res = CALL (impl, s, rej); + size_t i, iters = INNER_LOOP_ITERS; +@@ -91,35 +121,35 @@ do_test (size_t align, size_t pos, size_t len) + size_t i; + int c; + RES_TYPE result; +- char *rej, *s; ++ CHAR *rej, *s; + + align &= 7; +- if (align + pos + 10 >= page_size || len > 240) ++ if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240) + return; + +- rej = (char *) (buf2 + (random () & 255)); +- s = (char *) (buf1 + align); ++ rej = (CHAR *) (buf2) + (random () & BIG_CHAR); ++ s = (CHAR *) (buf1) + align; + + for (i = 0; i < len; ++i) + { +- rej[i] = random () & 255; ++ rej[i] = random () & BIG_CHAR; + if (!rej[i]) +- rej[i] = random () & 255; ++ rej[i] = random () & BIG_CHAR; + if (!rej[i]) +- rej[i] = 1 + (random () & 127); ++ rej[i] = 1 + (random () & SMALL_CHAR); + } + rej[len] = '\0'; +- for (c = 1; c <= 255; ++c) +- if (strchr (rej, c) == NULL) ++ for (c = 1; c <= BIG_CHAR; ++c) ++ if (STRCHR (rej, c) == NULL) + break; + + for (i = 0; i < pos; ++i) + { +- s[i] = random () & 255; +- if (strchr (rej, s[i])) ++ s[i] = random () & BIG_CHAR; ++ if (STRCHR (rej, s[i])) + { +- s[i] = random () & 255; +- if (strchr (rej, s[i])) ++ s[i] = random () & BIG_CHAR; ++ if (STRCHR (rej, s[i])) + s[i] = c; + } + } +@@ -127,7 +157,7 @@ do_test (size_t align, size_t pos, size_t len) + if (s[pos]) + { + for (i = pos + 1; i < pos + 10; ++i) +- s[i] = random () & 255; ++ s[i] = random () & BIG_CHAR; + s[i] = '\0'; + } + result = STRPBRK_RESULT (s, pos); +diff --git a/benchtests/bench-wcspbrk.c b/benchtests/bench-wcspbrk.c +new file mode 100644 +index 0000000..3d9f00f +--- /dev/null ++++ b/benchtests/bench-wcspbrk.c +@@ -0,0 +1,20 @@ ++/* Measure wcspbrk functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strpbrk.c" +diff --git a/string/strpbrk.c b/string/strpbrk.c +index 7f45fdf..c153d8e 100644 +--- a/string/strpbrk.c ++++ b/string/strpbrk.c +@@ -25,11 +25,13 @@ + + #undef strpbrk + ++#ifndef STRPBRK ++# define STRPBRK strpbrk ++#endif ++ + /* Find the first occurrence in S of any character in ACCEPT. */ + char * +-strpbrk (s, accept) +- const char *s; +- const char *accept; ++STRPBRK (const char *s, const char *accept) + { + while (*s != '\0') + { +diff --git a/string/test-strpbrk.c b/string/test-strpbrk.c +index 72eaaa1..c36c5b5 100644 +--- a/string/test-strpbrk.c ++++ b/string/test-strpbrk.c +@@ -17,50 +17,82 @@ + License along with the GNU C Library; if not, see + . */ + ++#ifndef WIDE ++# define CHAR char ++# define UCHAR unsigned char ++# define STRLEN strlen ++# define STRCHR strchr ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define STRLEN wcslen ++# define STRCHR wcschr ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ ++ + #ifndef STRPBRK_RESULT + # define STRPBRK_RESULT(s, pos) ((s)[(pos)] ? (s) + (pos) : NULL) +-# define RES_TYPE char * ++# define RES_TYPE CHAR * + # define TEST_MAIN +-# define TEST_NAME "strpbrk" ++# ifndef WIDE ++# define TEST_NAME "strpbrk" ++# else ++# define TEST_NAME "wcspbrk" ++# endif /* WIDE */ + # include "test-string.h" + +-typedef char *(*proto_t) (const char *, const char *); +-char *simple_strpbrk (const char *, const char *); +-char *stupid_strpbrk (const char *, const char *); ++# ifndef WIDE ++# define STRPBRK strpbrk ++# define SIMPLE_STRPBRK simple_strpbrk ++# define STUPID_STRPBRK stupid_strpbrk ++# else ++# include ++# define STRPBRK wcspbrk ++# define SIMPLE_STRPBRK simple_wcspbrk ++# define STUPID_STRPBRK stupid_wcspbrk ++# endif /* WIDE */ ++ ++typedef CHAR *(*proto_t) (const CHAR *, const CHAR *); ++CHAR *SIMPLE_STRPBRK (const CHAR *, const CHAR *); ++CHAR *STUPID_STRPBRK (const CHAR *, const CHAR *); + +-IMPL (stupid_strpbrk, 0) +-IMPL (simple_strpbrk, 0) +-IMPL (strpbrk, 1) ++IMPL (STUPID_STRPBRK, 0) ++IMPL (SIMPLE_STRPBRK, 0) ++IMPL (STRPBRK, 1) + +-char * +-simple_strpbrk (const char *s, const char *rej) ++CHAR * ++SIMPLE_STRPBRK (const CHAR *s, const CHAR *rej) + { +- const char *r; +- char c; ++ const CHAR *r; ++ CHAR c; + + while ((c = *s++) != '\0') + for (r = rej; *r != '\0'; ++r) + if (*r == c) +- return (char *) s - 1; ++ return (CHAR *) s - 1; + return NULL; + } + +-char * +-stupid_strpbrk (const char *s, const char *rej) ++CHAR * ++STUPID_STRPBRK (const CHAR *s, const CHAR *rej) + { +- size_t ns = strlen (s), nrej = strlen (rej); ++ size_t ns = STRLEN (s), nrej = STRLEN (rej); + size_t i, j; + + for (i = 0; i < ns; ++i) + for (j = 0; j < nrej; ++j) + if (s[i] == rej[j]) +- return (char *) s + i; ++ return (CHAR *) s + i; + return NULL; + } +-#endif ++#endif /* !STRPBRK_RESULT */ + + static void +-do_one_test (impl_t *impl, const char *s, const char *rej, RES_TYPE exp_res) ++do_one_test (impl_t *impl, const CHAR *s, const CHAR *rej, RES_TYPE exp_res) + { + RES_TYPE res = CALL (impl, s, rej); + if (res != exp_res) +@@ -78,35 +110,35 @@ do_test (size_t align, size_t pos, size_t len) + size_t i; + int c; + RES_TYPE result; +- char *rej, *s; ++ CHAR *rej, *s; + + align &= 7; +- if (align + pos + 10 >= page_size || len > 240) ++ if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240) + return; + +- rej = (char *) (buf2 + (random () & 255)); +- s = (char *) (buf1 + align); ++ rej = (CHAR *) (buf2) + (random () & 255); ++ s = (CHAR *) (buf1) + align; + + for (i = 0; i < len; ++i) + { +- rej[i] = random () & 255; ++ rej[i] = random () & BIG_CHAR; + if (!rej[i]) +- rej[i] = random () & 255; ++ rej[i] = random () & BIG_CHAR; + if (!rej[i]) +- rej[i] = 1 + (random () & 127); ++ rej[i] = 1 + (random () & SMALL_CHAR); + } + rej[len] = '\0'; +- for (c = 1; c <= 255; ++c) +- if (strchr (rej, c) == NULL) ++ for (c = 1; c <= BIG_CHAR; ++c) ++ if (STRCHR (rej, c) == NULL) + break; + + for (i = 0; i < pos; ++i) + { +- s[i] = random () & 255; +- if (strchr (rej, s[i])) ++ s[i] = random () & BIG_CHAR; ++ if (STRCHR (rej, s[i])) + { +- s[i] = random () & 255; +- if (strchr (rej, s[i])) ++ s[i] = random () & BIG_CHAR; ++ if (STRCHR (rej, s[i])) + s[i] = c; + } + } +@@ -114,7 +146,7 @@ do_test (size_t align, size_t pos, size_t len) + if (s[pos]) + { + for (i = pos + 1; i < pos + 10; ++i) +- s[i] = random () & 255; ++ s[i] = random () & BIG_CHAR; + s[i] = '\0'; + } + result = STRPBRK_RESULT (s, pos); +@@ -129,8 +161,8 @@ do_random_tests (void) + size_t i, j, n, align, pos, len, rlen; + RES_TYPE result; + int c; +- unsigned char *p = buf1 + page_size - 512; +- unsigned char *rej; ++ UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; ++ UCHAR *rej; + + for (n = 0; n < ITERATIONS; n++) + { +@@ -147,18 +179,18 @@ do_random_tests (void) + rlen = random () & 63; + else + rlen = random () & 15; +- rej = buf2 + page_size - rlen - 1 - (random () & 7); ++ rej = (UCHAR *) (buf2 + page_size) - rlen - 1 - (random () & 7); + for (i = 0; i < rlen; ++i) + { +- rej[i] = random () & 255; ++ rej[i] = random () & BIG_CHAR; + if (!rej[i]) +- rej[i] = random () & 255; ++ rej[i] = random () & BIG_CHAR; + if (!rej[i]) +- rej[i] = 1 + (random () & 127); ++ rej[i] = 1 + (random () & SMALL_CHAR); + } + rej[i] = '\0'; +- for (c = 1; c <= 255; ++c) +- if (strchr ((char *) rej, c) == NULL) ++ for (c = 1; c <= BIG_CHAR; ++c) ++ if (STRCHR ((CHAR *) rej, c) == NULL) + break; + j = (pos > len ? pos : len) + align + 64; + if (j > 512) +@@ -171,27 +203,27 @@ do_random_tests (void) + else if (i == pos + align) + p[i] = rej[random () % (rlen + 1)]; + else if (i < align || i > pos + align) +- p[i] = random () & 255; ++ p[i] = random () & BIG_CHAR; + else + { +- p[i] = random () & 255; +- if (strchr ((char *) rej, p[i])) ++ p[i] = random () & BIG_CHAR; ++ if (STRCHR ((CHAR *) rej, p[i])) + { +- p[i] = random () & 255; +- if (strchr ((char *) rej, p[i])) ++ p[i] = random () & BIG_CHAR; ++ if (STRCHR ((CHAR *) rej, p[i])) + p[i] = c; + } + } + } + +- result = STRPBRK_RESULT ((char *) (p + align), pos < len ? pos : len); ++ result = STRPBRK_RESULT ((CHAR *) (p + align), pos < len ? pos : len); + + FOR_EACH_IMPL (impl, 1) +- if (CALL (impl, (char *) (p + align), (char *) rej) != result) ++ if (CALL (impl, (CHAR *) (p + align), (CHAR *) rej) != result) + { + error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %p, %zd, %zd, %zd) %p != %p", + n, impl->name, align, rej, rlen, pos, len, +- (void *) CALL (impl, (char *) (p + align), (char *) rej), ++ (void *) CALL (impl, (CHAR *) (p + align), (CHAR *) rej), + (void *) result); + ret = 1; + } +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 9403169..5765a8c 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -12,7 +12,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strchr strchr-vx strchr-c \ + strchrnul strchrnul-vx strchrnul-c \ + strrchr strrchr-vx strrchr-c \ +- strspn strspn-vx strspn-c ++ strspn strspn-vx strspn-c \ ++ strpbrk strpbrk-vx strpbrk-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -29,5 +30,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcschr wcschr-vx wcschr-c \ + wcschrnul wcschrnul-vx wcschrnul-c \ + wcsrchr wcsrchr-vx wcsrchr-c \ +- wcsspn wcsspn-vx wcsspn-c ++ wcsspn wcsspn-vx wcsspn-c \ ++ wcspbrk wcspbrk-vx wcspbrk-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index cbedf64..b39a5c5 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -121,6 +121,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strspn); + IFUNC_VX_IMPL (wcsspn); + ++ IFUNC_VX_IMPL (strpbrk); ++ IFUNC_VX_IMPL (wcspbrk); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strpbrk-c.c b/sysdeps/s390/multiarch/strpbrk-c.c +new file mode 100644 +index 0000000..1c8bf49 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strpbrk-c.c +@@ -0,0 +1,28 @@ ++/* Default strpbrk implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRPBRK __strpbrk_c ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strpbrk_c, __GI_strpbrk, __strpbrk_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strpbrk-vx.S b/sysdeps/s390/multiarch/strpbrk-vx.S +new file mode 100644 +index 0000000..c6ad3ef +--- /dev/null ++++ b/sysdeps/s390/multiarch/strpbrk-vx.S +@@ -0,0 +1,302 @@ ++/* Vector optimized 32/64 bit S/390 version of strpbrk. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* char *strpbrk (const char *s, const char * accept) ++ The strpbrk() function locates the first occurrence in the string s ++ of any of the characters in the string accept and returns a pointer ++ to that character or NULL if not found. ++ ++ This method checks the length of accept string. If it fits entirely ++ in one vector register, a fast algorithm is used, which does not need ++ to check multiple parts of accept-string. Otherwise a slower full ++ check of accept-string is used. ++ ++ register overview: ++ r3: pointer to start of accept-string ++ r2: pointer to start of search-string ++ r0: loaded byte count of vlbb search-string (32bit unsigned) ++ r4: found byte index (32bit unsigned) ++ r1: current return len (64bit unsigned) ++ v16: search-string ++ v17: accept-string ++ v18: temp-vreg ++ ++ ONLY FOR SLOW: ++ v19: first accept-string ++ v20: zero for preparing acc-vector ++ v21: global mask; 1 indicates a match between ++ search-string-vreg and any accept-character ++ v22: current mask; 1 indicates a match between ++ search-string-vreg and any accept-character in current acc-vreg ++ v24: one for result-checking of former string-part ++ v30, v31: for re-/storing registers r6, r8, r9 ++ r5: current len of accept-string ++ r6: zero-index in search-string or 16 if no zero ++ or min(zero-index, loaded byte count) ++ r8: >0, if former accept-string-part contains a zero, ++ otherwise =0; ++ r9: loaded byte count of vlbb accept-string ++*/ ++ENTRY(__strpbrk_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ /* ++ Check if accept-string fits in one vreg: ++ ---------------------------------------- ++ */ ++ vlbb %v17,0(%r3),6 /* Load accept. */ ++ lghi %r1,0 /* Zero out current len. */ ++ vlgvb %r0,%v17,0 /* Get first element. */ ++ clije %r0,0,.Lfast_end_null /* Return null if accept is empty. */ ++ lcbb %r0,0(%r3),6 ++ jo .Lcheck_onbb /* Special case if accept lays ++ on block-boundary. */ ++.Lcheck_notonbb: ++ vistrbs %v17,%v17 /* Fill with zeros after first zero. */ ++ je .Lfast /* Zero found -> accept fits in one vreg. */ ++ j .Lslow /* No zero -> accept exceeds one vreg */ ++ ++ ++.Lcheck_onbb: ++ /* Accept lays on block-boundary. */ ++ vfenezb %v18,%v17,%v17 /* Search zero in loaded accept bytes. */ ++ vlgvb %r4,%v18,7 /* Get index of zero or 16 if not found. */ ++ clrjl %r4,%r0,.Lcheck_notonbb /* Zero index < loaded bytes count -> ++ Accept fits in one vreg; ++ Fill with zeros and proceed ++ with FAST. */ ++ vl %v17,0(%r3) /* Load accept, which exceeds loaded bytes. */ ++ j .Lcheck_notonbb /* Check if accept fits in one vreg. */ ++ ++ ++ /* ++ Search s for accept in one vreg ++ ------------------------------- ++ */ ++.Lfast: ++ /* Complete accept-string in v17 and remaining bytes are zero. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfaezbs %v18,%v16,%v17,0 /* Find first element in v16 unequal to any ++ in v17 or first zero element. */ ++ ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++ /* If found index is within loaded bytes, return with found ++ element index (=equal count). */ ++ clrjl %r4,%r0,.Lfast_loop_found2 ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r1,16 /* current_len = 16. */ ++ slr %r1,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Process s in 16byte aligned loop. */ ++.Lfast_loop: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ vfaezbs %v18,%v16,%v17,0 /* Find first element in v16 equal to any ++ in v17 or first zero element. */ ++ jno .Lfast_loop_found ++ ++ vl %v16,16(%r1,%r2) ++ vfaezbs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found16 ++ ++ vl %v16,32(%r1,%r2) ++ vfaezbs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found32 ++ ++ vl %v16,48(%r1,%r2) ++ vfaezbs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found48 ++ ++ aghi %r1,64 ++ j .Lfast_loop /* Loop if no element was unequal to accept ++ and not zero. */ ++ ++ /* Found equal or zero element. */ ++.Lfast_loop_found48: ++ aghi %r1,16 ++.Lfast_loop_found32: ++ aghi %r1,16 ++.Lfast_loop_found16: ++ aghi %r1,16 ++.Lfast_loop_found: ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++.Lfast_loop_found2: ++ vlgvb %r0,%v16,0(%r4) /* Get found element. */ ++ clije %r0,0,.Lfast_end_null /* Return null if no accept-char found */ ++ algfr %r1,%r4 /* Add found index of char to current len. */ ++ la %r2,0(%r1,%r2) /* And return pointer to first equal char. */ ++ br %r14 ++ ++.Lfast_end_null: ++ lghi %r2,0 /* Return null if no character is equal. */ ++ br %r14 ++ ++ ++ ++ ++ /* ++ Search s for accept in multiple vregs ++ ------------------------------------- ++ */ ++.Lslow: ++ /* Save registers. */ ++ vlvgg %v30,%r6,0 ++ vlvgp %v31,%r8,%r9 ++ ++ /* accept in v17 without zero. */ ++ vlr %v19,%v17 /* Save first acc-part for a fast reload. */ ++ vzero %v20 /* Zero for preparing acc-vector. */ ++ vone %v24 /* One for checking result of former string. */ ++ ++ /* Align s to 16 byte. */ ++ risbg %r4,%r2,60,128+63,0 /* Test if s is aligned and ++ %r4 = bits 60-63 'and' 15. */ ++ je .Lslow_loop_str /* If s is aligned, loop aligned. */ ++ lghi %r0,15 ++ slr %r0,%r4 /* Compute highest index to load (15-x). */ ++ vll %v16,%r0,0(%r2) /* Load up to 16 byte boundary (vll needs ++ highest index, remaining bytes are 0). */ ++ ahi %r0,1 /* Work with loaded byte count. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept-string to zero. */ ++ vfenezb %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end_null /* If first element is zero ++ (end of string) -> return null */ ++ clr %r0,%r6 /* cc==1 if loaded byte count < zero-index. */ ++ locrl %r6,%r0 /* Load on cc==1; zero-index = lbc. */ ++ j .Lslow_loop_acc ++ ++ ++ /* Process s in 16byte aligned loop. */ ++.Lslow_next_str: ++ /* Check results of former processed str-part. */ ++ vfeeb %v18,%v21,%v24 /* Find first equal match in global mask ++ (ones in element). */ ++ vlgvb %r4,%v18,7 /* Get index of first one (=equal) ++ or 16 if no match. */ ++ /* Equal-index < min(zero-index, loaded byte count) ++ -> return pointer to equal element. */ ++ clrjl %r4,%r6,.Lslow_index_found ++ /* Zero-index < loaded byte count ++ -> former str-part was last str-part ++ -> return null */ ++ clrjl %r6,%r0,.Lslow_end_null ++ /* All elements are zero (=no match) -> proceed with next str-part. */ ++ ++ vlr %v17,%v19 /* Load first part of accept (no zero). */ ++ algfr %r1,%r0 /* Add loaded byte count to current len. */ ++ ++.Lslow_loop_str: ++ vl %v16,0(%r1,%r2) /* Load search-string */ ++ lghi %r0,16 /* Loaded byte count is 16. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept to zero. */ ++ vfenezb %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end_null /* If first element is zero ++ (end of string) -> return null. */ ++ ++.Lslow_loop_acc: ++ vfaeb %v22,%v16,%v17,4 /* Create matching-mask (1 in mask -> ++ Character matches any accepted character in ++ this accept-string-part) IN=0, RT=1. */ ++ vlgvb %r4,%v22,0 /* Get result of first element. */ ++ /* First element is equal to any accepted characters ++ (all other parts of accept cannot lead to a match before this one) ++ -> current len is pointing to first element ++ -> return found */ ++ clijh %r4,0,.Lslow_end_found ++ vo %v21,%v21,%v22 /* Global-mask = global-|matching-mask. */ ++ /* Proceed with next acc until end of acc is reached. */ ++ ++ ++.Lslow_next_acc: ++ clijh %r8,0,.Lslow_next_str /* There was a zero in the last acc-part ++ -> add index to current_len and ++ end. */ ++ vlbb %v17,16(%r5,%r3),6 /* Load next accept part. */ ++ aghi %r5,16 /* Increment current len of accept-string. */ ++ lcbb %r9,0(%r5,%r3),6 /* Get loaded byte count of accept-string. */ ++ jo .Lslow_next_acc_onbb /* Jump away ifaccept-string is ++ on block-boundary. */ ++.Lslow_next_acc_notonbb: ++ vistrbs %v17,%v17 /* Fill with zeros after first zero. */ ++ jo .Lslow_loop_acc /* No zero found -> no preparation needed. */ ++ ++.Lslow_next_acc_prepare_zero: ++ /* Zero in accept-part: fill zeros with first-accept-character. */ ++ vlgvb %r8,%v17,0 /* Load first element of acc-part. */ ++ clije %r8,0,.Lslow_next_str /* Proceed with next string-part, ++ if first char in this part of accept ++ is a zero. */ ++ /* r8>0 -> zero found in this acc-part. */ ++ vrepb %v18,%v17,0 /* Replicate first char accross all chars. */ ++ vceqb %v22,%v20,%v17 /* Create a mask (v22) of null chars ++ by comparing with 0 (v20). */ ++ vsel %v17,%v18,%v17,%v22 /* Replace null chars with first char. */ ++ j .Lslow_loop_acc /* Accept part is prepared -> process. */ ++ ++.Lslow_next_acc_onbb: ++ vfenezb %v18,%v17,%v17 /* Find zero in loaded bytes of accept part. */ ++ vlgvb %r8,%v18,7 /* Load byte index of zero. */ ++ clrjl %r8,%r9,.Lslow_next_acc_notonbb /* Found a zero in loaded bytes ++ -> Prepare vreg. */ ++ vl %v17,0(%r5,%r3) /* Load over boundary ... */ ++ lghi %r8,0 /* r8=0 -> no zero in this part of acc, ++ check for zero is in jump-target. */ ++ j .Lslow_next_acc_notonbb /* ... and search for zero in ++ fully loaded vreg again. */ ++ ++.Lslow_end_null: ++ lghi %r1,0 /* Return null if no character is equal. */ ++ j .Lslow_end ++ ++.Lslow_loop_found: ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++ vlgvb %r0,%v16,0(%r4) /* Get found element. */ ++ clije %r0,0,.Lslow_end_null /* Return null if no acc-char found. */ ++ ++.Lslow_index_found: ++ algfr %r1,%r4 /* Add found index of char to current len. */ ++.Lslow_end_found: ++ la %r1,0(%r1,%r2) /* And return pointer to first equal char. */ ++ ++.Lslow_end: ++ /* Restore registers. */ ++ vlgvg %r6,%v30,0 ++ vlgvg %r8,%v31,0 ++ vlgvg %r9,%v31,1 ++ lgr %r2,%r1 ++ br %r14 ++END(__strpbrk_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strpbrk.c b/sysdeps/s390/multiarch/strpbrk.c +new file mode 100644 +index 0000000..afcb633 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strpbrk.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of strpbrk. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strpbrk, strpbrk) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcspbrk-c.c b/sysdeps/s390/multiarch/wcspbrk-c.c +new file mode 100644 +index 0000000..3a27e60 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcspbrk-c.c +@@ -0,0 +1,31 @@ ++/* Default wcspbrk implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSPBRK __wcspbrk_c ++ ++# include ++extern __typeof (wcspbrk) __wcspbrk_c; ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__wcspbrk_c, __GI_wcspbrk, __wcspbrk_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcspbrk-vx.S b/sysdeps/s390/multiarch/wcspbrk-vx.S +new file mode 100644 +index 0000000..e6eaf95 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcspbrk-vx.S +@@ -0,0 +1,315 @@ ++/* Vector optimized 32/64 bit S/390 version of wcspbrk. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t *wcspbrk (const wchar_t *s, const wchar_t * accept) ++ The wcspbrk() function locates the first occurrence in the string s ++ of any of the characters in the string accept and returns a pointer ++ to that character or NULL if not found. ++ ++ This method checks the length of accept string. If it fits entirely ++ in one vector register, a fast algorithm is used, which does not need ++ to check multiple parts of accept-string. Otherwise a slower full ++ check of accept-string is used. ++ ++ register overview: ++ r3: pointer to start of accept-string ++ r2: pointer to start of search-string ++ r0: loaded byte count of vlbb search-string (32bit unsigned) ++ r4: found byte index (32bit unsigned) ++ r1: current return len (64bit unsigned) ++ v16: search-string ++ v17: accept-string ++ v18: temp-vreg ++ ++ ONLY FOR SLOW: ++ v19: first accept-string ++ v20: zero for preparing acc-vector ++ v21: global mask; 1 indicates a match between ++ search-string-vreg and any accept-character ++ v22: current mask; 1 indicates a match between ++ search-string-vreg and any accept-character in current acc-vreg ++ v24: one for result-checking of former string-part ++ v30, v31: for re-/storing registers r6, r8, r9 ++ r5: current len of accept-string ++ r6: zero-index in search-string or 16 if no zero ++ or min(zero-index, loaded byte count) ++ r8: >0, if former accept-string-part contains a zero, ++ otherwise =0; ++ r9: loaded byte count of vlbb accept-string ++*/ ++ENTRY(__wcspbrk_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ /* ++ Check if accept-string fits in one vreg: ++ ---------------------------------------- ++ */ ++ vlbb %v17,0(%r3),6 /* Load accept. */ ++ lcbb %r0,0(%r3),6 ++ jo .Lcheck_onbb /* Special case if accept lays ++ on block-boundary. */ ++ ++.Lcheck_notonbb: ++ lghi %r1,0 /* Zero out current len. */ ++ vlgvf %r0,%v17,0 /* Get first element. */ ++ clije %r0,0,.Lfast_end_null /* Return null if accept is empty. */ ++ ++ vistrfs %v17,%v17 /* Fill with zeros after first zero. */ ++ je .Lfast /* Zero found -> accept fits in one vreg. */ ++ j .Lslow /* No zero -> accept exceeds one vreg */ ++ ++ ++.Lcheck_onbb: ++ /* Accept lays on block-boundary. */ ++ nill %r0,65532 /* Recognize only fully loaded characters. */ ++ je .Lcheck_onbb2 /* Reload vr, if we loaded no full wchar_t. */ ++ vfenezf %v18,%v17,%v17 /* Search zero in loaded accept bytes. */ ++ vlgvb %r4,%v18,7 /* Get index of zero or 16 if not found. */ ++ clrjl %r4,%r0,.Lcheck_notonbb /* Zero index < loaded bytes count -> ++ accept fits in one vreg; ++ Fill with zeros and proceed ++ with FAST. */ ++.Lcheck_onbb2: ++ vl %v17,0(%r3) /* Load accept, which exceeds loaded bytes. */ ++ j .Lcheck_notonbb /* Check if accept fits in one vreg. */ ++ ++ ++ /* ++ Search s for accept in one vreg ++ ------------------------------- ++ */ ++.Lfast: ++ /* Complete accept-string in v17 and remaining bytes are zero. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfaezfs %v18,%v16,%v17,0 /* Find first element in v16 unequal to any ++ in v17 or first zero element. */ ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++ /* If found index is within loaded bytes, return with found ++ element index (=equal count). */ ++ clrjl %r4,%r0,.Lfast_loop_found2 ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r1,16 /* current_len = 16. */ ++ slr %r1,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++.Lfast_loop: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ vfaezfs %v18,%v16,%v17,0 /* Find first element in v16 equal to any ++ in v17 or first zero element. */ ++ jno .Lfast_loop_found ++ ++ vl %v16,16(%r1,%r2) ++ vfaezfs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found16 ++ ++ vl %v16,32(%r1,%r2) ++ vfaezfs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found32 ++ ++ vl %v16,48(%r1,%r2) ++ vfaezfs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found48 ++ ++ aghi %r1,64 ++ j .Lfast_loop /* Loop if no element was unequal to accept ++ and not zero. */ ++ ++ /* Found equal or zero element. */ ++.Lfast_loop_found48: ++ aghi %r1,16 ++.Lfast_loop_found32: ++ aghi %r1,16 ++.Lfast_loop_found16: ++ aghi %r1,16 ++.Lfast_loop_found: ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++.Lfast_loop_found2: ++ srlg %r5,%r4,2 /* Convert byte-index to character-index. */ ++ vlgvf %r0,%v16,0(%r5) /* Get found element. */ ++ clije %r0,0,.Lfast_end_null /* Return null if no accept-char found */ ++ algfr %r1,%r4 /* Add found index of char to current len. */ ++ la %r2,0(%r1,%r2) /* And return pointer to first equal char. */ ++ br %r14 ++ ++.Lfast_end_null: ++ lghi %r2,0 /* Return null if no character is equal. */ ++ br %r14 ++ ++ ++ ++ ++ /* ++ Search s for accept in multiple vregs ++ ------------------------------------- ++ */ ++.Lslow: ++ /* Save registers. */ ++ vlvgg %v30,%r6,0 ++ vlvgp %v31,%r8,%r9 ++ ++ /* Accept in v17 without zero */ ++ vlr %v19,%v17 /* Save first acc-part for a fast reload. */ ++ vzero %v20 /* Zero for preparing acc-vector. */ ++ vone %v24 /* One for checking result of former string. */ ++ ++ /* Align s to 16 byte. */ ++ risbg %r4,%r2,60,128+63,0 /* Test if s is aligned and ++ %r4 = bits 60-63 'and' 15. */ ++ je .Lslow_loop_str /* If s is aligned, loop aligned. */ ++ lghi %r0,15 ++ slr %r0,%r4 /* Compute highest index to load (15-x). */ ++ vll %v16,%r0,0(%r2) /* Load up to 16byte boundary; ++ needs highest index, left bytes are 0. */ ++ ahi %r0,1 /* Work with loaded byte count. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept-string to zero. */ ++ vfenezf %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end_null /* If first element is zero ++ (end of string) -> return null */ ++ clr %r0,%r6 /* cc==1 if loaded byte count < zero-index. */ ++ locrl %r6,%r0 /* Load on cc==1; zero-index = lbc. */ ++ j .Lslow_loop_acc ++ ++ ++ /* Process s in 16byte aligned loop. */ ++.Lslow_next_str: ++ /* Check results of former processed str-part. */ ++ vfeef %v18,%v21,%v24 /* Find first equal match in global mask ++ (ones in element). */ ++ vlgvb %r4,%v18,7 /* Get index of first one (=equal) ++ or 16 if no match. */ ++ /* Equal-index < min(zero-index, loaded byte count) ++ -> return pointer to equal element. */ ++ clrjl %r4,%r6,.Lslow_index_found ++ /* Zero-index < loaded byte count ++ -> former str-part was last str-part ++ -> return null */ ++ clrjl %r6,%r0,.Lslow_end_null ++ /* All elements are zero (=no match) -> proceed with next str-part. */ ++ ++ vlr %v17,%v19 /* Load first part of accept (no zero). */ ++ algfr %r1,%r0 /* Add loaded byte count to current len. */ ++ ++.Lslow_loop_str: ++ vl %v16,0(%r1,%r2) /* Load search-string */ ++ lghi %r0,16 /* Loaded byte count is 16. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of accept to zero. */ ++ vfenezf %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first accept-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end_null /* If first element is zero ++ (end of string) -> return null. */ ++ ++.Lslow_loop_acc: ++ vfaef %v22,%v16,%v17,4 /* Create matching-mask (1 in mask -> ++ Character matches any accepted character in ++ this accept-string-part) IN=0, RT=1. */ ++ vlgvf %r4,%v22,0 /* Get result of first element. */ ++ /* First element is equal to any accepted characters ++ (all other parts of accept cannot lead to a match before this one) ++ -> current len is pointing to first element ++ -> return found */ ++ clijh %r4,0,.Lslow_end_found ++ vo %v21,%v21,%v22 /* Global-mask = global-|matching-mask. */ ++ /* Proceed with next acc until end of acc is reached. */ ++ ++ ++.Lslow_next_acc: ++ clijh %r8,0,.Lslow_next_str /* There was a zero in the last acc-part ++ -> add index to current len and ++ end. */ ++ vlbb %v17,16(%r5,%r3),6 /* Load next accept part. */ ++ aghi %r5,16 /* Increment current len of accept-string. */ ++ lcbb %r9,0(%r5,%r3),6 /* Get loaded byte count of accept-string. */ ++ jo .Lslow_next_acc_onbb /* Jump away ifaccept-string is ++ on block-boundary. */ ++.Lslow_next_acc_notonbb: ++ vistrfs %v17,%v17 /* Fill with zeros after first zero. */ ++ jo .Lslow_loop_acc /* No zero found -> no preparation needed. */ ++ ++.Lslow_next_acc_prepare_zero: ++ /* Zero in accept-part: fill zeros with first-accept-character. */ ++ vlgvf %r8,%v17,0 /* Load first element of acc-part. */ ++ clije %r8,0,.Lslow_next_str /* Proceed with next string-part, ++ If first char in this part of accept ++ is a zero. */ ++ /* r8>0 -> zero found in this acc-part. */ ++ vrepf %v18,%v17,0 /* Replicate first char accross all chars. */ ++ vceqf %v22,%v20,%v17 /* Create a mask (v22) of null chars ++ by comparing with 0 (v20). */ ++ vsel %v17,%v18,%v17,%v22 /* Replace null chars with first char. */ ++ j .Lslow_loop_acc /* Accept part is prepared -> process. */ ++ ++.Lslow_next_acc_onbb: ++ nill %r9,65532 /* Recognize only fully loaded characters. */ ++ je .Lslow_next_acc_onbb2 /* Reload vr, if no full wchar_t. */ ++ vfenezf %v18,%v17,%v17 /* Find zero in loaded bytes of accept part. */ ++ vlgvb %r8,%v18,7 /* Load byte index of zero. */ ++ clrjl %r8,%r9,.Lslow_next_acc_notonbb /* Found a zero in loaded bytes ++ -> Prepare vreg. */ ++.Lslow_next_acc_onbb2: ++ vl %v17,0(%r5,%r3) /* Load over boundary ... */ ++ lghi %r8,0 /* r8=0 -> no zero in this part of acc, ++ check for zero is in jump-target. */ ++ j .Lslow_next_acc_notonbb /* ... and search for zero in ++ fully loaded vreg again. */ ++ ++.Lslow_end_null: ++ lghi %r1,0 /* Return null if no character is equal. */ ++ j .Lslow_end ++ ++.Lslow_loop_found: ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++ srlg %r5,%r4,2 /* Convert byte-index to character-index. */ ++ vlgvf %r0,%v16,0(%r5) /* Get found element. */ ++ clije %r0,0,.Lslow_end_null /* Return null if no acc-char found. */ ++ ++.Lslow_index_found: ++ algfr %r1,%r4 /* Add found index of char to current len. */ ++.Lslow_end_found: ++ la %r1,0(%r1,%r2) /* And return pointer to first equal char. */ ++ ++.Lslow_end: ++ /* Restore registers. */ ++ vlgvg %r6,%v30,0 ++ vlgvg %r8,%v31,0 ++ vlgvg %r9,%v31,1 ++ lgr %r2,%r1 ++ br %r14 ++.Lfallback: ++ jg __wcspbrk_c ++END(__wcspbrk_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcspbrk.c b/sysdeps/s390/multiarch/wcspbrk.c +new file mode 100644 +index 0000000..1a0ef9c +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcspbrk.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcspbrk. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcspbrk, wcspbrk) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 843a23c..7ecff8b 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn ++ wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn wcspbrk + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcspbrk-ifunc.c b/wcsmbs/test-wcspbrk-ifunc.c +new file mode 100644 +index 0000000..af389b6 +--- /dev/null ++++ b/wcsmbs/test-wcspbrk-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcspbrk function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcspbrk.c" +diff --git a/wcsmbs/test-wcspbrk.c b/wcsmbs/test-wcspbrk.c +new file mode 100644 +index 0000000..98e44e5 +--- /dev/null ++++ b/wcsmbs/test-wcspbrk.c +@@ -0,0 +1,20 @@ ++/* Test wcspbrk functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strpbrk.c" +diff --git a/wcsmbs/wcspbrk.c b/wcsmbs/wcspbrk.c +index a39f148..b769a38 100644 +--- a/wcsmbs/wcspbrk.c ++++ b/wcsmbs/wcspbrk.c +@@ -18,6 +18,9 @@ + + #include + ++#ifdef WCSPBRK ++# define wcspbrk WCSPBRK ++#endif + + /* Find the first occurrence in WCS of any wide-character in ACCEPT. */ + wchar_t * +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-25.patch b/SOURCES/glibc-rh1268008-25.patch new file mode 100644 index 0000000..19d4977 --- /dev/null +++ b/SOURCES/glibc-rh1268008-25.patch @@ -0,0 +1,1107 @@ +From 6be435ec4f615266351487da396333f3ff026c03 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 13:02:41 +0200 +Subject: [PATCH 25/30] S390: Optimize strcspn and wcscspn. + +upstream-commit-id: b4c21601b147efc3c2b0e679e4ffc554b3987f0b +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00099.html + +This patch provides optimized versions of strcspn and wcscspn with the z13 +vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/strcspn-c.c: New File. + * sysdeps/s390/multiarch/strcspn-vx.S: Likewise. + * sysdeps/s390/multiarch/strcspn.c: Likewise. + * sysdeps/s390/multiarch/wcscspn-c.c: Likewise. + * sysdeps/s390/multiarch/wcscspn-vx.S: Likewise. + * sysdeps/s390/multiarch/wcscspn.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strcspn and + wcscspn functions. + * sysdeps/s390/multiarch/ifunc-impl-list.c + (__libc_ifunc_impl_list): Add ifunc test for strcspn, wcscspn. + * wcsmbs/wcscspn.c: Use WCSCSPN if defined. + * string/test-strcspn.c: Add wcscspn support. + * wcsmbs/test-wcscspn.c: New File. + * wcsmbs/Makefile (strop-tests): Add wcscspn. + * benchtests/bench-strcspn.c: Add wcscspn support. + * benchtests/bench-wcscspn.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wcscspn. +--- + benchtests/Makefile | 2 +- + benchtests/bench-strcspn.c | 45 +++-- + benchtests/bench-wcscspn.c | 20 +++ + string/strcspn.c | 8 +- + string/test-strcspn.c | 45 +++-- + sysdeps/s390/multiarch/Makefile | 6 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 3 + + sysdeps/s390/multiarch/strcspn-c.c | 28 +++ + sysdeps/s390/multiarch/strcspn-vx.S | 281 +++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/strcspn.c | 27 +++ + sysdeps/s390/multiarch/wcscspn-c.c | 26 +++ + sysdeps/s390/multiarch/wcscspn-vx.S | 293 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wcscspn.c | 27 +++ + wcsmbs/Makefile | 3 +- + wcsmbs/test-wcscspn-ifunc.c | 20 +++ + wcsmbs/test-wcscspn.c | 20 +++ + wcsmbs/wcscspn.c | 3 + + 17 files changed, 826 insertions(+), 31 deletions(-) + create mode 100644 benchtests/bench-wcscspn.c + create mode 100644 sysdeps/s390/multiarch/strcspn-c.c + create mode 100644 sysdeps/s390/multiarch/strcspn-vx.S + create mode 100644 sysdeps/s390/multiarch/strcspn.c + create mode 100644 sysdeps/s390/multiarch/wcscspn-c.c + create mode 100644 sysdeps/s390/multiarch/wcscspn-vx.S + create mode 100644 sysdeps/s390/multiarch/wcscspn.c + create mode 100644 wcsmbs/test-wcscspn-ifunc.c + create mode 100644 wcsmbs/test-wcscspn.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 015b5d6..4e811a9 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk ++ wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-strcspn.c b/benchtests/bench-strcspn.c +index 22b3b84..25de640 100644 +--- a/benchtests/bench-strcspn.c ++++ b/benchtests/bench-strcspn.c +@@ -19,22 +19,41 @@ + #define STRPBRK_RESULT(s, pos) (pos) + #define RES_TYPE size_t + #define TEST_MAIN +-#define TEST_NAME "strcspn" ++#ifndef WIDE ++# define TEST_NAME "strcspn" ++#else ++# define TEST_NAME "wcscspn" ++#endif /* WIDE */ + #include "bench-string.h" + +-typedef size_t (*proto_t) (const char *, const char *); +-size_t simple_strcspn (const char *, const char *); +-size_t stupid_strcspn (const char *, const char *); ++#ifndef WIDE ++# define STRCSPN strcspn ++# define CHAR char ++# define SIMPLE_STRCSPN simple_strcspn ++# define STUPID_STRCSPN stupid_strcspn ++# define STRLEN strlen ++#else ++# include ++# define STRCSPN wcscspn ++# define CHAR wchar_t ++# define SIMPLE_STRCSPN simple_wcscspn ++# define STUPID_STRCSPN stupid_wcscspn ++# define STRLEN wcslen ++#endif /* WIDE */ + +-IMPL (stupid_strcspn, 0) +-IMPL (simple_strcspn, 0) +-IMPL (strcspn, 1) ++typedef size_t (*proto_t) (const CHAR *, const CHAR *); ++size_t SIMPLE_STRCSPN (const CHAR *, const CHAR *); ++size_t STUPID_STRCSPN (const CHAR *, const CHAR *); ++ ++IMPL (STUPID_STRCSPN, 0) ++IMPL (SIMPLE_STRCSPN, 0) ++IMPL (STRCSPN, 1) + + size_t +-simple_strcspn (const char *s, const char *rej) ++SIMPLE_STRCSPN (const CHAR *s, const CHAR *rej) + { +- const char *r, *str = s; +- char c; ++ const CHAR *r, *str = s; ++ CHAR c; + + while ((c = *s++) != '\0') + for (r = rej; *r != '\0'; ++r) +@@ -44,9 +63,9 @@ simple_strcspn (const char *s, const char *rej) + } + + size_t +-stupid_strcspn (const char *s, const char *rej) ++STUPID_STRCSPN (const CHAR *s, const CHAR *rej) + { +- size_t ns = strlen (s), nrej = strlen (rej); ++ size_t ns = STRLEN (s), nrej = STRLEN (rej); + size_t i, j; + + for (i = 0; i < ns; ++i) +@@ -56,4 +75,6 @@ stupid_strcspn (const char *s, const char *rej) + return i; + } + ++#undef CHAR ++#undef STRLEN + #include "bench-strpbrk.c" +diff --git a/benchtests/bench-wcscspn.c b/benchtests/bench-wcscspn.c +new file mode 100644 +index 0000000..3991951 +--- /dev/null ++++ b/benchtests/bench-wcscspn.c +@@ -0,0 +1,20 @@ ++/* Measure wcscspn functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-strcspn.c" +diff --git a/string/strcspn.c b/string/strcspn.c +index 6290429..0c750a8 100644 +--- a/string/strcspn.c ++++ b/string/strcspn.c +@@ -30,12 +30,14 @@ + + #undef strcspn + ++#ifndef STRCSPN ++# define STRCSPN strcspn ++#endif ++ + /* Return the length of the maximum initial segment of S + which contains no characters from REJECT. */ + size_t +-strcspn (s, reject) +- const char *s; +- const char *reject; ++STRCSPN (const char *s, const char *reject) + { + size_t count = 0; + +diff --git a/string/test-strcspn.c b/string/test-strcspn.c +index e2863c7..3443425 100644 +--- a/string/test-strcspn.c ++++ b/string/test-strcspn.c +@@ -20,22 +20,41 @@ + #define STRPBRK_RESULT(s, pos) (pos) + #define RES_TYPE size_t + #define TEST_MAIN +-#define TEST_NAME "strcspn" ++#ifndef WIDE ++# define TEST_NAME "strcspn" ++#else ++# define TEST_NAME "wcscspn" ++#endif /* WIDE */ + #include "test-string.h" + +-typedef size_t (*proto_t) (const char *, const char *); +-size_t simple_strcspn (const char *, const char *); +-size_t stupid_strcspn (const char *, const char *); ++#ifndef WIDE ++# define STRCSPN strcspn ++# define CHAR char ++# define SIMPLE_STRCSPN simple_strcspn ++# define STUPID_STRCSPN stupid_strcspn ++# define STRLEN strlen ++#else ++# include ++# define STRCSPN wcscspn ++# define CHAR wchar_t ++# define SIMPLE_STRCSPN simple_wcscspn ++# define STUPID_STRCSPN stupid_wcscspn ++# define STRLEN wcslen ++#endif /* WIDE */ + +-IMPL (stupid_strcspn, 0) +-IMPL (simple_strcspn, 0) +-IMPL (strcspn, 1) ++typedef size_t (*proto_t) (const CHAR *, const CHAR *); ++size_t SIMPLE_STRCSPN (const CHAR *, const CHAR *); ++size_t STUPID_STRCSPN (const CHAR *, const CHAR *); ++ ++IMPL (STUPID_STRCSPN, 0) ++IMPL (SIMPLE_STRCSPN, 0) ++IMPL (STRCSPN, 1) + + size_t +-simple_strcspn (const char *s, const char *rej) ++SIMPLE_STRCSPN (const CHAR *s, const CHAR *rej) + { +- const char *r, *str = s; +- char c; ++ const CHAR *r, *str = s; ++ CHAR c; + + while ((c = *s++) != '\0') + for (r = rej; *r != '\0'; ++r) +@@ -45,9 +64,9 @@ simple_strcspn (const char *s, const char *rej) + } + + size_t +-stupid_strcspn (const char *s, const char *rej) ++STUPID_STRCSPN (const CHAR *s, const CHAR *rej) + { +- size_t ns = strlen (s), nrej = strlen (rej); ++ size_t ns = STRLEN (s), nrej = STRLEN (rej); + size_t i, j; + + for (i = 0; i < ns; ++i) +@@ -57,4 +76,6 @@ stupid_strcspn (const char *s, const char *rej) + return i; + } + ++#undef CHAR ++#undef STRLEN + #include "test-strpbrk.c" +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 5765a8c..2c1fce0 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -13,7 +13,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strchrnul strchrnul-vx strchrnul-c \ + strrchr strrchr-vx strrchr-c \ + strspn strspn-vx strspn-c \ +- strpbrk strpbrk-vx strpbrk-c ++ strpbrk strpbrk-vx strpbrk-c \ ++ strcspn strcspn-vx strcspn-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -31,5 +32,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcschrnul wcschrnul-vx wcschrnul-c \ + wcsrchr wcsrchr-vx wcsrchr-c \ + wcsspn wcsspn-vx wcsspn-c \ +- wcspbrk wcspbrk-vx wcspbrk-c ++ wcspbrk wcspbrk-vx wcspbrk-c \ ++ wcscspn wcscspn-vx wcscspn-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index b39a5c5..7f62e49 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -124,6 +124,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strpbrk); + IFUNC_VX_IMPL (wcspbrk); + ++ IFUNC_VX_IMPL (strcspn); ++ IFUNC_VX_IMPL (wcscspn); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/strcspn-c.c b/sysdeps/s390/multiarch/strcspn-c.c +new file mode 100644 +index 0000000..af04b4e +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcspn-c.c +@@ -0,0 +1,28 @@ ++/* Default strcspn implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define STRCSPN __strcspn_c ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strcspn_c, __GI_strcspn, __strcspn_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strcspn-vx.S b/sysdeps/s390/multiarch/strcspn-vx.S +new file mode 100644 +index 0000000..c7113c4 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcspn-vx.S +@@ -0,0 +1,281 @@ ++/* Vector optimized 32/64 bit S/390 version of strcspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t strcspn (const char *s, const char * reject) ++ The strcspn() function calculates the length of the initial segment ++ of s which consists entirely of characters not in reject. ++ ++ This method checks the length of reject string. If it fits entirely ++ in one vector register, a fast algorithm is used, which does not need ++ to check multiple parts of accept-string. Otherwise a slower full ++ check of accept-string is used. ++ ++ register overview: ++ r3: pointer to start of reject-string ++ r2: pointer to start of search-string ++ r0: loaded byte count of vlbb search-string ++ r4: found byte index ++ r1: current return len ++ v16: search-string ++ v17: reject-string ++ v18: temp-vreg ++ ++ ONLY FOR SLOW: ++ v19: first reject-string ++ v20: zero for preparing acc-vector ++ v21: global mask; 1 indicates a match between ++ search-string-vreg and any reject-character ++ v22: current mask; 1 indicates a match between ++ search-string-vreg and any reject-character in current acc-vreg ++ v24: one for result-checking of former string-part ++ v30, v31: for re-/storing registers r6, r8, r9 ++ r5: current len of reject-string ++ r6: zero-index in search-string or 16 if no zero ++ or min(zero-index, loaded byte count) ++ r8: >0, if former reject-string-part contains a zero, ++ otherwise =0; ++ r9: loaded byte count of vlbb reject-string ++*/ ++ENTRY(__strcspn_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ /* ++ Check if reject-string fits in one vreg: ++ ---------------------------------------- ++ */ ++ vlbb %v17,0(%r3),6 /* Load reject. */ ++ lghi %r1,0 /* Zero out current len. */ ++ lcbb %r0,0(%r3),6 ++ jo .Lcheck_onbb /* Special case if reject ++ lays on block-boundary. */ ++.Lcheck_notonbb: ++ vistrbs %v17,%v17 /* Fill with zeros after first zero. */ ++ je .Lfast /* Zero found -> reject fits in one vreg. */ ++ j .Lslow /* No zero -> reject exceeds one vreg. */ ++ ++ ++.Lcheck_onbb: ++ /* Reject lays on block-boundary. */ ++ vfenezb %v18,%v17,%v17 /* Search zero in loaded reject bytes. */ ++ vlgvb %r4,%v18,7 /* Get index of zero or 16 if not found. */ ++ clrjl %r4,%r0,.Lcheck_notonbb /* Zero index < loaded bytes count -> ++ Reject fits in one vreg; ++ Fill with zeros and proceed ++ with FAST. */ ++ vl %v17,0(%r3) /* Load reject, which exceeds loaded bytes. */ ++ j .Lcheck_notonbb /* Check if reject fits in one vreg. */ ++ ++ ++ /* ++ Search s for reject in one vreg ++ ------------------------------- ++ */ ++.Lfast: ++ /* Complete reject-string in v17 and remaining bytes are zero. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfaezbs %v18,%v16,%v17,0 /* Find first element in v16 ++ unequal to any in v17 ++ or first zero element. */ ++ ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++ clrjl %r4,%r0,.Lfast_loop_found2 /* If found index is within loaded ++ bytes, return with found element ++ index (=equal count). */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r1,16 /* current_len = 16. */ ++ slr %r1,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Process s in 16byte aligned loop. */ ++.Lfast_loop: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ vfaezbs %v18,%v16,%v17,0 /* Find first element in v16 equal to any ++ in v17 or first zero element. */ ++ jno .Lfast_loop_found ++ ++ vl %v16,16(%r1,%r2) ++ vfaezbs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found16 ++ ++ vl %v16,32(%r1,%r2) ++ vfaezbs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found32 ++ ++ vl %v16,48(%r1,%r2) ++ vfaezbs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found48 ++ ++ aghi %r1,64 ++ j .Lfast_loop /* Loop if no element was unequal to reject ++ and not zero. */ ++ ++ /* Found equal or zero element. */ ++.Lfast_loop_found48: ++ aghi %r1,16 ++.Lfast_loop_found32: ++ aghi %r1,16 ++.Lfast_loop_found16: ++ aghi %r1,16 ++.Lfast_loop_found: ++ vlgvb %r4,%v18,7 /* Load byte index of found element or zero. */ ++.Lfast_loop_found2: ++ algrk %r2,%r1,%r4 /* Add found index to current len. */ ++ br %r14 ++ ++ ++ ++ /* ++ Search s for reject in multiple vregs ++ ------------------------------------- ++ */ ++.Lslow: ++ /* Save registers. */ ++ vlvgg %v30,%r6,0 ++ vlvgp %v31,%r8,%r9 ++ ++ /* Reject in v17 without zero. */ ++ vlr %v19,%v17 /* Save first acc-part for a fast reload. */ ++ vzero %v20 /* Zero for preparing acc-vector. */ ++ vone %v24 /* One for checking result of former ++ string-part. */ ++ ++ /* Align s to 16 byte. */ ++ risbg %r4,%r2,60,128+63,0 /* Test if s is aligned and ++ %r4 = bits 60-63 'and' 15. */ ++ je .Lslow_loop_str /* If s is aligned, loop aligned. */ ++ lghi %r0,15 ++ slr %r0,%r4 /* Compute highest index to load (15-x). */ ++ vll %v16,%r0,0(%r2) /* Load up to 16 byte boundary (vll needs ++ highest index, remaining bytes are 0). */ ++ ahi %r0,1 /* Work with loaded byte count. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of reject-string to zero. */ ++ vfenezb %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first reject-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end /* If first element is zero -> return 0. */ ++ clr %r0,%r6 /* cc==1 if loaded byte count < zero-index. */ ++ locrl %r6,%r0 /* Load on cc==1; zero-index = lbc. */ ++ j .Lslow_loop_acc ++ ++ ++ /* Process s in 16byte aligned loop. */ ++.Lslow_next_str: ++ /* Check results of former processed str-part. */ ++ vfeeb %v18,%v21,%v24 /* Find first equal match in global mask ++ (ones in element). */ ++ vlgvb %r4,%v18,7 /* Get index of first one (=equal) or 16. */ ++ /* Equal-index < min(zero-index, loaded byte count) ++ -> Return pointer to equal element. */ ++ clrjl %r4,%r6,.Lslow_index_found ++ /* Zero-index < loaded byte count ++ -> Former str-part was last str-part ++ -> Return null */ ++ clrjl %r6,%r0,.Lslow_end_not_found ++ ++ /* All elements are zero (=no match) -> Proceed with next str-part. */ ++ vlr %v17,%v19 /* Load first part of reject (no zero). */ ++ algfr %r1,%r0 /* Add loaded byte count to current len. */ ++ ++.Lslow_loop_str: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ lghi %r0,16 /* Loaded byte count is 16. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of reject to zero. */ ++ vfenezb %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first reject-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end /* If first element is zero (end of string) ++ -> Return current length. */ ++ ++.Lslow_loop_acc: ++ vfaeb %v22,%v16,%v17,4 /* Create matching-mask (1 in mask -> ++ Character matches any rejected character in ++ this reject-string-part) IN=0, RT=1. */ ++ vlgvb %r4,%v22,0 /* Get result of first element. */ ++ /* First element is equal to any rejected characters? ++ (all other parts of reject cannot lead to a match before this one) ++ -> Return current len, which is pointing to this element. */ ++ clijh %r4,0,.Lslow_end ++ vo %v21,%v21,%v22 /* Global-mask = global-|matching-mask. */ ++ /* Proceed with next acc until end of acc is reached. */ ++ ++ ++.Lslow_next_acc: ++ clijh %r8,0,.Lslow_next_str /* There was a zero in last reject-part ++ -> Add found index to current len ++ and end. */ ++ vlbb %v17,16(%r5,%r3),6 /* Load next reject part. */ ++ aghi %r5,16 /* Increment current len of reject-string. */ ++ lcbb %r9,0(%r5,%r3),6 /* Get loaded byte count of reject-string. */ ++ jo .Lslow_next_acc_onbb /* Jump away if reject-string is ++ on block-boundary. */ ++.Lslow_next_acc_notonbb: ++ vistrbs %v17,%v17 /* Fill with zeros after first zero. */ ++ jo .Lslow_loop_acc /* No zero found -> no preparation needed. */ ++ ++.Lslow_next_acc_prepare_zero: ++ /* Zero in reject-part: fill zeros with first-reject-character. */ ++ vlgvb %r8,%v17,0 /* Load first element of reject-part. */ ++ clije %r8,0,.Lslow_next_str /* Process next str-part if first ++ character in this part of reject ++ is a zero. */ ++ /* r8>0 -> zero found in this acc-part. */ ++ vrepb %v18,%v17,0 /* Replicate first char accross all chars. */ ++ vceqb %v22,%v20,%v17 /* Create a mask (v22) of null chars ++ by comparing with 0 (v20). */ ++ vsel %v17,%v18,%v17,%v22 /* Replace null chars with first char. */ ++ j .Lslow_loop_acc /* Reject-string part is prepared. */ ++ ++.Lslow_next_acc_onbb: ++ vfenezb %v18,%v17,%v17 /* Find zero in loaded bytes of reject part. */ ++ vlgvb %r8,%v18,7 /* Load byte index of zero. */ ++ clrjl %r8,%r9,.Lslow_next_acc_notonbb /* Found a zero in loaded bytes ++ -> Prepare vreg. */ ++ vl %v17,0(%r5,%r3) /* Load over boundary ... */ ++ lghi %r8,0 /* r8=0 -> no zero in this part of acc, ++ check for zero is in jump-target. */ ++ j .Lslow_next_acc_notonbb /* ... and search for zero in ++ fully loaded vreg again. */ ++ ++.Lslow_end_not_found: ++ algfr %r1,%r6 /* Add zero-index to current len. */ ++ j .Lslow_end ++.Lslow_index_found: ++ algfr %r1,%r4 /* Add found index of char to current len. */ ++.Lslow_end: ++ lgr %r2,%r1 ++ /* Restore registers. */ ++ vlgvg %r6,%v30,0 ++ vlgvg %r8,%v31,0 ++ vlgvg %r9,%v31,1 ++ br %r14 ++END(__strcspn_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/strcspn.c b/sysdeps/s390/multiarch/strcspn.c +new file mode 100644 +index 0000000..32b46c4 +--- /dev/null ++++ b/sysdeps/s390/multiarch/strcspn.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of strcspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__strcspn, strcspn) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/wcscspn-c.c b/sysdeps/s390/multiarch/wcscspn-c.c +new file mode 100644 +index 0000000..95e76ae +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscspn-c.c +@@ -0,0 +1,26 @@ ++/* Default wcscscpn implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WCSCSPN __wcscspn_c ++ ++# include ++extern __typeof (wcscspn) __wcscspn_c; ++ ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wcscspn-vx.S b/sysdeps/s390/multiarch/wcscspn-vx.S +new file mode 100644 +index 0000000..aa581ce +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscspn-vx.S +@@ -0,0 +1,293 @@ ++/* Vector optimized 32/64 bit S/390 version of wcscspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* size_t wcscspn (const wchar_t *s, const wchar_t * reject) ++ The wcscspn() function calculates the length of the initial segment ++ of s which consists entirely of characters not in reject. ++ ++ This method checks the length of reject string. If it fits entirely ++ in one vector register, a fast algorithm is used, which does not need ++ to check multiple parts of accept-string. Otherwise a slower full ++ check of accept-string is used. ++ ++ register overview: ++ r3: pointer to start of reject-string ++ r2: pointer to start of search-string ++ r0: loaded byte count of vlbb search-string ++ r4: found byte index ++ r1: current return len ++ v16: search-string ++ v17: reject-string ++ v18: temp-vreg ++ ++ ONLY FOR SLOW: ++ v19: first reject-string ++ v20: zero for preparing acc-vector ++ v21: global mask; 1 indicates a match between ++ search-string-vreg and any reject-character ++ v22: current mask; 1 indicates a match between ++ search-string-vreg and any reject-character in current acc-vreg ++ v30, v31: for re-/storing registers r6, r8, r9 ++ r5: current len of reject-string ++ r6: zero-index in search-string or 16 if no zero ++ or min(zero-index, loaded byte count) ++ r8: >0, if former reject-string-part contains a zero, ++ otherwise =0; ++ r9: loaded byte count of vlbb reject-string ++*/ ++ENTRY(__wcscspn_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ /* ++ Check if reject-string fits in one vreg: ++ ---------------------------------------- ++ */ ++ vlbb %v17,0(%r3),0 /* Load reject. */ ++ lcbb %r0,0(%r3),0 ++ jo .Lcheck_onbb /* Special case if reject ++ lays on block-boundary. */ ++ ++.Lcheck_notonbb: ++ lghi %r1,0 /* Zero out current len. */ ++ vistrfs %v17,%v17 /* Fill with zeros after first zero. */ ++ je .Lfast /* Zero found -> reject fits in one vreg. */ ++ j .Lslow /* No zero -> reject exceeds one vreg. */ ++ ++ ++.Lcheck_onbb: ++ /* Reject lays on block-boundary. */ ++ nill %r0,65532 /* Recognize only fully loaded characters. */ ++ je .Lcheck_onbb2 /* Reload vr, if we loaded no full wchar_t. */ ++ vfenezf %v18,%v17,%v17 /* Search zero in loaded reject bytes. */ ++ vlgvb %r4,%v18,7 /* Get index of zero or 16 if not found. */ ++ clrjl %r4,%r0,.Lcheck_notonbb /* Zero index < loaded bytes count -> ++ Reject fits in one vreg; ++ Fill with zeros and proceed ++ with FAST. */ ++.Lcheck_onbb2: ++ vl %v17,0(%r3) /* Load reject, which exceeds loaded bytes. */ ++ j .Lcheck_notonbb /* Check if reject fits in one vreg. */ ++ ++ ++ /* ++ Search s for reject in one vreg ++ ------------------------------- ++ */ ++.Lfast: ++ /* Complete reject-string in v17 and remaining bytes are zero. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vfaezfs %v18,%v16,%v17,0 /* Find first element in v16 ++ unequal to any in v17 ++ or first zero element. */ ++ vlgvb %r4,%v18,7 /* Load byte index of found element. */ ++ clrjl %r4,%r0,.Lfast_loop_found2 /* If found index is within loaded ++ bytes, return with found element ++ index (=equal count). */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r4,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r1,16 /* current_len = 16. */ ++ slr %r1,%r4 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Process s in 16byte aligned loop. */ ++.Lfast_loop: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ vfaezfs %v18,%v16,%v17,0 /* Find first element in v16 equal to any ++ in v17 or first zero element. */ ++ jno .Lfast_loop_found ++ ++ vl %v16,16(%r1,%r2) ++ vfaezfs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found16 ++ ++ vl %v16,32(%r1,%r2) ++ vfaezfs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found32 ++ ++ vl %v16,48(%r1,%r2) ++ vfaezfs %v18,%v16,%v17,0 ++ jno .Lfast_loop_found48 ++ ++ aghi %r1,64 ++ j .Lfast_loop /* Loop if no element was unequal to reject ++ and not zero. */ ++ ++ /* Found equal or zero element. */ ++.Lfast_loop_found48: ++ aghi %r1,16 ++.Lfast_loop_found32: ++ aghi %r1,16 ++.Lfast_loop_found16: ++ aghi %r1,16 ++.Lfast_loop_found: ++ vlgvb %r4,%v18,7 /* Load byte index of found element or zero. */ ++.Lfast_loop_found2: ++ algrk %r2,%r1,%r4 /* Add found index to current len. */ ++ srlg %r2,%r2,2 /* Convert byte-count to character-count. */ ++ br %r14 ++ ++ ++ ++ /* ++ Search s for reject in multiple vregs ++ ------------------------------------- ++ */ ++.Lslow: ++ /* Save registers. */ ++ vlvgg %v30,%r6,0 ++ vlvgp %v31,%r8,%r9 ++ ++ /* Reject in v17 without zero. */ ++ vlr %v19,%v17 /* Save first acc-part for a fast reload. */ ++ vzero %v20 /* Zero for preparing acc-vector. */ ++ vone %v24 /* One for checking result of former ++ string-part. */ ++ ++ /* Align s to 16 byte. */ ++ risbg %r4,%r2,60,128+63,0 /* Test if s is aligned and ++ %r4 = bits 60-63 'and' 15. */ ++ je .Lslow_loop_str /* If s is aligned, loop aligned. */ ++ lghi %r0,15 ++ slr %r0,%r4 /* Compute highest index to load (15-x). */ ++ vll %v16,%r0,0(%r2) /* Load up to 16byte boundary (vll needs ++ highest index, remaining bytes are 0). */ ++ ahi %r0,1 /* Work with loaded byte count. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of reject-string to zero. */ ++ vfenezf %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first reject-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end /* If first element is zero -> return 0. */ ++ clr %r0,%r6 /* cc==1 if loaded byte count < zero-index. */ ++ locrl %r6,%r0 /* Load on cc==1; zero-index = lbc. */ ++ j .Lslow_loop_acc ++ ++ ++ /* Process s in 16byte aligned loop. */ ++.Lslow_next_str: ++ /* Check results of former processed str-part. */ ++ vfeef %v18,%v21,%v24 /* Find first equal match in global mask ++ (ones in element). */ ++ vlgvb %r4,%v18,7 /* Get index of first one (=equal) or 16. */ ++ /* Equal-index < min(zero-index, loaded byte count) ++ -> Return pointer to equal element. */ ++ clrjl %r4,%r6,.Lslow_index_found ++ /* Zero-index < loaded byte count ++ -> Former str-part was last str-part ++ -> Return null */ ++ clrjl %r6,%r0,.Lslow_end_not_found ++ ++ /* All elements are zero (=no match) -> proceed with next str-part. */ ++ vlr %v17,%v19 /* Load first part of reject (no zero). */ ++ algfr %r1,%r0 /* Add loaded byte count to current len. */ ++ ++.Lslow_loop_str: ++ vl %v16,0(%r1,%r2) /* Load search-string. */ ++ lghi %r0,16 /* Loaded byte count is 16. */ ++ vzero %v21 /* Zero out global mask. */ ++ lghi %r5,0 /* Set current len of reject to zero. */ ++ vfenezf %v18,%v16,%v16 /* Find zero in current string-part. */ ++ lghi %r8,0 /* There is no zero in first reject-part. */ ++ vlgvb %r6,%v18,7 /* Load byte index of zero or 16 if no zero. */ ++ clije %r6,0,.Lslow_end /* If first element is zero (end of string) ++ -> Return current length. */ ++ ++.Lslow_loop_acc: ++ vfaef %v22,%v16,%v17,4 /* Create matching-mask (1 in mask -> ++ Character matches any rejected character in ++ this reject-string-part) IN=0, RT=1. */ ++ vlgvf %r4,%v22,0 /* Get result of first element. */ ++ /* First element is equal to any rejected characters? ++ (All other parts of reject cannot lead to a match before this one) ++ -> Return current len, which is pointing to this element. */ ++ clijh %r4,0,.Lslow_end ++ vo %v21,%v21,%v22 /* Global-mask = global-|matching-mask. */ ++ /* Proceed with next acc until end of acc is reached. */ ++ ++ ++.Lslow_next_acc: ++ clijh %r8,0,.Lslow_next_str /* There was a zero in last reject-part ++ -> Add found index to current len ++ and end. */ ++ vlbb %v17,16(%r5,%r3),6 /* Load next reject part. */ ++ aghi %r5,16 /* Increment current len of reject-string. */ ++ lcbb %r9,0(%r5,%r3),6 /* Get loaded byte count of reject-string. */ ++ jo .Lslow_next_acc_onbb /* Jump away if reject-string is ++ on block-boundary. */ ++.Lslow_next_acc_notonbb: ++ vistrfs %v17,%v17 /* Fill with zeros after first zero. */ ++ jo .Lslow_loop_acc /* No zero found -> no preparation needed. */ ++ ++.Lslow_next_acc_prepare_zero: ++ /* Zero in reject-part: fill zeros with first-reject-character. */ ++ vlgvf %r8,%v17,0 /* Load first element of reject-part. */ ++ clije %r8,0,.Lslow_next_str /* Process next str-part if first ++ character in this part of reject ++ is a zero. */ ++ /* r8>0 -> zero found in this acc-part. */ ++ vrepf %v18,%v17,0 /* Replicate first char accross all chars. */ ++ vceqf %v22,%v20,%v17 /* Create a mask (v22) of null chars ++ by comparing with 0 (v20). */ ++ vsel %v17,%v18,%v17,%v22 /* Replace null chars with first char. */ ++ j .Lslow_loop_acc /* Reject-string part is prepared. */ ++ ++.Lslow_next_acc_onbb: ++ nill %r9,65532 /* Recognize only fully loaded characters. */ ++ je .Lslow_next_acc_onbb2 /* Reload vr, if no full wchar_t ++ loaded. */ ++ vfenezf %v18,%v17,%v17 /* Find zero in loaded bytes of reject part. */ ++ vlgvb %r8,%v18,7 /* Load byte index of zero. */ ++ clrjl %r8,%r9,.Lslow_next_acc_notonbb /* Found a zero in loaded bytes ++ -> Prepare vreg. */ ++.Lslow_next_acc_onbb2: ++ vl %v17,0(%r5,%r3) /* Load over boundary ... */ ++ lghi %r8,0 /* r8=0 -> no zero in this part of acc, ++ check for zero is in jump-target. */ ++ j .Lslow_next_acc_notonbb /* ... and search for zero in ++ fully loaded vreg again. */ ++ ++.Lslow_end_not_found: ++ algfr %r1,%r6 /* Add zero-index to current len. */ ++ j .Lslow_end ++.Lslow_index_found: ++ algfr %r1,%r4 /* Add found index of char to current len. */ ++.Lslow_end: ++ srlg %r2,%r1,2 /* Convert byte-count to character-count. */ ++ /* Restore registers. */ ++ vlgvg %r6,%v30,0 ++ vlgvg %r8,%v31,0 ++ vlgvg %r9,%v31,1 ++ br %r14 ++.Lfallback: ++ jg __wcscspn_c ++END(__wcscspn_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wcscspn.c b/sysdeps/s390/multiarch/wcscspn.c +new file mode 100644 +index 0000000..3cb4516 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wcscspn.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wcscspn. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wcscspn, wcscspn) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 7ecff8b..9730b00 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -42,7 +42,8 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + mbrtoc16 c16rtomb + + strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ +- wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn wcspbrk ++ wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn wcspbrk \ ++ wcscspn + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wcscspn-ifunc.c b/wcsmbs/test-wcscspn-ifunc.c +new file mode 100644 +index 0000000..e5dcdaf +--- /dev/null ++++ b/wcsmbs/test-wcscspn-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wcscspn function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wcscspn.c" +diff --git a/wcsmbs/test-wcscspn.c b/wcsmbs/test-wcscspn.c +new file mode 100644 +index 0000000..d09cd3d +--- /dev/null ++++ b/wcsmbs/test-wcscspn.c +@@ -0,0 +1,20 @@ ++/* Test wcscspn functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-strcspn.c" +diff --git a/wcsmbs/wcscspn.c b/wcsmbs/wcscspn.c +index 5d38d07..9e84226 100644 +--- a/wcsmbs/wcscspn.c ++++ b/wcsmbs/wcscspn.c +@@ -18,6 +18,9 @@ + + #include + ++#ifdef WCSCSPN ++# define wcscspn WCSCSPN ++#endif + + /* Return the length of the maximum initial segment + of WCS which contains only wide-characters not in REJECT. */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-26.patch b/SOURCES/glibc-rh1268008-26.patch new file mode 100644 index 0000000..207511b --- /dev/null +++ b/SOURCES/glibc-rh1268008-26.patch @@ -0,0 +1,1184 @@ +From 6bad9c03df10e4bca1840eff95ef9036e5261436 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 13:20:09 +0200 +Subject: [PATCH 26/30] S390: Optimize memchr, rawmemchr and wmemchr. + +upstream-commit-id: 88eefd344b3cf4a41284a1dfdaca61667e3a1b4b +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00093.html + +This patch provides optimized versions of memchr, rawmemchr and wmemchr with the +z13 vector instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/memchr-vx.S: New File. + * sysdeps/s390/multiarch/memchr.c: Likewise. + * sysdeps/s390/multiarch/rawmemchr-c.c: Likewise. + * sysdeps/s390/multiarch/rawmemchr-vx.S: Likewise. + * sysdeps/s390/multiarch/rawmemchr.c: Likewise. + * sysdeps/s390/multiarch/wmemchr-c.c: Likewise. + * sysdeps/s390/multiarch/wmemchr-vx.S: Likewise. + * sysdeps/s390/multiarch/wmemchr.c: Likewise. + * sysdeps/s390/s390-32/multiarch/memchr.c: Likewise. + * sysdeps/s390/s390-64/multiarch/memchr.c: Likewise. + * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add memchr, wmemchr + and rawmemchr functions. + * sysdeps/s390/multiarch/ifunc-impl-list-common.c + (__libc_ifunc_impl_list_common): Add ifunc test for memchr, rawmemchr + and wmemchr. + * wcsmbs/wmemchr.c: Use WMEMCHR if defined. + * string/test-memchr.c: Add wmemchr support. + * wcsmbs/test-wmemchr.c: New File. + * wcsmbs/Makefile (strop-tests): Add wmemchr. + * benchtests/bench-memchr.c: Add wmemchr support. + * benchtests/bench-wmemchr.c: New File. + * benchtests/Makefile (wcsmbs-bench): wmemchr. +--- + benchtests/Makefile | 3 +- + benchtests/bench-memchr.c | 68 ++++++++----- + benchtests/bench-wmemchr.c | 20 ++++ + string/test-memchr.c | 89 +++++++++++------ + sysdeps/s390/multiarch/Makefile | 7 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 4 + + sysdeps/s390/multiarch/memchr-vx.S | 159 +++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/memchr.c | 24 +++++ + sysdeps/s390/multiarch/rawmemchr-c.c | 34 +++++++ + sysdeps/s390/multiarch/rawmemchr-vx.S | 92 +++++++++++++++++ + sysdeps/s390/multiarch/rawmemchr.c | 28 ++++++ + sysdeps/s390/multiarch/wmemchr-c.c | 31 ++++++ + sysdeps/s390/multiarch/wmemchr-vx.S | 166 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wmemchr.c | 27 +++++ + sysdeps/s390/s390-32/multiarch/memchr.c | 21 ++++ + sysdeps/s390/s390-64/multiarch/memchr.c | 21 ++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wmemchr-ifunc.c | 20 ++++ + wcsmbs/test-wmemchr.c | 20 ++++ + wcsmbs/wmemchr.c | 4 + + 20 files changed, 780 insertions(+), 60 deletions(-) + create mode 100644 benchtests/bench-wmemchr.c + create mode 100644 sysdeps/s390/multiarch/memchr-vx.S + create mode 100644 sysdeps/s390/multiarch/memchr.c + create mode 100644 sysdeps/s390/multiarch/rawmemchr-c.c + create mode 100644 sysdeps/s390/multiarch/rawmemchr-vx.S + create mode 100644 sysdeps/s390/multiarch/rawmemchr.c + create mode 100644 sysdeps/s390/multiarch/wmemchr-c.c + create mode 100644 sysdeps/s390/multiarch/wmemchr-vx.S + create mode 100644 sysdeps/s390/multiarch/wmemchr.c + create mode 100644 sysdeps/s390/s390-32/multiarch/memchr.c + create mode 100644 sysdeps/s390/s390-64/multiarch/memchr.c + create mode 100644 wcsmbs/test-wmemchr-ifunc.c + create mode 100644 wcsmbs/test-wmemchr.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index 4e811a9..b4b3127 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -39,7 +39,8 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ +- wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn ++ wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn \ ++ wmemchr + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-memchr.c b/benchtests/bench-memchr.c +index 30c472c..84a90b4 100644 +--- a/benchtests/bench-memchr.c ++++ b/benchtests/bench-memchr.c +@@ -16,31 +16,51 @@ + License along with the GNU C Library; if not, see + . */ + ++#ifndef WIDE ++# define CHAR char ++# define SMALL_CHAR 127 ++#else ++# include ++# define CHAR wchar_t ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ + #ifndef USE_AS_MEMRCHR + # define TEST_MAIN +-# define TEST_NAME "memchr" ++# ifndef WIDE ++# define TEST_NAME "memchr" ++# else ++# define TEST_NAME "wmemchr" ++# endif /* WIDE */ + # include "bench-string.h" + +-typedef char *(*proto_t) (const char *, int, size_t); +-char *simple_memchr (const char *, int, size_t); ++# ifndef WIDE ++# define MEMCHR memchr ++# define SIMPLE_MEMCHR simple_memchr ++# else ++# define MEMCHR wmemchr ++# define SIMPLE_MEMCHR simple_wmemchr ++# endif /* WIDE */ + +-IMPL (simple_memchr, 0) +-IMPL (memchr, 1) ++typedef CHAR *(*proto_t) (const CHAR *, int, size_t); ++CHAR *SIMPLE_MEMCHR (const CHAR *, int, size_t); + +-char * +-simple_memchr (const char *s, int c, size_t n) ++IMPL (SIMPLE_MEMCHR, 0) ++IMPL (MEMCHR, 1) ++ ++CHAR * ++SIMPLE_MEMCHR (const CHAR *s, int c, size_t n) + { + while (n--) +- if (*s++ == (char) c) +- return (char *) s - 1; ++ if (*s++ == (CHAR) c) ++ return (CHAR *) s - 1; + return NULL; + } +-#endif ++#endif /* !USE_AS_MEMRCHR */ + + static void +-do_one_test (impl_t *impl, const char *s, int c, size_t n, char *exp_res) ++do_one_test (impl_t *impl, const CHAR *s, int c, size_t n, CHAR *exp_res) + { +- char *res = CALL (impl, s, c, n); ++ CHAR *res = CALL (impl, s, c, n); + size_t i, iters = INNER_LOOP_ITERS; + timing_t start, stop, cur; + +@@ -68,36 +88,38 @@ static void + do_test (size_t align, size_t pos, size_t len, int seek_char) + { + size_t i; +- char *result; ++ CHAR *result; + + align &= 7; +- if (align + len >= page_size) ++ if ((align + len) * sizeof (CHAR) >= page_size) + return; + ++ CHAR *buf = (CHAR *) (buf1); ++ + for (i = 0; i < len; ++i) + { +- buf1[align + i] = 1 + 23 * i % 127; +- if (buf1[align + i] == seek_char) +- buf1[align + i] = seek_char + 1; ++ buf[align + i] = 1 + 23 * i % SMALL_CHAR; ++ if (buf[align + i] == seek_char) ++ buf[align + i] = seek_char + 1; + } +- buf1[align + len] = 0; ++ buf[align + len] = 0; + + if (pos < len) + { +- buf1[align + pos] = seek_char; +- buf1[align + len] = -seek_char; +- result = (char *) (buf1 + align + pos); ++ buf[align + pos] = seek_char; ++ buf[align + len] = -seek_char; ++ result = (CHAR *) (buf1 + align + pos); + } + else + { + result = NULL; +- buf1[align + len] = seek_char; ++ buf[align + len] = seek_char; + } + + printf ("Length %4zd, alignment %2zd:", pos, align); + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char *) (buf1 + align), seek_char, len, result); ++ do_one_test (impl, (CHAR *) (buf + align), seek_char, len, result); + + putchar ('\n'); + } +diff --git a/benchtests/bench-wmemchr.c b/benchtests/bench-wmemchr.c +new file mode 100644 +index 0000000..d796a69 +--- /dev/null ++++ b/benchtests/bench-wmemchr.c +@@ -0,0 +1,20 @@ ++/* Measure wmemchr functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-memchr.c" +diff --git a/string/test-memchr.c b/string/test-memchr.c +index cdcceeb..058a837 100644 +--- a/string/test-memchr.c ++++ b/string/test-memchr.c +@@ -18,28 +18,49 @@ + . */ + + #define TEST_MAIN +-#define TEST_NAME "memchr" ++#ifndef WIDE ++# define TEST_NAME "memchr" ++#else ++# define TEST_NAME "wmemchr" ++#endif /* WIDE */ + #include "test-string.h" + +-typedef char *(*proto_t) (const char *, int, size_t); +-char *simple_memchr (const char *, int, size_t); +- +-IMPL (simple_memchr, 0) +-IMPL (memchr, 1) +- +-char * +-simple_memchr (const char *s, int c, size_t n) ++#ifndef WIDE ++# define MEMCHR memchr ++# define CHAR char ++# define UCHAR unsigned char ++# define SIMPLE_MEMCHR simple_memchr ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#else ++# include ++# define MEMCHR wmemchr ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define SIMPLE_MEMCHR simple_wmemchr ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#endif /* WIDE */ ++ ++typedef CHAR *(*proto_t) (const CHAR *, int, size_t); ++CHAR *SIMPLE_MEMCHR (const CHAR *, int, size_t); ++ ++IMPL (SIMPLE_MEMCHR, 0) ++IMPL (MEMCHR, 1) ++ ++CHAR * ++SIMPLE_MEMCHR (const CHAR *s, int c, size_t n) + { + while (n--) +- if (*s++ == (char) c) +- return (char *) s - 1; ++ if (*s++ == (CHAR) c) ++ return (CHAR *) s - 1; + return NULL; + } + + static void +-do_one_test (impl_t *impl, const char *s, int c, size_t n, char *exp_res) ++do_one_test (impl_t *impl, const CHAR *s, int c, size_t n, CHAR *exp_res) + { +- char *res = CALL (impl, s, c, n); ++ CHAR *res = CALL (impl, s, c, n); + if (res != exp_res) + { + error (0, 0, "Wrong result in function %s %p %p", impl->name, +@@ -53,34 +74,36 @@ static void + do_test (size_t align, size_t pos, size_t len, int seek_char) + { + size_t i; +- char *result; ++ CHAR *result; + + align &= 7; +- if (align + len >= page_size) ++ if ((align + len) * sizeof (CHAR) >= page_size) + return; + ++ CHAR *buf = (CHAR *) (buf1); ++ + for (i = 0; i < len; ++i) + { +- buf1[align + i] = 1 + 23 * i % 127; +- if (buf1[align + i] == seek_char) +- buf1[align + i] = seek_char + 1; ++ buf[align + i] = 1 + 23 * i % SMALL_CHAR; ++ if (buf[align + i] == seek_char) ++ buf[align + i] = seek_char + 1; + } +- buf1[align + len] = 0; ++ buf[align + len] = 0; + + if (pos < len) + { +- buf1[align + pos] = seek_char; +- buf1[align + len] = -seek_char; +- result = (char *) (buf1 + align + pos); ++ buf[align + pos] = seek_char; ++ buf[align + len] = -seek_char; ++ result = (CHAR *) (buf + align + pos); + } + else + { + result = NULL; +- buf1[align + len] = seek_char; ++ buf[align + len] = seek_char; + } + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char *) (buf1 + align), seek_char, len, result); ++ do_one_test (impl, (CHAR *) (buf + align), seek_char, len, result); + } + + static void +@@ -88,8 +111,8 @@ do_random_tests (void) + { + size_t i, j, n, align, pos, len; + int seek_char; +- char *result; +- unsigned char *p = buf1 + page_size - 512; ++ CHAR *result; ++ UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; + + for (n = 0; n < ITERATIONS; n++) + { +@@ -101,11 +124,11 @@ do_random_tests (void) + if (pos >= len) + len = pos + (random () & 7); + if (len + align >= 512) +- len = 512 - align - (random () & 7); +- seek_char = random () & 255; ++ len = 512 - align - (random () & 7); ++ seek_char = random () & BIG_CHAR; + j = len + align + 64; + if (j > 512) +- j = 512; ++ j = 512; + + for (i = 0; i < j; i++) + { +@@ -113,7 +136,7 @@ do_random_tests (void) + p[i] = seek_char; + else + { +- p[i] = random () & 255; ++ p[i] = random () & BIG_CHAR; + if (i < pos + align && p[i] == seek_char) + p[i] = seek_char + 13; + } +@@ -124,17 +147,17 @@ do_random_tests (void) + size_t r = random (); + if ((r & 31) == 0) + len = ~(uintptr_t) (p + align) - ((r >> 5) & 31); +- result = (char *) (p + pos + align); ++ result = (CHAR *) (p + pos + align); + } + else + result = NULL; + + FOR_EACH_IMPL (impl, 1) +- if (CALL (impl, (char *) (p + align), seek_char, len) != result) ++ if (CALL (impl, (CHAR *) (p + align), seek_char, len) != result) + { + error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd, %zd) %p != %p, p %p", + n, impl->name, align, seek_char, len, pos, +- CALL (impl, (char *) (p + align), seek_char, len), ++ CALL (impl, (CHAR *) (p + align), seek_char, len), + result, p); + ret = 1; + } +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 2c1fce0..4a04c34 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -14,7 +14,9 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strrchr strrchr-vx strrchr-c \ + strspn strspn-vx strspn-c \ + strpbrk strpbrk-vx strpbrk-c \ +- strcspn strcspn-vx strcspn-c ++ strcspn strcspn-vx strcspn-c \ ++ memchr memchr-vx \ ++ rawmemchr rawmemchr-vx rawmemchr-c + endif + + ifeq ($(subdir),wcsmbs) +@@ -33,5 +35,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsrchr wcsrchr-vx wcsrchr-c \ + wcsspn wcsspn-vx wcsspn-c \ + wcspbrk wcspbrk-vx wcspbrk-c \ +- wcscspn wcscspn-vx wcscspn-c ++ wcscspn wcscspn-vx wcscspn-c \ ++ wmemchr wmemchr-vx wmemchr-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index 7f62e49..d4c7c0d 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -127,6 +127,10 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (strcspn); + IFUNC_VX_IMPL (wcscspn); + ++ IFUNC_VX_IMPL (memchr); ++ IFUNC_VX_IMPL (wmemchr); ++ IFUNC_VX_IMPL (rawmemchr); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/memchr-vx.S b/sysdeps/s390/multiarch/memchr-vx.S +new file mode 100644 +index 0000000..5c98fd9 +--- /dev/null ++++ b/sysdeps/s390/multiarch/memchr-vx.S +@@ -0,0 +1,159 @@ ++/* Vector optimized 32/64 bit S/390 version of memchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* void *memchr (const void *s, int c, size_t n) ++ Scans memory for character c ++ and returns pointer to first c. ++ ++ Register usage: ++ -r0=tmp ++ -r1=tmp ++ -r2=s ++ -r3=c ++ -r4=n ++ -r5=current_len ++ -v16=part of s ++ -v17=index of found c ++ -v18=c replicated ++*/ ++ENTRY(__memchr_vx) ++ ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgije %r4,0,.Lnf_end /* If len == 0 then exit. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r0,%r0 /* Convert 32bit to 64bit. */ ++ ++ vlvgb %v18,%r3,0 /* Generate vector which elements are all c. ++ if c > 255, c will be truncated. */ ++ vrepb %v18,%v18,0 ++ lghi %r5,16 /* current_len = 16. */ ++ ++ clgrjhe %r0,%r4,.Llastcmp /* If (bytes to boundary) >= n, ++ jump to lastcmp. */ ++ ++ vfeebs %v17,%v16,%v18 /* Find c. */ ++ vlgvb %r1,%v17,7 /* Load byte index of c. */ ++ clgrjl %r1,%r0,.Lfound2 /* Found c is within loaded bytes. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ slr %r5,%r1 /* Compute bytes to 16bytes boundary. */ ++ ++ lgr %r0,%r5 /* If %r5 + 64 < n? -> loop64. */ ++ aghi %r0,64 ++ clgrjl %r0,%r4,.Lloop64 ++.Llt64: ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp /* Do last compare if curr-len >= n. */ ++ vfeebs %v17,%v16,%v18 /* Find c. */ ++ jl .Lfound /* Jump away if c was found. */ ++ ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp ++ vfeebs %v17,%v16,%v18 ++ jl .Lfound ++ ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp ++ vfeebs %v17,%v16,%v18 ++ jl .Lfound ++ ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Llastcmp: ++ /* Use comparision result only if located within first n characters. ++ %r5: current_len; ++ %r4: n; ++ (current_len - n): [0...16[ ++ first ignored match index: vr-width - (current_len - n) ]0...16] ++ */ ++ vfeebs %v17,%v16,%v18 /* Find c. */ ++ slgrk %r4,%r5,%r4 /* %r5 = current_len - n. */ ++ lghi %r0,16 /* Register width = 16. */ ++ vlgvb %r1,%v17,7 /* Extract found index or 16 if all equal. */ ++ slr %r0,%r4 /* %r0 = first ignored match index. */ ++ clrjl %r1,%r0,.Lfound2 /* Go away if miscompare is below n bytes. */ ++ /* c not found within n-bytes. */ ++.Lnf_end: ++ lghi %r2,0 /* Return null. */ ++ br %r14 ++ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound0: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r1,%v17,7 /* Load byte index of c. */ ++.Lfound2: ++ slgfi %r5,16 /* current_len -=16 */ ++ algr %r5,%r1 /* Zero byte index is added to current len. */ ++ la %r2,0(%r5,%r2) /* Return pointer to c. */ ++ br %r14 ++ ++ ++.Lloop64: ++ vl %v16,0(%r5,%r2) ++ vfeebs %v17,%v16,%v18 /* Find c. */ ++ jl .Lfound0 /* Jump away if c was found. */ ++ vl %v16,16(%r5,%r2) ++ vfeebs %v17,%v16,%v18 ++ jl .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeebs %v17,%v16,%v18 ++ jl .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeebs %v17,%v16,%v18 ++ jl .Lfound48 ++ ++ aghi %r5,64 ++ lgr %r0,%r5 /* If %r5 + 64 < n? -> loop64. */ ++ aghi %r0,64 ++ clgrjl %r0,%r4,.Lloop64 ++ ++ j .Llt64 ++END(__memchr_vx) ++ ++# define memchr __memchr_c ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) strong_alias(__memchr_c, __GI_memchr) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ ++ ++#include +diff --git a/sysdeps/s390/multiarch/memchr.c b/sysdeps/s390/multiarch/memchr.c +new file mode 100644 +index 0000000..6624765 +--- /dev/null ++++ b/sysdeps/s390/multiarch/memchr.c +@@ -0,0 +1,24 @@ ++/* Multiple versions of memchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__memchr, memchr) ++#endif +diff --git a/sysdeps/s390/multiarch/rawmemchr-c.c b/sysdeps/s390/multiarch/rawmemchr-c.c +new file mode 100644 +index 0000000..f652133 +--- /dev/null ++++ b/sysdeps/s390/multiarch/rawmemchr-c.c +@@ -0,0 +1,34 @@ ++/* Default rawmemchr implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++ ++# define RAWMEMCHR __rawmemchr_c ++# undef weak_alias ++# define weak_alias(a, b) ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__rawmemchr_c, __GI___rawmemchr, __rawmemchr_c); ++# endif /* SHARED */ ++ ++extern __typeof (rawmemchr) __rawmemchr_c attribute_hidden; ++ ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/multiarch/rawmemchr-vx.S b/sysdeps/s390/multiarch/rawmemchr-vx.S +new file mode 100644 +index 0000000..2af4570 +--- /dev/null ++++ b/sysdeps/s390/multiarch/rawmemchr-vx.S +@@ -0,0 +1,92 @@ ++/* Vector optimized 32/64 bit S/390 version of rawmemchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* void *rawmemchr (const void *s, int c) ++ Scans memory for character c ++ and returns pointer to first c. ++ ++ Register usage: ++ -r1=tmp ++ -r2=s ++ -r3=c ++ -r4=tmp ++ -r5=current_len ++ -v16=part of s ++ -v17=index of unequal ++ -v18=c replicated ++*/ ++ENTRY(__rawmemchr_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r1,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ ++ vlvgb %v18,%r3,0 /* Generate vector which elements are all c. ++ If c > 255, c will be truncated. */ ++ vrepb %v18,%v18,0 ++ ++ vfeeb %v17,%v16,%v18 /* Vector find element equal. */ ++ vlgvb %r5,%v17,7 /* Load byte index of character or zero. */ ++ clrjl %r5,%r1,.Lend_found /* If found c is in loaded bytes, end. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r5,16 ++ slr %r5,%r1 /* Compute bytes to 16bytes boundary. */ ++ ++ /* Find c in a 16byte aligned loop. */ ++.Lloop: ++ vl %v16,0(%r5,%r2) /* Load s. */ ++ vfeebs %v17,%v16,%v18 /* Vector find element equal. */ ++ jno .Lcharacter /* Jump away if element found. */ ++ vl %v16,16(%r5,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lcharacter16 ++ vl %v16,32(%r5,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lcharacter32 ++ vl %v16,48(%r5,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lcharacter48 ++ ++ aghi %r5,64 ++ j .Lloop /* No character found -> loop. */ ++ ++ /* Found character. */ ++.Lcharacter48: ++ aghi %r5,16 ++.Lcharacter32: ++ aghi %r5,16 ++.Lcharacter16: ++ aghi %r5,16 ++.Lcharacter: ++ vlgvb %r1,%v17,7 /* Load byte index of character. */ ++ algr %r5,%r1 ++.Lend_found: ++ la %r2,0(%r5,%r2) /* Return pointer to character. */ ++ br %r14 ++END(__rawmemchr_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/rawmemchr.c b/sysdeps/s390/multiarch/rawmemchr.c +new file mode 100644 +index 0000000..2335289 +--- /dev/null ++++ b/sysdeps/s390/multiarch/rawmemchr.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of rawmemchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__rawmemchr) ++weak_alias (__rawmemchr, rawmemchr) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT &&!defined NOT_IN_libc ) */ +diff --git a/sysdeps/s390/multiarch/wmemchr-c.c b/sysdeps/s390/multiarch/wmemchr-c.c +new file mode 100644 +index 0000000..d4abeb4 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemchr-c.c +@@ -0,0 +1,31 @@ ++/* Default wmemchr implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WMEMCHR __wmemchr_c ++ ++# include ++extern __typeof (wmemchr) __wmemchr_c; ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__wmemchr_c, __GI_wmemchr, __wmemchr_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wmemchr-vx.S b/sysdeps/s390/multiarch/wmemchr-vx.S +new file mode 100644 +index 0000000..4df08d2 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemchr-vx.S +@@ -0,0 +1,166 @@ ++/* Vector optimized 32/64 bit S/390 version of wmemchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t *wmemchr (const wchar_t *s, wchar_t c, size_t n) ++ Scans memory for character c ++ and returns pointer to first c. ++ ++ Register usage: ++ -r0=tmp ++ -r1=tmp ++ -r2=s ++ -r3=c ++ -r4=n ++ -r5=current_len ++ -v16=part of s ++ -v17=index of found c ++ -v18=c replicated ++*/ ++ENTRY(__wmemchr_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ clgije %r4,0,.Lnf_end /* If len == 0 then exit. */ ++ ++ vlbb %v16,0(%r2),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r2),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r0,%r0 /* Convert 32bit to 64bit. */ ++ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ ++ vlvgf %v18,%r3,0 /* Generate vector which elements are all c. */ ++ vrepf %v18,%v18,0 ++ lghi %r5,16 /* current_len = 16. */ ++ ++ /* Check range of maxlen and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ lghi %r1,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ llilf %r1,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r4,%r4,2 /* Convert character-count to byte-count. */ ++ locgrne %r4,%r1 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ clgrjhe %r0,%r4,.Llastcmp /* If (bytes to boundary) >= n, ++ jump to lastcmp. */ ++ ++ vfeefs %v17,%v16,%v18 /* Find c. */ ++ vlgvb %r1,%v17,7 /* Load byte index of c. */ ++ clgrjl %r1,%r0,.Lfound2 /* Found c is within loaded bytes. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r2,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ slr %r5,%r1 /* Compute bytes to 16bytes boundary. */ ++ ++ lgr %r0,%r5 /* If %r5 + 64 < n? -> loop64. */ ++ aghi %r0,64 ++ clgrjl %r0,%r4,.Lloop64 ++.Llt64: ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp /* Do last compare if curr-len >= n. */ ++ vfeefs %v17,%v16,%v18 /* Find c. */ ++ jl .Lfound /* Jump away if c was found. */ ++ ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp ++ vfeefs %v17,%v16,%v18 ++ jl .Lfound ++ ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ clgrjhe %r5,%r4,.Llastcmp ++ vfeefs %v17,%v16,%v18 ++ jl .Lfound ++ ++ vl %v16,0(%r5,%r2) ++ aghi %r5,16 ++ ++.Llastcmp: ++ /* Use comparision result only if located within first n characters. ++ %r5: current_len; ++ %r4: n; ++ (current_len - n): [0...16[ ++ first ignored match index = vr-width - (current_len - n) ]0...16] ++ */ ++ vfeefs %v17,%v16,%v18 /* Find c. */ ++ slgrk %r4,%r5,%r4 /* %r5 = current_len - n. */ ++ lghi %r0,16 /* Register width = 16. */ ++ vlgvb %r1,%v17,7 /* Extract found index or 16 if all equal. */ ++ slr %r0,%r4 /* %r0 = first ignored match index. */ ++ clrjl %r1,%r0,.Lfound2 /* Go away if miscompare is below n bytes. */ ++ /* c not found within n-bytes. */ ++.Lnf_end: ++ lghi %r2,0 /* Return null. */ ++ br %r14 ++ ++.Lfound48: ++ aghi %r5,16 ++.Lfound32: ++ aghi %r5,16 ++.Lfound16: ++ aghi %r5,16 ++.Lfound0: ++ aghi %r5,16 ++.Lfound: ++ vlgvb %r1,%v17,7 /* Load byte index of c. */ ++.Lfound2: ++ slgfi %r5,16 /* current_len -=16 */ ++ algr %r5,%r1 /* Zero byte index is added to current len. */ ++ la %r2,0(%r5,%r2) /* Return pointer to c. */ ++ br %r14 ++ ++.Lloop64: ++ vl %v16,0(%r5,%r2) ++ vfeefs %v17,%v16,%v18 /* Find c. */ ++ jl .Lfound0 /* Jump away if c was found. */ ++ vl %v16,16(%r5,%r2) ++ vfeefs %v17,%v16,%v18 ++ jl .Lfound16 ++ vl %v16,32(%r5,%r2) ++ vfeefs %v17,%v16,%v18 ++ jl .Lfound32 ++ vl %v16,48(%r5,%r2) ++ vfeefs %v17,%v16,%v18 ++ jl .Lfound48 ++ ++ aghi %r5,64 ++ lgr %r0,%r5 /* If %r5 + 64 < n? -> loop64. */ ++ aghi %r0,64 ++ clgrjl %r0,%r4,.Lloop64 ++ ++ j .Llt64 ++.Lfallback: ++ jg __wmemchr_c ++END(__wmemchr_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wmemchr.c b/sysdeps/s390/multiarch/wmemchr.c +new file mode 100644 +index 0000000..b8b0e83 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemchr.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wmemchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wmemchr, wmemchr) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/sysdeps/s390/s390-32/multiarch/memchr.c b/sysdeps/s390/s390-32/multiarch/memchr.c +new file mode 100644 +index 0000000..00958cd +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/memchr.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of memchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/memchr.S will be used. */ ++#include +diff --git a/sysdeps/s390/s390-64/multiarch/memchr.c b/sysdeps/s390/s390-64/multiarch/memchr.c +new file mode 100644 +index 0000000..00958cd +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/memchr.c +@@ -0,0 +1,21 @@ ++/* Multiple versions of memchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This wrapper-file is needed, because otherwise file ++ sysdeps/s390/s390-[32|64]/memchr.S will be used. */ ++#include +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index 9730b00..f8bc401 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -43,7 +43,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + + strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ + wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn wcspbrk \ +- wcscspn ++ wcscspn wmemchr + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wmemchr-ifunc.c b/wcsmbs/test-wmemchr-ifunc.c +new file mode 100644 +index 0000000..4b40871 +--- /dev/null ++++ b/wcsmbs/test-wmemchr-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wmemchr function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wmemchr.c" +diff --git a/wcsmbs/test-wmemchr.c b/wcsmbs/test-wmemchr.c +new file mode 100644 +index 0000000..90c7f68 +--- /dev/null ++++ b/wcsmbs/test-wmemchr.c +@@ -0,0 +1,20 @@ ++/* Test wmemchr functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-memchr.c" +diff --git a/wcsmbs/wmemchr.c b/wcsmbs/wmemchr.c +index 99ebed4..905a321 100644 +--- a/wcsmbs/wmemchr.c ++++ b/wcsmbs/wmemchr.c +@@ -18,6 +18,10 @@ + + #include + ++#ifdef WMEMCHR ++# define wmemchr WMEMCHR ++#endif ++ + wchar_t * + wmemchr (s, c, n) + register const wchar_t *s; +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-27.patch b/SOURCES/glibc-rh1268008-27.patch new file mode 100644 index 0000000..49e382c --- /dev/null +++ b/SOURCES/glibc-rh1268008-27.patch @@ -0,0 +1,307 @@ +From 130a0ae7cad6bc7a2d102624027a1d8de19cc3b3 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 13:21:11 +0200 +Subject: [PATCH 27/30] S390: Optimize memccpy. + +upstream-commit-id: 9b593dc3055d44a4179c03050be58a437ae385a1 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00100.html + +This patch provides optimized versions of memccpy with the z13 vector +instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/memccpy-c.c: New File. + * sysdeps/s390/multiarch/memccpy-vx.S: Likewise. + * sysdeps/s390/multiarch/memccpy.c: Likewise. + * sysdeps/s390/multiarch/Makefile + (sysdep_routines): Add memccpy functions. + * sysdeps/s390/multiarch/ifunc-impl-list-common.c + (__libc_ifunc_impl_list_common): Add ifunc test for memccpy. + * string/memccpy.c: Use MEMCCPY if defined. +--- + string/memccpy.c | 4 + + sysdeps/s390/multiarch/Makefile | 3 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 2 + + sysdeps/s390/multiarch/memccpy-c.c | 27 ++++++ + sysdeps/s390/multiarch/memccpy-vx.S | 156 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/memccpy.c | 28 ++++++ + 6 files changed, 219 insertions(+), 1 deletion(-) + create mode 100644 sysdeps/s390/multiarch/memccpy-c.c + create mode 100644 sysdeps/s390/multiarch/memccpy-vx.S + create mode 100644 sysdeps/s390/multiarch/memccpy.c + +diff --git a/string/memccpy.c b/string/memccpy.c +index a8649ff..78c13b6 100644 +--- a/string/memccpy.c ++++ b/string/memccpy.c +@@ -20,6 +20,10 @@ + #undef __memccpy + #undef memccpy + ++#ifdef MEMCCPY ++# define __memccpy MEMCCPY ++#endif ++ + /* Copy no more than N bytes of SRC to DEST, stopping when C is found. + Return the position in DEST one byte past where C was copied, or + NULL if C was not found in the first N bytes of SRC. */ +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 4a04c34..87dff0f 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -16,7 +16,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strpbrk strpbrk-vx strpbrk-c \ + strcspn strcspn-vx strcspn-c \ + memchr memchr-vx \ +- rawmemchr rawmemchr-vx rawmemchr-c ++ rawmemchr rawmemchr-vx rawmemchr-c \ ++ memccpy memccpy-vx memccpy-c + endif + + ifeq ($(subdir),wcsmbs) +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index d4c7c0d..c90fb6b 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -131,6 +131,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + IFUNC_VX_IMPL (wmemchr); + IFUNC_VX_IMPL (rawmemchr); + ++ IFUNC_VX_IMPL (memccpy); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/memccpy-c.c b/sysdeps/s390/multiarch/memccpy-c.c +new file mode 100644 +index 0000000..4d07b63 +--- /dev/null ++++ b/sysdeps/s390/multiarch/memccpy-c.c +@@ -0,0 +1,27 @@ ++/* Default memccpy implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define MEMCCPY __memccpy_c ++# undef weak_alias ++# define weak_alias(a, b) ++ ++# include ++extern __typeof (__memccpy) __memccpy_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/memccpy-vx.S b/sysdeps/s390/multiarch/memccpy-vx.S +new file mode 100644 +index 0000000..b1dc69c +--- /dev/null ++++ b/sysdeps/s390/multiarch/memccpy-vx.S +@@ -0,0 +1,156 @@ ++/* Vector optimized 32/64 bit S/390 version of memccpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* void *memccpy (void * dest, const void *src, int c, size_t n) ++ Copies no more than n bytes from src to dest, ++ stopping when the character c is found ++ and returns pointer next to c in dest or null if c not found. ++ ++ Register usage: ++ -r0=tmp ++ -r1=tmp ++ -r2=dest ++ -r3=src ++ -r4=c ++ -r5=n ++ -r6=current_len ++ -v16=part of s ++ -v17=index of found c ++ -v18=c replicated ++ -v19=part #2 of s ++ -v31=save area for r6 ++*/ ++ENTRY(__memccpy_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r5,%r5 ++# endif /* !defined __s390x__ */ ++ ++ vlvgp %v31,%r6,%r7 /* Save registers. */ ++ clgije %r5,0,.Lnf_end /* If len == 0 then exit. */ ++ ++ vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ ++ lcbb %r0,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ ++ llgfr %r0,%r0 /* Convert 32bit to 64bit. */ ++ ++ vlvgb %v18,%r4,0 /* Generate vector which elements are all c. ++ if c > 255, c will be truncated. */ ++ vrepb %v18,%v18,0 ++ lghi %r6,0 /* current_len = 0. */ ++ ++ clgrjle %r5,%r0,.Lremaining_v16 /* If maxlen <= loaded-bytes ++ -> Process remaining. */ ++ ++ vfeebs %v17,%v16,%v18 /* Find c. */ ++ vlgvb %r1,%v17,7 /* Load byte index of c. */ ++ clgrjl %r1,%r0,.Lfound_v16 /* Found c is within loaded bytes. */ ++ ++ /* Align s to 16 byte. */ ++ risbgn %r1,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ ++ lghi %r6,15 /* current_len = 15. */ ++ slr %r6,%r1 /* Compute highest index to 16byte boundary. */ ++ ++ vstl %v16,%r6,0(%r2) /* Store prcessed bytes */ ++ ahi %r6,1 ++ ++.Lpreloop1: ++ /* Now we are 16byte aligned, so we can load ++ a full vreg without page fault. */ ++ vl %v16,0(%r6,%r3) /* Load s. */ ++ clgijl %r5,17,.Lremaining_v16 /* If n <= 16, ++ process remaining bytes. */ ++ lgr %r7,%r5 ++ slgfi %r7,16 /* border_len = n - 16. */ ++ j .Lloop1 ++ ++.Lloop2: ++ vl %v16,16(%r6,%r3) ++ vst %v19,0(%r6,%r2) ++ aghi %r6,16 ++ ++.Lloop1: ++ clgrjhe %r6,%r7,.Lremaining_v16 /* If current_len >= border ++ then process remaining bytes. */ ++ vfeebs %v17,%v16,%v18 /* Find c. */ ++ jl .Lfound_v16 /* Jump away if c was found. */ ++ vl %v19,16(%r6,%r3) /* Load next s part. */ ++ vst %v16,0(%r6,%r2) /* Store previous part without c. */ ++ aghi %r6,16 ++ ++ clgrjhe %r6,%r7,.Lremaining_v19 ++ vfeebs %v17,%v19,%v18 ++ jl .Lfound_v19 ++ vl %v16,16(%r6,%r3) ++ vst %v19,0(%r6,%r2) ++ aghi %r6,16 ++ ++ clgrjhe %r6,%r7,.Lremaining_v16 ++ vfeebs %v17,%v16,%v18 ++ jl .Lfound_v16 ++ vl %v19,16(%r6,%r3) ++ vst %v16,0(%r6,%r2) ++ aghi %r6,16 ++ ++ clgrjhe %r6,%r7,.Lremaining_v19 ++ vfeebs %v17,%v19,%v18 ++ jo .Lloop2 ++ ++.Lfound_v19: ++ vlr %v16,%v19 ++.Lfound_v16: ++ /* v16 contains c. Store remaining bytes to c. currlen hasn´t ++ reached border, thus checking for maxlen is not needed! */ ++ vlgvb %r1,%v17,7 /* Load byte index of c. */ ++ la %r2,0(%r6,%r2) /* vstl has no support for index-register. */ ++.Lfound_v16_store: ++ vstl %v16,%r1,0(%r2) /* Copy bytes including c. */ ++ la %r2,1(%r1,%r2) /* Return pointer next to c in dest. */ ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ br %r14 ++ ++.Lremaining_v19: ++ vlr %v16,%v19 ++.Lremaining_v16: ++ /* v16 contains the remaining bytes [1...16]. ++ Check and store remaining bytes. */ ++ vfeebs %v17,%v16,%v18 ++ slgrk %r7,%r5,%r6 /* Remaining bytes = maxlen - current_len. */ ++ aghi %r7,-1 /* vstl needs highest index. */ ++ la %r2,0(%r6,%r2) /* vstl has no index register. */ ++ vlgvb %r1,%v17,7 /* Load index of c or 16 if not found. */ ++ /* c in remaining bytes? -> Jump away (c-index <= max-index) */ ++ clrjle %r1,%r7,.Lfound_v16_store ++ vstl %v16,%r7,0(%r2) /* Store remaining bytes. */ ++ ++.Lnf_end: ++ vlgvg %r6,%v31,0 ++ vlgvg %r7,%v31,1 ++ lghi %r2,0 /* Return null. */ ++ br %r14 ++END(__memccpy_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/memccpy.c b/sysdeps/s390/multiarch/memccpy.c +new file mode 100644 +index 0000000..746bc25 +--- /dev/null ++++ b/sysdeps/s390/multiarch/memccpy.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of memccpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__memccpy) ++weak_alias (__memccpy, memccpy) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-28.patch b/SOURCES/glibc-rh1268008-28.patch new file mode 100644 index 0000000..adc3e26 --- /dev/null +++ b/SOURCES/glibc-rh1268008-28.patch @@ -0,0 +1,738 @@ +From f0954299ecdccf6a70cf904b8f499d15a5af3928 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 13:22:47 +0200 +Subject: [PATCH 28/30] S390: Optimize wmemset. + +upstream-commit-id: 2e9e166761fed5dfaa53480412bef0656f1b5306 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00078.html + +This patch provides optimized version of wmemset with the z13 vector +instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/wmemset-c.c: New File. + * sysdeps/s390/multiarch/wmemset-vx.S: Likewise. + * sysdeps/s390/multiarch/wmemset.c: Likewise. + * sysdeps/s390/multiarch/Makefile + (sysdep_routines): Add wmemset functions. + * sysdeps/s390/multiarch/ifunc-impl-list-common.c + (__libc_ifunc_impl_list_common): Add ifunc test for wmemset. + * wcsmbs/wmemset.c: Use WMEMSET if defined. + * string/test-memset.c: Add wmemset support. + * wcsmbs/test-wmemset.c: New File. + * wcsmbs/Makefile (strop-tests): Add wmemset. + * benchtests/bench-memset.c: Add wmemset support. + * benchtests/bench-wmemset.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wmemset. +--- + benchtests/Makefile | 2 +- + benchtests/bench-memset.c | 63 +++++++++----- + benchtests/bench-wmemset.c | 20 +++++ + string/test-memset.c | 88 ++++++++++++------- + sysdeps/s390/multiarch/Makefile | 3 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 2 + + sysdeps/s390/multiarch/wmemset-c.c | 31 +++++++ + sysdeps/s390/multiarch/wmemset-vx.S | 142 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wmemset.c | 27 ++++++ + wcsmbs/Makefile | 2 +- + wcsmbs/test-wmemset-ifunc.c | 20 +++++ + wcsmbs/test-wmemset.c | 20 +++++ + wcsmbs/wmemset.c | 3 + + 13 files changed, 368 insertions(+), 55 deletions(-) + create mode 100644 benchtests/bench-wmemset.c + create mode 100644 sysdeps/s390/multiarch/wmemset-c.c + create mode 100644 sysdeps/s390/multiarch/wmemset-vx.S + create mode 100644 sysdeps/s390/multiarch/wmemset.c + create mode 100644 wcsmbs/test-wmemset-ifunc.c + create mode 100644 wcsmbs/test-wmemset.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index b4b3127..b5edfdd 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -40,7 +40,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ + wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn \ +- wmemchr ++ wmemchr wmemset + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-memset.c b/benchtests/bench-memset.c +index 9786ce7..66c3c45 100644 +--- a/benchtests/bench-memset.c ++++ b/benchtests/bench-memset.c +@@ -20,12 +20,29 @@ + #ifdef TEST_BZERO + # define TEST_NAME "bzero" + #else +-# define TEST_NAME "memset" +-#endif ++# ifndef WIDE ++# define TEST_NAME "memset" ++# else ++# define TEST_NAME "wmemset" ++# endif /* WIDE */ ++#endif /* !TEST_BZERO */ + #define MIN_PAGE_SIZE 131072 + #include "bench-string.h" + +-char *simple_memset (char *, int, size_t); ++#ifndef WIDE ++# define MEMSET memset ++# define CHAR char ++# define SIMPLE_MEMSET simple_memset ++# define MEMCMP memcmp ++#else ++# include ++# define MEMSET wmemset ++# define CHAR wchar_t ++# define SIMPLE_MEMSET simple_wmemset ++# define MEMCMP wmemcmp ++#endif /* WIDE */ ++ ++CHAR *SIMPLE_MEMSET (CHAR *, int, size_t); + + #ifdef TEST_BZERO + typedef void (*proto_t) (char *, size_t); +@@ -39,7 +56,7 @@ IMPL (bzero, 1) + void + simple_bzero (char *s, size_t n) + { +- simple_memset (s, 0, n); ++ SIMPLE_MEMSET (s, 0, n); + } + + void +@@ -48,46 +65,50 @@ builtin_bzero (char *s, size_t n) + __builtin_bzero (s, n); + } + #else +-typedef char *(*proto_t) (char *, int, size_t); +-char *builtin_memset (char *, int, size_t); ++typedef CHAR *(*proto_t) (CHAR *, int, size_t); + +-IMPL (simple_memset, 0) ++IMPL (SIMPLE_MEMSET, 0) ++# ifndef WIDE ++char *builtin_memset (char *, int, size_t); + IMPL (builtin_memset, 0) +-IMPL (memset, 1) ++# endif /* !WIDE */ ++IMPL (MEMSET, 1) + ++# ifndef WIDE + char * + builtin_memset (char *s, int c, size_t n) + { + return __builtin_memset (s, c, n); + } +-#endif ++# endif /* !WIDE */ ++#endif /* !TEST_BZERO */ + +-char * ++CHAR * + inhibit_loop_to_libcall +-simple_memset (char *s, int c, size_t n) ++SIMPLE_MEMSET (CHAR *s, int c, size_t n) + { +- char *r = s, *end = s + n; ++ CHAR *r = s, *end = s + n; + while (r < end) + *r++ = c; + return s; + } + + static void +-do_one_test (impl_t *impl, char *s, int c __attribute ((unused)), size_t n) ++do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n) + { + size_t i, iters = INNER_LOOP_ITERS; + timing_t start, stop, cur; +- char tstbuf[n]; ++ CHAR tstbuf[n]; + #ifdef TEST_BZERO + simple_bzero (tstbuf, n); + CALL (impl, s, n); + if (memcmp (s, tstbuf, n) != 0) + #else +- char *res = CALL (impl, s, c, n); ++ CHAR *res = CALL (impl, s, c, n); + if (res != s +- || simple_memset (tstbuf, c, n) != tstbuf +- || memcmp (s, tstbuf, n) != 0) +-#endif ++ || SIMPLE_MEMSET (tstbuf, c, n) != tstbuf ++ || MEMCMP (s, tstbuf, n) != 0) ++#endif /* !TEST_BZERO */ + { + error (0, 0, "Wrong result in function %s", impl->name); + ret = 1; +@@ -101,7 +122,7 @@ do_one_test (impl_t *impl, char *s, int c __attribute ((unused)), size_t n) + CALL (impl, s, n); + #else + CALL (impl, s, c, n); +-#endif ++#endif /* !TEST_BZERO */ + } + TIMING_NOW (stop); + +@@ -114,13 +135,13 @@ static void + do_test (size_t align, int c, size_t len) + { + align &= 7; +- if (align + len > page_size) ++ if ((align + len) * sizeof (CHAR) > page_size) + return; + + printf ("Length %4zd, alignment %2zd, c %2d:", len, align, c); + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char *) buf1 + align, c, len); ++ do_one_test (impl, (CHAR *) (buf1) + align, c, len); + + putchar ('\n'); + } +diff --git a/benchtests/bench-wmemset.c b/benchtests/bench-wmemset.c +new file mode 100644 +index 0000000..540829c +--- /dev/null ++++ b/benchtests/bench-wmemset.c +@@ -0,0 +1,20 @@ ++/* Measure wmemset functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-memset.c" +diff --git a/string/test-memset.c b/string/test-memset.c +index e556a88..99fc282 100644 +--- a/string/test-memset.c ++++ b/string/test-memset.c +@@ -21,12 +21,33 @@ + #ifdef TEST_BZERO + # define TEST_NAME "bzero" + #else +-# define TEST_NAME "memset" +-#endif ++# ifndef WIDE ++# define TEST_NAME "memset" ++# else ++# define TEST_NAME "wmemset" ++# endif /* WIDE */ ++#endif /* !TEST_BZERO */ + #define MIN_PAGE_SIZE 131072 + #include "test-string.h" + +-char *simple_memset (char *, int, size_t); ++#ifndef WIDE ++# define MEMSET memset ++# define CHAR char ++# define UCHAR unsigned char ++# define SIMPLE_MEMSET simple_memset ++# define MEMCMP memcmp ++# define BIG_CHAR CHAR_MAX ++#else ++# include ++# define MEMSET wmemset ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define SIMPLE_MEMSET simple_wmemset ++# define MEMCMP wmemcmp ++# define BIG_CHAR WCHAR_MAX ++#endif /* WIDE */ ++ ++CHAR *SIMPLE_MEMSET (CHAR *, int, size_t); + + #ifdef TEST_BZERO + typedef void (*proto_t) (char *, size_t); +@@ -40,7 +61,7 @@ IMPL (bzero, 1) + void + simple_bzero (char *s, size_t n) + { +- simple_memset (s, 0, n); ++ SIMPLE_MEMSET (s, 0, n); + } + + void +@@ -49,44 +70,48 @@ builtin_bzero (char *s, size_t n) + __builtin_bzero (s, n); + } + #else +-typedef char *(*proto_t) (char *, int, size_t); +-char *builtin_memset (char *, int, size_t); ++typedef CHAR *(*proto_t) (CHAR *, int, size_t); + +-IMPL (simple_memset, 0) ++IMPL (SIMPLE_MEMSET, 0) ++# ifndef WIDE ++char *builtin_memset (char *, int, size_t); + IMPL (builtin_memset, 0) +-IMPL (memset, 1) ++# endif /* !WIDE */ ++IMPL (MEMSET, 1) + ++# ifndef WIDE + char * + builtin_memset (char *s, int c, size_t n) + { + return __builtin_memset (s, c, n); + } +-#endif ++# endif /* !WIDE */ ++#endif /* !TEST_BZERO */ + +-char * ++CHAR * + inhibit_loop_to_libcall +-simple_memset (char *s, int c, size_t n) ++SIMPLE_MEMSET (CHAR *s, int c, size_t n) + { +- char *r = s, *end = s + n; ++ CHAR *r = s, *end = s + n; + while (r < end) + *r++ = c; + return s; + } + + static void +-do_one_test (impl_t *impl, char *s, int c __attribute ((unused)), size_t n) ++do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n) + { +- char tstbuf[n]; ++ CHAR tstbuf[n]; + #ifdef TEST_BZERO + simple_bzero (tstbuf, n); + CALL (impl, s, n); + if (memcmp (s, tstbuf, n) != 0) + #else +- char *res = CALL (impl, s, c, n); ++ CHAR *res = CALL (impl, s, c, n); + if (res != s +- || simple_memset (tstbuf, c, n) != tstbuf +- || memcmp (s, tstbuf, n) != 0) +-#endif ++ || SIMPLE_MEMSET (tstbuf, c, n) != tstbuf ++ || MEMCMP (s, tstbuf, n) != 0) ++#endif /* !TEST_BZERO */ + { + error (0, 0, "Wrong result in function %s", impl->name); + ret = 1; +@@ -98,11 +123,11 @@ static void + do_test (size_t align, int c, size_t len) + { + align &= 7; +- if (align + len > page_size) ++ if ((align + len) * sizeof (CHAR) > page_size) + return; + + FOR_EACH_IMPL (impl, 0) +- do_one_test (impl, (char *) buf1 + align, c, len); ++ do_one_test (impl, (CHAR *) (buf1) + align, c, len); + } + + #ifndef TEST_BZERO +@@ -111,18 +136,19 @@ do_random_tests (void) + { + size_t i, j, k, n, align, len, size; + int c, o; +- unsigned char *p, *res; ++ UCHAR *p, *res; ++ UCHAR *p2 = (UCHAR *) buf2; + +- for (i = 0; i < 65536; ++i) +- buf2[i] = random () & 255; ++ for (i = 0; i < 65536 / sizeof (CHAR); ++i) ++ p2[i] = random () & BIG_CHAR; + + for (n = 0; n < ITERATIONS; n++) + { + if ((random () & 31) == 0) +- size = 65536; ++ size = 65536 / sizeof (CHAR); + else + size = 512; +- p = buf1 + page_size - size; ++ p = (UCHAR *) (buf1 + page_size) - size; + len = random () & (size - 1); + align = size - len - (random () & 31); + if (align > size) +@@ -132,10 +158,10 @@ do_random_tests (void) + if ((random () & 7) == 0) + c = 0; + else +- c = random () & 255; +- o = random () & 255; ++ c = random () & BIG_CHAR; ++ o = random () & BIG_CHAR; + if (o == c) +- o = (c + 1) & 255; ++ o = (c + 1) & BIG_CHAR; + j = len + align + 128; + if (j > size) + j = size; +@@ -152,11 +178,11 @@ do_random_tests (void) + { + for (i = 0; i < len; ++i) + { +- p[i + align] = buf2[i]; ++ p[i + align] = p2[i]; + if (p[i + align] == c) + p[i + align] = o; + } +- res = (unsigned char *) CALL (impl, (char *) p + align, c, len); ++ res = (UCHAR *) CALL (impl, (CHAR *) p + align, c, len); + if (res != p + align) + { + error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd) %p != %p", +@@ -190,7 +216,7 @@ do_random_tests (void) + } + } + } +-#endif ++#endif /* !TEST_BZERO */ + + int + test_main (void) +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 87dff0f..eac88e0 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -37,5 +37,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcsspn wcsspn-vx wcsspn-c \ + wcspbrk wcspbrk-vx wcspbrk-c \ + wcscspn wcscspn-vx wcscspn-c \ +- wmemchr wmemchr-vx wmemchr-c ++ wmemchr wmemchr-vx wmemchr-c \ ++ wmemset wmemset-vx wmemset-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index c90fb6b..44d534b 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -133,6 +133,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + + IFUNC_VX_IMPL (memccpy); + ++ IFUNC_VX_IMPL (wmemset); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/wmemset-c.c b/sysdeps/s390/multiarch/wmemset-c.c +new file mode 100644 +index 0000000..59c9a7e +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemset-c.c +@@ -0,0 +1,31 @@ ++/* Default wmemset implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WMEMSET __wmemset_c ++ ++# include ++extern __typeof (wmemset) __wmemset_c; ++# ifdef SHARED ++# undef libc_hidden_def ++# define libc_hidden_def(name) \ ++ __hidden_ver1 (__wmemset_c, __GI_wmemset, __wmemset_c); ++# endif /* SHARED */ ++ ++# include ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wmemset-vx.S b/sysdeps/s390/multiarch/wmemset-vx.S +new file mode 100644 +index 0000000..dae2c29 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemset-vx.S +@@ -0,0 +1,142 @@ ++/* Vector Optimized 32/64 bit S/390 version of wmemset. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* wchar_t *wmemset(wchar_t *dest, wchar_t wc, size_t n) ++ Fill an array of wide-characters with a constant wide character ++ and returns dest. ++ ++ Register usage: ++ -r0=tmp ++ -r1=tmp ++ -r2=dest or current-pointer ++ -r3=wc ++ -r4=n ++ -r5=tmp ++ -v16=replicated wc ++ -v17,v18,v19=copy of v16 for vstm ++ -v31=saved dest for return ++*/ ++ENTRY(__wmemset_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ ++ vlvgg %v31,%r2,0 /* Save destination pointer for return. */ ++ clgije %r4,0,.Lend ++ ++ vlvgf %v16,%r3,0 /* Generate vector with wchar_t wc. */ ++ vrepf %v16,%v16,0 ++ ++ /* Check range of maxlen and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ lghi %r5,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ llilf %r5,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r4,%r4,2 /* Convert character-count to byte-count. */ ++ locgrne %r4,%r5 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ /* Align dest to 16 byte. */ ++ risbg %r0,%r2,60,128+63,0 /* Test if s is aligned and ++ %r3 = bits 60-63 'and' 15. */ ++ je .Lpreloop /* If s is aligned, loop aligned. */ ++ tmll %r2,3 /* Test if s is 4-byte aligned? */ ++ jne .Lfallback /* And use common-code variant if not. */ ++ lghi %r1,16 ++ slr %r1,%r0 /* Compute byte count to load (16-x). */ ++ clgr %r1,%r4 ++ locgrh %r1,%r4 /* min (byte count, n) */ ++ aghik %r5,%r1,-1 /* vstl needs highest index. */ ++ vstl %v16,%r5,0(%r2) /* Store remaining bytes. */ ++ clgrje %r1,%r4,.Lend /* Return if n bytes where set. */ ++ slgr %r4,%r1 /* Compute remaining byte count. */ ++ la %r2,0(%r1,%r2) ++ ++.Lpreloop: ++ /* Now we are 16-byte aligned. */ ++ clgijl %r4,17,.Lremaining ++ srlg %r1,%r4,8 /* Split into 256byte blocks */ ++ clgije %r1,0,.Lpreloop64 ++ vlr %v17,%v16 ++ vlr %v18,%v16 ++ vlr %v19,%v16 ++ ++.Lloop256: ++ vstm %v16,%v19,0(%r2) ++ vstm %v16,%v19,64(%r2) ++ vstm %v16,%v19,128(%r2) ++ vstm %v16,%v19,192(%r2) ++ la %r2,256(%r2) ++ brctg %r1,.Lloop256 /* Loop until all blocks are processed. */ ++ ++ llgfr %r4,%r4 ++ nilf %r4,255 /* Get remaining bytes */ ++ je .Lend /* Skip store remaining bytes if zero. */ ++ ++.Lpreloop64: ++ clgijl %r4,17,.Lremaining ++ clgijl %r4,33,.Lpreloop16 ++ srlg %r1,%r4,5 /* Split into 32byte blocks */ ++ ++.Lloop32: ++ vst %v16,0(%r2) ++ vst %v16,16(%r2) ++ la %r2,32(%r2) ++ brctg %r1,.Lloop32 /* Loop until all blocks are processed. */ ++ ++ llgfr %r4,%r4 ++ nilf %r4,31 /* Get remaining bytes */ ++ je .Lend /* Skip store remaining bytes if zero. */ ++ ++.Lpreloop16: ++ clgijl %r4,17,.Lremaining ++ srlg %r1,%r4,4 /* Split into 16byte blocks */ ++ ++.Lloop16: ++ vst %v16,0(%r2) ++ la %r2,16(%r2) ++ brctg %r1,.Lloop16 /* Loop until all blocks are processed. */ ++ ++ llgfr %r4,%r4 ++ nilf %r4,15 /* Get remaining bytes */ ++ je .Lend /* Skip store remaining bytes if zero. */ ++ ++.Lremaining: ++ aghi %r4,-1 /* vstl needs highest index. */ ++ vstl %v16,%r4,0(%r2) ++ ++.Lend: ++ vlgvg %r2,%v31,0 /* Load saved dest for return value. */ ++ br %r14 ++.Lfallback: ++ srlg %r4,%r4,2 /* Convert byte-count to character-count. */ ++ jg __wmemset_c ++END(__wmemset_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wmemset.c b/sysdeps/s390/multiarch/wmemset.c +new file mode 100644 +index 0000000..1225fc1 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemset.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wmemset. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wmemset, wmemset) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile +index f8bc401..1ca3ace 100644 +--- a/wcsmbs/Makefile ++++ b/wcsmbs/Makefile +@@ -43,7 +43,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ + + strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \ + wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn wcspbrk \ +- wcscspn wmemchr ++ wcscspn wmemchr wmemset + tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ + tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) +diff --git a/wcsmbs/test-wmemset-ifunc.c b/wcsmbs/test-wmemset-ifunc.c +new file mode 100644 +index 0000000..b58b6bd +--- /dev/null ++++ b/wcsmbs/test-wmemset-ifunc.c +@@ -0,0 +1,20 @@ ++/* Test and measure IFUNC implementations of wmemset function. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define TEST_IFUNC 1 ++#include "test-wmemset.c" +diff --git a/wcsmbs/test-wmemset.c b/wcsmbs/test-wmemset.c +new file mode 100644 +index 0000000..c03c759 +--- /dev/null ++++ b/wcsmbs/test-wmemset.c +@@ -0,0 +1,20 @@ ++/* Test wmemset functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "../string/test-memset.c" +diff --git a/wcsmbs/wmemset.c b/wcsmbs/wmemset.c +index cc9a725..8049bb8 100644 +--- a/wcsmbs/wmemset.c ++++ b/wcsmbs/wmemset.c +@@ -18,6 +18,9 @@ + + #include + ++#ifdef WMEMSET ++# define wmemset WMEMSET ++#endif + + wchar_t * + wmemset (s, c, n) +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-29.patch b/SOURCES/glibc-rh1268008-29.patch new file mode 100644 index 0000000..972c8a6 --- /dev/null +++ b/SOURCES/glibc-rh1268008-29.patch @@ -0,0 +1,323 @@ +From f34499b3a506359f84fcb63a125e44d4a8e4ee68 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 13:23:50 +0200 +Subject: [PATCH 29/30] S390: Optimize wmemcmp. + +upstream-commit-id: f21216015b7395c535abc01b9585a1ae3ceaa132 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00086.html + +This patch provides optimized version of wmemcmp with the z13 vector +instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/wmemcmp-c.c: New File. + * sysdeps/s390/multiarch/wmemcmp-vx.S: Likewise. + * sysdeps/s390/multiarch/wmemcmp.c: Likewise. + * sysdeps/s390/multiarch/Makefile + (sysdep_routines): Add wmemcmp functions. + * sysdeps/s390/multiarch/ifunc-impl-list-common.c + (__libc_ifunc_impl_list_common): Add ifunc test for wmemcmp. + * benchtests/bench-wmemcmp.c: New File. + * benchtests/Makefile (wcsmbs-bench): Add wmemcmp. +--- + benchtests/Makefile | 2 +- + benchtests/bench-wmemcmp.c | 20 +++++ + sysdeps/s390/multiarch/Makefile | 3 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 2 + + sysdeps/s390/multiarch/wmemcmp-c.c | 26 ++++++ + sysdeps/s390/multiarch/wmemcmp-vx.S | 149 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/wmemcmp.c | 27 ++++++ + 7 files changed, 227 insertions(+), 2 deletions(-) + create mode 100644 benchtests/bench-wmemcmp.c + create mode 100644 sysdeps/s390/multiarch/wmemcmp-c.c + create mode 100644 sysdeps/s390/multiarch/wmemcmp-vx.S + create mode 100644 sysdeps/s390/multiarch/wmemcmp.c + +diff --git a/benchtests/Makefile b/benchtests/Makefile +index b5edfdd..911b6df 100644 +--- a/benchtests/Makefile ++++ b/benchtests/Makefile +@@ -40,7 +40,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ + strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok + wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ + wcsncmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn \ +- wmemchr wmemset ++ wmemchr wmemset wmemcmp + string-bench-all := $(string-bench) ${wcsmbs-bench} + + stdlib-bench := strtod +diff --git a/benchtests/bench-wmemcmp.c b/benchtests/bench-wmemcmp.c +new file mode 100644 +index 0000000..8b33f89 +--- /dev/null ++++ b/benchtests/bench-wmemcmp.c +@@ -0,0 +1,20 @@ ++/* Measure wmemcmp functions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define WIDE 1 ++#include "bench-memcmp.c" +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index eac88e0..929a545 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -38,5 +38,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \ + wcspbrk wcspbrk-vx wcspbrk-c \ + wcscspn wcscspn-vx wcscspn-c \ + wmemchr wmemchr-vx wmemchr-c \ +- wmemset wmemset-vx wmemset-c ++ wmemset wmemset-vx wmemset-c \ ++ wmemcmp wmemcmp-vx wmemcmp-c + endif +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index 44d534b..5ea258b 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -135,6 +135,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + + IFUNC_VX_IMPL (wmemset); + ++ IFUNC_VX_IMPL (wmemcmp); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/wmemcmp-c.c b/sysdeps/s390/multiarch/wmemcmp-c.c +new file mode 100644 +index 0000000..b43e5d4 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemcmp-c.c +@@ -0,0 +1,26 @@ ++/* Default wmemcmp implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define WMEMCMP __wmemcmp_c ++ ++# include ++extern __typeof (wmemcmp) __wmemcmp_c; ++ ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/wmemcmp-vx.S b/sysdeps/s390/multiarch/wmemcmp-vx.S +new file mode 100644 +index 0000000..b509bef +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemcmp-vx.S +@@ -0,0 +1,149 @@ ++/* Vector Optimized 32/64 bit S/390 version of wmemcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* int wmemcmp (const wchar_t *s1, const wchar_t *s2, size_t n) ++ Compare at most n characters of two wchar_t-arrays. ++ ++ Register usage: ++ -r0=tmp ++ -r1=number of blocks ++ -r2=s1 ++ -r3=s2 ++ -r4=n ++ -r5=current_len ++ -v16=part of s1 ++ -v17=part of s2 ++ -v18=index of unequal ++*/ ++ENTRY(__wmemcmp_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ clgije %r4,0,.Lend_equal /* Nothing to do if n == 0. */ ++ ++ /* Check range of maxlen and convert to byte-count. */ ++# ifdef __s390x__ ++ tmhh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ lghi %r1,-4 /* Max byte-count is 18446744073709551612. */ ++# else ++ tmlh %r4,49152 /* Test bit 0 or 1 of maxlen. */ ++ llilf %r1,4294967292 /* Max byte-count is 4294967292. */ ++# endif /* !__s390x__ */ ++ sllg %r4,%r4,2 /* Convert character-count to byte-count. */ ++ locgrne %r4,%r1 /* Use max byte-count, if bit 0/1 was one. */ ++ ++ lghi %r5,0 /* current_len = 0. */ ++ ++ clgijh %r4,16,.Lgt16 ++ ++.Lremaining: ++ aghi %r4,-1 /* vstl needs highest index. */ ++ vll %v16,%r4,0(%r2) ++ vll %v17,%r4,0(%r3) ++ vfenef %v18,%v16,%v17 /* Compare not equal. */ ++ vlgvb %r1,%v18,7 /* Load unequal index or 16 if not found. */ ++ clrj %r1,%r4,12,.Lfound2 /* r1 <= r4 -> unequal within loaded ++ bytes. */ ++ ++.Lend_equal: ++ lghi %r2,0 ++ br %r14 ++ ++.Lfound: ++ /* vfenezf found an unequal element or zero. ++ This instruction compares unsigned words, but wchar_t is signed. ++ Thus we have to compare the found element again. */ ++ vlgvb %r1,%v18,7 /* Extract not equal byte-index. */ ++.Lfound2: ++ srl %r1,2 /* And convert it to character-index. */ ++ vlgvf %r0,%v16,0(%r1) /* Load character-values. */ ++ vlgvf %r1,%v17,0(%r1) ++ cr %r0,%r1 ++ je .Lend_equal ++ lghi %r2,1 ++ lghi %r1,-1 ++ locgrl %r2,%r1 ++ br %r14 ++ ++.Lgt16: ++ clgijh %r4,64,.Lpreloop64 ++ ++.Lpreloop16: ++ srlg %r1,%r4,4 /* Split into 16byte blocks */ ++.Lloop16: ++ vl %v16,0(%r5,%r2) ++ vl %v17,0(%r5,%r3) ++ aghi %r5,16 ++ vfenefs %v18,%v16,%v17 /* Compare not equal. */ ++ jno .Lfound ++ brctg %r1,.Lloop16 /* Loop until all blocks are processed. */ ++ ++ llgfr %r4,%r4 ++ nilf %r4,15 /* Get remaining bytes */ ++ locgre %r2,%r4 ++ ber %r14 ++ la %r2,0(%r5,%r2) ++ la %r3,0(%r5,%r3) ++ j .Lremaining ++ ++.Lpreloop64: ++ srlg %r1,%r4,6 /* Split into 64byte blocks */ ++.Lloop64: ++ vl %v16,0(%r5,%r2) ++ vl %v17,0(%r5,%r3) ++ vfenefs %v18,%v16,%v17 /* Compare not equal. */ ++ jno .Lfound ++ ++ vl %v16,16(%r5,%r2) ++ vl %v17,16(%r5,%r3) ++ vfenefs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vl %v16,32(%r5,%r2) ++ vl %v17,32(%r5,%r3) ++ vfenefs %v18,%v16,%v17 ++ jno .Lfound ++ ++ vl %v16,48(%r5,%r2) ++ vl %v17,48(%r5,%r3) ++ aghi %r5,64 ++ vfenefs %v18,%v16,%v17 ++ jno .Lfound ++ ++ brctg %r1,.Lloop64 /* Loop until all blocks are processed. */ ++ ++ llgfr %r4,%r4 ++ nilf %r4,63 /* Get remaining bytes */ ++ locgre %r2,%r4 ++ ber %r14 ++ clgijh %r4,16,.Lpreloop16 ++ la %r2,0(%r5,%r2) ++ la %r3,0(%r5,%r3) ++ j .Lremaining ++END(__wmemcmp_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/wmemcmp.c b/sysdeps/s390/multiarch/wmemcmp.c +new file mode 100644 +index 0000000..24a57e9 +--- /dev/null ++++ b/sysdeps/s390/multiarch/wmemcmp.c +@@ -0,0 +1,27 @@ ++/* Multiple versions of wmemcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc2 (__wmemcmp, wmemcmp) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-3.patch b/SOURCES/glibc-rh1268008-3.patch new file mode 100644 index 0000000..8ce96ac --- /dev/null +++ b/SOURCES/glibc-rh1268008-3.patch @@ -0,0 +1,644 @@ +From 6b9ad27fafd9c09aee186f2630b1c54348335040 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:29:17 +0200 +Subject: [PATCH 03/30] S390: Get rid of linknamespace failures for string + functions. + +upstream-commit-id: 1d53248326dbd3c620a2bca16d35eff3019d900a +https://www.sourceware.org/ml/libc-alpha/2015-01/msg00310.html + +This patch is needed to prepare for the optimized string function patchset. +This patch prefixes the ifunc-resolvers, the specific functions +and helper functions with '__' on s390-32/s390-64. +--- + sysdeps/s390/s390-32/memcmp.S | 4 ++-- + sysdeps/s390/s390-32/memcpy.S | 10 +++++----- + sysdeps/s390/s390-32/memset.S | 4 ++-- + sysdeps/s390/s390-32/multiarch/ifunc-resolve.c | 16 ++++++++-------- + sysdeps/s390/s390-32/multiarch/memcmp.S | 12 ++++++------ + sysdeps/s390/s390-32/multiarch/memcpy.S | 14 +++++++------- + sysdeps/s390/s390-32/multiarch/memset.S | 18 +++++++++--------- + sysdeps/s390/s390-64/memcmp.S | 4 ++-- + sysdeps/s390/s390-64/memcpy.S | 10 +++++----- + sysdeps/s390/s390-64/memset.S | 4 ++-- + sysdeps/s390/s390-64/multiarch/ifunc-resolve.c | 18 +++++++++--------- + sysdeps/s390/s390-64/multiarch/memcmp.S | 12 ++++++------ + sysdeps/s390/s390-64/multiarch/memcpy.S | 14 +++++++------- + sysdeps/s390/s390-64/multiarch/memset.S | 18 +++++++++--------- + 14 files changed, 79 insertions(+), 79 deletions(-) + +diff --git a/sysdeps/s390/s390-32/memcmp.S b/sysdeps/s390/s390-32/memcmp.S +index 9ff84a3..b6eabe5 100644 +--- a/sysdeps/s390/s390-32/memcmp.S ++++ b/sysdeps/s390/s390-32/memcmp.S +@@ -27,7 +27,7 @@ + + .text + #ifdef USE_MULTIARCH +-ENTRY(memcmp_g5) ++ENTRY(__memcmp_g5) + #else + ENTRY(memcmp) + #endif +@@ -58,7 +58,7 @@ ENTRY(memcmp) + .L_G5_17: + clc 0(1,%r3),0(%r2) + #ifdef USE_MULTIARCH +-END(memcmp_g5) ++END(__memcmp_g5) + #else + END(memcmp) + libc_hidden_builtin_def (memcmp) +diff --git a/sysdeps/s390/s390-32/memcpy.S b/sysdeps/s390/s390-32/memcpy.S +index 90cc4cb..a3b1ace 100644 +--- a/sysdeps/s390/s390-32/memcpy.S ++++ b/sysdeps/s390/s390-32/memcpy.S +@@ -26,7 +26,7 @@ + %r4 = number of bytes to copy. */ + + #ifdef USE_MULTIARCH +-ENTRY(memcpy_g5) ++ENTRY(__memcpy_g5) + #else + ENTRY(memcpy) + #endif +@@ -49,7 +49,7 @@ ENTRY(memcpy) + br %r14 + .L_G5_13: + chi %r5,4096 # Switch to mvcle for copies >1MB +- jh memcpy_mvcle ++ jh __memcpy_mvcle + .L_G5_12: + mvc 0(256,%r1),0(%r3) + la %r1,256(%r1) +@@ -60,13 +60,13 @@ ENTRY(memcpy) + .L_G5_17: + mvc 0(1,%r1),0(%r3) + #ifdef USE_MULTIARCH +-END(memcpy_g5) ++END(__memcpy_g5) + #else + END(memcpy) + libc_hidden_builtin_def (memcpy) + #endif + +-ENTRY(memcpy_mvcle) ++ENTRY(__memcpy_mvcle) + # Using as standalone function will result in unexpected + # results since the length field is incremented by 1 in order to + # compensate the changes already done in the functions above. +@@ -79,4 +79,4 @@ ENTRY(memcpy_mvcle) + jo .L_MVCLE_1 + lr %r2,%r1 # return destination address + br %r14 +-END(memcpy_mvcle) ++END(__memcpy_mvcle) +diff --git a/sysdeps/s390/s390-32/memset.S b/sysdeps/s390/s390-32/memset.S +index 31a70f0..a73dc6c 100644 +--- a/sysdeps/s390/s390-32/memset.S ++++ b/sysdeps/s390/s390-32/memset.S +@@ -28,7 +28,7 @@ + .text + + #ifdef USE_MULTIARCH +-ENTRY(memset_g5) ++ENTRY(__memset_g5) + #else + ENTRY(memset) + #endif +@@ -58,7 +58,7 @@ ENTRY(memset) + .L_G5_20: + mvc 1(1,%r1),0(%r1) + #ifdef USE_MULTIARCH +-END(memset_g5) ++END(__memset_g5) + #else + END(memset) + libc_hidden_builtin_def (memset) +diff --git a/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c b/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c +index 42ca8da..522c63c 100644 +--- a/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c ++++ b/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c +@@ -28,17 +28,17 @@ + #define IFUNC_RESOLVE(FUNC) \ + asm (".globl " #FUNC "\n\t" \ + ".type " #FUNC ",@gnu_indirect_function\n\t" \ +- ".set " #FUNC ",resolve_" #FUNC "\n\t" \ ++ ".set " #FUNC ",__resolve_" #FUNC "\n\t" \ + ".globl __GI_" #FUNC "\n\t" \ + ".set __GI_" #FUNC "," #FUNC "\n"); \ + \ + /* Make the declarations of the optimized functions hidden in order + to prevent GOT slots being generated for them. */ \ +- extern void *FUNC##_z196 attribute_hidden; \ +- extern void *FUNC##_z10 attribute_hidden; \ +- extern void *FUNC##_g5 attribute_hidden; \ ++ extern void *__##FUNC##_z196 attribute_hidden; \ ++ extern void *__##FUNC##_z10 attribute_hidden; \ ++ extern void *__##FUNC##_g5 attribute_hidden; \ + \ +- void *resolve_##FUNC (unsigned long int dl_hwcap) \ ++ void *__resolve_##FUNC (unsigned long int dl_hwcap) \ + { \ + if ((dl_hwcap & HWCAP_S390_STFLE) \ + && (dl_hwcap & HWCAP_S390_ZARCH) \ +@@ -53,11 +53,11 @@ + : : "cc"); \ + \ + if ((stfle_bits & (1ULL << (63 - STFLE_BITS_Z196))) != 0) \ +- return &FUNC##_z196; \ ++ return &__##FUNC##_z196; \ + else if ((stfle_bits & (1ULL << (63 - STFLE_BITS_Z10))) != 0) \ +- return &FUNC##_z10; \ ++ return &__##FUNC##_z10; \ + } \ +- return &FUNC##_g5; \ ++ return &__##FUNC##_g5; \ + } + + IFUNC_RESOLVE(memset) +diff --git a/sysdeps/s390/s390-32/multiarch/memcmp.S b/sysdeps/s390/s390-32/multiarch/memcmp.S +index 9ca8891..c654d19 100644 +--- a/sysdeps/s390/s390-32/multiarch/memcmp.S ++++ b/sysdeps/s390/s390-32/multiarch/memcmp.S +@@ -29,7 +29,7 @@ + + #ifndef NOT_IN_libc + +-ENTRY(memcmp_z196) ++ENTRY(__memcmp_z196) + .machine "z196" + .machinemode "zarch_nohighgprs" + ltr %r4,%r4 +@@ -61,9 +61,9 @@ ENTRY(memcmp_z196) + br %r14 + .L_Z196_14: + clc 0(1,%r3),0(%r2) +-END(memcmp_z196) ++END(__memcmp_z196) + +-ENTRY(memcmp_z10) ++ENTRY(__memcmp_z10) + .machine "z10" + .machinemode "zarch_nohighgprs" + ltr %r4,%r4 +@@ -90,7 +90,7 @@ ENTRY(memcmp_z10) + j .L_Z10_3 + .L_Z10_15: + clc 0(1,%r3),0(%r2) +-END(memcmp_z10) ++END(__memcmp_z10) + + #endif + +@@ -98,7 +98,7 @@ END(memcmp_z10) + + #ifdef NOT_IN_libc + .globl memcmp +-.set memcmp,memcmp_g5 ++.set memcmp,__memcmp_g5 + .weak bcmp +-.set bcmp,memcmp_g5 ++.set bcmp,__memcmp_g5 + #endif +diff --git a/sysdeps/s390/s390-32/multiarch/memcpy.S b/sysdeps/s390/s390-32/multiarch/memcpy.S +index 7b85602..5c2113f 100644 +--- a/sysdeps/s390/s390-32/multiarch/memcpy.S ++++ b/sysdeps/s390/s390-32/multiarch/memcpy.S +@@ -29,7 +29,7 @@ + + #if defined SHARED && !defined NOT_IN_libc + +-ENTRY(memcpy_z196) ++ENTRY(__memcpy_z196) + .machine "z196" + .machinemode "zarch_nohighgprs" + llgfr %r4,%r4 +@@ -46,7 +46,7 @@ ENTRY(memcpy_z196) + br %r14 + .L_Z196_5: + cgfi %r5,262144 # Switch to mvcle for copies >64MB +- jh memcpy_mvcle ++ jh __memcpy_mvcle + .L_Z196_2: + pfd 1,768(%r3) + pfd 2,768(%r1) +@@ -58,9 +58,9 @@ ENTRY(memcpy_z196) + j .L_Z196_3 + .L_Z196_14: + mvc 0(1,%r1),0(%r3) +-END(memcpy_z196) ++END(__memcpy_z196) + +-ENTRY(memcpy_z10) ++ENTRY(__memcpy_z10) + .machine "z10" + .machinemode "zarch_nohighgprs" + llgfr %r4,%r4 +@@ -75,7 +75,7 @@ ENTRY(memcpy_z10) + br %r14 + .L_Z10_13: + cgfi %r5,65535 # Switch to mvcle for copies >16MB +- jh memcpy_mvcle ++ jh __memcpy_mvcle + .L_Z10_12: + pfd 1,768(%r3) + pfd 2,768(%r1) +@@ -86,7 +86,7 @@ ENTRY(memcpy_z10) + j .L_Z10_3 + .L_Z10_15: + mvc 0(1,%r1),0(%r3) +-END(memcpy_z10) ++END(__memcpy_z10) + + #endif + +@@ -94,5 +94,5 @@ END(memcpy_z10) + + #if !defined SHARED || defined NOT_IN_libc + .globl memcpy +-.set memcpy,memcpy_g5 ++.set memcpy,__memcpy_g5 + #endif +diff --git a/sysdeps/s390/s390-32/multiarch/memset.S b/sysdeps/s390/s390-32/multiarch/memset.S +index ba43d67..54aa028 100644 +--- a/sysdeps/s390/s390-32/multiarch/memset.S ++++ b/sysdeps/s390/s390-32/multiarch/memset.S +@@ -29,7 +29,7 @@ + + #ifndef NOT_IN_libc + +-ENTRY(memset_z196) ++ENTRY(__memset_z196) + .machine "z196" + .machinemode "zarch_nohighgprs" + llgfr %r4,%r4 +@@ -49,7 +49,7 @@ ENTRY(memset_z196) + br %r14 + .L_Z196_1: + cgfi %r5,1048576 +- jh memset_mvcle # Switch to mvcle for >256MB ++ jh __memset_mvcle # Switch to mvcle for >256MB + .L_Z196_2: + pfd 2,1024(%r1) + mvc 1(256,%r1),0(%r1) +@@ -59,9 +59,9 @@ ENTRY(memset_z196) + j .L_Z196_3 + .L_Z196_17: + mvc 1(1,%r1),0(%r1) +-END(memset_z196) ++END(__memset_z196) + +-ENTRY(memset_z10) ++ENTRY(__memset_z10) + .machine "z10" + .machinemode "zarch_nohighgprs" + llgfr %r4,%r4 +@@ -78,7 +78,7 @@ ENTRY(memset_z10) + br %r14 + .L_Z10_15: + cgfi %r5,163840 # Switch to mvcle for >40MB +- jh memset_mvcle ++ jh __memset_mvcle + .L_Z10_14: + pfd 2,1024(%r1) + mvc 1(256,%r1),0(%r1) +@@ -87,9 +87,9 @@ ENTRY(memset_z10) + j .L_Z10_3 + .L_Z10_18: + mvc 1(1,%r1),0(%r1) +-END(memset_z10) ++END(__memset_z10) + +-ENTRY(memset_mvcle) ++ENTRY(__memset_mvcle) + ahi %r4,2 # take back the change done by the caller + lr %r0,%r2 # save source address + lr %r1,%r3 # move pad byte to R1 +@@ -101,7 +101,7 @@ ENTRY(memset_mvcle) + lr %r2,%r0 # return value is source address + .L1: + br %r14 +-END(memset_mvcle) ++END(__memset_mvcle) + + #endif + +@@ -109,5 +109,5 @@ END(memset_mvcle) + + #ifdef NOT_IN_libc + .globl memset +-.set memset,memset_g5 ++.set memset,__memset_g5 + #endif +diff --git a/sysdeps/s390/s390-64/memcmp.S b/sysdeps/s390/s390-64/memcmp.S +index 1b43440..eb5370f 100644 +--- a/sysdeps/s390/s390-64/memcmp.S ++++ b/sysdeps/s390/s390-64/memcmp.S +@@ -27,7 +27,7 @@ + + .text + #ifdef USE_MULTIARCH +-ENTRY(memcmp_z900) ++ENTRY(__memcmp_z900) + #else + ENTRY(memcmp) + #endif +@@ -56,7 +56,7 @@ ENTRY(memcmp) + .L_Z900_15: + clc 0(1,%r3),0(%r2) + #ifdef USE_MULTIARCH +-END(memcmp_z900) ++END(__memcmp_z900) + #else + END(memcmp) + libc_hidden_builtin_def (memcmp) +diff --git a/sysdeps/s390/s390-64/memcpy.S b/sysdeps/s390/s390-64/memcpy.S +index bae8836..61fca0b 100644 +--- a/sysdeps/s390/s390-64/memcpy.S ++++ b/sysdeps/s390/s390-64/memcpy.S +@@ -29,7 +29,7 @@ + .text + + #ifdef USE_MULTIARCH +-ENTRY(memcpy_z900) ++ENTRY(__memcpy_z900) + #else + ENTRY(memcpy) + #endif +@@ -48,7 +48,7 @@ ENTRY(memcpy) + br %r14 + .L_Z900_13: + chi %r5,4096 # Switch to mvcle for copies >1MB +- jh memcpy_mvcle ++ jh __memcpy_mvcle + .L_Z900_12: + mvc 0(256,%r1),0(%r3) + la %r1,256(%r1) +@@ -59,13 +59,13 @@ ENTRY(memcpy) + mvc 0(1,%r1),0(%r3) + + #ifdef USE_MULTIARCH +-END(memcpy_z900) ++END(__memcpy_z900) + #else + END(memcpy) + libc_hidden_builtin_def (memcpy) + #endif + +-ENTRY(memcpy_mvcle) ++ENTRY(__memcpy_mvcle) + # Using as standalone function will result in unexpected + # results since the length field is incremented by 1 in order to + # compensate the changes already done in the functions above. +@@ -78,4 +78,4 @@ ENTRY(memcpy_mvcle) + jo .L_MVCLE_1 + lgr %r2,%r1 # return destination address + br %r14 +-END(memcpy_mvcle) ++END(__memcpy_mvcle) +diff --git a/sysdeps/s390/s390-64/memset.S b/sysdeps/s390/s390-64/memset.S +index 4edfb4e..8185e94 100644 +--- a/sysdeps/s390/s390-64/memset.S ++++ b/sysdeps/s390/s390-64/memset.S +@@ -29,7 +29,7 @@ + .text + + #ifdef USE_MULTIARCH +-ENTRY(memset_z900) ++ENTRY(__memset_z900) + #else + ENTRY(memset) + #endif +@@ -57,7 +57,7 @@ ENTRY(memset) + .L_Z900_18: + mvc 1(1,%r1),0(%r1) + #ifdef USE_MULTIARCH +-END(memset_z900) ++END(__memset_z900) + #else + END(memset) + libc_hidden_builtin_def (memset) +diff --git a/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c b/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c +index 8db2c38..b6be970 100644 +--- a/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c ++++ b/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c +@@ -28,17 +28,17 @@ + #define IFUNC_RESOLVE(FUNC) \ + asm (".globl " #FUNC "\n\t" \ + ".type " #FUNC ",@gnu_indirect_function\n\t" \ +- ".set " #FUNC ",resolve_" #FUNC "\n\t" \ ++ ".set " #FUNC ",__resolve_" #FUNC "\n\t" \ + ".globl __GI_" #FUNC "\n\t" \ + ".set __GI_" #FUNC "," #FUNC "\n"); \ + \ + /* Make the declarations of the optimized functions hidden in order + to prevent GOT slots being generated for them. */ \ +- extern void *FUNC##_z196 attribute_hidden; \ +- extern void *FUNC##_z10 attribute_hidden; \ +- extern void *FUNC##_z900 attribute_hidden; \ ++ extern void *__##FUNC##_z196 attribute_hidden; \ ++ extern void *__##FUNC##_z10 attribute_hidden; \ ++ extern void *__##FUNC##_z900 attribute_hidden; \ + \ +- void *resolve_##FUNC (unsigned long int dl_hwcap) \ ++ void *__resolve_##FUNC (unsigned long int dl_hwcap) \ + { \ + if (dl_hwcap & HWCAP_S390_STFLE) \ + { \ +@@ -54,14 +54,14 @@ + : : "cc"); \ + \ + if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z196))) != 0) \ +- return &FUNC##_z196; \ ++ return &__##FUNC##_z196; \ + else if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z10))) != 0) \ +- return &FUNC##_z10; \ ++ return &__##FUNC##_z10; \ + else \ +- return &FUNC##_z900; \ ++ return &__##FUNC##_z900; \ + } \ + else \ +- return &FUNC##_z900; \ ++ return &__##FUNC##_z900; \ + } + + IFUNC_RESOLVE(memset) +diff --git a/sysdeps/s390/s390-64/multiarch/memcmp.S b/sysdeps/s390/s390-64/multiarch/memcmp.S +index f40a3c1..9a8cba8 100644 +--- a/sysdeps/s390/s390-64/multiarch/memcmp.S ++++ b/sysdeps/s390/s390-64/multiarch/memcmp.S +@@ -29,7 +29,7 @@ + + #ifndef NOT_IN_libc + +-ENTRY(memcmp_z196) ++ENTRY(__memcmp_z196) + .machine "z196" + ltgr %r4,%r4 + je .L_Z196_4 +@@ -60,9 +60,9 @@ ENTRY(memcmp_z196) + br %r14 + .L_Z196_14: + clc 0(1,%r3),0(%r2) +-END(memcmp_z196) ++END(__memcmp_z196) + +-ENTRY(memcmp_z10) ++ENTRY(__memcmp_z10) + .machine "z10" + ltgr %r4,%r4 + je .L_Z10_4 +@@ -87,7 +87,7 @@ ENTRY(memcmp_z10) + j .L_Z10_3 + .L_Z10_15: + clc 0(1,%r3),0(%r2) +-END(memcmp_z10) ++END(__memcmp_z10) + + #endif + +@@ -95,7 +95,7 @@ END(memcmp_z10) + + #ifdef NOT_IN_libc + .globl memcmp +-.set memcmp,memcmp_z900 ++.set memcmp,__memcmp_z900 + .weak bcmp +-.set bcmp,memcmp_z900 ++.set bcmp,__memcmp_z900 + #endif +diff --git a/sysdeps/s390/s390-64/multiarch/memcpy.S b/sysdeps/s390/s390-64/multiarch/memcpy.S +index b00ffc1..525588f 100644 +--- a/sysdeps/s390/s390-64/multiarch/memcpy.S ++++ b/sysdeps/s390/s390-64/multiarch/memcpy.S +@@ -29,7 +29,7 @@ + + #if defined SHARED && !defined NOT_IN_libc + +-ENTRY(memcpy_z196) ++ENTRY(__memcpy_z196) + .machine "z196" + ltgr %r4,%r4 + je .L_Z196_4 +@@ -44,7 +44,7 @@ ENTRY(memcpy_z196) + br %r14 + .L_Z196_5: + cgfi %r5,262144 # Switch to mvcle for copies >64MB +- jh memcpy_mvcle ++ jh __memcpy_mvcle + .L_Z196_2: + pfd 1,768(%r3) + pfd 2,768(%r1) +@@ -56,9 +56,9 @@ ENTRY(memcpy_z196) + j .L_Z196_3 + .L_Z196_14: + mvc 0(1,%r1),0(%r3) +-END(memcpy_z196) ++END(__memcpy_z196) + +-ENTRY(memcpy_z10) ++ENTRY(__memcpy_z10) + .machine "z10" + cgije %r4,0,.L_Z10_4 + aghi %r4,-1 +@@ -71,7 +71,7 @@ ENTRY(memcpy_z10) + br %r14 + .L_Z10_13: + cgfi %r5,65535 # Switch to mvcle for copies >16MB +- jh memcpy_mvcle ++ jh __memcpy_mvcle + .L_Z10_12: + pfd 1,768(%r3) + pfd 2,768(%r1) +@@ -82,7 +82,7 @@ ENTRY(memcpy_z10) + j .L_Z10_3 + .L_Z10_15: + mvc 0(1,%r1),0(%r3) +-END(memcpy_z10) ++END(__memcpy_z10) + + #endif + +@@ -90,5 +90,5 @@ END(memcpy_z10) + + #if !defined SHARED || defined NOT_IN_libc + .globl memcpy +-.set memcpy,memcpy_z900 ++.set memcpy,__memcpy_z900 + #endif +diff --git a/sysdeps/s390/s390-64/multiarch/memset.S b/sysdeps/s390/s390-64/multiarch/memset.S +index 1f9064d..8dbb3cb 100644 +--- a/sysdeps/s390/s390-64/multiarch/memset.S ++++ b/sysdeps/s390/s390-64/multiarch/memset.S +@@ -29,7 +29,7 @@ + + #ifndef NOT_IN_libc + +-ENTRY(memset_z196) ++ENTRY(__memset_z196) + .machine "z196" + ltgr %r4,%r4 + je .L_Z196_4 +@@ -47,7 +47,7 @@ ENTRY(memset_z196) + br %r14 + .L_Z196_1: + cgfi %r5,1048576 +- jh memset_mvcle # Switch to mvcle for >256MB ++ jh __memset_mvcle # Switch to mvcle for >256MB + .L_Z196_2: + pfd 2,1024(%r1) + mvc 1(256,%r1),0(%r1) +@@ -57,9 +57,9 @@ ENTRY(memset_z196) + j .L_Z196_3 + .L_Z196_17: + mvc 1(1,%r1),0(%r1) +-END(memset_z196) ++END(__memset_z196) + +-ENTRY(memset_z10) ++ENTRY(__memset_z10) + .machine "z10" + cgije %r4,0,.L_Z10_4 + stc %r3,0(%r2) +@@ -74,7 +74,7 @@ ENTRY(memset_z10) + br %r14 + .L_Z10_15: + cgfi %r5,163840 # Switch to mvcle for >40MB +- jh memset_mvcle ++ jh __memset_mvcle + .L_Z10_14: + pfd 2,1024(%r1) + mvc 1(256,%r1),0(%r1) +@@ -83,9 +83,9 @@ ENTRY(memset_z10) + j .L_Z10_3 + .L_Z10_18: + mvc 1(1,%r1),0(%r1) +-END(memset_z10) ++END(__memset_z10) + +-ENTRY(memset_mvcle) ++ENTRY(__memset_mvcle) + aghi %r4,2 # take back the change done by the caller + lgr %r0,%r2 # save source address + lgr %r1,%r3 # move pad byte to R1 +@@ -97,7 +97,7 @@ ENTRY(memset_mvcle) + lgr %r2,%r0 # return value is source address + .L1: + br %r14 +-END(memset_mvcle) ++END(__memset_mvcle) + + #endif + +@@ -105,5 +105,5 @@ END(memset_mvcle) + + #ifdef NOT_IN_libc + .globl memset +-.set memset,memset_z900 ++.set memset,__memset_z900 + #endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-30.patch b/SOURCES/glibc-rh1268008-30.patch new file mode 100644 index 0000000..b1af602 --- /dev/null +++ b/SOURCES/glibc-rh1268008-30.patch @@ -0,0 +1,292 @@ +From 250962053fadd0911accad515802d9b957c9d019 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 13:24:58 +0200 +Subject: [PATCH 30/30] S390: Optimize memrchr. + +upstream-commit-id: 798f5b4b5d24e5687dd55acc535954ed1d59c10c +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00092.html + +This patch provides optimized version of memrchr with the z13 vector +instructions. + +ChangeLog: + + * sysdeps/s390/multiarch/memrchr-c.c: New File. + * sysdeps/s390/multiarch/memrchr-vx.S: Likewise. + * sysdeps/s390/multiarch/memrchr.c: Likewise. + * sysdeps/s390/multiarch/Makefile + (sysdep_routines): Add memrchr functions. + * sysdeps/s390/multiarch/ifunc-impl-list-common.c + (__libc_ifunc_impl_list_common): Add ifunc test for memrchr. +--- + sysdeps/s390/multiarch/Makefile | 3 +- + sysdeps/s390/multiarch/ifunc-impl-list.c | 2 + + sysdeps/s390/multiarch/memrchr-c.c | 25 +++++ + sysdeps/s390/multiarch/memrchr-vx.S | 160 +++++++++++++++++++++++++++++++ + sysdeps/s390/multiarch/memrchr.c | 28 ++++++ + 5 files changed, 217 insertions(+), 1 deletion(-) + create mode 100644 sysdeps/s390/multiarch/memrchr-c.c + create mode 100644 sysdeps/s390/multiarch/memrchr-vx.S + create mode 100644 sysdeps/s390/multiarch/memrchr.c + +diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile +index 929a545..0805b07 100644 +--- a/sysdeps/s390/multiarch/Makefile ++++ b/sysdeps/s390/multiarch/Makefile +@@ -17,7 +17,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ + strcspn strcspn-vx strcspn-c \ + memchr memchr-vx \ + rawmemchr rawmemchr-vx rawmemchr-c \ +- memccpy memccpy-vx memccpy-c ++ memccpy memccpy-vx memccpy-c \ ++ memrchr memrchr-vx memrchr-c + endif + + ifeq ($(subdir),wcsmbs) +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +index 5ea258b..c235bdc 100644 +--- a/sysdeps/s390/multiarch/ifunc-impl-list.c ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -137,6 +137,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + + IFUNC_VX_IMPL (wmemcmp); + ++ IFUNC_VX_IMPL (memrchr); ++ + #endif /* HAVE_S390_VX_ASM_SUPPORT */ + + return i; +diff --git a/sysdeps/s390/multiarch/memrchr-c.c b/sysdeps/s390/multiarch/memrchr-c.c +new file mode 100644 +index 0000000..6a32861 +--- /dev/null ++++ b/sysdeps/s390/multiarch/memrchr-c.c +@@ -0,0 +1,25 @@ ++/* Default memrchr implementation for S/390. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# define MEMRCHR __memrchr_c ++ ++# include ++extern __typeof (__memrchr) __memrchr_c; ++# include ++#endif +diff --git a/sysdeps/s390/multiarch/memrchr-vx.S b/sysdeps/s390/multiarch/memrchr-vx.S +new file mode 100644 +index 0000000..da6dbdf +--- /dev/null ++++ b/sysdeps/s390/multiarch/memrchr-vx.S +@@ -0,0 +1,160 @@ ++/* Vector optimized 32/64 bit S/390 version of memrchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++ ++# include "sysdep.h" ++# include "asm-syntax.h" ++ ++ .text ++ ++/* void *memrchr (const void *s, int c, size_t n) ++ Scans memory for character c backwards ++ and returns pointer to first c. ++ ++ Register usage: ++ -r0=tmp ++ -r1=tmp ++ -r2=s ++ -r3=c ++ -r4=n ++ -r5=s in loop ++ ++ -v16=part of s ++ -v17=index of found c ++ -v18=c replicated ++ -v20=permute pattern ++*/ ++ENTRY(__memrchr_vx) ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ ++# if !defined __s390x__ ++ llgfr %r4,%r4 ++# endif /* !defined __s390x__ */ ++ clgije %r4,0,.Lnot_found ++ ++ vlvgb %v18,%r3,0 /* Generate vector which elements are all c. ++ If c > 255, c will be truncated. */ ++ vrepb %v18,%v18,0 ++ ++ llcr %r3,%r3 /* char c_char = (char) c. */ ++ ++ /* check byte n - 1. */ ++ llc %r0,-1(%r4,%r2) ++ slgfi %r4,1 ++ clrje %r0,%r3,.Lfound_end ++ jh .Lnot_found /* Return NULL if n is now 0. */ ++ ++ larl %r1,.Lpermute_mask /* Load permute mask. */ ++ vl %v20,0(%r1) ++ ++ /* check byte n - 2. */ ++ llc %r0,-1(%r4,%r2) ++ slgfi %r4,1 ++ clrje %r0,%r3,.Lfound_end ++ jh .Lnot_found /* Return NULL if n is now 0. */ ++ ++ clgijhe %r4,64,.Lloop64 /* If n >= 64 -> loop64. */ ++ ++.Llt64: ++ /* Process n < 64 bytes. */ ++ clgijl %r4,16,.Llt16 /* Jump away if n < 16. */ ++ aghi %r4,-16 ++ vl %v16,0(%r4,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lfound0 ++ clgijl %r4,16,.Llt16 ++ aghi %r4,-16 ++ vl %v16,0(%r4,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lfound0 ++ clgijl %r4,16,.Llt16 ++ aghi %r4,-16 ++ vl %v16,0(%r4,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lfound0 ++.Llt16: ++ clgfi %r4,0 /* if remaining bytes == 0, return NULL. */ ++ locghie %r2,0 ++ ber %r14 ++ ++ aghi %r4,-1 /* vll needs highest index. */ ++ vll %v16,%r4,0(%r2) /* Load remaining bytes. */ ++ ++ /* Right-shift of v16 to mask bytes after highest index. */ ++ lhi %r0,15 ++ slr %r0,%r4 /* Compute byte count for vector shift right. */ ++ sll %r0,3 /* Convert to bit count. */ ++ vlvgb %v17,%r0,7 ++ vsrlb %v16,%v16,%v17 /* Vector shift right by byte by number of bytes ++ specified in bits 1-4 of byte 7 in v17. */ ++ j .Lfound_permute ++ ++.Lfound48: ++ aghi %r4,16 ++.Lfound32: ++ aghi %r4,16 ++.Lfound16: ++ aghi %r4,16 ++.Lfound0: ++ la %r2,0(%r4,%r2) /* Set pointer to start of v16. */ ++ lghi %r4,15 /* Set highest index in v16 to last index. */ ++.Lfound_permute: ++ /* Search for a c in v16 in reversed byte order. v16 contains %r4 + 1 ++ bytes. If v16 was not fully loaded, the bytes are already ++ right shifted, so that the bytes in v16 can simply be reversed. */ ++ vperm %v16,%v16,%v16,%v20 /* Permute v16 to reversed order. */ ++ vfeeb %v16,%v16,%v18 /* Find c in reversed v16. */ ++ vlgvb %r1,%v16,7 /* Index of c or 16 if not found. */ ++ ++ /* Return NULL if there is no c in loaded bytes. */ ++ clrjh %r1,%r4,.Lnot_found ++ ++ slgr %r4,%r1 ++.Lfound_end: ++ la %r2,0(%r4,%r2) /* Return pointer to c. */ ++ br %r14 ++ ++.Lnot_found: ++ lghi %r2,0 ++ br %r14 ++ ++.Lpermute_mask: ++ .byte 0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08 ++ .byte 0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00 ++ ++.Lloop64: ++ aghi %r4,-64 ++ vl %v16,48(%r4,%r2) /* Load 16bytes of memory area. */ ++ vfeebs %v17,%v16,%v18 /* Find c. */ ++ jno .Lfound48 /* Jump away if c was found. */ ++ vl %v16,32(%r4,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lfound32 ++ vl %v16,16(%r4,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lfound16 ++ vl %v16,0(%r4,%r2) ++ vfeebs %v17,%v16,%v18 ++ jno .Lfound0 ++ ++ clgijhe %r4,64,.Lloop64 /* If n >= 64 -> loop64. */ ++ j .Llt64 ++END(__memrchr_vx) ++#endif /* HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc */ +diff --git a/sysdeps/s390/multiarch/memrchr.c b/sysdeps/s390/multiarch/memrchr.c +new file mode 100644 +index 0000000..6596067 +--- /dev/null ++++ b/sysdeps/s390/multiarch/memrchr.c +@@ -0,0 +1,28 @@ ++/* Multiple versions of memrchr. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc ++# include ++# include ++ ++s390_vx_libc_ifunc (__memrchr) ++weak_alias (__memrchr, memrchr) ++ ++#else ++# include ++#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && !defined NOT_IN_libc) */ +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-4.patch b/SOURCES/glibc-rh1268008-4.patch new file mode 100644 index 0000000..341cf3d --- /dev/null +++ b/SOURCES/glibc-rh1268008-4.patch @@ -0,0 +1,207 @@ +From aea6303d6c5fa276ea10887dab968ee0f3c79328 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:30:00 +0200 +Subject: [PATCH 04/30] S390: Fix handling of DXC-byte in FPC-register. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +upstream-commit-id: 5d96fe8c0dc3450bafe6c2aae2dabc76819df3e0 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00074.html + +On s390, the DXC(data-exception-code)-byte in FPC(floating-point-control)- +register contains a code of the last occured exception. +If bits 6 and 7 of DXC-byte are zero, the bits 0-5 correspond to the +ieee-exception flag bits. +The current implementation always uses these bits as ieee-exception flag bits. +fetestexcept() reports any exception after the first usage of a +vector-instruction in a process, because it raises an "vector instruction +exception" with DXC-code 0xFE. +This patch fixes the handling of the DXC-byte. The DXC-Byte is only handled +if bits 6 and 7 are zero. + +The #define _FPU_RESERVED is extended by the DXC-Byte. +Otherwise the tests math/test-fpucw-static and math/test-fpucw-ieee-static +fails, because DXC-Byte contains the vector instruction exception when reaching +main(). This exception was triggered by strrchr() call in __init_misc(). +__init_misc() is called after __setfpucw () in __libc_init_first(). + +The field __ieee_instruction_pointer in struct fenv_t is renamed to __unused +because it is a relict from commit "Remove PTRACE_PEEKUSER" +(87b9b50f0d4b92248905e95a06a13c513dc45e59) and isn´t used anymore. + +ChangeLog: + + [BZ #18610] + * sysdeps/s390/fpu/bits/fenv.h (fenv_t): Rename + __ieee_instruction_pointer to __unused. + * sysdeps/s390/fpu/fesetenv.c (__fesetenv): Remove usage of + __ieee_instruction_pointer. + * sysdeps/s390/fpu/fclrexcpt.c (feclearexcept): Fix dxc-field handling. + * sysdeps/s390/fpu/fgetexcptflg.c (fegetexceptflag): Likewise. + * sysdeps/s390/fpu/fsetexcptflg.c (fesetexceptflag): Likewise. + * sysdeps/s390/fpu/ftestexcept.c (fetestexcept): Likewise. + * sysdeps/s390/fpu/fpu_control.h (_FPU_RESERVED): + Mark dxc-field as reserved. +--- + sysdeps/s390/fpu/bits/fenv.h | 6 ++++-- + sysdeps/s390/fpu/fclrexcpt.c | 7 ++++++- + sysdeps/s390/fpu/fesetenv.c | 2 -- + sysdeps/s390/fpu/fgetexcptflg.c | 8 +++++++- + sysdeps/s390/fpu/fpu_control.h | 6 +++--- + sysdeps/s390/fpu/fsetexcptflg.c | 15 ++++++++++++--- + sysdeps/s390/fpu/ftestexcept.c | 12 +++++++++--- + 7 files changed, 41 insertions(+), 15 deletions(-) + +diff --git a/sysdeps/s390/fpu/bits/fenv.h b/sysdeps/s390/fpu/bits/fenv.h +index 88c6f7a..93177dc 100644 +--- a/sysdeps/s390/fpu/bits/fenv.h ++++ b/sysdeps/s390/fpu/bits/fenv.h +@@ -77,8 +77,10 @@ typedef unsigned int fexcept_t; /* size of fpc */ + typedef struct + { + fexcept_t __fpc; +- void *__ieee_instruction_pointer; +- /* failing instruction for ieee exceptions */ ++ void *__unused; ++ /* The field __unused (formerly __ieee_instruction_pointer) is a relict from ++ commit "Remove PTRACE_PEEKUSER" (87b9b50f0d4b92248905e95a06a13c513dc45e59) ++ and isn´t used anymore. */ + } fenv_t; + + /* If the default argument is used we use this value. */ +diff --git a/sysdeps/s390/fpu/fclrexcpt.c b/sysdeps/s390/fpu/fclrexcpt.c +index 3e8d9bb..c2647ba 100644 +--- a/sysdeps/s390/fpu/fclrexcpt.c ++++ b/sysdeps/s390/fpu/fclrexcpt.c +@@ -29,7 +29,12 @@ feclearexcept (int excepts) + + _FPU_GETCW (temp); + /* Clear the relevant bits. */ +- temp &= ~((excepts << FPC_DXC_SHIFT)|(excepts << FPC_FLAGS_SHIFT)); ++ temp &= ~(excepts << FPC_FLAGS_SHIFT); ++ if ((temp & FPC_NOT_FPU_EXCEPTION) == 0) ++ /* Bits 6, 7 of dxc-byte are zero, ++ thus bits 0-5 of dxc-byte correspond to the flag-bits. ++ Clear the relevant bits in flags and dxc-field. */ ++ temp &= ~(excepts << FPC_DXC_SHIFT); + + /* Put the new data in effect. */ + _FPU_SETCW (temp); +diff --git a/sysdeps/s390/fpu/fesetenv.c b/sysdeps/s390/fpu/fesetenv.c +index b534205..a4a0bb5 100644 +--- a/sysdeps/s390/fpu/fesetenv.c ++++ b/sysdeps/s390/fpu/fesetenv.c +@@ -32,12 +32,10 @@ fesetenv (const fenv_t *envp) + if (envp == FE_DFL_ENV) + { + env.__fpc = _FPU_DEFAULT; +- env.__ieee_instruction_pointer = 0; + } + else if (envp == FE_NOMASK_ENV) + { + env.__fpc = FPC_EXCEPTION_MASK; +- env.__ieee_instruction_pointer = 0; + } + else + env = (*envp); +diff --git a/sysdeps/s390/fpu/fgetexcptflg.c b/sysdeps/s390/fpu/fgetexcptflg.c +index 7457678..7941904 100644 +--- a/sysdeps/s390/fpu/fgetexcptflg.c ++++ b/sysdeps/s390/fpu/fgetexcptflg.c +@@ -27,7 +27,13 @@ fegetexceptflag (fexcept_t *flagp, int excepts) + + /* Get the current exceptions. */ + _FPU_GETCW (temp); +- newexcepts = (excepts << FPC_DXC_SHIFT) | (excepts << FPC_FLAGS_SHIFT); ++ newexcepts = excepts << FPC_FLAGS_SHIFT; ++ if ((temp & FPC_NOT_FPU_EXCEPTION) == 0) ++ /* Bits 6, 7 of dxc-byte are zero, ++ thus bits 0-5 of dxc-byte correspond to the flag-bits. ++ Evaluate flags and last dxc-exception-code. */ ++ newexcepts |= excepts << FPC_DXC_SHIFT; ++ + *flagp = temp & newexcepts; + + /* Success. */ +diff --git a/sysdeps/s390/fpu/fpu_control.h b/sysdeps/s390/fpu/fpu_control.h +index af81bc2..dba904d 100644 +--- a/sysdeps/s390/fpu/fpu_control.h ++++ b/sysdeps/s390/fpu/fpu_control.h +@@ -19,12 +19,12 @@ + . */ + + #ifndef _FPU_CONTROL_H +-# define _FPU_CONTROL_H ++#define _FPU_CONTROL_H + +-# include ++#include + + /* These bits are reserved are not changed. */ +-# define _FPU_RESERVED 0x070700FC ++#define _FPU_RESERVED 0x0707FFFC + + /* The fdlibm code requires no interrupts for exceptions. Don't + change the rounding mode, it would break long double I/O! */ +diff --git a/sysdeps/s390/fpu/fsetexcptflg.c b/sysdeps/s390/fpu/fsetexcptflg.c +index aada675..85c68e8 100644 +--- a/sysdeps/s390/fpu/fsetexcptflg.c ++++ b/sysdeps/s390/fpu/fsetexcptflg.c +@@ -24,16 +24,25 @@ + int + fesetexceptflag (const fexcept_t *flagp, int excepts) + { +- fexcept_t temp,newexcepts; ++ fexcept_t temp, newexcepts; + + /* Get the current environment. We have to do this since we cannot + separately set the status word. */ + _FPU_GETCW (temp); + /* Install the new exception bits in the Accrued Exception Byte. */ + excepts = excepts & FE_ALL_EXCEPT; +- newexcepts = (excepts << FPC_DXC_SHIFT) | (excepts << FPC_FLAGS_SHIFT); ++ newexcepts = excepts << FPC_FLAGS_SHIFT; + temp &= ~newexcepts; +- temp |= *flagp & newexcepts; ++ if ((temp & FPC_NOT_FPU_EXCEPTION) == 0) ++ /* Bits 6, 7 of dxc-byte are zero, ++ thus bits 0-5 of dxc-byte correspond to the flag-bits. ++ Clear given exceptions in dxc-field. */ ++ temp &= ~(excepts << FPC_DXC_SHIFT); ++ ++ /* Integrate dxc-byte of flagp into flags. The dxc-byte of flagp contains ++ either an ieee-exception or 0 (see fegetexceptflag). */ ++ temp |= (*flagp | ((*flagp >> FPC_DXC_SHIFT) << FPC_FLAGS_SHIFT)) ++ & newexcepts; + + /* Store the new status word (along with the rest of the environment. + Possibly new exceptions are set but they won't get executed unless +diff --git a/sysdeps/s390/fpu/ftestexcept.c b/sysdeps/s390/fpu/ftestexcept.c +index 5594994..c36aefd 100644 +--- a/sysdeps/s390/fpu/ftestexcept.c ++++ b/sysdeps/s390/fpu/ftestexcept.c +@@ -23,11 +23,17 @@ + int + fetestexcept (int excepts) + { +- fexcept_t temp; ++ fexcept_t temp, res; + + /* Get current exceptions. */ + _FPU_GETCW (temp); +- temp = (temp >> FPC_DXC_SHIFT) | (temp >> FPC_FLAGS_SHIFT); +- return temp & excepts & FE_ALL_EXCEPT; ++ res = temp >> FPC_FLAGS_SHIFT; ++ if ((temp & FPC_NOT_FPU_EXCEPTION) == 0) ++ /* Bits 6, 7 of dxc-byte are zero, ++ thus bits 0-5 of dxc-byte correspond to the flag-bits. ++ Evaluate flags and last dxc-exception-code. */ ++ res |= temp >> FPC_DXC_SHIFT; ++ ++ return res & excepts & FE_ALL_EXCEPT; + } + libm_hidden_def (fetestexcept) +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-5.patch b/SOURCES/glibc-rh1268008-5.patch new file mode 100644 index 0000000..da86d5e --- /dev/null +++ b/SOURCES/glibc-rh1268008-5.patch @@ -0,0 +1,2342 @@ +From 6db8663b21a826cbf689a297a898675078256166 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:44:39 +0200 +Subject: [PATCH 05/30] S390: Refactor ifunc implementations and enable + ifunc-test-framework. + +upstream-commit-id: 31556246c3ac168a2dfec8f9036d913765bbb73d +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00088.html + +On s390 all ifunc resolvers were implemented in multiarch/ifunc-resolve.c. +The resulting single object files has undefined references to all ifunc-functions. +This patch introduces one multiarch/.c file for each of memcpy, memcmp +and memset with the function specific ifunc resolver. The different function +implementations are now implemented in multiarch/-s390x.S +(moved from multiarch/.S). + +The new multiarch/ifunc-resolve.h file contains the ifunc-resolver macro +and other helper-macros. They are merged and are now used in common for +32/64bit. Therefore the ___g5/___z900 functions were renamed to +___default. + +This patch also enables testing the ifunc implementations by implementing +the function __libc_ifunc_impl_list. It uses the helper-macros of ifunc-resolve.h. + +ChangeLog: + + * sysdeps/s390/s390-32/multiarch/Makefile (sysdep_routines): + Remove ifunc-resolve, add memset-s390, memcpy-s390, memcmp-s390. + * sysdeps/s390/s390-32/multiarch/ifunc-resolve.c: Delete File. + * sysdeps/s390/s390-32/multiarch/memcmp.S: Move to ... + * sysdeps/s390/s390-32/multiarch/memcmp-s390.S: ... here. + (memcmp, bcmp): Use __memcmp_default as alias source. + * sysdeps/s390/s390-32/multiarch/memcmp.c: New File. + * sysdeps/s390/s390-32/memcmp.S (__memcmp_g5): + Rename to __memcmp_default. + * sysdeps/s390/s390-32/multiarch/memcpy.S: Move to ... + * sysdeps/s390/s390-32/multiarch/memcpy-s390.S: ... here. + (memcpy): Use __memcpy_default as alias source. + * sysdeps/s390/s390-32/multiarch/memcpy.c: New File. + * sysdeps/s390/s390-32/memcpy.S (__memcpy_g5): + Rename to __memcpy_default. + * sysdeps/s390/s390-32/multiarch/memset.S: Move to ... + * sysdeps/s390/s390-32/multiarch/memset-s390.S: ... here. + (memset): Use __memset_default as alias source. + * sysdeps/s390/s390-32/multiarch/memset.c: New File. + * sysdeps/s390/s390-32/memset.S (__memset_g5): + Rename to __memset_default. + * sysdeps/s390/s390-64/multiarch/Makefile (sysdep_routines): + Remove ifunc-resolve, add memset-s390x, memcpy-s390x, memcmp-s390x. + * sysdeps/s390/s390-64/multiarch/ifunc-resolve.c: Delete File. + * sysdeps/s390/s390-64/multiarch/memcmp.S: Move to ... + * sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: ... here. + (memcmp, bcmp): Use __memcmp_default as alias source. + * sysdeps/s390/s390-64/multiarch/memcmp.c: New File. + * sysdeps/s390/s390-64/memcmp.S (__memcmp_z900): + Rename to __memcmp_default. + * sysdeps/s390/s390-64/multiarch/memcpy.S: Move to ... + * sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: ... here. + (memcpy): Use __memcpy_default as alias source. + * sysdeps/s390/s390-64/multiarch/memcpy.c: New File. + * sysdeps/s390/s390-64/memcpy.S (__memcpy_z900): + Rename to __memcpy_default. + * sysdeps/s390/s390-64/multiarch/memset.S: Move to ... + * sysdeps/s390/s390-64/multiarch/memset-s390x.S: ... here. + (memset): Use __memset_default as alias source. + * sysdeps/s390/s390-64/multiarch/memset.c: New File. + * sysdeps/s390/s390-64/memset.S (__memset_z900): + Rename to __memset_default. + * sysdeps/s390/multiarch/ifunc-resolve.h: New File. + * sysdeps/s390/multiarch/ifunc-impl-list.c: New File. +--- + sysdeps/s390/multiarch/ifunc-impl-list.c | 74 ++++++++++++++++ + sysdeps/s390/multiarch/ifunc-resolve.h | 75 ++++++++++++++++ + sysdeps/s390/s390-32/memcmp.S | 46 +++++----- + sysdeps/s390/s390-32/memcpy.S | 50 +++++------ + sysdeps/s390/s390-32/memset.S | 44 +++++----- + sysdeps/s390/s390-32/multiarch/Makefile | 3 +- + sysdeps/s390/s390-32/multiarch/ifunc-resolve.c | 72 ---------------- + sysdeps/s390/s390-32/multiarch/memcmp-s390.S | 104 +++++++++++++++++++++++ + sysdeps/s390/s390-32/multiarch/memcmp.S | 104 ----------------------- + sysdeps/s390/s390-32/multiarch/memcmp.c | 24 ++++++ + sysdeps/s390/s390-32/multiarch/memcpy-s390.S | 98 +++++++++++++++++++++ + sysdeps/s390/s390-32/multiarch/memcpy.S | 98 --------------------- + sysdeps/s390/s390-32/multiarch/memcpy.c | 24 ++++++ + sysdeps/s390/s390-32/multiarch/memset-s390.S | 113 +++++++++++++++++++++++++ + sysdeps/s390/s390-32/multiarch/memset.S | 113 ------------------------- + sysdeps/s390/s390-32/multiarch/memset.c | 23 +++++ + sysdeps/s390/s390-64/memcmp.S | 42 ++++----- + sysdeps/s390/s390-64/memcpy.S | 40 ++++----- + sysdeps/s390/s390-64/memset.S | 40 ++++----- + sysdeps/s390/s390-64/multiarch/Makefile | 3 +- + sysdeps/s390/s390-64/multiarch/ifunc-resolve.c | 76 ----------------- + sysdeps/s390/s390-64/multiarch/memcmp-s390x.S | 101 ++++++++++++++++++++++ + sysdeps/s390/s390-64/multiarch/memcmp.S | 101 ---------------------- + sysdeps/s390/s390-64/multiarch/memcmp.c | 24 ++++++ + sysdeps/s390/s390-64/multiarch/memcpy-s390x.S | 94 ++++++++++++++++++++ + sysdeps/s390/s390-64/multiarch/memcpy.S | 94 -------------------- + sysdeps/s390/s390-64/multiarch/memcpy.c | 24 ++++++ + sysdeps/s390/s390-64/multiarch/memset-s390x.S | 109 ++++++++++++++++++++++++ + sysdeps/s390/s390-64/multiarch/memset.S | 109 ------------------------ + sysdeps/s390/s390-64/multiarch/memset.c | 23 +++++ + 30 files changed, 1045 insertions(+), 900 deletions(-) + create mode 100644 sysdeps/s390/multiarch/ifunc-impl-list.c + create mode 100644 sysdeps/s390/multiarch/ifunc-resolve.h + delete mode 100644 sysdeps/s390/s390-32/multiarch/ifunc-resolve.c + create mode 100644 sysdeps/s390/s390-32/multiarch/memcmp-s390.S + delete mode 100644 sysdeps/s390/s390-32/multiarch/memcmp.S + create mode 100644 sysdeps/s390/s390-32/multiarch/memcmp.c + create mode 100644 sysdeps/s390/s390-32/multiarch/memcpy-s390.S + delete mode 100644 sysdeps/s390/s390-32/multiarch/memcpy.S + create mode 100644 sysdeps/s390/s390-32/multiarch/memcpy.c + create mode 100644 sysdeps/s390/s390-32/multiarch/memset-s390.S + delete mode 100644 sysdeps/s390/s390-32/multiarch/memset.S + create mode 100644 sysdeps/s390/s390-32/multiarch/memset.c + delete mode 100644 sysdeps/s390/s390-64/multiarch/ifunc-resolve.c + create mode 100644 sysdeps/s390/s390-64/multiarch/memcmp-s390x.S + delete mode 100644 sysdeps/s390/s390-64/multiarch/memcmp.S + create mode 100644 sysdeps/s390/s390-64/multiarch/memcmp.c + create mode 100644 sysdeps/s390/s390-64/multiarch/memcpy-s390x.S + delete mode 100644 sysdeps/s390/s390-64/multiarch/memcpy.S + create mode 100644 sysdeps/s390/s390-64/multiarch/memcpy.c + create mode 100644 sysdeps/s390/s390-64/multiarch/memset-s390x.S + delete mode 100644 sysdeps/s390/s390-64/multiarch/memset.S + create mode 100644 sysdeps/s390/s390-64/multiarch/memset.c + +diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c +new file mode 100644 +index 0000000..c330904 +--- /dev/null ++++ b/sysdeps/s390/multiarch/ifunc-impl-list.c +@@ -0,0 +1,74 @@ ++/* Enumerate available IFUNC implementations of a function. s390/s390x version. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++/* Maximum number of IFUNC implementations. */ ++#define MAX_IFUNC 3 ++ ++/* Fill ARRAY of MAX elements with IFUNC implementations for function ++ NAME supported on target machine and return the number of valid ++ entries. */ ++size_t ++__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, ++ size_t max) ++{ ++ assert (max >= MAX_IFUNC); ++ ++ size_t i = 0; ++ ++ /* Get hardware information. */ ++ unsigned long int dl_hwcap = GLRO (dl_hwcap); ++ unsigned long long stfle_bits = 0ULL; ++ if ((dl_hwcap & HWCAP_S390_STFLE) ++ && (dl_hwcap & HWCAP_S390_ZARCH) ++ && (dl_hwcap & HWCAP_S390_HIGH_GPRS)) ++ { ++ S390_STORE_STFLE (stfle_bits); ++ } ++ ++ IFUNC_IMPL (i, name, memset, ++ IFUNC_IMPL_ADD (array, i, memset, ++ S390_IS_Z196 (stfle_bits), __memset_z196) ++ IFUNC_IMPL_ADD (array, i, memset, ++ S390_IS_Z10 (stfle_bits), __memset_z10) ++ IFUNC_IMPL_ADD (array, i, memset, 1, __memset_default)) ++ ++ IFUNC_IMPL (i, name, memcmp, ++ IFUNC_IMPL_ADD (array, i, memcmp, ++ S390_IS_Z196 (stfle_bits), __memcmp_z196) ++ IFUNC_IMPL_ADD (array, i, memcmp, ++ S390_IS_Z10 (stfle_bits), __memcmp_z10) ++ IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_default)) ++ ++#ifdef SHARED ++ ++ IFUNC_IMPL (i, name, memcpy, ++ IFUNC_IMPL_ADD (array, i, memcpy, ++ S390_IS_Z196 (stfle_bits), __memcpy_z196) ++ IFUNC_IMPL_ADD (array, i, memcpy, ++ S390_IS_Z10 (stfle_bits), __memcpy_z10) ++ IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_default)) ++ ++#endif /* SHARED */ ++ ++ return i; ++} +diff --git a/sysdeps/s390/multiarch/ifunc-resolve.h b/sysdeps/s390/multiarch/ifunc-resolve.h +new file mode 100644 +index 0000000..491df68 +--- /dev/null ++++ b/sysdeps/s390/multiarch/ifunc-resolve.h +@@ -0,0 +1,75 @@ ++/* IFUNC resolver function for CPU specific functions. ++ 32/64 bit S/390 version. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++#define S390_STFLE_BITS_Z10 34 /* General instructions extension */ ++#define S390_STFLE_BITS_Z196 45 /* Distinct operands, pop ... */ ++ ++#define S390_IS_Z196(STFLE_BITS) \ ++ ((STFLE_BITS & (1ULL << (63 - S390_STFLE_BITS_Z196))) != 0) ++ ++#define S390_IS_Z10(STFLE_BITS) \ ++ ((STFLE_BITS & (1ULL << (63 - S390_STFLE_BITS_Z10))) != 0) ++ ++#define S390_STORE_STFLE(STFLE_BITS) \ ++ /* We want just 1 double word to be returned. */ \ ++ register unsigned long reg0 asm("0") = 0; \ ++ \ ++ asm volatile(".machine push" "\n\t" \ ++ ".machine \"z9-109\"" "\n\t" \ ++ ".machinemode \"zarch_nohighgprs\"\n\t" \ ++ "stfle %0" "\n\t" \ ++ ".machine pop" "\n" \ ++ : "=QS" (STFLE_BITS), "+d" (reg0) \ ++ : : "cc"); ++ ++#define s390_libc_ifunc(FUNC) \ ++ asm (".globl " #FUNC "\n\t" \ ++ ".type " #FUNC ",@gnu_indirect_function\n\t" \ ++ ".set " #FUNC ",__resolve_" #FUNC "\n\t" \ ++ ".globl __GI_" #FUNC "\n\t" \ ++ ".set __GI_" #FUNC "," #FUNC "\n"); \ ++ \ ++ /* Make the declarations of the optimized functions hidden in order ++ to prevent GOT slots being generated for them. */ \ ++ extern void *__##FUNC##_z196 attribute_hidden; \ ++ extern void *__##FUNC##_z10 attribute_hidden; \ ++ extern void *__##FUNC##_default attribute_hidden; \ ++ \ ++ void *__resolve_##FUNC (unsigned long int dl_hwcap) \ ++ { \ ++ if ((dl_hwcap & HWCAP_S390_STFLE) \ ++ && (dl_hwcap & HWCAP_S390_ZARCH) \ ++ && (dl_hwcap & HWCAP_S390_HIGH_GPRS)) \ ++ { \ ++ unsigned long long stfle_bits; \ ++ S390_STORE_STFLE (stfle_bits); \ ++ \ ++ if (S390_IS_Z196 (stfle_bits)) \ ++ return &__##FUNC##_z196; \ ++ else if (S390_IS_Z10 (stfle_bits)) \ ++ return &__##FUNC##_z10; \ ++ else \ ++ return &__##FUNC##_default; \ ++ } \ ++ else \ ++ return &__##FUNC##_default; \ ++ } +diff --git a/sysdeps/s390/s390-32/memcmp.S b/sysdeps/s390/s390-32/memcmp.S +index b6eabe5..104e280 100644 +--- a/sysdeps/s390/s390-32/memcmp.S ++++ b/sysdeps/s390/s390-32/memcmp.S +@@ -27,38 +27,38 @@ + + .text + #ifdef USE_MULTIARCH +-ENTRY(__memcmp_g5) ++ENTRY(__memcmp_default) + #else + ENTRY(memcmp) + #endif + .machine "g5" +- basr %r5,0 ++ basr %r5,0 + .L_G5_16: +- ltr %r4,%r4 +- je .L_G5_4 +- ahi %r4,-1 +- lr %r1,%r4 +- srl %r1,8 +- ltr %r1,%r1 +- jne .L_G5_12 +- ex %r4,.L_G5_17-.L_G5_16(%r5) ++ ltr %r4,%r4 ++ je .L_G5_4 ++ ahi %r4,-1 ++ lr %r1,%r4 ++ srl %r1,8 ++ ltr %r1,%r1 ++ jne .L_G5_12 ++ ex %r4,.L_G5_17-.L_G5_16(%r5) + .L_G5_4: +- ipm %r2 +- sll %r2,2 +- sra %r2,30 +- br %r14 ++ ipm %r2 ++ sll %r2,2 ++ sra %r2,30 ++ br %r14 + .L_G5_12: +- clc 0(256,%r3),0(%r2) +- jne .L_G5_4 +- la %r3,256(%r3) +- la %r2,256(%r2) +- brct %r1,.L_G5_12 +- ex %r4,.L_G5_17-.L_G5_16(%r5) +- j .L_G5_4 ++ clc 0(256,%r3),0(%r2) ++ jne .L_G5_4 ++ la %r3,256(%r3) ++ la %r2,256(%r2) ++ brct %r1,.L_G5_12 ++ ex %r4,.L_G5_17-.L_G5_16(%r5) ++ j .L_G5_4 + .L_G5_17: +- clc 0(1,%r3),0(%r2) ++ clc 0(1,%r3),0(%r2) + #ifdef USE_MULTIARCH +-END(__memcmp_g5) ++END(__memcmp_default) + #else + END(memcmp) + libc_hidden_builtin_def (memcmp) +diff --git a/sysdeps/s390/s390-32/memcpy.S b/sysdeps/s390/s390-32/memcpy.S +index a3b1ace..6a2cf68 100644 +--- a/sysdeps/s390/s390-32/memcpy.S ++++ b/sysdeps/s390/s390-32/memcpy.S +@@ -26,41 +26,41 @@ + %r4 = number of bytes to copy. */ + + #ifdef USE_MULTIARCH +-ENTRY(__memcpy_g5) ++ENTRY(__memcpy_default) + #else + ENTRY(memcpy) + #endif + .machine "g5" +- st %r13,52(%r15) +- .cfi_offset 13, -44 +- basr %r13,0 ++ st %r13,52(%r15) ++ .cfi_offset 13, -44 ++ basr %r13,0 + .L_G5_16: +- ltr %r4,%r4 +- je .L_G5_4 +- ahi %r4,-1 +- lr %r5,%r4 +- srl %r5,8 +- ltr %r5,%r5 +- lr %r1,%r2 +- jne .L_G5_12 +- ex %r4,.L_G5_17-.L_G5_16(%r13) ++ ltr %r4,%r4 ++ je .L_G5_4 ++ ahi %r4,-1 ++ lr %r5,%r4 ++ srl %r5,8 ++ ltr %r5,%r5 ++ lr %r1,%r2 ++ jne .L_G5_12 ++ ex %r4,.L_G5_17-.L_G5_16(%r13) + .L_G5_4: +- l %r13,52(%r15) +- br %r14 ++ l %r13,52(%r15) ++ br %r14 + .L_G5_13: +- chi %r5,4096 # Switch to mvcle for copies >1MB +- jh __memcpy_mvcle ++ chi %r5,4096 # Switch to mvcle for copies >1MB ++ jh __memcpy_mvcle + .L_G5_12: +- mvc 0(256,%r1),0(%r3) +- la %r1,256(%r1) +- la %r3,256(%r3) +- brct %r5,.L_G5_12 +- ex %r4,.L_G5_17-.L_G5_16(%r13) +- j .L_G5_4 ++ mvc 0(256,%r1),0(%r3) ++ la %r1,256(%r1) ++ la %r3,256(%r3) ++ brct %r5,.L_G5_12 ++ ex %r4,.L_G5_17-.L_G5_16(%r13) ++ j .L_G5_4 + .L_G5_17: +- mvc 0(1,%r1),0(%r3) ++ mvc 0(1,%r1),0(%r3) + #ifdef USE_MULTIARCH +-END(__memcpy_g5) ++END(__memcpy_default) + #else + END(memcpy) + libc_hidden_builtin_def (memcpy) +diff --git a/sysdeps/s390/s390-32/memset.S b/sysdeps/s390/s390-32/memset.S +index a73dc6c..d363cf1 100644 +--- a/sysdeps/s390/s390-32/memset.S ++++ b/sysdeps/s390/s390-32/memset.S +@@ -28,37 +28,37 @@ + .text + + #ifdef USE_MULTIARCH +-ENTRY(__memset_g5) ++ENTRY(__memset_default) + #else + ENTRY(memset) + #endif + .machine "g5" +- basr %r5,0 ++ basr %r5,0 + .L_G5_19: +- ltr %r4,%r4 +- je .L_G5_4 +- stc %r3,0(%r2) +- chi %r4,1 +- lr %r1,%r2 +- je .L_G5_4 +- ahi %r4,-2 +- lr %r3,%r4 +- srl %r3,8 +- ltr %r3,%r3 +- jne .L_G5_14 +- ex %r4,.L_G5_20-.L_G5_19(%r5) ++ ltr %r4,%r4 ++ je .L_G5_4 ++ stc %r3,0(%r2) ++ chi %r4,1 ++ lr %r1,%r2 ++ je .L_G5_4 ++ ahi %r4,-2 ++ lr %r3,%r4 ++ srl %r3,8 ++ ltr %r3,%r3 ++ jne .L_G5_14 ++ ex %r4,.L_G5_20-.L_G5_19(%r5) + .L_G5_4: +- br %r14 ++ br %r14 + .L_G5_14: +- mvc 1(256,%r1),0(%r1) +- la %r1,256(%r1) +- brct %r3,.L_G5_14 +- ex %r4,.L_G5_20-.L_G5_19(%r5) +- j .L_G5_4 ++ mvc 1(256,%r1),0(%r1) ++ la %r1,256(%r1) ++ brct %r3,.L_G5_14 ++ ex %r4,.L_G5_20-.L_G5_19(%r5) ++ j .L_G5_4 + .L_G5_20: +- mvc 1(1,%r1),0(%r1) ++ mvc 1(1,%r1),0(%r1) + #ifdef USE_MULTIARCH +-END(__memset_g5) ++END(__memset_default) + #else + END(memset) + libc_hidden_builtin_def (memset) +diff --git a/sysdeps/s390/s390-32/multiarch/Makefile b/sysdeps/s390/s390-32/multiarch/Makefile +index 9baeecd..f8aee14 100644 +--- a/sysdeps/s390/s390-32/multiarch/Makefile ++++ b/sysdeps/s390/s390-32/multiarch/Makefile +@@ -1,3 +1,4 @@ + ifeq ($(subdir),string) +-sysdep_routines += ifunc-resolve memset memcpy memcmp ++sysdep_routines += memset memset-s390 memcpy memcpy-s390 \ ++ memcmp memcmp-s390 + endif +diff --git a/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c b/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c +deleted file mode 100644 +index 522c63c..0000000 +--- a/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c ++++ /dev/null +@@ -1,72 +0,0 @@ +-/* IFUNC resolver function for CPU specific functions. +- 32 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +- +-#define STFLE_BITS_Z10 34 /* General instructions extension */ +-#define STFLE_BITS_Z196 45 /* Distinct operands, pop ... */ +- +-#ifndef NOT_IN_libc +- +-#define IFUNC_RESOLVE(FUNC) \ +- asm (".globl " #FUNC "\n\t" \ +- ".type " #FUNC ",@gnu_indirect_function\n\t" \ +- ".set " #FUNC ",__resolve_" #FUNC "\n\t" \ +- ".globl __GI_" #FUNC "\n\t" \ +- ".set __GI_" #FUNC "," #FUNC "\n"); \ +- \ +- /* Make the declarations of the optimized functions hidden in order +- to prevent GOT slots being generated for them. */ \ +- extern void *__##FUNC##_z196 attribute_hidden; \ +- extern void *__##FUNC##_z10 attribute_hidden; \ +- extern void *__##FUNC##_g5 attribute_hidden; \ +- \ +- void *__resolve_##FUNC (unsigned long int dl_hwcap) \ +- { \ +- if ((dl_hwcap & HWCAP_S390_STFLE) \ +- && (dl_hwcap & HWCAP_S390_ZARCH) \ +- && (dl_hwcap & HWCAP_S390_HIGH_GPRS)) \ +- { \ +- /* We want just 1 double word to be returned. */ \ +- register unsigned long reg0 asm("0") = 0; \ +- unsigned long long stfle_bits; \ +- \ +- asm volatile(".insn s,0xb2b00000,%0" "\n\t" /* stfle */ \ +- : "=QS" (stfle_bits), "+d" (reg0) \ +- : : "cc"); \ +- \ +- if ((stfle_bits & (1ULL << (63 - STFLE_BITS_Z196))) != 0) \ +- return &__##FUNC##_z196; \ +- else if ((stfle_bits & (1ULL << (63 - STFLE_BITS_Z10))) != 0) \ +- return &__##FUNC##_z10; \ +- } \ +- return &__##FUNC##_g5; \ +- } +- +-IFUNC_RESOLVE(memset) +-IFUNC_RESOLVE(memcmp) +-asm(".weak bcmp ; bcmp = memcmp"); +- +-/* In the static lib memcpy is needed before the reloc is resolved. */ +-#ifdef SHARED +-IFUNC_RESOLVE(memcpy) +-#endif +- +-#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memcmp-s390.S b/sysdeps/s390/s390-32/multiarch/memcmp-s390.S +new file mode 100644 +index 0000000..b339aac +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/memcmp-s390.S +@@ -0,0 +1,104 @@ ++/* CPU specific memcmp implementations. 32 bit S/390 version. ++ Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++ ++#include "sysdep.h" ++#include "asm-syntax.h" ++ ++/* INPUT PARAMETERS ++ %r2 = address of first memory area ++ %r3 = address of second memory area ++ %r4 = number of bytes to compare. */ ++ ++ .text ++ ++#ifndef NOT_IN_libc ++ ++ENTRY(__memcmp_z196) ++ .machine "z196" ++ .machinemode "zarch_nohighgprs" ++ ltr %r4,%r4 ++ je .L_Z196_4 ++ ahi %r4,-1 ++ srlk %r1,%r4,8 ++ ltr %r1,%r1 ++ jne .L_Z196_2 ++.L_Z196_3: ++ exrl %r4,.L_Z196_14 ++.L_Z196_4: ++ ipm %r2 ++ sll %r2,2 ++ sra %r2,30 ++ br %r14 ++.L_Z196_17: ++ la %r3,256(%r3) ++ la %r2,256(%r2) ++ ahi %r1,-1 ++ je .L_Z196_3 ++.L_Z196_2: ++ pfd 1,512(%r3) ++ pfd 1,512(%r2) ++ clc 0(256,%r3),0(%r2) ++ je .L_Z196_17 ++ ipm %r2 ++ sll %r2,2 ++ sra %r2,30 ++ br %r14 ++.L_Z196_14: ++ clc 0(1,%r3),0(%r2) ++END(__memcmp_z196) ++ ++ENTRY(__memcmp_z10) ++ .machine "z10" ++ .machinemode "zarch_nohighgprs" ++ ltr %r4,%r4 ++ je .L_Z10_4 ++ ahi %r4,-1 ++ lr %r1,%r4 ++ srl %r1,8 ++ cijlh %r1,0,.L_Z10_12 ++.L_Z10_3: ++ exrl %r4,.L_Z10_15 ++.L_Z10_4: ++ ipm %r2 ++ sll %r2,2 ++ sra %r2,30 ++ br %r14 ++.L_Z10_12: ++ pfd 1,512(%r3) ++ pfd 1,512(%r2) ++ clc 0(256,%r3),0(%r2) ++ jne .L_Z10_4 ++ la %r3,256(%r3) ++ la %r2,256(%r2) ++ brct %r1,.L_Z10_12 ++ j .L_Z10_3 ++.L_Z10_15: ++ clc 0(1,%r3),0(%r2) ++END(__memcmp_z10) ++ ++#endif /* !NOT_IN_libc */ ++ ++#include "../memcmp.S" ++ ++#ifdef NOT_IN_libc ++.globl memcmp ++.set memcmp,__memcmp_default ++.weak bcmp ++.set bcmp,__memcmp_default ++#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memcmp.S b/sysdeps/s390/s390-32/multiarch/memcmp.S +deleted file mode 100644 +index c654d19..0000000 +--- a/sysdeps/s390/s390-32/multiarch/memcmp.S ++++ /dev/null +@@ -1,104 +0,0 @@ +-/* CPU specific memcmp implementations. 32 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +- +-#include "sysdep.h" +-#include "asm-syntax.h" +- +-/* INPUT PARAMETERS +- %r2 = address of first memory area +- %r3 = address of second memory area +- %r4 = number of bytes to compare. */ +- +- .text +- +-#ifndef NOT_IN_libc +- +-ENTRY(__memcmp_z196) +- .machine "z196" +- .machinemode "zarch_nohighgprs" +- ltr %r4,%r4 +- je .L_Z196_4 +- ahi %r4,-1 +- srlk %r1,%r4,8 +- ltr %r1,%r1 +- jne .L_Z196_2 +-.L_Z196_3: +- exrl %r4,.L_Z196_14 +-.L_Z196_4: +- ipm %r2 +- sll %r2,2 +- sra %r2,30 +- br %r14 +-.L_Z196_17: +- la %r3,256(%r3) +- la %r2,256(%r2) +- ahi %r1,-1 +- je .L_Z196_3 +-.L_Z196_2: +- pfd 1,512(%r3) +- pfd 1,512(%r2) +- clc 0(256,%r3),0(%r2) +- je .L_Z196_17 +- ipm %r2 +- sll %r2,2 +- sra %r2,30 +- br %r14 +-.L_Z196_14: +- clc 0(1,%r3),0(%r2) +-END(__memcmp_z196) +- +-ENTRY(__memcmp_z10) +- .machine "z10" +- .machinemode "zarch_nohighgprs" +- ltr %r4,%r4 +- je .L_Z10_4 +- ahi %r4,-1 +- lr %r1,%r4 +- srl %r1,8 +- cijlh %r1,0,.L_Z10_12 +-.L_Z10_3: +- exrl %r4,.L_Z10_15 +-.L_Z10_4: +- ipm %r2 +- sll %r2,2 +- sra %r2,30 +- br %r14 +-.L_Z10_12: +- pfd 1,512(%r3) +- pfd 1,512(%r2) +- clc 0(256,%r3),0(%r2) +- jne .L_Z10_4 +- la %r3,256(%r3) +- la %r2,256(%r2) +- brct %r1,.L_Z10_12 +- j .L_Z10_3 +-.L_Z10_15: +- clc 0(1,%r3),0(%r2) +-END(__memcmp_z10) +- +-#endif +- +-#include "../memcmp.S" +- +-#ifdef NOT_IN_libc +-.globl memcmp +-.set memcmp,__memcmp_g5 +-.weak bcmp +-.set bcmp,__memcmp_g5 +-#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memcmp.c b/sysdeps/s390/s390-32/multiarch/memcmp.c +new file mode 100644 +index 0000000..7089d56 +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/memcmp.c +@@ -0,0 +1,24 @@ ++/* Multiple versions of memcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef NOT_IN_libc ++# include ++ ++s390_libc_ifunc (memcmp) ++asm(".weak bcmp ; bcmp = memcmp"); ++#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memcpy-s390.S b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S +new file mode 100644 +index 0000000..f6e0fea +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S +@@ -0,0 +1,98 @@ ++/* CPU specific memcpy implementations. 32 bit S/390 version. ++ Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++ ++#include "sysdep.h" ++#include "asm-syntax.h" ++ ++/* INPUT PARAMETERS ++ %r2 = target operands address ++ %r3 = source operands address ++ %r4 = number of bytes to copy. */ ++ ++ .text ++ ++#if defined SHARED && !defined NOT_IN_libc ++ ++ENTRY(__memcpy_z196) ++ .machine "z196" ++ .machinemode "zarch_nohighgprs" ++ llgfr %r4,%r4 ++ ltgr %r4,%r4 ++ je .L_Z196_4 ++ aghi %r4,-1 ++ lr %r1,%r2 ++ srlg %r5,%r4,8 ++ ltgr %r5,%r5 ++ jne .L_Z196_5 ++.L_Z196_3: ++ exrl %r4,.L_Z196_14 ++.L_Z196_4: ++ br %r14 ++.L_Z196_5: ++ cgfi %r5,262144 # Switch to mvcle for copies >64MB ++ jh __memcpy_mvcle ++.L_Z196_2: ++ pfd 1,768(%r3) ++ pfd 2,768(%r1) ++ mvc 0(256,%r1),0(%r3) ++ aghi %r5,-1 ++ la %r1,256(%r1) ++ la %r3,256(%r3) ++ jne .L_Z196_2 ++ j .L_Z196_3 ++.L_Z196_14: ++ mvc 0(1,%r1),0(%r3) ++END(__memcpy_z196) ++ ++ENTRY(__memcpy_z10) ++ .machine "z10" ++ .machinemode "zarch_nohighgprs" ++ llgfr %r4,%r4 ++ cgije %r4,0,.L_Z10_4 ++ aghi %r4,-1 ++ lr %r1,%r2 ++ srlg %r5,%r4,8 ++ cgijlh %r5,0,.L_Z10_13 ++.L_Z10_3: ++ exrl %r4,.L_Z10_15 ++.L_Z10_4: ++ br %r14 ++.L_Z10_13: ++ cgfi %r5,65535 # Switch to mvcle for copies >16MB ++ jh __memcpy_mvcle ++.L_Z10_12: ++ pfd 1,768(%r3) ++ pfd 2,768(%r1) ++ mvc 0(256,%r1),0(%r3) ++ la %r1,256(%r1) ++ la %r3,256(%r3) ++ brctg %r5,.L_Z10_12 ++ j .L_Z10_3 ++.L_Z10_15: ++ mvc 0(1,%r1),0(%r3) ++END(__memcpy_z10) ++ ++#endif /* SHARED && !defined NOT_IN_libc */ ++ ++#include "../memcpy.S" ++ ++#if !defined SHARED || defined NOT_IN_libc ++.globl memcpy ++.set memcpy,__memcpy_default ++#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memcpy.S b/sysdeps/s390/s390-32/multiarch/memcpy.S +deleted file mode 100644 +index 5c2113f..0000000 +--- a/sysdeps/s390/s390-32/multiarch/memcpy.S ++++ /dev/null +@@ -1,98 +0,0 @@ +-/* CPU specific memcpy implementations. 32 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +- +-#include "sysdep.h" +-#include "asm-syntax.h" +- +-/* INPUT PARAMETERS +- %r2 = target operands address +- %r3 = source operands address +- %r4 = number of bytes to copy. */ +- +- .text +- +-#if defined SHARED && !defined NOT_IN_libc +- +-ENTRY(__memcpy_z196) +- .machine "z196" +- .machinemode "zarch_nohighgprs" +- llgfr %r4,%r4 +- ltgr %r4,%r4 +- je .L_Z196_4 +- aghi %r4,-1 +- lr %r1,%r2 +- srlg %r5,%r4,8 +- ltgr %r5,%r5 +- jne .L_Z196_5 +-.L_Z196_3: +- exrl %r4,.L_Z196_14 +-.L_Z196_4: +- br %r14 +-.L_Z196_5: +- cgfi %r5,262144 # Switch to mvcle for copies >64MB +- jh __memcpy_mvcle +-.L_Z196_2: +- pfd 1,768(%r3) +- pfd 2,768(%r1) +- mvc 0(256,%r1),0(%r3) +- aghi %r5,-1 +- la %r1,256(%r1) +- la %r3,256(%r3) +- jne .L_Z196_2 +- j .L_Z196_3 +-.L_Z196_14: +- mvc 0(1,%r1),0(%r3) +-END(__memcpy_z196) +- +-ENTRY(__memcpy_z10) +- .machine "z10" +- .machinemode "zarch_nohighgprs" +- llgfr %r4,%r4 +- cgije %r4,0,.L_Z10_4 +- aghi %r4,-1 +- lr %r1,%r2 +- srlg %r5,%r4,8 +- cgijlh %r5,0,.L_Z10_13 +-.L_Z10_3: +- exrl %r4,.L_Z10_15 +-.L_Z10_4: +- br %r14 +-.L_Z10_13: +- cgfi %r5,65535 # Switch to mvcle for copies >16MB +- jh __memcpy_mvcle +-.L_Z10_12: +- pfd 1,768(%r3) +- pfd 2,768(%r1) +- mvc 0(256,%r1),0(%r3) +- la %r1,256(%r1) +- la %r3,256(%r3) +- brctg %r5,.L_Z10_12 +- j .L_Z10_3 +-.L_Z10_15: +- mvc 0(1,%r1),0(%r3) +-END(__memcpy_z10) +- +-#endif +- +-#include "../memcpy.S" +- +-#if !defined SHARED || defined NOT_IN_libc +-.globl memcpy +-.set memcpy,__memcpy_g5 +-#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memcpy.c b/sysdeps/s390/s390-32/multiarch/memcpy.c +new file mode 100644 +index 0000000..1ff31bb +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/memcpy.c +@@ -0,0 +1,24 @@ ++/* Multiple versions of memcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* In the static lib memcpy is needed before the reloc is resolved. */ ++#if defined SHARED && !defined NOT_IN_libc ++# include ++ ++s390_libc_ifunc (memcpy) ++#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memset-s390.S b/sysdeps/s390/s390-32/multiarch/memset-s390.S +new file mode 100644 +index 0000000..f6df2fa +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/memset-s390.S +@@ -0,0 +1,113 @@ ++/* Set a block of memory to some byte value. 32 bit S/390 version. ++ Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++ ++#include "sysdep.h" ++#include "asm-syntax.h" ++ ++/* INPUT PARAMETERS ++ %r2 = address of memory area ++ %r3 = byte to fill memory with ++ %r4 = number of bytes to fill. */ ++ ++ .text ++ ++#ifndef NOT_IN_libc ++ ++ENTRY(__memset_z196) ++ .machine "z196" ++ .machinemode "zarch_nohighgprs" ++ llgfr %r4,%r4 ++ ltgr %r4,%r4 ++ je .L_Z196_4 ++ stc %r3,0(%r2) ++ lr %r1,%r2 ++ cghi %r4,1 ++ je .L_Z196_4 ++ aghi %r4,-2 ++ srlg %r5,%r4,8 ++ ltgr %r5,%r5 ++ jne .L_Z196_1 ++.L_Z196_3: ++ exrl %r4,.L_Z196_17 ++.L_Z196_4: ++ br %r14 ++.L_Z196_1: ++ cgfi %r5,1048576 ++ jh __memset_mvcle # Switch to mvcle for >256MB ++.L_Z196_2: ++ pfd 2,1024(%r1) ++ mvc 1(256,%r1),0(%r1) ++ aghi %r5,-1 ++ la %r1,256(%r1) ++ jne .L_Z196_2 ++ j .L_Z196_3 ++.L_Z196_17: ++ mvc 1(1,%r1),0(%r1) ++END(__memset_z196) ++ ++ENTRY(__memset_z10) ++ .machine "z10" ++ .machinemode "zarch_nohighgprs" ++ llgfr %r4,%r4 ++ cgije %r4,0,.L_Z10_4 ++ stc %r3,0(%r2) ++ lr %r1,%r2 ++ cgije %r4,1,.L_Z10_4 ++ aghi %r4,-2 ++ srlg %r5,%r4,8 ++ cgijlh %r5,0,.L_Z10_15 ++.L_Z10_3: ++ exrl %r4,.L_Z10_18 ++.L_Z10_4: ++ br %r14 ++.L_Z10_15: ++ cgfi %r5,163840 # Switch to mvcle for >40MB ++ jh __memset_mvcle ++.L_Z10_14: ++ pfd 2,1024(%r1) ++ mvc 1(256,%r1),0(%r1) ++ la %r1,256(%r1) ++ brctg %r5,.L_Z10_14 ++ j .L_Z10_3 ++.L_Z10_18: ++ mvc 1(1,%r1),0(%r1) ++END(__memset_z10) ++ ++ENTRY(__memset_mvcle) ++ ahi %r4,2 # take back the change done by the caller ++ lr %r0,%r2 # save source address ++ lr %r1,%r3 # move pad byte to R1 ++ lr %r3,%r4 ++ sr %r4,%r4 # no source for MVCLE, only a pad byte ++ sr %r5,%r5 ++.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend ++ jo .L0 ++ lr %r2,%r0 # return value is source address ++.L1: ++ br %r14 ++END(__memset_mvcle) ++ ++#endif /* !NOT_IN_libc */ ++ ++#include "../memset.S" ++ ++#ifdef NOT_IN_libc ++.globl memset ++.set memset,__memset_default ++#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memset.S b/sysdeps/s390/s390-32/multiarch/memset.S +deleted file mode 100644 +index 54aa028..0000000 +--- a/sysdeps/s390/s390-32/multiarch/memset.S ++++ /dev/null +@@ -1,113 +0,0 @@ +-/* Set a block of memory to some byte value. 32 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +- +-#include "sysdep.h" +-#include "asm-syntax.h" +- +-/* INPUT PARAMETERS +- %r2 = address of memory area +- %r3 = byte to fill memory with +- %r4 = number of bytes to fill. */ +- +- .text +- +-#ifndef NOT_IN_libc +- +-ENTRY(__memset_z196) +- .machine "z196" +- .machinemode "zarch_nohighgprs" +- llgfr %r4,%r4 +- ltgr %r4,%r4 +- je .L_Z196_4 +- stc %r3,0(%r2) +- lr %r1,%r2 +- cghi %r4,1 +- je .L_Z196_4 +- aghi %r4,-2 +- srlg %r5,%r4,8 +- ltgr %r5,%r5 +- jne .L_Z196_1 +-.L_Z196_3: +- exrl %r4,.L_Z196_17 +-.L_Z196_4: +- br %r14 +-.L_Z196_1: +- cgfi %r5,1048576 +- jh __memset_mvcle # Switch to mvcle for >256MB +-.L_Z196_2: +- pfd 2,1024(%r1) +- mvc 1(256,%r1),0(%r1) +- aghi %r5,-1 +- la %r1,256(%r1) +- jne .L_Z196_2 +- j .L_Z196_3 +-.L_Z196_17: +- mvc 1(1,%r1),0(%r1) +-END(__memset_z196) +- +-ENTRY(__memset_z10) +- .machine "z10" +- .machinemode "zarch_nohighgprs" +- llgfr %r4,%r4 +- cgije %r4,0,.L_Z10_4 +- stc %r3,0(%r2) +- lr %r1,%r2 +- cgije %r4,1,.L_Z10_4 +- aghi %r4,-2 +- srlg %r5,%r4,8 +- cgijlh %r5,0,.L_Z10_15 +-.L_Z10_3: +- exrl %r4,.L_Z10_18 +-.L_Z10_4: +- br %r14 +-.L_Z10_15: +- cgfi %r5,163840 # Switch to mvcle for >40MB +- jh __memset_mvcle +-.L_Z10_14: +- pfd 2,1024(%r1) +- mvc 1(256,%r1),0(%r1) +- la %r1,256(%r1) +- brctg %r5,.L_Z10_14 +- j .L_Z10_3 +-.L_Z10_18: +- mvc 1(1,%r1),0(%r1) +-END(__memset_z10) +- +-ENTRY(__memset_mvcle) +- ahi %r4,2 # take back the change done by the caller +- lr %r0,%r2 # save source address +- lr %r1,%r3 # move pad byte to R1 +- lr %r3,%r4 +- sr %r4,%r4 # no source for MVCLE, only a pad byte +- sr %r5,%r5 +-.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend +- jo .L0 +- lr %r2,%r0 # return value is source address +-.L1: +- br %r14 +-END(__memset_mvcle) +- +-#endif +- +-#include "../memset.S" +- +-#ifdef NOT_IN_libc +-.globl memset +-.set memset,__memset_g5 +-#endif +diff --git a/sysdeps/s390/s390-32/multiarch/memset.c b/sysdeps/s390/s390-32/multiarch/memset.c +new file mode 100644 +index 0000000..3b15446 +--- /dev/null ++++ b/sysdeps/s390/s390-32/multiarch/memset.c +@@ -0,0 +1,23 @@ ++/* Multiple versions of memset. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef NOT_IN_libc ++# include ++ ++s390_libc_ifunc (memset) ++#endif +diff --git a/sysdeps/s390/s390-64/memcmp.S b/sysdeps/s390/s390-64/memcmp.S +index eb5370f..1d7e788 100644 +--- a/sysdeps/s390/s390-64/memcmp.S ++++ b/sysdeps/s390/s390-64/memcmp.S +@@ -27,36 +27,36 @@ + + .text + #ifdef USE_MULTIARCH +-ENTRY(__memcmp_z900) ++ENTRY(__memcmp_default) + #else + ENTRY(memcmp) + #endif + .machine "z900" +- ltgr %r4,%r4 +- je .L_Z900_4 +- aghi %r4,-1 +- srlg %r1,%r4,8 +- ltgr %r1,%r1 +- jne .L_Z900_12 ++ ltgr %r4,%r4 ++ je .L_Z900_4 ++ aghi %r4,-1 ++ srlg %r1,%r4,8 ++ ltgr %r1,%r1 ++ jne .L_Z900_12 + .L_Z900_3: +- larl %r1,.L_Z900_15 +- ex %r4,0(%r1) ++ larl %r1,.L_Z900_15 ++ ex %r4,0(%r1) + .L_Z900_4: +- ipm %r2 +- sllg %r2,%r2,34 +- srag %r2,%r2,62 +- br %r14 ++ ipm %r2 ++ sllg %r2,%r2,34 ++ srag %r2,%r2,62 ++ br %r14 + .L_Z900_12: +- clc 0(256,%r3),0(%r2) +- jne .L_Z900_4 +- la %r3,256(%r3) +- la %r2,256(%r2) +- brctg %r1,.L_Z900_12 +- j .L_Z900_3 ++ clc 0(256,%r3),0(%r2) ++ jne .L_Z900_4 ++ la %r3,256(%r3) ++ la %r2,256(%r2) ++ brctg %r1,.L_Z900_12 ++ j .L_Z900_3 + .L_Z900_15: +- clc 0(1,%r3),0(%r2) ++ clc 0(1,%r3),0(%r2) + #ifdef USE_MULTIARCH +-END(__memcmp_z900) ++END(__memcmp_default) + #else + END(memcmp) + libc_hidden_builtin_def (memcmp) +diff --git a/sysdeps/s390/s390-64/memcpy.S b/sysdeps/s390/s390-64/memcpy.S +index 61fca0b..6827a0e 100644 +--- a/sysdeps/s390/s390-64/memcpy.S ++++ b/sysdeps/s390/s390-64/memcpy.S +@@ -29,37 +29,37 @@ + .text + + #ifdef USE_MULTIARCH +-ENTRY(__memcpy_z900) ++ENTRY(__memcpy_default) + #else + ENTRY(memcpy) + #endif + .machine "z900" +- ltgr %r4,%r4 +- je .L_Z900_4 +- aghi %r4,-1 +- srlg %r5,%r4,8 +- ltgr %r5,%r5 +- lgr %r1,%r2 +- jne .L_Z900_13 ++ ltgr %r4,%r4 ++ je .L_Z900_4 ++ aghi %r4,-1 ++ srlg %r5,%r4,8 ++ ltgr %r5,%r5 ++ lgr %r1,%r2 ++ jne .L_Z900_13 + .L_Z900_3: +- larl %r5,.L_Z900_15 +- ex %r4,0(%r5) ++ larl %r5,.L_Z900_15 ++ ex %r4,0(%r5) + .L_Z900_4: +- br %r14 ++ br %r14 + .L_Z900_13: +- chi %r5,4096 # Switch to mvcle for copies >1MB +- jh __memcpy_mvcle ++ chi %r5,4096 # Switch to mvcle for copies >1MB ++ jh __memcpy_mvcle + .L_Z900_12: +- mvc 0(256,%r1),0(%r3) +- la %r1,256(%r1) +- la %r3,256(%r3) +- brctg %r5,.L_Z900_12 +- j .L_Z900_3 ++ mvc 0(256,%r1),0(%r3) ++ la %r1,256(%r1) ++ la %r3,256(%r3) ++ brctg %r5,.L_Z900_12 ++ j .L_Z900_3 + .L_Z900_15: +- mvc 0(1,%r1),0(%r3) ++ mvc 0(1,%r1),0(%r3) + + #ifdef USE_MULTIARCH +-END(__memcpy_z900) ++END(__memcpy_default) + #else + END(memcpy) + libc_hidden_builtin_def (memcpy) +diff --git a/sysdeps/s390/s390-64/memset.S b/sysdeps/s390/s390-64/memset.S +index 8185e94..b1ba9e2 100644 +--- a/sysdeps/s390/s390-64/memset.S ++++ b/sysdeps/s390/s390-64/memset.S +@@ -29,35 +29,35 @@ + .text + + #ifdef USE_MULTIARCH +-ENTRY(__memset_z900) ++ENTRY(__memset_default) + #else + ENTRY(memset) + #endif + .machine "z900" +- ltgr %r4,%r4 +- je .L_Z900_4 +- stc %r3,0(%r2) +- cghi %r4,1 +- lgr %r1,%r2 +- je .L_Z900_4 +- aghi %r4,-2 +- srlg %r3,%r4,8 +- ltgr %r3,%r3 +- jne .L_Z900_14 ++ ltgr %r4,%r4 ++ je .L_Z900_4 ++ stc %r3,0(%r2) ++ cghi %r4,1 ++ lgr %r1,%r2 ++ je .L_Z900_4 ++ aghi %r4,-2 ++ srlg %r3,%r4,8 ++ ltgr %r3,%r3 ++ jne .L_Z900_14 + .L_Z900_3: +- larl %r3,.L_Z900_18 +- ex %r4,0(%r3) ++ larl %r3,.L_Z900_18 ++ ex %r4,0(%r3) + .L_Z900_4: +- br %r14 ++ br %r14 + .L_Z900_14: +- mvc 1(256,%r1),0(%r1) +- la %r1,256(%r1) +- brctg %r3,.L_Z900_14 +- j .L_Z900_3 ++ mvc 1(256,%r1),0(%r1) ++ la %r1,256(%r1) ++ brctg %r3,.L_Z900_14 ++ j .L_Z900_3 + .L_Z900_18: +- mvc 1(1,%r1),0(%r1) ++ mvc 1(1,%r1),0(%r1) + #ifdef USE_MULTIARCH +-END(__memset_z900) ++END(__memset_default) + #else + END(memset) + libc_hidden_builtin_def (memset) +diff --git a/sysdeps/s390/s390-64/multiarch/Makefile b/sysdeps/s390/s390-64/multiarch/Makefile +index 9baeecd..91053b5 100644 +--- a/sysdeps/s390/s390-64/multiarch/Makefile ++++ b/sysdeps/s390/s390-64/multiarch/Makefile +@@ -1,3 +1,4 @@ + ifeq ($(subdir),string) +-sysdep_routines += ifunc-resolve memset memcpy memcmp ++sysdep_routines += memset memset-s390x memcpy memcpy-s390x \ ++ memcmp memcmp-s390x + endif +diff --git a/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c b/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c +deleted file mode 100644 +index b6be970..0000000 +--- a/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c ++++ /dev/null +@@ -1,76 +0,0 @@ +-/* IFUNC resolver function for CPU specific functions. +- 64 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +- +-#define STFLE_BITS_Z10 34 /* General instructions extension */ +-#define STFLE_BITS_Z196 45 /* Distinct operands, pop ... */ +- +-#ifndef NOT_IN_libc +- +-#define IFUNC_RESOLVE(FUNC) \ +- asm (".globl " #FUNC "\n\t" \ +- ".type " #FUNC ",@gnu_indirect_function\n\t" \ +- ".set " #FUNC ",__resolve_" #FUNC "\n\t" \ +- ".globl __GI_" #FUNC "\n\t" \ +- ".set __GI_" #FUNC "," #FUNC "\n"); \ +- \ +- /* Make the declarations of the optimized functions hidden in order +- to prevent GOT slots being generated for them. */ \ +- extern void *__##FUNC##_z196 attribute_hidden; \ +- extern void *__##FUNC##_z10 attribute_hidden; \ +- extern void *__##FUNC##_z900 attribute_hidden; \ +- \ +- void *__resolve_##FUNC (unsigned long int dl_hwcap) \ +- { \ +- if (dl_hwcap & HWCAP_S390_STFLE) \ +- { \ +- /* We want just 1 double word to be returned. */ \ +- register unsigned long reg0 asm("0") = 0; \ +- unsigned long stfle_bits; \ +- \ +- asm volatile(".machine push" "\n\t" \ +- ".machine \"z9-109\"" "\n\t" \ +- "stfle %0" "\n\t" \ +- ".machine pop" "\n" \ +- : "=QS" (stfle_bits), "+d" (reg0) \ +- : : "cc"); \ +- \ +- if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z196))) != 0) \ +- return &__##FUNC##_z196; \ +- else if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z10))) != 0) \ +- return &__##FUNC##_z10; \ +- else \ +- return &__##FUNC##_z900; \ +- } \ +- else \ +- return &__##FUNC##_z900; \ +- } +- +-IFUNC_RESOLVE(memset) +-IFUNC_RESOLVE(memcmp) +-asm(".weak bcmp ; bcmp = memcmp"); +- +-/* In the static lib memcpy is needed before the reloc is resolved. */ +-#ifdef SHARED +-IFUNC_RESOLVE(memcpy) +-#endif +- +-#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S b/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S +new file mode 100644 +index 0000000..6d55b0b +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S +@@ -0,0 +1,101 @@ ++/* CPU specific memcmp implementations. 64 bit S/390 version. ++ Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++ ++#include "sysdep.h" ++#include "asm-syntax.h" ++ ++/* INPUT PARAMETERS ++ %r2 = address of first memory area ++ %r3 = address of second memory area ++ %r4 = number of bytes to compare. */ ++ ++ .text ++ ++#ifndef NOT_IN_libc ++ ++ENTRY(__memcmp_z196) ++ .machine "z196" ++ ltgr %r4,%r4 ++ je .L_Z196_4 ++ aghi %r4,-1 ++ srlg %r1,%r4,8 ++ ltgr %r1,%r1 ++ jne .L_Z196_2 ++.L_Z196_3: ++ exrl %r4,.L_Z196_14 ++.L_Z196_4: ++ ipm %r2 ++ sllg %r2,%r2,34 ++ srag %r2,%r2,62 ++ br %r14 ++.L_Z196_17: ++ la %r3,256(%r3) ++ la %r2,256(%r2) ++ aghi %r1,-1 ++ je .L_Z196_3 ++.L_Z196_2: ++ pfd 1,512(%r3) ++ pfd 1,512(%r2) ++ clc 0(256,%r3),0(%r2) ++ je .L_Z196_17 ++ ipm %r2 ++ sllg %r2,%r2,34 ++ srag %r2,%r2,62 ++ br %r14 ++.L_Z196_14: ++ clc 0(1,%r3),0(%r2) ++END(__memcmp_z196) ++ ++ENTRY(__memcmp_z10) ++ .machine "z10" ++ ltgr %r4,%r4 ++ je .L_Z10_4 ++ aghi %r4,-1 ++ srlg %r1,%r4,8 ++ cgijlh %r1,0,.L_Z10_12 ++.L_Z10_3: ++ exrl %r4,.L_Z10_15 ++.L_Z10_4: ++ ipm %r2 ++ sllg %r2,%r2,34 ++ srag %r2,%r2,62 ++ br %r14 ++.L_Z10_12: ++ pfd 1,512(%r3) ++ pfd 1,512(%r2) ++ clc 0(256,%r3),0(%r2) ++ jne .L_Z10_4 ++ la %r3,256(%r3) ++ la %r2,256(%r2) ++ brctg %r1,.L_Z10_12 ++ j .L_Z10_3 ++.L_Z10_15: ++ clc 0(1,%r3),0(%r2) ++END(__memcmp_z10) ++ ++#endif /* !NOT_IN_libc */ ++ ++#include "../memcmp.S" ++ ++#ifdef NOT_IN_libc ++.globl memcmp ++.set memcmp,__memcmp_default ++.weak bcmp ++.set bcmp,__memcmp_default ++#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memcmp.S b/sysdeps/s390/s390-64/multiarch/memcmp.S +deleted file mode 100644 +index 9a8cba8..0000000 +--- a/sysdeps/s390/s390-64/multiarch/memcmp.S ++++ /dev/null +@@ -1,101 +0,0 @@ +-/* CPU specific memcmp implementations. 64 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +- +-#include "sysdep.h" +-#include "asm-syntax.h" +- +-/* INPUT PARAMETERS +- %r2 = address of first memory area +- %r3 = address of second memory area +- %r4 = number of bytes to compare. */ +- +- .text +- +-#ifndef NOT_IN_libc +- +-ENTRY(__memcmp_z196) +- .machine "z196" +- ltgr %r4,%r4 +- je .L_Z196_4 +- aghi %r4,-1 +- srlg %r1,%r4,8 +- ltgr %r1,%r1 +- jne .L_Z196_2 +-.L_Z196_3: +- exrl %r4,.L_Z196_14 +-.L_Z196_4: +- ipm %r2 +- sllg %r2,%r2,34 +- srag %r2,%r2,62 +- br %r14 +-.L_Z196_17: +- la %r3,256(%r3) +- la %r2,256(%r2) +- aghi %r1,-1 +- je .L_Z196_3 +-.L_Z196_2: +- pfd 1,512(%r3) +- pfd 1,512(%r2) +- clc 0(256,%r3),0(%r2) +- je .L_Z196_17 +- ipm %r2 +- sllg %r2,%r2,34 +- srag %r2,%r2,62 +- br %r14 +-.L_Z196_14: +- clc 0(1,%r3),0(%r2) +-END(__memcmp_z196) +- +-ENTRY(__memcmp_z10) +- .machine "z10" +- ltgr %r4,%r4 +- je .L_Z10_4 +- aghi %r4,-1 +- srlg %r1,%r4,8 +- cgijlh %r1,0,.L_Z10_12 +-.L_Z10_3: +- exrl %r4,.L_Z10_15 +-.L_Z10_4: +- ipm %r2 +- sllg %r2,%r2,34 +- srag %r2,%r2,62 +- br %r14 +-.L_Z10_12: +- pfd 1,512(%r3) +- pfd 1,512(%r2) +- clc 0(256,%r3),0(%r2) +- jne .L_Z10_4 +- la %r3,256(%r3) +- la %r2,256(%r2) +- brctg %r1,.L_Z10_12 +- j .L_Z10_3 +-.L_Z10_15: +- clc 0(1,%r3),0(%r2) +-END(__memcmp_z10) +- +-#endif +- +-#include "../memcmp.S" +- +-#ifdef NOT_IN_libc +-.globl memcmp +-.set memcmp,__memcmp_z900 +-.weak bcmp +-.set bcmp,__memcmp_z900 +-#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memcmp.c b/sysdeps/s390/s390-64/multiarch/memcmp.c +new file mode 100644 +index 0000000..7089d56 +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/memcmp.c +@@ -0,0 +1,24 @@ ++/* Multiple versions of memcmp. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef NOT_IN_libc ++# include ++ ++s390_libc_ifunc (memcmp) ++asm(".weak bcmp ; bcmp = memcmp"); ++#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S +new file mode 100644 +index 0000000..cdb34f1 +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S +@@ -0,0 +1,94 @@ ++/* CPU specific memcpy implementations. 64 bit S/390 version. ++ Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++ ++#include "sysdep.h" ++#include "asm-syntax.h" ++ ++/* INPUT PARAMETERS ++ %r2 = target operands address ++ %r3 = source operands address ++ %r4 = number of bytes to copy. */ ++ ++ .text ++ ++#if defined SHARED && !defined NOT_IN_libc ++ ++ENTRY(__memcpy_z196) ++ .machine "z196" ++ ltgr %r4,%r4 ++ je .L_Z196_4 ++ aghi %r4,-1 ++ lgr %r1,%r2 ++ srlg %r5,%r4,8 ++ ltgr %r5,%r5 ++ jne .L_Z196_5 ++.L_Z196_3: ++ exrl %r4,.L_Z196_14 ++.L_Z196_4: ++ br %r14 ++.L_Z196_5: ++ cgfi %r5,262144 # Switch to mvcle for copies >64MB ++ jh __memcpy_mvcle ++.L_Z196_2: ++ pfd 1,768(%r3) ++ pfd 2,768(%r1) ++ mvc 0(256,%r1),0(%r3) ++ aghi %r5,-1 ++ la %r1,256(%r1) ++ la %r3,256(%r3) ++ jne .L_Z196_2 ++ j .L_Z196_3 ++.L_Z196_14: ++ mvc 0(1,%r1),0(%r3) ++END(__memcpy_z196) ++ ++ENTRY(__memcpy_z10) ++ .machine "z10" ++ cgije %r4,0,.L_Z10_4 ++ aghi %r4,-1 ++ lgr %r1,%r2 ++ srlg %r5,%r4,8 ++ cgijlh %r5,0,.L_Z10_13 ++.L_Z10_3: ++ exrl %r4,.L_Z10_15 ++.L_Z10_4: ++ br %r14 ++.L_Z10_13: ++ cgfi %r5,65535 # Switch to mvcle for copies >16MB ++ jh __memcpy_mvcle ++.L_Z10_12: ++ pfd 1,768(%r3) ++ pfd 2,768(%r1) ++ mvc 0(256,%r1),0(%r3) ++ la %r1,256(%r1) ++ la %r3,256(%r3) ++ brctg %r5,.L_Z10_12 ++ j .L_Z10_3 ++.L_Z10_15: ++ mvc 0(1,%r1),0(%r3) ++END(__memcpy_z10) ++ ++#endif /* SHARED && !defined NOT_IN_libc */ ++ ++#include "../memcpy.S" ++ ++#if !defined SHARED || defined NOT_IN_libc ++.globl memcpy ++.set memcpy,__memcpy_default ++#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memcpy.S b/sysdeps/s390/s390-64/multiarch/memcpy.S +deleted file mode 100644 +index 525588f..0000000 +--- a/sysdeps/s390/s390-64/multiarch/memcpy.S ++++ /dev/null +@@ -1,94 +0,0 @@ +-/* CPU specific memcpy implementations. 64 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +- +-#include "sysdep.h" +-#include "asm-syntax.h" +- +-/* INPUT PARAMETERS +- %r2 = target operands address +- %r3 = source operands address +- %r4 = number of bytes to copy. */ +- +- .text +- +-#if defined SHARED && !defined NOT_IN_libc +- +-ENTRY(__memcpy_z196) +- .machine "z196" +- ltgr %r4,%r4 +- je .L_Z196_4 +- aghi %r4,-1 +- lgr %r1,%r2 +- srlg %r5,%r4,8 +- ltgr %r5,%r5 +- jne .L_Z196_5 +-.L_Z196_3: +- exrl %r4,.L_Z196_14 +-.L_Z196_4: +- br %r14 +-.L_Z196_5: +- cgfi %r5,262144 # Switch to mvcle for copies >64MB +- jh __memcpy_mvcle +-.L_Z196_2: +- pfd 1,768(%r3) +- pfd 2,768(%r1) +- mvc 0(256,%r1),0(%r3) +- aghi %r5,-1 +- la %r1,256(%r1) +- la %r3,256(%r3) +- jne .L_Z196_2 +- j .L_Z196_3 +-.L_Z196_14: +- mvc 0(1,%r1),0(%r3) +-END(__memcpy_z196) +- +-ENTRY(__memcpy_z10) +- .machine "z10" +- cgije %r4,0,.L_Z10_4 +- aghi %r4,-1 +- lgr %r1,%r2 +- srlg %r5,%r4,8 +- cgijlh %r5,0,.L_Z10_13 +-.L_Z10_3: +- exrl %r4,.L_Z10_15 +-.L_Z10_4: +- br %r14 +-.L_Z10_13: +- cgfi %r5,65535 # Switch to mvcle for copies >16MB +- jh __memcpy_mvcle +-.L_Z10_12: +- pfd 1,768(%r3) +- pfd 2,768(%r1) +- mvc 0(256,%r1),0(%r3) +- la %r1,256(%r1) +- la %r3,256(%r3) +- brctg %r5,.L_Z10_12 +- j .L_Z10_3 +-.L_Z10_15: +- mvc 0(1,%r1),0(%r3) +-END(__memcpy_z10) +- +-#endif +- +-#include "../memcpy.S" +- +-#if !defined SHARED || defined NOT_IN_libc +-.globl memcpy +-.set memcpy,__memcpy_z900 +-#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memcpy.c b/sysdeps/s390/s390-64/multiarch/memcpy.c +new file mode 100644 +index 0000000..1ff31bb +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/memcpy.c +@@ -0,0 +1,24 @@ ++/* Multiple versions of memcpy. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* In the static lib memcpy is needed before the reloc is resolved. */ ++#if defined SHARED && !defined NOT_IN_libc ++# include ++ ++s390_libc_ifunc (memcpy) ++#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memset-s390x.S b/sysdeps/s390/s390-64/multiarch/memset-s390x.S +new file mode 100644 +index 0000000..0037bdf +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/memset-s390x.S +@@ -0,0 +1,109 @@ ++/* Set a block of memory to some byte value. 64 bit S/390 version. ++ Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++ ++#include "sysdep.h" ++#include "asm-syntax.h" ++ ++/* INPUT PARAMETERS ++ %r2 = address of memory area ++ %r3 = byte to fill memory with ++ %r4 = number of bytes to fill. */ ++ ++ .text ++ ++#ifndef NOT_IN_libc ++ ++ENTRY(__memset_z196) ++ .machine "z196" ++ ltgr %r4,%r4 ++ je .L_Z196_4 ++ stc %r3,0(%r2) ++ lgr %r1,%r2 ++ cghi %r4,1 ++ je .L_Z196_4 ++ aghi %r4,-2 ++ srlg %r5,%r4,8 ++ ltgr %r5,%r5 ++ jne .L_Z196_1 ++.L_Z196_3: ++ exrl %r4,.L_Z196_17 ++.L_Z196_4: ++ br %r14 ++.L_Z196_1: ++ cgfi %r5,1048576 ++ jh __memset_mvcle # Switch to mvcle for >256MB ++.L_Z196_2: ++ pfd 2,1024(%r1) ++ mvc 1(256,%r1),0(%r1) ++ aghi %r5,-1 ++ la %r1,256(%r1) ++ jne .L_Z196_2 ++ j .L_Z196_3 ++.L_Z196_17: ++ mvc 1(1,%r1),0(%r1) ++END(__memset_z196) ++ ++ENTRY(__memset_z10) ++ .machine "z10" ++ cgije %r4,0,.L_Z10_4 ++ stc %r3,0(%r2) ++ lgr %r1,%r2 ++ cgije %r4,1,.L_Z10_4 ++ aghi %r4,-2 ++ srlg %r5,%r4,8 ++ cgijlh %r5,0,.L_Z10_15 ++.L_Z10_3: ++ exrl %r4,.L_Z10_18 ++.L_Z10_4: ++ br %r14 ++.L_Z10_15: ++ cgfi %r5,163840 # Switch to mvcle for >40MB ++ jh __memset_mvcle ++.L_Z10_14: ++ pfd 2,1024(%r1) ++ mvc 1(256,%r1),0(%r1) ++ la %r1,256(%r1) ++ brctg %r5,.L_Z10_14 ++ j .L_Z10_3 ++.L_Z10_18: ++ mvc 1(1,%r1),0(%r1) ++END(__memset_z10) ++ ++ENTRY(__memset_mvcle) ++ aghi %r4,2 # take back the change done by the caller ++ lgr %r0,%r2 # save source address ++ lgr %r1,%r3 # move pad byte to R1 ++ lgr %r3,%r4 # move length to r3 ++ sgr %r4,%r4 # no source for MVCLE, only a pad byte ++ sgr %r5,%r5 ++.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend ++ jo .L0 ++ lgr %r2,%r0 # return value is source address ++.L1: ++ br %r14 ++END(__memset_mvcle) ++ ++#endif /* !NOT_IN_libc */ ++ ++#include "../memset.S" ++ ++#ifdef NOT_IN_libc ++.globl memset ++.set memset,__memset_default ++#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memset.S b/sysdeps/s390/s390-64/multiarch/memset.S +deleted file mode 100644 +index 8dbb3cb..0000000 +--- a/sysdeps/s390/s390-64/multiarch/memset.S ++++ /dev/null +@@ -1,109 +0,0 @@ +-/* Set a block of memory to some byte value. 64 bit S/390 version. +- Copyright (C) 2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +- +-#include "sysdep.h" +-#include "asm-syntax.h" +- +-/* INPUT PARAMETERS +- %r2 = address of memory area +- %r3 = byte to fill memory with +- %r4 = number of bytes to fill. */ +- +- .text +- +-#ifndef NOT_IN_libc +- +-ENTRY(__memset_z196) +- .machine "z196" +- ltgr %r4,%r4 +- je .L_Z196_4 +- stc %r3,0(%r2) +- lgr %r1,%r2 +- cghi %r4,1 +- je .L_Z196_4 +- aghi %r4,-2 +- srlg %r5,%r4,8 +- ltgr %r5,%r5 +- jne .L_Z196_1 +-.L_Z196_3: +- exrl %r4,.L_Z196_17 +-.L_Z196_4: +- br %r14 +-.L_Z196_1: +- cgfi %r5,1048576 +- jh __memset_mvcle # Switch to mvcle for >256MB +-.L_Z196_2: +- pfd 2,1024(%r1) +- mvc 1(256,%r1),0(%r1) +- aghi %r5,-1 +- la %r1,256(%r1) +- jne .L_Z196_2 +- j .L_Z196_3 +-.L_Z196_17: +- mvc 1(1,%r1),0(%r1) +-END(__memset_z196) +- +-ENTRY(__memset_z10) +- .machine "z10" +- cgije %r4,0,.L_Z10_4 +- stc %r3,0(%r2) +- lgr %r1,%r2 +- cgije %r4,1,.L_Z10_4 +- aghi %r4,-2 +- srlg %r5,%r4,8 +- cgijlh %r5,0,.L_Z10_15 +-.L_Z10_3: +- exrl %r4,.L_Z10_18 +-.L_Z10_4: +- br %r14 +-.L_Z10_15: +- cgfi %r5,163840 # Switch to mvcle for >40MB +- jh __memset_mvcle +-.L_Z10_14: +- pfd 2,1024(%r1) +- mvc 1(256,%r1),0(%r1) +- la %r1,256(%r1) +- brctg %r5,.L_Z10_14 +- j .L_Z10_3 +-.L_Z10_18: +- mvc 1(1,%r1),0(%r1) +-END(__memset_z10) +- +-ENTRY(__memset_mvcle) +- aghi %r4,2 # take back the change done by the caller +- lgr %r0,%r2 # save source address +- lgr %r1,%r3 # move pad byte to R1 +- lgr %r3,%r4 # move length to r3 +- sgr %r4,%r4 # no source for MVCLE, only a pad byte +- sgr %r5,%r5 +-.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend +- jo .L0 +- lgr %r2,%r0 # return value is source address +-.L1: +- br %r14 +-END(__memset_mvcle) +- +-#endif +- +-#include "../memset.S" +- +-#ifdef NOT_IN_libc +-.globl memset +-.set memset,__memset_z900 +-#endif +diff --git a/sysdeps/s390/s390-64/multiarch/memset.c b/sysdeps/s390/s390-64/multiarch/memset.c +new file mode 100644 +index 0000000..3b15446 +--- /dev/null ++++ b/sysdeps/s390/s390-64/multiarch/memset.c +@@ -0,0 +1,23 @@ ++/* Multiple versions of memset. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef NOT_IN_libc ++# include ++ ++s390_libc_ifunc (memset) ++#endif +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-6.patch b/SOURCES/glibc-rh1268008-6.patch new file mode 100644 index 0000000..83f9e1f --- /dev/null +++ b/SOURCES/glibc-rh1268008-6.patch @@ -0,0 +1,77 @@ +From 571d49008b0c44b4aabb66b2ac3ce690fd802466 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:45:29 +0200 +Subject: [PATCH 06/30] S390: Add hwcaps value for vector facility. + +upstream-commit-id: 4e28fa80886c71e6aaf85016b82ce981c0f12e6d +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00075.html + +The HWCAP_S390_VX flag in hwcap field of auxiliary vector indicates +if the vector facility is available and the kernel is aware of it. +This can be tested with LD_SHOW_AUXV=1 . +Currently it does not show te, because it was not incremented +by commit "S/390: Add hwcap value for transactional execution.". +Thus _DL_HWCAP_COUNT is incremented by two. + +ChangeLog: + + * sysdeps/s390/dl-procinfo.c (_dl_s390_platforms): Add vector flag. + * sysdeps/s390/dl-procinfo.h: Add vector capability. + * sysdeps/unix/sysv/linux/s390/bits/hwcap.h (HWCAP_S390_VX): Define. +--- + sysdeps/s390/dl-procinfo.c | 4 ++-- + sysdeps/s390/dl-procinfo.h | 3 ++- + sysdeps/unix/sysv/linux/s390/bits/hwcap.h | 1 + + 3 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/sysdeps/s390/dl-procinfo.c b/sysdeps/s390/dl-procinfo.c +index 9590146..96d438a 100644 +--- a/sysdeps/s390/dl-procinfo.c ++++ b/sysdeps/s390/dl-procinfo.c +@@ -46,11 +46,11 @@ + #if !defined PROCINFO_DECL && defined SHARED + ._dl_s390_cap_flags + #else +-PROCINFO_CLASS const char _dl_s390_cap_flags[11][9] ++PROCINFO_CLASS const char _dl_s390_cap_flags[12][9] + #endif + #ifndef PROCINFO_DECL + = { +- "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", "edat", "etf3eh", "highgprs", "te" ++ "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", "edat", "etf3eh", "highgprs", "te", "vx" + } + #endif + #if !defined SHARED || defined PROCINFO_DECL +diff --git a/sysdeps/s390/dl-procinfo.h b/sysdeps/s390/dl-procinfo.h +index 26de043..89766e0 100644 +--- a/sysdeps/s390/dl-procinfo.h ++++ b/sysdeps/s390/dl-procinfo.h +@@ -21,7 +21,7 @@ + #define _DL_PROCINFO_H 1 + #include + +-#define _DL_HWCAP_COUNT 10 ++#define _DL_HWCAP_COUNT 12 + + #define _DL_PLATFORMS_COUNT 5 + +@@ -50,6 +50,7 @@ enum + HWCAP_S390_ETF3EH = 1 << 8, + HWCAP_S390_HIGH_GPRS = 1 << 9, + HWCAP_S390_TE = 1 << 10, ++ HWCAP_S390_VX = 1 << 11, + }; + + #define HWCAP_IMPORTANT (HWCAP_S390_ZARCH | HWCAP_S390_LDISP \ +diff --git a/sysdeps/unix/sysv/linux/s390/bits/hwcap.h b/sysdeps/unix/sysv/linux/s390/bits/hwcap.h +index 59d68b0..bd2ce3a 100644 +--- a/sysdeps/unix/sysv/linux/s390/bits/hwcap.h ++++ b/sysdeps/unix/sysv/linux/s390/bits/hwcap.h +@@ -35,3 +35,4 @@ + #define HWCAP_S390_ETF3EH 256 + #define HWCAP_S390_HIGH_GPRS 512 + #define HWCAP_S390_TE 1024 ++#define HWCAP_S390_VX 2048 +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-7.patch b/SOURCES/glibc-rh1268008-7.patch new file mode 100644 index 0000000..ff7b057 --- /dev/null +++ b/SOURCES/glibc-rh1268008-7.patch @@ -0,0 +1,56 @@ +From 9bcfc74b3097eb84973b7b91fd676f116e206938 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:45:58 +0200 +Subject: [PATCH 07/30] S390: Add new s390 platform. + +upstream-commit-id: a1b0488fc9df3d895a2e5eefbcd348d3f7fe0e52 +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00081.html + +The new IBM z13 is added to platform string array. +The macro _DL_PLATFORMS_COUNT is incremented to 8, +because it was not incremented by commit +"S/390: Sync AUXV capabilities and archs with kernel". + +ChangeLog: + + * sysdeps/s390/dl-procinfo.c (_dl_s390_cap_flags): Add z13. + * sysdeps/s390/dl-procinfo.h (_DL_PLATFORMS_COUNT): Increased. +--- + sysdeps/s390/dl-procinfo.c | 4 ++-- + sysdeps/s390/dl-procinfo.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/sysdeps/s390/dl-procinfo.c b/sysdeps/s390/dl-procinfo.c +index 96d438a..f353528 100644 +--- a/sysdeps/s390/dl-procinfo.c ++++ b/sysdeps/s390/dl-procinfo.c +@@ -62,11 +62,11 @@ PROCINFO_CLASS const char _dl_s390_cap_flags[12][9] + #if !defined PROCINFO_DECL && defined SHARED + ._dl_s390_platforms + #else +-PROCINFO_CLASS const char _dl_s390_platforms[7][7] ++PROCINFO_CLASS const char _dl_s390_platforms[8][7] + #endif + #ifndef PROCINFO_DECL + = { +- "g5", "z900", "z990", "z9-109", "z10", "z196", "zEC12" ++ "g5", "z900", "z990", "z9-109", "z10", "z196", "zEC12", "z13" + } + #endif + #if !defined SHARED || defined PROCINFO_DECL +diff --git a/sysdeps/s390/dl-procinfo.h b/sysdeps/s390/dl-procinfo.h +index 89766e0..80747f0 100644 +--- a/sysdeps/s390/dl-procinfo.h ++++ b/sysdeps/s390/dl-procinfo.h +@@ -23,7 +23,7 @@ + + #define _DL_HWCAP_COUNT 12 + +-#define _DL_PLATFORMS_COUNT 5 ++#define _DL_PLATFORMS_COUNT 8 + + /* The kernel provides up to 32 capability bits with elf_hwcap. */ + #define _DL_FIRST_PLATFORM 32 +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-8.patch b/SOURCES/glibc-rh1268008-8.patch new file mode 100644 index 0000000..2827684 --- /dev/null +++ b/SOURCES/glibc-rh1268008-8.patch @@ -0,0 +1,133 @@ +From 2d04109858181ed8c7dc3e4ae42923a26c1d3591 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:47:37 +0200 +Subject: [PATCH 08/30] S390: configure check for vector instruction support in + assembler. + +upstream-commit-id: 4f0a1cea34c05fb2acc16f1a2d291f53230eb4fb +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00153.html + +The S390 specific test checks if the assembler has support for the new z13 +vector instructions by compiling a vector instruction. The .machine and +.machinemode directives are needed to compile the vector instruction without +-march=z13 option on 31/64 bit. +On success the macro HAVE_S390_VX_ASM_SUPPORT is defined. This macro is used +to determine if the optimized functions can be build without compile errors. +If the used assembler lacks vector support, then a warning is dumped while +configuring and only the common code functions are build. + +The z13 instruction support was introduced in +"[Committed] S/390: Add support for IBM z13." +(https://sourceware.org/ml/binutils/2015-01/msg00197.html) + +ChangeLog: + + * config.h.in (HAVE_S390_VX_ASM_SUPPORT): New macro undefine. + * sysdeps/s390/configure.ac: Add test for S390 vector instruction + assembler support. + * sysdeps/s390/configure: Regenerated. +--- + config.h.in | 3 +++ + sysdeps/s390/configure | 39 +++++++++++++++++++++++++++++++++++++++ + sysdeps/s390/configure.in | 27 +++++++++++++++++++++++++++ + 3 files changed, 69 insertions(+) + +diff --git a/config.h.in b/config.h.in +index 68321d4..f7f2388 100644 +--- a/config.h.in ++++ b/config.h.in +@@ -110,6 +110,9 @@ + /* Define if assembler supports Intel MPX. */ + #undef HAVE_MPX_SUPPORT + ++/* Define if assembler supports vector instructions on S390. */ ++#undef HAVE_S390_VX_ASM_SUPPORT ++ + /* Define if gcc supports FMA4. */ + #undef HAVE_FMA4_SUPPORT + +diff --git a/sysdeps/s390/configure b/sysdeps/s390/configure +index 669bb9b..cc4c1e0 100644 +--- a/sysdeps/s390/configure ++++ b/sysdeps/s390/configure +@@ -3,3 +3,42 @@ + + $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h + ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for S390 vector instruction support" >&5 ++$as_echo_n "checking for S390 vector instruction support... " >&6; } ++if ${libc_cv_asm_s390_vx+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat > conftest.c <<\EOF ++void testvecinsn () ++{ ++ __asm__ (".machine \"z13\" \n\t" ++ ".machinemode \"zarch_nohighgprs\" \n\t" ++ "vistrbs %%v16,%%v17 \n\t" ++ "locghie %%r1,0" : :); ++} ++EOF ++if { ac_try='${CC-cc} --shared conftest.c -o conftest.o &> /dev/null' ++ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; } ; ++then ++ libc_cv_asm_s390_vx=yes ++else ++ libc_cv_asm_s390_vx=no ++fi ++rm -f conftest* ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_s390_vx" >&5 ++$as_echo "$libc_cv_asm_s390_vx" >&6; } ++ ++if test "$libc_cv_asm_s390_vx" = yes ; ++then ++ $as_echo "#define HAVE_S390_VX_ASM_SUPPORT 1" >>confdefs.h ++ ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use binutils with vector-support in order to use optimized implementations." >&5 ++$as_echo "$as_me: WARNING: Use binutils with vector-support in order to use optimized implementations." >&2;} ++fi +diff --git a/sysdeps/s390/configure.in b/sysdeps/s390/configure.in +index b5af4e1..733e356 100644 +--- a/sysdeps/s390/configure.in ++++ b/sysdeps/s390/configure.in +@@ -4,3 +4,30 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. + dnl It is always possible to access static and hidden symbols in an + dnl position independent way. + AC_DEFINE(PI_STATIC_AND_HIDDEN) ++ ++AC_CACHE_CHECK(for S390 vector instruction support, libc_cv_asm_s390_vx, [dnl ++cat > conftest.c <<\EOF ++void testvecinsn () ++{ ++ __asm__ (".machine \"z13\" \n\t" ++ ".machinemode \"zarch_nohighgprs\" \n\t" ++ "vistrbs %%v16,%%v17 \n\t" ++ "locghie %%r1,0" : :); ++} ++EOF ++dnl ++dnl test, if assembler supports S390 vector instructions ++if AC_TRY_COMMAND([${CC-cc} --shared conftest.c -o conftest.o &> /dev/null]) ; ++then ++ libc_cv_asm_s390_vx=yes ++else ++ libc_cv_asm_s390_vx=no ++fi ++rm -f conftest* ]) ++ ++if test "$libc_cv_asm_s390_vx" = yes ; ++then ++ AC_DEFINE(HAVE_S390_VX_ASM_SUPPORT) ++else ++ AC_MSG_WARN([Use binutils with vector-support in order to use optimized implementations.]) ++fi +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1268008-9.patch b/SOURCES/glibc-rh1268008-9.patch new file mode 100644 index 0000000..dc7f114 --- /dev/null +++ b/SOURCES/glibc-rh1268008-9.patch @@ -0,0 +1,50 @@ +From b13a91507798183556d7e1891fe3d4cd3a947aa6 Mon Sep 17 00:00:00 2001 +From: Stefan Liebler +Date: Thu, 8 Oct 2015 10:48:13 +0200 +Subject: [PATCH 09/30] S390: Ifunc resolver macro for vector instructions. + +upstream-commit-id: fd484e057dd4d2813182df08584a4c48d6f1dd7a +https://www.sourceware.org/ml/libc-alpha/2015-07/msg00076.html + +This patch introduces a s390 specific ifunc resolver macro for 32/64bit, +which chooses _vx with vector instructions if HWCAP_S390_VX flag +in hwcaps is set or _c if not. + +ChangeLog: + + * sysdeps/s390/multiarch/ifunc-resolve.h (s390_vx_libc_ifunc, + s390_vx_libc_ifunc2): New macro function. +--- + sysdeps/s390/multiarch/ifunc-resolve.h | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/sysdeps/s390/multiarch/ifunc-resolve.h b/sysdeps/s390/multiarch/ifunc-resolve.h +index 491df68..e9fd90e 100644 +--- a/sysdeps/s390/multiarch/ifunc-resolve.h ++++ b/sysdeps/s390/multiarch/ifunc-resolve.h +@@ -73,3 +73,22 @@ + else \ + return &__##FUNC##_default; \ + } ++ ++#define s390_vx_libc_ifunc(FUNC) \ ++ s390_vx_libc_ifunc2(FUNC, FUNC) ++ ++#define s390_vx_libc_ifunc2(RESOLVERFUNC, FUNC) \ ++ /* Make the declarations of the optimized functions hidden in order ++ to prevent GOT slots being generated for them. */ \ ++ extern __typeof (FUNC) RESOLVERFUNC##_vx attribute_hidden; \ ++ extern __typeof (FUNC) RESOLVERFUNC##_c attribute_hidden; \ ++ extern void *__resolve_##RESOLVERFUNC (unsigned long int) __asm__ (#FUNC); \ ++ \ ++ void *__resolve_##RESOLVERFUNC (unsigned long int dl_hwcap) \ ++ { \ ++ if (dl_hwcap & HWCAP_S390_VX) \ ++ return &RESOLVERFUNC##_vx; \ ++ else \ ++ return &RESOLVERFUNC##_c; \ ++ } \ ++ __asm__ (".type " #FUNC ", %gnu_indirect_function"); +-- +2.3.0 + diff --git a/SOURCES/glibc-rh1276753-0.patch b/SOURCES/glibc-rh1276753-0.patch new file mode 100644 index 0000000..7c157d5 --- /dev/null +++ b/SOURCES/glibc-rh1276753-0.patch @@ -0,0 +1,310 @@ +commit 5782a80f9f8ca86899b30161166f044b0b6b8590 +Author: Ondřej Bílka +Date: Tue Dec 10 17:56:59 2013 +0100 + + Drop PER_THREAD conditionals from malloc. + +Index: glibc-2.17-c758a686/malloc/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/Makefile ++++ glibc-2.17-c758a686/malloc/Makefile +@@ -121,7 +121,6 @@ endif + tst-mcheck-ENV = MALLOC_CHECK_=3 + tst-malloc-usable-ENV = MALLOC_CHECK_=3 + +-CPPFLAGS-malloc.c += -DPER_THREAD + # Uncomment this for test releases. For public releases it is too expensive. + #CPPFLAGS-malloc.o += -DMALLOC_DEBUG=1 + +Index: glibc-2.17-c758a686/malloc/arena.c +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/arena.c ++++ glibc-2.17-c758a686/malloc/arena.c +@@ -78,10 +78,8 @@ extern int sanity_check_heap_info_alignm + + static tsd_key_t arena_key; + static mutex_t list_lock = MUTEX_INITIALIZER; +-#ifdef PER_THREAD + static size_t narenas = 1; + static mstate free_list; +-#endif + + #if THREAD_STATS + static int stat_n_heaps; +@@ -117,21 +115,12 @@ int __malloc_initialized = -1; + ptr = (mstate)tsd_getspecific(arena_key, vptr); \ + } while(0) + +-#ifdef PER_THREAD + # define arena_lock(ptr, size) do { \ + if(ptr && !arena_is_corrupt (ptr)) \ + (void)mutex_lock(&ptr->mutex); \ + else \ + ptr = arena_get2(ptr, (size), NULL); \ + } while(0) +-#else +-# define arena_lock(ptr, size) do { \ +- if(ptr && !mutex_trylock(&ptr->mutex)) { \ +- THREAD_STAT(++(ptr->stat_lock_direct)); \ +- } else \ +- ptr = arena_get2(ptr, (size), NULL); \ +-} while(0) +-#endif + + /* find the heap and corresponding arena for a given ptr */ + +@@ -297,17 +286,13 @@ ptmalloc_unlock_all2 (void) + tsd_setspecific(arena_key, save_arena); + __malloc_hook = save_malloc_hook; + __free_hook = save_free_hook; +-#ifdef PER_THREAD + free_list = NULL; +-#endif + for(ar_ptr = &main_arena;;) { + mutex_init(&ar_ptr->mutex); +-#ifdef PER_THREAD + if (ar_ptr != save_arena) { + ar_ptr->next_free = free_list; + free_list = ar_ptr; + } +-#endif + ar_ptr = ar_ptr->next; + if(ar_ptr == &main_arena) break; + } +@@ -428,13 +413,10 @@ ptmalloc_init (void) + { + if (memcmp (envline, "MMAP_MAX_", 9) == 0) + __libc_mallopt(M_MMAP_MAX, atoi(&envline[10])); +-#ifdef PER_THREAD + else if (memcmp (envline, "ARENA_MAX", 9) == 0) + __libc_mallopt(M_ARENA_MAX, atoi(&envline[10])); +-#endif + } + break; +-#ifdef PER_THREAD + case 10: + if (! __builtin_expect (__libc_enable_secure, 0)) + { +@@ -442,7 +424,6 @@ ptmalloc_init (void) + __libc_mallopt(M_ARENA_TEST, atoi(&envline[11])); + } + break; +-#endif + case 15: + if (! __builtin_expect (__libc_enable_secure, 0)) + { +@@ -750,18 +731,14 @@ _int_new_arena(size_t size) + mutex_init(&a->mutex); + (void)mutex_lock(&a->mutex); + +-#ifdef PER_THREAD + (void)mutex_lock(&list_lock); +-#endif + + /* Add the new arena to the global list. */ + a->next = main_arena.next; + atomic_write_barrier (); + main_arena.next = a; + +-#ifdef PER_THREAD + (void)mutex_unlock(&list_lock); +-#endif + + THREAD_STAT(++(a->stat_lock_loop)); + +@@ -769,7 +746,6 @@ _int_new_arena(size_t size) + } + + +-#ifdef PER_THREAD + static mstate + get_free_list (void) + { +@@ -846,7 +822,6 @@ reused_arena (mstate avoid_arena) + + return result; + } +-#endif + + static mstate + internal_function +@@ -854,7 +829,6 @@ arena_get2(mstate a_tsd, size_t size, ms + { + mstate a; + +-#ifdef PER_THREAD + static size_t narenas_limit; + + a = get_free_list (); +@@ -897,54 +871,6 @@ arena_get2(mstate a_tsd, size_t size, ms + else + a = reused_arena (avoid_arena); + } +-#else +- if(!a_tsd) +- a = a_tsd = &main_arena; +- else { +- a = a_tsd->next; +- if(!a) { +- /* This can only happen while initializing the new arena. */ +- (void)mutex_lock(&main_arena.mutex); +- THREAD_STAT(++(main_arena.stat_lock_wait)); +- return &main_arena; +- } +- } +- +- /* Check the global, circularly linked list for available arenas. */ +- bool retried = false; +- repeat: +- do { +- if(!mutex_trylock(&a->mutex)) { +- if (retried) +- (void)mutex_unlock(&list_lock); +- THREAD_STAT(++(a->stat_lock_loop)); +- LIBC_PROBE (memory_arena_reuse, 2, a, a_tsd); +- tsd_setspecific(arena_key, (void *)a); +- return a; +- } +- a = a->next; +- } while(a != a_tsd); +- +- /* If not even the list_lock can be obtained, try again. This can +- happen during `atfork', or for example on systems where thread +- creation makes it temporarily impossible to obtain _any_ +- locks. */ +- if(!retried && mutex_trylock(&list_lock)) { +- /* We will block to not run in a busy loop. */ +- LIBC_PROBE (memory_arena_reuse_wait, 3, &list_lock, NULL, a_tsd); +- (void)mutex_lock(&list_lock); +- +- /* Since we blocked there might be an arena available now. */ +- retried = true; +- a = a_tsd; +- goto repeat; +- } +- +- /* Nothing immediately available, so generate a new arena. */ +- a = _int_new_arena(size); +- (void)mutex_unlock(&list_lock); +-#endif +- + return a; + } + +@@ -970,7 +896,6 @@ arena_get_retry (mstate ar_ptr, size_t b + return ar_ptr; + } + +-#ifdef PER_THREAD + static void __attribute__ ((section ("__libc_thread_freeres_fn"))) + arena_thread_freeres (void) + { +@@ -987,7 +912,6 @@ arena_thread_freeres (void) + } + } + text_set_element (__libc_thread_subfreeres, arena_thread_freeres); +-#endif + + /* + * Local variables: +Index: glibc-2.17-c758a686/malloc/hooks.c +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/hooks.c ++++ glibc-2.17-c758a686/malloc/hooks.c +@@ -464,11 +464,9 @@ __malloc_get_state(void) + ms->max_mmapped_mem = mp_.max_mmapped_mem; + ms->using_malloc_checking = using_malloc_checking; + ms->max_fast = get_max_fast(); +-#ifdef PER_THREAD + ms->arena_test = mp_.arena_test; + ms->arena_max = mp_.arena_max; + ms->narenas = narenas; +-#endif + (void)mutex_unlock(&main_arena.mutex); + return (void*)ms; + } +@@ -565,11 +563,9 @@ __malloc_set_state(void* msptr) + } + } + if (ms->version >= 4) { +-#ifdef PER_THREAD + mp_.arena_test = ms->arena_test; + mp_.arena_max = ms->arena_max; + narenas = ms->narenas; +-#endif + } + check_malloc_state(&main_arena); + +Index: glibc-2.17-c758a686/malloc/malloc.c +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/malloc.c ++++ glibc-2.17-c758a686/malloc/malloc.c +@@ -1727,10 +1727,8 @@ struct malloc_state { + /* Linked list */ + struct malloc_state *next; + +-#ifdef PER_THREAD + /* Linked list for free arenas. */ + struct malloc_state *next_free; +-#endif + + /* Memory allocated from the system in this arena. */ + INTERNAL_SIZE_T system_mem; +@@ -1742,10 +1740,8 @@ struct malloc_par { + unsigned long trim_threshold; + INTERNAL_SIZE_T top_pad; + INTERNAL_SIZE_T mmap_threshold; +-#ifdef PER_THREAD + INTERNAL_SIZE_T arena_test; + INTERNAL_SIZE_T arena_max; +-#endif + + /* Memory map support */ + int n_mmaps; +@@ -1787,18 +1783,14 @@ static struct malloc_par mp_ = + .n_mmaps_max = DEFAULT_MMAP_MAX, + .mmap_threshold = DEFAULT_MMAP_THRESHOLD, + .trim_threshold = DEFAULT_TRIM_THRESHOLD, +-#ifdef PER_THREAD + # define NARENAS_FROM_NCORES(n) ((n) * (sizeof(long) == 4 ? 2 : 8)) + .arena_test = NARENAS_FROM_NCORES (1) +-#endif + }; + + +-#ifdef PER_THREAD + /* Non public mallopt parameters. */ + #define M_ARENA_TEST -7 + #define M_ARENA_MAX -8 +-#endif + + + /* Maximum size of memory handled in fastbins. */ +@@ -3008,11 +3000,6 @@ __libc_realloc(void* oldmem, size_t byte + (void)mutex_lock(&ar_ptr->mutex); + #endif + +-#if !defined PER_THREAD +- LIBC_PROBE (memory_arena_reuse_realloc, 1, ar_ptr); +- /* As in malloc(), remember this arena for the next allocation. */ +- tsd_setspecific(arena_key, (void *)ar_ptr); +-#endif + + newp = _int_realloc(ar_ptr, oldp, oldsize, nb); + +@@ -4823,7 +4810,6 @@ int __libc_mallopt(int param_number, int + perturb_byte = value; + break; + +-#ifdef PER_THREAD + case M_ARENA_TEST: + if (value > 0) + { +@@ -4839,7 +4825,6 @@ int __libc_mallopt(int param_number, int + mp_.arena_max = value; + } + break; +-#endif + } + (void)mutex_unlock(&av->mutex); + return res; diff --git a/SOURCES/glibc-rh1276753.patch b/SOURCES/glibc-rh1276753.patch new file mode 100644 index 0000000..5577d7e --- /dev/null +++ b/SOURCES/glibc-rh1276753.patch @@ -0,0 +1,654 @@ +Upstream commits: + +commit a62719ba90e2fa1728890ae7dc8df9e32a622e7b +Author: Florian Weimer +Date: Wed Oct 28 19:32:46 2015 +0100 + + malloc: Prevent arena free_list from turning cyclic [BZ #19048] + +commit 3da825ce483903e3a881a016113b3e59fd4041de +Author: Florian Weimer +Date: Wed Dec 16 12:39:48 2015 +0100 + + malloc: Fix attached thread reference count handling [BZ #19243] + +commit 90c400bd4904b0240a148f0b357a5cbc36179239 +Author: Florian Weimer +Date: Mon Dec 21 16:42:46 2015 +0100 + + malloc: Fix list_lock/arena lock deadlock [BZ #19182] + +commit 7962541a32eff5597bc4207e781cfac8d1bb0d87 +Author: Florian Weimer +Date: Wed Dec 23 17:23:33 2015 +0100 + + malloc: Update comment for list_lock + +commit 2a38688932243b5b16fb12d84c7ac1138ce50363 +Author: Florian Weimer +Date: Fri Feb 19 14:11:32 2016 +0100 + + tst-malloc-thread-exit: Use fewer system resources + +Also included is the following change, which has not yet been +committed upstream: + + malloc: Preserve arena free list/thread count invariant [BZ #20370] + + It is necessary to preserve the invariant that if an arena is + on the free list, it has thread attach count zero. Otherwise, + when arena_thread_freeres sees the zero attach count, it will + add it, and without the invariant, an arena could get pushed + to the list twice, resulting in a cycle. + + One possible execution trace looks like this: + + Thread 1 examines free list and observes it as empty. + Thread 2 exits and adds its arena to the free list, + with attached_threads == 0). + Thread 1 selects this arena in reused_arena (not from the free list). + Thread 1 increments attached_threads and attaches itself. + (The arena remains on the free list.) + Thread 1 exits, decrements attached_threads, + and adds the arena to the free list. + + The final step creates a cycle in the usual way (by overwriting the + next_free member with the former list head, while there is another + list item pointing to the arena structure). + + tst-malloc-thread-exit exhibits this issue, but it was only visible + with a debugger because the incorrect fix in bug 19243 removed + the assert from get_free_list. + + +Index: b/malloc/arena.c +=================================================================== +--- a/malloc/arena.c ++++ b/malloc/arena.c +@@ -77,10 +77,30 @@ extern int sanity_check_heap_info_alignm + /* Thread specific data */ + + static tsd_key_t arena_key; +-static mutex_t list_lock = MUTEX_INITIALIZER; ++ ++/* Arena free list. free_list_lock synchronizes access to the ++ free_list variable below, and the next_free and attached_threads ++ members of struct malloc_state objects. No other locks must be ++ acquired after free_list_lock has been acquired. */ ++ ++static mutex_t free_list_lock = MUTEX_INITIALIZER; + static size_t narenas = 1; + static mstate free_list; + ++/* list_lock prevents concurrent writes to the next member of struct ++ malloc_state objects. ++ ++ Read access to the next member is supposed to synchronize with the ++ atomic_write_barrier and the write to the next member in ++ _int_new_arena. This suffers from data races; see the FIXME ++ comments in _int_new_arena and reused_arena. ++ ++ list_lock also prevents concurrent forks. At the time list_lock is ++ acquired, no arena lock must have been acquired, but it is ++ permitted to acquire arena locks subsequently, while list_lock is ++ acquired. */ ++static mutex_t list_lock = MUTEX_INITIALIZER; ++ + #if THREAD_STATS + static int stat_n_heaps; + #define THREAD_STAT(x) x +@@ -221,6 +241,10 @@ ptmalloc_lock_all (void) + + if(__malloc_initialized < 1) + return; ++ ++ /* We do not acquire free_list_lock here because we completely ++ reconstruct free_list in ptmalloc_unlock_all2. */ ++ + if (mutex_trylock(&list_lock)) + { + void *my_arena; +@@ -242,7 +266,10 @@ ptmalloc_lock_all (void) + save_free_hook = __free_hook; + __malloc_hook = malloc_atfork; + __free_hook = free_atfork; +- /* Only the current thread may perform malloc/free calls now. */ ++ /* Only the current thread may perform malloc/free calls now. ++ save_arena will be reattached to the current thread, in ++ ptmalloc_lock_all, so save_arena->attached_threads is not ++ updated. */ + tsd_getspecific(arena_key, save_arena); + tsd_setspecific(arena_key, ATFORK_ARENA_PTR); + out: +@@ -258,6 +285,9 @@ ptmalloc_unlock_all (void) + return; + if (--atfork_recursive_cntr != 0) + return; ++ /* Replace ATFORK_ARENA_PTR with save_arena. ++ save_arena->attached_threads was not changed in ptmalloc_lock_all ++ and is still correct. */ + tsd_setspecific(arena_key, save_arena); + __malloc_hook = save_malloc_hook; + __free_hook = save_free_hook; +@@ -286,16 +316,24 @@ ptmalloc_unlock_all2 (void) + tsd_setspecific(arena_key, save_arena); + __malloc_hook = save_malloc_hook; + __free_hook = save_free_hook; ++ /* Push all arenas to the free list, except save_arena, which is ++ attached to the current thread. */ ++ mutex_init (&free_list_lock); ++ if (save_arena != NULL) ++ ((mstate) save_arena)->attached_threads = 1; + free_list = NULL; + for(ar_ptr = &main_arena;;) { + mutex_init(&ar_ptr->mutex); + if (ar_ptr != save_arena) { ++ /* This arena is no longer attached to any thread. */ ++ ar_ptr->attached_threads = 0; + ar_ptr->next_free = free_list; + free_list = ar_ptr; + } + ar_ptr = ar_ptr->next; + if(ar_ptr == &main_arena) break; + } ++ + mutex_init(&list_lock); + atfork_recursive_cntr = 0; + } +@@ -692,8 +730,25 @@ heap_trim(heap_info *heap, size_t pad) + return 1; + } + +-/* Create a new arena with initial size "size". */ + ++/* If REPLACED_ARENA is not NULL, detach it from this thread. Must be ++ called while free_list_lock is held. */ ++static void ++detach_arena (mstate replaced_arena) ++{ ++ if (replaced_arena != NULL) ++ { ++ assert (replaced_arena->attached_threads > 0); ++ /* The current implementation only detaches from main_arena in ++ case of allocation failure. This means that it is likely not ++ beneficial to put the arena on free_list even if the ++ reference count reaches zero. */ ++ --replaced_arena->attached_threads; ++ } ++} ++ ++ ++/* Create a new arena with initial size "size". */ + static mstate + _int_new_arena(size_t size) + { +@@ -714,6 +769,7 @@ _int_new_arena(size_t size) + } + a = h->ar_ptr = (mstate)(h+1); + malloc_init_state(a); ++ a->attached_threads = 1; + /*a->next = NULL;*/ + a->system_mem = a->max_system_mem = h->size; + arena_mem += h->size; +@@ -727,36 +783,68 @@ _int_new_arena(size_t size) + set_head(top(a), (((char*)h + h->size) - ptr) | PREV_INUSE); + + LIBC_PROBE (memory_arena_new, 2, a, size); ++ mstate replaced_arena; ++ { ++ void *vptr = NULL; ++ replaced_arena = tsd_getspecific (arena_key, vptr); ++ } + tsd_setspecific(arena_key, (void *)a); + mutex_init(&a->mutex); +- (void)mutex_lock(&a->mutex); + + (void)mutex_lock(&list_lock); + + /* Add the new arena to the global list. */ + a->next = main_arena.next; ++ /* FIXME: The barrier is an attempt to synchronize with read access ++ in reused_arena, which does not acquire list_lock while ++ traversing the list. */ + atomic_write_barrier (); + main_arena.next = a; + + (void)mutex_unlock(&list_lock); + ++ (void) mutex_lock (&free_list_lock); ++ detach_arena (replaced_arena); ++ (void) mutex_unlock (&free_list_lock); ++ ++ /* Lock this arena. NB: Another thread may have been attached to ++ this arena because the arena is now accessible from the ++ main_arena.next list and could have been picked by reused_arena. ++ This can only happen for the last arena created (before the arena ++ limit is reached). At this point, some arena has to be attached ++ to two threads. We could acquire the arena lock before list_lock ++ to make it less likely that reused_arena picks this new arena, ++ but this could result in a deadlock with ptmalloc_lock_all. */ ++ ++ (void) mutex_lock (&a->mutex); ++ + THREAD_STAT(++(a->stat_lock_loop)); + + return a; + } + +- ++/* Remove an arena from free_list. */ + static mstate + get_free_list (void) + { ++ void *vptr = NULL; ++ mstate replaced_arena = tsd_getspecific (arena_key, vptr); + mstate result = free_list; + if (result != NULL) + { +- (void)mutex_lock(&list_lock); ++ (void)mutex_lock(&free_list_lock); + result = free_list; + if (result != NULL) +- free_list = result->next_free; +- (void)mutex_unlock(&list_lock); ++ { ++ free_list = result->next_free; ++ ++ /* The arena will be attached to this thread. */ ++ assert (result->attached_threads == 0); ++ result->attached_threads = 1; ++ ++ detach_arena (replaced_arena); ++ } ++ (void)mutex_unlock(&free_list_lock); + + if (result != NULL) + { +@@ -770,6 +858,26 @@ get_free_list (void) + return result; + } + ++/* Remove the arena from the free list (if it is present). ++ free_list_lock must have been acquired by the caller. */ ++static void ++remove_from_free_list (mstate arena) ++{ ++ mstate *previous = &free_list; ++ for (mstate p = free_list; p != NULL; p = p->next_free) ++ { ++ assert (p->attached_threads == 0); ++ if (p == arena) ++ { ++ /* Remove the requested arena from the list. */ ++ *previous = p->next_free; ++ break; ++ } ++ else ++ previous = &p->next_free; ++ } ++} ++ + /* Lock and return an arena that can be reused for memory allocation. + Avoid AVOID_ARENA as we have already failed to allocate memory in + it and it is currently locked. */ +@@ -777,16 +885,20 @@ static mstate + reused_arena (mstate avoid_arena) + { + mstate result; ++ /* FIXME: Access to next_to_use suffers from data races. */ + static mstate next_to_use; + if (next_to_use == NULL) + next_to_use = &main_arena; + ++ /* Iterate over all arenas (including those linked from ++ free_list). */ + result = next_to_use; + do + { + if (!arena_is_corrupt (result) && !mutex_trylock(&result->mutex)) + goto out; + ++ /* FIXME: This is a data race, see _int_new_arena. */ + result = result->next; + } + while (result != next_to_use); +@@ -815,6 +927,27 @@ reused_arena (mstate avoid_arena) + (void)mutex_lock(&result->mutex); + + out: ++ /* Attach the arena to the current thread. */ ++ { ++ /* Update the arena thread attachment counters. */ ++ void *vptr = NULL; ++ mstate replaced_arena = tsd_getspecific (arena_key, vptr); ++ (void) mutex_lock (&free_list_lock); ++ detach_arena (replaced_arena); ++ ++ /* We may have picked up an arena on the free list. We need to ++ preserve the invariant that no arena on the free list has a ++ positive attached_threads counter (otherwise, ++ arena_thread_freeres cannot use the counter to determine if the ++ arena needs to be put on the free list). We unconditionally ++ remove the selected arena from the free list. The caller of ++ reused_arena checked the free list and observed it to be empty, ++ so the list is very short. */ ++ remove_from_free_list (result); ++ ++ ++result->attached_threads; ++ (void) mutex_unlock (&free_list_lock); ++ } + LIBC_PROBE (memory_arena_reuse, 2, result, avoid_arena); + tsd_setspecific(arena_key, (void *)result); + THREAD_STAT(++(result->stat_lock_loop)); +@@ -905,10 +1038,16 @@ arena_thread_freeres (void) + + if (a != NULL) + { +- (void)mutex_lock(&list_lock); +- a->next_free = free_list; +- free_list = a; +- (void)mutex_unlock(&list_lock); ++ (void)mutex_lock(&free_list_lock); ++ /* If this was the last attached thread for this arena, put the ++ arena on the free list. */ ++ assert (a->attached_threads > 0); ++ if (--a->attached_threads == 0) ++ { ++ a->next_free = free_list; ++ free_list = a; ++ } ++ (void)mutex_unlock(&free_list_lock); + } + } + text_set_element (__libc_thread_subfreeres, arena_thread_freeres); +Index: b/malloc/malloc.c +=================================================================== +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -1727,8 +1727,13 @@ struct malloc_state { + /* Linked list */ + struct malloc_state *next; + +- /* Linked list for free arenas. */ ++ /* Linked list for free arenas. Access to this field is serialized ++ by free_list_lock in arena.c. */ + struct malloc_state *next_free; ++ /* Number of threads attached to this arena. 0 if the arena is on ++ the free list. Access to this field is serialized by ++ free_list_lock in arena.c. */ ++ INTERNAL_SIZE_T attached_threads; + + /* Memory allocated from the system in this arena. */ + INTERNAL_SIZE_T system_mem; +@@ -1772,7 +1777,8 @@ struct malloc_par { + static struct malloc_state main_arena = + { + .mutex = MUTEX_INITIALIZER, +- .next = &main_arena ++ .next = &main_arena, ++ .attached_threads = 1, + }; + + /* There is only one instance of the malloc parameters. */ +Index: b/malloc/Makefile +=================================================================== +--- a/malloc/Makefile ++++ b/malloc/Makefile +@@ -20,13 +20,14 @@ + # + subdir := malloc + +-all: ++include ../Makeconfig + + dist-headers := malloc.h + headers := $(dist-headers) obstack.h mcheck.h + tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ + tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 \ +- tst-malloc-usable tst-malloc-backtrace ++ tst-malloc-usable \ ++ tst-malloc-backtrace tst-malloc-thread-exit + test-srcs = tst-mtrace + + routines = malloc morecore mcheck mtrace obstack +@@ -43,6 +44,8 @@ libmemusage-inhibit-o = $(filter-out .os + + $(objpfx)tst-malloc-backtrace: $(common-objpfx)nptl/libpthread.so \ + $(common-objpfx)nptl/libpthread_nonshared.a ++$(objpfx)tst-malloc-thread-exit: $(common-objpfx)nptl/libpthread.so \ ++ $(common-objpfx)nptl/libpthread_nonshared.a + + # These should be removed by `make clean'. + extra-objs = mcheck-init.o libmcheck.a +@@ -50,8 +53,6 @@ extra-objs = mcheck-init.o libmcheck.a + # Include the cleanup handler. + aux := set-freeres thread-freeres + +-include ../Makeconfig +- + CPPFLAGS-memusagestat = -DNOT_IN_libc + + # The Perl script to analyze the output of the mtrace functions. +Index: b/malloc/tst-malloc-thread-exit.c +=================================================================== +--- /dev/null ++++ b/malloc/tst-malloc-thread-exit.c +@@ -0,0 +1,218 @@ ++/* Test malloc with concurrent thread termination. ++ Copyright (C) 2015-2016 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This thread spawns a number of outer threads, equal to the arena ++ limit. The outer threads run a loop which start and join two ++ different kinds of threads: the first kind allocates (attaching an ++ arena to the thread; malloc_first_thread) and waits, the second ++ kind waits and allocates (wait_first_threads). Both kinds of ++ threads exit immediately after waiting. The hope is that this will ++ exhibit races in thread termination and arena management, ++ particularly related to the arena free list. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int do_test (void); ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" ++ ++static bool termination_requested; ++static int inner_thread_count = 4; ++static size_t malloc_size = 32; ++ ++static void ++__attribute__ ((noinline, noclone)) ++unoptimized_free (void *ptr) ++{ ++ free (ptr); ++} ++ ++static void * ++malloc_first_thread (void * closure) ++{ ++ pthread_barrier_t *barrier = closure; ++ void *ptr = malloc (malloc_size); ++ if (ptr == NULL) ++ { ++ printf ("error: malloc: %m\n"); ++ abort (); ++ } ++ int ret = pthread_barrier_wait (barrier); ++ if (ret != 0 && ret != PTHREAD_BARRIER_SERIAL_THREAD) ++ { ++ errno = ret; ++ printf ("error: pthread_barrier_wait: %m\n"); ++ abort (); ++ } ++ unoptimized_free (ptr); ++ return NULL; ++} ++ ++static void * ++wait_first_thread (void * closure) ++{ ++ pthread_barrier_t *barrier = closure; ++ int ret = pthread_barrier_wait (barrier); ++ if (ret != 0 && ret != PTHREAD_BARRIER_SERIAL_THREAD) ++ { ++ errno = ret; ++ printf ("error: pthread_barrier_wait: %m\n"); ++ abort (); ++ } ++ void *ptr = malloc (malloc_size); ++ if (ptr == NULL) ++ { ++ printf ("error: malloc: %m\n"); ++ abort (); ++ } ++ unoptimized_free (ptr); ++ return NULL; ++} ++ ++static void * ++outer_thread (void *closure) ++{ ++ pthread_t *threads = calloc (sizeof (*threads), inner_thread_count); ++ if (threads == NULL) ++ { ++ printf ("error: calloc: %m\n"); ++ abort (); ++ } ++ ++ while (!__atomic_load_n (&termination_requested, __ATOMIC_RELAXED)) ++ { ++ pthread_barrier_t barrier; ++ int ret = pthread_barrier_init (&barrier, NULL, inner_thread_count + 1); ++ if (ret != 0) ++ { ++ errno = ret; ++ printf ("pthread_barrier_init: %m\n"); ++ abort (); ++ } ++ for (int i = 0; i < inner_thread_count; ++i) ++ { ++ void *(*func) (void *); ++ if ((i % 2) == 0) ++ func = malloc_first_thread; ++ else ++ func = wait_first_thread; ++ ret = pthread_create (threads + i, NULL, func, &barrier); ++ if (ret != 0) ++ { ++ errno = ret; ++ printf ("error: pthread_create: %m\n"); ++ abort (); ++ } ++ } ++ ret = pthread_barrier_wait (&barrier); ++ if (ret != 0 && ret != PTHREAD_BARRIER_SERIAL_THREAD) ++ { ++ errno = ret; ++ printf ("pthread_wait: %m\n"); ++ abort (); ++ } ++ for (int i = 0; i < inner_thread_count; ++i) ++ { ++ ret = pthread_join (threads[i], NULL); ++ if (ret != 0) ++ { ++ ret = errno; ++ printf ("error: pthread_join: %m\n"); ++ abort (); ++ } ++ } ++ ret = pthread_barrier_destroy (&barrier); ++ if (ret != 0) ++ { ++ ret = errno; ++ printf ("pthread_barrier_destroy: %m\n"); ++ abort (); ++ } ++ } ++ ++ free (threads); ++ ++ return NULL; ++} ++ ++static int ++do_test (void) ++{ ++ /* The number of threads should be smaller than the number of ++ arenas, so that there will be some free arenas to add to the ++ arena free list. */ ++ enum { outer_thread_count = 2 }; ++ if (mallopt (M_ARENA_MAX, 8) == 0) ++ { ++ printf ("error: mallopt (M_ARENA_MAX) failed\n"); ++ return 1; ++ } ++ ++ /* Leave some room for shutting down all threads gracefully. */ ++ int timeout = 3; ++ if (timeout > TIMEOUT) ++ timeout = TIMEOUT - 1; ++ ++ pthread_t *threads = calloc (sizeof (*threads), outer_thread_count); ++ if (threads == NULL) ++ { ++ printf ("error: calloc: %m\n"); ++ abort (); ++ } ++ ++ for (long i = 0; i < outer_thread_count; ++i) ++ { ++ int ret = pthread_create (threads + i, NULL, outer_thread, NULL); ++ if (ret != 0) ++ { ++ errno = ret; ++ printf ("error: pthread_create: %m\n"); ++ abort (); ++ } ++ } ++ ++ struct timespec ts = {timeout, 0}; ++ if (nanosleep (&ts, NULL)) ++ { ++ printf ("error: error: nanosleep: %m\n"); ++ abort (); ++ } ++ ++ __atomic_store_n (&termination_requested, true, __ATOMIC_RELAXED); ++ ++ for (long i = 0; i < outer_thread_count; ++i) ++ { ++ int ret = pthread_join (threads[i], NULL); ++ if (ret != 0) ++ { ++ errno = ret; ++ printf ("error: pthread_join: %m\n"); ++ abort (); ++ } ++ } ++ free (threads); ++ ++ return 0; ++} diff --git a/SOURCES/glibc-rh1288613.patch b/SOURCES/glibc-rh1288613.patch new file mode 100644 index 0000000..1710690 --- /dev/null +++ b/SOURCES/glibc-rh1288613.patch @@ -0,0 +1,184 @@ +commit b57525f1a376149840f740a31535681c07152ba4 +Author: Dmitry V. Levin +Date: Thu Jun 18 21:40:46 2015 +0000 + + Fix potential hanging of gethostbyaddr_r/gethostbyname_r + + When "reorder" resolver option is enabled, threads of a multi-threaded + process could hang in gethostbyaddr_r, gethostbyname_r, or + gethostbyname2_r. + + Due to a trivial bug in _res_hconf_reorder_addrs, simultaneous + invocations of this function in a multi-threaded process could result to + _res_hconf_reorder_addrs returning without releasing the lock it holds, + causing other threads to block indefinitely while waiting for the lock + that is not going to be released. + + [BZ #17977] + * resolv/res_hconf.c (_res_hconf_reorder_addrs): Fix unlocking + when initializing interface list, based on the bug analysis + and the patch proposed by Eric Newton. + * resolv/tst-res_hconf_reorder.c: New test. + * resolv/Makefile [$(have-thread-library) = yes] (tests): Add + tst-res_hconf_reorder. + ($(objpfx)tst-res_hconf_reorder): Depend on $(libdl) + and $(shared-thread-library). + (tst-res_hconf_reorder-ENV): New variable. + +diff --git a/resolv/Makefile b/resolv/Makefile +index f62eea4..3509d98 100644 +--- a/resolv/Makefile ++++ b/resolv/Makefile + ifeq ($(have-thread-library),yes) + extra-libs += libanl + routines += gai_sigqueue ++tests += tst-res_hconf_reorder + endif + extra-libs-others = $(extra-libs) + libresolv-routines := gethnamaddr res_comp res_debug \ +@@ -108,6 +109,9 @@ + + $(objpfx)ga_test: $(objpfx)libanl.so $(shared-thread-library) + ++$(objpfx)tst-res_hconf_reorder: $(libdl) $(shared-thread-library) ++tst-res_hconf_reorder-ENV = RESOLV_REORDER=on ++ + $(objpfx)tst-leaks: $(objpfx)libresolv.so + tst-leaks-ENV = MALLOC_TRACE=$(objpfx)tst-leaks.mtrace + $(objpfx)mtrace-tst-leaks: $(objpfx)tst-leaks.out + +diff --git a/resolv/res_hconf.c b/resolv/res_hconf.c +index c9642ce..0d4f3f4 100644 +--- a/resolv/res_hconf.c ++++ b/resolv/res_hconf.c +@@ -462,10 +462,10 @@ + errno = save; + + num_ifs = new_num_ifs; +- +- __libc_lock_unlock (lock); + } + ++ __libc_lock_unlock (lock); ++ + __close (sd); + } + +diff --git a/resolv/tst-res_hconf_reorder.c b/resolv/tst-res_hconf_reorder.c +new file mode 100644 +index 0000000..1e7e0e2 +--- /dev/null ++++ b/resolv/tst-res_hconf_reorder.c +@@ -0,0 +1,112 @@ ++/* BZ #17977 _res_hconf_reorder_addrs test. ++ ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static struct timespec ts; ++ ++/* The first thread that gets a lock in _res_hconf_reorder_addrs() ++ should hold the lock long enough to make two other threads blocked. ++ This is achieved by slowing down realloc(3) that is called several times ++ by _res_hconf_reorder_addrs(). */ ++ ++void * ++realloc (void *ptr, size_t len) ++{ ++ static void *(*fun) (void *, size_t); ++ ++ if (!fun) ++ fun = dlsym (RTLD_NEXT, "realloc"); ++ ++ if (ts.tv_nsec) ++ nanosleep (&ts, NULL); ++ ++ return (*fun) (ptr, len); ++} ++ ++static void * ++resolve (void *arg) ++{ ++ struct in_addr addr; ++ struct hostent ent; ++ struct hostent *result; ++ int err; ++ char buf[1024]; ++ ++ addr.s_addr = htonl (INADDR_LOOPBACK); ++ (void) gethostbyaddr_r ((void *) &addr, sizeof (addr), AF_INET, ++ &ent, buf, sizeof (buf), &result, &err); ++ return arg; ++} ++ ++static int ++do_test (void) ++{ ++ #define N 3 ++ pthread_t thr[N]; ++ unsigned int i; ++ int result = 0; ++ ++ /* turn on realloc slowdown */ ++ ts.tv_nsec = 100000000; ++ ++ for (i = 0; i < N; ++i) ++ { ++ int rc = pthread_create (&thr[i], NULL, resolve, NULL); ++ ++ if (rc) ++ { ++ printf ("pthread_create: %s\n", strerror(rc)); ++ exit (1); ++ } ++ } ++ ++ for (i = 0; i < N; ++i) ++ { ++ void *retval; ++ int rc = pthread_join (thr[i], &retval); ++ ++ if (rc) ++ { ++ printf ("pthread_join: %s\n", strerror(rc)); ++ exit (1); ++ } ++ if (retval) ++ { ++ printf ("thread %u exit status %p\n", i, retval); ++ result = 1; ++ } ++ } ++ ++ /* turn off realloc slowdown, no longer needed */ ++ ts.tv_nsec = 0; ++ ++ return result; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/SOURCES/glibc-rh1292018-0.patch b/SOURCES/glibc-rh1292018-0.patch new file mode 100644 index 0000000..e0b4da7 --- /dev/null +++ b/SOURCES/glibc-rh1292018-0.patch @@ -0,0 +1,55 @@ +commit a3d9ab5070b56b49aa91be2887fa5b118012b2cd +Author: H.J. Lu +Date: Tue Mar 31 13:17:51 2015 -0700 + + Limit threads sharing L2 cache to 2 for SLM/KNL + + Silvermont and Knights Landing have a modular system design with two cores + sharing an L2 cache. If more than 2 cores are detected to shared L2 cache, + it should be adjusted for Silvermont and Knights Landing. + + [BZ #18185] + * sysdeps/x86_64/cacheinfo.c (init_cacheinfo): Limit threads + sharing L2 cache to 2 for Silvermont/Knights Landing. + +diff --git a/sysdeps/x86_64/cacheinfo.c b/sysdeps/x86_64/cacheinfo.c +index f1cbf50..b99fb9a 100644 +--- a/sysdeps/x86_64/cacheinfo.c ++++ b/sysdeps/x86_64/cacheinfo.c +@@ -585,6 +585,10 @@ init_cacheinfo (void) + __cpuid (1, eax, ebx_1, ecx, edx); + #endif + ++ unsigned int family = (eax >> 8) & 0x0f; ++ unsigned int model = (eax >> 4) & 0x0f; ++ unsigned int extended_model = (eax >> 12) & 0xf0; ++ + #ifndef DISABLE_PREFERRED_MEMORY_INSTRUCTION + /* Intel prefers SSSE3 instructions for memory/string routines + if they are available. */ +@@ -647,6 +651,25 @@ init_cacheinfo (void) + } + } + threads += 1; ++ if (threads > 2 && level == 2 && family == 6) ++ { ++ model += extended_model; ++ switch (model) ++ { ++ case 0x57: ++ /* Knights Landing has L2 cache shared by 2 cores. */ ++ case 0x37: ++ case 0x4a: ++ case 0x4d: ++ case 0x5a: ++ case 0x5d: ++ /* Silvermont has L2 cache shared by 2 cores. */ ++ threads = 2; ++ break; ++ default: ++ break; ++ } ++ } + } + else + { diff --git a/SOURCES/glibc-rh1292018-0a.patch b/SOURCES/glibc-rh1292018-0a.patch new file mode 100644 index 0000000..915832b --- /dev/null +++ b/SOURCES/glibc-rh1292018-0a.patch @@ -0,0 +1,423 @@ +Required to get access to _rtld_global_ro@@GLIBC_PRIVATE +since it's only available from ld.so. + +commit fab7ce3f5b4060bf62659e8b58529de4156b5a2f +Author: Joseph Myers +Date: Fri May 31 16:16:33 2013 +0000 + + Link extra-libs consistently with libc and ld.so. + +Index: glibc-2.17-c758a686/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/Makefile ++++ glibc-2.17-c758a686/Makefile +@@ -127,6 +127,9 @@ lib: $(common-objpfx)libc.so + + lib: $(common-objpfx)linkobj/libc.so + ++# Do not filter ld.so out of libc.so link. ++$(common-objpfx)linkobj/libc.so: link-libc-deps = # empty ++ + $(common-objpfx)linkobj/libc.so: $(elfobjdir)/soinit.os \ + $(common-objpfx)linkobj/libc_pic.a \ + $(elfobjdir)/sofini.os \ +Index: glibc-2.17-c758a686/Makerules +=================================================================== +--- glibc-2.17-c758a686.orig/Makerules ++++ glibc-2.17-c758a686/Makerules +@@ -470,9 +470,10 @@ link-libc-deps = $(common-objpfx)libc.so + # This must come after the installation rules so Make doesn't try to + # build shared libraries in place from the installed *_pic.a files. + # $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies +-# on other shared objects. +-lib%.so: lib%_pic.a $(+preinit) $(+postinit) +- $(build-shlib) ++# on other shared objects. The linking with libc and ld.so is intended ++# to be as similar as possible to a default link with an installed libc. ++lib%.so: lib%_pic.a $(+preinit) $(+postinit) $(+interp) $(link-libc-deps) ++ $(build-shlib) $(link-libc-args) + + define build-shlib-helper + $(LINK.o) -shared $(static-libgcc) -Wl,-O1 $(sysdep-LDFLAGS) \ +@@ -558,7 +559,8 @@ endef + + build-module-helper-objlist = \ + $(patsubst %_pic.a,$(whole-archive) %_pic.a $(no-whole-archive),\ +- $(filter-out %.lds $(map-file) $(+preinit) $(+postinit),$^)) ++ $(filter-out %.lds $(map-file) $(+preinit) $(+postinit) \ ++ $(link-libc-deps),$^)) + + build-module-objlist = $(build-module-helper-objlist) $(LDLIBS-$(@F:%.so=%).so) + build-shlib-objlist = $(build-module-helper-objlist) \ +@@ -601,6 +603,9 @@ generated += libc_pic.opts libc_pic.os.c + libc_pic_clean := .clean + endif + ++# Do not filter ld.so out of libc.so link. ++$(common-objpfx)libc.so: link-libc-deps = # empty ++ + # Use our own special initializer and finalizer files for libc.so. + $(common-objpfx)libc.so: $(elfobjdir)/soinit.os \ + $(common-objpfx)libc_pic.os$(libc_pic_clean) \ +@@ -660,8 +665,7 @@ include $(patsubst %,$(..)extra-modules. + + extra-modules-build := $(filter-out $(modules-names-nobuild),$(modules-names)) + $(extra-modules-build:%=$(objpfx)%.so): $(objpfx)%.so: \ +- $(objpfx)%.os $(shlib-lds) \ +- $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a ++ $(objpfx)%.os $(shlib-lds) $(link-libs-deps) + $(build-module) + endif + +Index: glibc-2.17-c758a686/crypt/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/crypt/Makefile ++++ glibc-2.17-c758a686/crypt/Makefile +@@ -72,8 +72,3 @@ endif + ifeq (yes,$(build-bounded)) + $(tests:%=$(objpfx)%-bp): $(objpfx)libcrypt_b.a + endif +- +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libcrypt.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a +Index: glibc-2.17-c758a686/debug/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/debug/Makefile ++++ glibc-2.17-c758a686/debug/Makefile +@@ -159,13 +159,3 @@ $(objpfx)xtrace: xtrace.sh + -e 's|@PKGVERSION@|$(PKGVERSION)|' \ + -e 's|@REPORT_BUGS_TO@|$(REPORT_BUGS_TO)|' $^ > $@.new \ + && rm -f $@ && mv $@.new $@ && chmod +x $@ +- +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libSegFault.so: $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a \ +- $(elf-objpfx)$(rtld-installed-name) +-$(objpfx)libpcprofile.so: $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a \ +- $(elf-objpfx)$(rtld-installed-name) +Index: glibc-2.17-c758a686/dlfcn/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/dlfcn/Makefile ++++ glibc-2.17-c758a686/dlfcn/Makefile +@@ -117,16 +117,9 @@ $(objpfx)bug-atexit1.out: $(objpfx)bug-a + $(objpfx)bug-atexit2: $(libdl) + $(objpfx)bug-atexit2.out: $(objpfx)bug-atexit2-lib.so + +-LDLIBS-bug-atexit3-lib.so = -lstdc++ -lgcc_eh $(elfobjdir)/ld.so \ +- $(common-objpfx)libc_nonshared.a ++LDLIBS-bug-atexit3-lib.so = -lstdc++ -lgcc_eh + $(objpfx)bug-atexit3: $(libdl) + $(objpfx)bug-atexit3.out: $(objpfx)bug-atexit3-lib.so + + $(objpfx)tst-rec-dlopen: $(libdl) + $(objpfx)tst-rec-dlopen.out: $(objpfx)moddummy1.so $(objpfx)moddummy2.so +- +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libdl.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a \ +- $(elfobjdir)/ld.so +Index: glibc-2.17-c758a686/hesiod/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/hesiod/Makefile ++++ glibc-2.17-c758a686/hesiod/Makefile +@@ -33,12 +33,7 @@ libnss_hesiod-inhibit-o = $(filter-out . + + include ../Rules + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-# The Hesiod NSS modules also needs the resolver and some help from ++# The Hesiod NSS module also needs the resolver and some help from + # the file service. + $(objpfx)libnss_hesiod.so: $(common-objpfx)resolv/libresolv.so \ +- $(common-objpfx)nss/libnss_files.so \ +- $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a ++ $(common-objpfx)nss/libnss_files.so +Index: glibc-2.17-c758a686/iconvdata/extra-module.mk +=================================================================== +--- glibc-2.17-c758a686.orig/iconvdata/extra-module.mk ++++ glibc-2.17-c758a686/iconvdata/extra-module.mk +@@ -4,16 +4,9 @@ extra-modules-left := $(strip $(filter-o + extra-objs := $(extra-objs) $(patsubst %,%.os,$($(mod)-routines)) + + $(objpfx)$(mod).so: $(addprefix $(objpfx),$(addsuffix .os,$($(mod)-routines)))\ +- $(shlib-lds) ++ $(shlib-lds) $(link-libc-deps) + $(build-module-asneeded) + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)$(mod).so: $(common-objpfx)libc.so \ +- $(common-objpfx)/elf/ld.so \ +- $(common-objpfx)libc_nonshared.a +- + ifneq (,$(extra-modules-left)) + include extra-module.mk + endif +Index: glibc-2.17-c758a686/libidn/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/libidn/Makefile ++++ glibc-2.17-c758a686/libidn/Makefile +@@ -33,5 +33,3 @@ include $(..)Makeconfig + libcidn-inhibit-o = $(filter-out .os,$(object-suffixes)) + + include $(..)Rules +- +-$(objpfx)libcidn.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a +Index: glibc-2.17-c758a686/locale/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/locale/Makefile ++++ glibc-2.17-c758a686/locale/Makefile +@@ -99,9 +99,3 @@ cpp-srcs-left := $(localedef-modules) $( + $(lib-modules) + lib := locale-programs + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) +- +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libBrokenLocale.so: $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a +Index: glibc-2.17-c758a686/login/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/login/Makefile ++++ glibc-2.17-c758a686/login/Makefile +@@ -76,8 +76,3 @@ endif + $(inst_libexecdir)/pt_chown: $(objpfx)pt_chown $(+force) + $(make-target-directory) + -$(INSTALL_PROGRAM) -m 4755 -o root $< $@ +- +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libutil.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a +Index: glibc-2.17-c758a686/malloc/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/malloc/Makefile ++++ glibc-2.17-c758a686/malloc/Makefile +@@ -151,7 +151,7 @@ $(objpfx)memusage: memusage.sh + + + # The implementation uses `dlsym' +-$(objpfx)libmemusage.so: $(common-objpfx)dlfcn/libdl.so $(elfobjdir)/ld.so ++$(objpfx)libmemusage.so: $(common-objpfx)dlfcn/libdl.so + + # Extra dependencies + $(foreach o,$(all-object-suffixes),$(objpfx)malloc$(o)): arena.c hooks.c +Index: glibc-2.17-c758a686/math/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/math/Makefile ++++ glibc-2.17-c758a686/math/Makefile +@@ -203,8 +203,3 @@ gmp-objs = $(patsubst %,$(common-objpfx) + $(objpfx)atest-exp: $(gmp-objs) + $(objpfx)atest-sincos: $(gmp-objs) + $(objpfx)atest-exp2: $(gmp-objs) +- +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libm.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a +Index: glibc-2.17-c758a686/nis/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nis/Makefile ++++ glibc-2.17-c758a686/nis/Makefile +@@ -77,12 +77,12 @@ $(objpfx)libnss_nis.so: $(objpfx)libnsl. + $(common-objpfx)nss/libnss_files.so + $(objpfx)libnss_nisplus.so: $(objpfx)libnsl.so$(libnsl.so-version) + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. + libnsl-libc = $(common-objpfx)linkobj/libc.so +-$(services:%=$(objpfx)libnss_%.so) $(objpfx)libnsl.so: $(libnsl-libc) \ +- $(common-objpfx)libc_nonshared.a ++# Target-specific variable setting to link objects using deprecated ++# RPC interfaces with the version of libc.so that makes them available ++# for new links: ++$(services:%=$(objpfx)libnss_%.so) $(objpfx)libnsl.so: \ ++ libc-for-link = $(libnsl-libc) + + + ifeq ($(build-shared),yes) +Index: glibc-2.17-c758a686/nptl/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nptl/Makefile ++++ glibc-2.17-c758a686/nptl/Makefile +@@ -530,14 +530,6 @@ $(objpfx)libpthread.so: $(addprefix $(ob + $(objpfx)libpthread.so: +preinit += $(addprefix $(objpfx),$(crti-objs)) + $(objpfx)libpthread.so: +postinit += $(addprefix $(objpfx),$(crtn-objs)) + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-# Depend on ld.so too to get proper versions of ld.so symbols. +-$(objpfx)libpthread.so: $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a \ +- $(elfobjdir)/ld.so +- + # Make sure we link with the thread library. + ifeq ($(build-shared),yes) + $(addprefix $(objpfx), \ +Index: glibc-2.17-c758a686/nptl_db/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nptl_db/Makefile ++++ glibc-2.17-c758a686/nptl_db/Makefile +@@ -51,12 +51,6 @@ libthread_db.so-no-z-defs = yes + + include ../Rules + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libthread_db.so: $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a +- + tests: $(objpfx)db-symbols.out + $(objpfx)db-symbols.out: $(objpfx)db-symbols.v.i \ + $(common-objpfx)nptl/libpthread.so +Index: glibc-2.17-c758a686/nss/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/nss/Makefile ++++ glibc-2.17-c758a686/nss/Makefile +@@ -86,12 +86,11 @@ ifeq (yes,$(have-selinux)) + LDLIBS-makedb := -lselinux + endif + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. + libnss-libc = $(common-objpfx)linkobj/libc.so +-$(services:%=$(objpfx)libnss_%.so): $(libnss-libc) \ +- $(common-objpfx)libc_nonshared.a ++# Target-specific variable setting to link objects using deprecated ++# RPC interfaces with the version of libc.so that makes them available ++# for new links: ++$(services:%=$(objpfx)libnss_%.so): libc-for-link = $(libnss-libc) + + $(objpfx)libnss_db.so: $(objpfx)libnss_files.so + +@@ -109,8 +108,7 @@ $(inst_vardbdir)/Makefile: db-Makefile $ + $(do-install) + + libof-nss_test1 = extramodules +-$(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a ++$(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(link-libc-deps) + $(build-module) + ifdef libnss_test1.so-version + $(objpfx)/libnss_test1.so$(libnss_test1.so-version): $(objpfx)/libnss_test1.so +Index: glibc-2.17-c758a686/ports/sysdeps/arm/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/arm/Makefile ++++ glibc-2.17-c758a686/ports/sysdeps/arm/Makefile +@@ -25,11 +25,6 @@ sysdep_routines += $(aeabi_constants) $( + static-only-routines += $(aeabi_constants) + endif + +-# to pull in __aeabi_read_tp, needed for tls +-ifeq ($(subdir),malloc) +-$(objpfx)libmemusage.so: $(common-objpfx)libc_nonshared.a +-endif +- + ifeq ($(subdir),gmon) + sysdep_routines += arm-mcount + endif +@@ -37,7 +32,3 @@ endif + ifeq ($(subdir),debug) + CFLAGS-backtrace.c += -funwind-tables + endif +- +-ifeq ($(subdir),math) +-$(objpfx)libm.so: $(elfobjdir)/ld.so +-endif +Index: glibc-2.17-c758a686/resolv/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/resolv/Makefile ++++ glibc-2.17-c758a686/resolv/Makefile +@@ -88,23 +88,11 @@ CFLAGS-res_hconf.c = -fexceptions + # The BIND code elicits some harmless warnings. + +cflags += -Wno-strict-prototypes -Wno-write-strings + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)libresolv.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a +-# Some hosts need '__stack_chk_guard', so pull in the definition from +-# ld.so if required. +-ifeq (yes,$(have-ssp)) +-LDLIBS-resolv.so += $(as-needed) $(elfobjdir)/ld.so $(no-as-needed) +-endif +- + # The DNS NSS modules needs the resolver. +-$(objpfx)libnss_dns.so: $(objpfx)libresolv.so $(common-objpfx)libc.so \ +- $(common-objpfx)libc_nonshared.a ++$(objpfx)libnss_dns.so: $(objpfx)libresolv.so + + # The asynchronous name lookup code needs the thread library. +-$(objpfx)libanl.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a \ +- $(shared-thread-library) ++$(objpfx)libanl.so: $(shared-thread-library) + + $(objpfx)ga_test: $(objpfx)libanl.so $(shared-thread-library) + +Index: glibc-2.17-c758a686/rt/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/rt/Makefile ++++ glibc-2.17-c758a686/rt/Makefile +@@ -64,12 +64,7 @@ CFLAGS-librt-cancellation.c = -fasynchro + + LDFLAGS-rt.so = -Wl,--enable-new-dtags,-z,nodelete + +-# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +-# This ensures they will load libc.so for needed symbols if loaded by +-# a statically-linked program that hasn't already loaded it. +-$(objpfx)librt.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a \ +- $(shared-thread-library) \ +- $(elfobjdir)/ld.so ++$(objpfx)librt.so: $(shared-thread-library) + + ifeq (yes,$(build-shared)) + $(addprefix $(objpfx),$(tests)): $(objpfx)librt.so $(shared-thread-library) +Index: glibc-2.17-c758a686/stdlib/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/stdlib/Makefile ++++ glibc-2.17-c758a686/stdlib/Makefile +@@ -136,7 +136,7 @@ $(objpfx)tst-fmtmsg.out: tst-fmtmsg.sh $ + $(objpfx)tst-putenv: $(objpfx)tst-putenvmod.so + LDFLAGS-tst-putenv = $(no-as-needed) + +-$(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os ++$(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os $(link-libc-deps) + $(build-module) + libof-tst-putenvmod = extramodules + +Index: glibc-2.17-c758a686/sysdeps/i386/fpu/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/fpu/Makefile ++++ /dev/null +@@ -1,3 +0,0 @@ +-ifeq ($(subdir),math) +-$(objpfx)libm.so: $(elfobjdir)/ld.so +-endif +Index: glibc-2.17-c758a686/sysdeps/powerpc/fpu/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/powerpc/fpu/Makefile ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/Makefile +@@ -2,8 +2,6 @@ ifeq ($(subdir),math) + libm-support += fenv_const fe_nomask fe_mask t_sqrt + libm-tests += test-powerpc-snan + +-# libm needs ld.so to access dl_hwcap +-$(objpfx)libm.so: $(elfobjdir)/ld.so + endif + + ifeq ($(subdir),stdlib) diff --git a/SOURCES/glibc-rh1292018-0b.patch b/SOURCES/glibc-rh1292018-0b.patch new file mode 100644 index 0000000..a764cbb --- /dev/null +++ b/SOURCES/glibc-rh1292018-0b.patch @@ -0,0 +1,148 @@ +Needed to get future uses of all-dl-routines to include +__get_cpu_features into the right shared object routines. + +commit ac9e0e5e401fa634667a8284a0db0ca886bf816b +Author: Roland McGrath +Date: Fri Feb 6 10:42:08 2015 -0800 + + Clean up sysdep-dl-routines variable. + +Index: glibc-2.17-c758a686/elf/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -22,7 +22,7 @@ subdir := elf + include ../Makeconfig + + headers = elf.h bits/elfclass.h link.h bits/link.h +-routines = $(dl-routines) dl-support dl-iteratephdr \ ++routines = $(all-dl-routines) dl-support dl-iteratephdr \ + dl-addr enbl-secure dl-profstub \ + dl-origin dl-libc dl-sym dl-tsd dl-sysdep + +@@ -43,7 +43,7 @@ shared-only-routines += dl-caller + + # ld.so uses those routines, plus some special stuff for being the program + # interpreter and operating independent of libc. +-rtld-routines := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal ++rtld-routines = rtld $(all-dl-routines) dl-sysdep dl-environ dl-minimal + all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines) + + CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables +Index: glibc-2.17-c758a686/ports/sysdeps/aarch64/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/aarch64/Makefile ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/Makefile +@@ -2,8 +2,6 @@ long-double-fcts = yes + + ifeq ($(subdir),elf) + sysdep-dl-routines += tlsdesc dl-tlsdesc +-sysdep_routines += tlsdesc dl-tlsdesc +-sysdep-rtld-routines += tlsdesc dl-tlsdesc + gen-as-const-headers += dl-link.sym + endif + +Index: glibc-2.17-c758a686/ports/sysdeps/arm/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/arm/Makefile ++++ glibc-2.17-c758a686/ports/sysdeps/arm/Makefile +@@ -3,8 +3,8 @@ static-gnulib-arch = $(elfobjdir)/libgcc + + ifeq ($(subdir),elf) + sysdep-dl-routines += tlsdesc dl-tlsdesc +-sysdep_routines += aeabi_unwind_cpp_pr1 find_exidx tlsdesc dl-tlsdesc +-sysdep-rtld-routines += aeabi_unwind_cpp_pr1 tlsdesc dl-tlsdesc ++sysdep_routines += aeabi_unwind_cpp_pr1 find_exidx ++sysdep-rtld-routines += aeabi_unwind_cpp_pr1 + shared-only-routines += aeabi_unwind_cpp_pr1 + + $(objpfx)libgcc-stubs.a: $(objpfx)aeabi_unwind_cpp_pr1.os +Index: glibc-2.17-c758a686/ports/sysdeps/hppa/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/hppa/Makefile ++++ glibc-2.17-c758a686/ports/sysdeps/hppa/Makefile +@@ -24,8 +24,6 @@ LDFLAGS-c_pic.os += -Wl,--unique=.text* + ifeq ($(subdir),elf) + CFLAGS-rtld.c += -mdisable-fpregs + sysdep-dl-routines += dl-symaddr dl-fptr +-sysdep_routines += $(sysdep-dl-routines) +-sysdep-rtld-routines += $(sysdep-dl-routines) + endif + + ifeq ($(subdir),csu) +Index: glibc-2.17-c758a686/sysdeps/i386/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/Makefile ++++ glibc-2.17-c758a686/sysdeps/i386/Makefile +@@ -74,8 +74,6 @@ endif + + ifeq ($(subdir),elf) + sysdep-dl-routines += tlsdesc dl-tlsdesc +-sysdep_routines += tlsdesc dl-tlsdesc +-sysdep-rtld-routines += tlsdesc dl-tlsdesc + endif + + ifeq ($(subdir),csu) +Index: glibc-2.17-c758a686/ports/sysdeps/ia64/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/ia64/Makefile ++++ glibc-2.17-c758a686/ports/sysdeps/ia64/Makefile +@@ -17,6 +17,4 @@ endif + + ifeq ($(subdir),elf) + sysdep-dl-routines += dl-symaddr dl-fptr +-sysdep_routines += $(sysdep-dl-routines) +-sysdep-rtld-routines += $(sysdep-dl-routines) + endif +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/ia64/Makefile ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/ia64/Makefile +@@ -14,8 +14,6 @@ endif + + ifeq ($(subdir),elf) + sysdep-dl-routines += dl-static +-sysdep_routines += $(sysdep-dl-routines) +-sysdep-rtld-routines += $(sysdep-dl-routines) + endif + + ifeq ($(subdir),rt) +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/ports/sysdeps/unix/sysv/linux/mips/Makefile ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/mips/Makefile +@@ -49,8 +49,6 @@ ifeq ($(subdir),elf) + ifeq ($(build-shared),yes) + # This is needed for DSO loading from static binaries. + sysdep-dl-routines += dl-static +-sysdep_routines += dl-static +-sysdep-rtld-routines += dl-static + endif + endif + +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/powerpc/Makefile ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/Makefile +@@ -21,8 +21,6 @@ sysdep_routines += dl-vdso + ifeq ($(build-shared),yes) + # This is needed for DSO loading from static binaries. + sysdep-dl-routines += dl-static +-sysdep_routines += dl-static +-sysdep-rtld-routines += dl-static + endif + endif + +Index: glibc-2.17-c758a686/sysdeps/x86_64/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/Makefile ++++ glibc-2.17-c758a686/sysdeps/x86_64/Makefile +@@ -20,8 +20,6 @@ endif + + ifeq ($(subdir),elf) + sysdep-dl-routines += tlsdesc dl-tlsdesc +-sysdep_routines += tlsdesc dl-tlsdesc +-sysdep-rtld-routines += tlsdesc dl-tlsdesc + + tests += tst-quad1 tst-quad2 + modules-names += tst-quadmod1 tst-quadmod2 diff --git a/SOURCES/glibc-rh1292018-1.patch b/SOURCES/glibc-rh1292018-1.patch new file mode 100644 index 0000000..b54b0b3 --- /dev/null +++ b/SOURCES/glibc-rh1292018-1.patch @@ -0,0 +1,1522 @@ +We add back Prefer_SSE_for_memop since we still need it for all of the +existing era implementations for RHEL 7.3. To remove it would require +a more wholesale backport of optmized routines. + +commit e2e4f56056adddc3c1efe676b40a4b4f2453103b +Author: H.J. Lu +Date: Thu Aug 13 03:37:47 2015 -0700 + + Add _dl_x86_cpu_features to rtld_global + + This patch adds _dl_x86_cpu_features to rtld_global in x86 ld.so + and initializes it early before __libc_start_main is called so that + cpu_features is always available when it is used and we can avoid + calling __init_cpu_features in IFUNC selectors. + +Index: glibc-2.17-c758a686/sysdeps/i386/dl-machine.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/dl-machine.h ++++ glibc-2.17-c758a686/sysdeps/i386/dl-machine.h +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + /* Return nonzero iff ELF header is compatible with the running host. */ + static inline int __attribute__ ((unused)) +@@ -266,6 +267,8 @@ dl_platform_init (void) + if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0') + /* Avoid an empty string which would disturb us. */ + GLRO(dl_platform) = NULL; ++ ++ init_cpu_features (&GLRO(dl_x86_cpu_features)); + } + + static inline Elf32_Addr +Index: glibc-2.17-c758a686/sysdeps/i386/dl-procinfo.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/dl-procinfo.c ++++ glibc-2.17-c758a686/sysdeps/i386/dl-procinfo.c +@@ -43,6 +43,22 @@ + # define PROCINFO_CLASS + #endif + ++#if !IS_IN (ldconfig) ++# if !defined PROCINFO_DECL && defined SHARED ++ ._dl_x86_cpu_features ++# else ++PROCINFO_CLASS struct cpu_features _dl_x86_cpu_features ++# endif ++# ifndef PROCINFO_DECL ++= { } ++# endif ++# if !defined SHARED || defined PROCINFO_DECL ++; ++# else ++, ++# endif ++#endif ++ + #if !defined PROCINFO_DECL && defined SHARED + ._dl_x86_cap_flags + #else +Index: glibc-2.17-c758a686/sysdeps/i386/i686/cacheinfo.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/cacheinfo.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/cacheinfo.c +@@ -8,6 +8,5 @@ + #define __x86_64_raw_shared_cache_size_half __x86_raw_shared_cache_size_half + + #define DISABLE_PREFETCHW +-#define DISABLE_PREFERRED_MEMORY_INSTRUCTION + + #include +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/Makefile ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/Makefile +@@ -1,5 +1,4 @@ + ifeq ($(subdir),csu) +-aux += init-arch + tests += test-multiarch + gen-as-const-headers += ifunc-defines.sym + endif +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/Versions +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/Versions ++++ /dev/null +@@ -1,5 +0,0 @@ +-libc { +- GLIBC_PRIVATE { +- __get_cpu_features; +- } +-} +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/ifunc-defines.sym +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/ifunc-defines.sym ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/ifunc-defines.sym +@@ -4,7 +4,6 @@ + -- + + CPU_FEATURES_SIZE sizeof (struct cpu_features) +-KIND_OFFSET offsetof (struct cpu_features, kind) + CPUID_OFFSET offsetof (struct cpu_features, cpuid) + CPUID_SIZE sizeof (struct cpuid_registers) + CPUID_EAX_OFFSET offsetof (struct cpuid_registers, eax) +Index: glibc-2.17-c758a686/sysdeps/i386/ldsodefs.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/ldsodefs.h ++++ glibc-2.17-c758a686/sysdeps/i386/ldsodefs.h +@@ -20,6 +20,7 @@ + #define _I386_LDSODEFS_H 1 + + #include ++#include + + struct La_i86_regs; + struct La_i86_retval; +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c +@@ -1,5 +1,5 @@ + #if IS_IN (ldconfig) + # include + #else +-# include ++# include + #endif +Index: glibc-2.17-c758a686/sysdeps/x86/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86/Makefile ++++ glibc-2.17-c758a686/sysdeps/x86/Makefile +@@ -7,3 +7,14 @@ $(objpfx)tst-xmmymmzmm.out: ../sysdeps/x + @echo "Checking ld.so for SSE register use. This will take a few seconds..." + $(SHELL) $< $(objpfx) '$(NM)' '$(OBJDUMP)' '$(READELF)' > $@ + endif ++ ++ifeq ($(subdir),csu) ++gen-as-const-headers += cpu-features-offsets.sym rtld-global-offsets.sym ++endif ++ ++ifeq ($(subdir),elf) ++sysdep-dl-routines += dl-get-cpu-features ++ ++tests += tst-get-cpu-features ++tests-static += tst-get-cpu-features-static ++endif +Index: glibc-2.17-c758a686/sysdeps/x86/Versions +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/Versions +@@ -0,0 +1,5 @@ ++ld { ++ GLIBC_PRIVATE { ++ __get_cpu_features; ++ } ++} +Index: glibc-2.17-c758a686/sysdeps/x86/cpu-features-offsets.sym +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/cpu-features-offsets.sym +@@ -0,0 +1,7 @@ ++#define SHARED 1 ++ ++#include ++ ++#define rtld_global_ro_offsetof(mem) offsetof (struct rtld_global_ro, mem) ++ ++RTLD_GLOBAL_RO_DL_X86_CPU_FEATURES_OFFSET rtld_global_ro_offsetof (_dl_x86_cpu_features) +Index: glibc-2.17-c758a686/sysdeps/x86/cpu-features.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/cpu-features.c +@@ -0,0 +1,213 @@ ++/* Initialize CPU feature data. ++ This file is part of the GNU C Library. ++ Copyright (C) 2008-2015 Free Software Foundation, Inc. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++static inline void ++get_common_indeces (struct cpu_features *cpu_features, ++ unsigned int *family, unsigned int *model) ++{ ++ unsigned int eax; ++ __cpuid (1, eax, cpu_features->cpuid[COMMON_CPUID_INDEX_1].ebx, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_1].edx); ++ GLRO(dl_x86_cpu_features).cpuid[COMMON_CPUID_INDEX_1].eax = eax; ++ *family = (eax >> 8) & 0x0f; ++ *model = (eax >> 4) & 0x0f; ++} ++ ++static inline void ++init_cpu_features (struct cpu_features *cpu_features) ++{ ++ unsigned int ebx, ecx, edx; ++ unsigned int family = 0; ++ unsigned int model = 0; ++ enum cpu_features_kind kind; ++ ++ __cpuid (0, cpu_features->max_cpuid, ebx, ecx, edx); ++ ++ /* This spells out "GenuineIntel". */ ++ if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69) ++ { ++ kind = arch_kind_intel; ++ ++ get_common_indeces (cpu_features, &family, &model); ++ ++ /* Intel processors prefer SSE instruction for memory/string ++ routines if they are available. */ ++ cpu_features->feature[index_Prefer_SSE_for_memop] ++ |= bit_Prefer_SSE_for_memop; ++ ++ unsigned int eax = cpu_features->cpuid[COMMON_CPUID_INDEX_1].eax; ++ unsigned int extended_family = (eax >> 20) & 0xff; ++ unsigned int extended_model = (eax >> 12) & 0xf0; ++ if (family == 0x0f) ++ { ++ family += extended_family; ++ model += extended_model; ++ } ++ else if (family == 0x06) ++ { ++ ecx = cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx; ++ model += extended_model; ++ switch (model) ++ { ++ case 0x1c: ++ case 0x26: ++ /* BSF is slow on Atom. */ ++ cpu_features->feature[index_Slow_BSF] |= bit_Slow_BSF; ++ break; ++ ++ case 0x37: ++ case 0x4a: ++ case 0x4d: ++ case 0x5a: ++ case 0x5d: ++ /* Unaligned load versions are faster than SSSE3 ++ on Silvermont. */ ++#if index_Fast_Unaligned_Load != index_Prefer_PMINUB_for_stringop ++# error index_Fast_Unaligned_Load != index_Prefer_PMINUB_for_stringop ++#endif ++#if index_Fast_Unaligned_Load != index_Slow_SSE4_2 ++# error index_Fast_Unaligned_Load != index_Slow_SSE4_2 ++#endif ++ cpu_features->feature[index_Fast_Unaligned_Load] ++ |= (bit_Fast_Unaligned_Load ++ | bit_Prefer_PMINUB_for_stringop ++ | bit_Slow_SSE4_2); ++ break; ++ ++ default: ++ /* Unknown family 0x06 processors. Assuming this is one ++ of Core i3/i5/i7 processors if AVX is available. */ ++ if ((ecx & bit_AVX) == 0) ++ break; ++ ++ case 0x1a: ++ case 0x1e: ++ case 0x1f: ++ case 0x25: ++ case 0x2c: ++ case 0x2e: ++ case 0x2f: ++ /* Rep string instructions, copy backward, unaligned loads ++ and pminub are fast on Intel Core i3, i5 and i7. */ ++#if index_Fast_Rep_String != index_Fast_Copy_Backward ++# error index_Fast_Rep_String != index_Fast_Copy_Backward ++#endif ++#if index_Fast_Rep_String != index_Fast_Unaligned_Load ++# error index_Fast_Rep_String != index_Fast_Unaligned_Load ++#endif ++#if index_Fast_Rep_String != index_Prefer_PMINUB_for_stringop ++# error index_Fast_Rep_String != index_Prefer_PMINUB_for_stringop ++#endif ++ cpu_features->feature[index_Fast_Rep_String] ++ |= (bit_Fast_Rep_String ++ | bit_Fast_Copy_Backward ++ | bit_Fast_Unaligned_Load ++ | bit_Prefer_PMINUB_for_stringop); ++ break; ++ } ++ } ++ } ++ /* This spells out "AuthenticAMD". */ ++ else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65) ++ { ++ kind = arch_kind_amd; ++ ++ get_common_indeces (cpu_features, &family, &model); ++ ++ ecx = cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx; ++ ++ /* AMD processors prefer SSE instructions for memory/string routines ++ if they are available, otherwise they prefer integer instructions. */ ++ if ((ecx & 0x200)) ++ cpu_features->feature[index_Prefer_SSE_for_memop] ++ |= bit_Prefer_SSE_for_memop; ++ ++ unsigned int eax; ++ __cpuid (0x80000000, eax, ebx, ecx, edx); ++ if (eax >= 0x80000001) ++ __cpuid (0x80000001, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].eax, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ebx, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ecx, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].edx); ++ } ++ else ++ kind = arch_kind_other; ++ ++ if (cpu_features->max_cpuid >= 7) ++ __cpuid_count (7, 0, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_7].eax, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_7].ebx, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_7].ecx, ++ cpu_features->cpuid[COMMON_CPUID_INDEX_7].edx); ++ ++ /* Can we call xgetbv? */ ++ if (HAS_CPU_FEATURE (OSXSAVE)) ++ { ++ unsigned int xcrlow; ++ unsigned int xcrhigh; ++ asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0)); ++ /* Is YMM and XMM state usable? */ ++ if ((xcrlow & (bit_YMM_state | bit_XMM_state)) == ++ (bit_YMM_state | bit_XMM_state)) ++ { ++ /* Determine if AVX is usable. */ ++ if (HAS_CPU_FEATURE (AVX)) ++ cpu_features->feature[index_AVX_Usable] |= bit_AVX_Usable; ++#if index_AVX2_Usable != index_AVX_Fast_Unaligned_Load ++# error index_AVX2_Usable != index_AVX_Fast_Unaligned_Load ++#endif ++ /* Determine if AVX2 is usable. Unaligned load with 256-bit ++ AVX registers are faster on processors with AVX2. */ ++ if (HAS_CPU_FEATURE (AVX2)) ++ cpu_features->feature[index_AVX2_Usable] ++ |= bit_AVX2_Usable | bit_AVX_Fast_Unaligned_Load; ++ /* Check if OPMASK state, upper 256-bit of ZMM0-ZMM15 and ++ ZMM16-ZMM31 state are enabled. */ ++ if ((xcrlow & (bit_Opmask_state | bit_ZMM0_15_state ++ | bit_ZMM16_31_state)) == ++ (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state)) ++ { ++ /* Determine if AVX512F is usable. */ ++ if (HAS_CPU_FEATURE (AVX512F)) ++ { ++ cpu_features->feature[index_AVX512F_Usable] ++ |= bit_AVX512F_Usable; ++ /* Determine if AVX512DQ is usable. */ ++ if (HAS_CPU_FEATURE (AVX512DQ)) ++ cpu_features->feature[index_AVX512DQ_Usable] ++ |= bit_AVX512DQ_Usable; ++ } ++ } ++ /* Determine if FMA is usable. */ ++ if (HAS_CPU_FEATURE (FMA)) ++ cpu_features->feature[index_FMA_Usable] |= bit_FMA_Usable; ++ /* Determine if FMA4 is usable. */ ++ if (HAS_CPU_FEATURE (FMA4)) ++ cpu_features->feature[index_FMA4_Usable] |= bit_FMA4_Usable; ++ } ++ } ++ ++ cpu_features->family = family; ++ cpu_features->model = model; ++ cpu_features->kind = kind; ++} +Index: glibc-2.17-c758a686/sysdeps/x86/cpu-features.h +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/cpu-features.h +@@ -0,0 +1,273 @@ ++/* This file is part of the GNU C Library. ++ Copyright (C) 2008-2015 Free Software Foundation, Inc. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef cpu_features_h ++#define cpu_features_h ++ ++#define bit_Fast_Rep_String (1 << 0) ++#define bit_Fast_Copy_Backward (1 << 1) ++#define bit_Slow_BSF (1 << 2) ++#define bit_Prefer_SSE_for_memop (1 << 3) ++#define bit_Fast_Unaligned_Load (1 << 4) ++#define bit_Prefer_PMINUB_for_stringop (1 << 5) ++#define bit_AVX_Usable (1 << 6) ++#define bit_FMA_Usable (1 << 7) ++#define bit_FMA4_Usable (1 << 8) ++#define bit_Slow_SSE4_2 (1 << 9) ++#define bit_AVX2_Usable (1 << 10) ++#define bit_AVX_Fast_Unaligned_Load (1 << 11) ++#define bit_AVX512F_Usable (1 << 12) ++#define bit_AVX512DQ_Usable (1 << 13) ++ ++/* CPUID Feature flags. */ ++ ++/* COMMON_CPUID_INDEX_1. */ ++#define bit_SSE2 (1 << 26) ++#define bit_SSSE3 (1 << 9) ++#define bit_SSE4_1 (1 << 19) ++#define bit_SSE4_2 (1 << 20) ++#define bit_OSXSAVE (1 << 27) ++#define bit_AVX (1 << 28) ++#define bit_POPCOUNT (1 << 23) ++#define bit_FMA (1 << 12) ++#define bit_FMA4 (1 << 16) ++ ++/* COMMON_CPUID_INDEX_7. */ ++#define bit_RTM (1 << 11) ++#define bit_AVX2 (1 << 5) ++#define bit_AVX512F (1 << 16) ++#define bit_AVX512DQ (1 << 17) ++ ++/* XCR0 Feature flags. */ ++#define bit_XMM_state (1 << 1) ++#define bit_YMM_state (2 << 1) ++#define bit_Opmask_state (1 << 5) ++#define bit_ZMM0_15_state (1 << 6) ++#define bit_ZMM16_31_state (1 << 7) ++ ++/* The integer bit array index for the first set of internal feature bits. */ ++#define FEATURE_INDEX_1 0 ++ ++/* The current maximum size of the feature integer bit array. */ ++#define FEATURE_INDEX_MAX 1 ++ ++#ifdef __ASSEMBLER__ ++ ++# include ++# include ++ ++# define index_SSE2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_EDX_OFFSET ++# define index_SSSE3 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET ++# define index_SSE4_1 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET ++# define index_SSE4_2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET ++# define index_AVX COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET ++# define index_AVX2 COMMON_CPUID_INDEX_7*CPUID_SIZE+CPUID_EBX_OFFSET ++ ++# define index_Fast_Rep_String FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Fast_Copy_Backward FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Slow_BSF FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Prefer_SSE_for_memop FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Fast_Unaligned_Load FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Prefer_PMINUB_for_stringop FEATURE_INDEX_1*FEATURE_SIZE ++# define index_AVX_Usable FEATURE_INDEX_1*FEATURE_SIZE ++# define index_FMA_Usable FEATURE_INDEX_1*FEATURE_SIZE ++# define index_FMA4_Usable FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Slow_SSE4_2 FEATURE_INDEX_1*FEATURE_SIZE ++# define index_AVX2_Usable FEATURE_INDEX_1*FEATURE_SIZE ++# define index_AVX_Fast_Unaligned_Load FEATURE_INDEX_1*FEATURE_SIZE ++# define index_AVX512F_Usable FEATURE_INDEX_1*FEATURE_SIZE ++# define index_AVX512DQ_Usable FEATURE_INDEX_1*FEATURE_SIZE ++ ++# if defined (_LIBC) && !IS_IN (nonlib) ++# ifdef __x86_64__ ++# ifdef SHARED ++# if IS_IN (rtld) ++# define LOAD_RTLD_GLOBAL_RO_RDX ++# define HAS_FEATURE(offset, name) \ ++ testl $(bit_##name), _rtld_local_ro+offset+(index_##name)(%rip) ++# else ++# define LOAD_RTLD_GLOBAL_RO_RDX \ ++ mov _rtld_global_ro@GOTPCREL(%rip), %RDX_LP ++# define HAS_FEATURE(offset, name) \ ++ testl $(bit_##name), \ ++ RTLD_GLOBAL_RO_DL_X86_CPU_FEATURES_OFFSET+offset+(index_##name)(%rdx) ++# endif ++# else /* SHARED */ ++# define LOAD_RTLD_GLOBAL_RO_RDX ++# define HAS_FEATURE(offset, name) \ ++ testl $(bit_##name), _dl_x86_cpu_features+offset+(index_##name)(%rip) ++# endif /* !SHARED */ ++# else /* __x86_64__ */ ++# ifdef SHARED ++# define LOAD_FUNC_GOT_EAX(func) \ ++ leal func@GOTOFF(%edx), %eax ++# if IS_IN (rtld) ++# define LOAD_GOT_AND_RTLD_GLOBAL_RO \ ++ LOAD_PIC_REG(dx) ++# define HAS_FEATURE(offset, name) \ ++ testl $(bit_##name), offset+(index_##name)+_rtld_local_ro@GOTOFF(%edx) ++# else ++# define LOAD_GOT_AND_RTLD_GLOBAL_RO \ ++ LOAD_PIC_REG(dx); \ ++ mov _rtld_global_ro@GOT(%edx), %ecx ++# define HAS_FEATURE(offset, name) \ ++ testl $(bit_##name), \ ++ RTLD_GLOBAL_RO_DL_X86_CPU_FEATURES_OFFSET+offset+(index_##name)(%ecx) ++# endif ++# else /* SHARED */ ++# define LOAD_FUNC_GOT_EAX(func) \ ++ leal func, %eax ++# define LOAD_GOT_AND_RTLD_GLOBAL_RO ++# define HAS_FEATURE(offset, name) \ ++ testl $(bit_##name), _dl_x86_cpu_features+offset+(index_##name) ++# endif /* !SHARED */ ++# endif /* !__x86_64__ */ ++# else /* _LIBC && !nonlib */ ++# error "Sorry, is unimplemented for assembler" ++# endif /* !_LIBC || nonlib */ ++ ++/* HAS_* evaluates to true if we may use the feature at runtime. */ ++# define HAS_CPU_FEATURE(name) HAS_FEATURE (CPUID_OFFSET, name) ++# define HAS_ARCH_FEATURE(name) HAS_FEATURE (FEATURE_OFFSET, name) ++ ++#else /* __ASSEMBLER__ */ ++ ++# include ++# include ++# include ++# include ++ ++/* Ugly hack to make it possible to select a strstr and strcasestr ++ implementation that avoids using the stack for 16-byte aligned ++ SSE temporaries. Doing so makes it possible to call the functions ++ with a stack that's not 16-byte aligned as can happen, for example, ++ as a result of compiling the functions' callers with the GCC ++ -mpreferred-stack-boubdary=2 or =3 option, or with the ICC ++ -falign-stack=assume-4-byte option. See rhbz 1150282 for details. ++ ++ The ifunc selector uses the unaligned version by default if this ++ file exists and is accessible. */ ++# define ENABLE_STRSTR_UNALIGNED_PATHNAME \ ++ "/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned" ++ ++static bool __attribute__ ((unused)) ++use_unaligned_strstr (void) ++{ ++ struct stat unaligned_strstr_etc_sysconfig_file; ++ ++ /* TLS may not have been set up yet, so avoid using stat since it tries to ++ set errno. */ ++ return INTERNAL_SYSCALL (stat, , 2, ++ ENABLE_STRSTR_UNALIGNED_PATHNAME, ++ &unaligned_strstr_etc_sysconfig_file) == 0; ++} ++ ++enum ++ { ++ COMMON_CPUID_INDEX_1 = 0, ++ COMMON_CPUID_INDEX_7, ++ COMMON_CPUID_INDEX_80000001, /* for AMD */ ++ /* Keep the following line at the end. */ ++ COMMON_CPUID_INDEX_MAX ++ }; ++ ++struct cpu_features ++{ ++ enum cpu_features_kind ++ { ++ arch_kind_unknown = 0, ++ arch_kind_intel, ++ arch_kind_amd, ++ arch_kind_other ++ } kind; ++ int max_cpuid; ++ struct cpuid_registers ++ { ++ unsigned int eax; ++ unsigned int ebx; ++ unsigned int ecx; ++ unsigned int edx; ++ } cpuid[COMMON_CPUID_INDEX_MAX]; ++ unsigned int family; ++ unsigned int model; ++ unsigned int feature[FEATURE_INDEX_MAX]; ++}; ++ ++/* Used from outside of glibc to get access to the CPU features ++ structure. */ ++extern const struct cpu_features *__get_cpu_features (void) ++ __attribute__ ((const)); ++ ++# if defined (_LIBC) && !IS_IN (nonlib) ++/* Unused for x86. */ ++# define INIT_ARCH() ++# define __get_cpu_features() (&GLRO(dl_x86_cpu_features)) ++# endif ++ ++ ++/* HAS_* evaluates to true if we may use the feature at runtime. */ ++# define HAS_CPU_FEATURE(name) \ ++ ((__get_cpu_features ()->cpuid[index_##name].reg_##name & (bit_##name)) != 0) ++# define HAS_ARCH_FEATURE(name) \ ++ ((__get_cpu_features ()->feature[index_##name] & (bit_##name)) != 0) ++ ++# define index_SSE2 COMMON_CPUID_INDEX_1 ++# define index_SSSE3 COMMON_CPUID_INDEX_1 ++# define index_SSE4_1 COMMON_CPUID_INDEX_1 ++# define index_SSE4_2 COMMON_CPUID_INDEX_1 ++# define index_AVX COMMON_CPUID_INDEX_1 ++# define index_AVX2 COMMON_CPUID_INDEX_7 ++# define index_AVX512F COMMON_CPUID_INDEX_7 ++# define index_AVX512DQ COMMON_CPUID_INDEX_7 ++# define index_RTM COMMON_CPUID_INDEX_7 ++# define index_FMA COMMON_CPUID_INDEX_1 ++# define index_FMA4 COMMON_CPUID_INDEX_80000001 ++# define index_POPCOUNT COMMON_CPUID_INDEX_1 ++# define index_OSXSAVE COMMON_CPUID_INDEX_1 ++ ++# define reg_SSE2 edx ++# define reg_SSSE3 ecx ++# define reg_SSE4_1 ecx ++# define reg_SSE4_2 ecx ++# define reg_AVX ecx ++# define reg_AVX2 ebx ++# define reg_AVX512F ebx ++# define reg_AVX512DQ ebx ++# define reg_RTM ebx ++# define reg_FMA ecx ++# define reg_FMA4 ecx ++# define reg_POPCOUNT ecx ++# define reg_OSXSAVE ecx ++ ++# define index_Fast_Rep_String FEATURE_INDEX_1 ++# define index_Fast_Copy_Backward FEATURE_INDEX_1 ++# define index_Slow_BSF FEATURE_INDEX_1 ++# define index_Prefer_SSE_for_memop FEATURE_INDEX_1 ++# define index_Fast_Unaligned_Load FEATURE_INDEX_1 ++# define index_Prefer_PMINUB_for_stringop FEATURE_INDEX_1 ++# define index_AVX_Usable FEATURE_INDEX_1 ++# define index_FMA_Usable FEATURE_INDEX_1 ++# define index_FMA4_Usable FEATURE_INDEX_1 ++# define index_Slow_SSE4_2 FEATURE_INDEX_1 ++# define index_AVX2_Usable FEATURE_INDEX_1 ++# define index_AVX_Fast_Unaligned_Load FEATURE_INDEX_1 ++# define index_AVX512F_Usable FEATURE_INDEX_1 ++# define index_AVX512DQ_Usable FEATURE_INDEX_1 ++ ++#endif /* !__ASSEMBLER__ */ ++ ++#endif /* cpu_features_h */ +Index: glibc-2.17-c758a686/sysdeps/x86/dl-get-cpu-features.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/dl-get-cpu-features.c +@@ -0,0 +1,27 @@ ++/* This file is part of the GNU C Library. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++ ++#include ++ ++#undef __get_cpu_features ++ ++const struct cpu_features * ++__get_cpu_features (void) ++{ ++ return &GLRO(dl_x86_cpu_features); ++} +Index: glibc-2.17-c758a686/sysdeps/x86/libc-start.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/libc-start.c +@@ -0,0 +1,41 @@ ++/* Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifdef SHARED ++# include ++# else ++/* The main work is done in the generic function. */ ++# define LIBC_START_DISABLE_INLINE ++# define LIBC_START_MAIN generic_start_main ++# include ++# include ++# include ++ ++extern struct cpu_features _dl_x86_cpu_features; ++ ++int ++__libc_start_main (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), ++ int argc, char **argv, ++ __typeof (main) init, ++ void (*fini) (void), ++ void (*rtld_fini) (void), void *stack_end) ++{ ++ init_cpu_features (&_dl_x86_cpu_features); ++ return generic_start_main (main, argc, argv, init, fini, rtld_fini, ++ stack_end); ++} ++#endif +Index: glibc-2.17-c758a686/sysdeps/x86/rtld-global-offsets.sym +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/rtld-global-offsets.sym +@@ -0,0 +1,7 @@ ++#define SHARED 1 ++ ++#include ++ ++#define rtld_global_ro_offsetof(mem) offsetof (struct rtld_global_ro, mem) ++ ++RTLD_GLOBAL_RO_DL_X86_CPU_FEATURES_OFFSET rtld_global_ro_offsetof (_dl_x86_cpu_features) +Index: glibc-2.17-c758a686/sysdeps/x86/tst-get-cpu-features-static.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/tst-get-cpu-features-static.c +@@ -0,0 +1 @@ ++#include "tst-get-cpu-features.c" +Index: glibc-2.17-c758a686/sysdeps/x86/tst-get-cpu-features.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86/tst-get-cpu-features.c +@@ -0,0 +1,31 @@ ++/* Test case for x86 __get_cpu_features interface ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ if (__get_cpu_features ()->kind == arch_kind_unknown) ++ abort (); ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../../test-skeleton.c" +Index: glibc-2.17-c758a686/sysdeps/x86_64/cacheinfo.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/cacheinfo.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/cacheinfo.c +@@ -21,40 +21,11 @@ + #include + #include + #include ++#include "multiarch/init-arch.h" + +-#ifndef __cpuid_count +-/* FIXME: Provide __cpuid_count if it isn't defined. Copied from gcc +- 4.4.0. Remove this if gcc 4.4 is the minimum requirement. */ +-# if defined(__i386__) && defined(__PIC__) +-/* %ebx may be the PIC register. */ +-# define __cpuid_count(level, count, a, b, c, d) \ +- __asm__ ("xchg{l}\t{%%}ebx, %1\n\t" \ +- "cpuid\n\t" \ +- "xchg{l}\t{%%}ebx, %1\n\t" \ +- : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ +- : "0" (level), "2" (count)) +-# else +-# define __cpuid_count(level, count, a, b, c, d) \ +- __asm__ ("cpuid\n\t" \ +- : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ +- : "0" (level), "2" (count)) +-# endif +-#endif +- +-#ifdef USE_MULTIARCH +-# include "multiarch/init-arch.h" +- +-# define is_intel __cpu_features.kind == arch_kind_intel +-# define is_amd __cpu_features.kind == arch_kind_amd +-# define max_cpuid __cpu_features.max_cpuid +-#else +- /* This spells out "GenuineIntel". */ +-# define is_intel \ +- ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69 +- /* This spells out "AuthenticAMD". */ +-# define is_amd \ +- ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65 +-#endif ++#define is_intel GLRO(dl_x86_cpu_features).kind == arch_kind_intel ++#define is_amd GLRO(dl_x86_cpu_features).kind == arch_kind_amd ++#define max_cpuid GLRO(dl_x86_cpu_features).max_cpuid + + static const struct intel_02_cache_info + { +@@ -237,21 +208,8 @@ intel_check_word (int name, unsigned int + /* Intel reused this value. For family 15, model 6 it + specifies the 3rd level cache. Otherwise the 2nd + level cache. */ +- unsigned int family; +- unsigned int model; +-#ifdef USE_MULTIARCH +- family = __cpu_features.family; +- model = __cpu_features.model; +-#else +- unsigned int eax; +- unsigned int ebx; +- unsigned int ecx; +- unsigned int edx; +- __cpuid (1, eax, ebx, ecx, edx); +- +- family = ((eax >> 20) & 0xff) + ((eax >> 8) & 0xf); +- model = (((eax >>16) & 0xf) << 4) + ((eax >> 4) & 0xf); +-#endif ++ unsigned int family = GLRO(dl_x86_cpu_features).family; ++ unsigned int model = GLRO(dl_x86_cpu_features).model; + + if (family == 15 && model == 6) + { +@@ -478,18 +436,6 @@ long int + attribute_hidden + __cache_sysconf (int name) + { +-#ifdef USE_MULTIARCH +- if (__cpu_features.kind == arch_kind_unknown) +- __init_cpu_features (); +-#else +- /* Find out what brand of processor. */ +- unsigned int max_cpuid; +- unsigned int ebx; +- unsigned int ecx; +- unsigned int edx; +- __cpuid (0, max_cpuid, ebx, ecx, edx); +-#endif +- + if (is_intel) + return handle_intel (name, max_cpuid); + +@@ -525,18 +471,6 @@ long int __x86_64_raw_shared_cache_size + int __x86_64_prefetchw attribute_hidden; + #endif + +-#ifndef DISABLE_PREFERRED_MEMORY_INSTRUCTION +-/* Instructions preferred for memory and string routines. +- +- 0: Regular instructions +- 1: MMX instructions +- 2: SSE2 instructions +- 3: SSSE3 instructions +- +- */ +-int __x86_64_preferred_memory_instruction attribute_hidden; +-#endif +- + + static void + __attribute__((constructor)) +@@ -553,14 +487,6 @@ init_cacheinfo (void) + unsigned int level; + unsigned int threads = 0; + +-#ifdef USE_MULTIARCH +- if (__cpu_features.kind == arch_kind_unknown) +- __init_cpu_features (); +-#else +- int max_cpuid; +- __cpuid (0, max_cpuid, ebx, ecx, edx); +-#endif +- + if (is_intel) + { + data = handle_intel (_SC_LEVEL1_DCACHE_SIZE, max_cpuid); +@@ -576,34 +502,13 @@ init_cacheinfo (void) + shared = handle_intel (_SC_LEVEL2_CACHE_SIZE, max_cpuid); + } + +- unsigned int ebx_1; +- +-#ifdef USE_MULTIARCH +- eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax; +- ebx_1 = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ebx; +- ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx; +- edx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].edx; +-#else +- __cpuid (1, eax, ebx_1, ecx, edx); +-#endif +- +- unsigned int family = (eax >> 8) & 0x0f; +- unsigned int model = (eax >> 4) & 0x0f; +- unsigned int extended_model = (eax >> 12) & 0xf0; +- +-#ifndef DISABLE_PREFERRED_MEMORY_INSTRUCTION +- /* Intel prefers SSSE3 instructions for memory/string routines +- if they are available. */ +- if ((ecx & 0x200)) +- __x86_64_preferred_memory_instruction = 3; +- else +- __x86_64_preferred_memory_instruction = 2; +-#endif +- + /* Figure out the number of logical threads that share the + highest cache level. */ + if (max_cpuid >= 4) + { ++ unsigned int family = GLRO(dl_x86_cpu_features).family; ++ unsigned int model = GLRO(dl_x86_cpu_features).model; ++ + int i = 0; + + /* Query until desired cache level is enumerated. */ +@@ -655,7 +560,6 @@ init_cacheinfo (void) + threads += 1; + if (threads > 2 && level == 2 && family == 6) + { +- model += extended_model; + switch (model) + { + case 0x57: +@@ -678,7 +582,9 @@ init_cacheinfo (void) + intel_bug_no_cache_info: + /* Assume that all logical threads share the highest cache level. */ + +- threads = (ebx_1 >> 16) & 0xff; ++ threads ++ = ((GLRO(dl_x86_cpu_features).cpuid[COMMON_CPUID_INDEX_1].ebx ++ >> 16) & 0xff); + } + + /* Cap usage of highest cache level to the number of supported +@@ -693,25 +599,6 @@ init_cacheinfo (void) + long int core = handle_amd (_SC_LEVEL2_CACHE_SIZE); + shared = handle_amd (_SC_LEVEL3_CACHE_SIZE); + +-#ifndef DISABLE_PREFERRED_MEMORY_INSTRUCTION +-# ifdef USE_MULTIARCH +- eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax; +- ebx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ebx; +- ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx; +- edx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].edx; +-# else +- __cpuid (1, eax, ebx, ecx, edx); +-# endif +- +- /* AMD prefers SSSE3 instructions for memory/string routines +- if they are avaiable, otherwise it prefers integer +- instructions. */ +- if ((ecx & 0x200)) +- __x86_64_preferred_memory_instruction = 3; +- else +- __x86_64_preferred_memory_instruction = 0; +-#endif +- + /* Get maximum extended function. */ + __cpuid (0x80000000, max_cpuid_ex, ebx, ecx, edx); + +Index: glibc-2.17-c758a686/sysdeps/x86_64/dl-machine.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/dl-machine.h ++++ glibc-2.17-c758a686/sysdeps/x86_64/dl-machine.h +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + /* Return nonzero iff ELF header is compatible with the running host. */ + static inline int __attribute__ ((unused)) +@@ -200,6 +201,8 @@ dl_platform_init (void) + if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0') + /* Avoid an empty string which would disturb us. */ + GLRO(dl_platform) = NULL; ++ ++ init_cpu_features (&GLRO(dl_x86_cpu_features)); + } + + static inline ElfW(Addr) +Index: glibc-2.17-c758a686/sysdeps/x86_64/dl-procinfo.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/dl-procinfo.c +@@ -0,0 +1,57 @@ ++/* Data for x86-64 version of processor capability information. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* If anything should be added here check whether the size of each string ++ is still ok with the given array size. ++ ++ All the #ifdefs in the definitions are quite irritating but ++ necessary if we want to avoid duplicating the information. There ++ are three different modes: ++ ++ - PROCINFO_DECL is defined. This means we are only interested in ++ declarations. ++ ++ - PROCINFO_DECL is not defined: ++ ++ + if SHARED is defined the file is included in an array ++ initializer. The .element = { ... } syntax is needed. ++ ++ + if SHARED is not defined a normal array initialization is ++ needed. ++ */ ++ ++#ifndef PROCINFO_CLASS ++# define PROCINFO_CLASS ++#endif ++ ++#if !defined PROCINFO_DECL && defined SHARED ++ ._dl_x86_cpu_features ++#else ++PROCINFO_CLASS struct cpu_features _dl_x86_cpu_features ++#endif ++#ifndef PROCINFO_DECL ++= { } ++#endif ++#if !defined SHARED || defined PROCINFO_DECL ++; ++#else ++, ++#endif ++ ++#undef PROCINFO_DECL ++#undef PROCINFO_CLASS +Index: glibc-2.17-c758a686/sysdeps/x86_64/ldsodefs.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/ldsodefs.h ++++ glibc-2.17-c758a686/sysdeps/x86_64/ldsodefs.h +@@ -20,6 +20,7 @@ + #define _X86_64_LDSODEFS_H 1 + + #include ++#include + + struct La_x86_64_regs; + struct La_x86_64_retval; +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/Makefile ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile +@@ -1,5 +1,4 @@ + ifeq ($(subdir),csu) +-aux += init-arch + tests += test-multiarch + gen-as-const-headers += ifunc-defines.sym + endif +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Versions +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/Versions ++++ /dev/null +@@ -1,5 +0,0 @@ +-libc { +- GLIBC_PRIVATE { +- __get_cpu_features; +- } +-} +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/cacheinfo.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/cacheinfo.c ++++ /dev/null +@@ -1,2 +0,0 @@ +-#define DISABLE_PREFERRED_MEMORY_INSTRUCTION +-#include "../cacheinfo.c" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-defines.sym +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/ifunc-defines.sym ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-defines.sym +@@ -4,7 +4,6 @@ + -- + + CPU_FEATURES_SIZE sizeof (struct cpu_features) +-KIND_OFFSET offsetof (struct cpu_features, kind) + CPUID_OFFSET offsetof (struct cpu_features, cpuid) + CPUID_SIZE sizeof (struct cpuid_registers) + CPUID_EAX_OFFSET offsetof (struct cpuid_registers, eax) +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/init-arch.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/init-arch.c ++++ /dev/null +@@ -1,183 +0,0 @@ +-/* Initialize CPU feature data. +- This file is part of the GNU C Library. +- Copyright (C) 2008-2012 Free Software Foundation, Inc. +- Contributed by Ulrich Drepper . +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library 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 +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-#include +-#include +-#include "init-arch.h" +- +- +-struct cpu_features __cpu_features attribute_hidden; +- +- +-static void +-get_common_indeces (unsigned int *family, unsigned int *model) +-{ +- __cpuid (1, __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax, +- __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ebx, +- __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx, +- __cpu_features.cpuid[COMMON_CPUID_INDEX_1].edx); +- +- unsigned int eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax; +- *family = (eax >> 8) & 0x0f; +- *model = (eax >> 4) & 0x0f; +-} +- +- +-void +-__init_cpu_features (void) +-{ +- unsigned int ebx; +- unsigned int ecx; +- unsigned int edx; +- unsigned int family = 0; +- unsigned int model = 0; +- enum cpu_features_kind kind; +- +- __cpuid (0, __cpu_features.max_cpuid, ebx, ecx, edx); +- +- /* This spells out "GenuineIntel". */ +- if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69) +- { +- kind = arch_kind_intel; +- +- get_common_indeces (&family, &model); +- +- /* Intel processors prefer SSE instruction for memory/string +- routines if they are available. */ +- __cpu_features.feature[index_Prefer_SSE_for_memop] +- |= bit_Prefer_SSE_for_memop; +- +- unsigned int eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax; +- unsigned int extended_family = (eax >> 20) & 0xff; +- unsigned int extended_model = (eax >> 12) & 0xf0; +- if (family == 0x0f) +- { +- family += extended_family; +- model += extended_model; +- } +- else if (family == 0x06) +- { +- ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx; +- model += extended_model; +- switch (model) +- { +- case 0x1c: +- case 0x26: +- /* BSF is slow on Atom. */ +- __cpu_features.feature[index_Slow_BSF] |= bit_Slow_BSF; +- break; +- +- default: +- /* Unknown family 0x06 processors. Assuming this is one +- of Core i3/i5/i7 processors if AVX is available. */ +- if ((ecx & bit_AVX) == 0) +- break; +- +- case 0x1a: +- case 0x1e: +- case 0x1f: +- case 0x25: +- case 0x2c: +- case 0x2e: +- case 0x2f: +- /* Rep string instructions, copy backward, unaligned loads +- and pminub are fast on Intel Core i3, i5 and i7. */ +-#if index_Fast_Rep_String != index_Fast_Copy_Backward +-# error index_Fast_Rep_String != index_Fast_Copy_Backward +-#endif +-#if index_Fast_Rep_String != index_Fast_Unaligned_Load +-# error index_Fast_Rep_String != index_Fast_Unaligned_Load +-#endif +-#if index_Fast_Rep_String != index_Prefer_PMINUB_for_stringop +-# error index_Fast_Rep_String != index_Prefer_PMINUB_for_stringop +-#endif +- __cpu_features.feature[index_Fast_Rep_String] +- |= (bit_Fast_Rep_String +- | bit_Fast_Copy_Backward +- | bit_Fast_Unaligned_Load +- | bit_Prefer_PMINUB_for_stringop); +- break; +- } +- } +- } +- /* This spells out "AuthenticAMD". */ +- else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65) +- { +- kind = arch_kind_amd; +- +- get_common_indeces (&family, &model); +- +- ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx; +- +- /* AMD processors prefer SSE instructions for memory/string routines +- if they are available, otherwise they prefer integer instructions. */ +- if ((ecx & 0x200)) +- __cpu_features.feature[index_Prefer_SSE_for_memop] +- |= bit_Prefer_SSE_for_memop; +- +- unsigned int eax; +- __cpuid (0x80000000, eax, ebx, ecx, edx); +- if (eax >= 0x80000001) +- __cpuid (0x80000001, +- __cpu_features.cpuid[COMMON_CPUID_INDEX_80000001].eax, +- __cpu_features.cpuid[COMMON_CPUID_INDEX_80000001].ebx, +- __cpu_features.cpuid[COMMON_CPUID_INDEX_80000001].ecx, +- __cpu_features.cpuid[COMMON_CPUID_INDEX_80000001].edx); +- } +- else +- kind = arch_kind_other; +- +- /* Can we call xgetbv? */ +- if (CPUID_OSXSAVE) +- { +- unsigned int xcrlow; +- unsigned int xcrhigh; +- asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0)); +- /* Is YMM and XMM state usable? */ +- if ((xcrlow & (bit_YMM_state | bit_XMM_state)) == +- (bit_YMM_state | bit_XMM_state)) +- { +- /* Determine if AVX is usable. */ +- if (CPUID_AVX) +- __cpu_features.feature[index_AVX_Usable] |= bit_AVX_Usable; +- /* Determine if FMA is usable. */ +- if (CPUID_FMA) +- __cpu_features.feature[index_FMA_Usable] |= bit_FMA_Usable; +- /* Determine if FMA4 is usable. */ +- if (CPUID_FMA4) +- __cpu_features.feature[index_FMA4_Usable] |= bit_FMA4_Usable; +- } +- } +- +- __cpu_features.family = family; +- __cpu_features.model = model; +- atomic_write_barrier (); +- __cpu_features.kind = kind; +-} +- +-#undef __get_cpu_features +- +-const struct cpu_features * +-__get_cpu_features (void) +-{ +- if (__cpu_features.kind == arch_kind_unknown) +- __init_cpu_features (); +- +- return &__cpu_features; +-} +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/init-arch.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/init-arch.h ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/init-arch.h +@@ -15,183 +15,8 @@ + License along with the GNU C Library; if not, see + . */ + +-#define bit_Fast_Rep_String (1 << 0) +-#define bit_Fast_Copy_Backward (1 << 1) +-#define bit_Slow_BSF (1 << 2) +-#define bit_Prefer_SSE_for_memop (1 << 3) +-#define bit_Fast_Unaligned_Load (1 << 4) +-#define bit_Prefer_PMINUB_for_stringop (1 << 5) +-#define bit_AVX_Usable (1 << 6) +-#define bit_FMA_Usable (1 << 7) +-#define bit_FMA4_Usable (1 << 8) +- +-/* CPUID Feature flags. */ +-#define bit_SSE2 (1 << 26) +-#define bit_SSSE3 (1 << 9) +-#define bit_SSE4_1 (1 << 19) +-#define bit_SSE4_2 (1 << 20) +-#define bit_OSXSAVE (1 << 27) +-#define bit_AVX (1 << 28) +-#define bit_POPCOUNT (1 << 23) +-#define bit_FMA (1 << 12) +-#define bit_FMA4 (1 << 16) +- +-/* XCR0 Feature flags. */ +-#define bit_XMM_state (1 << 1) +-#define bit_YMM_state (2 << 1) +- +-#ifdef __ASSEMBLER__ +- +-# include +- +-# define index_SSE2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_EDX_OFFSET +-# define index_SSSE3 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET +-# define index_SSE4_1 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET +-# define index_SSE4_2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET +-# define index_AVX COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET +- +-# define index_Fast_Rep_String FEATURE_INDEX_1*FEATURE_SIZE +-# define index_Fast_Copy_Backward FEATURE_INDEX_1*FEATURE_SIZE +-# define index_Slow_BSF FEATURE_INDEX_1*FEATURE_SIZE +-# define index_Prefer_SSE_for_memop FEATURE_INDEX_1*FEATURE_SIZE +-# define index_Fast_Unaligned_Load FEATURE_INDEX_1*FEATURE_SIZE +-# define index_Prefer_PMINUB_for_stringop FEATURE_INDEX_1*FEATURE_SIZE +-# define index_AVX_Usable FEATURE_INDEX_1*FEATURE_SIZE +-# define index_FMA_Usable FEATURE_INDEX_1*FEATURE_SIZE +-# define index_FMA4_Usable FEATURE_INDEX_1*FEATURE_SIZE +- +-#else /* __ASSEMBLER__ */ +- +-# include +-# include +-# include +-# include +- +-/* Ugly hack to make it possible to select a strstr and strcasestr +- implementation that avoids using the stack for 16-byte aligned +- SSE temporaries. Doing so makes it possible to call the functions +- with a stack that's not 16-byte aligned as can happen, for example, +- as a result of compiling the functions' callers with the GCC +- -mpreferred-stack-boubdary=2 or =3 option, or with the ICC +- -falign-stack=assume-4-byte option. See rhbz 1150282 for details. +- +- The ifunc selector uses the unaligned version by default if this +- file exists and is accessible. */ +-# define ENABLE_STRSTR_UNALIGNED_PATHNAME \ +- "/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned" +- +-static bool __attribute__ ((unused)) +-use_unaligned_strstr (void) +-{ +- struct stat unaligned_strstr_etc_sysconfig_file; +- +- /* TLS may not have been set up yet, so avoid using stat since it tries to +- set errno. */ +- return INTERNAL_SYSCALL (stat, , 2, +- ENABLE_STRSTR_UNALIGNED_PATHNAME, +- &unaligned_strstr_etc_sysconfig_file) == 0; +-} +- +-enum +- { +- COMMON_CPUID_INDEX_1 = 0, +- COMMON_CPUID_INDEX_80000001, /* for AMD */ +- /* Keep the following line at the end. */ +- COMMON_CPUID_INDEX_MAX +- }; +- +-enum +- { +- FEATURE_INDEX_1 = 0, +- /* Keep the following line at the end. */ +- FEATURE_INDEX_MAX +- }; +- +-extern struct cpu_features +-{ +- enum cpu_features_kind +- { +- arch_kind_unknown = 0, +- arch_kind_intel, +- arch_kind_amd, +- arch_kind_other +- } kind; +- int max_cpuid; +- struct cpuid_registers +- { +- unsigned int eax; +- unsigned int ebx; +- unsigned int ecx; +- unsigned int edx; +- } cpuid[COMMON_CPUID_INDEX_MAX]; +- unsigned int family; +- unsigned int model; +- unsigned int feature[FEATURE_INDEX_MAX]; +-} __cpu_features attribute_hidden; +- +- +-extern void __init_cpu_features (void) attribute_hidden; +-# define INIT_ARCH() \ +- do \ +- if (__cpu_features.kind == arch_kind_unknown) \ +- __init_cpu_features (); \ +- while (0) +- +-/* Used from outside libc.so to get access to the CPU features structure. */ +-extern const struct cpu_features *__get_cpu_features (void) +- __attribute__ ((const)); +- +-# if IS_IN (libc) +-# define __get_cpu_features() (&__cpu_features) +-# endif +- +-# define HAS_CPU_FEATURE(idx, reg, bit) \ +- ((__get_cpu_features ()->cpuid[idx].reg & (bit)) != 0) +- +-/* Following are the feature tests used throughout libc. */ +- +-/* CPUID_* evaluates to true if the feature flag is enabled. +- We always use &__cpu_features because the HAS_CPUID_* macros +- are called only within __init_cpu_features, where we can't +- call __get_cpu_features without infinite recursion. */ +-# define HAS_CPUID_FLAG(idx, reg, bit) \ +- (((&__cpu_features)->cpuid[idx].reg & (bit)) != 0) +- +-# define CPUID_OSXSAVE \ +- HAS_CPUID_FLAG (COMMON_CPUID_INDEX_1, ecx, bit_OSXSAVE) +-# define CPUID_AVX \ +- HAS_CPUID_FLAG (COMMON_CPUID_INDEX_1, ecx, bit_AVX) +-# define CPUID_FMA \ +- HAS_CPUID_FLAG (COMMON_CPUID_INDEX_1, ecx, bit_FMA) +-# define CPUID_FMA4 \ +- HAS_CPUID_FLAG (COMMON_CPUID_INDEX_80000001, ecx, bit_FMA4) +- +-/* HAS_* evaluates to true if we may use the feature at runtime. */ +-# define HAS_SSE2 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, edx, bit_SSE2) +-# define HAS_POPCOUNT HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_POPCOUNT) +-# define HAS_SSSE3 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_SSSE3) +-# define HAS_SSE4_1 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_SSE4_1) +-# define HAS_SSE4_2 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_SSE4_2) +- +-# define index_Fast_Rep_String FEATURE_INDEX_1 +-# define index_Fast_Copy_Backward FEATURE_INDEX_1 +-# define index_Slow_BSF FEATURE_INDEX_1 +-# define index_Prefer_SSE_for_memop FEATURE_INDEX_1 +-# define index_Fast_Unaligned_Load FEATURE_INDEX_1 +-# define index_AVX_Usable FEATURE_INDEX_1 +-# define index_FMA_Usable FEATURE_INDEX_1 +-# define index_FMA4_Usable FEATURE_INDEX_1 +- +-# define HAS_ARCH_FEATURE(name) \ +- ((__get_cpu_features ()->feature[index_##name] & (bit_##name)) != 0) +- +-# define HAS_FAST_REP_STRING HAS_ARCH_FEATURE (Fast_Rep_String) +-# define HAS_FAST_COPY_BACKWARD HAS_ARCH_FEATURE (Fast_Copy_Backward) +-# define HAS_SLOW_BSF HAS_ARCH_FEATURE (Slow_BSF) +-# define HAS_PREFER_SSE_FOR_MEMOP HAS_ARCH_FEATURE (Prefer_SSE_for_memop) +-# define HAS_FAST_UNALIGNED_LOAD HAS_ARCH_FEATURE (Fast_Unaligned_Load) +-# define HAS_AVX HAS_ARCH_FEATURE (AVX_Usable) +-# define HAS_FMA HAS_ARCH_FEATURE (FMA_Usable) +-# define HAS_FMA4 HAS_ARCH_FEATURE (FMA4_Usable) +- +-#endif /* __ASSEMBLER__ */ ++#ifdef __ASSEMBLER__ ++# include ++#else ++# include ++#endif diff --git a/SOURCES/glibc-rh1292018-2.patch b/SOURCES/glibc-rh1292018-2.patch new file mode 100644 index 0000000..4e55e09 --- /dev/null +++ b/SOURCES/glibc-rh1292018-2.patch @@ -0,0 +1,1252 @@ +We keep with the idea behind this patch but adjust all of the changes +to match the existing impelementations in RHEL 7.3. + +commit 0b5395f052ee09cd7e3d219af4e805c38058afb5 +Author: H.J. Lu +Date: Thu Aug 13 03:38:47 2015 -0700 + + Update x86_64 multiarch functions for + + This patch updates x86_64 multiarch functions to use the newly defined + HAS_CPU_FEATURE, HAS_ARCH_FEATURE and LOAD_RTLD_GLOBAL_RO_RDX from + . + +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_asin.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/e_asin.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_asin.c +@@ -8,11 +8,15 @@ extern double __ieee754_acos_fma4 (doubl + extern double __ieee754_asin_fma4 (double); + + libm_ifunc (__ieee754_acos, +- HAS_FMA4 ? __ieee754_acos_fma4 : __ieee754_acos_sse2); ++ HAS_ARCH_FEATURE (FMA4_Usable) ++ ? __ieee754_acos_fma4 ++ : __ieee754_acos_sse2); + strong_alias (__ieee754_acos, __acos_finite) + + libm_ifunc (__ieee754_asin, +- HAS_FMA4 ? __ieee754_asin_fma4 : __ieee754_asin_sse2); ++ HAS_ARCH_FEATURE (FMA4_Usable) ++ ? __ieee754_asin_fma4 ++ : __ieee754_asin_sse2); + strong_alias (__ieee754_asin, __asin_finite) + + # define __ieee754_acos __ieee754_acos_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_atan2.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/e_atan2.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_atan2.c +@@ -7,14 +7,15 @@ extern double __ieee754_atan2_avx (doubl + # ifdef HAVE_FMA4_SUPPORT + extern double __ieee754_atan2_fma4 (double, double); + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __ieee754_atan2_fma4 ((void *) 0) + # endif + + libm_ifunc (__ieee754_atan2, +- HAS_FMA4 ? __ieee754_atan2_fma4 +- : (HAS_AVX ? __ieee754_atan2_avx : __ieee754_atan2_sse2)); ++ HAS_ARCH_FEATURE (FMA4_Usable) ? __ieee754_atan2_fma4 ++ : (HAS_ARCH_FEATURE (AVX_Usable) ++ ? __ieee754_atan2_avx : __ieee754_atan2_sse2)); + strong_alias (__ieee754_atan2, __atan2_finite) + + # define __ieee754_atan2 __ieee754_atan2_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_exp.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/e_exp.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_exp.c +@@ -7,14 +7,15 @@ extern double __ieee754_exp_avx (double) + # ifdef HAVE_FMA4_SUPPORT + extern double __ieee754_exp_fma4 (double); + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __ieee754_exp_fma4 ((void *) 0) + # endif + + libm_ifunc (__ieee754_exp, +- HAS_FMA4 ? __ieee754_exp_fma4 +- : (HAS_AVX ? __ieee754_exp_avx : __ieee754_exp_sse2)); ++ HAS_ARCH_FEATURE (FMA4_Usable) ? __ieee754_exp_fma4 ++ : (HAS_ARCH_FEATURE (AVX_Usable) ++ ? __ieee754_exp_avx : __ieee754_exp_sse2)); + strong_alias (__ieee754_exp, __exp_finite) + + # define __ieee754_exp __ieee754_exp_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_log.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/e_log.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_log.c +@@ -7,14 +7,15 @@ extern double __ieee754_log_avx (double) + # ifdef HAVE_FMA4_SUPPORT + extern double __ieee754_log_fma4 (double); + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __ieee754_log_fma4 ((void *) 0) + # endif + + libm_ifunc (__ieee754_log, +- HAS_FMA4 ? __ieee754_log_fma4 +- : (HAS_AVX ? __ieee754_log_avx : __ieee754_log_sse2)); ++ HAS_ARCH_FEATURE (FMA4_Usable) ? __ieee754_log_fma4 ++ : (HAS_ARCH_FEATURE (AVX_Usable) ++ ? __ieee754_log_avx : __ieee754_log_sse2)); + strong_alias (__ieee754_log, __log_finite) + + # define __ieee754_log __ieee754_log_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_pow.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/e_pow.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/e_pow.c +@@ -5,7 +5,10 @@ + extern double __ieee754_pow_sse2 (double, double); + extern double __ieee754_pow_fma4 (double, double); + +-libm_ifunc (__ieee754_pow, HAS_FMA4 ? __ieee754_pow_fma4 : __ieee754_pow_sse2); ++libm_ifunc (__ieee754_pow, ++ HAS_ARCH_FEATURE (FMA4_Usable) ++ ? __ieee754_pow_fma4 ++ : __ieee754_pow_sse2); + strong_alias (__ieee754_pow, __pow_finite) + + # define __ieee754_pow __ieee754_pow_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_atan.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_atan.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_atan.c +@@ -7,13 +7,14 @@ extern double __atan_avx (double); + # ifdef HAVE_FMA4_SUPPORT + extern double __atan_fma4 (double); + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __atan_fma4 ((void *) 0) + # endif + +-libm_ifunc (atan, (HAS_FMA4 ? __atan_fma4 : +- HAS_AVX ? __atan_avx : __atan_sse2)); ++libm_ifunc (atan, (HAS_ARCH_FEATURE (FMA4_Usable) ? __atan_fma4 : ++ HAS_ARCH_FEATURE (AVX_Usable) ++ ? __atan_avx : __atan_sse2)); + + # define atan __atan_sse2 + #endif +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_ceil.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_ceil.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_ceil.S +@@ -22,10 +22,9 @@ + + ENTRY(__ceil) + .type __ceil, @gnu_indirect_function +- call __get_cpu_features@plt +- movq %rax, %rdx ++ LOAD_RTLD_GLOBAL_RO_RDX + leaq __ceil_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __ceil_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_ceilf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_ceilf.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_ceilf.S +@@ -22,10 +22,9 @@ + + ENTRY(__ceilf) + .type __ceilf, @gnu_indirect_function +- call __get_cpu_features@plt +- movq %rax, %rdx ++ LOAD_RTLD_GLOBAL_RO_RDX + leaq __ceilf_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __ceilf_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_floor.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_floor.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_floor.S +@@ -22,10 +22,9 @@ + + ENTRY(__floor) + .type __floor, @gnu_indirect_function +- call __get_cpu_features@plt +- movq %rax, %rdx ++ LOAD_RTLD_GLOBAL_RO_RDX + leaq __floor_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __floor_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_floorf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_floorf.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_floorf.S +@@ -22,10 +22,10 @@ + + ENTRY(__floorf) + .type __floorf, @gnu_indirect_function +- call __get_cpu_features@plt ++ LOAD_RTLD_GLOBAL_RO_RDX + movq %rax, %rdx + leaq __floorf_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __floorf_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_fma.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_fma.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_fma.c +@@ -42,14 +42,15 @@ __fma_fma4 (double x, double y, double z + return x; + } + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __fma_fma4 ((void *) 0) + # endif + + +-libm_ifunc (__fma, HAS_FMA +- ? __fma_fma3 : (HAS_FMA4 ? __fma_fma4 : __fma_sse2)); ++libm_ifunc (__fma, HAS_ARCH_FEATURE (FMA_Usable) ++ ? __fma_fma3 : (HAS_ARCH_FEATURE (FMA4_Usable) ++ ? __fma_fma4 : __fma_sse2)); + weak_alias (__fma, fma) + + # define __fma __fma_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_fmaf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_fmaf.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_fmaf.c +@@ -41,14 +41,15 @@ __fmaf_fma4 (float x, float y, float z) + return x; + } + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __fmaf_fma4 ((void *) 0) + # endif + + +-libm_ifunc (__fmaf, HAS_FMA +- ? __fmaf_fma3 : (HAS_FMA4 ? __fmaf_fma4 : __fmaf_sse2)); ++libm_ifunc (__fmaf, HAS_ARCH_FEATURE (FMA_Usable) ++ ? __fmaf_fma3 : (HAS_ARCH_FEATURE (FMA4_Usable) ++ ? __fmaf_fma4 : __fmaf_sse2)); + weak_alias (__fmaf, fmaf) + + # define __fmaf __fmaf_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_nearbyint.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_nearbyint.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_nearbyint.S +@@ -22,10 +22,10 @@ + + ENTRY(__nearbyint) + .type __nearbyint, @gnu_indirect_function +- call __get_cpu_features@plt ++ LOAD_RTLD_GLOBAL_RO_RDX + movq %rax, %rdx + leaq __nearbyint_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __nearbyint_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.S +@@ -22,10 +22,9 @@ + + ENTRY(__nearbyintf) + .type __nearbyintf, @gnu_indirect_function +- call __get_cpu_features@plt +- movq %rax, %rdx ++ LOAD_RTLD_GLOBAL_RO_RDX + leaq __nearbyintf_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __nearbyintf_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_rint.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_rint.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_rint.S +@@ -22,10 +22,9 @@ + + ENTRY(__rint) + .type __rint, @gnu_indirect_function +- call __get_cpu_features@plt +- movq %rax, %rdx ++ LOAD_RTLD_GLOBAL_RO_RDX + leaq __rint_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __rint_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_rintf.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_rintf.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_rintf.S +@@ -22,10 +22,9 @@ + + ENTRY(__rintf) + .type __rintf, @gnu_indirect_function +- call __get_cpu_features@plt +- movq %rax, %rdx ++ LOAD_RTLD_GLOBAL_RO_RDX + leaq __rintf_sse41(%rip), %rax +- testl $bit_SSE4_1, CPUID_OFFSET+index_SSE4_1(%rdx) ++ HAS_CPU_FEATURE (SSE4_1) + jnz 2f + leaq __rintf_c(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_sin.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_sin.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_sin.c +@@ -11,18 +11,20 @@ extern double __sin_avx (double); + extern double __cos_fma4 (double); + extern double __sin_fma4 (double); + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __cos_fma4 ((void *) 0) + # define __sin_fma4 ((void *) 0) + # endif + +-libm_ifunc (__cos, (HAS_FMA4 ? __cos_fma4 : +- HAS_AVX ? __cos_avx : __cos_sse2)); ++libm_ifunc (__cos, (HAS_ARCH_FEATURE (FMA4_Usable) ? __cos_fma4 : ++ HAS_ARCH_FEATURE (AVX_Usable) ++ ? __cos_avx : __cos_sse2)); + weak_alias (__cos, cos) + +-libm_ifunc (__sin, (HAS_FMA4 ? __sin_fma4 : +- HAS_AVX ? __sin_avx : __sin_sse2)); ++libm_ifunc (__sin, (HAS_ARCH_FEATURE (FMA4_Usable) ? __sin_fma4 : ++ HAS_ARCH_FEATURE (AVX_Usable) ++ ? __sin_avx : __sin_sse2)); + weak_alias (__sin, sin) + + # define __cos __cos_sse2 +Index: glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_tan.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/fpu/multiarch/s_tan.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/multiarch/s_tan.c +@@ -7,13 +7,14 @@ extern double __tan_avx (double); + # ifdef HAVE_FMA4_SUPPORT + extern double __tan_fma4 (double); + # else +-# undef HAS_FMA4 +-# define HAS_FMA4 0 ++# undef HAS_ARCH_FEATURE ++# define HAS_ARCH_FEATURE(feature) 0 + # define __tan_fma4 ((void *) 0) + # endif + +-libm_ifunc (tan, (HAS_FMA4 ? __tan_fma4 : +- HAS_AVX ? __tan_avx : __tan_sse2)); ++libm_ifunc (tan, (HAS_ARCH_FEATURE (FMA4_Usable) ? __tan_fma4 : ++ HAS_ARCH_FEATURE (AVX_Usable) ++ ? __tan_avx : __tan_sse2)); + + # define tan __tan_sse2 + #endif +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/ifunc-impl-list.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +@@ -39,25 +39,26 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/memcmp.S. */ + IFUNC_IMPL (i, name, memcmp, +- IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSE4_1, ++ IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSE4_1), + __memcmp_sse4_1) +- IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSSE3, __memcmp_ssse3) ++ IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSSE3), ++ __memcmp_ssse3) + IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2)) + + /* Support sysdeps/x86_64/multiarch/memmove_chk.S. */ + IFUNC_IMPL (i, name, __memmove_chk, +- IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), + __memmove_chk_ssse3_back) +- IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), + __memmove_chk_ssse3) + IFUNC_IMPL_ADD (array, i, __memmove_chk, 1, + __memmove_chk_sse2)) + + /* Support sysdeps/x86_64/multiarch/memmove.S. */ + IFUNC_IMPL (i, name, memmove, +- IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), + __memmove_ssse3_back) +- IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), + __memmove_ssse3) + IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_sse2)) + +@@ -74,13 +75,13 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/rawmemchr.S. */ + IFUNC_IMPL (i, name, rawmemchr, +- IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_CPU_FEATURE (SSE4_2), + __rawmemchr_sse42) + IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_sse2)) + + /* Support sysdeps/x86_64/multiarch/stpncpy.S. */ + IFUNC_IMPL (i, name, stpncpy, +- IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, stpncpy, HAS_CPU_FEATURE (SSSE3), + __stpncpy_ssse3) + IFUNC_IMPL_ADD (array, i, stpncpy, 1, + __stpncpy_sse2_unaligned) +@@ -88,92 +89,105 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/stpcpy.S. */ + IFUNC_IMPL (i, name, stpcpy, +- IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSSE3, __stpcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, stpcpy, HAS_CPU_FEATURE (SSSE3), ++ __stpcpy_ssse3) + IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2_unaligned) + IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2)) + + /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S. */ + IFUNC_IMPL (i, name, strcasecmp, +- IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_AVX, ++ IFUNC_IMPL_ADD (array, i, strcasecmp, ++ HAS_ARCH_FEATURE (AVX_Usable), + __strcasecmp_avx) +- IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcasecmp, ++ HAS_CPU_FEATURE (SSE4_2), + __strcasecmp_sse42) +- IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strcasecmp, ++ HAS_CPU_FEATURE (SSSE3), + __strcasecmp_ssse3) + IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_sse2)) + + /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S. */ + IFUNC_IMPL (i, name, strcasecmp_l, +- IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_AVX, ++ IFUNC_IMPL_ADD (array, i, strcasecmp_l, ++ HAS_ARCH_FEATURE (AVX_Usable), + __strcasecmp_l_avx) +- IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcasecmp_l, ++ HAS_CPU_FEATURE (SSE4_2), + __strcasecmp_l_sse42) +- IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strcasecmp_l, ++ HAS_CPU_FEATURE (SSSE3), + __strcasecmp_l_ssse3) + IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1, + __strcasecmp_l_sse2)) + + /* Support sysdeps/x86_64/multiarch/strcasestr.c. */ + IFUNC_IMPL (i, name, strcasestr, +- IFUNC_IMPL_ADD (array, i, strcasestr, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcasestr, HAS_CPU_FEATURE (SSE4_2), + __strcasestr_sse42) + IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_sse2)) + + /* Support sysdeps/x86_64/multiarch/strcat.S. */ + IFUNC_IMPL (i, name, strcat, +- IFUNC_IMPL_ADD (array, i, strcat, HAS_SSSE3, __strcat_ssse3) ++ IFUNC_IMPL_ADD (array, i, strcat, HAS_CPU_FEATURE (SSSE3), ++ __strcat_ssse3) + IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2_unaligned) + IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2)) + + /* Support sysdeps/x86_64/multiarch/strchr.S. */ + IFUNC_IMPL (i, name, strchr, +- IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE4_2, __strchr_sse42) ++ IFUNC_IMPL_ADD (array, i, strchr, HAS_CPU_FEATURE (SSE4_2), ++ __strchr_sse42) + IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2_no_bsf) + IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2)) + + /* Support sysdeps/x86_64/multiarch/strcmp.S. */ + IFUNC_IMPL (i, name, strcmp, +- IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSE4_2, __strcmp_sse42) +- IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSSE3, __strcmp_ssse3) ++ IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSE4_2), ++ __strcmp_sse42) ++ IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSSE3), ++ __strcmp_ssse3) + IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2)) + + /* Support sysdeps/x86_64/multiarch/strcpy.S. */ + IFUNC_IMPL (i, name, strcpy, +- IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSSE3, __strcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSSE3), ++ __strcpy_ssse3) + IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned) + IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2)) + + /* Support sysdeps/x86_64/multiarch/strcspn.S. */ + IFUNC_IMPL (i, name, strcspn, +- IFUNC_IMPL_ADD (array, i, strcspn, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcspn, HAS_CPU_FEATURE (SSE4_2), + __strcspn_sse42) + IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2)) + + /* Support sysdeps/x86_64/multiarch/strncase_l.S. */ + IFUNC_IMPL (i, name, strncasecmp, +- IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_AVX, ++ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_ARCH_FEATURE (AVX_Usable), + __strncasecmp_avx) +- IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_CPU_FEATURE (SSE4_2), + __strncasecmp_sse42) +- IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_CPU_FEATURE (SSSE3), + __strncasecmp_ssse3) + IFUNC_IMPL_ADD (array, i, strncasecmp, 1, + __strncasecmp_sse2)) + + /* Support sysdeps/x86_64/multiarch/strncase_l.S. */ + IFUNC_IMPL (i, name, strncasecmp_l, +- IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_AVX, ++ IFUNC_IMPL_ADD (array, i, strncasecmp_l, ++ HAS_ARCH_FEATURE (AVX_Usable), + __strncasecmp_l_avx) +- IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_CPU_FEATURE (SSE4_2), + __strncasecmp_l_sse42) +- IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_CPU_FEATURE (SSSE3), + __strncasecmp_l_ssse3) + IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1, + __strncasecmp_l_sse2)) + + /* Support sysdeps/x86_64/multiarch/strncat.S. */ + IFUNC_IMPL (i, name, strncat, +- IFUNC_IMPL_ADD (array, i, strncat, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSSE3), + __strncat_ssse3) + IFUNC_IMPL_ADD (array, i, strncat, 1, + __strncat_sse2_unaligned) +@@ -181,7 +195,7 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/strncpy.S. */ + IFUNC_IMPL (i, name, strncpy, +- IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSSE3), + __strncpy_ssse3) + IFUNC_IMPL_ADD (array, i, strncpy, 1, + __strncpy_sse2_unaligned) +@@ -194,79 +208,83 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/strpbrk.S. */ + IFUNC_IMPL (i, name, strpbrk, +- IFUNC_IMPL_ADD (array, i, strpbrk, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strpbrk, HAS_CPU_FEATURE (SSE4_2), + __strpbrk_sse42) + IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2)) + + /* Support sysdeps/x86_64/multiarch/strrchr.S. */ + IFUNC_IMPL (i, name, strrchr, +- IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strrchr, HAS_CPU_FEATURE (SSE4_2), + __strrchr_sse42) + IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2_no_bsf) + IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2)) + + /* Support sysdeps/x86_64/multiarch/strspn.S. */ + IFUNC_IMPL (i, name, strspn, +- IFUNC_IMPL_ADD (array, i, strspn, HAS_SSE4_2, __strspn_sse42) ++ IFUNC_IMPL_ADD (array, i, strspn, HAS_CPU_FEATURE (SSE4_2), ++ __strspn_sse42) + IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2)) + + /* Support sysdeps/x86_64/multiarch/strstr-c.c. */ + IFUNC_IMPL (i, name, strstr, + IFUNC_IMPL_ADD (array, i, strstr, use_unaligned_strstr (), + __strstr_sse2_unaligned) +- IFUNC_IMPL_ADD (array, i, strstr, HAS_SSE4_2, __strstr_sse42) ++ IFUNC_IMPL_ADD (array, i, strstr, HAS_CPU_FEATURE (SSE4_2), ++ __strstr_sse42) + IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2)) + + /* Support sysdeps/x86_64/multiarch/wcscpy.S. */ + IFUNC_IMPL (i, name, wcscpy, +- IFUNC_IMPL_ADD (array, i, wcscpy, HAS_SSSE3, __wcscpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, wcscpy, HAS_CPU_FEATURE (SSSE3), ++ __wcscpy_ssse3) + IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2)) + + /* Support sysdeps/x86_64/multiarch/wmemcmp.S. */ + IFUNC_IMPL (i, name, wmemcmp, +- IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSE4_1, ++ IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSE4_1), + __wmemcmp_sse4_1) +- IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSSE3), + __wmemcmp_ssse3) + IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2)) + + #ifdef SHARED + /* Support sysdeps/x86_64/multiarch/memcpy_chk.S. */ + IFUNC_IMPL (i, name, __memcpy_chk, +- IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), + __memcpy_chk_ssse3_back) +- IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), + __memcpy_chk_ssse3) + IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1, + __memcpy_chk_sse2)) + + /* Support sysdeps/x86_64/multiarch/memcpy.S. */ + IFUNC_IMPL (i, name, memcpy, +- IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), + __memcpy_ssse3_back) +- IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, __memcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), __memcpy_ssse3) + IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2)) + + /* Support sysdeps/x86_64/multiarch/mempcpy_chk.S. */ + IFUNC_IMPL (i, name, __mempcpy_chk, +- IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), + __mempcpy_chk_ssse3_back) +- IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), + __mempcpy_chk_ssse3) + IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1, + __mempcpy_chk_sse2)) + + /* Support sysdeps/x86_64/multiarch/mempcpy.S. */ + IFUNC_IMPL (i, name, mempcpy, +- IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), + __mempcpy_ssse3_back) +- IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), + __mempcpy_ssse3) + IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_sse2)) + + /* Support sysdeps/x86_64/multiarch/strlen.S. */ + IFUNC_IMPL (i, name, strlen, +- IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE4_2, __strlen_sse42) ++ IFUNC_IMPL_ADD (array, i, strlen, HAS_CPU_FEATURE (SSE4_2), ++ __strlen_sse42) + IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_pminub) + IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_no_bsf) + IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2) +@@ -274,9 +292,9 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/strncmp.S. */ + IFUNC_IMPL (i, name, strncmp, +- IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSE4_2), + __strncmp_sse42) +- IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSSE3), + __strncmp_ssse3) + IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2)) + #endif +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcmp.S +@@ -26,16 +26,13 @@ + .text + ENTRY(memcmp) + .type memcmp, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features(%rip) +- jne 1f +- call __init_cpu_features +- +-1: testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ HAS_CPU_FEATURE (SSSE3) + jnz 2f + leaq __memcmp_sse2(%rip), %rax + ret + +-2: testl $bit_SSE4_1, __cpu_features+CPUID_OFFSET+index_SSE4_1(%rip) ++2: HAS_CPU_FEATURE (SSE4_1) + jz 3f + leaq __memcmp_sse4_1(%rip), %rax + ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy.S +@@ -29,14 +29,12 @@ + .text + ENTRY(__new_memcpy) + .type __new_memcpy, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __memcpy_sse2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __memcpy_sse2(%rip), %rax ++ HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __memcpy_ssse3(%rip), %rax +- testl $bit_Fast_Copy_Backward, __cpu_features+FEATURE_OFFSET+index_Fast_Copy_Backward(%rip) ++ HAS_ARCH_FEATURE (Fast_Copy_Backward) + jz 2f + leaq __memcpy_ssse3_back(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +@@ -29,14 +29,12 @@ + .text + ENTRY(__memcpy_chk) + .type __memcpy_chk, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __memcpy_chk_sse2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __memcpy_chk_sse2(%rip), %rax ++ HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __memcpy_chk_ssse3(%rip), %rax +- testl $bit_Fast_Copy_Backward, __cpu_features+FEATURE_OFFSET+index_Fast_Copy_Backward(%rip) ++ HAS_ARCH_FEATURE (Fast_Copy_Backward) + jz 2f + leaq __memcpy_chk_ssse3_back(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memmove.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove.c +@@ -47,8 +47,8 @@ extern __typeof (__redirect_memmove) __m + ifunc symbol properly. */ + extern __typeof (__redirect_memmove) __libc_memmove; + libc_ifunc (__libc_memmove, +- HAS_SSSE3 +- ? (HAS_FAST_COPY_BACKWARD ++ HAS_CPU_FEATURE (SSSE3) ++ ? (HAS_ARCH_FEATURE (Fast_Copy_Backward) + ? __memmove_ssse3_back : __memmove_ssse3) + : __memmove_sse2) + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove_chk.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memmove_chk.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove_chk.c +@@ -29,7 +29,7 @@ extern __typeof (__memmove_chk) __memmov + #include "debug/memmove_chk.c" + + libc_ifunc (__memmove_chk, +- HAS_SSSE3 +- ? (HAS_FAST_COPY_BACKWARD ++ HAS_CPU_FEATURE (SSSE3) ++ ? (HAS_ARCH_FEATURE (Fast_Copy_Backward) + ? __memmove_chk_ssse3_back : __memmove_chk_ssse3) + : __memmove_chk_sse2); +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/mempcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy.S +@@ -27,14 +27,12 @@ + #if defined SHARED && IS_IN (libc) + ENTRY(__mempcpy) + .type __mempcpy, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __mempcpy_sse2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __mempcpy_sse2(%rip), %rax ++ HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __mempcpy_ssse3(%rip), %rax +- testl $bit_Fast_Copy_Backward, __cpu_features+FEATURE_OFFSET+index_Fast_Copy_Backward(%rip) ++ HAS_ARCH_FEATURE (Fast_Copy_Backward) + jz 2f + leaq __mempcpy_ssse3_back(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/mempcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy_chk.S +@@ -29,14 +29,12 @@ + .text + ENTRY(__mempcpy_chk) + .type __mempcpy_chk, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __mempcpy_chk_sse2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __mempcpy_chk_sse2(%rip), %rax ++ HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __mempcpy_chk_ssse3(%rip), %rax +- testl $bit_Fast_Copy_Backward, __cpu_features+FEATURE_OFFSET+index_Fast_Copy_Backward(%rip) ++ HAS_ARCH_FEATURE (Fast_Copy_Backward) + jz 2f + leaq __mempcpy_chk_ssse3_back(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memset.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset.S +@@ -24,11 +24,9 @@ + #if IS_IN (libc) + ENTRY(memset) + .type memset, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __memset_x86_64(%rip), %rax +- testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __memset_x86_64(%rip), %rax ++ HAS_ARCH_FEATURE (Prefer_SSE_for_memop) + jz 2f + leaq __memset_sse2(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memset_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset_chk.S +@@ -25,11 +25,9 @@ + # ifdef SHARED + ENTRY(__memset_chk) + .type __memset_chk, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __memset_chk_x86_64(%rip), %rax +- testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __memset_chk_x86_64(%rip), %rax ++ HAS_ARCH_FEATURE (Prefer_SSE_for_memop) + jz 2f + leaq __memset_chk_sse2(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/sched_cpucount.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/sched_cpucount.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/sched_cpucount.c +@@ -33,4 +33,4 @@ + #undef __sched_cpucount + + libc_ifunc (__sched_cpucount, +- HAS_POPCOUNT ? popcount_cpucount : generic_cpucount); ++ HAS_CPU_FEATURE (POPCOUNT) ? popcount_cpucount : generic_cpucount); +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcat.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcat.S +@@ -47,14 +47,12 @@ + .text + ENTRY(STRCAT) + .type STRCAT, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq STRCAT_SSE2_UNALIGNED(%rip), %rax +- testl $bit_Fast_Unaligned_Load, __cpu_features+FEATURE_OFFSET+index_Fast_Unaligned_Load(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq STRCAT_SSE2_UNALIGNED(%rip), %rax ++ HAS_ARCH_FEATURE (Fast_Unaligned_Load) + jnz 2f + leaq STRCAT_SSE2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq STRCAT_SSSE3(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strchr.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strchr.S +@@ -25,15 +25,13 @@ + .text + ENTRY(strchr) + .type strchr, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __strchr_sse2(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __strchr_sse2(%rip), %rax ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f + leaq __strchr_sse42(%rip), %rax + ret +-2: testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip) ++2: HAS_ARCH_FEATURE (Slow_BSF) + jz 3f + leaq __strchr_sse2_no_bsf(%rip), %rax + 3: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcmp.S +@@ -83,16 +83,12 @@ + .text + ENTRY(STRCMP) + .type STRCMP, @gnu_indirect_function +- /* Manually inlined call to __get_cpu_features. */ +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: ++ LOAD_RTLD_GLOBAL_RO_RDX + leaq STRCMP_SSE42(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ HAS_CPU_FEATURE (SSE4_2) + jnz 2f + leaq STRCMP_SSSE3(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ HAS_CPU_FEATURE (SSSE3) + jnz 2f + leaq STRCMP_SSE2(%rip), %rax + 2: ret +@@ -101,21 +97,17 @@ END(STRCMP) + # ifdef USE_AS_STRCASECMP_L + ENTRY(__strcasecmp) + .type __strcasecmp, @gnu_indirect_function +- /* Manually inlined call to __get_cpu_features. */ +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: ++ LOAD_RTLD_GLOBAL_RO_RDX + # ifdef HAVE_AVX_SUPPORT + leaq __strcasecmp_avx(%rip), %rax +- testl $bit_AVX_Usable, __cpu_features+FEATURE_OFFSET+index_AVX_Usable(%rip) ++ HAS_ARCH_FEATURE (AVX_Usable) + jnz 2f + # endif + leaq __strcasecmp_sse42(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ HAS_CPU_FEATURE (SSE4_2) + jnz 2f + leaq __strcasecmp_ssse3(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ HAS_CPU_FEATURE (SSSE3) + jnz 2f + leaq __strcasecmp_sse2(%rip), %rax + 2: ret +@@ -125,21 +117,17 @@ weak_alias (__strcasecmp, strcasecmp) + # ifdef USE_AS_STRNCASECMP_L + ENTRY(__strncasecmp) + .type __strncasecmp, @gnu_indirect_function +- /* Manually inlined call to __get_cpu_features. */ +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: ++ LOAD_RTLD_GLOBAL_RO_RDX + # ifdef HAVE_AVX_SUPPORT + leaq __strncasecmp_avx(%rip), %rax +- testl $bit_AVX_Usable, __cpu_features+FEATURE_OFFSET+index_AVX_Usable(%rip) ++ HAS_ARCH_FEATURE (AVX_Usable) + jnz 2f + # endif + leaq __strncasecmp_sse42(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ HAS_CPU_FEATURE (SSE4_2) + jnz 2f + leaq __strncasecmp_ssse3(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ HAS_CPU_FEATURE (SSSE3) + jnz 2f + leaq __strncasecmp_sse2(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcpy.S +@@ -61,14 +61,12 @@ + .text + ENTRY(STRCPY) + .type STRCPY, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq STRCPY_SSE2_UNALIGNED(%rip), %rax +- testl $bit_Fast_Unaligned_Load, __cpu_features+FEATURE_OFFSET+index_Fast_Unaligned_Load(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq STRCPY_SSE2_UNALIGNED(%rip), %rax ++ HAS_ARCH_FEATURE (Fast_Unaligned_Load) + jnz 2f + leaq STRCPY_SSE2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq STRCPY_SSSE3(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcspn.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcspn.S +@@ -45,11 +45,9 @@ + .text + ENTRY(STRCSPN) + .type STRCSPN, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq STRCSPN_SSE2(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq STRCSPN_SSE2(%rip), %rax ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f + leaq STRCSPN_SSE42(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strspn.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strspn.S +@@ -30,11 +30,9 @@ + .text + ENTRY(strspn) + .type strspn, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __strspn_sse2(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __strspn_sse2(%rip), %rax ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f + leaq __strspn_sse42(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/test-multiarch.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/test-multiarch.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/test-multiarch.c +@@ -75,12 +75,18 @@ do_test (int argc, char **argv) + int fails; + + get_cpuinfo (); +- fails = check_proc ("avx", HAS_AVX, "HAS_AVX"); +- fails += check_proc ("fma4", HAS_FMA4, "HAS_FMA4"); +- fails += check_proc ("sse4_2", HAS_SSE4_2, "HAS_SSE4_2"); +- fails += check_proc ("sse4_1", HAS_SSE4_1, "HAS_SSE4_1"); +- fails += check_proc ("ssse3", HAS_SSSE3, "HAS_SSSE3"); +- fails += check_proc ("popcnt", HAS_POPCOUNT, "HAS_POPCOUNT"); ++ fails = check_proc ("avx", HAS_ARCH_FEATURE (AVX_Usable), ++ "HAS_ARCH_FEATURE (AVX_Usable)"); ++ fails += check_proc ("fma4", HAS_ARCH_FEATURE (FMA4_Usable), ++ "HAS_ARCH_FEATURE (FMA4_Usable)"); ++ fails += check_proc ("sse4_2", HAS_CPU_FEATURE (SSE4_2), ++ "HAS_CPU_FEATURE (SSE4_2)"); ++ fails += check_proc ("sse4_1", HAS_CPU_FEATURE (SSE4_1) ++ , "HAS_CPU_FEATURE (SSE4_1)"); ++ fails += check_proc ("ssse3", HAS_CPU_FEATURE (SSSE3), ++ "HAS_CPU_FEATURE (SSSE3)"); ++ fails += check_proc ("popcnt", HAS_CPU_FEATURE (POPCOUNT), ++ "HAS_CPU_FEATURE (POPCOUNT)"); + + printf ("%d differences between /proc/cpuinfo and glibc code.\n", fails); + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/wcscpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wcscpy.S +@@ -27,11 +27,8 @@ + .text + ENTRY(wcscpy) + .type wcscpy, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features(%rip) +- jne 1f +- call __init_cpu_features +- +-1: testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ HAS_CPU_FEATURE (SSSE3) + jnz 2f + leaq __wcscpy_sse2(%rip), %rax + ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wmemcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/wmemcmp.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/wmemcmp.S +@@ -26,16 +26,13 @@ + .text + ENTRY(wmemcmp) + .type wmemcmp, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features(%rip) +- jne 1f +- call __init_cpu_features +- +-1: testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ HAS_CPU_FEATURE (SSSE3) + jnz 2f + leaq __wmemcmp_sse2(%rip), %rax + ret + +-2: testl $bit_SSE4_1, __cpu_features+CPUID_OFFSET+index_SSE4_1(%rip) ++2: HAS_CPU_FEATURE (SSE4_1) + jz 3f + leaq __wmemcmp_sse4_1(%rip), %rax + ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rawmemchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/rawmemchr.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rawmemchr.S +@@ -27,12 +27,10 @@ + .text + ENTRY(rawmemchr) + .type rawmemchr, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: testl $bit_Prefer_PMINUB_for_stringop, __cpu_features+FEATURE_OFFSET+index_Prefer_PMINUB_for_stringop(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ HAS_ARCH_FEATURE (Prefer_PMINUB_for_stringop) + jnz 2f +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f + leaq __rawmemchr_sse42(%rip), %rax + ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strlen.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strlen.S +@@ -29,18 +29,16 @@ + .text + ENTRY(strlen) + .type strlen, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __strlen_sse2_pminub(%rip), %rax +- testl $bit_Prefer_PMINUB_for_stringop, __cpu_features+FEATURE_OFFSET+index_Prefer_PMINUB_for_stringop(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __strlen_sse2_pminub(%rip), %rax ++ HAS_ARCH_FEATURE (Prefer_PMINUB_for_stringop) + jnz 2f + leaq __strlen_sse2(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f + leaq __strlen_sse42(%rip), %rax + ret +-2: testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip) ++2: HAS_ARCH_FEATURE (Slow_BSF) + jz 3f + leaq __strlen_sse2_no_bsf(%rip), %rax + 3: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strnlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strnlen.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strnlen.S +@@ -27,11 +27,9 @@ + .text + ENTRY(__strnlen) + .type __strnlen, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __strnlen_sse2(%rip), %rax +- testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __strnlen_sse2(%rip), %rax ++ HAS_ARCH_FEATURE (Slow_BSF) + jz 2f + leaq __strnlen_sse2_no_bsf(%rip), %rax + 2: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strrchr.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strrchr.S +@@ -28,15 +28,13 @@ + .text + ENTRY(strrchr) + .type strrchr, @gnu_indirect_function +- cmpl $0, __cpu_features+KIND_OFFSET(%rip) +- jne 1f +- call __init_cpu_features +-1: leaq __strrchr_sse2(%rip), %rax +- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ LOAD_RTLD_GLOBAL_RO_RDX ++ leaq __strrchr_sse2(%rip), %rax ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f + leaq __strrchr_sse42(%rip), %rax + ret +-2: testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip) ++2: HAS_ARCH_FEATURE (Slow_BSF) + jz 3f + leaq __strrchr_sse2_no_bsf(%rip), %rax + 3: ret +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcasestr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strcasestr-c.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcasestr-c.c +@@ -12,8 +12,8 @@ extern __typeof (__strcasestr_sse2) __st + + #if 1 + libc_ifunc (__strcasestr, +- HAS_SSE4_2 && !use_unaligned_strstr () ? __strcasestr_sse42 : +- __strcasestr_sse2); ++ HAS_CPU_FEATURE (SSE4_2) && !use_unaligned_strstr () ++ ? __strcasestr_sse42 : __strcasestr_sse2); + #else + libc_ifunc (__strcasestr, + 0 ? __strcasestr_sse42 : __strcasestr_sse2); +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strstr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/strstr-c.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strstr-c.c +@@ -42,7 +42,7 @@ extern __typeof (__redirect_strstr) __st + /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle + ifunc symbol properly. */ + extern __typeof (__redirect_strstr) __libc_strstr; +-libc_ifunc (__libc_strstr, HAS_SSE4_2 ? (use_unaligned_strstr () ? ++libc_ifunc (__libc_strstr, HAS_CPU_FEATURE (SSE4_2) ? (use_unaligned_strstr () ? + __strstr_sse2_unaligned : + __strstr_sse42) : __strstr_sse2) + diff --git a/SOURCES/glibc-rh1292018-3.patch b/SOURCES/glibc-rh1292018-3.patch new file mode 100644 index 0000000..36b703e --- /dev/null +++ b/SOURCES/glibc-rh1292018-3.patch @@ -0,0 +1,1948 @@ +commit 1aee37a22e3977de7a89e734e0a1e112f52045f2 +Author: H.J. Lu +Date: Thu Aug 13 03:39:22 2015 -0700 + + Update i686 multiarch functions for + + This patch updates i686 multiarch functions to use the newly defined + HAS_CPU_FEATURE, HAS_ARCH_FEATURE, LOAD_GOT_AND_RTLD_GLOBAL_RO and + LOAD_FUNC_GOT_EAX from . + +commit 4e940b2f4b577f3a530e0580373f7c2d569f4d63 +Author: H.J. Lu +Date: Sun Mar 6 08:23:24 2016 -0800 + + Use HAS_ARCH_FEATURE with Fast_Rep_String + + HAS_ARCH_FEATURE, not HAS_CPU_FEATURE, should be used with + Fast_Rep_String. + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/e_expf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/e_expf.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/e_expf.c +@@ -23,11 +23,15 @@ extern double __ieee754_expf_ia32 (doubl + + double __ieee754_expf (double); + libm_ifunc (__ieee754_expf, +- HAS_SSE2 ? __ieee754_expf_sse2 : __ieee754_expf_ia32); ++ HAS_CPU_FEATURE (SSE2) ++ ? __ieee754_expf_sse2 ++ : __ieee754_expf_ia32); + + extern double __expf_finite_sse2 (double); + extern double __expf_finite_ia32 (double); + + double __expf_finite (double); + libm_ifunc (__expf_finite, +- HAS_SSE2 ? __expf_finite_sse2 : __expf_finite_ia32); ++ HAS_CPU_FEATURE (SSE2) ++ ? __expf_finite_sse2 ++ : __expf_finite_ia32); +Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_cosf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/s_cosf.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_cosf.c +@@ -22,7 +22,7 @@ extern float __cosf_sse2 (float); + extern float __cosf_ia32 (float); + float __cosf (float); + +-libm_ifunc (__cosf, HAS_SSE2 ? __cosf_sse2 : __cosf_ia32); ++libm_ifunc (__cosf, HAS_CPU_FEATURE (SSE2) ? __cosf_sse2 : __cosf_ia32); + weak_alias (__cosf, cosf); + + #define COSF __cosf_ia32 +Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sincosf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/s_sincosf.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sincosf.c +@@ -22,7 +22,8 @@ extern void __sincosf_sse2 (float, float + extern void __sincosf_ia32 (float, float *, float *); + void __sincosf (float, float *, float *); + +-libm_ifunc (__sincosf, HAS_SSE2 ? __sincosf_sse2 : __sincosf_ia32); ++libm_ifunc (__sincosf, ++ HAS_CPU_FEATURE (SSE2) ? __sincosf_sse2 : __sincosf_ia32); + weak_alias (__sincosf, sincosf); + + #define SINCOSF __sincosf_ia32 +Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sinf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/s_sinf.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sinf.c +@@ -22,7 +22,7 @@ extern float __sinf_sse2 (float); + extern float __sinf_ia32 (float); + float __sinf (float); + +-libm_ifunc (__sinf, HAS_SSE2 ? __sinf_sse2 : __sinf_ia32); ++libm_ifunc (__sinf, HAS_CPU_FEATURE (SSE2) ? __sinf_sse2 : __sinf_ia32); + weak_alias (__sinf, sinf); + #define SINF __sinf_ia32 + #include +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bcopy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/bcopy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bcopy.S +@@ -23,46 +23,19 @@ + + /* Define multiple versions only for the definition in lib. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(bcopy) + .type bcopy, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __bcopy_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__bcopy_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __bcopy_ssse3@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__bcopy_ssse3) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __bcopy_ssse3_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(bcopy) +-# else +- .text +-ENTRY(bcopy) +- .type bcopy, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __bcopy_ia32, %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal __bcopy_ssse3, %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features +- jz 2f +- leal __bcopy_ssse3_rep, %eax ++ LOAD_FUNC_GOT_EAX(__bcopy_ssse3_rep) + 2: ret + END(bcopy) +-# endif + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bzero.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/bzero.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bzero.S +@@ -23,46 +23,19 @@ + + /* Define multiple versions only for the definition in lib. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(__bzero) + .type __bzero, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __bzero_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__bzero_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __bzero_sse2@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX ( __bzero_sse2) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __bzero_sse2_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(__bzero) +-# else +- .text +-ENTRY(__bzero) +- .type __bzero, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __bzero_ia32, %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features +- jz 2f +- leal __bzero_sse2, %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features +- jz 2f +- leal __bzero_sse2_rep, %eax ++ LOAD_FUNC_GOT_EAX (__bzero_sse2_rep) + 2: ret + END(__bzero) +-# endif + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/ifunc-impl-list.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/ifunc-impl-list.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/ifunc-impl-list.c +@@ -38,152 +38,152 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/i386/i686/multiarch/bcopy.S. */ + IFUNC_IMPL (i, name, bcopy, +- IFUNC_IMPL_ADD (array, i, bcopy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, bcopy, HAS_CPU_FEATURE (SSSE3), + __bcopy_ssse3_rep) +- IFUNC_IMPL_ADD (array, i, bcopy, HAS_SSSE3, __bcopy_ssse3) ++ IFUNC_IMPL_ADD (array, i, bcopy, HAS_CPU_FEATURE (SSSE3), __bcopy_ssse3) + IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/bzero.S. */ + IFUNC_IMPL (i, name, bzero, +- IFUNC_IMPL_ADD (array, i, bzero, HAS_SSE2, __bzero_sse2_rep) +- IFUNC_IMPL_ADD (array, i, bzero, HAS_SSE2, __bzero_sse2) ++ IFUNC_IMPL_ADD (array, i, bzero, HAS_CPU_FEATURE (SSE2), __bzero_sse2_rep) ++ IFUNC_IMPL_ADD (array, i, bzero, HAS_CPU_FEATURE (SSE2), __bzero_sse2) + IFUNC_IMPL_ADD (array, i, bzero, 1, __bzero_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memchr.S. */ + IFUNC_IMPL (i, name, memchr, +- IFUNC_IMPL_ADD (array, i, memchr, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, memchr, HAS_CPU_FEATURE (SSE2), + __memchr_sse2_bsf) +- IFUNC_IMPL_ADD (array, i, memchr, HAS_SSE2, __memchr_sse2) ++ IFUNC_IMPL_ADD (array, i, memchr, HAS_CPU_FEATURE (SSE2), __memchr_sse2) + IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memcmp.S. */ + IFUNC_IMPL (i, name, memcmp, +- IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSE4_2), + __memcmp_sse4_2) +- IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSSE3, __memcmp_ssse3) ++ IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSSE3), __memcmp_ssse3) + IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memmove_chk.S. */ + IFUNC_IMPL (i, name, __memmove_chk, +- IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), + __memmove_chk_ssse3_rep) +- IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), + __memmove_chk_ssse3) + IFUNC_IMPL_ADD (array, i, __memmove_chk, 1, + __memmove_chk_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memmove.S. */ + IFUNC_IMPL (i, name, memmove, +- IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), + __memmove_ssse3_rep) +- IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), + __memmove_ssse3) + IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memrchr.S. */ + IFUNC_IMPL (i, name, memrchr, +- IFUNC_IMPL_ADD (array, i, memrchr, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, memrchr, HAS_CPU_FEATURE (SSE2), + __memrchr_sse2_bsf) +- IFUNC_IMPL_ADD (array, i, memrchr, HAS_SSE2, __memrchr_sse2) ++ IFUNC_IMPL_ADD (array, i, memrchr, HAS_CPU_FEATURE (SSE2), __memrchr_sse2) + IFUNC_IMPL_ADD (array, i, memrchr, 1, __memrchr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memset_chk.S. */ + IFUNC_IMPL (i, name, __memset_chk, +- IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_CPU_FEATURE (SSE2), + __memset_chk_sse2_rep) +- IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_CPU_FEATURE (SSE2), + __memset_chk_sse2) + IFUNC_IMPL_ADD (array, i, __memset_chk, 1, + __memset_chk_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memset.S. */ + IFUNC_IMPL (i, name, memset, +- IFUNC_IMPL_ADD (array, i, memset, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, memset, HAS_CPU_FEATURE (SSE2), + __memset_sse2_rep) +- IFUNC_IMPL_ADD (array, i, memset, HAS_SSE2, __memset_sse2) ++ IFUNC_IMPL_ADD (array, i, memset, HAS_CPU_FEATURE (SSE2), __memset_sse2) + IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ia32)) + + /* Support sysdeps/i386/i686/multiarch/rawmemchr.S. */ + IFUNC_IMPL (i, name, rawmemchr, +- IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_CPU_FEATURE (SSE2), + __rawmemchr_sse2_bsf) +- IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_CPU_FEATURE (SSE2), + __rawmemchr_sse2) + IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/stpncpy.S. */ + IFUNC_IMPL (i, name, stpncpy, +- IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, stpncpy, HAS_CPU_FEATURE (SSSE3), + __stpncpy_ssse3) +- IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSE2, __stpncpy_sse2) ++ IFUNC_IMPL_ADD (array, i, stpncpy, HAS_CPU_FEATURE (SSE2), __stpncpy_sse2) + IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/stpcpy.S. */ + IFUNC_IMPL (i, name, stpcpy, +- IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSSE3, __stpcpy_ssse3) +- IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSE2, __stpcpy_sse2) ++ IFUNC_IMPL_ADD (array, i, stpcpy, HAS_CPU_FEATURE (SSSE3), __stpcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, stpcpy, HAS_CPU_FEATURE (SSE2), __stpcpy_sse2) + IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strcasecmp.S. */ + IFUNC_IMPL (i, name, strcasecmp, +- IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_CPU_FEATURE (SSE4_2), + __strcasecmp_sse4_2) +- IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_CPU_FEATURE (SSSE3), + __strcasecmp_ssse3) + IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strcasecmp_l.S. */ + IFUNC_IMPL (i, name, strcasecmp_l, +- IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_CPU_FEATURE (SSE4_2), + __strcasecmp_l_sse4_2) +- IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_CPU_FEATURE (SSSE3), + __strcasecmp_l_ssse3) + IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1, + __strcasecmp_l_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strcasestr.c. */ + IFUNC_IMPL (i, name, strcasestr, +- IFUNC_IMPL_ADD (array, i, strcasestr, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcasestr, HAS_CPU_FEATURE (SSE4_2), + __strcasestr_sse42) + IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strcat.S. */ + IFUNC_IMPL (i, name, strcat, +- IFUNC_IMPL_ADD (array, i, strcat, HAS_SSSE3, __strcat_ssse3) +- IFUNC_IMPL_ADD (array, i, strcat, HAS_SSE2, __strcat_sse2) ++ IFUNC_IMPL_ADD (array, i, strcat, HAS_CPU_FEATURE (SSSE3), __strcat_ssse3) ++ IFUNC_IMPL_ADD (array, i, strcat, HAS_CPU_FEATURE (SSE2), __strcat_sse2) + IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strchr.S. */ + IFUNC_IMPL (i, name, strchr, +- IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, strchr, HAS_CPU_FEATURE (SSE2), + __strchr_sse2_bsf) +- IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE2, __strchr_sse2) ++ IFUNC_IMPL_ADD (array, i, strchr, HAS_CPU_FEATURE (SSE2), __strchr_sse2) + IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strcmp.S. */ + IFUNC_IMPL (i, name, strcmp, +- IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSE4_2), + __strcmp_sse4_2) +- IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSSE3, __strcmp_ssse3) ++ IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSSE3), __strcmp_ssse3) + IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strcpy.S. */ + IFUNC_IMPL (i, name, strcpy, +- IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSSE3, __strcpy_ssse3) +- IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSE2, __strcpy_sse2) ++ IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSSE3), __strcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSE2), __strcpy_sse2) + IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strcspn.S. */ + IFUNC_IMPL (i, name, strcspn, +- IFUNC_IMPL_ADD (array, i, strcspn, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strcspn, HAS_CPU_FEATURE (SSE4_2), + __strcspn_sse42) + IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strncase.S. */ + IFUNC_IMPL (i, name, strncasecmp, +- IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_CPU_FEATURE (SSE4_2), + __strncasecmp_sse4_2) +- IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_CPU_FEATURE (SSSE3), + __strncasecmp_ssse3) + IFUNC_IMPL_ADD (array, i, strncasecmp, 1, + __strncasecmp_ia32)) +@@ -191,133 +191,133 @@ __libc_ifunc_impl_list (const char *name + /* Support sysdeps/i386/i686/multiarch/strncase_l.S. */ + IFUNC_IMPL (i, name, strncasecmp_l, + IFUNC_IMPL_ADD (array, i, strncasecmp_l, +- HAS_SSE4_2, __strncasecmp_l_sse4_2) ++ HAS_CPU_FEATURE (SSE4_2), __strncasecmp_l_sse4_2) + IFUNC_IMPL_ADD (array, i, strncasecmp_l, +- HAS_SSSE3, __strncasecmp_l_ssse3) ++ HAS_CPU_FEATURE (SSSE3), __strncasecmp_l_ssse3) + IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1, + __strncasecmp_l_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strncat.S. */ + IFUNC_IMPL (i, name, strncat, +- IFUNC_IMPL_ADD (array, i, strncat, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSSE3), + __strncat_ssse3) +- IFUNC_IMPL_ADD (array, i, strncat, HAS_SSE2, __strncat_sse2) ++ IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSE2), __strncat_sse2) + IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strncpy.S. */ + IFUNC_IMPL (i, name, strncpy, +- IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSSE3), + __strncpy_ssse3) +- IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSE2, __strncpy_sse2) ++ IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSE2), __strncpy_sse2) + IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strnlen.S. */ + IFUNC_IMPL (i, name, strnlen, +- IFUNC_IMPL_ADD (array, i, strnlen, HAS_SSE2, __strnlen_sse2) ++ IFUNC_IMPL_ADD (array, i, strnlen, HAS_CPU_FEATURE (SSE2), __strnlen_sse2) + IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strpbrk.S. */ + IFUNC_IMPL (i, name, strpbrk, +- IFUNC_IMPL_ADD (array, i, strpbrk, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strpbrk, HAS_CPU_FEATURE (SSE4_2), + __strpbrk_sse42) + IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strrchr.S. */ + IFUNC_IMPL (i, name, strrchr, +- IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, strrchr, HAS_CPU_FEATURE (SSE2), + __strrchr_sse2_bsf) +- IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE2, __strrchr_sse2) ++ IFUNC_IMPL_ADD (array, i, strrchr, HAS_CPU_FEATURE (SSE2), __strrchr_sse2) + IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strspn.S. */ + IFUNC_IMPL (i, name, strspn, +- IFUNC_IMPL_ADD (array, i, strspn, HAS_SSE4_2, __strspn_sse42) ++ IFUNC_IMPL_ADD (array, i, strspn, HAS_CPU_FEATURE (SSE4_2), __strspn_sse42) + IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strstr-c.c. */ + IFUNC_IMPL (i, name, strstr, +- IFUNC_IMPL_ADD (array, i, strstr, HAS_SSE4_2, __strstr_sse42) ++ IFUNC_IMPL_ADD (array, i, strstr, HAS_CPU_FEATURE (SSE4_2), __strstr_sse42) + IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/wcschr.S. */ + IFUNC_IMPL (i, name, wcschr, +- IFUNC_IMPL_ADD (array, i, wcschr, HAS_SSE2, __wcschr_sse2) ++ IFUNC_IMPL_ADD (array, i, wcschr, HAS_CPU_FEATURE (SSE2), __wcschr_sse2) + IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/wcscmp.S. */ + IFUNC_IMPL (i, name, wcscmp, +- IFUNC_IMPL_ADD (array, i, wcscmp, HAS_SSE2, __wcscmp_sse2) ++ IFUNC_IMPL_ADD (array, i, wcscmp, HAS_CPU_FEATURE (SSE2), __wcscmp_sse2) + IFUNC_IMPL_ADD (array, i, wcscmp, 1, __wcscmp_ia32)) + + /* Support sysdeps/i386/i686/multiarch/wcscpy.S. */ + IFUNC_IMPL (i, name, wcscpy, +- IFUNC_IMPL_ADD (array, i, wcscpy, HAS_SSSE3, __wcscpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, wcscpy, HAS_CPU_FEATURE (SSSE3), __wcscpy_ssse3) + IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/wcslen.S. */ + IFUNC_IMPL (i, name, wcslen, +- IFUNC_IMPL_ADD (array, i, wcslen, HAS_SSE2, __wcslen_sse2) ++ IFUNC_IMPL_ADD (array, i, wcslen, HAS_CPU_FEATURE (SSE2), __wcslen_sse2) + IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_ia32)) + + /* Support sysdeps/i386/i686/multiarch/wcsrchr.S. */ + IFUNC_IMPL (i, name, wcsrchr, +- IFUNC_IMPL_ADD (array, i, wcsrchr, HAS_SSE2, __wcsrchr_sse2) ++ IFUNC_IMPL_ADD (array, i, wcsrchr, HAS_CPU_FEATURE (SSE2), __wcsrchr_sse2) + IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_ia32)) + + /* Support sysdeps/i386/i686/multiarch/wmemcmp.S. */ + IFUNC_IMPL (i, name, wmemcmp, +- IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSE4_2), + __wmemcmp_sse4_2) +- IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSSE3), + __wmemcmp_ssse3) + IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_ia32)) + + #ifdef SHARED + /* Support sysdeps/i386/i686/multiarch/memcpy_chk.S. */ + IFUNC_IMPL (i, name, __memcpy_chk, +- IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), + __memcpy_chk_ssse3_rep) +- IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), + __memcpy_chk_ssse3) + IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1, + __memcpy_chk_ia32)) + + /* Support sysdeps/i386/i686/multiarch/memcpy.S. */ + IFUNC_IMPL (i, name, memcpy, +- IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), + __memcpy_ssse3_rep) +- IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, __memcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), __memcpy_ssse3) + IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/mempcpy_chk.S. */ + IFUNC_IMPL (i, name, __mempcpy_chk, +- IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), + __mempcpy_chk_ssse3_rep) +- IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), + __mempcpy_chk_ssse3) + IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1, + __mempcpy_chk_ia32)) + + /* Support sysdeps/i386/i686/multiarch/mempcpy.S. */ + IFUNC_IMPL (i, name, mempcpy, +- IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), + __mempcpy_ssse3_rep) +- IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), + __mempcpy_ssse3) + IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strlen.S. */ + IFUNC_IMPL (i, name, strlen, +- IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE2, ++ IFUNC_IMPL_ADD (array, i, strlen, HAS_CPU_FEATURE (SSE2), + __strlen_sse2_bsf) +- IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE2, __strlen_sse2) ++ IFUNC_IMPL_ADD (array, i, strlen, HAS_CPU_FEATURE (SSE2), __strlen_sse2) + IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_ia32)) + + /* Support sysdeps/i386/i686/multiarch/strncmp.S. */ + IFUNC_IMPL (i, name, strncmp, +- IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSE4_2, ++ IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSE4_2), + __strncmp_sse4_2) +- IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSSE3, ++ IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSSE3), + __strncmp_ssse3) + IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_ia32)) + #endif +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr.S +@@ -22,46 +22,22 @@ + #include + + #if IS_IN (libc) +-# define CFI_POP(REG) \ +- cfi_adjust_cfa_offset (-4); \ +- cfi_restore (REG) +- +-# define CFI_PUSH(REG) \ +- cfi_adjust_cfa_offset (4); \ +- cfi_rel_offset (REG, 0) +- + .text + ENTRY(__memchr) + .type __memchr, @gnu_indirect_function +- pushl %ebx +- CFI_PUSH (%ebx) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +- +-1: testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- testl $bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx) ++ HAS_ARCH_FEATURE (Slow_BSF) + jz 3f + +- leal __memchr_sse2@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++ LOAD_FUNC_GOT_EAX ( __memchr_sse2) + ret + +- CFI_PUSH (%ebx) +- +-2: leal __memchr_ia32@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++2: LOAD_FUNC_GOT_EAX (__memchr_ia32) + ret + +- CFI_PUSH (%ebx) +- +-3: leal __memchr_sse2_bsf@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++3: LOAD_FUNC_GOT_EAX (__memchr_sse2_bsf) + ret + END(__memchr) + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp.S +@@ -23,46 +23,19 @@ + + /* Define multiple versions only for the definition in libc. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(memcmp) + .type memcmp, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __memcmp_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__memcmp_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __memcmp_ssse3@GOTOFF(%ebx), %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__memcmp_ssse3) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f +- leal __memcmp_sse4_2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(memcmp) +-# else +- .text +-ENTRY(memcmp) +- .type memcmp, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __memcmp_ia32, %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal __memcmp_ssse3, %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features +- jz 2f +- leal __memcmp_sse4_2, %eax ++ LOAD_FUNC_GOT_EAX (__memcmp_sse4_2) + 2: ret + END(memcmp) +-# endif + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy.S +@@ -28,24 +28,15 @@ + .text + ENTRY(memcpy) + .type memcpy, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __memcpy_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__memcpy_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __memcpy_ssse3@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__memcpy_ssse3) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __memcpy_ssse3_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__memcpy_ssse3_rep) ++2: ret + END(memcpy) + + # undef ENTRY +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy_chk.S +@@ -29,24 +29,15 @@ + .text + ENTRY(__memcpy_chk) + .type __memcpy_chk, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __memcpy_chk_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__memcpy_chk_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __memcpy_chk_ssse3@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __memcpy_chk_ssse3_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3_rep) ++2: ret + END(__memcpy_chk) + # else + # include "../memcpy_chk.S" +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memmove.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove.S +@@ -23,32 +23,23 @@ + + /* Define multiple versions only for the definition in lib. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(memmove) + .type memmove, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __memmove_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__memmove_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __memmove_ssse3@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__memmove_ssse3) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __memmove_ssse3_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__memmove_ssse3_rep) ++2: ret + END(memmove) + +-# undef ENTRY +-# define ENTRY(name) \ ++# ifdef SHARED ++# undef ENTRY ++# define ENTRY(name) \ + .type __memmove_ia32, @function; \ + .p2align 4; \ + .globl __memmove_ia32; \ +@@ -56,24 +47,9 @@ END(memmove) + __memmove_ia32: cfi_startproc; \ + CALL_MCOUNT + # else +- .text +-ENTRY(memmove) +- .type memmove, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __memmove_ia32, %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal __memmove_ssse3, %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features +- jz 2f +- leal __memmove_ssse3_rep, %eax +-2: ret +-END(memmove) + +-# undef ENTRY +-# define ENTRY(name) \ ++# undef ENTRY ++# define ENTRY(name) \ + .type __memmove_ia32, @function; \ + .globl __memmove_ia32; \ + .p2align 4; \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memmove_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove_chk.S +@@ -23,46 +23,21 @@ + + /* Define multiple versions only for the definition in lib. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(__memmove_chk) + .type __memmove_chk, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __memmove_chk_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__memmove_chk_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __memmove_chk_ssse3@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __memmove_chk_ssse3_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(__memmove_chk) +-# else +- .text +-ENTRY(__memmove_chk) +- .type __memmove_chk, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __memmove_chk_ia32, %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal __memmove_chk_ssse3, %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features +- jz 2f +- leal __memmove_chk_ssse3_rep, %eax ++ LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3_rep) + 2: ret + END(__memmove_chk) + ++# ifndef SHARED + .type __memmove_chk_ssse3, @function + .p2align 4; + __memmove_chk_ssse3: +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/mempcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy.S +@@ -28,24 +28,15 @@ + .text + ENTRY(__mempcpy) + .type __mempcpy, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __mempcpy_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__mempcpy_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __mempcpy_ssse3@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__mempcpy_ssse3) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __mempcpy_ssse3_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__mempcpy_ssse3_rep) ++2: ret + END(__mempcpy) + + # undef ENTRY +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/mempcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy_chk.S +@@ -29,24 +29,15 @@ + .text + ENTRY(__mempcpy_chk) + .type __mempcpy_chk, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __mempcpy_chk_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__mempcpy_chk_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __mempcpy_chk_ssse3@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __mempcpy_chk_ssse3_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3_rep) ++2: ret + END(__mempcpy_chk) + # else + # include "../mempcpy_chk.S" +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memrchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr.S +@@ -22,46 +22,22 @@ + #include + + #if IS_IN (libc) +-# define CFI_POP(REG) \ +- cfi_adjust_cfa_offset (-4); \ +- cfi_restore (REG) +- +-# define CFI_PUSH(REG) \ +- cfi_adjust_cfa_offset (4); \ +- cfi_rel_offset (REG, 0) +- + .text + ENTRY(__memrchr) + .type __memrchr, @gnu_indirect_function +- pushl %ebx +- CFI_PUSH (%ebx) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +- +-1: testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- testl $bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx) ++ HAS_ARCH_FEATURE (Slow_BSF) + jz 3f + +- leal __memrchr_sse2@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++ LOAD_FUNC_GOT_EAX (__memrchr_sse2) + ret + +- CFI_PUSH (%ebx) +- +-2: leal __memrchr_ia32@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++2: LOAD_FUNC_GOT_EAX (__memrchr_ia32) + ret + +- CFI_PUSH (%ebx) +- +-3: leal __memrchr_sse2_bsf@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++3: LOAD_FUNC_GOT_EAX (__memrchr_sse2_bsf) + ret + END(__memrchr) + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset.S +@@ -23,46 +23,19 @@ + + /* Define multiple versions only for the definition in lib. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(memset) + .type memset, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __memset_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__memset_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __memset_sse2@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__memset_sse2) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __memset_sse2_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(memset) +-# else +- .text +-ENTRY(memset) +- .type memset, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __memset_ia32, %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features +- jz 2f +- leal __memset_sse2, %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features +- jz 2f +- leal __memset_sse2_rep, %eax ++ LOAD_FUNC_GOT_EAX (__memset_sse2_rep) + 2: ret + END(memset) +-# endif + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset_chk.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset_chk.S +@@ -23,50 +23,26 @@ + + /* Define multiple versions only for the definition in lib. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(__memset_chk) + .type __memset_chk, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __memset_chk_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__memset_chk_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __memset_chk_sse2@GOTOFF(%ebx), %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__memset_chk_sse2) ++ HAS_ARCH_FEATURE (Fast_Rep_String) + jz 2f +- leal __memset_chk_sse2_rep@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__memset_chk_sse2_rep) ++2: ret + END(__memset_chk) + ++# ifdef SHARED + strong_alias (__memset_chk, __memset_zero_constant_len_parameter) + .section .gnu.warning.__memset_zero_constant_len_parameter + .string "memset used with constant zero length parameter; this could be due to transposed parameters" + # else + .text +-ENTRY(__memset_chk) +- .type __memset_chk, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __memset_chk_ia32, %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features +- jz 2f +- leal __memset_chk_sse2, %eax +- testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features +- jz 2f +- leal __memset_chk_sse2_rep, %eax +-2: ret +-END(__memset_chk) +- + .type __memset_chk_sse2, @function + .p2align 4; + __memset_chk_sse2: +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/rawmemchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/rawmemchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/rawmemchr.S +@@ -22,46 +22,22 @@ + #include + + #if IS_IN (libc) +-# define CFI_POP(REG) \ +- cfi_adjust_cfa_offset (-4); \ +- cfi_restore (REG) +- +-# define CFI_PUSH(REG) \ +- cfi_adjust_cfa_offset (4); \ +- cfi_rel_offset (REG, 0) +- + .text + ENTRY(__rawmemchr) + .type __rawmemchr, @gnu_indirect_function +- pushl %ebx +- CFI_PUSH (%ebx) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +- +-1: testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- testl $bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx) ++ HAS_ARCH_FEATURE (Slow_BSF) + jz 3f + +- leal __rawmemchr_sse2@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++ LOAD_FUNC_GOT_EAX (__rawmemchr_sse2) + ret + +- CFI_PUSH (%ebx) +- +-2: leal __rawmemchr_ia32@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++2: LOAD_FUNC_GOT_EAX (__rawmemchr_ia32) + ret + +- CFI_PUSH (%ebx) +- +-3: leal __rawmemchr_sse2_bsf@GOTOFF(%ebx), %eax +- popl %ebx +- CFI_POP (%ebx) ++3: LOAD_FUNC_GOT_EAX (__rawmemchr_sse2_bsf) + ret + END(__rawmemchr) + +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fma.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/s_fma.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fma.c +@@ -26,7 +26,8 @@ + extern double __fma_ia32 (double x, double y, double z) attribute_hidden; + extern double __fma_fma (double x, double y, double z) attribute_hidden; + +-libm_ifunc (__fma, HAS_FMA ? __fma_fma : __fma_ia32); ++libm_ifunc (__fma, ++ HAS_ARCH_FEATURE (FMA_Usable) ? __fma_fma : __fma_ia32); + weak_alias (__fma, fma) + + # define __fma __fma_ia32 +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fmaf.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/s_fmaf.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fmaf.c +@@ -26,7 +26,8 @@ + extern float __fmaf_ia32 (float x, float y, float z) attribute_hidden; + extern float __fmaf_fma (float x, float y, float z) attribute_hidden; + +-libm_ifunc (__fmaf, HAS_FMA ? __fmaf_fma : __fmaf_ia32); ++libm_ifunc (__fmaf, ++ HAS_ARCH_FEATURE (FMA_Usable) ? __fmaf_fma : __fmaf_ia32); + weak_alias (__fmaf, fmaf) + + # define __fmaf __fmaf_ia32 +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcasecmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcasecmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcasecmp.S +@@ -20,48 +20,18 @@ + #include + #include + +-#ifdef SHARED + .text + ENTRY(__strcasecmp) + .type __strcasecmp, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __strcasecmp_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__strcasecmp_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __strcasecmp_ssse3@GOTOFF(%ebx), %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__strcasecmp_ssse3) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f +- leal __strcasecmp_sse4_2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(__strcasecmp) +-#else +- .text +-ENTRY(__strcasecmp) +- .type __strcasecmp, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __strcasecmp_ia32, %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal __strcasecmp_ssse3, %eax +-#if 0 +- // XXX Temporarily +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features +- jz 2f +- leal __strcasecmp_sse4_2, %eax +-#endif ++ LOAD_FUNC_GOT_EAX (__strcasecmp_sse4_2) + 2: ret + END(__strcasecmp) +-#endif + + weak_alias (__strcasecmp, strcasecmp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcat.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat.S +@@ -45,52 +45,22 @@ + need strncat before the initialization happened. */ + #if IS_IN (libc) + +-# ifdef SHARED + .text + ENTRY(STRCAT) + .type STRCAT, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal STRCAT_IA32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (STRCAT_IA32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal STRCAT_SSE2@GOTOFF(%ebx), %eax +- testl $bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (STRCAT_SSE2) ++ HAS_ARCH_FEATURE (Fast_Unaligned_Load) + jnz 2f +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal STRCAT_SSSE3@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(STRCAT) +-# else +- +-ENTRY(STRCAT) +- .type STRCAT, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal STRCAT_IA32, %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features +- jz 2f +- leal STRCAT_SSE2, %eax +- testl $bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features +- jnz 2f +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal STRCAT_SSSE3, %eax ++ LOAD_FUNC_GOT_EAX (STRCAT_SSSE3) + 2: ret + END(STRCAT) + +-# endif +- + # undef ENTRY + # define ENTRY(name) \ + .type STRCAT_IA32, @function; \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr.S +@@ -25,24 +25,15 @@ + .text + ENTRY(strchr) + .type strchr, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __strchr_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__strchr_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __strchr_sse2_bsf@GOTOFF(%ebx), %eax +- testl $bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__strchr_sse2_bsf) ++ HAS_ARCH_FEATURE (Slow_BSF) + jz 2f +- leal __strchr_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__strchr_sse2) ++2: ret + END(strchr) + + # undef ENTRY +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp.S +@@ -51,46 +51,19 @@ + define multiple versions for strncmp in static library since we + need strncmp before the initialization happened. */ + #if (defined SHARED || !defined USE_AS_STRNCMP) && IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(STRCMP) + .type STRCMP, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __STRCMP_IA32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__STRCMP_IA32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __STRCMP_SSSE3@GOTOFF(%ebx), %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__STRCMP_SSSE3) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f +- leal __STRCMP_SSE4_2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(STRCMP) +-# else +- .text +-ENTRY(STRCMP) +- .type STRCMP, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __STRCMP_IA32, %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal __STRCMP_SSSE3, %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features +- jz 2f +- leal __STRCMP_SSE4_2, %eax ++ LOAD_FUNC_GOT_EAX (__STRCMP_SSE4_2) + 2: ret + END(STRCMP) +-# endif + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy.S +@@ -61,52 +61,22 @@ + need strncpy before the initialization happened. */ + #if IS_IN (libc) + +-# ifdef SHARED + .text + ENTRY(STRCPY) + .type STRCPY, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal STRCPY_IA32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (STRCPY_IA32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal STRCPY_SSE2@GOTOFF(%ebx), %eax +- testl $bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (STRCPY_SSE2) ++ HAS_ARCH_FEATURE (Fast_Unaligned_Load) + jnz 2f +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal STRCPY_SSSE3@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(STRCPY) +-# else +- +-ENTRY(STRCPY) +- .type STRCPY, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal STRCPY_IA32, %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features +- jz 2f +- leal STRCPY_SSE2, %eax +- testl $bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features +- jnz 2f +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal STRCPY_SSSE3, %eax ++ LOAD_FUNC_GOT_EAX (STRCPY_SSSE3) + 2: ret + END(STRCPY) + +-# endif +- + # undef ENTRY + # define ENTRY(name) \ + .type STRCPY_IA32, @function; \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcspn.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcspn.S +@@ -42,40 +42,16 @@ + define multiple versions for strpbrk in static library since we + need strpbrk before the initialization happened. */ + #if (defined SHARED || !defined USE_AS_STRPBRK) && IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(STRCSPN) + .type STRCSPN, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal STRCSPN_IA32@GOTOFF(%ebx), %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (STRCSPN_IA32) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f +- leal STRCSPN_SSE42@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret +-END(STRCSPN) +-# else +- .text +-ENTRY(STRCSPN) +- .type STRCSPN, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal STRCSPN_IA32, %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features +- jz 2f +- leal STRCSPN_SSE42, %eax ++ LOAD_FUNC_GOT_EAX (STRCSPN_SSE42) + 2: ret + END(STRCSPN) +-# endif + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strlen.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen.S +@@ -28,24 +28,15 @@ + .text + ENTRY(strlen) + .type strlen, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __strlen_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__strlen_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __strlen_sse2_bsf@GOTOFF(%ebx), %eax +- testl $bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__strlen_sse2_bsf) ++ HAS_ARCH_FEATURE (Slow_BSF) + jz 2f +- leal __strlen_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__strlen_sse2) ++2: ret + END(strlen) + + # undef ENTRY +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strncase.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strncase.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strncase.S +@@ -20,48 +20,18 @@ + #include + #include + +-#ifdef SHARED + .text + ENTRY(__strncasecmp) + .type __strncasecmp, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __strncasecmp_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__strncasecmp_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __strncasecmp_ssse3@GOTOFF(%ebx), %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__strncasecmp_ssse3) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f +- leal __strncasecmp_sse4_2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret +-END(__strncasecmp) +-#else +- .text +-ENTRY(__strncasecmp) +- .type __strncasecmp, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __strncasecmp_ia32, %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features +- jz 2f +- leal __strncasecmp_ssse3, %eax +-#if 0 +- // XXX Temporarily +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features +- jz 2f +- leal __strncasecmp_sse4_2, %eax +-#endif ++ LOAD_FUNC_GOT_EAX (__strncasecmp_sse4_2) + 2: ret + END(__strncasecmp) +-#endif + + weak_alias (__strncasecmp, strncasecmp) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strnlen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strnlen.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strnlen.S +@@ -25,21 +25,12 @@ + .text + ENTRY(__strnlen) + .type __strnlen, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __strnlen_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__strnlen_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __strnlen_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__strnlen_sse2) ++2: ret + END(__strnlen) + + weak_alias(__strnlen, strnlen) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strrchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr.S +@@ -25,24 +25,15 @@ + .text + ENTRY(strrchr) + .type strrchr, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __strrchr_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__strrchr_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __strrchr_sse2_bsf@GOTOFF(%ebx), %eax +- testl $bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__strrchr_sse2_bsf) ++ HAS_ARCH_FEATURE (Slow_BSF) + jz 2f +- leal __strrchr_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__strrchr_sse2) ++2: ret + END(strrchr) + + # undef ENTRY +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strspn.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strspn.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strspn.S +@@ -27,40 +27,16 @@ + + /* Define multiple versions only for the definition in libc. */ + #if IS_IN (libc) +-# ifdef SHARED + .text + ENTRY(strspn) + .type strspn, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __strspn_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__strspn_ia32) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f +- leal __strspn_sse42@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret +-END(strspn) +-# else +- .text +-ENTRY(strspn) +- .type strspn, @gnu_indirect_function +- cmpl $0, KIND_OFFSET+__cpu_features +- jne 1f +- call __init_cpu_features +-1: leal __strspn_ia32, %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features +- jz 2f +- leal __strspn_sse42, %eax ++ LOAD_FUNC_GOT_EAX (__strspn_sse42) + 2: ret + END(strspn) +-# endif + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcschr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr.S +@@ -25,20 +25,11 @@ + .text + ENTRY(wcschr) + .type wcschr, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __wcschr_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__wcschr_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __wcschr_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__wcschr_sse2) ++2: ret + END(wcschr) + #endif +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp.S +@@ -28,20 +28,11 @@ + .text + ENTRY(wcscmp) + .type wcscmp, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __wcscmp_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__wcscmp_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __wcscmp_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__wcscmp_sse2) ++2: ret + END(wcscmp) + #endif +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscpy.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy.S +@@ -26,20 +26,11 @@ + .text + ENTRY(wcscpy) + .type wcscpy, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __wcscpy_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__wcscpy_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __wcscpy_ssse3@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__wcscpy_ssse3) ++2: ret + END(wcscpy) + #endif +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcslen.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen.S +@@ -25,21 +25,12 @@ + .text + ENTRY(__wcslen) + .type __wcslen, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __wcslen_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__wcslen_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __wcslen_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__wcslen_sse2) ++2: ret + END(__wcslen) + + weak_alias(__wcslen, wcslen) +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcsrchr.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr.S +@@ -25,20 +25,11 @@ + .text + ENTRY(wcsrchr) + .type wcsrchr, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __wcsrchr_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__wcsrchr_ia32) ++ HAS_CPU_FEATURE (SSE2) + jz 2f +- leal __wcsrchr_sse2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4); +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__wcsrchr_sse2) ++2: ret + END(wcsrchr) + #endif +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wmemcmp.S ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp.S +@@ -27,23 +27,14 @@ + .text + ENTRY(wmemcmp) + .type wmemcmp, @gnu_indirect_function +- pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (ebx, 0) +- LOAD_PIC_REG(bx) +- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx) +- jne 1f +- call __init_cpu_features +-1: leal __wmemcmp_ia32@GOTOFF(%ebx), %eax +- testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx) ++ LOAD_GOT_AND_RTLD_GLOBAL_RO ++ LOAD_FUNC_GOT_EAX (__wmemcmp_ia32) ++ HAS_CPU_FEATURE (SSSE3) + jz 2f +- leal __wmemcmp_ssse3@GOTOFF(%ebx), %eax +- testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx) ++ LOAD_FUNC_GOT_EAX (__wmemcmp_ssse3) ++ HAS_CPU_FEATURE (SSE4_2) + jz 2f +- leal __wmemcmp_sse4_2@GOTOFF(%ebx), %eax +-2: popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (ebx) +- ret ++ LOAD_FUNC_GOT_EAX (__wmemcmp_sse4_2) ++2: ret + END(wmemcmp) + #endif +Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strstr-c.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strstr-c.c ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strstr-c.c +@@ -24,7 +24,7 @@ extern __typeof (__redirect_strstr) __st + ifunc symbol properly. */ + extern __typeof (__redirect_strstr) __libc_strstr; + libc_ifunc (__libc_strstr, +- HAS_SSE4_2 && !use_unaligned_strstr () ? ++ HAS_CPU_FEATURE (SSE4_2) && !use_unaligned_strstr () ? + __strstr_sse42 : __strstr_ia32) + + #undef strstr diff --git a/SOURCES/glibc-rh1292018-4.patch b/SOURCES/glibc-rh1292018-4.patch new file mode 100644 index 0000000..1e03502 --- /dev/null +++ b/SOURCES/glibc-rh1292018-4.patch @@ -0,0 +1,41 @@ +commit 37dd6a19ca36b84cdef7e51dffcb68a2cbf54a6a +Author: Siddhesh Poyarekar +Date: Fri Aug 14 05:30:17 2015 -0700 + + Remove incorrect register mov in floorf/nearbyint on x86_64 + + The change in 0b5395f052ee09cd7e3d219af4e805c38058afb5 replaced calls + to __get_cpu_features@plt followed by a mov from rax to rdx, with a + single macro LOAD_RTLD_GLOBAL_RO_RDX. It is pretty clear that there + was a typo in s_floorf and __nearbyint due to which the (now incorrect) + mov was not removed. This patch removes that mov. + + * sysdeps/x86_64/fpu/multiarch/s_floorf.S (__floorf): Remove + unnecessary movq. + * sysdeps/x86_64/fpu/multiarch/s_nearbyint.S (__nearbyint): + Likewise. + +diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf.S b/sysdeps/x86_64/fpu/multiarch/s_floorf.S +index f60f662..9d67847 100644 +--- a/sysdeps/x86_64/fpu/multiarch/s_floorf.S ++++ b/sysdeps/x86_64/fpu/multiarch/s_floorf.S +@@ -23,7 +23,6 @@ + ENTRY(__floorf) + .type __floorf, @gnu_indirect_function + LOAD_RTLD_GLOBAL_RO_RDX +- movq %rax, %rdx + leaq __floorf_sse41(%rip), %rax + HAS_CPU_FEATURE (SSE4_1) + jnz 2f +diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyint.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyint.S +index 109395c..2c13024 100644 +--- a/sysdeps/x86_64/fpu/multiarch/s_nearbyint.S ++++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyint.S +@@ -23,7 +23,6 @@ + ENTRY(__nearbyint) + .type __nearbyint, @gnu_indirect_function + LOAD_RTLD_GLOBAL_RO_RDX +- movq %rax, %rdx + leaq __nearbyint_sse41(%rip), %rax + HAS_CPU_FEATURE (SSE4_1) + jnz 2f diff --git a/SOURCES/glibc-rh1292018-5.patch b/SOURCES/glibc-rh1292018-5.patch new file mode 100644 index 0000000..ce0422b --- /dev/null +++ b/SOURCES/glibc-rh1292018-5.patch @@ -0,0 +1,26 @@ +commit c9afcaaafaf9126a973883528eed8d0058a264c0 +Author: H.J. Lu +Date: Tue Dec 15 11:46:54 2015 -0800 + + Enable Silvermont optimizations for Knights Landing + + Knights Landing processor is based on Silvermont. This patch enables + Silvermont optimizations for Knights Landing. + + * sysdeps/x86/cpu-features.c (init_cpu_features): Enable + Silvermont optimizations for Knights Landing. + +diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c +index fba3ef0..aff894c 100644 +--- a/sysdeps/x86/cpu-features.c ++++ b/sysdeps/x86/cpu-features.c +@@ -78,6 +78,9 @@ init_cpu_features (struct cpu_features *cpu_features) + cpu_features->feature[index_Slow_BSF] |= bit_Slow_BSF; + break; + ++ case 0x57: ++ /* Knights Landing. Enable Silvermont optimizations. */ ++ + case 0x37: + case 0x4a: + case 0x4d: diff --git a/SOURCES/glibc-rh1292018-6.patch b/SOURCES/glibc-rh1292018-6.patch new file mode 100644 index 0000000..50c3775 --- /dev/null +++ b/SOURCES/glibc-rh1292018-6.patch @@ -0,0 +1,189 @@ +commit b9eb92ab05204df772eb4929eccd018637c9f3e9 +Author: H.J. Lu +Date: Wed Oct 21 14:44:23 2015 -0700 + + Add Prefer_MAP_32BIT_EXEC to map executable pages with MAP_32BIT + + According to Silvermont software optimization guide, for 64-bit + applications, branch prediction performance can be negatively impacted + when the target of a branch is more than 4GB away from the branch. Add + the Prefer_MAP_32BIT_EXEC bit so that mmap will try to map executable + pages with MAP_32BIT first. NB: MAP_32BIT will map to lower 2GB, not + lower 4GB, address. Prefer_MAP_32BIT_EXEC reduces bits available for + address space layout randomization (ASLR), which is always disabled for + SUID programs and can only be enabled by setting environment variable, + LD_PREFER_MAP_32BIT_EXEC. + + On Fedora 23, this patch speeds up GCC 5 testsuite by 3% on Silvermont. + + [BZ #19367] + * sysdeps/unix/sysv/linux/wordsize-64/mmap.c: New file. + * sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/64/mmap.c: Likewise. + * sysdeps/x86/cpu-features.h (bit_Prefer_MAP_32BIT_EXEC): New. + (index_Prefer_MAP_32BIT_EXEC): Likewise. + +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/wordsize-64/mmap.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/wordsize-64/mmap.c +@@ -0,0 +1,40 @@ ++/* Linux mmap system call. 64-bit version. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public License as ++ published by the Free Software Foundation; either version 2.1 of the ++ License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++/* An architecture may override this. */ ++#ifndef MMAP_PREPARE ++# define MMAP_PREPARE(addr, len, prot, flags, fd, offset) ++#endif ++ ++__ptr_t ++__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) ++{ ++ MMAP_PREPARE (addr, len, prot, flags, fd, offset); ++ return (__ptr_t) INLINE_SYSCALL (mmap, 6, addr, len, prot, flags, ++ fd, offset); ++} ++ ++weak_alias (__mmap, mmap) ++weak_alias (__mmap, mmap64) ++weak_alias (__mmap, __mmap64) +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h +@@ -0,0 +1,44 @@ ++/* Optional code to distinguish library flavours. x86-64 version. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef _DL_LIBRECON_H ++ ++#include ++ ++/* Recognizing extra environment variables. For 64-bit applications, ++ branch prediction performance may be negatively impacted when the ++ target of a branch is more than 4GB away from the branch. Add the ++ Prefer_MAP_32BIT_EXEC bit so that mmap will try to map executable ++ pages with MAP_32BIT first. NB: MAP_32BIT will map to lower 2GB, ++ not lower 4GB, address. Prefer_MAP_32BIT_EXEC reduces bits available ++ for address space layout randomization (ASLR). Prefer_MAP_32BIT_EXEC ++ is always disabled for SUID programs and can be enabled by setting ++ environment variable, LD_PREFER_MAP_32BIT_EXEC. */ ++#define EXTRA_LD_ENVVARS \ ++ case 21: \ ++ if (memcmp (envline, "PREFER_MAP_32BIT_EXEC", 21) == 0) \ ++ GLRO(dl_x86_cpu_features).feature[index_Prefer_MAP_32BIT_EXEC] \ ++ = bit_Prefer_MAP_32BIT_EXEC; \ ++ break; ++ ++/* Extra unsecure variables. The names are all stuffed in a single ++ string which means they have to be terminated with a '\0' explicitly. */ ++#define EXTRA_UNSECURE_ENVVARS \ ++ "LD_PREFER_MAP_32BIT_EXEC\0" ++ ++#endif /* dl-librecon.h */ +Index: glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/mmap.c +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/mmap.c +@@ -0,0 +1,37 @@ ++/* Linux mmap system call. x86-64 version. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public License as ++ published by the Free Software Foundation; either version 2.1 of the ++ License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++/* If the Prefer_MAP_32BIT_EXEC bit is set, try to map executable pages ++ with MAP_32BIT first. */ ++#define MMAP_PREPARE(addr, len, prot, flags, fd, offset) \ ++ if ((addr) == NULL \ ++ && ((prot) & PROT_EXEC) != 0 \ ++ && HAS_ARCH_FEATURE (Prefer_MAP_32BIT_EXEC)) \ ++ { \ ++ __ptr_t ret = (__ptr_t) INLINE_SYSCALL (mmap, 6, (addr), (len), \ ++ (prot), \ ++ (flags) | MAP_32BIT, \ ++ (fd), (offset)); \ ++ if (ret != MAP_FAILED) \ ++ return ret; \ ++ } ++ ++#include +Index: glibc-2.17-c758a686/sysdeps/x86/cpu-features.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86/cpu-features.h ++++ glibc-2.17-c758a686/sysdeps/x86/cpu-features.h +@@ -32,6 +32,7 @@ + #define bit_AVX_Fast_Unaligned_Load (1 << 11) + #define bit_AVX512F_Usable (1 << 12) + #define bit_AVX512DQ_Usable (1 << 13) ++#define bit_Prefer_MAP_32BIT_EXEC (1 << 16) + + /* CPUID Feature flags. */ + +@@ -91,6 +92,7 @@ + # define index_AVX_Fast_Unaligned_Load FEATURE_INDEX_1*FEATURE_SIZE + # define index_AVX512F_Usable FEATURE_INDEX_1*FEATURE_SIZE + # define index_AVX512DQ_Usable FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Prefer_MAP_32BIT_EXEC FEATURE_INDEX_1*FEATURE_SIZE + + # if defined (_LIBC) && !IS_IN (nonlib) + # ifdef __x86_64__ +@@ -267,6 +269,7 @@ extern const struct cpu_features *__get_ + # define index_AVX_Fast_Unaligned_Load FEATURE_INDEX_1 + # define index_AVX512F_Usable FEATURE_INDEX_1 + # define index_AVX512DQ_Usable FEATURE_INDEX_1 ++# define index_Prefer_MAP_32BIT_EXEC FEATURE_INDEX_1 + + #endif /* !__ASSEMBLER__ */ + diff --git a/SOURCES/glibc-rh1292018-7.patch b/SOURCES/glibc-rh1292018-7.patch new file mode 100644 index 0000000..fc87662 --- /dev/null +++ b/SOURCES/glibc-rh1292018-7.patch @@ -0,0 +1,26 @@ +commit a4754272958a8368701bb2a8d6b0c224fe3b4e73 +Author: H.J. Lu +Date: Thu Mar 3 14:51:40 2016 -0800 + + Or bit_Prefer_MAP_32BIT_EXEC in EXTRA_LD_ENVVARS + + We should turn on bit_Prefer_MAP_32BIT_EXEC in EXTRA_LD_ENVVARS without + overriding other bits. + + [BZ #19758] + * sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h + (EXTRA_LD_ENVVARS): Or bit_Prefer_MAP_32BIT_EXEC. + +diff --git a/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h b/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h +index c9db5ea..a759934 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h ++++ b/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h +@@ -33,7 +33,7 @@ + case 21: \ + if (memcmp (envline, "PREFER_MAP_32BIT_EXEC", 21) == 0) \ + GLRO(dl_x86_cpu_features).feature[index_Prefer_MAP_32BIT_EXEC] \ +- = bit_Prefer_MAP_32BIT_EXEC; \ ++ |= bit_Prefer_MAP_32BIT_EXEC; \ + break; + + /* Extra unsecure variables. The names are all stuffed in a single diff --git a/SOURCES/glibc-rh1293433.patch b/SOURCES/glibc-rh1293433.patch new file mode 100644 index 0000000..853e53d --- /dev/null +++ b/SOURCES/glibc-rh1293433.patch @@ -0,0 +1,45 @@ +commit 5a9af6376d43b58c6545feb86002812a57956654 +Author: Florian Weimer +Date: Fri Sep 25 20:20:33 2015 +0200 + + Fix inconsistent passwd compensation in nss/bug17079.c + + It used to be common practice to have a statically linked shell for an + alternative root account, as in: + + root:x:0:0:root:/root:/bin/bash + toor:x:0:0:root recovery account:/root:/sbin/sash + + This causes problems with passwd NSS tests because a UID-based lookup + will only retrieve one of those entries. The original version of + nss/bug17079.c detected this, but failed to use this information later + on. + +diff --git a/nss/bug17079.c b/nss/bug17079.c +index 9846737..0249922 100644 +--- a/nss/bug17079.c ++++ b/nss/bug17079.c +@@ -72,7 +72,11 @@ init_test_items (void) + struct passwd *pwd2 = getpwuid (test_items[i].pw_uid); + if (pwd1 == NULL || !equal (pwd1, test_items + i) + || pwd2 == NULL || !equal (pwd2, test_items + i)) +- test_items[i].pw_name = NULL; ++ { ++ printf ("info: skipping user \"%s\", UID %ld due to inconsistency\n", ++ test_items[i].pw_name, (long) test_items[i].pw_uid); ++ test_items[i].pw_name = NULL; ++ } + else + found = true; + } +@@ -195,6 +199,10 @@ test_buffer_size (size_t buffer_size) + for (int i = 0; i < test_count; ++i) + for (size_t padding_size = 0; padding_size < 3; ++padding_size) + { ++ /* Skip entries with inconsistent name/UID lookups. */ ++ if (test_items[i].pw_name == NULL) ++ continue; ++ + test_one (test_items + i, buffer_size, '\0', padding_size); + if (padding_size > 0) + { diff --git a/SOURCES/glibc-rh1293916.patch b/SOURCES/glibc-rh1293916.patch new file mode 100644 index 0000000..b2ec485 --- /dev/null +++ b/SOURCES/glibc-rh1293916.patch @@ -0,0 +1,195 @@ +--- a/iconvdata/Makefile ++++ b/iconvdata/Makefile +@@ -67,7 +67,8 @@ + + ifeq (yes,$(build-shared)) + tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \ +- tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 ++ tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 \ ++ bug-iconv10 + ifeq ($(have-thread-library),yes) + tests += bug-iconv3 + endif +@@ -286,6 +287,8 @@ + $(addprefix $(objpfx),$(modules.so)) + $(objpfx)bug-iconv5.out: $(objpfx)gconv-modules \ + $(addprefix $(objpfx),$(modules.so)) ++$(objpfx)bug-iconv10.out: $(objpfx)gconv-modules \ ++ $(addprefix $(objpfx),$(modules.so)) + $(objpfx)tst-loading.out: $(objpfx)gconv-modules \ + $(addprefix $(objpfx),$(modules.so)) + $(objpfx)tst-iconv4.out: $(objpfx)gconv-modules \ + +diff --git a/iconvdata/bug-iconv10.c b/iconvdata/bug-iconv10.c +new file mode 100644 +index 0000000..98353a2 +--- /dev/null ++++ b/iconvdata/bug-iconv10.c +@@ -0,0 +1,77 @@ ++/* bug 17197: check for redundant shift character at block boundary. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ iconv_t cd = iconv_open ("IBM930", "UTF-8"); ++ if (cd == (iconv_t) -1) ++ { ++ puts ("iconv_open failed"); ++ return 1; ++ } ++ ++ char instr1[] = "\xc2\xa6."; ++ const char expstr1[4] = "\016Bj\017"; ++ const char expstr2[] = "K"; ++ char outstr[4]; ++ size_t inlen = sizeof (instr1); ++ size_t outlen = sizeof (outstr); ++ char *inptr = instr1; ++ char *outptr = outstr; ++ size_t r = iconv (cd, &inptr, &inlen, &outptr, &outlen); ++ if (r != -1 ++ || errno != E2BIG ++ || inlen != sizeof (instr1) - 2 ++ || inptr != instr1 + 2 ++ || outlen != 0 ++ || memcmp (outstr, expstr1, sizeof (expstr1)) != 0) ++ { ++ puts ("wrong first conversion"); ++ return 1; ++ } ++ ++ outlen = sizeof (outstr); ++ outptr = outstr; ++ r = iconv (cd, &inptr, &inlen, &outptr, &outlen); ++ if (r != 0 ++ || inlen != 0 ++ || outlen != sizeof (outstr) - sizeof (expstr2) ++ || memcmp (outstr, expstr2, sizeof (expstr2)) != 0) ++ { ++ puts ("wrong second conversion"); ++ return 1; ++ } ++ ++ if (iconv_close (cd) != 0) ++ { ++ puts ("iconv_close failed"); ++ return 1; ++ } ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +--- a/iconvdata/ibm930.c 2015-12-01 18:13:56.799658234 -0500 ++++ b/iconvdata/ibm930.c 2015-12-01 18:14:12.729906742 -0500 +@@ -257,6 +257,7 @@ enum + break; \ + } \ + *outptr++ = SI; \ ++ curcs = sb; \ + } \ + \ + if (__builtin_expect (outptr + 1 > outend, 0)) \ +@@ -270,7 +271,6 @@ enum + *outptr++ = 0x5b; \ + else \ + *outptr++ = cp[0]; \ +- curcs = sb; \ + } \ + \ + /* Now that we wrote the output increment the input pointer. */ \ +--- a/iconvdata/ibm933.c 2015-12-01 18:13:56.799658234 -0500 ++++ b/iconvdata/ibm933.c 2015-12-01 18:14:12.729906742 -0500 +@@ -255,6 +255,7 @@ enum + break; \ + } \ + *outptr++ = SI; \ ++ curcs = sb; \ + } \ + \ + if (__builtin_expect (outptr + 1 > outend, 0)) \ +@@ -263,7 +264,6 @@ enum + break; \ + } \ + *outptr++ = cp[0]; \ +- curcs = sb; \ + } \ + \ + /* Now that we wrote the output increment the input pointer. */ \ +--- a/iconvdata/ibm935.c 2015-12-01 18:13:56.799658234 -0500 ++++ b/iconvdata/ibm935.c 2015-12-01 18:14:12.729906742 -0500 +@@ -255,6 +255,7 @@ enum + break; \ + } \ + *outptr++ = SI; \ ++ curcs = sb; \ + } \ + \ + if (__builtin_expect (outptr + 1 > outend, 0)) \ +@@ -263,7 +264,6 @@ enum + break; \ + } \ + *outptr++ = cp[0]; \ +- curcs = sb; \ + } \ + \ + /* Now that we wrote the output increment the input pointer. */ \ +--- a/iconvdata/ibm937.c 2015-12-01 18:13:56.799658234 -0500 ++++ b/iconvdata/ibm937.c 2015-12-01 18:14:12.729906742 -0500 +@@ -255,6 +255,7 @@ enum + break; \ + } \ + *outptr++ = SI; \ ++ curcs = sb; \ + } \ + \ + if (__builtin_expect (outptr + 1 > outend, 0)) \ +@@ -263,7 +264,6 @@ enum + break; \ + } \ + *outptr++ = cp[0]; \ +- curcs = sb; \ + } \ + \ + /* Now that we wrote the output increment the input pointer. */ \ +--- a/iconvdata/ibm939.c 2015-12-01 18:13:56.799658234 -0500 ++++ b/iconvdata/ibm939.c 2015-12-01 18:14:12.739906898 -0500 +@@ -255,6 +255,7 @@ enum + break; \ + } \ + *outptr++ = SI; \ ++ curcs = sb; \ + } \ + \ + if (__builtin_expect (outptr + 1 > outend, 0)) \ +@@ -268,7 +269,6 @@ enum + *outptr++ = 0xb2; \ + else \ + *outptr++ = cp[0]; \ +- curcs = sb; \ + } \ + \ + /* Now that we wrote the output increment the input pointer. */ \ diff --git a/SOURCES/glibc-rh1293976-2.patch b/SOURCES/glibc-rh1293976-2.patch index e5656b7..e4c275a 100644 --- a/SOURCES/glibc-rh1293976-2.patch +++ b/SOURCES/glibc-rh1293976-2.patch @@ -30,42 +30,25 @@ Index: glibc-2.17-c758a686/malloc/Makefile =================================================================== --- glibc-2.17-c758a686.orig/malloc/Makefile +++ glibc-2.17-c758a686/malloc/Makefile -@@ -20,13 +20,16 @@ - # - subdir := malloc - -+include ../Makeconfig -+ - all: - - dist-headers := malloc.h - headers := $(dist-headers) obstack.h mcheck.h +@@ -27,7 +27,8 @@ headers := $(dist-headers) obstack.h mch tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 \ -- tst-malloc-usable tst-malloc-backtrace -+ tst-malloc-usable tst-malloc-backtrace \ + tst-malloc-usable \ +- tst-malloc-backtrace tst-malloc-thread-exit ++ tst-malloc-backtrace tst-malloc-thread-exit \ + tst-malloc-thread-fail test-srcs = tst-mtrace routines = malloc morecore mcheck mtrace obstack -@@ -43,6 +46,8 @@ libmemusage-inhibit-o = $(filter-out .os +@@ -44,6 +45,8 @@ libmemusage-inhibit-o = $(filter-out .os $(objpfx)tst-malloc-backtrace: $(common-objpfx)nptl/libpthread.so \ $(common-objpfx)nptl/libpthread_nonshared.a +$(objpfx)tst-malloc-thread-fail: $(common-objpfx)nptl/libpthread.so \ + $(common-objpfx)nptl/libpthread_nonshared.a + $(objpfx)tst-malloc-thread-exit: $(common-objpfx)nptl/libpthread.so \ + $(common-objpfx)nptl/libpthread_nonshared.a - # These should be removed by `make clean'. - extra-objs = mcheck-init.o libmcheck.a -@@ -50,8 +55,6 @@ extra-objs = mcheck-init.o libmcheck.a - # Include the cleanup handler. - aux := set-freeres thread-freeres - --include ../Makeconfig -- - CPPFLAGS-memusagestat = -DNOT_IN_libc - - # The Perl script to analyze the output of the mtrace functions. Index: glibc-2.17-c758a686/malloc/tst-malloc-thread-fail.c =================================================================== --- /dev/null diff --git a/SOURCES/glibc-rh1296297-1.patch b/SOURCES/glibc-rh1296297-1.patch new file mode 100644 index 0000000..8c827ed --- /dev/null +++ b/SOURCES/glibc-rh1296297-1.patch @@ -0,0 +1,185 @@ +Add --list-archive FILE support to localedef. + +This feature largely supports the integrated work +for InstLang support, and does not explicitly change +any help text or behaviour at the API level for these +routines. The basic purpose is to allow a file name to +propagate to through the internal APIs to be used instead +of the default locale archive. Given that build-locale-archive +links against copies of the internal API it can use these +non-public APIs without problem. + +commit eaa1d42819c1d43f27552dfa55accfcc4ac25d54 +Author: Carlos O'Donell +Date: Mon Feb 24 22:33:35 2014 -0500 + + Fix failure load locale template. + + The call to open_tmpl_archive was being passed a pointer to an + object allocated on the stack. The object on the stack is not + guaranteed to be initialized to zero so we need to minimally + initialize `fname' in the struct locarhandle to ensure that + open_tml_archive loads the default tempalte. + + This error was seen while debugging glibc installs in a qemu + VM where it is more likely the stack pages were dirty. It has + not been reported on non-VM systems. + +commit f6520166f41d58832351d35cfa987ecbb44f5986 +Author: Carlos O'Donell +Date: Fri Oct 18 23:27:45 2013 -0400 + + Allow fill_archive to be called with NULL fname. + + The fill_archive function should support being + called with a NULL fname argument. A NULL fname + argument indicates that the default archive should + be opened. We enable this by setting ah.fname to + NULL before initializing ah or calling open_archive. + This way if fname is NULL then ah.fname remains NULL + and open_archive opens the default archive. + +commit c2021d0b305d436734709186c8c5dca254f77770 +Author: Carlos O'Donell +Date: Thu Oct 3 05:22:51 2013 -0400 + +[snip] + - Support `--list-archive FILE' in localedef utility. + +Index: glibc-2.17-c758a686/locale/locarchive.h +=================================================================== +--- glibc-2.17-c758a686.orig/locale/locarchive.h ++++ glibc-2.17-c758a686/locale/locarchive.h +@@ -80,6 +80,8 @@ struct locrecent + + struct locarhandle + { ++ /* Full path to the locale archive file. */ ++ const char *fname; + int fd; + void *addr; + size_t mmaped; +Index: glibc-2.17-c758a686/locale/programs/localedef.c +=================================================================== +--- glibc-2.17-c758a686.orig/locale/programs/localedef.c ++++ glibc-2.17-c758a686/locale/programs/localedef.c +@@ -202,7 +202,7 @@ main (int argc, char *argv[]) + + /* Handle a few special cases. */ + if (list_archive) +- show_archive_content (verbose); ++ show_archive_content (remaining > 1 ? argv[remaining] : NULL, verbose); + if (add_to_archive) + return add_locales_to_archive (argc - remaining, &argv[remaining], + replace_archive); +Index: glibc-2.17-c758a686/locale/programs/localedef.h +=================================================================== +--- glibc-2.17-c758a686.orig/locale/programs/localedef.h ++++ glibc-2.17-c758a686/locale/programs/localedef.h +@@ -176,7 +176,8 @@ extern int add_locales_to_archive (size_ + /* Removed named locales from archive. */ + extern int delete_locales_from_archive (size_t nlist, char *list[]); + +-/* List content of locale archive. */ +-extern void show_archive_content (int verbose) __attribute__ ((noreturn)); ++/* List content of locale archive. If FNAME is non-null use that as ++ the locale archive to list, otherwise the default. */ ++extern void show_archive_content (char *fname, int verbose) __attribute__ ((noreturn)); + + #endif /* localedef.h */ +Index: glibc-2.17-c758a686/locale/programs/locarchive.c +=================================================================== +--- glibc-2.17-c758a686.orig/locale/programs/locarchive.c ++++ glibc-2.17-c758a686/locale/programs/locarchive.c +@@ -197,6 +197,7 @@ create_archive (const char *archivefname + _("cannot change mode of new locale archive")); + } + ++ ah->fname = NULL; + ah->fd = fd; + ah->addr = p; + ah->mmaped = total; +@@ -519,11 +520,19 @@ open_archive (struct locarhandle *ah, bo + struct locarhead head; + int retry = 0; + size_t prefix_len = output_prefix ? strlen (output_prefix) : 0; +- char archivefname[prefix_len + sizeof (ARCHIVE_NAME)]; +- +- if (output_prefix) +- memcpy (archivefname, output_prefix, prefix_len); +- strcpy (archivefname + prefix_len, ARCHIVE_NAME); ++ char fname[prefix_len + sizeof (ARCHIVE_NAME)]; ++ char *archivefname = ah->fname; ++ bool defaultfname = false; ++ ++ /* If ah has a non-NULL fname open that otherwise open the default. */ ++ if (archivefname == NULL) ++ { ++ defaultfname = true; ++ archivefname = fname; ++ if (output_prefix) ++ memcpy (archivefname, output_prefix, prefix_len); ++ strcpy (archivefname + prefix_len, ARCHIVE_NAME); ++ } + + while (1) + { +@@ -531,8 +540,11 @@ open_archive (struct locarhandle *ah, bo + fd = open64 (archivefname, readonly ? O_RDONLY : O_RDWR); + if (fd == -1) + { +- /* Maybe the file does not yet exist. */ +- if (errno == ENOENT) ++ /* Maybe the file does not yet exist? If we are opening ++ the default locale archive we ignore the failure and ++ list an empty archive, otherwise we print an error ++ and exit. */ ++ if (errno == ENOENT && defaultfname) + { + if (readonly) + { +@@ -1258,6 +1270,7 @@ add_locales_to_archive (nlist, list, rep + + /* Open the archive. This call never returns if we cannot + successfully open the archive. */ ++ ah.fname = NULL; + open_archive (&ah, false); + + while (nlist-- > 0) +@@ -1457,6 +1470,7 @@ delete_locales_from_archive (nlist, list + + /* Open the archive. This call never returns if we cannot + successfully open the archive. */ ++ ah.fname = NULL; + open_archive (&ah, false); + + head = ah.addr; +@@ -1545,7 +1559,7 @@ dataentcmp (const void *a, const void *b + + + void +-show_archive_content (int verbose) ++show_archive_content (char *fname, int verbose) + { + struct locarhandle ah; + struct locarhead *head; +@@ -1555,6 +1569,7 @@ show_archive_content (int verbose) + + /* Open the archive. This call never returns if we cannot + successfully open the archive. */ ++ ah.fname = fname; + open_archive (&ah, true); + + head = ah.addr; +Index: glibc-2.17-c758a686/locale/programs/locfile.c +=================================================================== +--- glibc-2.17-c758a686.orig/locale/programs/locfile.c ++++ glibc-2.17-c758a686/locale/programs/locfile.c +@@ -337,6 +337,7 @@ write_all_categories (struct localedef_t + + /* Open the archive. This call never returns if we cannot + successfully open the archive. */ ++ ah.fname = NULL; + open_archive (&ah, false); + + if (add_locale_to_archive (&ah, locname, to_archive, true) != 0) diff --git a/SOURCES/glibc-rh1296297.patch b/SOURCES/glibc-rh1296297.patch new file mode 100644 index 0000000..875e760 --- /dev/null +++ b/SOURCES/glibc-rh1296297.patch @@ -0,0 +1,356 @@ +Adds --install-langs support build-locale-archive. + +commit 0457f649e3fe6299efe384da13dfc923bbe65707 +Author: Carlos O'Donell +Date: Thu Sep 17 12:24:49 2015 -0400 + +[snip] + - Fix --install-langs bug which causes SIGABRT (#1262040). + +commit 91764bd9ec690d4b8a886c0a3a104aac12d340d2 +Author: Carlos O'Donell +Date: Thu Mar 5 16:05:43 2015 -0500 + + Resolves: #156477 + + - Support installing only those locales specified by the RPM macro + %%_install_langs (#156477). + +Index: glibc-2.17-c758a686/releng/build-locale-archive.c +=================================================================== +--- glibc-2.17-c758a686.orig/releng/build-locale-archive.c ++++ glibc-2.17-c758a686/releng/build-locale-archive.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -21,6 +22,7 @@ const char *alias_file = DATADIR "/local + const char *locar_file = PREFIX "/lib/locale/locale-archive"; + const char *tmpl_file = PREFIX "/lib/locale/locale-archive.tmpl"; + const char *loc_path = PREFIX "/lib/locale/"; ++/* Flags set by `--verbose` option. */ + int be_quiet = 1; + int verbose = 0; + int max_locarchive_open_retry = 10; +@@ -96,7 +98,7 @@ open_tmpl_archive (struct locarhandle *a + struct stat64 st; + int fd; + struct locarhead head; +- const char *archivefname = tmpl_file; ++ const char *archivefname = ah->fname == NULL ? tmpl_file : ah->fname; + + /* Open the archive. We must have exclusive write access. */ + fd = open64 (archivefname, O_RDONLY); +@@ -116,7 +118,7 @@ open_tmpl_archive (struct locarhandle *a + ah->mmaped = (head.sumhash_offset + + head.sumhash_size * sizeof (struct sumhashent)); + if (ah->mmaped > (unsigned long) st.st_size) +- error (EXIT_FAILURE, 0, "locale archite template file truncated"); ++ error (EXIT_FAILURE, 0, "locale archive template file truncated"); + ah->mmaped = st.st_size; + ah->reserved = st.st_size; + +@@ -250,7 +252,10 @@ compute_data (struct locarhandle *ah, st + } + + static int +-fill_archive (struct locarhandle *tmpl_ah, size_t nlist, char *list[], ++fill_archive (struct locarhandle *tmpl_ah, ++ const char *fname, ++ size_t install_langs_count, char *install_langs_list[], ++ size_t nlist, char *list[], + const char *primary) + { + struct locarhandle ah; +@@ -281,11 +286,40 @@ fill_archive (struct locarhandle *tmpl_a + for (cnt = used = 0; cnt < head->namehash_size; ++cnt) + if (namehashtab[cnt].locrec_offset != 0) + { ++ char * name; ++ int i; + assert (used < head->namehash_used); +- names[used].name = tmpl_ah->addr + namehashtab[cnt].name_offset; +- names[used++].locrec +- = (struct locrecent *) ((char *) tmpl_ah->addr + +- namehashtab[cnt].locrec_offset); ++ name = tmpl_ah->addr + namehashtab[cnt].name_offset; ++ if (install_langs_count == 0) ++ { ++ /* Always intstall the entry. */ ++ names[used].name = name; ++ names[used++].locrec ++ = (struct locrecent *) ((char *) tmpl_ah->addr + ++ namehashtab[cnt].locrec_offset); ++ } ++ else ++ { ++ /* Only install the entry if the user asked for it via ++ --install-langs. */ ++ for (i = 0; i < install_langs_count; i++) ++ { ++ /* Add one for "_" and one for the null terminator. */ ++ size_t len = strlen (install_langs_list[i]) + 2; ++ char *install_lang = (char *)xmalloc (len); ++ strcpy (install_lang, install_langs_list[i]); ++ if (strchr (install_lang, '_') == NULL) ++ strcat (install_lang, "_"); ++ if (strncmp (name, install_lang, strlen (install_lang)) == 0) ++ { ++ names[used].name = name; ++ names[used++].locrec ++ = (struct locrecent *) ((char *)tmpl_ah->addr ++ + namehashtab[cnt].locrec_offset); ++ } ++ free (install_lang); ++ } ++ } + } + + /* Sort the names. */ +@@ -304,6 +338,9 @@ fill_archive (struct locarhandle *tmpl_a + + /* Open the archive. This call never returns if we cannot + successfully open the archive. */ ++ ah.fname = NULL; ++ if (fname != NULL) ++ ah.fname = fname; + open_archive (&ah, false); + + if (primary != NULL) +@@ -532,24 +569,197 @@ fill_archive (struct locarhandle *tmpl_a + return result; + } + +-int main () ++void usage() ++{ ++ printf ("\ ++Usage: build-locale-archive [OPTION]... [TEMPLATE-FILE] [ARCHIVE-FILE]\n\ ++ Builds a locale archive from a template file.\n\ ++ Options:\n\ ++ -h, --help Print this usage message.\n\ ++ -v, --verbose Verbose execution.\n\ ++ -l, --install-langs=LIST Only include locales given in LIST into the \n\ ++ locale archive. LIST is a colon separated list\n\ ++ of locale prefixes, for example \"de:en:ja\".\n\ ++ The special argument \"all\" means to install\n\ ++ all languages and it must be present by itself.\n\ ++ If \"all\" is present with any other language it\n\ ++ will be treated as the name of a locale.\n\ ++ If the --install-langs option is missing, all\n\ ++ locales are installed. The colon separated list\n\ ++ can contain any strings matching the beginning of\n\ ++ locale names.\n\ ++ If a string does not contain a \"_\", it is added.\n\ ++ Examples:\n\ ++ --install-langs=\"en\"\n\ ++ installs en_US, en_US.iso88591,\n\ ++ en_US.iso885915, en_US.utf8,\n\ ++ en_GB ...\n\ ++ --install-langs=\"en_US.utf8\"\n\ ++ installs only en_US.utf8.\n\ ++ --install-langs=\"ko\"\n\ ++ installs ko_KR, ko_KR.euckr,\n\ ++ ko_KR.utf8 but *not* kok_IN\n\ ++ because \"ko\" does not contain\n\ ++ \"_\" and it is silently added\n\ ++ --install-langs\"ko:kok\"\n\ ++ installs ko_KR, ko_KR.euckr,\n\ ++ ko_KR.utf8, kok_IN, and\n\ ++ kok_IN.utf8.\n\ ++ --install-langs=\"POSIX\" will\n\ ++ installs *no* locales at all\n\ ++ because POSIX matches none of\n\ ++ the locales. Actually, any string\n\ ++ matching nothing will do that.\n\ ++ POSIX and C will always be\n\ ++ available because they are\n\ ++ builtin.\n\ ++ Aliases are installed as well,\n\ ++ i.e. --install-langs=\"de\"\n\ ++ will install not only every locale starting with\n\ ++ \"de\" but also the aliases \"deutsch\"\n\ ++ and and \"german\" although the latter does not\n\ ++ start with \"de\".\n\ ++\n\ ++ If the arguments TEMPLATE-FILE and ARCHIVE-FILE are not given the locations\n\ ++ where the glibc used expects these files are used by default.\n\ ++"); ++} ++ ++int main (int argc, char *argv[]) + { + char path[4096]; + DIR *dirp; + struct dirent64 *d; + struct stat64 st; + char *list[16384], *primary; ++ char *lang; ++ int install_langs_count = 0; ++ int i; ++ char *install_langs_arg, *ila_start; ++ char **install_langs_list; + unsigned int cnt = 0; + struct locarhandle tmpl_ah; ++ char *new_locar_fname = NULL; + size_t loc_path_len = strlen (loc_path); + ++ while (1) ++ { ++ int c; ++ ++ static struct option long_options[] = ++ { ++ {"help", no_argument, 0, 'h'}, ++ {"verbose", no_argument, 0, 'v'}, ++ {"install-langs", required_argument, 0, 'l'}, ++ {0, 0, 0, 0} ++ }; ++ /* getopt_long stores the option index here. */ ++ int option_index = 0; ++ ++ c = getopt_long (argc, argv, "vhl:", ++ long_options, &option_index); ++ ++ /* Detect the end of the options. */ ++ if (c == -1) ++ break; ++ ++ switch (c) ++ { ++ case 0: ++ printf ("unknown option %s", long_options[option_index].name); ++ if (optarg) ++ printf (" with arg %s", optarg); ++ printf ("\n"); ++ usage (); ++ exit (1); ++ ++ case 'v': ++ verbose = 1; ++ be_quiet = 0; ++ break; ++ ++ case 'h': ++ usage (); ++ exit (0); ++ ++ case 'l': ++ install_langs_arg = ila_start = strdup (optarg); ++ /* If the argument to --install-lang is "all", do ++ not limit the list of languages to install and install ++ them all. We do not support installing a single locale ++ called "all". */ ++#define MAGIC_INSTALL_ALL "all" ++ if (install_langs_arg != NULL ++ && install_langs_arg[0] != '\0' ++ && !(strncmp(install_langs_arg, MAGIC_INSTALL_ALL, ++ strlen(MAGIC_INSTALL_ALL)) == 0 ++ && strlen (install_langs_arg) == 3)) ++ { ++ /* Count the number of languages we will install. */ ++ while (true) ++ { ++ lang = strtok(install_langs_arg, ":;,"); ++ if (lang == NULL) ++ break; ++ install_langs_count++; ++ install_langs_arg = NULL; ++ } ++ free (ila_start); ++ /* Copy the list. */ ++ install_langs_list = (char **)xmalloc (sizeof(char *) * install_langs_count); ++ install_langs_arg = ila_start = strdup (optarg); ++ install_langs_count = 0; ++ while (true) ++ { ++ lang = strtok(install_langs_arg, ":;,"); ++ if (lang == NULL) ++ break; ++ install_langs_list[install_langs_count] = lang; ++ install_langs_count++; ++ install_langs_arg = NULL; ++ } ++ } ++ break; ++ ++ case '?': ++ /* getopt_long already printed an error message. */ ++ usage (); ++ exit (0); ++ ++ default: ++ abort (); ++ } ++ } ++ tmpl_ah.fname = NULL; ++ if (optind < argc) ++ tmpl_ah.fname = argv[optind]; ++ if (optind + 1 < argc) ++ new_locar_fname = argv[optind + 1]; ++ if (verbose) ++ { ++ if (tmpl_ah.fname) ++ printf("input archive file specified on command line: %s\n", ++ tmpl_ah.fname); ++ else ++ printf("using default input archive file.\n"); ++ if (new_locar_fname) ++ printf("output archive file specified on command line: %s\n", ++ new_locar_fname); ++ else ++ printf("using default output archive file.\n"); ++ } ++ + dirp = opendir (loc_path); + if (dirp == NULL) + error (EXIT_FAILURE, errno, "cannot open directory \"%s\"", loc_path); + + open_tmpl_archive (&tmpl_ah); + +- unlink (locar_file); ++ if (new_locar_fname) ++ unlink (new_locar_fname); ++ else ++ unlink (locar_file); ++ + primary = getenv ("LC_ALL"); + if (primary == NULL) + primary = getenv ("LANG"); +@@ -560,7 +770,8 @@ int main () + && strncmp (primary, "zh", 2) != 0) + { + char *ptr = malloc (strlen (primary) + strlen (".utf8") + 1), *p, *q; +- ++ /* This leads to invalid locales sometimes: ++ de_DE.iso885915@euro -> de_DE.utf8@euro */ + if (ptr != NULL) + { + p = ptr; +@@ -623,10 +834,19 @@ int main () + cnt++; + } + closedir (dirp); +- fill_archive (&tmpl_ah, cnt, list, primary); ++ /* Store the archive to the file specified as the second argument on the ++ command line or the default locale archive. */ ++ fill_archive (&tmpl_ah, new_locar_fname, ++ install_langs_count, install_langs_list, ++ cnt, list, primary); + close_archive (&tmpl_ah); + truncate (tmpl_file, 0); +- char *argv[] = { "/usr/sbin/tzdata-update", NULL }; +- execve (argv[0], (char *const *)argv, (char *const *)&argv[1]); ++ if (install_langs_count > 0) ++ { ++ free (ila_start); ++ free (install_langs_list); ++ } ++ char *tz_argv[] = { "/usr/sbin/tzdata-update", NULL }; ++ execve (tz_argv[0], (char *const *)tz_argv, (char *const *)&tz_argv[1]); + exit (0); + } diff --git a/SOURCES/glibc-rh1298349.patch b/SOURCES/glibc-rh1298349.patch new file mode 100644 index 0000000..863c215 --- /dev/null +++ b/SOURCES/glibc-rh1298349.patch @@ -0,0 +1,239 @@ +commit 0897c551c0a098020f145885de06a5c10e5cc96b +Author: Carlos O'Donell +Date: Wed Jan 21 10:08:18 2015 -0500 + + tst-getpw: Rewrite. + + The test is rewritten to look for the testable conditions and + exit once they are all detected. This prevents the test from + iterating over 2000 UIDs and looking up each one. It speeds up + the test and prevents it from failing if the system under test + has an NSS-based passwd that is slower than the test timeout. + + See: + https://sourceware.org/ml/libc-alpha/2015-01/msg00394.html + +diff --git a/pwd/tst-getpw.c b/pwd/tst-getpw.c +index 059c9e0..e3e101b 100644 +--- a/pwd/tst-getpw.c ++++ b/pwd/tst-getpw.c +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1999-2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -15,26 +15,100 @@ + License along with the GNU C Library; if not, see + . */ + ++#include + #include ++#include ++#include ++ ++/* We want to test getpw by calling it with a uid that does ++ exist and one that doesn't exist. We track if we've met those ++ conditions and exit. We also track if we've failed due to lack ++ of memory. That constitutes all of the standard failure cases. */ ++bool seen_hit; ++bool seen_miss; ++bool seen_oom; ++ ++/* How many errors we've had while running the test. */ ++int errors; + + static void + check (uid_t uid) + { ++ int ret; + char buf[1024]; + +- (void) getpw (uid, buf); ++ ret = getpw (uid, buf); ++ ++ /* Successfully read a password line. */ ++ if (ret == 0 && !seen_hit) ++ { ++ printf ("PASS: Read a password line given a uid.\n"); ++ seen_hit = true; ++ } ++ ++ /* Failed to read a password line. Why? */ ++ if (ret == -1) ++ { ++ /* No entry? Technically the errno could be any number ++ of values including ESRCH, EBADP or EPERM depending ++ on the quality of the nss module that implements the ++ underlying lookup. It should be 0 for getpw.*/ ++ if (errno == 0 && !seen_miss) ++ { ++ printf ("PASS: Found an invalid uid.\n"); ++ seen_miss = true; ++ return; ++ } ++ ++ /* Out of memory? */ ++ if (errno == ENOMEM && !seen_oom) ++ { ++ printf ("FAIL: Failed with ENOMEM.\n"); ++ seen_oom = true; ++ errors++; ++ } ++ ++ /* We don't expect any other values for errno. */ ++ if (errno != ENOMEM && errno != 0) ++ errors++; ++ } + } + +-int +-main (void) ++static int ++do_test (void) + { ++ int ret; + uid_t uid; + +- /* Just call it a different number of times the range should be +- large enough to find some existing and some non existing uids. */ ++ /* Should return -1 and set errnot to EINVAL. */ ++ ret = getpw (0, NULL); ++ if (ret == -1 && errno == EINVAL) ++ { ++ printf ("PASS: NULL buffer returns -1 and sets errno to EINVAL.\n"); ++ } ++ else ++ { ++ printf ("FAIL: NULL buffer did not return -1 or set errno to EINVAL.\n"); ++ errors++; ++ } ++ ++ /* Look for one matching uid, one non-found uid and then stop. ++ Set an upper limit at the 16-bit UID mark; no need to go farther. */ ++ for (uid = 0; uid < ((uid_t) 65535); ++uid) ++ { ++ check (uid); ++ if (seen_miss && seen_hit) ++ break; ++ } + +- for (uid = 0; uid < 2000; ++uid) +- check (uid); ++ if (!seen_hit) ++ printf ("FAIL: Did not read even one password line given a uid.\n"); + +- return 0; ++ if (!seen_miss) ++ printf ("FAIL: Did not find even one invalid uid.\n"); ++ ++ return errors; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" + License along with the GNU C Library; if not, see + . */ + ++#include + #include ++#include ++#include ++ ++/* We want to test getpw by calling it with a uid that does ++ exist and one that doesn't exist. We track if we've met those ++ conditions and exit. We also track if we've failed due to lack ++ of memory. That constitutes all of the standard failure cases. */ ++bool seen_hit; ++bool seen_miss; ++bool seen_oom; ++ ++/* How many errors we've had while running the test. */ ++int errors; + + static void + check (uid_t uid) + { ++ int ret; + char buf[1024]; + +- (void) getpw (uid, buf); ++ ret = getpw (uid, buf); ++ ++ /* Successfully read a password line. */ ++ if (ret == 0 && !seen_hit) ++ { ++ printf ("PASS: Read a password line given a uid.\n"); ++ seen_hit = true; ++ } ++ ++ /* Failed to read a password line. Why? */ ++ if (ret == -1) ++ { ++ /* No entry? Technically the errno could be any number ++ of values including ESRCH, EBADP or EPERM depending ++ on the quality of the nss module that implements the ++ underlying lookup. It should be 0 for getpw.*/ ++ if (errno == 0 && !seen_miss) ++ { ++ printf ("PASS: Found an invalid uid.\n"); ++ seen_miss = true; ++ return; ++ } ++ ++ /* Out of memory? */ ++ if (errno == ENOMEM && !seen_oom) ++ { ++ printf ("FAIL: Failed with ENOMEM.\n"); ++ seen_oom = true; ++ errors++; ++ } ++ ++ /* We don't expect any other values for errno. */ ++ if (errno != ENOMEM && errno != 0) ++ errors++; ++ } + } + + static int + do_test (void) + { ++ int ret; + uid_t uid; + +- /* Just call it a different number of times the range should be +- large enough to find some existing and some non existing uids. */ ++ /* Should return -1 and set errnot to EINVAL. */ ++ ret = getpw (0, NULL); ++ if (ret == -1 && errno == EINVAL) ++ { ++ printf ("PASS: NULL buffer returns -1 and sets errno to EINVAL.\n"); ++ } ++ else ++ { ++ printf ("FAIL: NULL buffer did not return -1 or set errno to EINVAL.\n"); ++ errors++; ++ } ++ ++ /* Look for one matching uid, one non-found uid and then stop. ++ Set an upper limit at the 16-bit UID mark; no need to go farther. */ ++ for (uid = 0; uid < ((uid_t) 65535); ++uid) ++ { ++ check (uid); ++ if (seen_miss && seen_hit) ++ break; ++ } ++ ++ if (!seen_hit) ++ printf ("FAIL: Did not read even one password line given a uid.\n"); + +- for (uid = 0; uid < 2000; ++uid) +- check (uid); ++ if (!seen_miss) ++ printf ("FAIL: Did not find even one invalid uid.\n"); + +- return 0; ++ return errors; + } + + #define TEST_FUNCTION do_test () diff --git a/SOURCES/glibc-rh1298354.patch b/SOURCES/glibc-rh1298354.patch new file mode 100644 index 0000000..c6e66f8 --- /dev/null +++ b/SOURCES/glibc-rh1298354.patch @@ -0,0 +1,2805 @@ +commit 29955b5d9658b02d3a678d1f785db3d1e63184ca +Author: Arjun Shankar +Date: Wed Nov 5 15:24:08 2014 +0530 + + Modify several tests to use test-skeleton.c + + This patch modifies several test cases to use test-skeleton.c. + It was generated by a bash script written for this purpose and + thus excludes several other tests which I deemed worth a visual + inspection before making the change. + + I intend to follow up with individual patches to the tests + skipped by the script. + + The script itself resides at http://git.io/WODAmg and should + reproduce this very patch when run against master. + + ChangeLog: + + 2014-10-30 Arjun Shankar + + * catgets/test-gencat.c: Use test-skeleton.c. + * catgets/tst-catgets.c: Likewise. + * csu/tst-empty.c: Likewise. + * elf/tst-audit2.c: Likewise. + * elf/tst-global1.c: Likewise. + * elf/tst-pathopt.c: Likewise. + * elf/tst-piemod1.c: Likewise. + * elf/tst-tls10.c: Likewise. + * elf/tst-tls11.c: Likewise. + * elf/tst-tls12.c: Likewise. + * gnulib/tst-gcc.c: Likewise. + * iconvdata/tst-e2big.c: Likewise. + * iconvdata/tst-loading.c: Likewise. + * iconv/tst-iconv1.c: Likewise. + * iconv/tst-iconv2.c: Likewise. + * inet/test-inet6_opt.c: Likewise. + * inet/tst-gethnm.c: Likewise. + * inet/tst-network.c: Likewise. + * inet/tst-ntoa.c: Likewise. + * intl/tst-codeset.c: Likewise. + * intl/tst-gettext2.c: Likewise. + * intl/tst-gettext3.c: Likewise. + * intl/tst-ngettext.c: Likewise. + * intl/tst-translit.c: Likewise. + * io/test-stat.c: Likewise. + * libio/test-fmemopen.c: Likewise. + * libio/tst-freopen.c: Likewise. + * libio/tst-sscanf.c: Likewise. + * libio/tst-ungetwc1.c: Likewise. + * libio/tst-ungetwc2.c: Likewise. + * libio/tst-widetext.c: Likewise. + * localedata/tst-ctype.c: Likewise. + * localedata/tst-digits.c: Likewise. + * localedata/tst-leaks.c: Likewise. + * localedata/tst-mbswcs1.c: Likewise. + * localedata/tst-mbswcs2.c: Likewise. + * localedata/tst-mbswcs3.c: Likewise. + * localedata/tst-mbswcs4.c: Likewise. + * localedata/tst-mbswcs5.c: Likewise. + * localedata/tst-setlocale.c: Likewise. + * localedata/tst-trans.c: Likewise. + * localedata/tst-wctype.c: Likewise. + * localedata/tst-xlocale1.c: Likewise. + * login/tst-grantpt.c: Likewise. + * malloc/tst-calloc.c: Likewise. + * malloc/tst-malloc.c: Likewise. + * malloc/tst-mallocstate.c: Likewise. + * malloc/tst-mcheck.c: Likewise. + * malloc/tst-mtrace.c: Likewise. + * malloc/tst-obstack.c: Likewise. + * math/atest-exp2.c: Likewise. + * math/atest-exp.c: Likewise. + * math/atest-sincos.c: Likewise. + * math/test-matherr.c: Likewise. + * math/test-misc.c: Likewise. + * math/test-powl.c: Likewise. + * math/tst-definitions.c: Likewise. + * misc/tst-dirname.c: Likewise. + * misc/tst-efgcvt.c: Likewise. + * misc/tst-fdset.c: Likewise. + * misc/tst-hsearch.c: Likewise. + * misc/tst-mntent2.c: Likewise. + * nptl/tst-sem7.c: Likewise. + * nptl/tst-sem8.c: Likewise. + * nptl/tst-sem9.c: Likewise. + * nss/test-netdb.c: Likewise. + * posix/tst-fnmatch.c: Likewise. + * posix/tst-getlogin.c: Likewise. + * posix/tst-gnuglob.c: Likewise. + * posix/tst-mmap.c: Likewise. + * resolv/tst-inet_ntop.c: Likewise. + * rt/tst-timer.c: Likewise. + * stdio-common/test-fseek.c: Likewise. + * stdio-common/test-popen.c: Likewise. + * stdio-common/test-vfprintf.c: Likewise. + * stdio-common/tst-cookie.c: Likewise. + * stdio-common/tst-fileno.c: Likewise. + * stdio-common/tst-gets.c: Likewise. + * stdio-common/tst-obprintf.c: Likewise. + * stdio-common/tst-perror.c: Likewise. + * stdio-common/tst-sprintf2.c: Likewise. + * stdio-common/tst-sprintf3.c: Likewise. + * stdio-common/tst-sprintf.c: Likewise. + * stdio-common/tst-swprintf.c: Likewise. + * stdio-common/tst-tmpnam.c: Likewise. + * stdio-common/tst-unbputc.c: Likewise. + * stdio-common/tst-wc-printf.c: Likewise. + * stdlib/tst-environ.c: Likewise. + * stdlib/tst-fmtmsg.c: Likewise. + * stdlib/tst-limits.c: Likewise. + * stdlib/tst-rand48-2.c: Likewise. + * stdlib/tst-rand48.c: Likewise. + * stdlib/tst-random2.c: Likewise. + * stdlib/tst-random.c: Likewise. + * stdlib/tst-strtol.c: Likewise. + * stdlib/tst-strtoll.c: Likewise. + * stdlib/tst-xpg-basename.c: Likewise. + * string/test-ffs.c: Likewise. + * string/tst-bswap.c: Likewise. + * string/tst-inlcall.c: Likewise. + * string/tst-strtok.c: Likewise. + * string/tst-strxfrm.c: Likewise. + * sysdeps/x86_64/tst-audit10.c: Likewise. + * elf/tst-audit3.c: Likewise. + * elf/tst-audit4.c: Likewise. + * elf/tst-audit5.c: Likewise. + * time/tst-ftime_l.c: Likewise. + * time/tst-getdate.c: Likewise. + * time/tst-mktime3.c: Likewise. + * time/tst-mktime.c: Likewise. + * time/tst-posixtz.c: Likewise. + * time/tst-strptime2.c: Likewise. + * time/tst-strptime3.c: Likewise. + * wcsmbs/tst-btowc.c: Likewise. + * wcsmbs/tst-mbrtowc.c: Likewise. + * wcsmbs/tst-mbsrtowcs.c: Likewise. + * wcsmbs/tst-wchar-h.c: Likewise. + * wcsmbs/tst-wcpncpy.c: Likewise. + * wcsmbs/tst-wcrtomb.c: Likewise. + * wcsmbs/tst-wcsnlen.c: Likewise. + * wcsmbs/tst-wcstof.c: Likewise. + +diff --git a/catgets/test-gencat.c b/catgets/test-gencat.c +index eaa9b89..282974c 100644 +--- a/catgets/test-gencat.c ++++ b/catgets/test-gencat.c +@@ -3,8 +3,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + nl_catd catalog; + setlocale (LC_ALL, ""); +@@ -29,3 +29,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/catgets/tst-catgets.c b/catgets/tst-catgets.c +index fdaa834..a0a4089 100644 +--- a/catgets/tst-catgets.c ++++ b/catgets/tst-catgets.c +@@ -14,8 +14,8 @@ static const char *msgs[] = + + #define ROUNDS 5 + +-int +-main (void) ++static int ++do_test (void) + { + int rnd; + int result = 0; +@@ -64,3 +64,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/csu/tst-empty.c b/csu/tst-empty.c +index 980dcd6..e99468e 100644 +--- a/csu/tst-empty.c ++++ b/csu/tst-empty.c +@@ -1,6 +1,9 @@ + /* The most useful C program known to man. */ +-int +-main (void) ++static int ++do_test (void) + { + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/elf/tst-audit2.c b/elf/tst-audit2.c +index b4fa906..acad1b0 100644 +--- a/elf/tst-audit2.c ++++ b/elf/tst-audit2.c +@@ -31,8 +31,8 @@ calloc (size_t n, size_t m) + return ptr; + } + +-int +-main (void) ++static int ++do_test (void) + { + if (magic[1] != MAGIC1 || magic[0] != MAGIC2) + { +@@ -42,3 +42,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/elf/tst-global1.c b/elf/tst-global1.c +index 1611b51..4df335c 100644 +--- a/elf/tst-global1.c ++++ b/elf/tst-global1.c +@@ -1,8 +1,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + void *h1 = dlopen ("$ORIGIN/testobj6.so", RTLD_GLOBAL|RTLD_LAZY); + if (h1 == NULL) +@@ -34,3 +34,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/elf/tst-pathopt.c b/elf/tst-pathopt.c +index 1f7aac2..8d73ad4 100644 +--- a/elf/tst-pathopt.c ++++ b/elf/tst-pathopt.c +@@ -4,8 +4,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + void *h; + int (*fp) (int); +@@ -37,3 +37,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/elf/tst-piemod1.c b/elf/tst-piemod1.c +index ad439da..6e98b5f 100644 +--- a/elf/tst-piemod1.c ++++ b/elf/tst-piemod1.c +@@ -6,8 +6,8 @@ foo (void) + return 21; + } + +-int +-main (void) ++static int ++do_test (void) + { + int val = foo (); + if (val != 34) +@@ -18,3 +18,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/elf/tst-tls10.c b/elf/tst-tls10.c +index 347243f..eb1ecb9 100644 +--- a/elf/tst-tls10.c ++++ b/elf/tst-tls10.c +@@ -8,8 +8,8 @@ __thread struct A local = { 1, 2, 3 }; + if (p->a != S || p->b != S + 1 || p->c != S + 2) \ + abort () + +-int +-main (void) ++static int ++do_test (void) + { + struct A *p; + if (local.a != 1 || local.b != 2 || local.c != 3) +@@ -35,3 +35,6 @@ main (void) + + exit (0); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/elf/tst-tls11.c b/elf/tst-tls11.c +index 8a2fef4..8ceac14 100644 +--- a/elf/tst-tls11.c ++++ b/elf/tst-tls11.c +@@ -5,8 +5,8 @@ + if (p->a != S || p->b != S + 1 || p->c != S + 2) \ + abort () + +-int +-main (void) ++static int ++do_test (void) + { + struct A *p; + check1 (); +@@ -24,3 +24,6 @@ main (void) + + exit (0); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/elf/tst-tls12.c b/elf/tst-tls12.c +index 9086d17..8093894 100644 +--- a/elf/tst-tls12.c ++++ b/elf/tst-tls12.c +@@ -5,8 +5,8 @@ + if (p->a != S || p->b != S + 1 || p->c != S + 2) \ + abort () + +-int +-main (void) ++static int ++do_test (void) + { + struct A *p; + check1 (); +@@ -15,3 +15,6 @@ main (void) + + exit (0); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/gnulib/tst-gcc.c b/gnulib/tst-gcc.c +index 71fab28..9f4ba83 100644 +--- a/gnulib/tst-gcc.c ++++ b/gnulib/tst-gcc.c +@@ -51,8 +51,8 @@ + }) + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + int __integer_type; +@@ -71,3 +71,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/iconv/tst-iconv1.c b/iconv/tst-iconv1.c +index d806ce6..0609f50 100644 +--- a/iconv/tst-iconv1.c ++++ b/iconv/tst-iconv1.c +@@ -5,8 +5,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char utf8[5]; + wchar_t ucs4[5]; +@@ -42,3 +42,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/iconv/tst-iconv2.c b/iconv/tst-iconv2.c +index 5036ad1..0672a51 100644 +--- a/iconv/tst-iconv2.c ++++ b/iconv/tst-iconv2.c +@@ -25,8 +25,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + char buf[3]; + const wchar_t wc[1] = L"a"; +@@ -97,3 +97,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/iconvdata/tst-e2big.c b/iconvdata/tst-e2big.c +index 9533eb0..8de64b2 100644 +--- a/iconvdata/tst-e2big.c ++++ b/iconvdata/tst-e2big.c +@@ -95,10 +95,13 @@ test_tscii (void) + test ("TSCII", inbuf, sizeof (inbuf), 9); + } + +-int +-main (void) ++static int ++do_test (void) + { + test_euc_jisx0213 (); + test_tscii (); + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/iconvdata/tst-loading.c b/iconvdata/tst-loading.c +index 0d8a959..eff9d78 100644 +--- a/iconvdata/tst-loading.c ++++ b/iconvdata/tst-loading.c +@@ -114,8 +114,8 @@ static const char inbuf[] = + " function. Later modifications of the variable have no effect.\n"; + + +-int +-main (void) ++static int ++do_test (void) + { + size_t count = TEST_ROUNDS; + int result = 0; +@@ -180,3 +180,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/inet/test-inet6_opt.c b/inet/test-inet6_opt.c +index 3bf319e..a7ebf00 100644 +--- a/inet/test-inet6_opt.c ++++ b/inet/test-inet6_opt.c +@@ -194,8 +194,8 @@ decode_inet6_opt (void *eb, socklen_t el) + return ret; + } + +-int +-main (void) ++static int ++do_test (void) + { + void *eb; + socklen_t el; +@@ -206,3 +206,6 @@ main (void) + return 1; + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/inet/tst-gethnm.c b/inet/tst-gethnm.c +index 8af44d6..dd3a547 100644 +--- a/inet/tst-gethnm.c ++++ b/inet/tst-gethnm.c +@@ -10,8 +10,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + struct hostent *ent; + struct in_addr hostaddr; +@@ -62,3 +62,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/inet/tst-network.c b/inet/tst-network.c +index fc90bd7..cc840e0 100644 +--- a/inet/tst-network.c ++++ b/inet/tst-network.c +@@ -51,8 +51,8 @@ struct + }; + + +-int +-main (void) ++static int ++do_test (void) + { + int errors = 0; + size_t i; +@@ -76,3 +76,6 @@ main (void) + + return errors != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/inet/tst-ntoa.c b/inet/tst-ntoa.c +index 9be91eb..ef82d4d 100644 +--- a/inet/tst-ntoa.c ++++ b/inet/tst-ntoa.c +@@ -22,8 +22,8 @@ test (unsigned int inaddr, const char *expected) + } + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -34,3 +34,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/intl/tst-codeset.c b/intl/tst-codeset.c +index f5b37ec..37f731e 100644 +--- a/intl/tst-codeset.c ++++ b/intl/tst-codeset.c +@@ -23,8 +23,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char *s; + int result = 0; +@@ -55,3 +55,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/intl/tst-gettext2.c b/intl/tst-gettext2.c +index 075680a..3c44165 100644 +--- a/intl/tst-gettext2.c ++++ b/intl/tst-gettext2.c +@@ -40,8 +40,8 @@ struct data_t strings[] = + const int lang_cnt = 3; + const char *lang[] = {"lang1", "lang2", "lang3"}; + +-int +-main (void) ++static int ++do_test (void) + { + int i; + +@@ -70,3 +70,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/intl/tst-gettext3.c b/intl/tst-gettext3.c +index dd88987..11e9b08 100644 +--- a/intl/tst-gettext3.c ++++ b/intl/tst-gettext3.c +@@ -24,8 +24,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char *s; + int result = 0; +@@ -57,3 +57,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/intl/tst-ngettext.c b/intl/tst-ngettext.c +index 4fb0ca2..71e91b9 100644 +--- a/intl/tst-ngettext.c ++++ b/intl/tst-ngettext.c +@@ -25,8 +25,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + const char *strs[2] = { "singular", "plural" }; + unsigned long int i; +@@ -63,3 +63,6 @@ main (void) + + return res; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/intl/tst-translit.c b/intl/tst-translit.c +index 1aecee7..299fa40 100644 +--- a/intl/tst-translit.c ++++ b/intl/tst-translit.c +@@ -24,8 +24,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + const char *s; +@@ -49,3 +49,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/io/test-stat.c b/io/test-stat.c +index c5cfd26..e9c8468 100644 +--- a/io/test-stat.c ++++ b/io/test-stat.c +@@ -25,8 +25,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + /* With _FILE_OFFSET_BITS=64 struct stat and struct stat64 should + be identical. */ +@@ -65,3 +65,6 @@ main (void) + #endif + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/libio/test-fmemopen.c b/libio/test-fmemopen.c +index 3099894..211176e 100644 +--- a/libio/test-fmemopen.c ++++ b/libio/test-fmemopen.c +@@ -22,8 +22,8 @@ static char buffer[] = "foobar"; + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int ch; + FILE *stream; +@@ -37,3 +37,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/libio/tst-freopen.c b/libio/tst-freopen.c +index f9e7177..94284ec 100644 +--- a/libio/tst-freopen.c ++++ b/libio/tst-freopen.c +@@ -22,8 +22,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char name[] = "/tmp/tst-freopen.XXXXXX"; + const char * const test = "Let's test freopen.\n"; +@@ -100,3 +100,6 @@ main (void) + unlink (name); + exit (0); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/libio/tst-sscanf.c b/libio/tst-sscanf.c +index b1a2b84..fb4be34 100644 +--- a/libio/tst-sscanf.c ++++ b/libio/tst-sscanf.c +@@ -3,8 +3,8 @@ + + #define WCS_LENGTH 256 + +-int +-main (void) ++static int ++do_test (void) + { + const char cnv[] ="%l[abc]"; + const char str[] = "abbcXab"; +@@ -18,3 +18,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/libio/tst-ungetwc1.c b/libio/tst-ungetwc1.c +index f74c407..f71b390 100644 +--- a/libio/tst-ungetwc1.c ++++ b/libio/tst-ungetwc1.c +@@ -7,8 +7,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + FILE *fp; + const char *str = "abcdef"; +@@ -79,3 +79,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/libio/tst-ungetwc2.c b/libio/tst-ungetwc2.c +index d15e287..a7c5193 100644 +--- a/libio/tst-ungetwc2.c ++++ b/libio/tst-ungetwc2.c +@@ -7,8 +7,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + FILE *fp; + const char *str = "abcdef"; +@@ -79,3 +79,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/libio/tst-widetext.c b/libio/tst-widetext.c +index 179763e..acab72b 100644 +--- a/libio/tst-widetext.c ++++ b/libio/tst-widetext.c +@@ -31,8 +31,8 @@ + #define SIZE 210000 + + +-int +-main (void) ++static int ++do_test (void) + { + char name[] = "/tmp/widetext.out.XXXXXX"; + char mbbuf[SIZE]; +@@ -367,3 +367,6 @@ main (void) + + return status; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-ctype.c b/localedata/tst-ctype.c +index ceda891..a4e8fcf 100644 +--- a/localedata/tst-ctype.c ++++ b/localedata/tst-ctype.c +@@ -61,8 +61,8 @@ static struct classes + } + + +-int +-main (void) ++static int ++do_test (void) + { + const char *cp; + const char *cp2; +@@ -447,3 +447,6 @@ punct = %04x alnum = %04x\n", + printf (" No errors for `%s' locale\n\n\n", setlocale (LC_ALL, NULL)); + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-digits.c b/localedata/tst-digits.c +index 9b3ebcd..76356e9 100644 +--- a/localedata/tst-digits.c ++++ b/localedata/tst-digits.c +@@ -111,8 +111,8 @@ static struct wprintf_int_test + (sizeof (wprintf_int_tests) / sizeof (wprintf_int_tests[0])) + + +-int +-main (void) ++static int ++do_test (void) + { + int cnt; + int failures; +@@ -246,3 +246,6 @@ main (void) + + return status; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-leaks.c b/localedata/tst-leaks.c +index 7a4b557..ccd44f2 100644 +--- a/localedata/tst-leaks.c ++++ b/localedata/tst-leaks.c +@@ -1,8 +1,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int cnt; + +@@ -16,3 +16,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-mbswcs1.c b/localedata/tst-mbswcs1.c +index 14f1372..1404829 100644 +--- a/localedata/tst-mbswcs1.c ++++ b/localedata/tst-mbswcs1.c +@@ -33,8 +33,8 @@ + } \ + putc ('\n', stdout) + +-int +-main (void) ++static int ++do_test (void) + { + const unsigned char buf[6] = { 0x25, 0xe2, 0x82, 0xac, 0xce, 0xbb }; + mbstate_t state; +@@ -60,3 +60,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-mbswcs2.c b/localedata/tst-mbswcs2.c +index 25fa951..9cd95d6 100644 +--- a/localedata/tst-mbswcs2.c ++++ b/localedata/tst-mbswcs2.c +@@ -35,8 +35,8 @@ + } \ + putc ('\n', stdout) + +-int +-main (void) ++static int ++do_test (void) + { + unsigned char buf[6] = { 0x25, 0xe2, 0x82, 0xac, 0xce, 0xbb }; + mbstate_t state; +@@ -62,3 +62,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-mbswcs3.c b/localedata/tst-mbswcs3.c +index 8db65c5..a068541 100644 +--- a/localedata/tst-mbswcs3.c ++++ b/localedata/tst-mbswcs3.c +@@ -38,8 +38,8 @@ + putc ('\n', stdout); \ + } + +-int +-main (void) ++static int ++do_test (void) + { + unsigned char buf[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + const unsigned char bufcheck[6] = { 0x25, 0xe2, 0x82, 0xac, 0xce, 0xbb }; +@@ -73,3 +73,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-mbswcs4.c b/localedata/tst-mbswcs4.c +index 09b7417..a4fe60d 100644 +--- a/localedata/tst-mbswcs4.c ++++ b/localedata/tst-mbswcs4.c +@@ -34,8 +34,8 @@ + } \ + putc ('\n', stdout) + +-int +-main (void) ++static int ++do_test (void) + { + unsigned char buf[6] = { 0x25, 0xe2, 0x82, 0xac, 0xce, 0xbb }; + mbstate_t state; +@@ -60,3 +60,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-mbswcs5.c b/localedata/tst-mbswcs5.c +index e18862c..c44f12a 100644 +--- a/localedata/tst-mbswcs5.c ++++ b/localedata/tst-mbswcs5.c +@@ -37,8 +37,8 @@ + putc ('\n', stdout); \ + } + +-int +-main (void) ++static int ++do_test (void) + { + unsigned char buf[7] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + const unsigned char bufcheck[7] = { 0x25, 0xe2, 0x82, 0xac, 0xce, 0xbb, 0 }; +@@ -72,3 +72,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-setlocale.c b/localedata/tst-setlocale.c +index 1f8e68d..a09a4de 100644 +--- a/localedata/tst-setlocale.c ++++ b/localedata/tst-setlocale.c +@@ -3,8 +3,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char q[30]; + char *s; +@@ -23,3 +23,6 @@ main (void) + + return strcmp (s, "de_DE.UTF-8") != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-trans.c b/localedata/tst-trans.c +index 5e09631..0b0be83 100644 +--- a/localedata/tst-trans.c ++++ b/localedata/tst-trans.c +@@ -24,8 +24,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char buf[30]; + wchar_t wbuf[30]; +@@ -68,3 +68,6 @@ main (void) + + return errors; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-wctype.c b/localedata/tst-wctype.c +index bd2b057..eb72030 100644 +--- a/localedata/tst-wctype.c ++++ b/localedata/tst-wctype.c +@@ -24,8 +24,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + wctype_t wct; + wchar_t buf[1000]; +@@ -141,3 +141,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/localedata/tst-xlocale1.c b/localedata/tst-xlocale1.c +index 297c9ad..9f545a0 100644 +--- a/localedata/tst-xlocale1.c ++++ b/localedata/tst-xlocale1.c +@@ -20,8 +20,8 @@ static struct + #define ntests (sizeof (tests) / sizeof (tests[0])) + + +-int +-main (void) ++static int ++do_test (void) + { + size_t cnt; + int result = 0; +@@ -73,3 +73,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/login/tst-grantpt.c b/login/tst-grantpt.c +index 5078dac..65bb344 100644 +--- a/login/tst-grantpt.c ++++ b/login/tst-grantpt.c +@@ -66,8 +66,8 @@ test_einval (void) + return ret; + } + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -76,3 +76,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/malloc/tst-calloc.c b/malloc/tst-calloc.c +index 51e6c25..7ad5124 100644 +--- a/malloc/tst-calloc.c ++++ b/malloc/tst-calloc.c +@@ -104,8 +104,8 @@ null_test (void) + } + + +-int +-main (void) ++static int ++do_test (void) + { + /* We are allocating blocks with `calloc' and check whether every + block is completely cleared. We first try this for some fixed +@@ -123,3 +123,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/malloc/tst-malloc.c b/malloc/tst-malloc.c +index a75ab1e..2685315 100644 +--- a/malloc/tst-malloc.c ++++ b/malloc/tst-malloc.c +@@ -29,8 +29,8 @@ merror (const char *msg) + printf ("Error: %s\n", msg); + } + +-int +-main (void) ++static int ++do_test (void) + { + void *p, *q; + int save; +@@ -75,3 +75,6 @@ main (void) + + return errors != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/malloc/tst-mallocstate.c b/malloc/tst-mallocstate.c +index 69c4500..539539e 100644 +--- a/malloc/tst-mallocstate.c ++++ b/malloc/tst-mallocstate.c +@@ -29,8 +29,8 @@ merror (const char *msg) + printf ("Error: %s\n", msg); + } + +-int +-main (void) ++static int ++do_test (void) + { + void *p1, *p2; + void *save_state; +@@ -79,3 +79,6 @@ main (void) + * c-basic-offset: 2 + * End: + */ ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/malloc/tst-mcheck.c b/malloc/tst-mcheck.c +index 478ca8c..bd9ab0e 100644 +--- a/malloc/tst-mcheck.c ++++ b/malloc/tst-mcheck.c +@@ -29,8 +29,8 @@ merror (const char *msg) + printf ("Error: %s\n", msg); + } + +-int +-main (void) ++static int ++do_test (void) + { + void *p, *q; + +@@ -88,3 +88,6 @@ main (void) + + return errors != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/malloc/tst-mtrace.c b/malloc/tst-mtrace.c +index 9b5151c..b2c0c2c 100644 +--- a/malloc/tst-mtrace.c ++++ b/malloc/tst-mtrace.c +@@ -30,8 +30,8 @@ static void print (const void *node, VISIT value, int level); + static FILE *fp; + + +-int +-main (void) ++static int ++do_test (void) + { + void *root = NULL; + size_t linelen = 0; +@@ -100,3 +100,6 @@ print (const void *node, VISIT value, int level) + if (value == postorder || value == leaf) + fprintf (fp, "%3d: %s", ++cnt, *(const char **) node); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/malloc/tst-obstack.c b/malloc/tst-obstack.c +index 769697f..ee1385d 100644 +--- a/malloc/tst-obstack.c ++++ b/malloc/tst-obstack.c +@@ -25,8 +25,8 @@ verbose_free (void *buf) + printf ("free (%p)\n", buf); + } + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + int align = 2; +@@ -62,3 +62,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/math/atest-exp.c b/math/atest-exp.c +index 3a538b2..6a551de 100644 +--- a/math/atest-exp.c ++++ b/math/atest-exp.c +@@ -102,8 +102,8 @@ mpn_bitsize(const mp_limb_t *SRC_PTR, mp_size_t SIZE) + return i * mpbpl + j; + } + +-int +-main (void) ++static int ++do_test (void) + { + mp1 ex, x, xt, e2, e3; + int i; +@@ -190,3 +190,6 @@ main (void) + + return failures == 0 ? 0 : 1; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/math/atest-exp2.c b/math/atest-exp2.c +index 3442715..945bb7a 100644 +--- a/math/atest-exp2.c ++++ b/math/atest-exp2.c +@@ -144,8 +144,8 @@ mpn_bitsize(const mp_limb_t *SRC_PTR, mp_size_t SIZE) + return i * mpbpl + j; + } + +-int +-main (void) ++static int ++do_test (void) + { + mp1 ex, x, xt, e2, e3; + int i; +@@ -227,3 +227,6 @@ main (void) + + return failures == 0 ? 0 : 1; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/math/atest-sincos.c b/math/atest-sincos.c +index 5ad59b2..1f5e730 100644 +--- a/math/atest-sincos.c ++++ b/math/atest-sincos.c +@@ -141,8 +141,8 @@ mpn_bitsize (const mp_limb_t *SRC_PTR, mp_size_t SIZE) + return i * mpbpl + j; + } + +-int +-main (void) ++static int ++do_test (void) + { + mp1 si, co, x, ox, xt, s2, c2, s3, c3; + int i; +@@ -277,3 +277,6 @@ main (void) + + return (sin_failures == 0 && cos_failures == 0) ? 0 : 1; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/math/test-matherr.c b/math/test-matherr.c +index cd09a39..6983879 100644 +--- a/math/test-matherr.c ++++ b/math/test-matherr.c +@@ -12,10 +12,13 @@ matherr (struct exception *s) + return 1; + } + +-int +-main (void) ++static int ++do_test (void) + { + _LIB_VERSION = _SVID_; + acos (2.0); + return fail; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/math/test-misc.c b/math/test-misc.c +index 3fd2bca..4801bfe 100644 +--- a/math/test-misc.c ++++ b/math/test-misc.c +@@ -25,8 +25,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -1201,3 +1201,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/math/test-powl.c b/math/test-powl.c +index fd2a1cb..66ef886 100644 +--- a/math/test-powl.c ++++ b/math/test-powl.c +@@ -21,8 +21,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -48,3 +48,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/math/tst-definitions.c b/math/tst-definitions.c +index 2501c8c..76a4125 100644 +--- a/math/tst-definitions.c ++++ b/math/tst-definitions.c +@@ -21,8 +21,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -44,3 +44,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/misc/tst-dirname.c b/misc/tst-dirname.c +index d8f33df..d6c05ad 100644 +--- a/misc/tst-dirname.c ++++ b/misc/tst-dirname.c +@@ -37,8 +37,8 @@ test (const char *input, const char *result) + return retval; + } + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -67,3 +67,6 @@ main (void) + + return result != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/misc/tst-efgcvt.c b/misc/tst-efgcvt.c +index 303042d..11427a0 100644 +--- a/misc/tst-efgcvt.c ++++ b/misc/tst-efgcvt.c +@@ -200,8 +200,8 @@ special (void) + } + + +-int +-main (void) ++static int ++do_test (void) + { + test (ecvt_tests, ecvt, "ecvt"); + test (fcvt_tests, fcvt, "fcvt"); +@@ -211,3 +211,6 @@ main (void) + + return error_count; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/misc/tst-fdset.c b/misc/tst-fdset.c +index 78a34e9..ef93ac3 100644 +--- a/misc/tst-fdset.c ++++ b/misc/tst-fdset.c +@@ -20,8 +20,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int retval = 0; + int i; +@@ -62,3 +62,6 @@ main (void) + + return retval; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/misc/tst-hsearch.c b/misc/tst-hsearch.c +index 6c19b22..d390f1d 100644 +--- a/misc/tst-hsearch.c ++++ b/misc/tst-hsearch.c +@@ -1,8 +1,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int a = 1; + int b = 2; +@@ -29,3 +29,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/misc/tst-mntent2.c b/misc/tst-mntent2.c +index 6c25e01..e61d506 100644 +--- a/misc/tst-mntent2.c ++++ b/misc/tst-mntent2.c +@@ -3,8 +3,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + struct mntent mef; +@@ -39,3 +39,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/nptl/tst-sem7.c b/nptl/tst-sem7.c +index d0e7f05..4fc5f1f 100644 +--- a/nptl/tst-sem7.c ++++ b/nptl/tst-sem7.c +@@ -31,8 +31,8 @@ remove_sem (int status, void *arg) + } + + +-int +-main (void) ++static int ++do_test (void) + { + sem_t *s; + sem_t *s2; +@@ -106,3 +106,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/nptl/tst-sem8.c b/nptl/tst-sem8.c +index 1aeb1e1..4d7197c 100644 +--- a/nptl/tst-sem8.c ++++ b/nptl/tst-sem8.c +@@ -31,8 +31,8 @@ remove_sem (int status, void *arg) + } + + +-int +-main (void) ++static int ++do_test (void) + { + sem_t *s; + int i; +@@ -71,3 +71,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/nptl/tst-sem9.c b/nptl/tst-sem9.c +index 9727486..b7d81a9 100644 +--- a/nptl/tst-sem9.c ++++ b/nptl/tst-sem9.c +@@ -31,8 +31,8 @@ remove_sem (int status, void *arg) + } + + +-int +-main (void) ++static int ++do_test (void) + { + sem_t *s; + int i; +@@ -78,3 +78,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/nss/test-netdb.c b/nss/test-netdb.c +index 1620b5b..384f32b 100644 +--- a/nss/test-netdb.c ++++ b/nss/test-netdb.c +@@ -356,8 +356,8 @@ setdb (const char *dbname) + } + + +-int +-main (void) ++static int ++do_test (void) + { + /* + setdb ("db"); +@@ -376,3 +376,6 @@ main (void) + + return (error_count != 0); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/posix/tst-fnmatch.c b/posix/tst-fnmatch.c +index ff2674c..021734d 100644 +--- a/posix/tst-fnmatch.c ++++ b/posix/tst-fnmatch.c +@@ -33,8 +33,8 @@ static char *flag_output (int flags); + static char *escape (const char *str, size_t *reslenp, char **resbuf); + + +-int +-main (void) ++static int ++do_test (void) + { + char *linebuf = NULL; + size_t linebuflen = 0; +@@ -388,3 +388,6 @@ escape (const char *str, size_t *reslenp, char **resbufp) + + return resbuf; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/posix/tst-getlogin.c b/posix/tst-getlogin.c +index 1393c3a..141a699 100644 +--- a/posix/tst-getlogin.c ++++ b/posix/tst-getlogin.c +@@ -19,8 +19,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char *login; + int errors = 0; +@@ -55,3 +55,6 @@ main (void) + + return errors != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/posix/tst-gnuglob.c b/posix/tst-gnuglob.c +index 1c72357..39b5b24 100644 +--- a/posix/tst-gnuglob.c ++++ b/posix/tst-gnuglob.c +@@ -379,8 +379,8 @@ test_result (const char *fmt, int flags, glob_t *gl, const char *str[]) + } + + +-int +-main (void) ++static int ++do_test (void) + { + glob_t gl; + int errval; +@@ -497,3 +497,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/posix/tst-mmap.c b/posix/tst-mmap.c +index c03acf5..5e52b49 100644 +--- a/posix/tst-mmap.c ++++ b/posix/tst-mmap.c +@@ -6,8 +6,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + FILE *fp; +@@ -195,3 +195,6 @@ main (void) + /* That's it. */ + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/resolv/tst-inet_ntop.c b/resolv/tst-inet_ntop.c +index f968ec4..f0de063 100644 +--- a/resolv/tst-inet_ntop.c ++++ b/resolv/tst-inet_ntop.c +@@ -4,8 +4,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + struct in_addr addr4; + struct in6_addr addr6; +@@ -109,3 +109,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/rt/tst-timer.c b/rt/tst-timer.c +index f35d3e7..87f6491 100644 +--- a/rt/tst-timer.c ++++ b/rt/tst-timer.c +@@ -20,8 +20,8 @@ + + /* This file is only used if there is no other implementation and it should + means that there is no implementation of POSIX timers. */ +-int +-main (void) ++static int ++do_test (void) + { + #ifdef _POSIX_TIMERS + /* There should be a test. */ +@@ -30,3 +30,6 @@ main (void) + return 0; + #endif + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/test-fseek.c b/stdio-common/test-fseek.c +index fe57df6..8a7f1ae 100644 +--- a/stdio-common/test-fseek.c ++++ b/stdio-common/test-fseek.c +@@ -19,8 +19,8 @@ + + #define TESTFILE "/tmp/test.dat" + +-int +-main (void) ++static int ++do_test (void) + { + FILE *fp; + int i, j; +@@ -82,3 +82,6 @@ main (void) + puts ((i > 255) ? "Test succeeded." : "Test FAILED!"); + return (i > 255) ? 0 : 1; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/test-popen.c b/stdio-common/test-popen.c +index d36cd61..1f1c88a 100644 +--- a/stdio-common/test-popen.c ++++ b/stdio-common/test-popen.c +@@ -49,8 +49,8 @@ read_data (FILE *stream) + } + } + +-int +-main (void) ++static int ++do_test (void) + { + FILE *output, *input; + int wstatus, rstatus; +@@ -100,3 +100,6 @@ main (void) + puts (wstatus | rstatus ? "Test FAILED!" : "Test succeeded."); + return (wstatus | rstatus); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/test-vfprintf.c b/stdio-common/test-vfprintf.c +index a936c28..9cc56d7 100644 +--- a/stdio-common/test-vfprintf.c ++++ b/stdio-common/test-vfprintf.c +@@ -36,8 +36,8 @@ const char *locs[] = + + char large[50000]; + +-int +-main (void) ++static int ++do_test (void) + { + char buf[25]; + size_t i; +@@ -124,3 +124,6 @@ main (void) + + return res; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-cookie.c b/stdio-common/tst-cookie.c +index dcdabf3..030e684 100644 +--- a/stdio-common/tst-cookie.c ++++ b/stdio-common/tst-cookie.c +@@ -63,8 +63,8 @@ cookieclose (void *cookie) + } + + +-int +-main (void) ++static int ++do_test (void) + { + cookie_io_functions_t fcts; + char buf[1]; +@@ -90,3 +90,6 @@ main (void) + + return errors != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-fileno.c b/stdio-common/tst-fileno.c +index a0c8853..753df9f 100644 +--- a/stdio-common/tst-fileno.c ++++ b/stdio-common/tst-fileno.c +@@ -28,10 +28,13 @@ check (const char *name, FILE *stream, int fd) + return sfd != fd; + } + +-int +-main (void) ++static int ++do_test (void) + { + return (check ("stdin", stdin, STDIN_FILENO) || + check ("stdout", stdout, STDOUT_FILENO) || + check ("stderr", stderr, STDERR_FILENO)); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-gets.c b/stdio-common/tst-gets.c +index 7f78fc1..052f1f9 100644 +--- a/stdio-common/tst-gets.c ++++ b/stdio-common/tst-gets.c +@@ -21,8 +21,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + char buf[100]; + int result = 0; +@@ -61,3 +61,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-obprintf.c b/stdio-common/tst-obprintf.c +index 39e8fda..5151593 100644 +--- a/stdio-common/tst-obprintf.c ++++ b/stdio-common/tst-obprintf.c +@@ -4,8 +4,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + struct obstack ob; + int n; +@@ -40,3 +40,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-perror.c b/stdio-common/tst-perror.c +index b809c2f..416b120 100644 +--- a/stdio-common/tst-perror.c ++++ b/stdio-common/tst-perror.c +@@ -24,8 +24,8 @@ + #define WC_EXP_LEN (sizeof (WC_EXP) - 1) + + +-int +-main (void) ++static int ++do_test (void) + { + int fd; + char fname[] = "/tmp/tst-perror.XXXXXX"; +@@ -152,3 +152,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-sprintf.c b/stdio-common/tst-sprintf.c +index c4e911f..2fe373f 100644 +--- a/stdio-common/tst-sprintf.c ++++ b/stdio-common/tst-sprintf.c +@@ -4,8 +4,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + char buf[100]; + int result = 0; +@@ -73,3 +73,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-sprintf2.c b/stdio-common/tst-sprintf2.c +index 422278d..0ddf15b 100644 +--- a/stdio-common/tst-sprintf2.c ++++ b/stdio-common/tst-sprintf2.c +@@ -3,8 +3,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + #if LDBL_MANT_DIG >= 106 + volatile union { long double l; long long x[2]; } u, v; +@@ -82,3 +82,6 @@ main (void) + #endif + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-sprintf3.c b/stdio-common/tst-sprintf3.c +index e54b23b..e927761 100644 +--- a/stdio-common/tst-sprintf3.c ++++ b/stdio-common/tst-sprintf3.c +@@ -22,8 +22,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + #if LDBL_MANT_DIG >= 106 + volatile union { long double l; long long x[2]; } u, v; +@@ -88,3 +88,6 @@ main (void) + #endif + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-swprintf.c b/stdio-common/tst-swprintf.c +index e65234b..ce62c6b 100644 +--- a/stdio-common/tst-swprintf.c ++++ b/stdio-common/tst-swprintf.c +@@ -12,8 +12,8 @@ + + const char input[] = "\x8e\xa1g\x8e\xa2h\x8e\xa3i\x8e\xa4j"; + +-int +-main (void) ++static int ++do_test (void) + { + wchar_t buf[1000]; + #define nbuf (sizeof (buf) / sizeof (buf[0])) +@@ -54,3 +54,6 @@ swprintf (.., .., L\"%ls\", \"%ls\") produced \"%ls\", not \"%ls\"\n", \ + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-tmpnam.c b/stdio-common/tst-tmpnam.c +index a3bd9fb..3b97064 100644 +--- a/stdio-common/tst-tmpnam.c ++++ b/stdio-common/tst-tmpnam.c +@@ -19,8 +19,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + const char *name; + int retval = 0; +@@ -48,3 +48,6 @@ main (void) + + return retval; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-unbputc.c b/stdio-common/tst-unbputc.c +index bbd8622..7200a82 100644 +--- a/stdio-common/tst-unbputc.c ++++ b/stdio-common/tst-unbputc.c +@@ -1,11 +1,14 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + putc ('1', stderr); + putc ('2', stderr); + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/tst-wc-printf.c b/stdio-common/tst-wc-printf.c +index abbeeb5..2a2acb5 100644 +--- a/stdio-common/tst-wc-printf.c ++++ b/stdio-common/tst-wc-printf.c +@@ -4,8 +4,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + wchar_t tmp[3]; + tmp[0] = '8'; +@@ -20,3 +20,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-environ.c b/stdlib/tst-environ.c +index 3316d7e..b1de2f9 100644 +--- a/stdlib/tst-environ.c ++++ b/stdlib/tst-environ.c +@@ -25,8 +25,8 @@ + + char putenv_val[100] = VAR "=some longer value"; + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + const char *valp; +@@ -219,3 +219,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-fmtmsg.c b/stdlib/tst-fmtmsg.c +index c3748d6..b7948c5 100644 +--- a/stdlib/tst-fmtmsg.c ++++ b/stdlib/tst-fmtmsg.c +@@ -7,8 +7,8 @@ + + #define MM_TEST 10 + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -80,3 +80,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-limits.c b/stdlib/tst-limits.c +index 265b9db..6e51dca 100644 +--- a/stdlib/tst-limits.c ++++ b/stdlib/tst-limits.c +@@ -16,8 +16,8 @@ bitval (int bits) + } + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -67,3 +67,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-rand48-2.c b/stdlib/tst-rand48-2.c +index 3079b98..8b8fef4 100644 +--- a/stdlib/tst-rand48-2.c ++++ b/stdlib/tst-rand48-2.c +@@ -3,8 +3,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + time_t t = time (NULL); + int i, ret = 0; +@@ -111,3 +111,6 @@ main (void) + + return ret; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-rand48.c b/stdlib/tst-rand48.c +index 52e1b96..973c62e 100644 +--- a/stdlib/tst-rand48.c ++++ b/stdlib/tst-rand48.c +@@ -8,8 +8,8 @@ + #endif + + +-int +-main (void) ++static int ++do_test (void) + { + unsigned short int xs[3] = { 0x0001, 0x0012, 0x0123 }; + unsigned short int lxs[7]; +@@ -388,3 +388,6 @@ drand48() and erand48 in lines %d and %d produce different results\n", + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-random.c b/stdlib/tst-random.c +index 47195d6..8fe0993 100644 +--- a/stdlib/tst-random.c ++++ b/stdlib/tst-random.c +@@ -46,8 +46,8 @@ const unsigned int seed[3] = { 0x12344321U, 0xEE11DD22U, 0xFEDCBA98 }; + + void fail (const char *msg, int s, int i) __attribute__ ((__noreturn__)); + +-int +-main (void) ++static int ++do_test (void) + { + long int rnd[nseq][nrnd]; /* pseudorandom numbers */ + char* state[nseq]; /* state for PRNG */ +@@ -117,3 +117,6 @@ fail (const char *msg, int s, int i) + printf ("%s (seq %d, pos %d).\n", msg, s, i); + exit (1); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-random2.c b/stdlib/tst-random2.c +index 0553b62..da840f3 100644 +--- a/stdlib/tst-random2.c ++++ b/stdlib/tst-random2.c +@@ -20,8 +20,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int pass; + int ret = 0; +@@ -56,3 +56,6 @@ main (void) + } + return ret; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-strtol.c b/stdlib/tst-strtol.c +index eebd8f7..448102a 100644 +--- a/stdlib/tst-strtol.c ++++ b/stdlib/tst-strtol.c +@@ -534,8 +534,8 @@ static const struct ltest tests[] = + /* Prototypes for local functions. */ + static void expand (char *dst, int c); + +-int +-main (void) ++static int ++do_test (void) + { + register const struct ltest *lt; + char *ep; +@@ -623,3 +623,6 @@ expand (dst, c) + else + (void) sprintf (dst, "%#.3o", (unsigned int) c); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-strtoll.c b/stdlib/tst-strtoll.c +index 0c77254..93f1a56 100644 +--- a/stdlib/tst-strtoll.c ++++ b/stdlib/tst-strtoll.c +@@ -309,8 +309,8 @@ static const struct ltest tests[] = + /* Prototypes for local functions. */ + static void expand (char *dst, int c); + +-int +-main (void) ++static int ++do_test (void) + { + register const struct ltest *lt; + char *ep; +@@ -398,3 +398,6 @@ expand (dst, c) + else + (void) sprintf (dst, "%#.3o", (unsigned int) c); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdlib/tst-xpg-basename.c b/stdlib/tst-xpg-basename.c +index 61e2e4b..facc783 100644 +--- a/stdlib/tst-xpg-basename.c ++++ b/stdlib/tst-xpg-basename.c +@@ -37,8 +37,8 @@ static struct + }; + + +-int +-main (void) ++static int ++do_test (void) + { + size_t i = 0; + int errors = 0; +@@ -64,3 +64,6 @@ main (void) + + return errors; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/string/test-ffs.c b/string/test-ffs.c +index 7ac1dd6..a64a1cc 100644 +--- a/string/test-ffs.c ++++ b/string/test-ffs.c +@@ -21,8 +21,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int failures = 0; + int i; +@@ -61,3 +61,6 @@ main (void) + + return failures; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/string/tst-bswap.c b/string/tst-bswap.c +index cca704c..6c1c911 100644 +--- a/string/tst-bswap.c ++++ b/string/tst-bswap.c +@@ -21,8 +21,8 @@ + + extern unsigned long long int wash (unsigned long long int a); + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -71,3 +71,6 @@ wash (unsigned long long int a) + regards the argument to the bswap_*() functions as constant. */ + return a + 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/string/tst-inlcall.c b/string/tst-inlcall.c +index 32d8863..0f8b1bd 100644 +--- a/string/tst-inlcall.c ++++ b/string/tst-inlcall.c +@@ -31,8 +31,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + int status; + int errors = 0; +@@ -80,3 +80,6 @@ main (void) + } + return status; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/string/tst-strtok.c b/string/tst-strtok.c +index 7e34aee..6fbef9f 100644 +--- a/string/tst-strtok.c ++++ b/string/tst-strtok.c +@@ -2,8 +2,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + char buf[1] = { 0 }; + int result = 0; +@@ -21,3 +21,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/string/tst-strxfrm.c b/string/tst-strxfrm.c +index 2ae2e29..f48cfc0 100644 +--- a/string/tst-strxfrm.c ++++ b/string/tst-strxfrm.c +@@ -58,8 +58,8 @@ test (const char *locale) + } + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -69,3 +69,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/sysdeps/x86_64/tst-audit10.c b/sysdeps/x86_64/tst-audit10.c +index 24c9696..8d6721a 100644 +--- a/sysdeps/x86_64/tst-audit10.c ++++ b/sysdeps/x86_64/tst-audit10.c +@@ -45,8 +45,8 @@ avx512_enabled (void) + + extern __m512i audit_test (__m512i, __m512i, __m512i, __m512i, + __m512i, __m512i, __m512i, __m512i); +-int +-main (void) ++static int ++do_test (void) + { + /* Run AVX512 test only if AVX512 is supported. */ + if (avx512_enabled ()) +@@ -62,9 +62,12 @@ main (void) + return 0; + } + #else +-int +-main (void) ++static int ++do_test (void) + { + return 0; + } + #endif ++ ++#define TEST_FUNCTION do_test () ++#include "../../test-skeleton.c" +diff --git a/elf/tst-audit3.c b/elf/tst-audit3.c +index d00db99..0602aa2 100644 +--- a/elf/tst-audit3.c ++++ b/elf/tst-audit3.c +@@ -7,8 +7,8 @@ + + extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i, + __m128i, __m128i, __m128i, __m128i); +-int +-main (void) ++static int ++do_test (void) + { + __m128i xmm = _mm_setzero_si128 (); + __m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm); +@@ -18,3 +18,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../../test-skeleton.c" +diff --git a/elf/tst-audit4.c b/elf/tst-audit4.c +index c4f1d5b..44d5123 100644 +--- a/elf/tst-audit4.c ++++ b/elf/tst-audit4.c +@@ -25,8 +25,8 @@ avx_enabled (void) + + extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i, + __m256i, __m256i, __m256i, __m256i); +-int +-main (void) ++static int ++do_test (void) + { + /* Run AVX test only if AVX is supported. */ + if (avx_enabled ()) +@@ -41,9 +41,12 @@ main (void) + return 0; + } + #else +-int +-main (void) ++static int ++do_test (void) + { + return 0; + } + #endif ++ ++#define TEST_FUNCTION do_test () ++#include "../../test-skeleton.c" +diff --git a/elf/tst-audit5.c b/elf/tst-audit5.c +index 0094fee..225b4c8 100644 +--- a/elf/tst-audit5.c ++++ b/elf/tst-audit5.c +@@ -7,8 +7,8 @@ + + extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i, + __m128i, __m128i, __m128i, __m128i); +-int +-main (void) ++static int ++do_test (void) + { + __m128i xmm = _mm_setzero_si128 (); + __m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm); +@@ -19,3 +19,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../../test-skeleton.c" +diff --git a/time/tst-ftime_l.c b/time/tst-ftime_l.c +index fc3d78d..6690efe 100644 +--- a/time/tst-ftime_l.c ++++ b/time/tst-ftime_l.c +@@ -6,8 +6,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + locale_t l; + locale_t old; +@@ -124,3 +124,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/time/tst-getdate.c b/time/tst-getdate.c +index fd87923..b3377ee 100644 +--- a/time/tst-getdate.c ++++ b/time/tst-getdate.c +@@ -76,8 +76,8 @@ report_date_error (int err) + } + + +-int +-main (void) ++static int ++do_test (void) + { + int errors = 0; + size_t i; +@@ -121,3 +121,6 @@ main (void) + printf ("No errors found.\n"); + return errors != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/time/tst-mktime.c b/time/tst-mktime.c +index 416a856..c147360 100644 +--- a/time/tst-mktime.c ++++ b/time/tst-mktime.c +@@ -3,8 +3,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + struct tm time_str, *tm; + time_t t; +@@ -68,3 +68,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/time/tst-mktime3.c b/time/tst-mktime3.c +index 60d0e0b..c738e53 100644 +--- a/time/tst-mktime3.c ++++ b/time/tst-mktime3.c +@@ -17,8 +17,8 @@ struct tm expected[] = + { .tm_sec = 5, .tm_mday = 1, .tm_year = 102, .tm_wday = 2 } + }; + +-int +-main (void) ++static int ++do_test (void) + { + setenv ("TZ", "UTC", 1); + int i; +@@ -48,3 +48,6 @@ main (void) + } + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/time/tst-posixtz.c b/time/tst-posixtz.c +index 019d92a..c1ea267 100644 +--- a/time/tst-posixtz.c ++++ b/time/tst-posixtz.c +@@ -28,8 +28,8 @@ struct + "1999/02/25 15:18:12 dst=0 zone=EST" }, + }; + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + size_t cnt; +@@ -116,3 +116,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/time/tst-strptime2.c b/time/tst-strptime2.c +index 73552bb..bcd6cc8 100644 +--- a/time/tst-strptime2.c ++++ b/time/tst-strptime2.c +@@ -26,8 +26,8 @@ static const struct + #define ntests (sizeof (tests) / sizeof (tests[0])) + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -57,3 +57,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/time/tst-strptime3.c b/time/tst-strptime3.c +index 9a8c648..75b57c1 100644 +--- a/time/tst-strptime3.c ++++ b/time/tst-strptime3.c +@@ -4,8 +4,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + struct tm tm; +@@ -53,3 +53,6 @@ main (void) + + return 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-btowc.c b/wcsmbs/tst-btowc.c +index d793622..dc34f2b 100644 +--- a/wcsmbs/tst-btowc.c ++++ b/wcsmbs/tst-btowc.c +@@ -74,8 +74,8 @@ eof_test (void) + + + /* Test the btowc() function for a few locales with known character sets. */ +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -172,3 +172,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-mbrtowc.c b/wcsmbs/tst-mbrtowc.c +index 3e1eb72..a30b619 100644 +--- a/wcsmbs/tst-mbrtowc.c ++++ b/wcsmbs/tst-mbrtowc.c +@@ -151,8 +151,8 @@ utf8_test (void) + } + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -230,3 +230,6 @@ check_ascii (const char *locname) + + return res != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-mbsrtowcs.c b/wcsmbs/tst-mbsrtowcs.c +index 8d7e2cb..405534d 100644 +--- a/wcsmbs/tst-mbsrtowcs.c ++++ b/wcsmbs/tst-mbsrtowcs.c +@@ -21,8 +21,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + const unsigned char buf[] = { 'a', 'b', '\0', 'c', 'd', '\0', 'e' }; + wchar_t out[sizeof (buf)]; +@@ -62,3 +62,6 @@ main (void) + } + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-wchar-h.c b/wcsmbs/tst-wchar-h.c +index 4cf2dd0..fd2ad56 100644 +--- a/wcsmbs/tst-wchar-h.c ++++ b/wcsmbs/tst-wchar-h.c +@@ -1,9 +1,12 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + mbstate_t x; + return sizeof (x) - sizeof (mbstate_t); + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-wcpncpy.c b/wcsmbs/tst-wcpncpy.c +index 74765e7..4cf4aec 100644 +--- a/wcsmbs/tst-wcpncpy.c ++++ b/wcsmbs/tst-wcpncpy.c +@@ -20,8 +20,8 @@ + #include + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -74,3 +74,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-wcrtomb.c b/wcsmbs/tst-wcrtomb.c +index 3f052f3..cad343e 100644 +--- a/wcsmbs/tst-wcrtomb.c ++++ b/wcsmbs/tst-wcrtomb.c +@@ -26,8 +26,8 @@ + static int check_ascii (const char *locname); + + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + +@@ -92,3 +92,6 @@ check_ascii (const char *locname) + + return res != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-wcsnlen.c b/wcsmbs/tst-wcsnlen.c +index 60e64ad..8d4b8b5 100644 +--- a/wcsmbs/tst-wcsnlen.c ++++ b/wcsmbs/tst-wcsnlen.c +@@ -27,8 +27,8 @@ + printf ("wcsnlen (L\"%s\", %d) = %d, not %d\n", Str, Max, n, Exp); \ + } + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + int n; +@@ -48,3 +48,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/wcsmbs/tst-wcstof.c b/wcsmbs/tst-wcstof.c +index 197cb5c..576a58c 100644 +--- a/wcsmbs/tst-wcstof.c ++++ b/wcsmbs/tst-wcstof.c +@@ -4,8 +4,8 @@ + #include + #include + +-int +-main (void) ++static int ++do_test (void) + { + int result = 0; + char buf[100]; +@@ -21,3 +21,6 @@ main (void) + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/SOURCES/glibc-rh1298526-0.patch b/SOURCES/glibc-rh1298526-0.patch new file mode 100644 index 0000000..e7f5809 --- /dev/null +++ b/SOURCES/glibc-rh1298526-0.patch @@ -0,0 +1,348 @@ +commit 83d776f979342f923b5c3d2a5b43afab841c6086 +Author: Andrew Senkevich +Date: Sat Dec 19 02:47:28 2015 +0300 + + Added memset optimized with AVX512 for KNL hardware. + + It shows improvement up to 28% over AVX2 memset (performance results + attached at ). + + * sysdeps/x86_64/multiarch/memset-avx512-no-vzeroupper.S: New file. + * sysdeps/x86_64/multiarch/Makefile (sysdep_routines): Added new file. + * sysdeps/x86_64/multiarch/ifunc-impl-list.c: Added new tests. + * sysdeps/x86_64/multiarch/memset.S: Added new IFUNC branch. + * sysdeps/x86_64/multiarch/memset_chk.S: Likewise. + * sysdeps/x86/cpu-features.h (bit_Prefer_No_VZEROUPPER, + index_Prefer_No_VZEROUPPER): New. + * sysdeps/x86/cpu-features.c (init_cpu_features): Set the + Prefer_No_VZEROUPPER for Knights Landing. + +Index: glibc-2.17-c758a686/sysdeps/x86/cpu-features.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86/cpu-features.c ++++ glibc-2.17-c758a686/sysdeps/x86/cpu-features.c +@@ -76,6 +76,8 @@ init_cpu_features (struct cpu_features * + + case 0x57: + /* Knights Landing. Enable Silvermont optimizations. */ ++ cpu_features->feature[index_Prefer_No_VZEROUPPER] ++ |= bit_Prefer_No_VZEROUPPER; + + case 0x37: + case 0x4a: +Index: glibc-2.17-c758a686/sysdeps/x86/cpu-features.h +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86/cpu-features.h ++++ glibc-2.17-c758a686/sysdeps/x86/cpu-features.h +@@ -33,6 +33,7 @@ + #define bit_AVX512F_Usable (1 << 12) + #define bit_AVX512DQ_Usable (1 << 13) + #define bit_Prefer_MAP_32BIT_EXEC (1 << 16) ++#define bit_Prefer_No_VZEROUPPER (1 << 17) + + /* CPUID Feature flags. */ + +@@ -93,6 +94,7 @@ + # define index_AVX512F_Usable FEATURE_INDEX_1*FEATURE_SIZE + # define index_AVX512DQ_Usable FEATURE_INDEX_1*FEATURE_SIZE + # define index_Prefer_MAP_32BIT_EXEC FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Prefer_No_VZEROUPPER FEATURE_INDEX_1*FEATURE_SIZE + + # if defined (_LIBC) && !IS_IN (nonlib) + # ifdef __x86_64__ +@@ -270,6 +272,7 @@ extern const struct cpu_features *__get_ + # define index_AVX512F_Usable FEATURE_INDEX_1 + # define index_AVX512DQ_Usable FEATURE_INDEX_1 + # define index_Prefer_MAP_32BIT_EXEC FEATURE_INDEX_1 ++# define index_Prefer_No_VZEROUPPER FEATURE_INDEX_1 + + #endif /* !__ASSEMBLER__ */ + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/Makefile ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile +@@ -16,7 +16,8 @@ sysdep_routines += strncat-c stpncpy-c s + strcat-sse2-unaligned strncat-sse2-unaligned \ + strcat-ssse3 strncat-ssse3 strlen-sse2-pminub \ + strnlen-sse2-no-bsf strrchr-sse2-no-bsf strchr-sse2-no-bsf \ +- memcmp-ssse3 strstr-sse2-unaligned ++ memcmp-ssse3 strstr-sse2-unaligned \ ++ memset-avx512-no-vzeroupper + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c varshift + CFLAGS-varshift.c += -msse4 +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/ifunc-impl-list.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include "init-arch.h" + + /* Maximum number of IFUNC implementations. */ +@@ -66,12 +67,24 @@ __libc_ifunc_impl_list (const char *name + IFUNC_IMPL (i, name, __memset_chk, + IFUNC_IMPL_ADD (array, i, __memset_chk, 1, __memset_chk_sse2) + IFUNC_IMPL_ADD (array, i, __memset_chk, 1, +- __memset_chk_x86_64)) ++ __memset_chk_x86_64) ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ IFUNC_IMPL_ADD (array, i, __memset_chk, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __memset_chk_avx512_no_vzeroupper) ++#endif ++ ) + + /* Support sysdeps/x86_64/multiarch/memset.S. */ + IFUNC_IMPL (i, name, memset, + IFUNC_IMPL_ADD (array, i, memset, 1, __memset_sse2) +- IFUNC_IMPL_ADD (array, i, memset, 1, __memset_x86_64)) ++ IFUNC_IMPL_ADD (array, i, memset, 1, __memset_x86_64) ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ IFUNC_IMPL_ADD (array, i, memset, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __memset_avx512_no_vzeroupper) ++#endif ++ ) + + /* Support sysdeps/x86_64/multiarch/rawmemchr.S. */ + IFUNC_IMPL (i, name, rawmemchr, +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset-avx512-no-vzeroupper.S +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset-avx512-no-vzeroupper.S +@@ -0,0 +1,194 @@ ++/* memset optimized with AVX512 for KNL hardware. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#if defined HAVE_AVX512_ASM_SUPPORT && IS_IN (libc) ++ ++#include "asm-syntax.h" ++#ifndef MEMSET ++# define MEMSET __memset_avx512_no_vzeroupper ++# define MEMSET_CHK __memset_chk_avx512_no_vzeroupper ++#endif ++ ++ .section .text,"ax",@progbits ++#if defined PIC ++ENTRY (MEMSET_CHK) ++ cmpq %rdx, %rcx ++ jb HIDDEN_JUMPTARGET (__chk_fail) ++END (MEMSET_CHK) ++#endif ++ ++ENTRY (MEMSET) ++ vpxor %xmm0, %xmm0, %xmm0 ++ vmovd %esi, %xmm1 ++ lea (%rdi, %rdx), %rsi ++ mov %rdi, %rax ++ vpshufb %xmm0, %xmm1, %xmm0 ++ cmp $16, %rdx ++ jb L(less_16bytes) ++ cmp $512, %rdx ++ vbroadcastss %xmm0, %zmm2 ++ ja L(512bytesormore) ++ cmp $256, %rdx ++ jb L(less_256bytes) ++ vmovups %zmm2, (%rdi) ++ vmovups %zmm2, 0x40(%rdi) ++ vmovups %zmm2, 0x80(%rdi) ++ vmovups %zmm2, 0xC0(%rdi) ++ vmovups %zmm2, -0x100(%rsi) ++ vmovups %zmm2, -0xC0(%rsi) ++ vmovups %zmm2, -0x80(%rsi) ++ vmovups %zmm2, -0x40(%rsi) ++ ret ++ ++L(less_256bytes): ++ cmp $128, %dl ++ jb L(less_128bytes) ++ vmovups %zmm2, (%rdi) ++ vmovups %zmm2, 0x40(%rdi) ++ vmovups %zmm2, -0x80(%rsi) ++ vmovups %zmm2, -0x40(%rsi) ++ ret ++ ++L(less_128bytes): ++ cmp $64, %dl ++ jb L(less_64bytes) ++ vmovups %zmm2, (%rdi) ++ vmovups %zmm2, -0x40(%rsi) ++ ret ++ ++L(less_64bytes): ++ cmp $32, %dl ++ jb L(less_32bytes) ++ vmovdqu %ymm2, (%rdi) ++ vmovdqu %ymm2, -0x20(%rsi) ++ ret ++ ++L(less_32bytes): ++ vmovdqu %xmm0, (%rdi) ++ vmovdqu %xmm0, -0x10(%rsi) ++ ret ++ ++L(less_16bytes): ++ cmp $8, %dl ++ jb L(less_8bytes) ++ vmovq %xmm0, (%rdi) ++ vmovq %xmm0, -0x08(%rsi) ++ ret ++ ++L(less_8bytes): ++ vmovd %xmm0, %ecx ++ cmp $4, %dl ++ jb L(less_4bytes) ++ mov %ecx, (%rdi) ++ mov %ecx, -0x04(%rsi) ++ ret ++ ++L(less_4bytes): ++ cmp $2, %dl ++ jb L(less_2bytes) ++ mov %cx, (%rdi) ++ mov %cx, -0x02(%rsi) ++ ret ++ ++L(less_2bytes): ++ cmp $1, %dl ++ jb L(less_1bytes) ++ mov %cl, (%rdi) ++L(less_1bytes): ++ ret ++ ++L(512bytesormore): ++ mov __x86_64_shared_cache_size_half(%rip), %rcx ++ cmp %rcx, %rdx ++ ja L(preloop_large) ++ cmp $1024, %rdx ++ ja L(1024bytesormore) ++ ++ vmovups %zmm2, (%rdi) ++ vmovups %zmm2, 0x40(%rdi) ++ vmovups %zmm2, 0x80(%rdi) ++ vmovups %zmm2, 0xC0(%rdi) ++ vmovups %zmm2, 0x100(%rdi) ++ vmovups %zmm2, 0x140(%rdi) ++ vmovups %zmm2, 0x180(%rdi) ++ vmovups %zmm2, 0x1C0(%rdi) ++ vmovups %zmm2, -0x200(%rsi) ++ vmovups %zmm2, -0x1C0(%rsi) ++ vmovups %zmm2, -0x180(%rsi) ++ vmovups %zmm2, -0x140(%rsi) ++ vmovups %zmm2, -0x100(%rsi) ++ vmovups %zmm2, -0xC0(%rsi) ++ vmovups %zmm2, -0x80(%rsi) ++ vmovups %zmm2, -0x40(%rsi) ++ ret ++ ++/* Align on 64 and loop with aligned stores. */ ++L(1024bytesormore): ++ sub $0x100, %rsi ++ vmovups %zmm2, (%rax) ++ and $-0x40, %rdi ++ add $0x40, %rdi ++ ++L(gobble_256bytes_loop): ++ vmovaps %zmm2, (%rdi) ++ vmovaps %zmm2, 0x40(%rdi) ++ vmovaps %zmm2, 0x80(%rdi) ++ vmovaps %zmm2, 0xC0(%rdi) ++ add $0x100, %rdi ++ cmp %rsi, %rdi ++ jb L(gobble_256bytes_loop) ++ vmovups %zmm2, (%rsi) ++ vmovups %zmm2, 0x40(%rsi) ++ vmovups %zmm2, 0x80(%rsi) ++ vmovups %zmm2, 0xC0(%rsi) ++ ret ++ ++/* Align on 128 and loop with non-temporal stores. */ ++L(preloop_large): ++ and $-0x80, %rdi ++ add $0x80, %rdi ++ vmovups %zmm2, (%rax) ++ vmovups %zmm2, 0x40(%rax) ++ sub $0x200, %rsi ++ ++L(gobble_512bytes_nt_loop): ++ vmovntdq %zmm2, (%rdi) ++ vmovntdq %zmm2, 0x40(%rdi) ++ vmovntdq %zmm2, 0x80(%rdi) ++ vmovntdq %zmm2, 0xC0(%rdi) ++ vmovntdq %zmm2, 0x100(%rdi) ++ vmovntdq %zmm2, 0x140(%rdi) ++ vmovntdq %zmm2, 0x180(%rdi) ++ vmovntdq %zmm2, 0x1C0(%rdi) ++ add $0x200, %rdi ++ cmp %rsi, %rdi ++ jb L(gobble_512bytes_nt_loop) ++ sfence ++ vmovups %zmm2, (%rsi) ++ vmovups %zmm2, 0x40(%rsi) ++ vmovups %zmm2, 0x80(%rsi) ++ vmovups %zmm2, 0xC0(%rsi) ++ vmovups %zmm2, 0x100(%rsi) ++ vmovups %zmm2, 0x140(%rsi) ++ vmovups %zmm2, 0x180(%rsi) ++ vmovups %zmm2, 0x1C0(%rsi) ++ ret ++END (MEMSET) ++#endif +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memset.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset.S +@@ -29,6 +29,13 @@ ENTRY(memset) + HAS_ARCH_FEATURE (Prefer_SSE_for_memop) + jz 2f + leaq __memset_sse2(%rip), %rax ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ jz 2f ++ HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ jz 2f ++ leaq __memset_avx512_no_vzeroupper(%rip), %rax ++#endif + 2: ret + END(memset) + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memset_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memset_chk.S +@@ -30,6 +30,13 @@ ENTRY(__memset_chk) + HAS_ARCH_FEATURE (Prefer_SSE_for_memop) + jz 2f + leaq __memset_chk_sse2(%rip), %rax ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ jz 2f ++ HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ jz 2f ++ leaq __memset_chk_avx512_no_vzeroupper(%rip), %rax ++#endif + 2: ret + END(__memset_chk) + diff --git a/SOURCES/glibc-rh1298526-1.patch b/SOURCES/glibc-rh1298526-1.patch new file mode 100644 index 0000000..d364530 --- /dev/null +++ b/SOURCES/glibc-rh1298526-1.patch @@ -0,0 +1,725 @@ +commit 72276d6e8843db6df5971b06787f0a5e39bda138 +Author: Andrew Senkevich +Date: Sat Jan 16 00:49:45 2016 +0300 + + Added memcpy/memmove family optimized with AVX512 for KNL hardware. + + Added AVX512 implementations of memcpy, mempcpy, memmove, memcpy_chk, + mempcpy_chk, memmove_chk. + It shows average improvement more than 30% over AVX versions on KNL + hardware (performance results in the thread + ). + + * sysdeps/x86_64/multiarch/Makefile (sysdep_routines): Added new files. + * sysdeps/x86_64/multiarch/ifunc-impl-list.c: Added new tests. + * sysdeps/x86_64/multiarch/memcpy-avx512-no-vzeroupper.S: New file. + * sysdeps/x86_64/multiarch/mempcpy-avx512-no-vzeroupper.S: Likewise. + * sysdeps/x86_64/multiarch/memmove-avx512-no-vzeroupper.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy.S: Added new IFUNC branch. + * sysdeps/x86_64/multiarch/memcpy_chk.S: Likewise. + * sysdeps/x86_64/multiarch/memmove.c: Likewise. + * sysdeps/x86_64/multiarch/memmove_chk.c: Likewise. + * sysdeps/x86_64/multiarch/mempcpy.S: Likewise. + * sysdeps/x86_64/multiarch/mempcpy_chk.S: Likewise. + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/Makefile ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile +@@ -17,7 +17,8 @@ sysdep_routines += strncat-c stpncpy-c s + strcat-ssse3 strncat-ssse3 strlen-sse2-pminub \ + strnlen-sse2-no-bsf strrchr-sse2-no-bsf strchr-sse2-no-bsf \ + memcmp-ssse3 strstr-sse2-unaligned \ +- memset-avx512-no-vzeroupper ++ memset-avx512-no-vzeroupper memcpy-avx512-no-vzeroupper \ ++ mempcpy-avx512-no-vzeroupper memmove-avx512-no-vzeroupper + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c varshift + CFLAGS-varshift.c += -msse4 +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/ifunc-impl-list.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +@@ -24,7 +24,7 @@ + #include "init-arch.h" + + /* Maximum number of IFUNC implementations. */ +-#define MAX_IFUNC 4 ++#define MAX_IFUNC 5 + + /* Fill ARRAY of MAX elements with IFUNC implementations for function + NAME supported on target machine and return the number of valid +@@ -46,8 +46,11 @@ __libc_ifunc_impl_list (const char *name + __memcmp_ssse3) + IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2)) + +- /* Support sysdeps/x86_64/multiarch/memmove_chk.S. */ ++ /* Support sysdeps/x86_64/multiarch/memmove_chk.c. */ + IFUNC_IMPL (i, name, __memmove_chk, ++ IFUNC_IMPL_ADD (array, i, __memmove_chk, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __memmove_chk_avx512_no_vzeroupper) + IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), + __memmove_chk_ssse3_back) + IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), +@@ -57,6 +60,9 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/memmove.S. */ + IFUNC_IMPL (i, name, memmove, ++ IFUNC_IMPL_ADD (array, i, memmove, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __memmove_avx512_no_vzeroupper) + IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), + __memmove_ssse3_back) + IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), +@@ -263,6 +269,9 @@ __libc_ifunc_impl_list (const char *name + #ifdef SHARED + /* Support sysdeps/x86_64/multiarch/memcpy_chk.S. */ + IFUNC_IMPL (i, name, __memcpy_chk, ++ IFUNC_IMPL_ADD (array, i, __memcpy_chk, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __memcpy_chk_avx512_no_vzeroupper) + IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), + __memcpy_chk_ssse3_back) + IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), +@@ -274,11 +283,18 @@ __libc_ifunc_impl_list (const char *name + IFUNC_IMPL (i, name, memcpy, + IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), + __memcpy_ssse3_back) +- IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), __memcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), ++ __memcpy_ssse3) ++ IFUNC_IMPL_ADD (array, i, memcpy, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __memcpy_avx512_no_vzeroupper) + IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2)) + + /* Support sysdeps/x86_64/multiarch/mempcpy_chk.S. */ + IFUNC_IMPL (i, name, __mempcpy_chk, ++ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __mempcpy_chk_avx512_no_vzeroupper) + IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), + __mempcpy_chk_ssse3_back) + IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), +@@ -288,6 +304,9 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/mempcpy.S. */ + IFUNC_IMPL (i, name, mempcpy, ++ IFUNC_IMPL_ADD (array, i, mempcpy, ++ HAS_ARCH_FEATURE (AVX512F_Usable), ++ __mempcpy_avx512_no_vzeroupper) + IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), + __mempcpy_ssse3_back) + IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy-avx512-no-vzeroupper.S +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy-avx512-no-vzeroupper.S +@@ -0,0 +1,408 @@ ++/* memcpy optimized with AVX512 for KNL hardware. ++ Copyright (C) 2016 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++#if defined HAVE_AVX512_ASM_SUPPORT && IS_IN (libc) \ ++ && (defined SHARED \ ++ || defined USE_AS_MEMMOVE \ ++ || !defined USE_MULTIARCH) ++ ++#include "asm-syntax.h" ++#ifndef MEMCPY ++# define MEMCPY __memcpy_avx512_no_vzeroupper ++# define MEMCPY_CHK __memcpy_chk_avx512_no_vzeroupper ++#endif ++ ++ .section .text,"ax",@progbits ++#if !defined USE_AS_BCOPY ++ENTRY (MEMCPY_CHK) ++ cmpq %rdx, %rcx ++ jb HIDDEN_JUMPTARGET (__chk_fail) ++END (MEMCPY_CHK) ++#endif ++ ++ENTRY (MEMCPY) ++ mov %rdi, %rax ++#ifdef USE_AS_MEMPCPY ++ add %rdx, %rax ++#endif ++ lea (%rsi, %rdx), %rcx ++ lea (%rdi, %rdx), %r9 ++ cmp $512, %rdx ++ ja L(512bytesormore) ++ ++L(check): ++ cmp $16, %rdx ++ jbe L(less_16bytes) ++ cmp $256, %rdx ++ jb L(less_256bytes) ++ vmovups (%rsi), %zmm0 ++ vmovups 0x40(%rsi), %zmm1 ++ vmovups 0x80(%rsi), %zmm2 ++ vmovups 0xC0(%rsi), %zmm3 ++ vmovups -0x100(%rcx), %zmm4 ++ vmovups -0xC0(%rcx), %zmm5 ++ vmovups -0x80(%rcx), %zmm6 ++ vmovups -0x40(%rcx), %zmm7 ++ vmovups %zmm0, (%rdi) ++ vmovups %zmm1, 0x40(%rdi) ++ vmovups %zmm2, 0x80(%rdi) ++ vmovups %zmm3, 0xC0(%rdi) ++ vmovups %zmm4, -0x100(%r9) ++ vmovups %zmm5, -0xC0(%r9) ++ vmovups %zmm6, -0x80(%r9) ++ vmovups %zmm7, -0x40(%r9) ++ ret ++ ++L(less_256bytes): ++ cmp $128, %dl ++ jb L(less_128bytes) ++ vmovups (%rsi), %zmm0 ++ vmovups 0x40(%rsi), %zmm1 ++ vmovups -0x80(%rcx), %zmm2 ++ vmovups -0x40(%rcx), %zmm3 ++ vmovups %zmm0, (%rdi) ++ vmovups %zmm1, 0x40(%rdi) ++ vmovups %zmm2, -0x80(%r9) ++ vmovups %zmm3, -0x40(%r9) ++ ret ++ ++L(less_128bytes): ++ cmp $64, %dl ++ jb L(less_64bytes) ++ vmovdqu (%rsi), %ymm0 ++ vmovdqu 0x20(%rsi), %ymm1 ++ vmovdqu -0x40(%rcx), %ymm2 ++ vmovdqu -0x20(%rcx), %ymm3 ++ vmovdqu %ymm0, (%rdi) ++ vmovdqu %ymm1, 0x20(%rdi) ++ vmovdqu %ymm2, -0x40(%r9) ++ vmovdqu %ymm3, -0x20(%r9) ++ ret ++ ++L(less_64bytes): ++ cmp $32, %dl ++ jb L(less_32bytes) ++ vmovdqu (%rsi), %ymm0 ++ vmovdqu -0x20(%rcx), %ymm1 ++ vmovdqu %ymm0, (%rdi) ++ vmovdqu %ymm1, -0x20(%r9) ++ ret ++ ++L(less_32bytes): ++ vmovdqu (%rsi), %xmm0 ++ vmovdqu -0x10(%rcx), %xmm1 ++ vmovdqu %xmm0, (%rdi) ++ vmovdqu %xmm1, -0x10(%r9) ++ ret ++ ++L(less_16bytes): ++ cmp $8, %dl ++ jb L(less_8bytes) ++ movq (%rsi), %rsi ++ movq -0x8(%rcx), %rcx ++ movq %rsi, (%rdi) ++ movq %rcx, -0x8(%r9) ++ ret ++ ++L(less_8bytes): ++ cmp $4, %dl ++ jb L(less_4bytes) ++ mov (%rsi), %esi ++ mov -0x4(%rcx), %ecx ++ mov %esi, (%rdi) ++ mov %ecx, -0x4(%r9) ++ ret ++ ++L(less_4bytes): ++ cmp $2, %dl ++ jb L(less_2bytes) ++ mov (%rsi), %si ++ mov -0x2(%rcx), %cx ++ mov %si, (%rdi) ++ mov %cx, -0x2(%r9) ++ ret ++ ++L(less_2bytes): ++ cmp $1, %dl ++ jb L(less_1bytes) ++ mov (%rsi), %cl ++ mov %cl, (%rdi) ++L(less_1bytes): ++ ret ++ ++L(512bytesormore): ++#ifdef SHARED_CACHE_SIZE_HALF ++ mov $SHARED_CACHE_SIZE_HALF, %r8 ++#else ++ mov __x86_64_shared_cache_size_half(%rip), %r8 ++#endif ++ cmp %r8, %rdx ++ jae L(preloop_large) ++ cmp $1024, %rdx ++ ja L(1024bytesormore) ++ prefetcht1 (%rsi) ++ prefetcht1 0x40(%rsi) ++ prefetcht1 0x80(%rsi) ++ prefetcht1 0xC0(%rsi) ++ prefetcht1 0x100(%rsi) ++ prefetcht1 0x140(%rsi) ++ prefetcht1 0x180(%rsi) ++ prefetcht1 0x1C0(%rsi) ++ prefetcht1 -0x200(%rcx) ++ prefetcht1 -0x1C0(%rcx) ++ prefetcht1 -0x180(%rcx) ++ prefetcht1 -0x140(%rcx) ++ prefetcht1 -0x100(%rcx) ++ prefetcht1 -0xC0(%rcx) ++ prefetcht1 -0x80(%rcx) ++ prefetcht1 -0x40(%rcx) ++ vmovups (%rsi), %zmm0 ++ vmovups 0x40(%rsi), %zmm1 ++ vmovups 0x80(%rsi), %zmm2 ++ vmovups 0xC0(%rsi), %zmm3 ++ vmovups 0x100(%rsi), %zmm4 ++ vmovups 0x140(%rsi), %zmm5 ++ vmovups 0x180(%rsi), %zmm6 ++ vmovups 0x1C0(%rsi), %zmm7 ++ vmovups -0x200(%rcx), %zmm8 ++ vmovups -0x1C0(%rcx), %zmm9 ++ vmovups -0x180(%rcx), %zmm10 ++ vmovups -0x140(%rcx), %zmm11 ++ vmovups -0x100(%rcx), %zmm12 ++ vmovups -0xC0(%rcx), %zmm13 ++ vmovups -0x80(%rcx), %zmm14 ++ vmovups -0x40(%rcx), %zmm15 ++ vmovups %zmm0, (%rdi) ++ vmovups %zmm1, 0x40(%rdi) ++ vmovups %zmm2, 0x80(%rdi) ++ vmovups %zmm3, 0xC0(%rdi) ++ vmovups %zmm4, 0x100(%rdi) ++ vmovups %zmm5, 0x140(%rdi) ++ vmovups %zmm6, 0x180(%rdi) ++ vmovups %zmm7, 0x1C0(%rdi) ++ vmovups %zmm8, -0x200(%r9) ++ vmovups %zmm9, -0x1C0(%r9) ++ vmovups %zmm10, -0x180(%r9) ++ vmovups %zmm11, -0x140(%r9) ++ vmovups %zmm12, -0x100(%r9) ++ vmovups %zmm13, -0xC0(%r9) ++ vmovups %zmm14, -0x80(%r9) ++ vmovups %zmm15, -0x40(%r9) ++ ret ++ ++L(1024bytesormore): ++ cmp %rsi, %rdi ++ ja L(1024bytesormore_bkw) ++ sub $512, %r9 ++ vmovups -0x200(%rcx), %zmm8 ++ vmovups -0x1C0(%rcx), %zmm9 ++ vmovups -0x180(%rcx), %zmm10 ++ vmovups -0x140(%rcx), %zmm11 ++ vmovups -0x100(%rcx), %zmm12 ++ vmovups -0xC0(%rcx), %zmm13 ++ vmovups -0x80(%rcx), %zmm14 ++ vmovups -0x40(%rcx), %zmm15 ++ prefetcht1 (%rsi) ++ prefetcht1 0x40(%rsi) ++ prefetcht1 0x80(%rsi) ++ prefetcht1 0xC0(%rsi) ++ prefetcht1 0x100(%rsi) ++ prefetcht1 0x140(%rsi) ++ prefetcht1 0x180(%rsi) ++ prefetcht1 0x1C0(%rsi) ++ ++/* Loop with unaligned memory access. */ ++L(gobble_512bytes_loop): ++ vmovups (%rsi), %zmm0 ++ vmovups 0x40(%rsi), %zmm1 ++ vmovups 0x80(%rsi), %zmm2 ++ vmovups 0xC0(%rsi), %zmm3 ++ vmovups 0x100(%rsi), %zmm4 ++ vmovups 0x140(%rsi), %zmm5 ++ vmovups 0x180(%rsi), %zmm6 ++ vmovups 0x1C0(%rsi), %zmm7 ++ add $512, %rsi ++ prefetcht1 (%rsi) ++ prefetcht1 0x40(%rsi) ++ prefetcht1 0x80(%rsi) ++ prefetcht1 0xC0(%rsi) ++ prefetcht1 0x100(%rsi) ++ prefetcht1 0x140(%rsi) ++ prefetcht1 0x180(%rsi) ++ prefetcht1 0x1C0(%rsi) ++ vmovups %zmm0, (%rdi) ++ vmovups %zmm1, 0x40(%rdi) ++ vmovups %zmm2, 0x80(%rdi) ++ vmovups %zmm3, 0xC0(%rdi) ++ vmovups %zmm4, 0x100(%rdi) ++ vmovups %zmm5, 0x140(%rdi) ++ vmovups %zmm6, 0x180(%rdi) ++ vmovups %zmm7, 0x1C0(%rdi) ++ add $512, %rdi ++ cmp %r9, %rdi ++ jb L(gobble_512bytes_loop) ++ vmovups %zmm8, (%r9) ++ vmovups %zmm9, 0x40(%r9) ++ vmovups %zmm10, 0x80(%r9) ++ vmovups %zmm11, 0xC0(%r9) ++ vmovups %zmm12, 0x100(%r9) ++ vmovups %zmm13, 0x140(%r9) ++ vmovups %zmm14, 0x180(%r9) ++ vmovups %zmm15, 0x1C0(%r9) ++ ret ++ ++L(1024bytesormore_bkw): ++ add $512, %rdi ++ vmovups 0x1C0(%rsi), %zmm8 ++ vmovups 0x180(%rsi), %zmm9 ++ vmovups 0x140(%rsi), %zmm10 ++ vmovups 0x100(%rsi), %zmm11 ++ vmovups 0xC0(%rsi), %zmm12 ++ vmovups 0x80(%rsi), %zmm13 ++ vmovups 0x40(%rsi), %zmm14 ++ vmovups (%rsi), %zmm15 ++ prefetcht1 -0x40(%rcx) ++ prefetcht1 -0x80(%rcx) ++ prefetcht1 -0xC0(%rcx) ++ prefetcht1 -0x100(%rcx) ++ prefetcht1 -0x140(%rcx) ++ prefetcht1 -0x180(%rcx) ++ prefetcht1 -0x1C0(%rcx) ++ prefetcht1 -0x200(%rcx) ++ ++/* Backward loop with unaligned memory access. */ ++L(gobble_512bytes_loop_bkw): ++ vmovups -0x40(%rcx), %zmm0 ++ vmovups -0x80(%rcx), %zmm1 ++ vmovups -0xC0(%rcx), %zmm2 ++ vmovups -0x100(%rcx), %zmm3 ++ vmovups -0x140(%rcx), %zmm4 ++ vmovups -0x180(%rcx), %zmm5 ++ vmovups -0x1C0(%rcx), %zmm6 ++ vmovups -0x200(%rcx), %zmm7 ++ sub $512, %rcx ++ prefetcht1 -0x40(%rcx) ++ prefetcht1 -0x80(%rcx) ++ prefetcht1 -0xC0(%rcx) ++ prefetcht1 -0x100(%rcx) ++ prefetcht1 -0x140(%rcx) ++ prefetcht1 -0x180(%rcx) ++ prefetcht1 -0x1C0(%rcx) ++ prefetcht1 -0x200(%rcx) ++ vmovups %zmm0, -0x40(%r9) ++ vmovups %zmm1, -0x80(%r9) ++ vmovups %zmm2, -0xC0(%r9) ++ vmovups %zmm3, -0x100(%r9) ++ vmovups %zmm4, -0x140(%r9) ++ vmovups %zmm5, -0x180(%r9) ++ vmovups %zmm6, -0x1C0(%r9) ++ vmovups %zmm7, -0x200(%r9) ++ sub $512, %r9 ++ cmp %rdi, %r9 ++ ja L(gobble_512bytes_loop_bkw) ++ vmovups %zmm8, -0x40(%rdi) ++ vmovups %zmm9, -0x80(%rdi) ++ vmovups %zmm10, -0xC0(%rdi) ++ vmovups %zmm11, -0x100(%rdi) ++ vmovups %zmm12, -0x140(%rdi) ++ vmovups %zmm13, -0x180(%rdi) ++ vmovups %zmm14, -0x1C0(%rdi) ++ vmovups %zmm15, -0x200(%rdi) ++ ret ++ ++L(preloop_large): ++ cmp %rsi, %rdi ++ ja L(preloop_large_bkw) ++ vmovups (%rsi), %zmm4 ++ vmovups 0x40(%rsi), %zmm5 ++ ++/* Align destination for access with non-temporal stores in the loop. */ ++ mov %rdi, %r8 ++ and $-0x80, %rdi ++ add $0x80, %rdi ++ sub %rdi, %r8 ++ sub %r8, %rsi ++ add %r8, %rdx ++L(gobble_256bytes_nt_loop): ++ prefetcht1 0x200(%rsi) ++ prefetcht1 0x240(%rsi) ++ prefetcht1 0x280(%rsi) ++ prefetcht1 0x2C0(%rsi) ++ prefetcht1 0x300(%rsi) ++ prefetcht1 0x340(%rsi) ++ prefetcht1 0x380(%rsi) ++ prefetcht1 0x3C0(%rsi) ++ vmovdqu64 (%rsi), %zmm0 ++ vmovdqu64 0x40(%rsi), %zmm1 ++ vmovdqu64 0x80(%rsi), %zmm2 ++ vmovdqu64 0xC0(%rsi), %zmm3 ++ vmovntdq %zmm0, (%rdi) ++ vmovntdq %zmm1, 0x40(%rdi) ++ vmovntdq %zmm2, 0x80(%rdi) ++ vmovntdq %zmm3, 0xC0(%rdi) ++ sub $256, %rdx ++ add $256, %rsi ++ add $256, %rdi ++ cmp $256, %rdx ++ ja L(gobble_256bytes_nt_loop) ++ sfence ++ vmovups %zmm4, (%rax) ++ vmovups %zmm5, 0x40(%rax) ++ jmp L(check) ++ ++L(preloop_large_bkw): ++ vmovups -0x80(%rcx), %zmm4 ++ vmovups -0x40(%rcx), %zmm5 ++ ++/* Align end of destination for access with non-temporal stores. */ ++ mov %r9, %r8 ++ and $-0x80, %r9 ++ sub %r9, %r8 ++ sub %r8, %rcx ++ sub %r8, %rdx ++ add %r9, %r8 ++L(gobble_256bytes_nt_loop_bkw): ++ prefetcht1 -0x400(%rcx) ++ prefetcht1 -0x3C0(%rcx) ++ prefetcht1 -0x380(%rcx) ++ prefetcht1 -0x340(%rcx) ++ prefetcht1 -0x300(%rcx) ++ prefetcht1 -0x2C0(%rcx) ++ prefetcht1 -0x280(%rcx) ++ prefetcht1 -0x240(%rcx) ++ vmovdqu64 -0x100(%rcx), %zmm0 ++ vmovdqu64 -0xC0(%rcx), %zmm1 ++ vmovdqu64 -0x80(%rcx), %zmm2 ++ vmovdqu64 -0x40(%rcx), %zmm3 ++ vmovntdq %zmm0, -0x100(%r9) ++ vmovntdq %zmm1, -0xC0(%r9) ++ vmovntdq %zmm2, -0x80(%r9) ++ vmovntdq %zmm3, -0x40(%r9) ++ sub $256, %rdx ++ sub $256, %rcx ++ sub $256, %r9 ++ cmp $256, %rdx ++ ja L(gobble_256bytes_nt_loop_bkw) ++ sfence ++ vmovups %zmm4, -0x80(%r8) ++ vmovups %zmm5, -0x40(%r8) ++ jmp L(check) ++END (MEMCPY) ++#endif +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy.S +@@ -30,7 +30,15 @@ + ENTRY(__new_memcpy) + .type __new_memcpy, @gnu_indirect_function + LOAD_RTLD_GLOBAL_RO_RDX +- leaq __memcpy_sse2(%rip), %rax ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ jz 1f ++ HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ jz 1f ++ leaq __memcpy_avx512_no_vzeroupper(%rip), %rax ++ ret ++#endif ++1: leaq __memcpy_sse2(%rip), %rax + HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __memcpy_ssse3(%rip), %rax +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +@@ -30,7 +30,15 @@ + ENTRY(__memcpy_chk) + .type __memcpy_chk, @gnu_indirect_function + LOAD_RTLD_GLOBAL_RO_RDX +- leaq __memcpy_chk_sse2(%rip), %rax ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ jz 1f ++# HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++# jz 1f ++ leaq __memcpy_avx512_no_vzeroupper(%rip), %rax ++ ret ++#endif ++1: leaq __memcpy_chk_sse2(%rip), %rax + HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __memcpy_chk_ssse3(%rip), %rax +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove-avx512-no-vzeroupper.S +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove-avx512-no-vzeroupper.S +@@ -0,0 +1,22 @@ ++/* memmove optimized with AVX512 for KNL hardware. ++ Copyright (C) 2016 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define USE_AS_MEMMOVE ++#define MEMCPY __memmove_avx512_no_vzeroupper ++#define MEMCPY_CHK __memmove_chk_avx512_no_vzeroupper ++#include "memcpy-avx512-no-vzeroupper.S" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memmove.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove.c +@@ -35,6 +35,9 @@ + extern __typeof (__redirect_memmove) __memmove_sse2 attribute_hidden; + extern __typeof (__redirect_memmove) __memmove_ssse3 attribute_hidden; + extern __typeof (__redirect_memmove) __memmove_ssse3_back attribute_hidden; ++# ifdef HAVE_AVX512_ASM_SUPPORT ++extern __typeof (__redirect_memmove) __memmove_avx512_no_vzeroupper attribute_hidden; ++# endif + #endif + + #include "string/memmove.c" +@@ -47,10 +50,16 @@ extern __typeof (__redirect_memmove) __m + ifunc symbol properly. */ + extern __typeof (__redirect_memmove) __libc_memmove; + libc_ifunc (__libc_memmove, +- HAS_CPU_FEATURE (SSSE3) ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ && HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ ? __memmove_avx512_no_vzeroupper ++ : ++#endif ++ (HAS_CPU_FEATURE (SSSE3) + ? (HAS_ARCH_FEATURE (Fast_Copy_Backward) + ? __memmove_ssse3_back : __memmove_ssse3) +- : __memmove_sse2) ++ : __memmove_sse2)) + + strong_alias (__libc_memmove, memmove) + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove_chk.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memmove_chk.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memmove_chk.c +@@ -25,11 +25,20 @@ + extern __typeof (__memmove_chk) __memmove_chk_sse2 attribute_hidden; + extern __typeof (__memmove_chk) __memmove_chk_ssse3 attribute_hidden; + extern __typeof (__memmove_chk) __memmove_chk_ssse3_back attribute_hidden; ++# ifdef HAVE_AVX512_ASM_SUPPORT ++extern __typeof (__memmove_chk) __memmove_chk_avx512_no_vzeroupper attribute_hidden; ++# endif + + #include "debug/memmove_chk.c" + + libc_ifunc (__memmove_chk, +- HAS_CPU_FEATURE (SSSE3) ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ && HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ ? __memmove_chk_avx512_no_vzeroupper ++ : ++#endif ++ (HAS_CPU_FEATURE (SSSE3) + ? (HAS_ARCH_FEATURE (Fast_Copy_Backward) + ? __memmove_chk_ssse3_back : __memmove_chk_ssse3) +- : __memmove_chk_sse2); ++ : __memmove_chk_sse2)); +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy-avx512-no-vzeroupper.S +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy-avx512-no-vzeroupper.S +@@ -0,0 +1,22 @@ ++/* mempcpy optimized with AVX512 for KNL hardware. ++ Copyright (C) 2016 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define USE_AS_MEMPCPY ++#define MEMCPY __mempcpy_avx512_no_vzeroupper ++#define MEMCPY_CHK __mempcpy_chk_avx512_no_vzeroupper ++#include "memcpy-avx512-no-vzeroupper.S" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/mempcpy.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy.S +@@ -28,7 +28,15 @@ + ENTRY(__mempcpy) + .type __mempcpy, @gnu_indirect_function + LOAD_RTLD_GLOBAL_RO_RDX +- leaq __mempcpy_sse2(%rip), %rax ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ jz 1f ++ HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ jz 1f ++ leaq __mempcpy_avx512_no_vzeroupper(%rip), %rax ++ ret ++#endif ++1: leaq __mempcpy_sse2(%rip), %rax + HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __mempcpy_ssse3(%rip), %rax +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/mempcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/mempcpy_chk.S +@@ -30,7 +30,15 @@ + ENTRY(__mempcpy_chk) + .type __mempcpy_chk, @gnu_indirect_function + LOAD_RTLD_GLOBAL_RO_RDX +- leaq __mempcpy_chk_sse2(%rip), %rax ++#ifdef HAVE_AVX512_ASM_SUPPORT ++ HAS_ARCH_FEATURE (AVX512F_Usable) ++ jz 1f ++ HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ jz 1f ++ leaq __mempcpy_chk_avx512_no_vzeroupper(%rip), %rax ++ ret ++#endif ++1: leaq __mempcpy_chk_sse2(%rip), %rax + HAS_CPU_FEATURE (SSSE3) + jz 2f + leaq __mempcpy_chk_ssse3(%rip), %rax diff --git a/SOURCES/glibc-rh1298526-2.patch b/SOURCES/glibc-rh1298526-2.patch new file mode 100644 index 0000000..51d0806 --- /dev/null +++ b/SOURCES/glibc-rh1298526-2.patch @@ -0,0 +1,25 @@ +commit 214a44f3949624623bd9f5ced82a47915259324e +Author: Andrew Senkevich +Date: Sat Jan 16 14:42:26 2016 +0300 + + Fixed typos in __memcpy_chk. + + * sysdeps/x86_64/multiarch/memcpy_chk.S: Fixed typos. + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/memcpy_chk.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/memcpy_chk.S +@@ -33,9 +33,9 @@ ENTRY(__memcpy_chk) + #ifdef HAVE_AVX512_ASM_SUPPORT + HAS_ARCH_FEATURE (AVX512F_Usable) + jz 1f +-# HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) +-# jz 1f +- leaq __memcpy_avx512_no_vzeroupper(%rip), %rax ++ HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER) ++ jz 1f ++ leaq __memcpy_chk_avx512_no_vzeroupper(%rip), %rax + ret + #endif + 1: leaq __memcpy_chk_sse2(%rip), %rax diff --git a/SOURCES/glibc-rh1298526-3.patch b/SOURCES/glibc-rh1298526-3.patch new file mode 100644 index 0000000..80b7577 --- /dev/null +++ b/SOURCES/glibc-rh1298526-3.patch @@ -0,0 +1,82 @@ +commit df782dc690775d93b0cc1076655a9b92b5a44ad0 +Author: Andrew Senkevich +Date: Tue Jan 19 14:34:53 2016 +0300 + + Fixed build with assembler w/o AVX-512 support. + + * sysdeps/x86_64/multiarch/ifunc-impl-list.c: Fixed build with + assembler not supporting AVX-512. + +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/multiarch/ifunc-impl-list.c ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c +@@ -48,9 +48,11 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/memmove_chk.c. */ + IFUNC_IMPL (i, name, __memmove_chk, ++#ifdef HAVE_AVX512_ASM_SUPPORT + IFUNC_IMPL_ADD (array, i, __memmove_chk, + HAS_ARCH_FEATURE (AVX512F_Usable), + __memmove_chk_avx512_no_vzeroupper) ++#endif + IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), + __memmove_chk_ssse3_back) + IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3), +@@ -60,9 +62,11 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/memmove.S. */ + IFUNC_IMPL (i, name, memmove, ++#ifdef HAVE_AVX512_ASM_SUPPORT + IFUNC_IMPL_ADD (array, i, memmove, + HAS_ARCH_FEATURE (AVX512F_Usable), + __memmove_avx512_no_vzeroupper) ++#endif + IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), + __memmove_ssse3_back) + IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3), +@@ -269,9 +273,11 @@ __libc_ifunc_impl_list (const char *name + #ifdef SHARED + /* Support sysdeps/x86_64/multiarch/memcpy_chk.S. */ + IFUNC_IMPL (i, name, __memcpy_chk, ++#ifdef HAVE_AVX512_ASM_SUPPORT + IFUNC_IMPL_ADD (array, i, __memcpy_chk, + HAS_ARCH_FEATURE (AVX512F_Usable), + __memcpy_chk_avx512_no_vzeroupper) ++#endif + IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), + __memcpy_chk_ssse3_back) + IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3), +@@ -285,16 +291,20 @@ __libc_ifunc_impl_list (const char *name + __memcpy_ssse3_back) + IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), + __memcpy_ssse3) ++#ifdef HAVE_AVX512_ASM_SUPPORT + IFUNC_IMPL_ADD (array, i, memcpy, + HAS_ARCH_FEATURE (AVX512F_Usable), + __memcpy_avx512_no_vzeroupper) ++#endif + IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2)) + + /* Support sysdeps/x86_64/multiarch/mempcpy_chk.S. */ + IFUNC_IMPL (i, name, __mempcpy_chk, ++#ifdef HAVE_AVX512_ASM_SUPPORT + IFUNC_IMPL_ADD (array, i, __mempcpy_chk, + HAS_ARCH_FEATURE (AVX512F_Usable), + __mempcpy_chk_avx512_no_vzeroupper) ++#endif + IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), + __mempcpy_chk_ssse3_back) + IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3), +@@ -304,9 +314,11 @@ __libc_ifunc_impl_list (const char *name + + /* Support sysdeps/x86_64/multiarch/mempcpy.S. */ + IFUNC_IMPL (i, name, mempcpy, ++#ifdef HAVE_AVX512_ASM_SUPPORT + IFUNC_IMPL_ADD (array, i, mempcpy, + HAS_ARCH_FEATURE (AVX512F_Usable), + __mempcpy_avx512_no_vzeroupper) ++#endif + IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), + __mempcpy_ssse3_back) + IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3), diff --git a/SOURCES/glibc-rh1298526-4.patch b/SOURCES/glibc-rh1298526-4.patch new file mode 100644 index 0000000..a0c92f1 --- /dev/null +++ b/SOURCES/glibc-rh1298526-4.patch @@ -0,0 +1,61 @@ +Allows testing of AVX512 changes in a chroot (normally as root) +without build issues. + +commit d7e06450b9d730d7b62ba52f611585810fa902df +Author: Carlos O'Donell +Date: Tue Jul 16 17:55:43 2013 -0400 + + BZ #15711: Avoid circular dependency for syscall.h + + The generated header is compiled with `-ffreestanding' to avoid any + circular dependencies against the installed implementation headers. + Such a dependency would require the implementation header to be + installed before the generated header could be built (See bug 15711). + In current practice the generated header dependencies do not include + any of the implementation headers removed by the use of `-ffreestanding'. + + --- + + 2013-07-15 Carlos O'Donell + + [BZ #15711] + * sysdeps/unix/sysv/linux/Makefile ($(objpfx)bits/syscall%h): + Avoid system header dependency with -ffreestanding. + ($(objpfx)bits/syscall%d): Likewise. + +diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile +index f580635..94916a2 100644 +--- a/sysdeps/unix/sysv/linux/Makefile ++++ b/sysdeps/unix/sysv/linux/Makefile +@@ -50,6 +50,13 @@ tests += tst-clone + # be the condition for those options to use in a C #if condition. + # abi-includes may be defined to a list of headers to include + # in the generated header, if the default does not suffice. ++# ++# The generated header is compiled with `-ffreestanding' to avoid any ++# circular dependencies against the installed implementation headers. ++# Such a dependency would require the implementation header to be ++# installed before the generated header could be built (See bug 15711). ++# In current practice the generated header dependencies do not include ++# any of the implementation headers removed by the use of `-ffreestanding'. + + $(objpfx)bits/syscall%h $(objpfx)bits/syscall%d: ../sysdeps/unix/sysv/linux/sys/syscall.h + $(make-target-directory) +@@ -64,7 +71,7 @@ $(objpfx)bits/syscall%h $(objpfx)bits/syscall%d: ../sysdeps/unix/sysv/linux/sys/ + echo ''; \ + $(if $(abi-variants), \ + $(foreach v,$(abi-variants),\ +- $(CC) -E -MD -MP -MF $(@:.h=.d)-t$(v) -MT '$(@:.d=.h) $(@:.h=.d)' \ ++ $(CC) -ffreestanding -E -MD -MP -MF $(@:.h=.d)-t$(v) -MT '$(@:.d=.h) $(@:.h=.d)' \ + -x c $(sysincludes) $< $(abi-$(v)-options) \ + -D_LIBC -dM | \ + sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' | \ +@@ -75,7 +82,7 @@ $(objpfx)bits/syscall%h $(objpfx)bits/syscall%d: ../sysdeps/unix/sysv/linux/sys/ + $(if $(abi-$(v)-condition),echo '#endif';) \ + rm -f $(@:.d=.h).new$(v); \ + ), \ +- $(CC) -E -MD -MP -MF $(@:.h=.d)-t$(v) -MT '$(@:.d=.h) $(@:.h=.d)' \ ++ $(CC) -ffreestanding -E -MD -MP -MF $(@:.h=.d)-t$(v) -MT '$(@:.d=.h) $(@:.h=.d)' \ + -x c $(sysincludes) $< \ + -D_LIBC -dM | \ + sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' | \ diff --git a/SOURCES/glibc-rh1302086-1.patch b/SOURCES/glibc-rh1302086-1.patch new file mode 100644 index 0000000..2ed2fdc --- /dev/null +++ b/SOURCES/glibc-rh1302086-1.patch @@ -0,0 +1,35 @@ +commit 196f456b842ee96e1bf1e5ae6ed21ba427dee3f3 +Author: Marcus Shawcroft +Date: Tue Jan 7 16:16:35 2014 +0000 + + [AArch64] Fix FP_ROUNDMODE. + + [BZ #16387] Fix FP_ROUNDMODE to extract the correct bits from FPCR. + +diff --git a/ports/sysdeps/aarch64/fpu/fpu_control.h b/ports/sysdeps/aarch64/fpu/fpu_control.h +index 79ab5fb..6a265e8 100644 +--- a/ports/sysdeps/aarch64/fpu/fpu_control.h ++++ b/ports/sysdeps/aarch64/fpu/fpu_control.h +@@ -59,6 +59,9 @@ + E E D D + E E + */ ++ ++#define _FPU_FPCR_RM_MASK 0xc00000 ++ + #define _FPU_FPCR_MASK_IXE 0x1000 + #define _FPU_FPCR_MASK_UFE 0x0800 + #define _FPU_FPCR_MASK_OFE 0x0400 +diff --git a/ports/sysdeps/aarch64/soft-fp/sfp-machine.h b/ports/sysdeps/aarch64/soft-fp/sfp-machine.h +index d21d00a..9bb94e5 100644 +--- a/ports/sysdeps/aarch64/soft-fp/sfp-machine.h ++++ b/ports/sysdeps/aarch64/soft-fp/sfp-machine.h +@@ -47,7 +47,7 @@ + + #define _FP_DECL_EX fpu_control_t _fcw + +-#define FP_ROUNDMODE (_fcw & 0x3) ++#define FP_ROUNDMODE (_fcw & _FPU_FPCR_RM_MASK) + + #define FP_RND_NEAREST FE_TONEAREST + #define FP_RND_ZERO FE_TOWARDZERO diff --git a/SOURCES/glibc-rh1302086-10.patch b/SOURCES/glibc-rh1302086-10.patch new file mode 100644 index 0000000..f466f41 --- /dev/null +++ b/SOURCES/glibc-rh1302086-10.patch @@ -0,0 +1,205 @@ +commit e6d90d675d4cae810be76a5ff41b8ae8bd6bc914 +Author: Wilco Dijkstra +Date: Mon Jun 23 17:15:41 2014 +0100 + + Add generic HAVE_RM_CTX implementation + + This patch adds a generic implementation of HAVE_RM_CTX using standard + fenv calls. As a result math functions using SET_RESTORE_ROUND* macros + do not suffer from a large slowdown on targets which do not implement + optimized libc_fe*_ctx inline functions. Most of the libc_fe* inline + functions are now unused and could be removed in the future (there are + a few math functions left which use a mixture of standard fenv calls + and libc_fe* inline functions - they could be updated to use + SET_RESTORE_ROUND or improved to avoid expensive fenv manipulations + across just a few FP instructions). + + libc_feholdsetround*_noex_ctx is added to enable better optimization of + SET_RESTORE_ROUND_NOEX* implementations. + + Performance measurements on ARM and x86 of sin() show significant gains + over the current default, fairly close to a highly optimized fenv_private: + + ARM x86 + no fenv_private : 100% 100% + generic HAVE_RM_CTX : 250% 350% + fenv_private (CTX) : 250% 450% + + 2014-06-23 Will Newton + Wilco + + * sysdeps/generic/math_private.h: Add generic HAVE_RM_CTX + implementation. Include get-rounding-mode.h. + [!HAVE_RM_CTX]: Define HAVE_RM_CTX to zero. + [!libc_feholdsetround_noex_ctx]: Define + libc_feholdsetround_noex_ctx. + [!libc_feholdsetround_noexf_ctx]: Define + libc_feholdsetround_noexf_ctx. + [!libc_feholdsetround_noexl_ctx]: Define + libc_feholdsetround_noexl_ctx. + (libc_feholdsetround_ctx): New function. + (libc_feresetround_ctx): New function. + (libc_feholdsetround_noex_ctx): New function. + (libc_feresetround_noex_ctx): New function. + +diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h +index 9b881a3..94c1e4a 100644 +--- a/sysdeps/generic/math_private.h ++++ b/sysdeps/generic/math_private.h +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + /* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * +@@ -551,12 +552,26 @@ default_libc_feupdateenv_test (fenv_t *e, int ex) + # define libc_feresetround_noexl libc_fesetenvl + #endif + ++#ifndef HAVE_RM_CTX ++# define HAVE_RM_CTX 0 ++#endif ++ + #if HAVE_RM_CTX + /* Set/Restore Rounding Modes only when necessary. If defined, these functions + set/restore floating point state only if the state needed within the lexical + block is different from the current state. This saves a lot of time when + the floating point unit is much slower than the fixed point units. */ + ++# ifndef libc_feholdsetround_noex_ctx ++# define libc_feholdsetround_noex_ctx libc_feholdsetround_ctx ++# endif ++# ifndef libc_feholdsetround_noexf_ctx ++# define libc_feholdsetround_noexf_ctx libc_feholdsetroundf_ctx ++# endif ++# ifndef libc_feholdsetround_noexl_ctx ++# define libc_feholdsetround_noexl_ctx libc_feholdsetroundl_ctx ++# endif ++ + # ifndef libc_feresetround_noex_ctx + # define libc_feresetround_noex_ctx libc_fesetenv_ctx + # endif +@@ -567,24 +582,80 @@ default_libc_feupdateenv_test (fenv_t *e, int ex) + # define libc_feresetround_noexl_ctx libc_fesetenvl_ctx + # endif + +-# ifndef libc_feholdsetround_53bit_ctx +-# define libc_feholdsetround_53bit_ctx libc_feholdsetround_ctx +-# endif ++#else + +-# ifndef libc_feresetround_53bit_ctx +-# define libc_feresetround_53bit_ctx libc_feresetround_ctx +-# endif ++/* Default implementation using standard fenv functions. ++ Avoid unnecessary rounding mode changes by first checking the ++ current rounding mode. Note the use of __glibc_unlikely is ++ important for performance. */ + +-# define SET_RESTORE_ROUND_GENERIC(RM,ROUNDFUNC,CLEANUPFUNC) \ +- struct rm_ctx ctx __attribute__((cleanup(CLEANUPFUNC ## _ctx))); \ +- ROUNDFUNC ## _ctx (&ctx, (RM)) +-#else +-# define SET_RESTORE_ROUND_GENERIC(RM, ROUNDFUNC, CLEANUPFUNC) \ +- fenv_t __libc_save_rm __attribute__((cleanup(CLEANUPFUNC))); \ +- ROUNDFUNC (&__libc_save_rm, (RM)) ++static __always_inline void ++libc_feholdsetround_ctx (struct rm_ctx *ctx, int round) ++{ ++ ctx->updated_status = false; ++ ++ /* Update rounding mode only if different. */ ++ if (__glibc_unlikely (round != get_rounding_mode ())) ++ { ++ ctx->updated_status = true; ++ fegetenv (&ctx->env); ++ fesetround (round); ++ } ++} ++ ++static __always_inline void ++libc_feresetround_ctx (struct rm_ctx *ctx) ++{ ++ /* Restore the rounding mode if updated. */ ++ if (__glibc_unlikely (ctx->updated_status)) ++ feupdateenv (&ctx->env); ++} ++ ++static __always_inline void ++libc_feholdsetround_noex_ctx (struct rm_ctx *ctx, int round) ++{ ++ /* Save exception flags and rounding mode. */ ++ fegetenv (&ctx->env); ++ ++ /* Update rounding mode only if different. */ ++ if (__glibc_unlikely (round != get_rounding_mode ())) ++ fesetround (round); ++} ++ ++static __always_inline void ++libc_feresetround_noex_ctx (struct rm_ctx *ctx) ++{ ++ /* Restore exception flags and rounding mode. */ ++ fesetenv (&ctx->env); ++} ++ ++# define libc_feholdsetroundf_ctx libc_feholdsetround_ctx ++# define libc_feholdsetroundl_ctx libc_feholdsetround_ctx ++# define libc_feresetroundf_ctx libc_feresetround_ctx ++# define libc_feresetroundl_ctx libc_feresetround_ctx ++ ++# define libc_feholdsetround_noexf_ctx libc_feholdsetround_noex_ctx ++# define libc_feholdsetround_noexl_ctx libc_feholdsetround_noex_ctx ++# define libc_feresetround_noexf_ctx libc_feresetround_noex_ctx ++# define libc_feresetround_noexl_ctx libc_feresetround_noex_ctx ++ ++#endif ++ ++#ifndef libc_feholdsetround_53bit_ctx ++# define libc_feholdsetround_53bit_ctx libc_feholdsetround_ctx ++#endif ++#ifndef libc_feresetround_53bit_ctx ++# define libc_feresetround_53bit_ctx libc_feresetround_ctx + #endif + +-/* Save and restore the rounding mode within a lexical block. */ ++#define SET_RESTORE_ROUND_GENERIC(RM,ROUNDFUNC,CLEANUPFUNC) \ ++ struct rm_ctx ctx __attribute__((cleanup (CLEANUPFUNC ## _ctx))); \ ++ ROUNDFUNC ## _ctx (&ctx, (RM)) ++ ++/* Set the rounding mode within a lexical block. Restore the rounding mode to ++ the value at the start of the block. The exception mode must be preserved. ++ Exceptions raised within the block must be set in the exception flags. ++ Non-stop mode may be enabled inside the block. */ + + #define SET_RESTORE_ROUND(RM) \ + SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround, libc_feresetround) +@@ -593,15 +664,21 @@ default_libc_feupdateenv_test (fenv_t *e, int ex) + #define SET_RESTORE_ROUNDL(RM) \ + SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetroundl, libc_feresetroundl) + +-/* Save and restore the rounding mode within a lexical block, and also +- the set of exceptions raised within the block may be discarded. */ ++/* Set the rounding mode within a lexical block. Restore the rounding mode to ++ the value at the start of the block. The exception mode must be preserved. ++ Exceptions raised within the block must be discarded, and exception flags ++ are restored to the value at the start of the block. ++ Non-stop mode may be enabled inside the block. */ + + #define SET_RESTORE_ROUND_NOEX(RM) \ +- SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround, libc_feresetround_noex) ++ SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround_noex, \ ++ libc_feresetround_noex) + #define SET_RESTORE_ROUND_NOEXF(RM) \ +- SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetroundf, libc_feresetround_noexf) ++ SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround_noexf, \ ++ libc_feresetround_noexf) + #define SET_RESTORE_ROUND_NOEXL(RM) \ +- SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetroundl, libc_feresetround_noexl) ++ SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround_noexl, \ ++ libc_feresetround_noexl) + + /* Like SET_RESTORE_ROUND, but also set rounding precision to 53 bits. */ + #define SET_RESTORE_ROUND_53BIT(RM) \ diff --git a/SOURCES/glibc-rh1302086-11.patch b/SOURCES/glibc-rh1302086-11.patch new file mode 100644 index 0000000..be5596e --- /dev/null +++ b/SOURCES/glibc-rh1302086-11.patch @@ -0,0 +1,61 @@ +commit 656b84c2ef525e3b69802c9057c5897e327b0332 +Author: Wilco Dijkstra +Date: Thu Aug 7 16:29:55 2014 +0000 + + This patch adds new function libc_feholdsetround_noex_aarch64_ctx, enabling + further optimization. libc_feholdsetround_aarch64_ctx now only needs to + read the FPCR in the typical case, avoiding a redundant FPSR read. + Performance results show a good improvement (5-10% on sin()) on cores with + expensive FPCR/FPSR instructions. + +diff --git a/ports/sysdeps/aarch64/fpu/math_private.h b/ports/sysdeps/aarch64/fpu/math_private.h +index 023c9d0..b13c030 100644 +--- a/ports/sysdeps/aarch64/fpu/math_private.h ++++ b/ports/sysdeps/aarch64/fpu/math_private.h +@@ -228,12 +228,9 @@ static __always_inline void + libc_feholdsetround_aarch64_ctx (struct rm_ctx *ctx, int r) + { + fpu_control_t fpcr; +- fpu_fpsr_t fpsr; + int round; + + _FPU_GETCW (fpcr); +- _FPU_GETFPSR (fpsr); +- ctx->env.__fpsr = fpsr; + + /* Check whether rounding modes are different. */ + round = (fpcr ^ r) & _FPU_FPCR_RM_MASK; +@@ -264,6 +261,33 @@ libc_feresetround_aarch64_ctx (struct rm_ctx *ctx) + #define libc_feresetroundl_ctx libc_feresetround_aarch64_ctx + + static __always_inline void ++libc_feholdsetround_noex_aarch64_ctx (struct rm_ctx *ctx, int r) ++{ ++ fpu_control_t fpcr; ++ fpu_fpsr_t fpsr; ++ int round; ++ ++ _FPU_GETCW (fpcr); ++ _FPU_GETFPSR (fpsr); ++ ctx->env.__fpsr = fpsr; ++ ++ /* Check whether rounding modes are different. */ ++ round = (fpcr ^ r) & _FPU_FPCR_RM_MASK; ++ ctx->updated_status = round != 0; ++ ++ /* Set the rounding mode if changed. */ ++ if (__glibc_unlikely (round != 0)) ++ { ++ ctx->env.__fpcr = fpcr; ++ _FPU_SETCW (fpcr ^ round); ++ } ++} ++ ++#define libc_feholdsetround_noex_ctx libc_feholdsetround_noex_aarch64_ctx ++#define libc_feholdsetround_noexf_ctx libc_feholdsetround_noex_aarch64_ctx ++#define libc_feholdsetround_noexl_ctx libc_feholdsetround_noex_aarch64_ctx ++ ++static __always_inline void + libc_feresetround_noex_aarch64_ctx (struct rm_ctx *ctx) + { + /* Restore the rounding mode if updated. */ diff --git a/SOURCES/glibc-rh1302086-2.patch b/SOURCES/glibc-rh1302086-2.patch new file mode 100644 index 0000000..1618aad --- /dev/null +++ b/SOURCES/glibc-rh1302086-2.patch @@ -0,0 +1,226 @@ +commit 7e0b6763e96ef9706ea9ecc7fad83fc97b837913 +Author: Ian Bolton +Date: Wed Apr 16 14:41:52 2014 +0000 + + [AArch64] Provide initial implementation of math_private.h. + +diff --git a/ports/sysdeps/aarch64/fpu/math_private.h b/ports/sysdeps/aarch64/fpu/math_private.h +new file mode 100644 +index 0000000..dbf203d +--- /dev/null ++++ b/ports/sysdeps/aarch64/fpu/math_private.h +@@ -0,0 +1,214 @@ ++/* Private floating point rounding and exceptions handling. AArch64 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef AARCH64_MATH_PRIVATE_H ++#define AARCH64_MATH_PRIVATE_H 1 ++ ++#include ++#include ++ ++static __always_inline void ++libc_feholdexcept_aarch64 (fenv_t *envp) ++{ ++ fpu_control_t fpcr, new_fpcr, fpsr, new_fpsr; ++ ++ _FPU_GETCW (fpcr); ++ _FPU_GETFPSR (fpsr); ++ envp->__fpcr = fpcr; ++ envp->__fpsr = fpsr; ++ ++ /* Clear exception flags and set all exceptions to non-stop. */ ++ new_fpcr = fpcr & ~(FE_ALL_EXCEPT << FE_EXCEPT_SHIFT); ++ new_fpsr = fpsr & ~FE_ALL_EXCEPT; ++ ++ if (__glibc_unlikely (new_fpcr != fpcr)) ++ _FPU_SETCW (new_fpcr); ++ ++ if (new_fpsr != fpsr) ++ _FPU_SETFPSR (new_fpsr); ++} ++ ++#define libc_feholdexcept libc_feholdexcept_aarch64 ++#define libc_feholdexceptf libc_feholdexcept_aarch64 ++#define libc_feholdexceptl libc_feholdexcept_aarch64 ++ ++static __always_inline void ++libc_fesetround_aarch64 (int round) ++{ ++ fpu_control_t fpcr; ++ ++ _FPU_GETCW (fpcr); ++ ++ /* Check whether rounding modes are different. */ ++ round = (fpcr ^ round) & FE_TOWARDZERO; ++ ++ /* Set new rounding mode if different. */ ++ if (__glibc_unlikely (round != 0)) ++ _FPU_SETCW (fpcr ^ round); ++} ++ ++#define libc_fesetround libc_fesetround_aarch64 ++#define libc_fesetroundf libc_fesetround_aarch64 ++#define libc_fesetroundl libc_fesetround_aarch64 ++ ++static __always_inline void ++libc_feholdexcept_setround_aarch64 (fenv_t *envp, int round) ++{ ++ fpu_control_t fpcr, new_fpcr, fpsr, new_fpsr; ++ ++ _FPU_GETCW (fpcr); ++ _FPU_GETFPSR (fpsr); ++ envp->__fpcr = fpcr; ++ envp->__fpsr = fpsr; ++ ++ /* Clear exception flags, set all exceptions to non-stop, ++ and set new rounding mode. */ ++ new_fpcr = fpcr & ~((FE_ALL_EXCEPT << FE_EXCEPT_SHIFT) | FE_TOWARDZERO); ++ new_fpcr |= round; ++ new_fpsr = fpsr & ~FE_ALL_EXCEPT; ++ ++ if (__glibc_unlikely (new_fpcr != fpcr)) ++ _FPU_SETCW (new_fpcr); ++ ++ if (new_fpsr != fpsr) ++ _FPU_SETFPSR (new_fpsr); ++} ++ ++#define libc_feholdexcept_setround libc_feholdexcept_setround_aarch64 ++#define libc_feholdexcept_setroundf libc_feholdexcept_setround_aarch64 ++#define libc_feholdexcept_setroundl libc_feholdexcept_setround_aarch64 ++ ++static __always_inline int ++libc_fetestexcept_aarch64 (int ex) ++{ ++ fpu_control_t fpsr; ++ ++ _FPU_GETFPSR (fpsr); ++ return fpsr & ex & FE_ALL_EXCEPT; ++} ++ ++#define libc_fetestexcept libc_fetestexcept_aarch64 ++#define libc_fetestexceptf libc_fetestexcept_aarch64 ++#define libc_fetestexceptl libc_fetestexcept_aarch64 ++ ++static __always_inline void ++libc_fesetenv_aarch64 (const fenv_t *envp) ++{ ++ fpu_control_t fpcr, new_fpcr; ++ ++ _FPU_GETCW (fpcr); ++ new_fpcr = envp->__fpcr; ++ ++ if (__glibc_unlikely (fpcr != new_fpcr)) ++ _FPU_SETCW (new_fpcr); ++ ++ _FPU_SETFPSR (envp->__fpsr); ++} ++ ++#define libc_fesetenv libc_fesetenv_aarch64 ++#define libc_fesetenvf libc_fesetenv_aarch64 ++#define libc_fesetenvl libc_fesetenv_aarch64 ++#define libc_feresetround_noex libc_fesetenv_aarch64 ++#define libc_feresetround_noexf libc_fesetenv_aarch64 ++#define libc_feresetround_noexl libc_fesetenv_aarch64 ++ ++static __always_inline int ++libc_feupdateenv_test_aarch64 (const fenv_t *envp, int ex) ++{ ++ fpu_control_t fpcr, new_fpcr, fpsr, new_fpsr; ++ int excepts; ++ ++ _FPU_GETCW (fpcr); ++ _FPU_GETFPSR (fpsr); ++ ++ /* Merge current exception flags with the saved fenv. */ ++ excepts = fpsr & FE_ALL_EXCEPT; ++ new_fpcr = envp->__fpcr; ++ new_fpsr = envp->__fpsr | excepts; ++ ++ if (__glibc_unlikely (fpcr != new_fpcr)) ++ _FPU_SETCW (new_fpcr); ++ ++ if (fpsr != new_fpsr) ++ _FPU_SETFPSR (new_fpsr); ++ ++ /* Raise the exceptions if enabled in the new FP state. */ ++ if (__glibc_unlikely (excepts & (new_fpcr >> FE_EXCEPT_SHIFT))) ++ feraiseexcept (excepts); ++ ++ return excepts & ex; ++} ++ ++#define libc_feupdateenv_test libc_feupdateenv_test_aarch64 ++#define libc_feupdateenv_testf libc_feupdateenv_test_aarch64 ++#define libc_feupdateenv_testl libc_feupdateenv_test_aarch64 ++ ++static __always_inline void ++libc_feupdateenv_aarch64 (const fenv_t *envp) ++{ ++ libc_feupdateenv_test_aarch64 (envp, 0); ++} ++ ++#define libc_feupdateenv libc_feupdateenv_aarch64 ++#define libc_feupdateenvf libc_feupdateenv_aarch64 ++#define libc_feupdateenvl libc_feupdateenv_aarch64 ++ ++static __always_inline void ++libc_feholdsetround_aarch64 (fenv_t *envp, int round) ++{ ++ fpu_control_t fpcr, fpsr; ++ ++ _FPU_GETCW (fpcr); ++ _FPU_GETFPSR (fpsr); ++ envp->__fpcr = fpcr; ++ envp->__fpsr = fpsr; ++ ++ /* Check whether rounding modes are different. */ ++ round = (fpcr ^ round) & FE_TOWARDZERO; ++ ++ /* Set new rounding mode if different. */ ++ if (__glibc_unlikely (round != 0)) ++ _FPU_SETCW (fpcr ^ round); ++} ++ ++#define libc_feholdsetround libc_feholdsetround_aarch64 ++#define libc_feholdsetroundf libc_feholdsetround_aarch64 ++#define libc_feholdsetroundl libc_feholdsetround_aarch64 ++ ++static __always_inline void ++libc_feresetround_aarch64 (fenv_t *envp) ++{ ++ fpu_control_t fpcr, round; ++ ++ _FPU_GETCW (fpcr); ++ ++ /* Check whether rounding modes are different. */ ++ round = (envp->__fpcr ^ fpcr) & FE_TOWARDZERO; ++ ++ /* Restore the rounding mode if it was changed. */ ++ if (__glibc_unlikely (round != 0)) ++ _FPU_SETCW (fpcr ^ round); ++} ++ ++#define libc_feresetround libc_feresetround_aarch64 ++#define libc_feresetroundf libc_feresetround_aarch64 ++#define libc_feresetroundl libc_feresetround_aarch64 ++ ++#include_next ++ ++#endif diff --git a/SOURCES/glibc-rh1302086-3.patch b/SOURCES/glibc-rh1302086-3.patch new file mode 100644 index 0000000..ef5a995 --- /dev/null +++ b/SOURCES/glibc-rh1302086-3.patch @@ -0,0 +1,72 @@ +commit bc93ab2946efe008bb0ce2d4d3c212bd01384fca +Author: Ian Bolton +Date: Wed Apr 16 23:41:04 2014 +0100 + + [AArch64] Define HAVE_RM_CTX and related hooks. + +diff --git a/ports/sysdeps/aarch64/fpu/math_private.h b/ports/sysdeps/aarch64/fpu/math_private.h +index dbf203d..7424952 100644 +--- a/ports/sysdeps/aarch64/fpu/math_private.h ++++ b/ports/sysdeps/aarch64/fpu/math_private.h +@@ -209,6 +209,61 @@ libc_feresetround_aarch64 (fenv_t *envp) + #define libc_feresetroundf libc_feresetround_aarch64 + #define libc_feresetroundl libc_feresetround_aarch64 + ++/* We have support for rounding mode context. */ ++#define HAVE_RM_CTX 1 ++ ++static __always_inline void ++libc_feholdsetround_aarch64_ctx (struct rm_ctx *ctx, int r) ++{ ++ fpu_control_t fpcr, fpsr, round; ++ ++ _FPU_GETCW (fpcr); ++ _FPU_GETFPSR (fpsr); ++ ctx->env.__fpsr = fpsr; ++ ++ /* Check whether rounding modes are different. */ ++ round = (fpcr ^ r) & FE_TOWARDZERO; ++ ctx->updated_status = round != 0; ++ ++ /* Set the rounding mode if changed. */ ++ if (__glibc_unlikely (round != 0)) ++ { ++ ctx->env.__fpcr = fpcr; ++ _FPU_SETCW (fpcr ^ round); ++ } ++} ++ ++#define libc_feholdsetround_ctx libc_feholdsetround_aarch64_ctx ++#define libc_feholdsetroundf_ctx libc_feholdsetround_aarch64_ctx ++#define libc_feholdsetroundl_ctx libc_feholdsetround_aarch64_ctx ++ ++static __always_inline void ++libc_feresetround_aarch64_ctx (struct rm_ctx *ctx) ++{ ++ /* Restore the rounding mode if updated. */ ++ if (__glibc_unlikely (ctx->updated_status)) ++ _FPU_SETCW (ctx->env.__fpcr); ++} ++ ++#define libc_feresetround_ctx libc_feresetround_aarch64_ctx ++#define libc_feresetroundf_ctx libc_feresetround_aarch64_ctx ++#define libc_feresetroundl_ctx libc_feresetround_aarch64_ctx ++ ++static __always_inline void ++libc_feresetround_noex_aarch64_ctx (struct rm_ctx *ctx) ++{ ++ /* Restore the rounding mode if updated. */ ++ if (__glibc_unlikely (ctx->updated_status)) ++ _FPU_SETCW (ctx->env.__fpcr); ++ ++ /* Write new FPSR to restore exception flags. */ ++ _FPU_SETFPSR (ctx->env.__fpsr); ++} ++ ++#define libc_feresetround_noex_ctx libc_feresetround_noex_aarch64_ctx ++#define libc_feresetround_noexf_ctx libc_feresetround_noex_aarch64_ctx ++#define libc_feresetround_noexl_ctx libc_feresetround_noex_aarch64_ctx ++ + #include_next + + #endif diff --git a/SOURCES/glibc-rh1302086-4.patch b/SOURCES/glibc-rh1302086-4.patch new file mode 100644 index 0000000..01acc8c --- /dev/null +++ b/SOURCES/glibc-rh1302086-4.patch @@ -0,0 +1,34 @@ +commit 39e6cd8d643779188fd43d9e2d5ed4e47a64d924 +Author: Ian Bolton +Date: Thu Apr 17 15:31:01 2014 +0000 + + Add fenv test support for AArch64. + +diff --git a/ports/sysdeps/aarch64/math-tests.h b/ports/sysdeps/aarch64/math-tests.h +new file mode 100644 +index 0000000..6a0b898 +--- /dev/null ++++ b/ports/sysdeps/aarch64/math-tests.h +@@ -0,0 +1,22 @@ ++/* Configuration for math tests. AArch64 version. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* Trapping exceptions are optional on AArch64. */ ++#define EXCEPTION_ENABLE_SUPPORTED(EXCEPT) ((EXCEPT) == 0) ++ ++#include_next diff --git a/SOURCES/glibc-rh1302086-5.patch b/SOURCES/glibc-rh1302086-5.patch new file mode 100644 index 0000000..5332152 --- /dev/null +++ b/SOURCES/glibc-rh1302086-5.patch @@ -0,0 +1,229 @@ +commit e5e0d9a4f632735cf3bb440eecb5caee5eea44c1 +Author: Ian Bolton +Date: Thu Apr 24 07:15:33 2014 +0100 + + [AArch64] Suppress unnecessary FPSR and FPCR writes. + +diff --git a/ports/sysdeps/aarch64/fpu/fclrexcpt.c b/ports/sysdeps/aarch64/fpu/fclrexcpt.c +index 531269f..b24f0ff 100644 +--- a/ports/sysdeps/aarch64/fpu/fclrexcpt.c ++++ b/ports/sysdeps/aarch64/fpu/fclrexcpt.c +@@ -23,13 +23,15 @@ int + feclearexcept (int excepts) + { + fpu_fpsr_t fpsr; ++ fpu_fpsr_t fpsr_new; + + excepts &= FE_ALL_EXCEPT; + + _FPU_GETFPSR (fpsr); +- fpsr = (fpsr & ~FE_ALL_EXCEPT) | (fpsr & FE_ALL_EXCEPT & ~excepts); ++ fpsr_new = (fpsr & ~FE_ALL_EXCEPT) | (fpsr & FE_ALL_EXCEPT & ~excepts); + +- _FPU_SETFPSR (fpsr); ++ if (fpsr != fpsr_new) ++ _FPU_SETFPSR (fpsr_new); + + return 0; + } +diff --git a/ports/sysdeps/aarch64/fpu/fedisblxcpt.c b/ports/sysdeps/aarch64/fpu/fedisblxcpt.c +index 719d52f..c43335c 100644 +--- a/ports/sysdeps/aarch64/fpu/fedisblxcpt.c ++++ b/ports/sysdeps/aarch64/fpu/fedisblxcpt.c +@@ -23,6 +23,7 @@ int + fedisableexcept (int excepts) + { + fpu_control_t fpcr; ++ fpu_control_t fpcr_new; + int original_excepts; + + _FPU_GETCW (fpcr); +@@ -31,9 +32,10 @@ fedisableexcept (int excepts) + + excepts &= FE_ALL_EXCEPT; + +- fpcr &= ~(excepts << FE_EXCEPT_SHIFT); ++ fpcr_new = fpcr & ~(excepts << FE_EXCEPT_SHIFT); + +- _FPU_SETCW (fpcr); ++ if (fpcr != fpcr_new) ++ _FPU_SETCW (fpcr_new); + + return original_excepts; + } +diff --git a/ports/sysdeps/aarch64/fpu/feenablxcpt.c b/ports/sysdeps/aarch64/fpu/feenablxcpt.c +index 07a4bbb..70e413c 100644 +--- a/ports/sysdeps/aarch64/fpu/feenablxcpt.c ++++ b/ports/sysdeps/aarch64/fpu/feenablxcpt.c +@@ -23,6 +23,7 @@ int + feenableexcept (int excepts) + { + fpu_control_t fpcr; ++ fpu_control_t fpcr_new; + int original_excepts; + + _FPU_GETCW (fpcr); +@@ -31,9 +32,10 @@ feenableexcept (int excepts) + + excepts &= FE_ALL_EXCEPT; + +- fpcr |= (excepts << FE_EXCEPT_SHIFT); ++ fpcr_new = fpcr | (excepts << FE_EXCEPT_SHIFT); + +- _FPU_SETCW (fpcr); ++ if (fpcr != fpcr_new) ++ _FPU_SETCW (fpcr_new); + + /* Trapping exceptions are optional in AArch64 the relevant enable + bits in FPCR are RES0 hence the absence of support can be +diff --git a/ports/sysdeps/aarch64/fpu/feholdexcpt.c b/ports/sysdeps/aarch64/fpu/feholdexcpt.c +index 0514ac1..973ba4a 100644 +--- a/ports/sysdeps/aarch64/fpu/feholdexcpt.c ++++ b/ports/sysdeps/aarch64/fpu/feholdexcpt.c +@@ -22,8 +22,10 @@ + int + feholdexcept (fenv_t *envp) + { +- fpu_fpsr_t fpsr; + fpu_control_t fpcr; ++ fpu_control_t fpcr_new; ++ fpu_fpsr_t fpsr; ++ fpu_fpsr_t fpsr_new; + + _FPU_GETCW (fpcr); + envp->__fpcr = fpcr; +@@ -32,14 +34,16 @@ feholdexcept (fenv_t *envp) + envp->__fpsr = fpsr; + + /* Now set all exceptions to non-stop. */ +- fpcr &= ~(FE_ALL_EXCEPT << FE_EXCEPT_SHIFT); ++ fpcr_new = fpcr & ~(FE_ALL_EXCEPT << FE_EXCEPT_SHIFT); + + /* And clear all exception flags. */ +- fpsr &= ~FE_ALL_EXCEPT; ++ fpsr_new = fpsr & ~FE_ALL_EXCEPT; + +- _FPU_SETFPSR (fpsr); ++ if (fpsr != fpsr_new) ++ _FPU_SETFPSR (fpsr_new); + +- _FPU_SETCW (fpcr); ++ if (fpcr != fpcr_new) ++ _FPU_SETCW (fpcr_new); + + return 0; + } +diff --git a/ports/sysdeps/aarch64/fpu/fesetenv.c b/ports/sysdeps/aarch64/fpu/fesetenv.c +index a2434e3..30193e9 100644 +--- a/ports/sysdeps/aarch64/fpu/fesetenv.c ++++ b/ports/sysdeps/aarch64/fpu/fesetenv.c +@@ -23,34 +23,38 @@ int + fesetenv (const fenv_t *envp) + { + fpu_control_t fpcr; +- fpu_fpsr_t fpsr; ++ fpu_control_t fpcr_new; + fpu_control_t updated_fpcr; ++ fpu_fpsr_t fpsr; ++ fpu_fpsr_t fpsr_new; + + _FPU_GETCW (fpcr); + _FPU_GETFPSR (fpsr); + +- fpcr &= _FPU_RESERVED; +- fpsr &= _FPU_FPSR_RESERVED; ++ fpcr_new = fpcr & _FPU_RESERVED; ++ fpsr_new = fpsr & _FPU_FPSR_RESERVED; + + if (envp == FE_DFL_ENV) + { +- fpcr |= _FPU_DEFAULT; +- fpsr |= _FPU_FPSR_DEFAULT; ++ fpcr_new |= _FPU_DEFAULT; ++ fpsr_new |= _FPU_FPSR_DEFAULT; + } + else if (envp == FE_NOMASK_ENV) + { +- fpcr |= _FPU_FPCR_IEEE; +- fpsr |= _FPU_FPSR_IEEE; ++ fpcr_new |= _FPU_FPCR_IEEE; ++ fpsr_new |= _FPU_FPSR_IEEE; + } + else + { +- fpcr |= envp->__fpcr & ~_FPU_RESERVED; +- fpsr |= envp->__fpsr & ~_FPU_FPSR_RESERVED; ++ fpcr_new |= envp->__fpcr & ~_FPU_RESERVED; ++ fpsr_new |= envp->__fpsr & ~_FPU_FPSR_RESERVED; + } + +- _FPU_SETFPSR (fpsr); ++ if (fpsr != fpsr_new) ++ _FPU_SETFPSR (fpsr_new); + +- _FPU_SETCW (fpcr); ++ if (fpcr != fpcr_new) ++ _FPU_SETCW (fpcr_new); + + /* Trapping exceptions are optional in AArch64 the relevant enable + bits in FPCR are RES0 hence the absence of support can be +@@ -58,7 +62,7 @@ fesetenv (const fenv_t *envp) + value. */ + + _FPU_GETCW (updated_fpcr); +- if ((updated_fpcr & fpcr) != fpcr) ++ if ((updated_fpcr & fpcr_new) != fpcr_new) + return 1; + + return 0; +diff --git a/ports/sysdeps/aarch64/fpu/fesetround.c b/ports/sysdeps/aarch64/fpu/fesetround.c +index 40a05f6..225096a 100644 +--- a/ports/sysdeps/aarch64/fpu/fesetround.c ++++ b/ports/sysdeps/aarch64/fpu/fesetround.c +@@ -23,6 +23,7 @@ int + fesetround (int round) + { + fpu_control_t fpcr; ++ fpu_control_t fpcr_new; + + switch (round) + { +@@ -31,9 +32,10 @@ fesetround (int round) + case FE_DOWNWARD: + case FE_TOWARDZERO: + _FPU_GETCW (fpcr); +- fpcr = (fpcr & ~FE_TOWARDZERO) | round; ++ fpcr_new = (fpcr & ~FE_TOWARDZERO) | round; + +- _FPU_SETCW (fpcr); ++ if (fpcr != fpcr_new) ++ _FPU_SETCW (fpcr_new); + return 0; + + default: +diff --git a/ports/sysdeps/aarch64/fpu/fsetexcptflg.c b/ports/sysdeps/aarch64/fpu/fsetexcptflg.c +index 49cd1e4..60bb1c9 100644 +--- a/ports/sysdeps/aarch64/fpu/fsetexcptflg.c ++++ b/ports/sysdeps/aarch64/fpu/fsetexcptflg.c +@@ -24,16 +24,18 @@ int + fesetexceptflag (const fexcept_t *flagp, int excepts) + { + fpu_fpsr_t fpsr; ++ fpu_fpsr_t fpsr_new; + + /* Get the current environment. */ + _FPU_GETFPSR (fpsr); + + /* Set the desired exception mask. */ +- fpsr &= ~(excepts & FE_ALL_EXCEPT); +- fpsr |= (*flagp & excepts & FE_ALL_EXCEPT); ++ fpsr_new = fpsr & ~(excepts & FE_ALL_EXCEPT); ++ fpsr_new |= (*flagp & excepts & FE_ALL_EXCEPT); + + /* Save state back to the FPU. */ +- _FPU_SETFPSR (fpsr); ++ if (fpsr != fpsr_new) ++ _FPU_SETFPSR (fpsr_new); + + return 0; + } diff --git a/SOURCES/glibc-rh1302086-6.patch b/SOURCES/glibc-rh1302086-6.patch new file mode 100644 index 0000000..a336dad --- /dev/null +++ b/SOURCES/glibc-rh1302086-6.patch @@ -0,0 +1,81 @@ +commit c95b3011018893fcc473279768a67a24a73bbef2 +Author: Wilco +Date: Mon Jun 2 12:20:17 2014 +0100 + + [AArch64] Rewrite feupdateenv (BZ 17009). + +diff --git a/ports/sysdeps/aarch64/fpu/feupdateenv.c b/ports/sysdeps/aarch64/fpu/feupdateenv.c +index 6d64a9b..ac2f6fe 100644 +--- a/ports/sysdeps/aarch64/fpu/feupdateenv.c ++++ b/ports/sysdeps/aarch64/fpu/feupdateenv.c +@@ -22,16 +22,65 @@ + int + feupdateenv (const fenv_t *envp) + { ++ fpu_control_t fpcr; ++ fpu_control_t fpcr_new; ++ fpu_control_t updated_fpcr; + fpu_fpsr_t fpsr; ++ fpu_fpsr_t fpsr_new; ++ int excepts; + +- /* Get the current exception state. */ ++ _FPU_GETCW (fpcr); + _FPU_GETFPSR (fpsr); ++ excepts = fpsr & FE_ALL_EXCEPT; + +- /* Install new environment. */ +- fesetenv (envp); ++ if ((envp != FE_DFL_ENV) && (envp != FE_NOMASK_ENV)) ++ { ++ fpcr_new = envp->__fpcr; ++ fpsr_new = envp->__fpsr | excepts; + +- /* Raise the saved exceptions. */ +- feraiseexcept (fpsr & FE_ALL_EXCEPT); ++ if (fpcr != fpcr_new) ++ _FPU_SETCW (fpcr_new); ++ ++ if (fpsr != fpsr_new) ++ _FPU_SETFPSR (fpsr_new); ++ ++ if (excepts & (fpcr_new >> FE_EXCEPT_SHIFT)) ++ return feraiseexcept (excepts); ++ ++ return 0; ++ } ++ ++ fpcr_new = fpcr & _FPU_RESERVED; ++ fpsr_new = fpsr & (_FPU_FPSR_RESERVED | FE_ALL_EXCEPT); ++ ++ if (envp == FE_DFL_ENV) ++ { ++ fpcr_new |= _FPU_DEFAULT; ++ fpsr_new |= _FPU_FPSR_DEFAULT; ++ } ++ else ++ { ++ fpcr_new |= _FPU_FPCR_IEEE; ++ fpsr_new |= _FPU_FPSR_IEEE; ++ } ++ ++ _FPU_SETFPSR (fpsr_new); ++ ++ if (fpcr != fpcr_new) ++ { ++ _FPU_SETCW (fpcr_new); ++ ++ /* Trapping exceptions are optional in AArch64; the relevant enable ++ bits in FPCR are RES0 hence the absence of support can be detected ++ by reading back the FPCR and comparing with the required value. */ ++ _FPU_GETCW (updated_fpcr); ++ ++ if (fpcr_new & ~updated_fpcr) ++ return 1; ++ } ++ ++ if (excepts & (fpcr_new >> FE_EXCEPT_SHIFT)) ++ return feraiseexcept (excepts); + + return 0; + } diff --git a/SOURCES/glibc-rh1302086-7.patch b/SOURCES/glibc-rh1302086-7.patch new file mode 100644 index 0000000..4665299 --- /dev/null +++ b/SOURCES/glibc-rh1302086-7.patch @@ -0,0 +1,24 @@ +commit a88dadbed5d7589ac7880efe62ea511844107795 +Author: Wilco +Date: Mon Jun 2 12:44:21 2014 +0100 + + [AArch64] Remove ISB after FPCR write. + +diff --git a/ports/sysdeps/aarch64/fpu/fpu_control.h b/ports/sysdeps/aarch64/fpu/fpu_control.h +index 6a265e8..d5a890d 100644 +--- a/ports/sysdeps/aarch64/fpu/fpu_control.h ++++ b/ports/sysdeps/aarch64/fpu/fpu_control.h +@@ -24,11 +24,8 @@ + #define _FPU_GETCW(fpcr) \ + __asm__ __volatile__ ("mrs %0, fpcr" : "=r" (fpcr)) + +-#define _FPU_SETCW(fpcr) \ +- { \ +- __asm__ __volatile__ ("msr fpcr, %0" : : "r" (fpcr)); \ +- __asm__ __volatile__ ("isb"); \ +- } ++#define _FPU_SETCW(fpcr) \ ++ __asm__ __volatile__ ("msr fpcr, %0" : : "r" (fpcr)) + + #define _FPU_GETFPSR(fpsr) \ + __asm__ __volatile__ ("mrs %0, fpsr" : "=r" (fpsr)) diff --git a/SOURCES/glibc-rh1302086-8.patch b/SOURCES/glibc-rh1302086-8.patch new file mode 100644 index 0000000..e2248be --- /dev/null +++ b/SOURCES/glibc-rh1302086-8.patch @@ -0,0 +1,96 @@ +commit 0b4366bc9bca9be8a2208455545c138bcd1e826c +Author: Wilco +Date: Tue Jun 3 08:08:36 2014 +0000 + + [AArch64] Cleanup declarations in math_private.h. + +diff --git a/ports/sysdeps/aarch64/fpu/math_private.h b/ports/sysdeps/aarch64/fpu/math_private.h +index 7424952..a3f466b 100644 +--- a/ports/sysdeps/aarch64/fpu/math_private.h ++++ b/ports/sysdeps/aarch64/fpu/math_private.h +@@ -25,7 +25,10 @@ + static __always_inline void + libc_feholdexcept_aarch64 (fenv_t *envp) + { +- fpu_control_t fpcr, new_fpcr, fpsr, new_fpsr; ++ fpu_control_t fpcr; ++ fpu_control_t new_fpcr; ++ fpu_fpsr_t fpsr; ++ fpu_fpsr_t new_fpsr; + + _FPU_GETCW (fpcr); + _FPU_GETFPSR (fpsr); +@@ -69,7 +72,10 @@ libc_fesetround_aarch64 (int round) + static __always_inline void + libc_feholdexcept_setround_aarch64 (fenv_t *envp, int round) + { +- fpu_control_t fpcr, new_fpcr, fpsr, new_fpsr; ++ fpu_control_t fpcr; ++ fpu_control_t new_fpcr; ++ fpu_fpsr_t fpsr; ++ fpu_fpsr_t new_fpsr; + + _FPU_GETCW (fpcr); + _FPU_GETFPSR (fpsr); +@@ -96,7 +102,7 @@ libc_feholdexcept_setround_aarch64 (fenv_t *envp, int round) + static __always_inline int + libc_fetestexcept_aarch64 (int ex) + { +- fpu_control_t fpsr; ++ fpu_fpsr_t fpsr; + + _FPU_GETFPSR (fpsr); + return fpsr & ex & FE_ALL_EXCEPT; +@@ -109,7 +115,8 @@ libc_fetestexcept_aarch64 (int ex) + static __always_inline void + libc_fesetenv_aarch64 (const fenv_t *envp) + { +- fpu_control_t fpcr, new_fpcr; ++ fpu_control_t fpcr; ++ fpu_control_t new_fpcr; + + _FPU_GETCW (fpcr); + new_fpcr = envp->__fpcr; +@@ -130,7 +137,10 @@ libc_fesetenv_aarch64 (const fenv_t *envp) + static __always_inline int + libc_feupdateenv_test_aarch64 (const fenv_t *envp, int ex) + { +- fpu_control_t fpcr, new_fpcr, fpsr, new_fpsr; ++ fpu_control_t fpcr; ++ fpu_control_t new_fpcr; ++ fpu_fpsr_t fpsr; ++ fpu_fpsr_t new_fpsr; + int excepts; + + _FPU_GETCW (fpcr); +@@ -171,7 +181,8 @@ libc_feupdateenv_aarch64 (const fenv_t *envp) + static __always_inline void + libc_feholdsetround_aarch64 (fenv_t *envp, int round) + { +- fpu_control_t fpcr, fpsr; ++ fpu_control_t fpcr; ++ fpu_fpsr_t fpsr; + + _FPU_GETCW (fpcr); + _FPU_GETFPSR (fpsr); +@@ -193,7 +204,8 @@ libc_feholdsetround_aarch64 (fenv_t *envp, int round) + static __always_inline void + libc_feresetround_aarch64 (fenv_t *envp) + { +- fpu_control_t fpcr, round; ++ fpu_control_t fpcr; ++ int round; + + _FPU_GETCW (fpcr); + +@@ -215,7 +227,9 @@ libc_feresetround_aarch64 (fenv_t *envp) + static __always_inline void + libc_feholdsetround_aarch64_ctx (struct rm_ctx *ctx, int r) + { +- fpu_control_t fpcr, fpsr, round; ++ fpu_control_t fpcr; ++ fpu_fpsr_t fpsr; ++ int round; + + _FPU_GETCW (fpcr); + _FPU_GETFPSR (fpsr); diff --git a/SOURCES/glibc-rh1302086-9.patch b/SOURCES/glibc-rh1302086-9.patch new file mode 100644 index 0000000..4a1ef3e --- /dev/null +++ b/SOURCES/glibc-rh1302086-9.patch @@ -0,0 +1,68 @@ +commit 693096cc7b397a709f075865993027c14c06d3e5 +Author: Wilco +Date: Tue Jun 3 08:10:39 2014 +0000 + + [AArch64] Switch from FE_TOWARDZERO to _FPU_FPCR_RM_MASK + +diff --git a/ports/sysdeps/aarch64/fpu/get-rounding-mode.h b/ports/sysdeps/aarch64/fpu/get-rounding-mode.h +index 5c1615d..425b50e 100644 +--- a/ports/sysdeps/aarch64/fpu/get-rounding-mode.h ++++ b/ports/sysdeps/aarch64/fpu/get-rounding-mode.h +@@ -32,7 +32,7 @@ get_rounding_mode (void) + fpu_control_t fpcr; + + _FPU_GETCW (fpcr); +- return fpcr & FE_TOWARDZERO; ++ return fpcr & _FPU_FPCR_RM_MASK; + } + + #endif /* get-rounding-mode.h */ +diff --git a/ports/sysdeps/aarch64/fpu/math_private.h b/ports/sysdeps/aarch64/fpu/math_private.h +index a3f466b..023c9d0 100644 +--- a/ports/sysdeps/aarch64/fpu/math_private.h ++++ b/ports/sysdeps/aarch64/fpu/math_private.h +@@ -58,7 +58,7 @@ libc_fesetround_aarch64 (int round) + _FPU_GETCW (fpcr); + + /* Check whether rounding modes are different. */ +- round = (fpcr ^ round) & FE_TOWARDZERO; ++ round = (fpcr ^ round) & _FPU_FPCR_RM_MASK; + + /* Set new rounding mode if different. */ + if (__glibc_unlikely (round != 0)) +@@ -84,7 +84,7 @@ libc_feholdexcept_setround_aarch64 (fenv_t *envp, int round) + + /* Clear exception flags, set all exceptions to non-stop, + and set new rounding mode. */ +- new_fpcr = fpcr & ~((FE_ALL_EXCEPT << FE_EXCEPT_SHIFT) | FE_TOWARDZERO); ++ new_fpcr = fpcr & ~((FE_ALL_EXCEPT << FE_EXCEPT_SHIFT) | _FPU_FPCR_RM_MASK); + new_fpcr |= round; + new_fpsr = fpsr & ~FE_ALL_EXCEPT; + +@@ -190,7 +190,7 @@ libc_feholdsetround_aarch64 (fenv_t *envp, int round) + envp->__fpsr = fpsr; + + /* Check whether rounding modes are different. */ +- round = (fpcr ^ round) & FE_TOWARDZERO; ++ round = (fpcr ^ round) & _FPU_FPCR_RM_MASK; + + /* Set new rounding mode if different. */ + if (__glibc_unlikely (round != 0)) +@@ -210,7 +210,7 @@ libc_feresetround_aarch64 (fenv_t *envp) + _FPU_GETCW (fpcr); + + /* Check whether rounding modes are different. */ +- round = (envp->__fpcr ^ fpcr) & FE_TOWARDZERO; ++ round = (envp->__fpcr ^ fpcr) & _FPU_FPCR_RM_MASK; + + /* Restore the rounding mode if it was changed. */ + if (__glibc_unlikely (round != 0)) +@@ -236,7 +236,7 @@ libc_feholdsetround_aarch64_ctx (struct rm_ctx *ctx, int r) + ctx->env.__fpsr = fpsr; + + /* Check whether rounding modes are different. */ +- round = (fpcr ^ r) & FE_TOWARDZERO; ++ round = (fpcr ^ r) & _FPU_FPCR_RM_MASK; + ctx->updated_status = round != 0; + + /* Set the rounding mode if changed. */ diff --git a/SOURCES/glibc-rh1308728.patch b/SOURCES/glibc-rh1308728.patch new file mode 100644 index 0000000..e1f1e8c --- /dev/null +++ b/SOURCES/glibc-rh1308728.patch @@ -0,0 +1,38 @@ +commit 58a1335e76a553e1cf4edeebc27f16fc9b53d6e6 +Author: Petr Baudis +Date: Thu Mar 14 01:16:53 2013 +0100 + + Fix __times() handling of EFAULT when buf is NULL + +diff --git a/sysdeps/unix/sysv/linux/times.c b/sysdeps/unix/sysv/linux/times.c +index f3b5f01..e59bb4e 100644 +--- a/sysdeps/unix/sysv/linux/times.c ++++ b/sysdeps/unix/sysv/linux/times.c +@@ -26,13 +26,14 @@ __times (struct tms *buf) + INTERNAL_SYSCALL_DECL (err); + clock_t ret = INTERNAL_SYSCALL (times, err, 1, buf); + if (INTERNAL_SYSCALL_ERROR_P (ret, err) +- && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0)) ++ && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0) ++ && buf) + { + /* This might be an error or not. For architectures which have + no separate return value and error indicators we cannot + distinguish a return value of -1 from an error. Do it the +- hard way. We crash applications which pass in an invalid BUF +- pointer. */ ++ hard way. We crash applications which pass in an invalid ++ non-NULL BUF pointer. Linux allows BUF to be NULL. */ + #define touch(v) \ + do { \ + clock_t temp = v; \ +@@ -44,7 +45,8 @@ __times (struct tms *buf) + touch (buf->tms_cutime); + touch (buf->tms_cstime); + +- /* If we come here the memory is valid and the kernel did not ++ /* If we come here the memory is valid (or BUF is NULL, which is ++ * a valid condition for the kernel syscall) and the kernel did not + return an EFAULT error. Return the value given by the kernel. */ + } + diff --git a/SOURCES/glibc-rh1321993.patch b/SOURCES/glibc-rh1321993.patch new file mode 100644 index 0000000..c229e3b --- /dev/null +++ b/SOURCES/glibc-rh1321993.patch @@ -0,0 +1,32 @@ +commit 317b199b4aff8cfa27f2302ab404d2bb5032b9a4 +Author: Florian Weimer +Date: Tue Mar 29 12:57:56 2016 +0200 + + CVE-2016-3075: Stack overflow in _nss_dns_getnetbyname_r [BZ #19879] + + The defensive copy is not needed because the name may not alias the + output buffer. + +diff --git a/resolv/nss_dns/dns-network.c b/resolv/nss_dns/dns-network.c +index 2eb2f67..8f301a7 100644 +--- a/resolv/nss_dns/dns-network.c ++++ b/resolv/nss_dns/dns-network.c +@@ -118,17 +118,14 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result, + } net_buffer; + querybuf *orig_net_buffer; + int anslen; +- char *qbuf; + enum nss_status status; + + if (__res_maybe_init (&_res, 0) == -1) + return NSS_STATUS_UNAVAIL; + +- qbuf = strdupa (name); +- + net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024); + +- anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf, ++ anslen = __libc_res_nsearch (&_res, name, C_IN, T_PTR, net_buffer.buf->buf, + 1024, &net_buffer.ptr, NULL, NULL, NULL, NULL); + if (anslen < 0) + { diff --git a/SOURCES/glibc-rh1324427-1.patch b/SOURCES/glibc-rh1324427-1.patch new file mode 100644 index 0000000..76d1570 --- /dev/null +++ b/SOURCES/glibc-rh1324427-1.patch @@ -0,0 +1,891 @@ +commit 4603c51ef7989d7eb800cdd6f42aab206f891077 +Author: Stefan Liebler +Date: Thu Mar 31 17:37:16 2016 +0200 + + S390: Save and restore fprs/vrs while resolving symbols. + + On s390, no fpr/vrs were saved while resolving a symbol + via _dl_runtime_resolve/_dl_runtime_profile. + + According to the abi, the fpr-arguments are defined as call clobbered. + In leaf-functions, gcc 4.9 and newer can use fprs for saving/restoring gprs + instead of saving them to the stack. + If gcc do this in one of the resolver-functions, then the floating point + arguments of a library-function are invalid for the first library-function-call. + Thus, this patch saves/restores the fprs around the resolving code. + + The same could occur for vector registers. Furthermore an ifunc-resolver + could also clobber the vector/floating point argument registers. + Thus this patch provides the further variants _dl_runtime_resolve_vx/ + _dl_runtime_profile_vx, which are used if the kernel claims, that + we run on a machine with vector registers. + + Furthermore, if _dl_runtime_profile calls _dl_call_pltexit, + the pointers to inregs-/outregs-structs were setup invalid. + Now they point to the correct location in the stack-frame. + Before branching back to the caller, the return values are now + restored instead of containing the return values of the + _dl_call_pltexit() call. + On s390-32, an endless loop occurs if _dl_call_pltexit() should be called. + Now, this code-path branches to this function instead of just after the + preceding basr-instruction. + + ChangeLog: + + * sysdeps/s390/s390-32/dl-trampoline.S: Include dl-trampoline.h twice + to create a non-vector/vector version for _dl_runtime_resolve and + _dl_runtime_profile. Move implementation to ... + * sysdeps/s390/s390-32/dl-trampoline.h: ... here. + (_dl_runtime_resolve) Save and restore fpr/vrs. + (_dl_runtime_profile) Save and restore vrs and fix some issues + if _dl_call_pltexit is called. + * sysdeps/s390/s390-32/dl-machine.h (elf_machine_runtime_setup): + Choose the correct resolver function if running on a machine with vx. + * sysdeps/s390/s390-64/dl-trampoline.S: Include dl-trampoline.h twice + to create a non-vector/vector version for _dl_runtime_resolve and + _dl_runtime_profile. Move implementation to ... + * sysdeps/s390/s390-64/dl-trampoline.h: ... here. + (_dl_runtime_resolve) Save and restore fpr/vrs. + (_dl_runtime_profile) Save and restore vrs and fix some issues + * sysdeps/s390/s390-64/dl-machine.h: (elf_machine_runtime_setup): + Choose the correct resolver function if running on a machine with vx. + +diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h +index 14bde3b..ec0ae4a 100644 +--- a/sysdeps/s390/s390-32/dl-machine.h ++++ b/sysdeps/s390/s390-32/dl-machine.h +@@ -89,6 +89,11 @@ + { + extern void _dl_runtime_resolve (Elf32_Word); + extern void _dl_runtime_profile (Elf32_Word); ++#if defined HAVE_S390_VX_ASM_SUPPORT ++ extern void _dl_runtime_resolve_vx (Elf32_Word); ++ extern void _dl_runtime_profile_vx (Elf32_Word); ++#endif ++ + + if (l->l_info[DT_JMPREL] && lazy) + { +@@ -116,7 +121,14 @@ + end in this function. */ + if (__builtin_expect (profile, 0)) + { ++#if defined HAVE_S390_VX_ASM_SUPPORT ++ if (GLRO(dl_hwcap) & HWCAP_S390_VX) ++ got[2] = (Elf32_Addr) &_dl_runtime_profile_vx; ++ else ++ got[2] = (Elf32_Addr) &_dl_runtime_profile; ++#else + got[2] = (Elf32_Addr) &_dl_runtime_profile; ++#endif + + if (GLRO(dl_profile) != NULL + && _dl_name_match_p (GLRO(dl_profile), l)) +@@ -125,9 +137,18 @@ + GL(dl_profile_map) = l; + } + else +- /* This function will get called to fix up the GOT entry indicated by +- the offset on the stack, and then jump to the resolved address. */ +- got[2] = (Elf32_Addr) &_dl_runtime_resolve; ++ { ++ /* This function will get called to fix up the GOT entry indicated by ++ the offset on the stack, and then jump to the resolved address. */ ++#if defined HAVE_S390_VX_ASM_SUPPORT ++ if (GLRO(dl_hwcap) & HWCAP_S390_VX) ++ got[2] = (Elf32_Addr) &_dl_runtime_resolve_vx; ++ else ++ got[2] = (Elf32_Addr) &_dl_runtime_resolve; ++#else ++ got[2] = (Elf32_Addr) &_dl_runtime_resolve; ++#endif ++ } + } + + return lazy; +diff --git a/sysdeps/s390/s390-32/dl-trampoline.S b/sysdeps/s390/s390-32/dl-trampoline.S +index 1645610..859183c 100644 +--- a/sysdeps/s390/s390-32/dl-trampoline.S ++++ b/sysdeps/s390/s390-32/dl-trampoline.S +@@ -16,130 +16,18 @@ + License along with the GNU C Library; if not, see + . */ + +-/* This code is used in dl-runtime.c to call the `fixup' function +- and then redirect to the address it returns. */ +- +-/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile +- * with the following linkage: +- * r2 - r6 : parameter registers +- * f0, f2 : floating point parameter registers +- * 24(r15), 28(r15) : PLT arguments PLT1, PLT2 +- * 96(r15) : additional stack parameters +- * The normal clobber rules for function calls apply: +- * r0 - r5 : call clobbered +- * r6 - r13 : call saved +- * r14 : return address (call clobbered) +- * r15 : stack pointer (call saved) +- * f4, f6 : call saved +- * f0 - f3, f5, f7 - f15 : call clobbered +- */ +- + #include + + .text +- .globl _dl_runtime_resolve +- .type _dl_runtime_resolve, @function +- cfi_startproc +- .align 16 +-_dl_runtime_resolve: +- stm %r2,%r5,32(%r15) # save registers +- st %r14,8(%r15) +- cfi_offset (r14, -88) +- lr %r0,%r15 # create stack frame +- ahi %r15,-96 +- cfi_adjust_cfa_offset (96) +- st 0,0(%r15) +- lm %r2,%r3,120(%r15) # load args saved by PLT +- basr %r1,0 +-0: l %r14,1f-0b(%r1) +- bas %r14,0(%r14,%r1) # call resolver +- lr %r1,%r2 # function addr returned in r2 +- ahi %r15,96 # remove stack frame +- cfi_adjust_cfa_offset (-96) +- l %r14,8(15) # restore registers +- lm %r2,%r5,32(%r15) +- br %r1 +-1: .long _dl_fixup - 0b +- cfi_endproc +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- +- +-#ifndef PROF +- .globl _dl_runtime_profile +- .type _dl_runtime_profile, @function +- cfi_startproc +- .align 16 +-_dl_runtime_profile: +- stm %r2,%r6,32(%r15) # save registers +- std %f0,56(%r15) +- std %f2,64(%r15) +- st %r6,8(%r15) +- st %r12,12(%r15) +- st %r14,16(%r15) +- cfi_offset (r6, -64) +- cfi_offset (f0, -40) +- cfi_offset (f2, -32) +- cfi_offset (r12, -84) +- cfi_offset (r14, -80) +- lr %r12,%r15 # create stack frame +- cfi_def_cfa_register (12) +- ahi %r15,-96 +- st %r12,0(%r15) +- lm %r2,%r3,24(%r12) # load arguments saved by PLT +- lr %r4,%r14 # return address as third parameter +- basr %r1,0 +-0: l %r14,6f-0b(%r1) +- la %r5,32(%r12) # pointer to struct La_s390_32_regs +- la %r6,20(%r12) # long int * framesize +- bas %r14,0(%r14,%r1) # call resolver +- lr %r1,%r2 # function addr returned in r2 +- icm %r0,15,20(%r12) # load & test framesize +- jnm 2f +- +- lm %r2,%r6,32(%r12) +- ld %f0,56(%r12) +- ld %f2,64(%r12) +- lr %r15,%r12 # remove stack frame +- cfi_def_cfa_register (15) +- l %r14,16(%r15) # restore registers +- l %r12,12(%r15) +- br %r1 # tail-call to the resolved function +- +- cfi_def_cfa_register (12) +-2: jz 4f # framesize == 0 ? +- ahi %r0,7 # align framesize to 8 +- lhi %r2,-8 +- nr %r0,%r2 +- slr %r15,%r0 # make room for framesize bytes +- st %r12,0(%r15) +- la %r2,96(%r15) +- la %r3,96(%r12) +- srl %r0,3 +-3: mvc 0(8,%r2),0(%r3) # copy additional parameters +- la %r2,8(%r2) +- la %r3,8(%r3) +- brct %r0,3b +-4: lm %r2,%r6,32(%r12) # load register parameters +- ld %f0,56(%r12) +- ld %f2,64(%r12) +- basr %r14,%r1 # call resolved function +- stm %r2,%r3,72(%r12) +- std %f0,80(%r12) +- lm %r2,%r3,24(%r12) # load arguments saved by PLT +- basr %r1,0 +-5: l %r14,7f-5b(%r1) +- la %r4,32(%r12) # pointer to struct La_s390_32_regs +- la %r5,72(%r12) # pointer to struct La_s390_32_retval +- basr %r14,%r1 # call _dl_call_pltexit +- +- lr %r15,%r12 # remove stack frame +- cfi_def_cfa_register (15) +- l %r14,16(%r15) # restore registers +- l %r12,12(%r15) +- br %r14 +- +-6: .long _dl_profile_fixup - 0b +-7: .long _dl_call_pltexit - 5b +- cfi_endproc +- .size _dl_runtime_profile, .-_dl_runtime_profile ++/* Create variant of _dl_runtime_resolve/profile for machines before z13. ++ No vector registers are saved/restored. */ ++#include ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT ++/* Create variant of _dl_runtime_resolve/profile for z13 and newer. ++ The vector registers are saved/restored, too.*/ ++# define _dl_runtime_resolve _dl_runtime_resolve_vx ++# define _dl_runtime_profile _dl_runtime_profile_vx ++# define RESTORE_VRS ++# include + #endif +diff --git a/sysdeps/s390/s390-32/dl-trampoline.h b/sysdeps/s390/s390-32/dl-trampoline.h +new file mode 100644 +index 0000000..a152a7b +--- /dev/null ++++ b/sysdeps/s390/s390-32/dl-trampoline.h +@@ -0,0 +1,215 @@ ++/* PLT trampolines. s390 version. ++ Copyright (C) 2016 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* This code is used in dl-runtime.c to call the `fixup' function ++ and then redirect to the address it returns. */ ++ ++/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile ++ * with the following linkage: ++ * r2 - r6 : parameter registers ++ * f0, f2 : floating point parameter registers ++ * v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers ++ * 24(r15), 28(r15) : PLT arguments PLT1, PLT2 ++ * 96(r15) : additional stack parameters ++ * The normal clobber rules for function calls apply: ++ * r0 - r5 : call clobbered ++ * r6 - r13 : call saved ++ * r14 : return address (call clobbered) ++ * r15 : stack pointer (call saved) ++ * f4, f6 : call saved ++ * f0 - f3, f5, f7 - f15 : call clobbered ++ * v0 - v3, v5, v7 - v15 : bytes 0-7 overlap with fprs: call clobbered ++ bytes 8-15: call clobbered ++ * v4, v6 : bytes 0-7 overlap with f4, f6: call saved ++ bytes 8-15: call clobbered ++ * v16 - v31 : call clobbered ++ */ ++ ++ ++ .globl _dl_runtime_resolve ++ .type _dl_runtime_resolve, @function ++ cfi_startproc ++ .align 16 ++_dl_runtime_resolve: ++ stm %r2,%r5,32(%r15) # save registers ++ cfi_offset (r2, -64) ++ cfi_offset (r3, -60) ++ cfi_offset (r4, -56) ++ cfi_offset (r5, -52) ++ std %f0,56(%r15) ++ cfi_offset (f0, -40) ++ std %f2,64(%r15) ++ cfi_offset (f2, -32) ++ st %r14,8(%r15) ++ cfi_offset (r14, -88) ++ lr %r0,%r15 ++ lm %r2,%r3,24(%r15) # load args saved by PLT ++#ifdef RESTORE_VRS ++ ahi %r15,-224 # create stack frame ++ cfi_adjust_cfa_offset (224) ++ .machine push ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ vstm %v24,%v31,96(%r15) # store call-clobbered vr arguments ++ cfi_offset (v24, -224) ++ cfi_offset (v25, -208) ++ cfi_offset (v26, -192) ++ cfi_offset (v27, -176) ++ cfi_offset (v28, -160) ++ cfi_offset (v29, -144) ++ cfi_offset (v30, -128) ++ cfi_offset (v31, -112) ++ .machine pop ++#else ++ ahi %r15,-96 # create stack frame ++ cfi_adjust_cfa_offset (96) ++#endif ++ st %r0,0(%r15) # write backchain ++ basr %r1,0 ++0: l %r14,1f-0b(%r1) ++ bas %r14,0(%r14,%r1) # call _dl_fixup ++ lr %r1,%r2 # function addr returned in r2 ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ vlm %v24,%v31,96(%r15) # restore vector registers ++ .machine pop ++ aghi %r15,224 # remove stack frame ++ cfi_adjust_cfa_offset (-224) ++#else ++ ahi %r15,96 # remove stack frame ++ cfi_adjust_cfa_offset (-96) ++#endif ++ l %r14,8(15) # restore registers ++ ld %f0,56(%r15) ++ ld %f2,64(%r15) ++ lm %r2,%r5,32(%r15) ++ br %r1 ++1: .long _dl_fixup - 0b ++ cfi_endproc ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve ++ ++ ++#ifndef PROF ++ .globl _dl_runtime_profile ++ .type _dl_runtime_profile, @function ++ cfi_startproc ++ .align 16 ++_dl_runtime_profile: ++ stm %r2,%r6,32(%r15) # save registers ++ cfi_offset (r2, -64) # + r6 needed as arg for ++ cfi_offset (r3, -60) # _dl_profile_fixup ++ cfi_offset (r4, -56) ++ cfi_offset (r5, -52) ++ cfi_offset (r6, -48) ++ std %f0,56(%r15) ++ cfi_offset (f0, -40) ++ std %f2,64(%r15) ++ cfi_offset (f2, -32) ++ st %r12,12(%r15) # r12 is used as backup of r15 ++ cfi_offset (r12, -84) ++ st %r14,16(%r15) ++ cfi_offset (r14, -80) ++ lr %r12,%r15 # backup stack pointer ++ cfi_def_cfa_register (12) ++#ifdef RESTORE_VRS ++ ahi %r15,-224 # create stack frame ++ .machine push ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ vstm %v24,%v31,96(%r15) # store call-clobbered vr arguments ++ cfi_offset (v24, -224) ++ cfi_offset (v25, -208) ++ cfi_offset (v26, -192) ++ cfi_offset (v27, -176) ++ cfi_offset (v28, -160) ++ cfi_offset (v29, -144) ++ cfi_offset (v30, -128) ++ cfi_offset (v31, -112) ++ .machine pop ++#else ++ ahi %r15,-96 # create stack frame ++#endif ++ st %r12,0(%r15) # save backchain ++ lm %r2,%r3,24(%r12) # load arguments saved by PLT ++ lr %r4,%r14 # return address as third parameter ++ basr %r1,0 ++0: l %r14,6f-0b(%r1) ++ la %r5,32(%r12) # pointer to struct La_s390_32_regs ++ la %r6,20(%r12) # long int * framesize ++ bas %r14,0(%r14,%r1) # call resolver ++ lr %r1,%r2 # function addr returned in r2 ++ ld %f0,56(%r12) # restore call-clobbered arg fprs ++ ld %f2,64(%r12) ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ .machinemode "zarch_nohighgprs" ++ vlm %v24,%v31,96(%r15) # restore call-clobbered arg vrs ++ .machine pop ++#endif ++ icm %r0,15,20(%r12) # load & test framesize ++ jnm 2f ++ ++ lm %r2,%r6,32(%r12) ++ lr %r15,%r12 # remove stack frame ++ cfi_def_cfa_register (15) ++ l %r14,16(%r15) # restore registers ++ l %r12,12(%r15) ++ br %r1 # tail-call to the resolved function ++ ++ cfi_def_cfa_register (12) ++2: jz 4f # framesize == 0 ? ++ ahi %r0,7 # align framesize to 8 ++ lhi %r2,-8 ++ nr %r0,%r2 ++ slr %r15,%r0 # make room for framesize bytes ++ st %r12,0(%r15) # save backchain ++ la %r2,96(%r15) ++ la %r3,96(%r12) ++ srl %r0,3 ++3: mvc 0(8,%r2),0(%r3) # copy additional parameters ++ la %r2,8(%r2) ++ la %r3,8(%r3) ++ brct %r0,3b ++4: lm %r2,%r6,32(%r12) # load register parameters ++ basr %r14,%r1 # call resolved function ++ stm %r2,%r3,72(%r12) # store return values r2, r3, f0 ++ std %f0,80(%r12) # to struct La_s390_32_retval ++ lm %r2,%r3,24(%r12) # load arguments saved by PLT ++ basr %r1,0 ++5: l %r14,7f-5b(%r1) ++ la %r4,32(%r12) # pointer to struct La_s390_32_regs ++ la %r5,72(%r12) # pointer to struct La_s390_32_retval ++ bas %r14,0(%r14,%r1) # call _dl_call_pltexit ++ ++ lr %r15,%r12 # remove stack frame ++ cfi_def_cfa_register (15) ++ l %r14,16(%r15) # restore registers ++ l %r12,12(%r15) ++ l %r2,72(%r15) # restore return values ++ l %r3,76(%r15) ++ ld %f0,80(%r15) ++ br %r14 ++ ++6: .long _dl_profile_fixup - 0b ++7: .long _dl_call_pltexit - 5b ++ cfi_endproc ++ .size _dl_runtime_profile, .-_dl_runtime_profile ++#endif +diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h +index cb81aaf..9ee7c92 100644 +--- a/sysdeps/s390/s390-64/dl-machine.h ++++ b/sysdeps/s390/s390-64/dl-machine.h +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include + + #define ELF_MACHINE_IRELATIVE R_390_IRELATIVE +@@ -78,6 +79,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) + { + extern void _dl_runtime_resolve (Elf64_Word); + extern void _dl_runtime_profile (Elf64_Word); ++#if defined HAVE_S390_VX_ASM_SUPPORT ++ extern void _dl_runtime_resolve_vx (Elf64_Word); ++ extern void _dl_runtime_profile_vx (Elf64_Word); ++#endif + + if (l->l_info[DT_JMPREL] && lazy) + { +@@ -105,7 +110,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) + end in this function. */ + if (__builtin_expect (profile, 0)) + { ++#if defined HAVE_S390_VX_ASM_SUPPORT ++ if (GLRO(dl_hwcap) & HWCAP_S390_VX) ++ got[2] = (Elf64_Addr) &_dl_runtime_profile_vx; ++ else ++ got[2] = (Elf64_Addr) &_dl_runtime_profile; ++#else + got[2] = (Elf64_Addr) &_dl_runtime_profile; ++#endif + + if (GLRO(dl_profile) != NULL + && _dl_name_match_p (GLRO(dl_profile), l)) +@@ -114,9 +126,18 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) + GL(dl_profile_map) = l; + } + else +- /* This function will get called to fix up the GOT entry indicated by +- the offset on the stack, and then jump to the resolved address. */ +- got[2] = (Elf64_Addr) &_dl_runtime_resolve; ++ { ++ /* This function will get called to fix up the GOT entry indicated by ++ the offset on the stack, and then jump to the resolved address. */ ++#if defined HAVE_S390_VX_ASM_SUPPORT ++ if (GLRO(dl_hwcap) & HWCAP_S390_VX) ++ got[2] = (Elf64_Addr) &_dl_runtime_resolve_vx; ++ else ++ got[2] = (Elf64_Addr) &_dl_runtime_resolve; ++#else ++ got[2] = (Elf64_Addr) &_dl_runtime_resolve; ++#endif ++ } + } + + return lazy; +diff --git a/sysdeps/s390/s390-64/dl-trampoline.S b/sysdeps/s390/s390-64/dl-trampoline.S +index 6919ed0..1b0c9e2 100644 +--- a/sysdeps/s390/s390-64/dl-trampoline.S ++++ b/sysdeps/s390/s390-64/dl-trampoline.S +@@ -16,126 +16,18 @@ + License along with the GNU C Library; if not, see + . */ + +-/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile +- * with the following linkage: +- * r2 - r6 : parameter registers +- * f0, f2, f4, f6 : floating point parameter registers +- * 48(r15), 56(r15) : PLT arguments PLT1, PLT2 +- * 160(r15) : additional stack parameters +- * The normal clobber rules for function calls apply: +- * r0 - r5 : call clobbered +- * r6 - r13 : call saved +- * r14 : return address (call clobbered) +- * r15 : stack pointer (call saved) +- * f1, f3, f5, f7 : call saved +- * f0 - f3, f5, f7 - f15 : call clobbered +- */ +- + #include + + .text +- .globl _dl_runtime_resolve +- .type _dl_runtime_resolve, @function +- cfi_startproc +- .align 16 +-_dl_runtime_resolve: +- stmg %r2,%r5,64(15) # save call-clobbered argument registers +- stg %r14,96(15) +- cfi_offset (r14, -64) +- lgr %r0,%r15 +- aghi %r15,-160 # create stack frame +- cfi_adjust_cfa_offset (160) +- stg %r0,0(%r15) # write backchain +- lmg %r2,%r3,208(%r15)# load args saved by PLT +- brasl %r14,_dl_fixup # call fixup +- lgr %r1,%r2 # function addr returned in r2 +- aghi %r15,160 # remove stack frame +- cfi_adjust_cfa_offset (-160) +- lg %r14,96(15) # restore registers +- lmg %r2,%r5,64(15) +- br %r1 +- cfi_endproc +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- +- +-#ifndef PROF +- .globl _dl_runtime_profile +- .type _dl_runtime_profile, @function +- cfi_startproc +- .align 16 +-_dl_runtime_profile: +- stmg %r2,%r6,64(%r15) # save call-clobbered arg regs +- std %f0,104(%r15) # + r6 needed as arg for +- std %f2,112(%r15) # _dl_profile_fixup +- std %f4,120(%r15) +- std %f6,128(%r15) +- stg %r12,24(%r15) # r12 is used as backup of r15 +- stg %r14,32(%r15) +- cfi_offset (r6, -96) +- cfi_offset (f0, -56) +- cfi_offset (f2, -48) +- cfi_offset (f4, -40) +- cfi_offset (f6, -32) +- cfi_offset (r12, -136) +- cfi_offset (r14, -128) +- lgr %r12,%r15 # backup stack pointer +- cfi_def_cfa_register (12) +- aghi %r15,-160 # create stack frame +- stg %r12,0(%r15) # save backchain +- lmg %r2,%r3,48(%r12) # load arguments saved by PLT +- lgr %r4,%r14 # return address as third parameter +- la %r5,64(%r12) # pointer to struct La_s390_32_regs +- la %r6,40(%r12) # long int * framesize +- brasl %r14,_dl_profile_fixup # call resolver +- lgr %r1,%r2 # function addr returned in r2 +- lg %r0,40(%r12) # load framesize +- ltgr %r0,%r0 +- jnm 1f +- +- lmg %r2,%r6,64(%r12) # framesize < 0 means no pltexit call +- ld %f0,104(%r12) # so we can do a tail call without +- ld %f2,112(%r12) # copying the arg overflow area +- ld %f4,120(%r12) +- ld %f6,128(%r12) +- +- lgr %r15,%r12 # remove stack frame +- cfi_def_cfa_register (15) +- lg %r14,32(%r15) # restore registers +- lg %r12,24(%r15) +- br %r1 # tail-call to resolved function +- +- cfi_def_cfa_register (12) +-1: jz 4f # framesize == 0 ? +- aghi %r0,7 # align framesize to 8 +- nill %r0,0xfff8 +- slgr %r15,%r0 # make room for framesize bytes +- stg %r12,0(%r15) +- la %r2,160(%r15) +- la %r3,160(%r12) +- srlg %r0,%r0,3 +-3: mvc 0(8,%r2),0(%r3) # copy additional parameters +- la %r2,8(%r2) +- la %r3,8(%r3) +- brctg %r0,3b +-4: lmg %r2,%r6,64(%r12) # load register parameters +- ld %f0,104(%r12) # restore call-clobbered arg regs +- ld %f2,112(%r12) +- ld %f4,120(%r12) +- ld %f6,128(%r12) +- basr %r14,%r1 # call resolved function +- stg %r2,136(%r12) +- std %f0,144(%r12) +- lmg %r2,%r3,48(%r12) # load arguments saved by PLT +- la %r4,32(%r12) # pointer to struct La_s390_32_regs +- la %r5,72(%r12) # pointer to struct La_s390_32_retval +- brasl %r14,_dl_call_pltexit +- +- lgr %r15,%r12 # remove stack frame +- cfi_def_cfa_register (15) +- lg %r14,32(%r15) # restore registers +- lg %r12,24(%r15) +- br %r14 +- +- cfi_endproc +- .size _dl_runtime_profile, .-_dl_runtime_profile ++/* Create variant of _dl_runtime_resolve/profile for machines before z13. ++ No vector registers are saved/restored. */ ++#include ++ ++#if defined HAVE_S390_VX_ASM_SUPPORT ++/* Create variant of _dl_runtime_resolve/profile for z13 and newer. ++ The vector registers are saved/restored, too.*/ ++# define _dl_runtime_resolve _dl_runtime_resolve_vx ++# define _dl_runtime_profile _dl_runtime_profile_vx ++# define RESTORE_VRS ++# include + #endif +diff --git a/sysdeps/s390/s390-64/dl-trampoline.h b/sysdeps/s390/s390-64/dl-trampoline.h +new file mode 100644 +index 0000000..658e3a3 +--- /dev/null ++++ b/sysdeps/s390/s390-64/dl-trampoline.h +@@ -0,0 +1,211 @@ ++/* PLT trampolines. s390x version. ++ Copyright (C) 2016 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile ++ * with the following linkage: ++ * r2 - r6 : parameter registers ++ * f0, f2, f4, f6 : floating point parameter registers ++ * v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers ++ * 48(r15), 56(r15) : PLT arguments PLT1, PLT2 ++ * 160(r15) : additional stack parameters ++ * The normal clobber rules for function calls apply: ++ * r0 - r5 : call clobbered ++ * r6 - r13 : call saved ++ * r14 : return address (call clobbered) ++ * r15 : stack pointer (call saved) ++ * f0 - f7 : call clobbered ++ * f8 - f15 : call saved ++ * v0 - v7 : bytes 0-7 overlap with f0-f7: call clobbered ++ bytes 8-15: call clobbered ++ * v8 - v15 : bytes 0-7 overlap with f8-f15: call saved ++ bytes 8-15: call clobbered ++ * v16 - v31 : call clobbered ++ */ ++ ++ .globl _dl_runtime_resolve ++ .type _dl_runtime_resolve, @function ++ cfi_startproc ++ .align 16 ++_dl_runtime_resolve: ++ stmg %r2,%r5,64(%r15) # save call-clobbered argument registers ++ cfi_offset (r2, -96) ++ cfi_offset (r3, -88) ++ cfi_offset (r4, -80) ++ cfi_offset (r5, -72) ++ std %f0,104(%r15) ++ cfi_offset (f0, -56) ++ std %f2,112(%r15) ++ cfi_offset (f2, -48) ++ std %f4,120(%r15) ++ cfi_offset (f4, -40) ++ std %f6,128(%r15) ++ cfi_offset (f6, -32) ++ stg %r14,96(15) ++ cfi_offset (r14, -64) ++ lmg %r2,%r3,48(%r15) # load args for fixup saved by PLT ++ lgr %r0,%r15 ++#ifdef RESTORE_VRS ++ aghi %r15,-288 # create stack frame ++ cfi_adjust_cfa_offset (288) ++ .machine push ++ .machine "z13" ++ vstm %v24,%v31,160(%r15)# store call-clobbered vector argument registers ++ cfi_offset (v24, -288) ++ cfi_offset (v25, -272) ++ cfi_offset (v26, -256) ++ cfi_offset (v27, -240) ++ cfi_offset (v28, -224) ++ cfi_offset (v29, -208) ++ cfi_offset (v30, -192) ++ cfi_offset (v31, -176) ++ .machine pop ++#else ++ aghi %r15,-160 # create stack frame ++ cfi_adjust_cfa_offset (160) ++#endif ++ stg %r0,0(%r15) # write backchain ++ brasl %r14,_dl_fixup # call _dl_fixup ++ lgr %r1,%r2 # function addr returned in r2 ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ vlm %v24,%v31,160(%r15)# restore vector registers ++ .machine pop ++ aghi %r15,288 # remove stack frame ++ cfi_adjust_cfa_offset (-288) ++#else ++ aghi %r15,160 # remove stack frame ++ cfi_adjust_cfa_offset (-160) ++#endif ++ lg %r14,96(%r15) # restore registers ++ ld %f0,104(%r15) ++ ld %f2,112(%r15) ++ ld %f4,120(%r15) ++ ld %f6,128(%r15) ++ lmg %r2,%r5,64(%r15) ++ br %r1 ++ cfi_endproc ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve ++ ++ ++#ifndef PROF ++ .globl _dl_runtime_profile ++ .type _dl_runtime_profile, @function ++ cfi_startproc ++ .align 16 ++_dl_runtime_profile: ++ stmg %r2,%r6,64(%r15) # save call-clobbered arg regs ++ cfi_offset (r2, -96) # + r6 needed as arg for ++ cfi_offset (r3, -88) # _dl_profile_fixup ++ cfi_offset (r4, -80) ++ cfi_offset (r5, -72) ++ cfi_offset (r6, -64) ++ std %f0,104(%r15) ++ cfi_offset (f0, -56) ++ std %f2,112(%r15) ++ cfi_offset (f2, -48) ++ std %f4,120(%r15) ++ cfi_offset (f4, -40) ++ std %f6,128(%r15) ++ cfi_offset (f6, -32) ++ stg %r12,24(%r15) # r12 is used as backup of r15 ++ cfi_offset (r12, -136) ++ stg %r14,32(%r15) ++ cfi_offset (r14, -128) ++ lgr %r12,%r15 # backup stack pointer ++ cfi_def_cfa_register (12) ++#ifdef RESTORE_VRS ++ aghi %r15,-288 # create stack frame ++ .machine push ++ .machine "z13" ++ vstm %v24,%v31,160(%r15)# store call-clobbered vector argument registers ++ cfi_offset (v24, -288) ++ cfi_offset (v25, -272) ++ cfi_offset (v26, -256) ++ cfi_offset (v27, -240) ++ cfi_offset (v28, -224) ++ cfi_offset (v29, -208) ++ cfi_offset (v30, -192) ++ cfi_offset (v31, -176) ++ .machine pop ++#else ++ aghi %r15,-160 # create stack frame ++#endif ++ stg %r12,0(%r15) # save backchain ++ lmg %r2,%r3,48(%r12) # load arguments saved by PLT ++ lgr %r4,%r14 # return address as third parameter ++ la %r5,64(%r12) # pointer to struct La_s390_64_regs ++ la %r6,40(%r12) # long int * framesize ++ brasl %r14,_dl_profile_fixup # call resolver ++ lgr %r1,%r2 # function addr returned in r2 ++ ld %f0,104(%r12) # restore call-clobbered arg fprs ++ ld %f2,112(%r12) ++ ld %f4,120(%r12) ++ ld %f6,128(%r12) ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ vlm %v24,%v31,160(%r15) # restore call-clobbered arg vrs ++ .machine pop ++#endif ++ lg %r0,40(%r12) # load framesize ++ ltgr %r0,%r0 ++ jnm 1f ++ ++ lmg %r2,%r6,64(%r12) # framesize < 0 means no pltexit call ++ # so we can do a tail call without ++ # copying the arg overflow area ++ lgr %r15,%r12 # remove stack frame ++ cfi_def_cfa_register (15) ++ lg %r14,32(%r15) # restore registers ++ lg %r12,24(%r15) ++ br %r1 # tail-call to resolved function ++ ++ cfi_def_cfa_register (12) ++1: jz 4f # framesize == 0 ? ++ aghi %r0,7 # align framesize to 8 ++ nill %r0,0xfff8 ++ slgr %r15,%r0 # make room for framesize bytes ++ stg %r12,0(%r15) # save backchain ++ la %r2,160(%r15) ++ la %r3,160(%r12) ++ srlg %r0,%r0,3 ++3: mvc 0(8,%r2),0(%r3) # copy additional parameters ++ la %r2,8(%r2) # depending on framesize ++ la %r3,8(%r3) ++ brctg %r0,3b ++4: lmg %r2,%r6,64(%r12) # restore call-clobbered arg gprs ++ basr %r14,%r1 # call resolved function ++ stg %r2,136(%r12) # store return values r2, f0 ++ std %f0,144(%r12) # to struct La_s390_64_retval ++ lmg %r2,%r3,48(%r12) # load arguments saved by PLT ++ la %r4,64(%r12) # pointer to struct La_s390_64_regs ++ la %r5,136(%r12) # pointer to struct La_s390_64_retval ++ brasl %r14,_dl_call_pltexit ++ ++ lgr %r15,%r12 # remove stack frame ++ cfi_def_cfa_register (15) ++ lg %r14,32(%r15) # restore registers ++ lg %r12,24(%r15) ++ lg %r2,136(%r15) # restore return values ++ ld %f0,144(%r15) ++ br %r14 # Jump back to caller ++ ++ cfi_endproc ++ .size _dl_runtime_profile, .-_dl_runtime_profile ++#endif diff --git a/SOURCES/glibc-rh1324427-2.patch b/SOURCES/glibc-rh1324427-2.patch new file mode 100644 index 0000000..9d6f9f1 --- /dev/null +++ b/SOURCES/glibc-rh1324427-2.patch @@ -0,0 +1,384 @@ +commit 5cdd1989d1d2f135d02e66250f37ba8e767f9772 +Author: Stefan Liebler +Date: Thu Mar 31 17:37:16 2016 +0200 + + S390: Extend structs La_s390_regs / La_s390_retval with vector-registers. + + Starting with z13, vector registers can also occur as argument registers. + Thus the passed input/output register structs for + la_s390_[32|64]_gnu_plt[enter|exit] functions should reflect those new + registers. This patch extends these structs La_s390_regs and La_s390_retval + and adjusts _dl_runtime_profile() to handle those fields in case of + running on a z13 machine. + + ChangeLog: + + * sysdeps/s390/bits/link.h: (La_s390_vr) New typedef. + (La_s390_32_regs): Append vector register lr_v24-lr_v31. + (La_s390_64_regs): Likewise. + (La_s390_32_retval): Append vector register lrv_v24. + (La_s390_64_retval): Likeweise. + * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_profile): + Handle extended structs La_s390_32_regs and La_s390_32_retval. + * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile): + Handle extended structs La_s390_64_regs and La_s390_64_retval. + +diff --git a/sysdeps/s390/bits/link.h b/sysdeps/s390/bits/link.h +index 2ef7f44..e27ed67 100644 +--- a/sysdeps/s390/bits/link.h ++++ b/sysdeps/s390/bits/link.h +@@ -19,6 +19,9 @@ + # error "Never include directly; use instead." + #endif + ++#if defined HAVE_S390_VX_ASM_SUPPORT ++typedef char La_s390_vr[16]; ++#endif + + #if __ELF_NATIVE_CLASS == 32 + +@@ -32,6 +35,16 @@ typedef struct La_s390_32_regs + uint32_t lr_r6; + double lr_fp0; + double lr_fp2; ++# if defined HAVE_S390_VX_ASM_SUPPORT ++ La_s390_vr lr_v24; ++ La_s390_vr lr_v25; ++ La_s390_vr lr_v26; ++ La_s390_vr lr_v27; ++ La_s390_vr lr_v28; ++ La_s390_vr lr_v29; ++ La_s390_vr lr_v30; ++ La_s390_vr lr_v31; ++# endif + } La_s390_32_regs; + + /* Return values for calls from PLT on s390-32. */ +@@ -40,6 +53,9 @@ typedef struct La_s390_32_retval + uint32_t lrv_r2; + uint32_t lrv_r3; + double lrv_fp0; ++# if defined HAVE_S390_VX_ASM_SUPPORT ++ La_s390_vr lrv_v24; ++# endif + } La_s390_32_retval; + + +@@ -77,6 +93,16 @@ typedef struct La_s390_64_regs + double lr_fp2; + double lr_fp4; + double lr_fp6; ++# if defined HAVE_S390_VX_ASM_SUPPORT ++ La_s390_vr lr_v24; ++ La_s390_vr lr_v25; ++ La_s390_vr lr_v26; ++ La_s390_vr lr_v27; ++ La_s390_vr lr_v28; ++ La_s390_vr lr_v29; ++ La_s390_vr lr_v30; ++ La_s390_vr lr_v31; ++# endif + } La_s390_64_regs; + + /* Return values for calls from PLT on s390-64. */ +@@ -84,6 +110,9 @@ typedef struct La_s390_64_retval + { + uint64_t lrv_r2; + double lrv_fp0; ++# if defined HAVE_S390_VX_ASM_SUPPORT ++ La_s390_vr lrv_v24; ++# endif + } La_s390_64_retval; + + +diff --git a/sysdeps/s390/s390-32/dl-trampoline.h b/sysdeps/s390/s390-32/dl-trampoline.h +index a152a7b..bb74d27 100644 +--- a/sysdeps/s390/s390-32/dl-trampoline.h ++++ b/sysdeps/s390/s390-32/dl-trampoline.h +@@ -112,28 +112,31 @@ _dl_runtime_resolve: + cfi_startproc + .align 16 + _dl_runtime_profile: +- stm %r2,%r6,32(%r15) # save registers +- cfi_offset (r2, -64) # + r6 needed as arg for +- cfi_offset (r3, -60) # _dl_profile_fixup +- cfi_offset (r4, -56) +- cfi_offset (r5, -52) +- cfi_offset (r6, -48) +- std %f0,56(%r15) +- cfi_offset (f0, -40) +- std %f2,64(%r15) +- cfi_offset (f2, -32) + st %r12,12(%r15) # r12 is used as backup of r15 + cfi_offset (r12, -84) + st %r14,16(%r15) + cfi_offset (r14, -80) + lr %r12,%r15 # backup stack pointer + cfi_def_cfa_register (12) ++ ahi %r15,-264 # create stack frame: ++ # 96 + sizeof(La_s390_32_regs) ++ st %r12,0(%r15) # save backchain ++ ++ stm %r2,%r6,96(%r15) # save registers ++ cfi_offset (r2, -264) # + r6 needed as arg for ++ cfi_offset (r3, -260) # _dl_profile_fixup ++ cfi_offset (r4, -256) ++ cfi_offset (r5, -252) ++ cfi_offset (r6, -248) ++ std %f0,120(%r15) ++ cfi_offset (f0, -240) ++ std %f2,128(%r15) ++ cfi_offset (f2, -232) + #ifdef RESTORE_VRS +- ahi %r15,-224 # create stack frame + .machine push + .machine "z13" + .machinemode "zarch_nohighgprs" +- vstm %v24,%v31,96(%r15) # store call-clobbered vr arguments ++ vstm %v24,%v31,136(%r15) # store call-clobbered vr arguments + cfi_offset (v24, -224) + cfi_offset (v25, -208) + cfi_offset (v26, -192) +@@ -143,31 +146,31 @@ _dl_runtime_profile: + cfi_offset (v30, -128) + cfi_offset (v31, -112) + .machine pop +-#else +- ahi %r15,-96 # create stack frame + #endif +- st %r12,0(%r15) # save backchain ++ + lm %r2,%r3,24(%r12) # load arguments saved by PLT + lr %r4,%r14 # return address as third parameter + basr %r1,0 + 0: l %r14,6f-0b(%r1) +- la %r5,32(%r12) # pointer to struct La_s390_32_regs ++ la %r5,96(%r15) # pointer to struct La_s390_32_regs + la %r6,20(%r12) # long int * framesize + bas %r14,0(%r14,%r1) # call resolver + lr %r1,%r2 # function addr returned in r2 +- ld %f0,56(%r12) # restore call-clobbered arg fprs +- ld %f2,64(%r12) ++ ld %f0,120(%r15) # restore call-clobbered arg fprs ++ ld %f2,128(%r15) + #ifdef RESTORE_VRS + .machine push + .machine "z13" + .machinemode "zarch_nohighgprs" +- vlm %v24,%v31,96(%r15) # restore call-clobbered arg vrs ++ vlm %v24,%v31,136(%r15) # restore call-clobbered arg vrs + .machine pop + #endif + icm %r0,15,20(%r12) # load & test framesize + jnm 2f + +- lm %r2,%r6,32(%r12) ++ lm %r2,%r6,96(%r15) # framesize < 0 means no pltexit call ++ # so we can do a tail call without ++ # copying the arg overflow area + lr %r15,%r12 # remove stack frame + cfi_def_cfa_register (15) + l %r14,16(%r15) # restore registers +@@ -175,7 +178,9 @@ _dl_runtime_profile: + br %r1 # tail-call to the resolved function + + cfi_def_cfa_register (12) +-2: jz 4f # framesize == 0 ? ++2: la %r4,96(%r15) # pointer to struct La_s390_32_regs ++ st %r4,32(%r12) ++ jz 4f # framesize == 0 ? + ahi %r0,7 # align framesize to 8 + lhi %r2,-8 + nr %r0,%r2 +@@ -188,24 +193,35 @@ _dl_runtime_profile: + la %r2,8(%r2) + la %r3,8(%r3) + brct %r0,3b +-4: lm %r2,%r6,32(%r12) # load register parameters ++4: lm %r2,%r6,0(%r4) # load register parameters + basr %r14,%r1 # call resolved function +- stm %r2,%r3,72(%r12) # store return values r2, r3, f0 +- std %f0,80(%r12) # to struct La_s390_32_retval +- lm %r2,%r3,24(%r12) # load arguments saved by PLT ++ stm %r2,%r3,40(%r12) # store return values r2, r3, f0 ++ std %f0,48(%r12) # to struct La_s390_32_retval ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ vst %v24,56(%r12) # store return value v24 ++ .machine pop ++#endif ++ lm %r2,%r4,24(%r12) # r2, r3: load arguments saved by PLT ++ # r4: pointer to struct La_s390_32_regs + basr %r1,0 + 5: l %r14,7f-5b(%r1) +- la %r4,32(%r12) # pointer to struct La_s390_32_regs +- la %r5,72(%r12) # pointer to struct La_s390_32_retval ++ la %r5,40(%r12) # pointer to struct La_s390_32_retval + bas %r14,0(%r14,%r1) # call _dl_call_pltexit + + lr %r15,%r12 # remove stack frame + cfi_def_cfa_register (15) + l %r14,16(%r15) # restore registers + l %r12,12(%r15) +- l %r2,72(%r15) # restore return values +- l %r3,76(%r15) +- ld %f0,80(%r15) ++ lm %r2,%r3,40(%r15) # restore return values ++ ld %f0,48(%r15) ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ vl %v24,56(%r15) # restore return value v24 ++ .machine pop ++#endif + br %r14 + + 6: .long _dl_profile_fixup - 0b +diff --git a/sysdeps/s390/s390-64/dl-trampoline.h b/sysdeps/s390/s390-64/dl-trampoline.h +index 658e3a3..33ea3de 100644 +--- a/sysdeps/s390/s390-64/dl-trampoline.h ++++ b/sysdeps/s390/s390-64/dl-trampoline.h +@@ -109,31 +109,34 @@ _dl_runtime_resolve: + cfi_startproc + .align 16 + _dl_runtime_profile: +- stmg %r2,%r6,64(%r15) # save call-clobbered arg regs +- cfi_offset (r2, -96) # + r6 needed as arg for +- cfi_offset (r3, -88) # _dl_profile_fixup +- cfi_offset (r4, -80) +- cfi_offset (r5, -72) +- cfi_offset (r6, -64) +- std %f0,104(%r15) +- cfi_offset (f0, -56) +- std %f2,112(%r15) +- cfi_offset (f2, -48) +- std %f4,120(%r15) +- cfi_offset (f4, -40) +- std %f6,128(%r15) +- cfi_offset (f6, -32) + stg %r12,24(%r15) # r12 is used as backup of r15 + cfi_offset (r12, -136) + stg %r14,32(%r15) + cfi_offset (r14, -128) + lgr %r12,%r15 # backup stack pointer + cfi_def_cfa_register (12) ++ aghi %r15,-360 # create stack frame: ++ # 160 + sizeof(La_s390_64_regs) ++ stg %r12,0(%r15) # save backchain ++ ++ stmg %r2,%r6,160(%r15) # save call-clobbered arg regs ++ cfi_offset (r2, -360) # + r6 needed as arg for ++ cfi_offset (r3, -352) # _dl_profile_fixup ++ cfi_offset (r4, -344) ++ cfi_offset (r5, -336) ++ cfi_offset (r6, -328) ++ std %f0,200(%r15) ++ cfi_offset (f0, -320) ++ std %f2,208(%r15) ++ cfi_offset (f2, -312) ++ std %f4,216(%r15) ++ cfi_offset (f4, -304) ++ std %f6,224(%r15) ++ cfi_offset (f6, -296) + #ifdef RESTORE_VRS +- aghi %r15,-288 # create stack frame + .machine push + .machine "z13" +- vstm %v24,%v31,160(%r15)# store call-clobbered vector argument registers ++ vstm %v24,%v31,232(%r15) # store call-clobbered vector arguments + cfi_offset (v24, -288) + cfi_offset (v25, -272) + cfi_offset (v26, -256) +@@ -143,31 +146,28 @@ _dl_runtime_profile: + cfi_offset (v30, -192) + cfi_offset (v31, -176) + .machine pop +-#else +- aghi %r15,-160 # create stack frame + #endif +- stg %r12,0(%r15) # save backchain + lmg %r2,%r3,48(%r12) # load arguments saved by PLT + lgr %r4,%r14 # return address as third parameter +- la %r5,64(%r12) # pointer to struct La_s390_64_regs ++ la %r5,160(%r15) # pointer to struct La_s390_64_regs + la %r6,40(%r12) # long int * framesize + brasl %r14,_dl_profile_fixup # call resolver + lgr %r1,%r2 # function addr returned in r2 +- ld %f0,104(%r12) # restore call-clobbered arg fprs +- ld %f2,112(%r12) +- ld %f4,120(%r12) +- ld %f6,128(%r12) ++ ld %f0,200(%r15) # restore call-clobbered arg fprs ++ ld %f2,208(%r15) ++ ld %f4,216(%r15) ++ ld %f6,224(%r15) + #ifdef RESTORE_VRS + .machine push + .machine "z13" +- vlm %v24,%v31,160(%r15) # restore call-clobbered arg vrs ++ vlm %v24,%v31,232(%r15) # restore call-clobbered arg vrs + .machine pop + #endif + lg %r0,40(%r12) # load framesize + ltgr %r0,%r0 + jnm 1f + +- lmg %r2,%r6,64(%r12) # framesize < 0 means no pltexit call ++ lmg %r2,%r6,160(%r15) # framesize < 0 means no pltexit call + # so we can do a tail call without + # copying the arg overflow area + lgr %r15,%r12 # remove stack frame +@@ -177,7 +177,9 @@ _dl_runtime_profile: + br %r1 # tail-call to resolved function + + cfi_def_cfa_register (12) +-1: jz 4f # framesize == 0 ? ++1: la %r4,160(%r15) # pointer to struct La_s390_64_regs ++ stg %r4,64(%r12) ++ jz 4f # framesize == 0 ? + aghi %r0,7 # align framesize to 8 + nill %r0,0xfff8 + slgr %r15,%r0 # make room for framesize bytes +@@ -189,21 +191,33 @@ _dl_runtime_profile: + la %r2,8(%r2) # depending on framesize + la %r3,8(%r3) + brctg %r0,3b +-4: lmg %r2,%r6,64(%r12) # restore call-clobbered arg gprs ++4: lmg %r2,%r6,0(%r4) # restore call-clobbered arg gprs + basr %r14,%r1 # call resolved function +- stg %r2,136(%r12) # store return values r2, f0 +- std %f0,144(%r12) # to struct La_s390_64_retval +- lmg %r2,%r3,48(%r12) # load arguments saved by PLT +- la %r4,64(%r12) # pointer to struct La_s390_64_regs +- la %r5,136(%r12) # pointer to struct La_s390_64_retval ++ stg %r2,72(%r12) # store return values r2, f0 ++ std %f0,80(%r12) # to struct La_s390_64_retval ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ vst %v24,88(%r12) # store return value v24 ++ .machine pop ++#endif ++ lmg %r2,%r4,48(%r12) # r2, r3: load arguments saved by PLT ++ # r4: pointer to struct La_s390_64_regs ++ la %r5,72(%r12) # pointer to struct La_s390_64_retval + brasl %r14,_dl_call_pltexit + + lgr %r15,%r12 # remove stack frame + cfi_def_cfa_register (15) + lg %r14,32(%r15) # restore registers + lg %r12,24(%r15) +- lg %r2,136(%r15) # restore return values +- ld %f0,144(%r15) ++ lg %r2,72(%r15) # restore return values ++ ld %f0,80(%r15) ++#ifdef RESTORE_VRS ++ .machine push ++ .machine "z13" ++ vl %v24,88(%r15) # restore return value v24 ++ .machine pop ++#endif + br %r14 # Jump back to caller + + cfi_endproc diff --git a/SOURCES/glibc-rh1324427-3.patch b/SOURCES/glibc-rh1324427-3.patch new file mode 100644 index 0000000..1fbe7ae --- /dev/null +++ b/SOURCES/glibc-rh1324427-3.patch @@ -0,0 +1,28 @@ +commit d8a012c5c9e4bfc1b8db2bc6deacb85b44a2e1eb +Author: Stefan Liebler +Date: Fri Apr 1 10:42:54 2016 +0200 + + S390: Use ahi instead of aghi in 32bit _dl_runtime_resolve. + + This patch uses ahi instead of aghi in 32bit _dl_runtime_resolve + to adjust the stack pointer. This is no functional change, + but a cosmetic one. + + ChangeLog: + + * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_resolve): + Use ahi instead of aghi to adjust stack pointer. + +diff --git a/sysdeps/s390/s390-32/dl-trampoline.h b/sysdeps/s390/s390-32/dl-trampoline.h +index bb74d27..086449f 100644 +--- a/sysdeps/s390/s390-32/dl-trampoline.h ++++ b/sysdeps/s390/s390-32/dl-trampoline.h +@@ -90,7 +90,7 @@ _dl_runtime_resolve: + .machinemode "zarch_nohighgprs" + vlm %v24,%v31,96(%r15) # restore vector registers + .machine pop +- aghi %r15,224 # remove stack frame ++ ahi %r15,224 # remove stack frame + cfi_adjust_cfa_offset (-224) + #else + ahi %r15,96 # remove stack frame diff --git a/SOURCES/glibc-rh1335286-0.patch b/SOURCES/glibc-rh1335286-0.patch new file mode 100644 index 0000000..80f64c6 --- /dev/null +++ b/SOURCES/glibc-rh1335286-0.patch @@ -0,0 +1,78 @@ +On top of this patch we include a few more redirecting versions of +the rtld-* routines in multiarch, this is needed because of the +sysd-rules which try to build from multiarch first and will even +use memset.S from multiarch to buidl rtld-memset.os, which results +in SSE register usage in rtld which we can't allow because of +lazy binding (though in some cases we use RTLD_PREPARE_FOREIGN_CALL +and others to wrap such calls). + +commit 747ef469ffc9c9179ca9d76854167925b4e44346 +Author: Siddhesh Poyarekar +Date: Sat Jun 15 00:09:26 2013 +0530 + + Add rtld-memset.S for x86_64 + + Resolves: BZ #15627 + + Add an assembler version of rtld-memset to avoid using SSE registers. + +Index: glibc-2.17-c758a686/sysdeps/x86_64/rtld-memset.S +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/rtld-memset.S +@@ -0,0 +1,37 @@ ++/* memset implementation for the dynamic linker. This is separate from the ++ libc implementation to avoid writing to SSE registers. ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include "asm-syntax.h" ++ ++ ++ .text ++/* void *memset (void *dest, char c, size_t count) ++ dest => %rdi ++ c => %rsi ++ count => %rdx */ ++ENTRY (memset) ++ mov %rdx, %rcx ++ movzbl %sil, %eax ++ mov %rdi, %rdx ++ rep stosb ++ mov %rdx, %rax ++ ret ++END (memset) ++libc_hidden_builtin_def (memset) +Index: glibc-2.17-c758a686/sysdeps/x86_64/rtld-memset.c +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/rtld-memset.c ++++ /dev/null +@@ -1 +0,0 @@ +-#include +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rtld-memset.S +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rtld-memset.S +@@ -0,0 +1 @@ ++#include "../rtld-memset.S" +Index: glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rtld-strchr.S +=================================================================== +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/rtld-strchr.S +@@ -0,0 +1 @@ ++#include "../rtld-strchr.S" diff --git a/SOURCES/glibc-rh1335286.patch b/SOURCES/glibc-rh1335286.patch new file mode 100644 index 0000000..39b0e33 --- /dev/null +++ b/SOURCES/glibc-rh1335286.patch @@ -0,0 +1,1449 @@ +From 143ce75a4203a78d79549b00e570a5bb429c44cf Mon Sep 17 00:00:00 2001 +From: Ondrej Bilka +Date: Mon, 20 May 2013 08:26:00 +0200 +Subject: [PATCH] Faster memset on x64 + +This implementation speed up memset in several ways. First is +avoiding expensive computed jump. Second is using fact that arguments +of memset are most of time aligned to 8 bytes. + +Benchmark results on: + +kam.mff.cuni.cz/~ondra/benchmark_string/memset_profile_result27_04_13.tar.bz2 + +(cherry picked from commit b2b671b677d92429a3d41bf451668f476aa267ed) +--- + sysdeps/x86_64/memset.S | 1406 +++-------------------------------------------- + 1 file changed, 91 insertions(+), 1315 deletions(-) + +Index: glibc-2.17-c758a686/sysdeps/x86_64/memset.S +=================================================================== +--- glibc-2.17-c758a686.orig/sysdeps/x86_64/memset.S ++++ glibc-2.17-c758a686/sysdeps/x86_64/memset.S +@@ -19,17 +19,31 @@ + + #include + +-#define __STOS_LOWER_BOUNDARY $8192 +-#define __STOS_UPPER_BOUNDARY $65536 ++#ifndef ALIGN ++# define ALIGN(n) .p2align n ++#endif + + .text + #if IS_IN (libc) && !defined USE_MULTIARCH + ENTRY(__bzero) +- mov %rsi,%rdx /* Adjust parameter. */ +- xorl %esi,%esi /* Fill with 0s. */ +- jmp L(memset_entry) ++ movq %rdi, %rax /* Set return value. */ ++ movq %rsi, %rdx /* Set n. */ ++ pxor %xmm8, %xmm8 ++ jmp L(entry_from_bzero) + END(__bzero) + weak_alias (__bzero, bzero) ++ ++/* Like memset but takes additional parameter with return value. */ ++ENTRY(__memset_tail) ++ movq %rcx, %rax /* Set return value. */ ++ ++ movd %esi, %xmm8 ++ punpcklbw %xmm8, %xmm8 ++ punpcklwd %xmm8, %xmm8 ++ pshufd $0, %xmm8, %xmm8 ++ ++ jmp L(entry_from_bzero) ++END(__memset_tail) + #endif + + #if defined PIC && IS_IN (libc) +@@ -38,1318 +52,80 @@ ENTRY_CHK (__memset_chk) + jb HIDDEN_JUMPTARGET (__chk_fail) + END_CHK (__memset_chk) + #endif +-ENTRY (memset) +-L(memset_entry): +- cmp $0x1,%rdx +- mov %rdi,%rax /* memset returns the dest address. */ +- jne L(ck2) +- mov %sil,(%rdi) +- retq +-L(ck2): +- mov $0x101010101010101,%r9 +- mov %rdx,%r8 +- movzbq %sil,%rdx +- imul %r9,%rdx +-L(now_dw_aligned): +- cmp $0x90,%r8 +- ja L(ck_mem_ops_method) +-L(now_dw_aligned_small): +- add %r8,%rdi +-#ifndef PIC +- lea L(setPxQx)(%rip),%r11 +- jmpq *(%r11,%r8,8) +-#else +- lea L(Got0)(%rip),%r11 +- lea L(setPxQx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-#endif +- +-L(Got0): +- retq +- +- .pushsection .rodata +- .balign 16 +-#ifndef PIC +-L(setPxQx): +- .quad L(Got0), L(P1Q0), L(P2Q0), L(P3Q0) +- .quad L(P4Q0), L(P5Q0), L(P6Q0), L(P7Q0) +- .quad L(P0Q1), L(P1Q1), L(P2Q1), L(P3Q1) +- .quad L(P4Q1), L(P5Q1), L(P6Q1), L(P7Q1) +- .quad L(P0Q2), L(P1Q2), L(P2Q2), L(P3Q2) +- .quad L(P4Q2), L(P5Q2), L(P6Q2), L(P7Q2) +- .quad L(P0Q3), L(P1Q3), L(P2Q3), L(P3Q3) +- .quad L(P4Q3), L(P5Q3), L(P6Q3), L(P7Q3) +- .quad L(P0Q4), L(P1Q4), L(P2Q4), L(P3Q4) +- .quad L(P4Q4), L(P5Q4), L(P6Q4), L(P7Q4) +- .quad L(P0Q5), L(P1Q5), L(P2Q5), L(P3Q5) +- .quad L(P4Q5), L(P5Q5), L(P6Q5), L(P7Q5) +- .quad L(P0Q6), L(P1Q6), L(P2Q6), L(P3Q6) +- .quad L(P4Q6), L(P5Q6), L(P6Q6), L(P7Q6) +- .quad L(P0Q7), L(P1Q7), L(P2Q7), L(P3Q7) +- .quad L(P4Q7), L(P5Q7), L(P6Q7), L(P7Q7) +- .quad L(P0Q8), L(P1Q8), L(P2Q8), L(P3Q8) +- .quad L(P4Q8), L(P5Q8), L(P6Q8), L(P7Q8) +- .quad L(P0Q9), L(P1Q9), L(P2Q9), L(P3Q9) +- .quad L(P4Q9), L(P5Q9), L(P6Q9), L(P7Q9) +- .quad L(P0QA), L(P1QA), L(P2QA), L(P3QA) +- .quad L(P4QA), L(P5QA), L(P6QA), L(P7QA) +- .quad L(P0QB), L(P1QB), L(P2QB), L(P3QB) +- .quad L(P4QB), L(P5QB), L(P6QB), L(P7QB) +- .quad L(P0QC), L(P1QC), L(P2QC), L(P3QC) +- .quad L(P4QC), L(P5QC), L(P6QC), L(P7QC) +- .quad L(P0QD), L(P1QD), L(P2QD), L(P3QD) +- .quad L(P4QD), L(P5QD), L(P6QD), L(P7QD) +- .quad L(P0QE), L(P1QE), L(P2QE), L(P3QE) +- .quad L(P4QE), L(P5QE), L(P6QE), L(P7QE) +- .quad L(P0QF), L(P1QF), L(P2QF), L(P3QF) +- .quad L(P4QF), L(P5QF), L(P6QF), L(P7QF) +- .quad L(P0QG), L(P1QG), L(P2QG), L(P3QG) +- .quad L(P4QG), L(P5QG), L(P6QG), L(P7QG) +- .quad L(P0QH), L(P1QH), L(P2QH), L(P3QH) +- .quad L(P4QH), L(P5QH), L(P6QH), L(P7QH) +- .quad L(P0QI) +-# ifdef USE_EXTRA_TABLE +- .quad L(P1QI), L(P2QI), L(P3QI), L(P4QI) +- .quad L(P5QI), L(P6QI), L(P7QI) +-# endif +-#else +-L(setPxQx): +- .short L(Got0)-L(Got0) +- .short L(P1Q0)-L(Got0) +- .short L(P2Q0)-L(Got0) +- .short L(P3Q0)-L(Got0) +- .short L(P4Q0)-L(Got0) +- .short L(P5Q0)-L(Got0) +- .short L(P6Q0)-L(Got0) +- .short L(P7Q0)-L(Got0) +- +- .short L(P0Q1)-L(Got0) +- .short L(P1Q1)-L(Got0) +- .short L(P2Q1)-L(Got0) +- .short L(P3Q1)-L(Got0) +- .short L(P4Q1)-L(Got0) +- .short L(P5Q1)-L(Got0) +- .short L(P6Q1)-L(Got0) +- .short L(P7Q1)-L(Got0) +- +- .short L(P0Q2)-L(Got0) +- .short L(P1Q2)-L(Got0) +- .short L(P2Q2)-L(Got0) +- .short L(P3Q2)-L(Got0) +- .short L(P4Q2)-L(Got0) +- .short L(P5Q2)-L(Got0) +- .short L(P6Q2)-L(Got0) +- .short L(P7Q2)-L(Got0) +- +- .short L(P0Q3)-L(Got0) +- .short L(P1Q3)-L(Got0) +- .short L(P2Q3)-L(Got0) +- .short L(P3Q3)-L(Got0) +- .short L(P4Q3)-L(Got0) +- .short L(P5Q3)-L(Got0) +- .short L(P6Q3)-L(Got0) +- .short L(P7Q3)-L(Got0) +- +- .short L(P0Q4)-L(Got0) +- .short L(P1Q4)-L(Got0) +- .short L(P2Q4)-L(Got0) +- .short L(P3Q4)-L(Got0) +- .short L(P4Q4)-L(Got0) +- .short L(P5Q4)-L(Got0) +- .short L(P6Q4)-L(Got0) +- .short L(P7Q4)-L(Got0) +- +- .short L(P0Q5)-L(Got0) +- .short L(P1Q5)-L(Got0) +- .short L(P2Q5)-L(Got0) +- .short L(P3Q5)-L(Got0) +- .short L(P4Q5)-L(Got0) +- .short L(P5Q5)-L(Got0) +- .short L(P6Q5)-L(Got0) +- .short L(P7Q5)-L(Got0) +- +- .short L(P0Q6)-L(Got0) +- .short L(P1Q6)-L(Got0) +- .short L(P2Q6)-L(Got0) +- .short L(P3Q6)-L(Got0) +- .short L(P4Q6)-L(Got0) +- .short L(P5Q6)-L(Got0) +- .short L(P6Q6)-L(Got0) +- .short L(P7Q6)-L(Got0) +- +- .short L(P0Q7)-L(Got0) +- .short L(P1Q7)-L(Got0) +- .short L(P2Q7)-L(Got0) +- .short L(P3Q7)-L(Got0) +- .short L(P4Q7)-L(Got0) +- .short L(P5Q7)-L(Got0) +- .short L(P6Q7)-L(Got0) +- .short L(P7Q7)-L(Got0) +- +- .short L(P0Q8)-L(Got0) +- .short L(P1Q8)-L(Got0) +- .short L(P2Q8)-L(Got0) +- .short L(P3Q8)-L(Got0) +- .short L(P4Q8)-L(Got0) +- .short L(P5Q8)-L(Got0) +- .short L(P6Q8)-L(Got0) +- .short L(P7Q8)-L(Got0) +- +- .short L(P0Q9)-L(Got0) +- .short L(P1Q9)-L(Got0) +- .short L(P2Q9)-L(Got0) +- .short L(P3Q9)-L(Got0) +- .short L(P4Q9)-L(Got0) +- .short L(P5Q9)-L(Got0) +- .short L(P6Q9)-L(Got0) +- .short L(P7Q9)-L(Got0) +- +- .short L(P0QA)-L(Got0) +- .short L(P1QA)-L(Got0) +- .short L(P2QA)-L(Got0) +- .short L(P3QA)-L(Got0) +- .short L(P4QA)-L(Got0) +- .short L(P5QA)-L(Got0) +- .short L(P6QA)-L(Got0) +- .short L(P7QA)-L(Got0) +- +- .short L(P0QB)-L(Got0) +- .short L(P1QB)-L(Got0) +- .short L(P2QB)-L(Got0) +- .short L(P3QB)-L(Got0) +- .short L(P4QB)-L(Got0) +- .short L(P5QB)-L(Got0) +- .short L(P6QB)-L(Got0) +- .short L(P7QB)-L(Got0) +- +- .short L(P0QC)-L(Got0) +- .short L(P1QC)-L(Got0) +- .short L(P2QC)-L(Got0) +- .short L(P3QC)-L(Got0) +- .short L(P4QC)-L(Got0) +- .short L(P5QC)-L(Got0) +- .short L(P6QC)-L(Got0) +- .short L(P7QC)-L(Got0) +- +- .short L(P0QD)-L(Got0) +- .short L(P1QD)-L(Got0) +- .short L(P2QD)-L(Got0) +- .short L(P3QD)-L(Got0) +- .short L(P4QD)-L(Got0) +- .short L(P5QD)-L(Got0) +- .short L(P6QD)-L(Got0) +- .short L(P7QD)-L(Got0) +- +- .short L(P0QE)-L(Got0) +- .short L(P1QE)-L(Got0) +- .short L(P2QE)-L(Got0) +- .short L(P3QE)-L(Got0) +- .short L(P4QE)-L(Got0) +- .short L(P5QE)-L(Got0) +- .short L(P6QE)-L(Got0) +- .short L(P7QE)-L(Got0) +- +- .short L(P0QF)-L(Got0) +- .short L(P1QF)-L(Got0) +- .short L(P2QF)-L(Got0) +- .short L(P3QF)-L(Got0) +- .short L(P4QF)-L(Got0) +- .short L(P5QF)-L(Got0) +- .short L(P6QF)-L(Got0) +- .short L(P7QF)-L(Got0) +- +- .short L(P0QG)-L(Got0) +- .short L(P1QG)-L(Got0) +- .short L(P2QG)-L(Got0) +- .short L(P3QG)-L(Got0) +- .short L(P4QG)-L(Got0) +- .short L(P5QG)-L(Got0) +- .short L(P6QG)-L(Got0) +- .short L(P7QG)-L(Got0) +- +- .short L(P0QH)-L(Got0) +- .short L(P1QH)-L(Got0) +- .short L(P2QH)-L(Got0) +- .short L(P3QH)-L(Got0) +- .short L(P4QH)-L(Got0) +- .short L(P5QH)-L(Got0) +- .short L(P6QH)-L(Got0) +- .short L(P7QH)-L(Got0) +- +- .short L(P0QI)-L(Got0) +-# ifdef USE_EXTRA_TABLE +- .short L(P1QI)-L(Got0) +- .short L(P2QI)-L(Got0) +- .short L(P3QI)-L(Got0) +- .short L(P4QI)-L(Got0) +- .short L(P5QI)-L(Got0) +- .short L(P6QI)-L(Got0) +- .short L(P7QI)-L(Got0) +-# endif +-#endif +- .popsection +- +- .balign 16 +-#ifdef USE_EXTRA_TABLE +-L(P1QI): mov %rdx,-0x91(%rdi) +-#endif +-L(P1QH): mov %rdx,-0x89(%rdi) +-L(P1QG): mov %rdx,-0x81(%rdi) +-# .balign 16 +-L(P1QF): mov %rdx,-0x79(%rdi) +-L(P1QE): mov %rdx,-0x71(%rdi) +-L(P1QD): mov %rdx,-0x69(%rdi) +-L(P1QC): mov %rdx,-0x61(%rdi) +-L(P1QB): mov %rdx,-0x59(%rdi) +-L(P1QA): mov %rdx,-0x51(%rdi) +-L(P1Q9): mov %rdx,-0x49(%rdi) +-L(P1Q8): mov %rdx,-0x41(%rdi) +-L(P1Q7): mov %rdx,-0x39(%rdi) +-L(P1Q6): mov %rdx,-0x31(%rdi) +-L(P1Q5): mov %rdx,-0x29(%rdi) +-L(P1Q4): mov %rdx,-0x21(%rdi) +-L(P1Q3): mov %rdx,-0x19(%rdi) +-L(P1Q2): mov %rdx,-0x11(%rdi) +-L(P1Q1): mov %rdx,-0x9(%rdi) +-L(P1Q0): mov %dl,-0x1(%rdi) +- retq +- +- .balign 16 +-L(P0QI): mov %rdx,-0x90(%rdi) +-L(P0QH): mov %rdx,-0x88(%rdi) +-# .balign 16 +-L(P0QG): mov %rdx,-0x80(%rdi) +-L(P0QF): mov %rdx,-0x78(%rdi) +-L(P0QE): mov %rdx,-0x70(%rdi) +-L(P0QD): mov %rdx,-0x68(%rdi) +-L(P0QC): mov %rdx,-0x60(%rdi) +-L(P0QB): mov %rdx,-0x58(%rdi) +-L(P0QA): mov %rdx,-0x50(%rdi) +-L(P0Q9): mov %rdx,-0x48(%rdi) +-L(P0Q8): mov %rdx,-0x40(%rdi) +-L(P0Q7): mov %rdx,-0x38(%rdi) +-L(P0Q6): mov %rdx,-0x30(%rdi) +-L(P0Q5): mov %rdx,-0x28(%rdi) +-L(P0Q4): mov %rdx,-0x20(%rdi) +-L(P0Q3): mov %rdx,-0x18(%rdi) +-L(P0Q2): mov %rdx,-0x10(%rdi) +-L(P0Q1): mov %rdx,-0x8(%rdi) +-L(P0Q0): retq +- +- +- .balign 16 +-#ifdef USE_EXTRA_TABLE +-L(P2QI): mov %rdx,-0x92(%rdi) +-#endif +-L(P2QH): mov %rdx,-0x8a(%rdi) +-L(P2QG): mov %rdx,-0x82(%rdi) +-# .balign 16 +-L(P2QF): mov %rdx,-0x7a(%rdi) +-L(P2QE): mov %rdx,-0x72(%rdi) +-L(P2QD): mov %rdx,-0x6a(%rdi) +-L(P2QC): mov %rdx,-0x62(%rdi) +-L(P2QB): mov %rdx,-0x5a(%rdi) +-L(P2QA): mov %rdx,-0x52(%rdi) +-L(P2Q9): mov %rdx,-0x4a(%rdi) +-L(P2Q8): mov %rdx,-0x42(%rdi) +-L(P2Q7): mov %rdx,-0x3a(%rdi) +-L(P2Q6): mov %rdx,-0x32(%rdi) +-L(P2Q5): mov %rdx,-0x2a(%rdi) +-L(P2Q4): mov %rdx,-0x22(%rdi) +-L(P2Q3): mov %rdx,-0x1a(%rdi) +-L(P2Q2): mov %rdx,-0x12(%rdi) +-L(P2Q1): mov %rdx,-0xa(%rdi) +-L(P2Q0): mov %dx,-0x2(%rdi) +- retq +- +- .balign 16 +-#ifdef USE_EXTRA_TABLE +-L(P3QI): mov %rdx,-0x93(%rdi) +-#endif +-L(P3QH): mov %rdx,-0x8b(%rdi) +-L(P3QG): mov %rdx,-0x83(%rdi) +-# .balign 16 +-L(P3QF): mov %rdx,-0x7b(%rdi) +-L(P3QE): mov %rdx,-0x73(%rdi) +-L(P3QD): mov %rdx,-0x6b(%rdi) +-L(P3QC): mov %rdx,-0x63(%rdi) +-L(P3QB): mov %rdx,-0x5b(%rdi) +-L(P3QA): mov %rdx,-0x53(%rdi) +-L(P3Q9): mov %rdx,-0x4b(%rdi) +-L(P3Q8): mov %rdx,-0x43(%rdi) +-L(P3Q7): mov %rdx,-0x3b(%rdi) +-L(P3Q6): mov %rdx,-0x33(%rdi) +-L(P3Q5): mov %rdx,-0x2b(%rdi) +-L(P3Q4): mov %rdx,-0x23(%rdi) +-L(P3Q3): mov %rdx,-0x1b(%rdi) +-L(P3Q2): mov %rdx,-0x13(%rdi) +-L(P3Q1): mov %rdx,-0xb(%rdi) +-L(P3Q0): mov %dx,-0x3(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +- .balign 16 +-#ifdef USE_EXTRA_TABLE +-L(P4QI): mov %rdx,-0x94(%rdi) +-#endif +-L(P4QH): mov %rdx,-0x8c(%rdi) +-L(P4QG): mov %rdx,-0x84(%rdi) +-# .balign 16 +-L(P4QF): mov %rdx,-0x7c(%rdi) +-L(P4QE): mov %rdx,-0x74(%rdi) +-L(P4QD): mov %rdx,-0x6c(%rdi) +-L(P4QC): mov %rdx,-0x64(%rdi) +-L(P4QB): mov %rdx,-0x5c(%rdi) +-L(P4QA): mov %rdx,-0x54(%rdi) +-L(P4Q9): mov %rdx,-0x4c(%rdi) +-L(P4Q8): mov %rdx,-0x44(%rdi) +-L(P4Q7): mov %rdx,-0x3c(%rdi) +-L(P4Q6): mov %rdx,-0x34(%rdi) +-L(P4Q5): mov %rdx,-0x2c(%rdi) +-L(P4Q4): mov %rdx,-0x24(%rdi) +-L(P4Q3): mov %rdx,-0x1c(%rdi) +-L(P4Q2): mov %rdx,-0x14(%rdi) +-L(P4Q1): mov %rdx,-0xc(%rdi) +-L(P4Q0): mov %edx,-0x4(%rdi) +- retq +- +- .balign 16 +-#ifdef USE_EXTRA_TABLE +-L(P5QI): mov %rdx,-0x95(%rdi) +-#endif +-L(P5QH): mov %rdx,-0x8d(%rdi) +-L(P5QG): mov %rdx,-0x85(%rdi) +-# .balign 16 +-L(P5QF): mov %rdx,-0x7d(%rdi) +-L(P5QE): mov %rdx,-0x75(%rdi) +-L(P5QD): mov %rdx,-0x6d(%rdi) +-L(P5QC): mov %rdx,-0x65(%rdi) +-L(P5QB): mov %rdx,-0x5d(%rdi) +-L(P5QA): mov %rdx,-0x55(%rdi) +-L(P5Q9): mov %rdx,-0x4d(%rdi) +-L(P5Q8): mov %rdx,-0x45(%rdi) +-L(P5Q7): mov %rdx,-0x3d(%rdi) +-L(P5Q6): mov %rdx,-0x35(%rdi) +-L(P5Q5): mov %rdx,-0x2d(%rdi) +-L(P5Q4): mov %rdx,-0x25(%rdi) +-L(P5Q3): mov %rdx,-0x1d(%rdi) +-L(P5Q2): mov %rdx,-0x15(%rdi) +-L(P5Q1): mov %rdx,-0xd(%rdi) +-L(P5Q0): mov %edx,-0x5(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +- .balign 16 +-#ifdef USE_EXTRA_TABLE +-L(P6QI): mov %rdx,-0x96(%rdi) +-#endif +-L(P6QH): mov %rdx,-0x8e(%rdi) +-L(P6QG): mov %rdx,-0x86(%rdi) +-# .balign 16 +-L(P6QF): mov %rdx,-0x7e(%rdi) +-L(P6QE): mov %rdx,-0x76(%rdi) +-L(P6QD): mov %rdx,-0x6e(%rdi) +-L(P6QC): mov %rdx,-0x66(%rdi) +-L(P6QB): mov %rdx,-0x5e(%rdi) +-L(P6QA): mov %rdx,-0x56(%rdi) +-L(P6Q9): mov %rdx,-0x4e(%rdi) +-L(P6Q8): mov %rdx,-0x46(%rdi) +-L(P6Q7): mov %rdx,-0x3e(%rdi) +-L(P6Q6): mov %rdx,-0x36(%rdi) +-L(P6Q5): mov %rdx,-0x2e(%rdi) +-L(P6Q4): mov %rdx,-0x26(%rdi) +-L(P6Q3): mov %rdx,-0x1e(%rdi) +-L(P6Q2): mov %rdx,-0x16(%rdi) +-L(P6Q1): mov %rdx,-0xe(%rdi) +-L(P6Q0): mov %edx,-0x6(%rdi) +- mov %dx,-0x2(%rdi) +- retq +- +- .balign 16 +-#ifdef USE_EXTRA_TABLE +-L(P7QI): mov %rdx,-0x97(%rdi) +-#endif +-L(P7QH): mov %rdx,-0x8f(%rdi) +-L(P7QG): mov %rdx,-0x87(%rdi) +-# .balign 16 +-L(P7QF): mov %rdx,-0x7f(%rdi) +-L(P7QE): mov %rdx,-0x77(%rdi) +-L(P7QD): mov %rdx,-0x6f(%rdi) +-L(P7QC): mov %rdx,-0x67(%rdi) +-L(P7QB): mov %rdx,-0x5f(%rdi) +-L(P7QA): mov %rdx,-0x57(%rdi) +-L(P7Q9): mov %rdx,-0x4f(%rdi) +-L(P7Q8): mov %rdx,-0x47(%rdi) +-L(P7Q7): mov %rdx,-0x3f(%rdi) +-L(P7Q6): mov %rdx,-0x37(%rdi) +-L(P7Q5): mov %rdx,-0x2f(%rdi) +-L(P7Q4): mov %rdx,-0x27(%rdi) +-L(P7Q3): mov %rdx,-0x1f(%rdi) +-L(P7Q2): mov %rdx,-0x17(%rdi) +-L(P7Q1): mov %rdx,-0xf(%rdi) +-L(P7Q0): mov %edx,-0x7(%rdi) +- mov %dx,-0x3(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +- .balign 16 +-L(ck_mem_ops_method): +- +-# align to 16 byte boundary first +- #test $0xf,%rdi +- #jz L(aligned_now) +- mov $0x10,%r10 +- mov %rdi,%r9 +- and $0xf,%r9 +- sub %r9,%r10 +- and $0xf,%r10 +- add %r10,%rdi +- sub %r10,%r8 +-#ifndef PIC +- lea L(AliPxQx)(%rip),%r11 +- jmpq *(%r11,%r10,8) +-#else +- lea L(aligned_now)(%rip), %r11 +- lea L(AliPxQx)(%rip),%rcx +- movswq (%rcx,%r10,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-#endif +- +- .pushsection .rodata +- .balign 16 +-#ifndef PIC +-L(AliPxQx): +- .quad L(aligned_now), L(A1Q0), L(A2Q0), L(A3Q0) +- .quad L(A4Q0), L(A5Q0), L(A6Q0), L(A7Q0) +- .quad L(A0Q1), L(A1Q1), L(A2Q1), L(A3Q1) +- .quad L(A4Q1), L(A5Q1), L(A6Q1), L(A7Q1) +-#else +-L(AliPxQx): +- .short L(aligned_now)-L(aligned_now) +- .short L(A1Q0)-L(aligned_now) +- .short L(A2Q0)-L(aligned_now) +- .short L(A3Q0)-L(aligned_now) +- .short L(A4Q0)-L(aligned_now) +- .short L(A5Q0)-L(aligned_now) +- .short L(A6Q0)-L(aligned_now) +- .short L(A7Q0)-L(aligned_now) +- +- .short L(A0Q1)-L(aligned_now) +- .short L(A1Q1)-L(aligned_now) +- .short L(A2Q1)-L(aligned_now) +- .short L(A3Q1)-L(aligned_now) +- .short L(A4Q1)-L(aligned_now) +- .short L(A5Q1)-L(aligned_now) +- .short L(A6Q1)-L(aligned_now) +- .short L(A7Q1)-L(aligned_now) +-#endif +- .popsection +- +- .balign 16 +-L(A5Q1): mov %dl,-0xd(%rdi) +-L(A4Q1): mov %edx,-0xc(%rdi) +-L(A0Q1): mov %rdx,-0x8(%rdi) +-L(A0Q0): jmp L(aligned_now) +- +- .balign 16 +-L(A1Q1): mov %dl,-0x9(%rdi) +- mov %rdx,-0x8(%rdi) +- jmp L(aligned_now) +- +- .balign 16 +-L(A1Q0): mov %dl,-0x1(%rdi) +- jmp L(aligned_now) +- +- .balign 16 +-L(A3Q1): mov %dl,-0xb(%rdi) +-L(A2Q1): mov %dx,-0xa(%rdi) +- mov %rdx,-0x8(%rdi) +- jmp L(aligned_now) +- +- .balign 16 +-L(A3Q0): mov %dl,-0x3(%rdi) +-L(A2Q0): mov %dx,-0x2(%rdi) +- jmp L(aligned_now) +- +- .balign 16 +-L(A5Q0): mov %dl,-0x5(%rdi) +-L(A4Q0): mov %edx,-0x4(%rdi) +- jmp L(aligned_now) +- +- .balign 16 +-L(A7Q1): mov %dl,-0xf(%rdi) +-L(A6Q1): mov %dx,-0xe(%rdi) +- mov %edx,-0xc(%rdi) +- mov %rdx,-0x8(%rdi) +- jmp L(aligned_now) +- +- .balign 16 +-L(A7Q0): mov %dl,-0x7(%rdi) +-L(A6Q0): mov %dx,-0x6(%rdi) +- mov %edx,-0x4(%rdi) +- +-#ifndef USE_MULTIARCH +- jmp L(aligned_now) +- +-L(SSE_pre): +-#else +-L(aligned_now): +-#endif +-#if !defined USE_MULTIARCH || defined USE_SSE2 +- # fill RegXMM0 with the pattern +- movd %rdx,%xmm0 +- punpcklqdq %xmm0,%xmm0 +- +- cmp $0xb0,%r8 # 176 +- jae L(byte32sse2_pre) +- +- add %r8,%rdi +-# ifndef PIC +- lea L(SSExDx)(%rip),%r9 +- jmpq *(%r9,%r8,8) +-# else +- lea L(SSE0Q0)(%rip),%r9 +- lea L(SSExDx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r9,1),%r9 +- jmpq *%r9 +-# endif +- +-L(SSE0QB): movdqa %xmm0,-0xb0(%rdi) +-L(SSE0QA): movdqa %xmm0,-0xa0(%rdi) +-L(SSE0Q9): movdqa %xmm0,-0x90(%rdi) +-L(SSE0Q8): movdqa %xmm0,-0x80(%rdi) +-L(SSE0Q7): movdqa %xmm0,-0x70(%rdi) +-L(SSE0Q6): movdqa %xmm0,-0x60(%rdi) +-L(SSE0Q5): movdqa %xmm0,-0x50(%rdi) +-L(SSE0Q4): movdqa %xmm0,-0x40(%rdi) +-L(SSE0Q3): movdqa %xmm0,-0x30(%rdi) +-L(SSE0Q2): movdqa %xmm0,-0x20(%rdi) +-L(SSE0Q1): movdqa %xmm0,-0x10(%rdi) +-L(SSE0Q0): retq +- +-L(SSE1QB): movdqa %xmm0,-0xb1(%rdi) +-L(SSE1QA): movdqa %xmm0,-0xa1(%rdi) +-L(SSE1Q9): movdqa %xmm0,-0x91(%rdi) +-L(SSE1Q8): movdqa %xmm0,-0x81(%rdi) +-L(SSE1Q7): movdqa %xmm0,-0x71(%rdi) +-L(SSE1Q6): movdqa %xmm0,-0x61(%rdi) +-L(SSE1Q5): movdqa %xmm0,-0x51(%rdi) +-L(SSE1Q4): movdqa %xmm0,-0x41(%rdi) +-L(SSE1Q3): movdqa %xmm0,-0x31(%rdi) +-L(SSE1Q2): movdqa %xmm0,-0x21(%rdi) +-L(SSE1Q1): movdqa %xmm0,-0x11(%rdi) +-L(SSE1Q0): mov %dl,-0x1(%rdi) +- retq +- +-L(SSE2QB): movdqa %xmm0,-0xb2(%rdi) +-L(SSE2QA): movdqa %xmm0,-0xa2(%rdi) +-L(SSE2Q9): movdqa %xmm0,-0x92(%rdi) +-L(SSE2Q8): movdqa %xmm0,-0x82(%rdi) +-L(SSE2Q7): movdqa %xmm0,-0x72(%rdi) +-L(SSE2Q6): movdqa %xmm0,-0x62(%rdi) +-L(SSE2Q5): movdqa %xmm0,-0x52(%rdi) +-L(SSE2Q4): movdqa %xmm0,-0x42(%rdi) +-L(SSE2Q3): movdqa %xmm0,-0x32(%rdi) +-L(SSE2Q2): movdqa %xmm0,-0x22(%rdi) +-L(SSE2Q1): movdqa %xmm0,-0x12(%rdi) +-L(SSE2Q0): mov %dx,-0x2(%rdi) +- retq +- +-L(SSE3QB): movdqa %xmm0,-0xb3(%rdi) +-L(SSE3QA): movdqa %xmm0,-0xa3(%rdi) +-L(SSE3Q9): movdqa %xmm0,-0x93(%rdi) +-L(SSE3Q8): movdqa %xmm0,-0x83(%rdi) +-L(SSE3Q7): movdqa %xmm0,-0x73(%rdi) +-L(SSE3Q6): movdqa %xmm0,-0x63(%rdi) +-L(SSE3Q5): movdqa %xmm0,-0x53(%rdi) +-L(SSE3Q4): movdqa %xmm0,-0x43(%rdi) +-L(SSE3Q3): movdqa %xmm0,-0x33(%rdi) +-L(SSE3Q2): movdqa %xmm0,-0x23(%rdi) +-L(SSE3Q1): movdqa %xmm0,-0x13(%rdi) +-L(SSE3Q0): mov %dx,-0x3(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +-L(SSE4QB): movdqa %xmm0,-0xb4(%rdi) +-L(SSE4QA): movdqa %xmm0,-0xa4(%rdi) +-L(SSE4Q9): movdqa %xmm0,-0x94(%rdi) +-L(SSE4Q8): movdqa %xmm0,-0x84(%rdi) +-L(SSE4Q7): movdqa %xmm0,-0x74(%rdi) +-L(SSE4Q6): movdqa %xmm0,-0x64(%rdi) +-L(SSE4Q5): movdqa %xmm0,-0x54(%rdi) +-L(SSE4Q4): movdqa %xmm0,-0x44(%rdi) +-L(SSE4Q3): movdqa %xmm0,-0x34(%rdi) +-L(SSE4Q2): movdqa %xmm0,-0x24(%rdi) +-L(SSE4Q1): movdqa %xmm0,-0x14(%rdi) +-L(SSE4Q0): mov %edx,-0x4(%rdi) +- retq +- +-L(SSE5QB): movdqa %xmm0,-0xb5(%rdi) +-L(SSE5QA): movdqa %xmm0,-0xa5(%rdi) +-L(SSE5Q9): movdqa %xmm0,-0x95(%rdi) +-L(SSE5Q8): movdqa %xmm0,-0x85(%rdi) +-L(SSE5Q7): movdqa %xmm0,-0x75(%rdi) +-L(SSE5Q6): movdqa %xmm0,-0x65(%rdi) +-L(SSE5Q5): movdqa %xmm0,-0x55(%rdi) +-L(SSE5Q4): movdqa %xmm0,-0x45(%rdi) +-L(SSE5Q3): movdqa %xmm0,-0x35(%rdi) +-L(SSE5Q2): movdqa %xmm0,-0x25(%rdi) +-L(SSE5Q1): movdqa %xmm0,-0x15(%rdi) +-L(SSE5Q0): mov %edx,-0x5(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +- +-L(SSE6QB): movdqa %xmm0,-0xb6(%rdi) +-L(SSE6QA): movdqa %xmm0,-0xa6(%rdi) +-L(SSE6Q9): movdqa %xmm0,-0x96(%rdi) +-L(SSE6Q8): movdqa %xmm0,-0x86(%rdi) +-L(SSE6Q7): movdqa %xmm0,-0x76(%rdi) +-L(SSE6Q6): movdqa %xmm0,-0x66(%rdi) +-L(SSE6Q5): movdqa %xmm0,-0x56(%rdi) +-L(SSE6Q4): movdqa %xmm0,-0x46(%rdi) +-L(SSE6Q3): movdqa %xmm0,-0x36(%rdi) +-L(SSE6Q2): movdqa %xmm0,-0x26(%rdi) +-L(SSE6Q1): movdqa %xmm0,-0x16(%rdi) +-L(SSE6Q0): mov %edx,-0x6(%rdi) +- mov %dx,-0x2(%rdi) +- retq +- +-L(SSE7QB): movdqa %xmm0,-0xb7(%rdi) +-L(SSE7QA): movdqa %xmm0,-0xa7(%rdi) +-L(SSE7Q9): movdqa %xmm0,-0x97(%rdi) +-L(SSE7Q8): movdqa %xmm0,-0x87(%rdi) +-L(SSE7Q7): movdqa %xmm0,-0x77(%rdi) +-L(SSE7Q6): movdqa %xmm0,-0x67(%rdi) +-L(SSE7Q5): movdqa %xmm0,-0x57(%rdi) +-L(SSE7Q4): movdqa %xmm0,-0x47(%rdi) +-L(SSE7Q3): movdqa %xmm0,-0x37(%rdi) +-L(SSE7Q2): movdqa %xmm0,-0x27(%rdi) +-L(SSE7Q1): movdqa %xmm0,-0x17(%rdi) +-L(SSE7Q0): mov %edx,-0x7(%rdi) +- mov %dx,-0x3(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +-L(SSE8QB): movdqa %xmm0,-0xb8(%rdi) +-L(SSE8QA): movdqa %xmm0,-0xa8(%rdi) +-L(SSE8Q9): movdqa %xmm0,-0x98(%rdi) +-L(SSE8Q8): movdqa %xmm0,-0x88(%rdi) +-L(SSE8Q7): movdqa %xmm0,-0x78(%rdi) +-L(SSE8Q6): movdqa %xmm0,-0x68(%rdi) +-L(SSE8Q5): movdqa %xmm0,-0x58(%rdi) +-L(SSE8Q4): movdqa %xmm0,-0x48(%rdi) +-L(SSE8Q3): movdqa %xmm0,-0x38(%rdi) +-L(SSE8Q2): movdqa %xmm0,-0x28(%rdi) +-L(SSE8Q1): movdqa %xmm0,-0x18(%rdi) +-L(SSE8Q0): mov %rdx,-0x8(%rdi) +- retq +- +-L(SSE9QB): movdqa %xmm0,-0xb9(%rdi) +-L(SSE9QA): movdqa %xmm0,-0xa9(%rdi) +-L(SSE9Q9): movdqa %xmm0,-0x99(%rdi) +-L(SSE9Q8): movdqa %xmm0,-0x89(%rdi) +-L(SSE9Q7): movdqa %xmm0,-0x79(%rdi) +-L(SSE9Q6): movdqa %xmm0,-0x69(%rdi) +-L(SSE9Q5): movdqa %xmm0,-0x59(%rdi) +-L(SSE9Q4): movdqa %xmm0,-0x49(%rdi) +-L(SSE9Q3): movdqa %xmm0,-0x39(%rdi) +-L(SSE9Q2): movdqa %xmm0,-0x29(%rdi) +-L(SSE9Q1): movdqa %xmm0,-0x19(%rdi) +-L(SSE9Q0): mov %rdx,-0x9(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +-L(SSE10QB): movdqa %xmm0,-0xba(%rdi) +-L(SSE10QA): movdqa %xmm0,-0xaa(%rdi) +-L(SSE10Q9): movdqa %xmm0,-0x9a(%rdi) +-L(SSE10Q8): movdqa %xmm0,-0x8a(%rdi) +-L(SSE10Q7): movdqa %xmm0,-0x7a(%rdi) +-L(SSE10Q6): movdqa %xmm0,-0x6a(%rdi) +-L(SSE10Q5): movdqa %xmm0,-0x5a(%rdi) +-L(SSE10Q4): movdqa %xmm0,-0x4a(%rdi) +-L(SSE10Q3): movdqa %xmm0,-0x3a(%rdi) +-L(SSE10Q2): movdqa %xmm0,-0x2a(%rdi) +-L(SSE10Q1): movdqa %xmm0,-0x1a(%rdi) +-L(SSE10Q0): mov %rdx,-0xa(%rdi) +- mov %dx,-0x2(%rdi) +- retq +- +-L(SSE11QB): movdqa %xmm0,-0xbb(%rdi) +-L(SSE11QA): movdqa %xmm0,-0xab(%rdi) +-L(SSE11Q9): movdqa %xmm0,-0x9b(%rdi) +-L(SSE11Q8): movdqa %xmm0,-0x8b(%rdi) +-L(SSE11Q7): movdqa %xmm0,-0x7b(%rdi) +-L(SSE11Q6): movdqa %xmm0,-0x6b(%rdi) +-L(SSE11Q5): movdqa %xmm0,-0x5b(%rdi) +-L(SSE11Q4): movdqa %xmm0,-0x4b(%rdi) +-L(SSE11Q3): movdqa %xmm0,-0x3b(%rdi) +-L(SSE11Q2): movdqa %xmm0,-0x2b(%rdi) +-L(SSE11Q1): movdqa %xmm0,-0x1b(%rdi) +-L(SSE11Q0): mov %rdx,-0xb(%rdi) +- mov %dx,-0x3(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +-L(SSE12QB): movdqa %xmm0,-0xbc(%rdi) +-L(SSE12QA): movdqa %xmm0,-0xac(%rdi) +-L(SSE12Q9): movdqa %xmm0,-0x9c(%rdi) +-L(SSE12Q8): movdqa %xmm0,-0x8c(%rdi) +-L(SSE12Q7): movdqa %xmm0,-0x7c(%rdi) +-L(SSE12Q6): movdqa %xmm0,-0x6c(%rdi) +-L(SSE12Q5): movdqa %xmm0,-0x5c(%rdi) +-L(SSE12Q4): movdqa %xmm0,-0x4c(%rdi) +-L(SSE12Q3): movdqa %xmm0,-0x3c(%rdi) +-L(SSE12Q2): movdqa %xmm0,-0x2c(%rdi) +-L(SSE12Q1): movdqa %xmm0,-0x1c(%rdi) +-L(SSE12Q0): mov %rdx,-0xc(%rdi) +- mov %edx,-0x4(%rdi) +- retq +- +-L(SSE13QB): movdqa %xmm0,-0xbd(%rdi) +-L(SSE13QA): movdqa %xmm0,-0xad(%rdi) +-L(SSE13Q9): movdqa %xmm0,-0x9d(%rdi) +-L(SSE13Q8): movdqa %xmm0,-0x8d(%rdi) +-L(SSE13Q7): movdqa %xmm0,-0x7d(%rdi) +-L(SSE13Q6): movdqa %xmm0,-0x6d(%rdi) +-L(SSE13Q5): movdqa %xmm0,-0x5d(%rdi) +-L(SSE13Q4): movdqa %xmm0,-0x4d(%rdi) +-L(SSE13Q3): movdqa %xmm0,-0x3d(%rdi) +-L(SSE13Q2): movdqa %xmm0,-0x2d(%rdi) +-L(SSE13Q1): movdqa %xmm0,-0x1d(%rdi) +-L(SSE13Q0): mov %rdx,-0xd(%rdi) +- mov %edx,-0x5(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +-L(SSE14QB): movdqa %xmm0,-0xbe(%rdi) +-L(SSE14QA): movdqa %xmm0,-0xae(%rdi) +-L(SSE14Q9): movdqa %xmm0,-0x9e(%rdi) +-L(SSE14Q8): movdqa %xmm0,-0x8e(%rdi) +-L(SSE14Q7): movdqa %xmm0,-0x7e(%rdi) +-L(SSE14Q6): movdqa %xmm0,-0x6e(%rdi) +-L(SSE14Q5): movdqa %xmm0,-0x5e(%rdi) +-L(SSE14Q4): movdqa %xmm0,-0x4e(%rdi) +-L(SSE14Q3): movdqa %xmm0,-0x3e(%rdi) +-L(SSE14Q2): movdqa %xmm0,-0x2e(%rdi) +-L(SSE14Q1): movdqa %xmm0,-0x1e(%rdi) +-L(SSE14Q0): mov %rdx,-0xe(%rdi) +- mov %edx,-0x6(%rdi) +- mov %dx,-0x2(%rdi) +- retq +- +-L(SSE15QB): movdqa %xmm0,-0xbf(%rdi) +-L(SSE15QA): movdqa %xmm0,-0xaf(%rdi) +-L(SSE15Q9): movdqa %xmm0,-0x9f(%rdi) +-L(SSE15Q8): movdqa %xmm0,-0x8f(%rdi) +-L(SSE15Q7): movdqa %xmm0,-0x7f(%rdi) +-L(SSE15Q6): movdqa %xmm0,-0x6f(%rdi) +-L(SSE15Q5): movdqa %xmm0,-0x5f(%rdi) +-L(SSE15Q4): movdqa %xmm0,-0x4f(%rdi) +-L(SSE15Q3): movdqa %xmm0,-0x3f(%rdi) +-L(SSE15Q2): movdqa %xmm0,-0x2f(%rdi) +-L(SSE15Q1): movdqa %xmm0,-0x1f(%rdi) +-L(SSE15Q0): mov %rdx,-0xf(%rdi) +- mov %edx,-0x7(%rdi) +- mov %dx,-0x3(%rdi) +- mov %dl,-0x1(%rdi) +- retq +- +- .balign 16 +-L(byte32sse2_pre): +- +- mov __x86_64_shared_cache_size(%rip),%r9d # The largest cache size +- cmp %r9,%r8 +- ja L(sse2_nt_move_pre) +- #jmp L(byte32sse2) +- .balign 16 +-L(byte32sse2): +- lea -0x80(%r8),%r8 # 128 +- cmp $0x80,%r8 # 128 +- movdqa %xmm0,(%rdi) +- movdqa %xmm0,0x10(%rdi) +- movdqa %xmm0,0x20(%rdi) +- movdqa %xmm0,0x30(%rdi) +- movdqa %xmm0,0x40(%rdi) +- movdqa %xmm0,0x50(%rdi) +- movdqa %xmm0,0x60(%rdi) +- movdqa %xmm0,0x70(%rdi) +- +- lea 0x80(%rdi),%rdi +- jae L(byte32sse2) +- add %r8,%rdi +-# ifndef PIC +- lea L(SSExDx)(%rip),%r11 +- jmpq *(%r11,%r8,8) +-# else +- lea L(SSE0Q0)(%rip),%r11 +- lea L(SSExDx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-# endif +- +- .balign 16 +-L(sse2_nt_move_pre): +- cmp $0x0,%r9 +- je L(byte32sse2) +- jmp L(sse2_nt_move) +- +- .balign 16 +-L(sse2_nt_move): +- lea -0x80(%r8),%r8 +- cmp $0x80,%r8 +- +- movntdq %xmm0,(%rdi) +- movntdq %xmm0,0x10(%rdi) +- movntdq %xmm0,0x20(%rdi) +- movntdq %xmm0,0x30(%rdi) +- movntdq %xmm0,0x40(%rdi) +- movntdq %xmm0,0x50(%rdi) +- movntdq %xmm0,0x60(%rdi) +- movntdq %xmm0,0x70(%rdi) +- +- lea 0x80(%rdi),%rdi +- jae L(sse2_nt_move) +- sfence +- add %r8,%rdi +-# ifndef PIC +- lea L(SSExDx)(%rip),%r11 +- jmpq *(%r11,%r8,8) +-# else +- lea L(SSE0Q0)(%rip),%r11 +- lea L(SSExDx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-# endif +- +- .pushsection .rodata +- .balign 16 +-# ifndef PIC +-L(SSExDx): +- .quad L(SSE0Q0), L(SSE1Q0), L(SSE2Q0), L(SSE3Q0) +- .quad L(SSE4Q0), L(SSE5Q0), L(SSE6Q0), L(SSE7Q0) +- .quad L(SSE8Q0), L(SSE9Q0), L(SSE10Q0), L(SSE11Q0) +- .quad L(SSE12Q0), L(SSE13Q0), L(SSE14Q0), L(SSE15Q0) +- .quad L(SSE0Q1), L(SSE1Q1), L(SSE2Q1), L(SSE3Q1) +- .quad L(SSE4Q1), L(SSE5Q1), L(SSE6Q1), L(SSE7Q1) +- .quad L(SSE8Q1), L(SSE9Q1), L(SSE10Q1), L(SSE11Q1) +- .quad L(SSE12Q1), L(SSE13Q1), L(SSE14Q1), L(SSE15Q1) +- .quad L(SSE0Q2), L(SSE1Q2), L(SSE2Q2), L(SSE3Q2) +- .quad L(SSE4Q2), L(SSE5Q2), L(SSE6Q2), L(SSE7Q2) +- .quad L(SSE8Q2), L(SSE9Q2), L(SSE10Q2), L(SSE11Q2) +- .quad L(SSE12Q2), L(SSE13Q2), L(SSE14Q2), L(SSE15Q2) +- .quad L(SSE0Q3), L(SSE1Q3), L(SSE2Q3), L(SSE3Q3) +- .quad L(SSE4Q3), L(SSE5Q3), L(SSE6Q3), L(SSE7Q3) +- .quad L(SSE8Q3), L(SSE9Q3), L(SSE10Q3), L(SSE11Q3) +- .quad L(SSE12Q3), L(SSE13Q3), L(SSE14Q3), L(SSE15Q3) +- .quad L(SSE0Q4), L(SSE1Q4), L(SSE2Q4), L(SSE3Q4) +- .quad L(SSE4Q4), L(SSE5Q4), L(SSE6Q4), L(SSE7Q4) +- .quad L(SSE8Q4), L(SSE9Q4), L(SSE10Q4), L(SSE11Q4) +- .quad L(SSE12Q4), L(SSE13Q4), L(SSE14Q4), L(SSE15Q4) +- .quad L(SSE0Q5), L(SSE1Q5), L(SSE2Q5), L(SSE3Q5) +- .quad L(SSE4Q5), L(SSE5Q5), L(SSE6Q5), L(SSE7Q5) +- .quad L(SSE8Q5), L(SSE9Q5), L(SSE10Q5), L(SSE11Q5) +- .quad L(SSE12Q5), L(SSE13Q5), L(SSE14Q5), L(SSE15Q5) +- .quad L(SSE0Q6), L(SSE1Q6), L(SSE2Q6), L(SSE3Q6) +- .quad L(SSE4Q6), L(SSE5Q6), L(SSE6Q6), L(SSE7Q6) +- .quad L(SSE8Q6), L(SSE9Q6), L(SSE10Q6), L(SSE11Q6) +- .quad L(SSE12Q6), L(SSE13Q6), L(SSE14Q6), L(SSE15Q6) +- .quad L(SSE0Q7), L(SSE1Q7), L(SSE2Q7), L(SSE3Q7) +- .quad L(SSE4Q7), L(SSE5Q7), L(SSE6Q7), L(SSE7Q7) +- .quad L(SSE8Q7), L(SSE9Q7), L(SSE10Q7), L(SSE11Q7) +- .quad L(SSE12Q7), L(SSE13Q7), L(SSE14Q7), L(SSE15Q7) +- .quad L(SSE0Q8), L(SSE1Q8), L(SSE2Q8), L(SSE3Q8) +- .quad L(SSE4Q8), L(SSE5Q8), L(SSE6Q8), L(SSE7Q8) +- .quad L(SSE8Q8), L(SSE9Q8), L(SSE10Q8), L(SSE11Q8) +- .quad L(SSE12Q8), L(SSE13Q8), L(SSE14Q8), L(SSE15Q8) +- .quad L(SSE0Q9), L(SSE1Q9), L(SSE2Q9), L(SSE3Q9) +- .quad L(SSE4Q9), L(SSE5Q9), L(SSE6Q9), L(SSE7Q9) +- .quad L(SSE8Q9), L(SSE9Q9), L(SSE10Q9), L(SSE11Q9) +- .quad L(SSE12Q9), L(SSE13Q9), L(SSE14Q9), L(SSE15Q9) +- .quad L(SSE0QA), L(SSE1QA), L(SSE2QA), L(SSE3QA) +- .quad L(SSE4QA), L(SSE5QA), L(SSE6QA), L(SSE7QA) +- .quad L(SSE8QA), L(SSE9QA), L(SSE10QA), L(SSE11QA) +- .quad L(SSE12QA), L(SSE13QA), L(SSE14QA), L(SSE15QA) +- .quad L(SSE0QB), L(SSE1QB), L(SSE2QB), L(SSE3QB) +- .quad L(SSE4QB), L(SSE5QB), L(SSE6QB), L(SSE7QB) +- .quad L(SSE8QB), L(SSE9QB), L(SSE10QB), L(SSE11QB) +- .quad L(SSE12QB), L(SSE13QB), L(SSE14QB), L(SSE15QB) +-# else +-L(SSExDx): +- .short L(SSE0Q0) -L(SSE0Q0) +- .short L(SSE1Q0) -L(SSE0Q0) +- .short L(SSE2Q0) -L(SSE0Q0) +- .short L(SSE3Q0) -L(SSE0Q0) +- .short L(SSE4Q0) -L(SSE0Q0) +- .short L(SSE5Q0) -L(SSE0Q0) +- .short L(SSE6Q0) -L(SSE0Q0) +- .short L(SSE7Q0) -L(SSE0Q0) +- +- .short L(SSE8Q0) -L(SSE0Q0) +- .short L(SSE9Q0) -L(SSE0Q0) +- .short L(SSE10Q0)-L(SSE0Q0) +- .short L(SSE11Q0)-L(SSE0Q0) +- .short L(SSE12Q0)-L(SSE0Q0) +- .short L(SSE13Q0)-L(SSE0Q0) +- .short L(SSE14Q0)-L(SSE0Q0) +- .short L(SSE15Q0)-L(SSE0Q0) +- +- .short L(SSE0Q1) -L(SSE0Q0) +- .short L(SSE1Q1) -L(SSE0Q0) +- .short L(SSE2Q1) -L(SSE0Q0) +- .short L(SSE3Q1) -L(SSE0Q0) +- .short L(SSE4Q1) -L(SSE0Q0) +- .short L(SSE5Q1) -L(SSE0Q0) +- .short L(SSE6Q1) -L(SSE0Q0) +- .short L(SSE7Q1) -L(SSE0Q0) +- +- .short L(SSE8Q1) -L(SSE0Q0) +- .short L(SSE9Q1) -L(SSE0Q0) +- .short L(SSE10Q1)-L(SSE0Q0) +- .short L(SSE11Q1)-L(SSE0Q0) +- .short L(SSE12Q1)-L(SSE0Q0) +- .short L(SSE13Q1)-L(SSE0Q0) +- .short L(SSE14Q1)-L(SSE0Q0) +- .short L(SSE15Q1)-L(SSE0Q0) +- +- .short L(SSE0Q2) -L(SSE0Q0) +- .short L(SSE1Q2) -L(SSE0Q0) +- .short L(SSE2Q2) -L(SSE0Q0) +- .short L(SSE3Q2) -L(SSE0Q0) +- .short L(SSE4Q2) -L(SSE0Q0) +- .short L(SSE5Q2) -L(SSE0Q0) +- .short L(SSE6Q2) -L(SSE0Q0) +- .short L(SSE7Q2) -L(SSE0Q0) +- +- .short L(SSE8Q2) -L(SSE0Q0) +- .short L(SSE9Q2) -L(SSE0Q0) +- .short L(SSE10Q2)-L(SSE0Q0) +- .short L(SSE11Q2)-L(SSE0Q0) +- .short L(SSE12Q2)-L(SSE0Q0) +- .short L(SSE13Q2)-L(SSE0Q0) +- .short L(SSE14Q2)-L(SSE0Q0) +- .short L(SSE15Q2)-L(SSE0Q0) +- +- .short L(SSE0Q3) -L(SSE0Q0) +- .short L(SSE1Q3) -L(SSE0Q0) +- .short L(SSE2Q3) -L(SSE0Q0) +- .short L(SSE3Q3) -L(SSE0Q0) +- .short L(SSE4Q3) -L(SSE0Q0) +- .short L(SSE5Q3) -L(SSE0Q0) +- .short L(SSE6Q3) -L(SSE0Q0) +- .short L(SSE7Q3) -L(SSE0Q0) +- +- .short L(SSE8Q3) -L(SSE0Q0) +- .short L(SSE9Q3) -L(SSE0Q0) +- .short L(SSE10Q3)-L(SSE0Q0) +- .short L(SSE11Q3)-L(SSE0Q0) +- .short L(SSE12Q3)-L(SSE0Q0) +- .short L(SSE13Q3)-L(SSE0Q0) +- .short L(SSE14Q3)-L(SSE0Q0) +- .short L(SSE15Q3)-L(SSE0Q0) +- +- .short L(SSE0Q4) -L(SSE0Q0) +- .short L(SSE1Q4) -L(SSE0Q0) +- .short L(SSE2Q4) -L(SSE0Q0) +- .short L(SSE3Q4) -L(SSE0Q0) +- .short L(SSE4Q4) -L(SSE0Q0) +- .short L(SSE5Q4) -L(SSE0Q0) +- .short L(SSE6Q4) -L(SSE0Q0) +- .short L(SSE7Q4) -L(SSE0Q0) +- +- .short L(SSE8Q4) -L(SSE0Q0) +- .short L(SSE9Q4) -L(SSE0Q0) +- .short L(SSE10Q4)-L(SSE0Q0) +- .short L(SSE11Q4)-L(SSE0Q0) +- .short L(SSE12Q4)-L(SSE0Q0) +- .short L(SSE13Q4)-L(SSE0Q0) +- .short L(SSE14Q4)-L(SSE0Q0) +- .short L(SSE15Q4)-L(SSE0Q0) +- +- .short L(SSE0Q5) -L(SSE0Q0) +- .short L(SSE1Q5) -L(SSE0Q0) +- .short L(SSE2Q5) -L(SSE0Q0) +- .short L(SSE3Q5) -L(SSE0Q0) +- .short L(SSE4Q5) -L(SSE0Q0) +- .short L(SSE5Q5) -L(SSE0Q0) +- .short L(SSE6Q5) -L(SSE0Q0) +- .short L(SSE7Q5) -L(SSE0Q0) +- +- .short L(SSE8Q5) -L(SSE0Q0) +- .short L(SSE9Q5) -L(SSE0Q0) +- .short L(SSE10Q5)-L(SSE0Q0) +- .short L(SSE11Q5)-L(SSE0Q0) +- .short L(SSE12Q5)-L(SSE0Q0) +- .short L(SSE13Q5)-L(SSE0Q0) +- .short L(SSE14Q5)-L(SSE0Q0) +- .short L(SSE15Q5)-L(SSE0Q0) +- +- .short L(SSE0Q6) -L(SSE0Q0) +- .short L(SSE1Q6) -L(SSE0Q0) +- .short L(SSE2Q6) -L(SSE0Q0) +- .short L(SSE3Q6) -L(SSE0Q0) +- .short L(SSE4Q6) -L(SSE0Q0) +- .short L(SSE5Q6) -L(SSE0Q0) +- .short L(SSE6Q6) -L(SSE0Q0) +- .short L(SSE7Q6) -L(SSE0Q0) +- +- .short L(SSE8Q6) -L(SSE0Q0) +- .short L(SSE9Q6) -L(SSE0Q0) +- .short L(SSE10Q6)-L(SSE0Q0) +- .short L(SSE11Q6)-L(SSE0Q0) +- .short L(SSE12Q6)-L(SSE0Q0) +- .short L(SSE13Q6)-L(SSE0Q0) +- .short L(SSE14Q6)-L(SSE0Q0) +- .short L(SSE15Q6)-L(SSE0Q0) +- +- .short L(SSE0Q7) -L(SSE0Q0) +- .short L(SSE1Q7) -L(SSE0Q0) +- .short L(SSE2Q7) -L(SSE0Q0) +- .short L(SSE3Q7) -L(SSE0Q0) +- .short L(SSE4Q7) -L(SSE0Q0) +- .short L(SSE5Q7) -L(SSE0Q0) +- .short L(SSE6Q7) -L(SSE0Q0) +- .short L(SSE7Q7) -L(SSE0Q0) +- +- .short L(SSE8Q7) -L(SSE0Q0) +- .short L(SSE9Q7) -L(SSE0Q0) +- .short L(SSE10Q7)-L(SSE0Q0) +- .short L(SSE11Q7)-L(SSE0Q0) +- .short L(SSE12Q7)-L(SSE0Q0) +- .short L(SSE13Q7)-L(SSE0Q0) +- .short L(SSE14Q7)-L(SSE0Q0) +- .short L(SSE15Q7)-L(SSE0Q0) +- +- .short L(SSE0Q8) -L(SSE0Q0) +- .short L(SSE1Q8) -L(SSE0Q0) +- .short L(SSE2Q8) -L(SSE0Q0) +- .short L(SSE3Q8) -L(SSE0Q0) +- .short L(SSE4Q8) -L(SSE0Q0) +- .short L(SSE5Q8) -L(SSE0Q0) +- .short L(SSE6Q8) -L(SSE0Q0) +- .short L(SSE7Q8) -L(SSE0Q0) +- +- .short L(SSE8Q8) -L(SSE0Q0) +- .short L(SSE9Q8) -L(SSE0Q0) +- .short L(SSE10Q8)-L(SSE0Q0) +- .short L(SSE11Q8)-L(SSE0Q0) +- .short L(SSE12Q8)-L(SSE0Q0) +- .short L(SSE13Q8)-L(SSE0Q0) +- .short L(SSE14Q8)-L(SSE0Q0) +- .short L(SSE15Q8)-L(SSE0Q0) +- +- .short L(SSE0Q9) -L(SSE0Q0) +- .short L(SSE1Q9) -L(SSE0Q0) +- .short L(SSE2Q9) -L(SSE0Q0) +- .short L(SSE3Q9) -L(SSE0Q0) +- .short L(SSE4Q9) -L(SSE0Q0) +- .short L(SSE5Q9) -L(SSE0Q0) +- .short L(SSE6Q9) -L(SSE0Q0) +- .short L(SSE7Q9) -L(SSE0Q0) +- +- .short L(SSE8Q9) -L(SSE0Q0) +- .short L(SSE9Q9) -L(SSE0Q0) +- .short L(SSE10Q9)-L(SSE0Q0) +- .short L(SSE11Q9)-L(SSE0Q0) +- .short L(SSE12Q9)-L(SSE0Q0) +- .short L(SSE13Q9)-L(SSE0Q0) +- .short L(SSE14Q9)-L(SSE0Q0) +- .short L(SSE15Q9)-L(SSE0Q0) +- +- .short L(SSE0QA) -L(SSE0Q0) +- .short L(SSE1QA) -L(SSE0Q0) +- .short L(SSE2QA) -L(SSE0Q0) +- .short L(SSE3QA) -L(SSE0Q0) +- .short L(SSE4QA) -L(SSE0Q0) +- .short L(SSE5QA) -L(SSE0Q0) +- .short L(SSE6QA) -L(SSE0Q0) +- .short L(SSE7QA) -L(SSE0Q0) +- +- .short L(SSE8QA) -L(SSE0Q0) +- .short L(SSE9QA) -L(SSE0Q0) +- .short L(SSE10QA)-L(SSE0Q0) +- .short L(SSE11QA)-L(SSE0Q0) +- .short L(SSE12QA)-L(SSE0Q0) +- .short L(SSE13QA)-L(SSE0Q0) +- .short L(SSE14QA)-L(SSE0Q0) +- .short L(SSE15QA)-L(SSE0Q0) +- +- .short L(SSE0QB) -L(SSE0Q0) +- .short L(SSE1QB) -L(SSE0Q0) +- .short L(SSE2QB) -L(SSE0Q0) +- .short L(SSE3QB) -L(SSE0Q0) +- .short L(SSE4QB) -L(SSE0Q0) +- .short L(SSE5QB) -L(SSE0Q0) +- .short L(SSE6QB) -L(SSE0Q0) +- .short L(SSE7QB) -L(SSE0Q0) +- +- .short L(SSE8QB) -L(SSE0Q0) +- .short L(SSE9QB) -L(SSE0Q0) +- .short L(SSE10QB)-L(SSE0Q0) +- .short L(SSE11QB)-L(SSE0Q0) +- .short L(SSE12QB)-L(SSE0Q0) +- .short L(SSE13QB)-L(SSE0Q0) +- .short L(SSE14QB)-L(SSE0Q0) +- .short L(SSE15QB)-L(SSE0Q0) +-# endif +- .popsection +-#endif /* !defined USE_MULTIARCH || defined USE_SSE2 */ +- +- .balign 16 +-#ifndef USE_MULTIARCH +-L(aligned_now): +- +- cmpl $0x1,__x86_64_preferred_memory_instruction(%rip) +- jg L(SSE_pre) +-#endif /* USE_MULTIARCH */ +- +-L(8byte_move_try): +- cmpq __STOS_LOWER_BOUNDARY,%r8 +- jae L(8byte_stos_try) +- +- .balign 16 +-L(8byte_move): +- movq %r8,%rcx +- shrq $7,%rcx +- jz L(8byte_move_skip) +- +- .p2align 4 +- +-L(8byte_move_loop): +- decq %rcx +- +- movq %rdx, (%rdi) +- movq %rdx, 8 (%rdi) +- movq %rdx, 16 (%rdi) +- movq %rdx, 24 (%rdi) +- movq %rdx, 32 (%rdi) +- movq %rdx, 40 (%rdi) +- movq %rdx, 48 (%rdi) +- movq %rdx, 56 (%rdi) +- movq %rdx, 64 (%rdi) +- movq %rdx, 72 (%rdi) +- movq %rdx, 80 (%rdi) +- movq %rdx, 88 (%rdi) +- movq %rdx, 96 (%rdi) +- movq %rdx, 104 (%rdi) +- movq %rdx, 112 (%rdi) +- movq %rdx, 120 (%rdi) +- +- leaq 128 (%rdi),%rdi +- +- jnz L(8byte_move_loop) +- +-L(8byte_move_skip): +- andl $127,%r8d +- lea (%rdi,%r8,1),%rdi +- +-#ifndef PIC +- lea L(setPxQx)(%rip),%r11 +- jmpq *(%r11,%r8,8) # old scheme remained for nonPIC +-#else +- lea L(Got0)(%rip),%r11 +- lea L(setPxQx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-#endif +- +- .balign 16 +-L(8byte_stos_try): +- mov __x86_64_shared_cache_size(%rip),%r9d // ck largest cache size +- cmpq %r8,%r9 // calculate the lesser of remaining +- cmovaq %r8,%r9 // bytes and largest cache size +- jbe L(8byte_stos) +- +-L(8byte_move_reuse_try): +- cmp __STOS_UPPER_BOUNDARY,%r8 +- jae L(8byte_move) +- +- .balign 16 +-L(8byte_stos): +- movq %r9,%rcx +- andq $-8,%r9 +- +- shrq $3,%rcx +- jz L(8byte_stos_skip) +- +- xchgq %rax,%rdx + ++ENTRY (memset) ++ movd %esi, %xmm8 ++ movq %rdi, %rax ++ punpcklbw %xmm8, %xmm8 ++ punpcklwd %xmm8, %xmm8 ++ pshufd $0, %xmm8, %xmm8 ++L(entry_from_bzero): ++ cmpq $64, %rdx ++ ja L(loop_start) ++ cmpq $16, %rdx ++ jbe L(less_16_bytes) ++ cmpq $32, %rdx ++ movdqu %xmm8, (%rdi) ++ movdqu %xmm8, -16(%rdi,%rdx) ++ ja L(between_32_64_bytes) ++L(return): + rep +- stosq +- +- xchgq %rax,%rdx +- +-L(8byte_stos_skip): +- subq %r9,%r8 +- ja L(8byte_nt_move) +- +- andl $7,%r8d +- lea (%rdi,%r8,1),%rdi +-#ifndef PIC +- lea L(setPxQx)(%rip),%r11 +- jmpq *(%r11,%r8,8) # old scheme remained for nonPIC +-#else +- lea L(Got0)(%rip),%r11 +- lea L(setPxQx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-#endif +- +- .balign 16 +-L(8byte_nt_move): +- movq %r8,%rcx +- shrq $7,%rcx +- jz L(8byte_nt_move_skip) +- +- .balign 16 +-L(8byte_nt_move_loop): +- decq %rcx ++ ret + +- movntiq %rdx, (%rdi) +- movntiq %rdx, 8 (%rdi) +- movntiq %rdx, 16 (%rdi) +- movntiq %rdx, 24 (%rdi) +- movntiq %rdx, 32 (%rdi) +- movntiq %rdx, 40 (%rdi) +- movntiq %rdx, 48 (%rdi) +- movntiq %rdx, 56 (%rdi) +- movntiq %rdx, 64 (%rdi) +- movntiq %rdx, 72 (%rdi) +- movntiq %rdx, 80 (%rdi) +- movntiq %rdx, 88 (%rdi) +- movntiq %rdx, 96 (%rdi) +- movntiq %rdx, 104 (%rdi) +- movntiq %rdx, 112 (%rdi) +- movntiq %rdx, 120 (%rdi) +- +- leaq 128 (%rdi),%rdi +- +- jnz L(8byte_nt_move_loop) +- +- sfence +- +-L(8byte_nt_move_skip): +- andl $127,%r8d +- +- lea (%rdi,%r8,1),%rdi +-#ifndef PIC +- lea L(setPxQx)(%rip),%r11 +- jmpq *(%r11,%r8,8) # old scheme remained for nonPIC +-#else +- lea L(Got0)(%rip),%r11 +- lea L(setPxQx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-#endif ++ ALIGN (4) ++L(between_32_64_bytes): ++ movdqu %xmm8, 16(%rdi) ++ movdqu %xmm8, -32(%rdi,%rdx) ++ ret ++ ALIGN (4) ++L(loop_start): ++ leaq 64(%rdi), %rcx ++ movdqu %xmm8, (%rdi) ++ andq $-64, %rcx ++ movdqu %xmm8, -16(%rdi,%rdx) ++ movdqu %xmm8, 16(%rdi) ++ movdqu %xmm8, -32(%rdi,%rdx) ++ movdqu %xmm8, 32(%rdi) ++ movdqu %xmm8, -48(%rdi,%rdx) ++ movdqu %xmm8, 48(%rdi) ++ movdqu %xmm8, -64(%rdi,%rdx) ++ addq %rdi, %rdx ++ andq $-64, %rdx ++ cmpq %rdx, %rcx ++ je L(return) ++ ALIGN (4) ++L(loop): ++ movdqa %xmm8, (%rcx) ++ movdqa %xmm8, 16(%rcx) ++ movdqa %xmm8, 32(%rcx) ++ movdqa %xmm8, 48(%rcx) ++ addq $64, %rcx ++ cmpq %rcx, %rdx ++ jne L(loop) ++ rep ++ ret ++L(less_16_bytes): ++ movq %xmm8, %rcx ++ testb $24, %dl ++ jne L(between8_16bytes) ++ testb $4, %dl ++ jne L(between4_7bytes) ++ testb $1, %dl ++ je L(odd_byte) ++ movb %cl, (%rdi) ++L(odd_byte): ++ testb $2, %dl ++ je L(return) ++ movw %cx, -2(%rax,%rdx) ++ ret ++L(between4_7bytes): ++ movl %ecx, (%rdi) ++ movl %ecx, -4(%rdi,%rdx) ++ ret ++L(between8_16bytes): ++ movq %rcx, (%rdi) ++ movq %rcx, -8(%rdi,%rdx) ++ ret + + END (memset) + libc_hidden_builtin_def (memset) diff --git a/SOURCES/glibc-rh1335629.patch b/SOURCES/glibc-rh1335629.patch new file mode 100644 index 0000000..908e32d --- /dev/null +++ b/SOURCES/glibc-rh1335629.patch @@ -0,0 +1,66 @@ +commit b763f6ae859ecea70a5dacb8ad45c71d5f667e2e +Author: Andreas Schwab +Date: Tue Sep 30 12:41:11 2014 +0200 + + aarch64: Increase MINSIGSTKSZ and SIGSTKSZ (bug 16850) + +diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/sigstack.h b/sysdeps/unix/sysv/linux/aarch64/bits/sigstack.h +new file mode 100644 +index 0000000..8f2fb76 +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/aarch64/bits/sigstack.h +@@ -0,0 +1,54 @@ ++/* sigstack, sigaltstack definitions. ++ Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef _SIGNAL_H ++# error "Never include this file directly. Use instead" ++#endif ++ ++ ++/* Structure describing a signal stack (obsolete). */ ++struct sigstack ++ { ++ void *ss_sp; /* Signal stack pointer. */ ++ int ss_onstack; /* Nonzero if executing on this stack. */ ++ }; ++ ++ ++/* Possible values for `ss_flags.'. */ ++enum ++{ ++ SS_ONSTACK = 1, ++#define SS_ONSTACK SS_ONSTACK ++ SS_DISABLE ++#define SS_DISABLE SS_DISABLE ++}; ++ ++/* Minimum stack size for a signal handler. */ ++#define MINSIGSTKSZ 5120 ++ ++/* System default stack size. */ ++#define SIGSTKSZ 16384 ++ ++ ++/* Alternate, preferred interface. */ ++typedef struct sigaltstack ++ { ++ void *ss_sp; ++ int ss_flags; ++ size_t ss_size; ++ } stack_t; diff --git a/SOURCES/glibc-rh1335925-1.patch b/SOURCES/glibc-rh1335925-1.patch new file mode 100644 index 0000000..82f2b21 --- /dev/null +++ b/SOURCES/glibc-rh1335925-1.patch @@ -0,0 +1,71 @@ +Backport of this upstream commit, with ports/ readded to the path. + +commit 5c40c3bab2fddaca8cfe12d75944d1fef8adf1a4 +Author: Alan Hayward +Date: Tue Nov 11 16:32:34 2014 +0000 + + [AArch64] Add ipc.h. + + Adding ipc.h for AArch64 adjusted to behave correctly on big endian + targets. + +diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/bits/ipc.h b/ports/sysdeps/unix/sysv/linux/aarch64/bits/ipc.h +new file mode 100644 +index 0000000..aa50eb0 +--- /dev/null ++++ b/ports/sysdeps/unix/sysv/linux/aarch64/bits/ipc.h +@@ -0,0 +1,54 @@ ++/* Copyright (C) 1995-2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#ifndef _SYS_IPC_H ++# error "Never use directly; include instead." ++#endif ++ ++#include ++ ++/* Mode bits for `msgget', `semget', and `shmget'. */ ++#define IPC_CREAT 01000 /* Create key if key does not exist. */ ++#define IPC_EXCL 02000 /* Fail if key exists. */ ++#define IPC_NOWAIT 04000 /* Return error on wait. */ ++ ++/* Control commands for `msgctl', `semctl', and `shmctl'. */ ++#define IPC_RMID 0 /* Remove identifier. */ ++#define IPC_SET 1 /* Set `ipc_perm' options. */ ++#define IPC_STAT 2 /* Get `ipc_perm' options. */ ++#ifdef __USE_GNU ++# define IPC_INFO 3 /* See ipcs. */ ++#endif ++ ++/* Special key values. */ ++#define IPC_PRIVATE ((__key_t) 0) /* Private key. */ ++ ++ ++/* Data structure used to pass permission information to IPC operations. */ ++struct ipc_perm ++ { ++ __key_t __key; /* Key. */ ++ __uid_t uid; /* Owner's user ID. */ ++ __gid_t gid; /* Owner's group ID. */ ++ __uid_t cuid; /* Creator's user ID. */ ++ __gid_t cgid; /* Creator's group ID. */ ++ unsigned int mode; /* Read/write permission. */ ++ unsigned short int __seq; /* Sequence number. */ ++ unsigned short int __pad1; ++ __syscall_ulong_t __glibc_reserved1; ++ __syscall_ulong_t __glibc_reserved2; ++ }; diff --git a/SOURCES/glibc-rh1335925-2.patch b/SOURCES/glibc-rh1335925-2.patch new file mode 100644 index 0000000..02037be --- /dev/null +++ b/SOURCES/glibc-rh1335925-2.patch @@ -0,0 +1,34 @@ +Backport of this upstream commit, with ports/ readded to the path. + +commit 14d623bcd178d336b47fdb4f0c973720d56d907c +Author: Szabolcs Nagy +Date: Thu Jul 9 09:39:51 2015 +0100 + + [AArch64][BZ 18400] fix elf_prpsinfo in procfs.h + + Kernel uses int pr_uid, pr_gid, but glibc used unsigned short. + + This is an ABI breaking change, but the size and alignment of + the struct and the layout of other members is not changed and + there is no known usage of pr_uid and pr_gid so it is expected + to be safe. + + [BZ #18400] + * sysdeps/unix/sysv/linux/aarch64/sys/procfs.h (struct elf_prpsinfo): + Fix pr_uid and pr_gid members. + +diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h b/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h +index cf5e76c..ecc65ab 100644 +--- a/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h ++++ b/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h +@@ -91,8 +91,8 @@ struct elf_prpsinfo + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ + unsigned long int pr_flag; /* Flags. */ +- unsigned short int pr_uid; +- unsigned short int pr_gid; ++ unsigned int pr_uid; ++ unsigned int pr_gid; + int pr_pid, pr_ppid, pr_pgrp, pr_sid; + /* Lots missing */ + char pr_fname[16]; /* Filename of executable. */ diff --git a/SOURCES/glibc-rh1335925-3.patch b/SOURCES/glibc-rh1335925-3.patch new file mode 100644 index 0000000..966f5f5 --- /dev/null +++ b/SOURCES/glibc-rh1335925-3.patch @@ -0,0 +1,39 @@ +Backport of this upstream commit, with ports/ readded to the path. + +commit b8528e771c0f31ebb8ac2470e2cf7ee9a50693e2 +Author: Szabolcs Nagy +Date: Thu Jul 9 09:53:30 2015 +0100 + + [AArch64][BZ 18648] change greg_t definition in ucontext.h + + This is an ABI breaking change, but + + typedef int greg_t; + + is not a useful definition on aarch64. + + greg_t is usually used for defining gregset_t which is used + in mcontext_t. The general registers in mcontext_t can only + be accessed by target specific code and on aarch64 greg_t + is not needed for that so this change is not supposed to break + existing code, just fix the definition. + + [BZ #18648] + * sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h (greg_t): Change the + definition to elf_greg_t. + + (Added another BZ entry that was missed in the previous commit). + +diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/ports/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h +index db7a7c1..e7268ce 100644 +--- a/ports/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h ++++ b/ports/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h +@@ -29,7 +29,7 @@ + included in . */ + #include + +-typedef int greg_t; ++typedef elf_greg_t greg_t; + + /* Container for all general registers. */ + typedef elf_gregset_t gregset_t; diff --git a/SOURCES/glibc-rh1335925-4.patch b/SOURCES/glibc-rh1335925-4.patch new file mode 100644 index 0000000..2b0105b --- /dev/null +++ b/SOURCES/glibc-rh1335925-4.patch @@ -0,0 +1,143 @@ +Backport of this upstream commit, with ports/ readded to the path. + +commit 2b1d7148e3664eeb177ae2fc91bf282d75da7623 +Author: Szabolcs Nagy +Date: Mon Jul 6 12:46:43 2015 +0100 + + [AArch64] make setcontext etc functions consistent with the kernel + + since + https://sourceware.org/ml/libc-alpha/2014-04/msg00006.html + setcontext etc is no longer tied to the kernel use of ucontext. + + in that patch the ucontext reserved space is not used consistently + with the kernel abi: the d8,d9 pair is saved in the slot of q8. + + this is ok (*context functions work together), but probably not + desirable (ucontexts created by the kernel and getcontext are + subtly different). + + the fix just replaces dN with qN in the save/restore code, which + does a bit more than needed (saves/restores the top half of qN that + is not callee saved), but this should not be an issue (and avoids + having to deal with endianness). + + (kernel fpsimd context layout: the first 64bit contains 0x210 the fpsimd + context size and 0x46508001 the FPSIMD_MAGIC, the second 64bit is for + fpsr and fpcr, and the rest is the 128bit q0..q31 registers). + + given d8=8.1, d9=9.1,... d15=15.1, the context created by getcontext is + + current: + + (gdb) x/40xg ctx.uc_mcontext.__reserved + 0x410df0 : 0x0000021046508001 0x0000000000000000 + 0x410e00 : 0x0000000000000000 0x0000000000000000 + 0x410e10 : 0x0000000000000000 0x0000000000000000 + 0x410e20 : 0x0000000000000000 0x0000000000000000 + 0x410e30 : 0x0000000000000000 0x0000000000000000 + 0x410e40 : 0x0000000000000000 0x0000000000000000 + 0x410e50 : 0x0000000000000000 0x0000000000000000 + 0x410e60 : 0x0000000000000000 0x0000000000000000 + 0x410e70 : 0x0000000000000000 0x0000000000000000 + 0x410e80 : 0x4020333333333333 0x4022333333333333 + 0x410e90 : 0x0000000000000000 0x0000000000000000 + 0x410ea0 : 0x4024333333333333 0x4026333333333333 + 0x410eb0 : 0x0000000000000000 0x0000000000000000 + 0x410ec0 : 0x4028333333333333 0x402a333333333333 + 0x410ed0 : 0x0000000000000000 0x0000000000000000 + 0x410ee0 : 0x402c333333333333 0x402e333333333333 + 0x410ef0 : 0x0000000000000000 0x0000000000000000 + 0x410f00 : 0x0000000000000000 0x0000000000000000 + 0x410f10 : 0x0000000000000000 0x0000000000000000 + 0x410f20 : 0x0000000000000000 0x0000000000000000 + + fixed: + + (gdb) x/40xg ctx.uc_mcontext.__reserved + 0x410d70 : 0x0000021046508001 0x0000000000000000 + 0x410d80 : 0x0000000000000000 0x0000000000000000 + 0x410d90 : 0x0000000000000000 0x0000000000000000 + 0x410da0 : 0x0000000000000000 0x0000000000000000 + 0x410db0 : 0x0000000000000000 0x0000000000000000 + 0x410dc0 : 0x0000000000000000 0x0000000000000000 + 0x410dd0 : 0x0000000000000000 0x0000000000000000 + 0x410de0 : 0x0000000000000000 0x0000000000000000 + 0x410df0 : 0x0000000000000000 0x0000000000000000 + 0x410e00 : 0x4020333333333333 0x0000000000000000 + 0x410e10 : 0x4022333333333333 0x0000000000000000 + 0x410e20 : 0x4024333333333333 0x0000000000000000 + 0x410e30 : 0x4026333333333333 0x0000000000000000 + 0x410e40 : 0x4028333333333333 0x0000000000000000 + 0x410e50 : 0x402a333333333333 0x0000000000000000 + 0x410e60 : 0x402c333333333333 0x0000000000000000 + 0x410e70 : 0x402e333333333333 0x0000000000000000 + 0x410e80 : 0x0000000000000000 0x0000000000000000 + 0x410e90 : 0x0000000000000000 0x0000000000000000 + 0x410ea0 : 0x0000000000000000 0x0000000000000000 + + 2015-07-06 Szabolcs Nagy + + * sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Use q + registers instead of d ones so the layout is kernel abi compatible. + * sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Likewise. + * sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext): + Likewise.# Please enter the commit message for your changes. Lines starting + +diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S b/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S +index adf8037..b72436f 100644 +--- a/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S ++++ b/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S +@@ -69,10 +69,10 @@ ENTRY(__getcontext) + + /* Fill in the FP SIMD context. */ + add x3, x2, #oV0 + 8 * SZVREG +- stp d8, d9, [x3], # 2 * SZVREG +- stp d10, d11, [x3], # 2 * SZVREG +- stp d12, d13, [x3], # 2 * SZVREG +- stp d14, d15, [x3], # 2 * SZVREG ++ stp q8, q9, [x3], # 2 * SZVREG ++ stp q10, q11, [x3], # 2 * SZVREG ++ stp q12, q13, [x3], # 2 * SZVREG ++ stp q14, q15, [x3], # 2 * SZVREG + + add x3, x2, oFPSR + +diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S b/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S +index ae67581..8d926f7 100644 +--- a/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S ++++ b/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S +@@ -97,10 +97,10 @@ ENTRY (__setcontext) + + /* Restore the FP SIMD context. */ + add x3, x2, #oV0 + 8 * SZVREG +- ldp d8, d9, [x3], #2 * SZVREG +- ldp d10, d11, [x3], #2 * SZVREG +- ldp d12, d13, [x3], #2 * SZVREG +- ldp d14, d15, [x3], #2 * SZVREG ++ ldp q8, q9, [x3], #2 * SZVREG ++ ldp q10, q11, [x3], #2 * SZVREG ++ ldp q12, q13, [x3], #2 * SZVREG ++ ldp q14, q15, [x3], #2 * SZVREG + + add x3, x2, oFPSR + +diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/swapcontext.S b/ports/sysdeps/unix/sysv/linux/aarch64/swapcontext.S +index f62fc11..05ad8d3 100644 +--- a/ports/sysdeps/unix/sysv/linux/aarch64/swapcontext.S ++++ b/ports/sysdeps/unix/sysv/linux/aarch64/swapcontext.S +@@ -54,10 +54,10 @@ ENTRY(__swapcontext) + + /* Fill in the FP SIMD context. */ + add x3, x2, #oV0 + 8 * SZVREG +- stp d8, d9, [x3], #2 * SZVREG +- stp d10, d11, [x3], #2 * SZVREG +- stp d12, d13, [x3], #2 * SZVREG +- stp d14, d15, [x3], #2 * SZVREG ++ stp q8, q9, [x3], #2 * SZVREG ++ stp q10, q11, [x3], #2 * SZVREG ++ stp q12, q13, [x3], #2 * SZVREG ++ stp q14, q15, [x3], #2 * SZVREG + + add x3, x2, #oFPSR + diff --git a/SOURCES/glibc-rh1346397.patch b/SOURCES/glibc-rh1346397.patch new file mode 100644 index 0000000..3300da5 --- /dev/null +++ b/SOURCES/glibc-rh1346397.patch @@ -0,0 +1,85 @@ +Based on the following commits: + +commit 2c41b52901331f5c761015af786a3976e225d779 +Author: Florian Weimer +Date: Mon Jun 13 13:08:39 2016 +0200 + + debug/tst-longjmp_chk2: Make signal handler more conservative [BZ #20248] + + Currently, printf needs more stack space than what is available with + SIGSTKSZ. This commit use the the write system call directly instead. + + Also use sig_atomic_t for the “pass” variable (for general + correctness), and restore signal handlers to their defaults, to avoid + masking crashes. + +commit 5896c8bdd9f73cdc816a96e107ca1f7a6bc6921e +Author: Mike Frysinger +Date: Sun Dec 29 16:30:35 2013 -0500 + + tst-longjmp_chk2: add comments/sanity check + + If the longjmp checking code is slightly broken, this code can loop + forever which isn't too helpful. Add a sanity check to keep that + from happening. + + Signed-off-by: Mike Frysinger + +Index: b/debug/tst-longjmp_chk2.c +=================================================================== +--- a/debug/tst-longjmp_chk2.c ++++ b/debug/tst-longjmp_chk2.c +@@ -4,27 +4,36 @@ + #include + #include + #include ++#include + #include + #include + #include ++#include + + + static jmp_buf mainloop; + static sigset_t mainsigset; +-static int pass; ++static volatile sig_atomic_t pass; + ++static void ++write_message (const char *message) ++{ ++ ssize_t unused __attribute__ ((unused)); ++ for (int i = 0; i < pass; ++i) ++ unused = write (STDOUT_FILENO, " ", 1); ++ unused = write (STDOUT_FILENO, message, strlen (message)); ++} + + static void + stackoverflow_handler (int sig) + { + stack_t altstack; + pass++; ++ assert (pass < 5); + sigaltstack (NULL, &altstack); +- /* Using printf is not really kosher in signal handlers but we know +- it will work. */ +- printf ("%*sin signal handler\n", pass, ""); ++ write_message ("in signal handler\n"); + if (altstack.ss_flags & SS_ONSTACK) +- printf ("%*son alternate stack\n", pass, ""); ++ write_message ("on alternate stack\n"); + siglongjmp (mainloop, pass); + } + +@@ -107,6 +116,11 @@ do_test (void) + else + printf ("disabling alternate stack succeeded \n"); + ++ /* Restore the signal handlers, in case we trigger a crash after the ++ tests above. */ ++ signal (SIGBUS, SIG_DFL); ++ signal (SIGSEGV, SIG_DFL); ++ + return 0; + } + diff --git a/SOURCES/glibc-rh1350733-1.patch b/SOURCES/glibc-rh1350733-1.patch new file mode 100644 index 0000000..1da74c6 --- /dev/null +++ b/SOURCES/glibc-rh1350733-1.patch @@ -0,0 +1,244 @@ +The functions in locarchive.c cannot create files in non-default +locations. Rather than enhancing locarchive.c (and risk regressions +in localedef), this patch adapts build-locale-archive to use the +existing output_prefix configuration variable. + +Index: glibc-2.17-c758a686/releng/build-locale-archive.c +=================================================================== +--- glibc-2.17-c758a686.orig/releng/build-locale-archive.c ++++ glibc-2.17-c758a686/releng/build-locale-archive.c +@@ -92,23 +92,34 @@ xmalloc (size_t size) + return p; + } + ++static char * ++xasprintf (const char *format, ...) ++{ ++ va_list ap; ++ va_start (ap, format); ++ char *result; ++ if (vasprintf (&result, format, ap) < 0) ++ error (EXIT_FAILURE, errno, "could not format string"); ++ va_end (ap); ++ return result; ++} ++ + static void + open_tmpl_archive (struct locarhandle *ah) + { + struct stat64 st; + int fd; + struct locarhead head; +- const char *archivefname = ah->fname == NULL ? tmpl_file : ah->fname; + + /* Open the archive. We must have exclusive write access. */ +- fd = open64 (archivefname, O_RDONLY); ++ fd = open64 (tmpl_file, O_RDONLY); + if (fd == -1) + error (EXIT_FAILURE, errno, "cannot open locale archive template file \"%s\"", +- archivefname); ++ tmpl_file); + + if (fstat64 (fd, &st) < 0) + error (EXIT_FAILURE, errno, "cannot stat locale archive template file \"%s\"", +- archivefname); ++ tmpl_file); + + /* Read the header. */ + if (TEMP_FAILURE_RETRY (read (fd, &head, sizeof (head))) != sizeof (head)) +@@ -253,12 +264,11 @@ compute_data (struct locarhandle *ah, st + + static int + fill_archive (struct locarhandle *tmpl_ah, +- const char *fname, + size_t install_langs_count, char *install_langs_list[], + size_t nlist, char *list[], + const char *primary) + { +- struct locarhandle ah; ++ struct locarhandle ah = {}; + struct locarhead *head; + int result = 0; + struct nameent *names; +@@ -338,9 +348,6 @@ fill_archive (struct locarhandle *tmpl_a + + /* Open the archive. This call never returns if we cannot + successfully open the archive. */ +- ah.fname = NULL; +- if (fname != NULL) +- ah.fname = fname; + open_archive (&ah, false); + + if (primary != NULL) +@@ -619,38 +626,39 @@ Usage: build-locale-archive [OPTION]... + \"de\" but also the aliases \"deutsch\"\n\ + and and \"german\" although the latter does not\n\ + start with \"de\".\n\ ++ --prefix=DIR Operate under the file system root DIR\n\ + \n\ +- If the arguments TEMPLATE-FILE and ARCHIVE-FILE are not given the locations\n\ +- where the glibc used expects these files are used by default.\n\ + "); + } + + int main (int argc, char *argv[]) + { +- char path[4096]; + DIR *dirp; + struct dirent64 *d; + struct stat64 st; + char *list[16384], *primary; + char *lang; + int install_langs_count = 0; +- int i; + char *install_langs_arg, *ila_start; + char **install_langs_list; + unsigned int cnt = 0; +- struct locarhandle tmpl_ah; +- char *new_locar_fname = NULL; +- size_t loc_path_len = strlen (loc_path); ++ struct locarhandle tmpl_ah = {}; + + while (1) + { + int c; + ++ enum ++ { ++ opt_prefix = 1000, ++ }; ++ + static struct option long_options[] = + { + {"help", no_argument, 0, 'h'}, + {"verbose", no_argument, 0, 'v'}, + {"install-langs", required_argument, 0, 'l'}, ++ {"prefix", required_argument, 0, opt_prefix}, + {0, 0, 0, 0} + }; + /* getopt_long stores the option index here. */ +@@ -721,6 +729,10 @@ int main (int argc, char *argv[]) + } + break; + ++ case opt_prefix: ++ output_prefix = optarg; ++ break; ++ + case '?': + /* getopt_long already printed an error message. */ + usage (); +@@ -730,23 +742,26 @@ int main (int argc, char *argv[]) + abort (); + } + } +- tmpl_ah.fname = NULL; +- if (optind < argc) +- tmpl_ah.fname = argv[optind]; +- if (optind + 1 < argc) +- new_locar_fname = argv[optind + 1]; ++ if (optind != argc) ++ { ++ usage (); ++ exit (1); ++ } ++ if (output_prefix) ++ { ++ tmpl_file = xasprintf ("%s%s", output_prefix, tmpl_file); ++ alias_file = xasprintf ("%s%s", output_prefix, alias_file); ++ locar_file = xasprintf ("%s%s", output_prefix, locar_file); ++ loc_path = xasprintf ("%s%s", output_prefix, loc_path); ++ } + if (verbose) + { +- if (tmpl_ah.fname) +- printf("input archive file specified on command line: %s\n", +- tmpl_ah.fname); +- else +- printf("using default input archive file.\n"); +- if (new_locar_fname) +- printf("output archive file specified on command line: %s\n", +- new_locar_fname); +- else +- printf("using default output archive file.\n"); ++ if (output_prefix != NULL) ++ printf ("output prefix: %s\n", output_prefix); ++ printf ("input archive file: %s\n", tmpl_file); ++ printf ("input alias file: %s\n", alias_file); ++ printf ("input locale directory prefix: %s\n", loc_path); ++ printf ("output archive file: %s\n", locar_file); + } + + dirp = opendir (loc_path); +@@ -754,11 +769,7 @@ int main (int argc, char *argv[]) + error (EXIT_FAILURE, errno, "cannot open directory \"%s\"", loc_path); + + open_tmpl_archive (&tmpl_ah); +- +- if (new_locar_fname) +- unlink (new_locar_fname); +- else +- unlink (locar_file); ++ unlink (locar_file); + + primary = getenv ("LC_ALL"); + if (primary == NULL) +@@ -790,8 +801,6 @@ int main (int argc, char *argv[]) + } + } + +- memcpy (path, loc_path, loc_path_len); +- + while ((d = readdir64 (dirp)) != NULL) + { + if (strcmp (d->d_name, ".") == 0 || strcmp (d->d_name, "..") == 0) +@@ -799,32 +808,25 @@ int main (int argc, char *argv[]) + if (strchr (d->d_name, '_') == NULL) + continue; + +- size_t d_name_len = strlen (d->d_name); +- if (loc_path_len + d_name_len + 1 > sizeof (path)) +- { +- error (0, 0, "too long filename \"%s\"", d->d_name); +- continue; +- } +- +- memcpy (path + loc_path_len, d->d_name, d_name_len + 1); ++ char *path = xasprintf ("%s%s", loc_path, d->d_name); + if (stat64 (path, &st) < 0) + { + error (0, errno, "cannot stat \"%s\"", path); ++ free (path); + continue; + } + if (! S_ISDIR (st.st_mode)) +- continue; ++ { ++ free (path); ++ continue; ++ } + if (cnt == 16384) + { + error (0, 0, "too many directories in \"%s\"", loc_path); ++ free (path); + break; + } +- list[cnt] = strdup (path); +- if (list[cnt] == NULL) +- { +- error (0, errno, "cannot add file to list \"%s\"", path); +- continue; +- } ++ list[cnt] = path; + if (primary != NULL && cnt > 0 && strcmp (primary, d->d_name) == 0) + { + char *p = list[0]; +@@ -836,7 +838,7 @@ int main (int argc, char *argv[]) + closedir (dirp); + /* Store the archive to the file specified as the second argument on the + command line or the default locale archive. */ +- fill_archive (&tmpl_ah, new_locar_fname, ++ fill_archive (&tmpl_ah, + install_langs_count, install_langs_list, + cnt, list, primary); + close_archive (&tmpl_ah); diff --git a/SOURCES/glibc-rh971416-1.patch b/SOURCES/glibc-rh971416-1.patch new file mode 100644 index 0000000..cfcf897 --- /dev/null +++ b/SOURCES/glibc-rh971416-1.patch @@ -0,0 +1,53 @@ +commit 0d822a016b631aef409df5805f58962fe5bbcdc5 +Author: Alexandre Oliva +Date: Mon Nov 17 22:00:58 2014 -0200 + + BZ #15969: search locale archive again after alias expansion + + If a locale alias is defined in locale.alias but not in an archive, + and the referenced locale is only present in the archive, setlocale + will fail if given the alias name. This is unintuitive. This patch + fixes it, arranging for the locale archive to be searched again after + alias expansion. + + for ChangeLog + + [BZ #15969] + * locale/findlocale.c (_nl_find_locale): Retry archive search + after alias expansion. + +Index: b/locale/findlocale.c +=================================================================== +--- a/locale/findlocale.c ++++ b/locale/findlocale.c +@@ -156,15 +156,26 @@ _nl_find_locale (const char *locale_path + if (__builtin_expect (data != NULL, 1)) + return data; + ++ /* Nothing in the archive with the given name. Expanding it as ++ an alias and retry. */ ++ loc_name = (char *) _nl_expand_alias (*name); ++ if (loc_name != NULL) ++ { ++ data = _nl_load_locale_from_archive (category, &loc_name); ++ if (__builtin_expect (data != NULL, 1)) ++ return data; ++ } ++ + /* Nothing in the archive. Set the default path to search below. */ + locale_path = _nl_default_locale_path; + locale_path_len = sizeof _nl_default_locale_path; + } ++ else ++ /* We really have to load some data. First see whether the name is ++ an alias. Please note that this makes it impossible to have "C" ++ or "POSIX" as aliases. */ ++ loc_name = (char *) _nl_expand_alias (*name); + +- /* We really have to load some data. First see whether the name is +- an alias. Please note that this makes it impossible to have "C" +- or "POSIX" as aliases. */ +- loc_name = (char *) _nl_expand_alias (*name); + if (loc_name == NULL) + /* It is no alias. */ + loc_name = (char *) *name; diff --git a/SOURCES/glibc-rh971416-2.patch b/SOURCES/glibc-rh971416-2.patch new file mode 100644 index 0000000..39368cc --- /dev/null +++ b/SOURCES/glibc-rh971416-2.patch @@ -0,0 +1,26 @@ +commit 23d43090e0b275e47e09e859823e965a1eb323dc +Author: Alexandre Oliva +Date: Thu Feb 26 02:46:02 2015 -0300 + + Fix constness error just introduced in findlocale. + + for ChangeLog + + [BZ #15969] + * locale/findlocale.c (_nl_find_locale): Fix constness error in + the previous change. + +diff --git a/locale/findlocale.c b/locale/findlocale.c +index 360f58b..5e2639b 100644 +--- a/locale/findlocale.c ++++ b/locale/findlocale.c +@@ -161,7 +161,8 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, + loc_name = (char *) _nl_expand_alias (*name); + if (loc_name != NULL) + { +- data = _nl_load_locale_from_archive (category, &loc_name); ++ data = _nl_load_locale_from_archive (category, ++ (const char **) &loc_name); + if (__builtin_expect (data != NULL, 1)) + return data; + } diff --git a/SOURCES/glibc-rh971416-3.patch b/SOURCES/glibc-rh971416-3.patch new file mode 100644 index 0000000..958d68d --- /dev/null +++ b/SOURCES/glibc-rh971416-3.patch @@ -0,0 +1,113 @@ +commit e7f07af50b231d3ade6b4d338a65d6b571f96116 +Author: Alexandre Oliva +Date: Fri Feb 27 22:18:56 2015 -0300 + + Avoid unsafe loc_name type casts with additional variable + + for ChangeLog + + [BZ #15969] + * locale/findlocale.c (_nl_find_locale): Introduce const + version of loc_name and drop unsafe type casts. + +diff --git a/locale/findlocale.c b/locale/findlocale.c +index 5e2639b..9e7df12 100644 +--- a/locale/findlocale.c ++++ b/locale/findlocale.c +@@ -105,7 +105,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, + { + int mask; + /* Name of the locale for this category. */ +- char *loc_name = (char *) *name; ++ const char *cloc_name = *name; + const char *language; + const char *modifier; + const char *territory; +@@ -113,39 +113,39 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, + const char *normalized_codeset; + struct loaded_l10nfile *locale_file; + +- if (loc_name[0] == '\0') ++ if (cloc_name[0] == '\0') + { + /* The user decides which locale to use by setting environment + variables. */ +- loc_name = getenv ("LC_ALL"); +- if (!name_present (loc_name)) +- loc_name = getenv (_nl_category_names.str +- + _nl_category_name_idxs[category]); +- if (!name_present (loc_name)) +- loc_name = getenv ("LANG"); +- if (!name_present (loc_name)) +- loc_name = (char *) _nl_C_name; ++ cloc_name = getenv ("LC_ALL"); ++ if (!name_present (cloc_name)) ++ cloc_name = getenv (_nl_category_names.str ++ + _nl_category_name_idxs[category]); ++ if (!name_present (cloc_name)) ++ cloc_name = getenv ("LANG"); ++ if (!name_present (cloc_name)) ++ cloc_name = _nl_C_name; + } + + /* We used to fall back to the C locale if the name contains a slash + character '/', but we now check for directory traversal in + valid_locale_name, so this is no longer necessary. */ + +- if (__builtin_expect (strcmp (loc_name, _nl_C_name), 1) == 0 +- || __builtin_expect (strcmp (loc_name, _nl_POSIX_name), 1) == 0) ++ if (__builtin_expect (strcmp (cloc_name, _nl_C_name), 1) == 0 ++ || __builtin_expect (strcmp (cloc_name, _nl_POSIX_name), 1) == 0) + { + /* We need not load anything. The needed data is contained in + the library itself. */ +- *name = (char *) _nl_C_name; ++ *name = _nl_C_name; + return _nl_C[category]; + } +- else if (!valid_locale_name (loc_name)) ++ else if (!valid_locale_name (cloc_name)) + { + __set_errno (EINVAL); + return NULL; + } + +- *name = loc_name; ++ *name = cloc_name; + + /* We really have to load some data. First we try the archive, + but only if there was no LOCPATH environment variable specified. */ +@@ -158,11 +158,10 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, + + /* Nothing in the archive with the given name. Expanding it as + an alias and retry. */ +- loc_name = (char *) _nl_expand_alias (*name); +- if (loc_name != NULL) ++ cloc_name = _nl_expand_alias (*name); ++ if (cloc_name != NULL) + { +- data = _nl_load_locale_from_archive (category, +- (const char **) &loc_name); ++ data = _nl_load_locale_from_archive (category, &cloc_name); + if (__builtin_expect (data != NULL, 1)) + return data; + } +@@ -175,14 +174,14 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, + /* We really have to load some data. First see whether the name is + an alias. Please note that this makes it impossible to have "C" + or "POSIX" as aliases. */ +- loc_name = (char *) _nl_expand_alias (*name); ++ cloc_name = _nl_expand_alias (*name); + +- if (loc_name == NULL) ++ if (cloc_name == NULL) + /* It is no alias. */ +- loc_name = (char *) *name; ++ cloc_name = *name; + + /* Make a writable copy of the locale name. */ +- loc_name = strdupa (loc_name); ++ char *loc_name = strdupa (cloc_name); + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + diff --git a/SPECS/glibc.spec b/SPECS/glibc.spec index 86a33fc..c7c7c57 100644 --- a/SPECS/glibc.spec +++ b/SPECS/glibc.spec @@ -1,10 +1,51 @@ %define glibcsrcdir glibc-2.17-c758a686 %define glibcversion 2.17 -%define glibcrelease 106%{?dist}.8 +%define glibcrelease 157%{?dist} ############################################################################## -# If run_glibc_tests is zero then tests are not run for the build. -# You must always set run_glibc_tests to one for production builds. -%define run_glibc_tests 1 +# We support the following options: +# --with/--without, +# * testsuite - Running the testsuite. +# * benchtests - Running and building benchmark subpackage. +# * bootstrap - Bootstrapping the package. +# * werror - Build with -Werror +# * docs - Build with documentation and the required dependencies. +# * valgrind - Run smoke tests with valgrind to verify dynamic loader. +# +# You must always run the testsuite for production builds. +# Default: Always run the testsuite. +%bcond_without testsuite +# Default: Always build the benchtests. +%bcond_without benchtests +# Default: Not bootstrapping. +%bcond_with bootstrap +# Default: Enable using -Werror +%bcond_without werror +# Default: Always build documentation. +%bcond_without docs +# Default: Don't run valgrind tests +%bcond_with valgrind + +# Run a valgrind smoke test to ensure that the release is compatible and +# doesn't any new feature that might cause valgrind to abort. +%if %{with valgrind} +%ifarch s390 +# There is no valgrind support for 31-bit s390. +%undefine with_valgrind +%endif +%endif +%if %{with werror} +%ifarch s390x +# The 64-bit s390x builds are not -Werror clean yet. +%undefine with_werror +%endif +%endif +%if %{with bootstrap} +# Disable benchtests, -Werror, docs, and valgrind if we're bootstrapping +%undefine with_benchtests +%undefine with_werror +%undefine with_docs +%undefine with_valgrind +%endif ############################################################################## # Auxiliary arches are those arches that can be built in addition # to the core supported arches. You either install an auxarch or @@ -24,25 +65,33 @@ %define xenpackage 0 %endif ############################################################################## -# In RHEL7 for 32-bit and 64-bit POWER the following runtimes are provided: -# - POWER7 (-mcpu=power7 -mtune=power7) -# - POWER8 (-mcpu=power7 -mtune=power8) -# -# We will eventually make the POWER8-tuned runtime into a POWER8 runtime when -# there is enough POWER8 hardware in the build farm to ensure that all -# builds are done on POWER8. +# We support 32-bit and 64-bit POWER with the following runtimes: +# 64-bit BE: +# - POWER7 (default) +# DISABLED - POWER8 (enabled via AT_PLATFORM) +# See: https://projects.engineering.redhat.com/browse/RCMPROJ-5774 +# The ppc64 builders still have POWER7 hardware. +# 64-bit LE: +# - POWER8 LE (default) +# 32-bit BE: +# - POWER7 (default) +# - POWER8 (enabled via AT_PLATFORM) # # The POWER5 and POWER6 runtimes are now deprecated and no longer provided -# or supported. This means that RHEL7 will only run on POWER7 or newer -# hardware. +# or supported. This means that RHEL7 BE will only run on POWER7 or newer +# hardware, and LE will only run on POWER8 or newer hardware. # -%ifarch ppc %{power64} +%ifarch ppc ppc64 +# Build the additional runtimes for 32-bit and 64-bit BE POWER. %define buildpower6 0 -%define buildpower8 1 +# Disabled - %%define buildpower8 1 - See note above. +%define buildpower8 0 %else +# No additional runtimes for ppc64le or ppc64p7, just the default. %define buildpower6 0 %define buildpower8 0 %endif + ############################################################################## # We build librtkaio for all rtkaioarches. The library is installed into # a distinct subdirectory in the lib dir. This define enables the rtkaio @@ -656,39 +705,225 @@ Patch1610: glibc-rh1234622.patch # Fix 32-bit POWER assembly to use only 32-bit instructions. Patch1611: glibc-rh1240796.patch +# Fix for RHBZ #1213267 as a prerequisite for the patches below. +Patch1612: glibc-rh1240351-1.patch + +# Backport of POWER8 glibc optimizations for RHEL7.3: math functions +Patch1613: glibc-rh1240351-2.patch +Patch1614: glibc-rh1240351-3.patch + +# Backport of POWER8 glibc optimizations for RHEL7.3: string functions +Patch1615: glibc-rh1240351-4.patch +Patch1616: glibc-rh1240351-5.patch +Patch1617: glibc-rh1240351-6.patch +Patch1618: glibc-rh1240351-7.patch +Patch1619: glibc-rh1240351-8.patch +Patch1620: glibc-rh1240351-9.patch +Patch1621: glibc-rh1240351-10.patch +Patch1622: glibc-rh1240351-11.patch +Patch1623: glibc-rh1240351-12.patch + +# Backport of upstream IBM z13 patches for RHEL 7.3 +Patch1624: glibc-rh1268008-1.patch +Patch1625: glibc-rh1268008-2.patch +Patch1626: glibc-rh1268008-3.patch +Patch1627: glibc-rh1268008-4.patch +Patch1628: glibc-rh1268008-5.patch +Patch1629: glibc-rh1268008-6.patch +Patch1630: glibc-rh1268008-7.patch +Patch1631: glibc-rh1268008-8.patch +Patch1632: glibc-rh1268008-9.patch +Patch1633: glibc-rh1268008-10.patch +Patch1634: glibc-rh1268008-11.patch +Patch1635: glibc-rh1268008-12.patch +Patch1636: glibc-rh1268008-13.patch +Patch1637: glibc-rh1268008-14.patch +Patch1638: glibc-rh1268008-15.patch +Patch1639: glibc-rh1268008-16.patch +Patch1640: glibc-rh1268008-17.patch +Patch1641: glibc-rh1268008-18.patch +Patch1642: glibc-rh1268008-19.patch +Patch1643: glibc-rh1268008-20.patch +Patch1644: glibc-rh1268008-21.patch +Patch1645: glibc-rh1268008-22.patch +Patch1646: glibc-rh1268008-23.patch +Patch1647: glibc-rh1268008-24.patch +Patch1648: glibc-rh1268008-25.patch +Patch1649: glibc-rh1268008-26.patch +Patch1650: glibc-rh1268008-27.patch +Patch1651: glibc-rh1268008-28.patch +Patch1652: glibc-rh1268008-29.patch +Patch1653: glibc-rh1268008-30.patch + +Patch1654: glibc-rh1249102.patch + # CVE-2015-5229 and regression test. -Patch1612: glibc-rh1293976.patch -Patch1613: glibc-rh1293976-2.patch +Patch1656: glibc-rh1293976.patch +Patch1657: glibc-rh1293976-2.patch # BZ #16574 -Patch1614: glibc-rh1296031-0.patch +Patch1658: glibc-rh1296031-0.patch # BZ #13928 -Patch1616: glibc-rh1296031-2.patch +Patch1660: glibc-rh1296031-2.patch # Malloc trim fixes: #17195, #18502. -Patch1617: glibc-rh1284959-1.patch -Patch1618: glibc-rh1284959-2.patch -Patch1619: glibc-rh1284959-3.patch +Patch1661: glibc-rh1284959-1.patch +Patch1662: glibc-rh1284959-2.patch +Patch1663: glibc-rh1284959-3.patch -# ppc64le monstartup fix: -Patch1620: glibc-rh1249102.patch +# RHBZ #1293916 - iconv appears to be adding a duplicate "SI" +# to the output for certain inputs +Patch1664: glibc-rh1293916.patch -# Fix race in free() of fastbin chunk: BZ #15073. -Patch1621: glibc-rh1027101.patch +# Race condition in _int_free involving fastbins: #15073 +Patch1665: glibc-rh1027101.patch # BZ #17370: Memory leak in wide-oriented ftell. -Patch1622: glibc-rh1310530.patch +Patch1666: glibc-rh1310530.patch # BZ #19791: NULL pointer dereference in stub resolver with unconnectable # name server addresses -Patch1623: glibc-rh1320596.patch - -# RHBZ #1331283 - Backport "Coordinate IPv6 definitions for Linux and glibc" -Patch1624: glibc-rh1331283.patch -Patch1625: glibc-rh1331283-1.patch -Patch1626: glibc-rh1331283-2.patch -Patch1627: glibc-rh1331283-3.patch -Patch1628: glibc-rh1331283-4.patch +Patch1667: glibc-rh1320596.patch + +# RHBZ #1298349 - Backport tst-getpw enhancements +Patch1668: glibc-rh1298349.patch + +# RHBZ #1293433 - Test suite failure: Fix bug17079 +Patch1669: glibc-rh1293433.patch + +# RHBZ #1298354 - Backport test-skeleton.c conversions +Patch1670: glibc-rh1298354.patch + +# RHBZ #1288613 - gethostbyname_r hangs forever +Patch1671: glibc-rh1288613.patch + +# RHBZ #1064063 - Test suite failure: tst-mqueue5 +Patch1672: glibc-rh1064063.patch + +# RHBZ #140250 - Unexpected results from using posix_fallocate +# with nfs target +Patch1675: glibc-rh1140250.patch + +# RHBZ #1324427 - RHEL7.3 - S390: fprs/vrs are not saved/restored while +# resolving symbols +Patch1676: glibc-rh1324427-1.patch +Patch1677: glibc-rh1324427-2.patch +Patch1678: glibc-rh1324427-3.patch + +# RHBZ #1234449 - glibc: backport upstream hardening patches +Patch1679: glibc-rh1234449-1.patch +Patch1680: glibc-rh1234449-2.patch +Patch1681: glibc-rh1234449-3.patch +Patch1682: glibc-rh1234449-4.patch + +# RHBZ #1221046 - make bits/stat.h FTM guards consistent on all arches +Patch1683: glibc-rh1221046.patch + +# RHBZ #971416 - Locale alias no_NO.ISO-8859-1 not working +Patch1684: glibc-rh971416-1.patch +Patch1685: glibc-rh971416-2.patch +Patch1686: glibc-rh971416-3.patch + +# RHBZ 1302086 - Improve libm performance AArch64 +Patch1687: glibc-rh1302086-1.patch +Patch1688: glibc-rh1302086-2.patch +Patch1689: glibc-rh1302086-3.patch +Patch1690: glibc-rh1302086-4.patch +Patch1691: glibc-rh1302086-5.patch +Patch1692: glibc-rh1302086-6.patch +Patch1693: glibc-rh1302086-7.patch +Patch1694: glibc-rh1302086-8.patch +Patch1695: glibc-rh1302086-9.patch +Patch1696: glibc-rh1302086-10.patch +Patch1697: glibc-rh1302086-11.patch + +# RHBZ 1346397 debug/tst-longjump_chk2 calls printf from a signal handler +Patch1698: glibc-rh1346397.patch + +# RHBZ #1211823 Update BIG5-HKSCS charmap to HKSCS-2008 +Patch1699: glibc-rh1211823.patch + +# RHBZ #1268050 Backport "Coordinate IPv6 definitions for Linux and glibc" +Patch1700: glibc-rh1331283.patch +Patch1701: glibc-rh1331283-1.patch +Patch1702: glibc-rh1331283-2.patch +Patch1703: glibc-rh1331283-3.patch +Patch1704: glibc-rh1331283-4.patch + +# RHBZ #1296297 enable (backport) instLangs in RHEL glibc +Patch1705: glibc-rh1296297.patch +Patch1706: glibc-rh1296297-1.patch + +# RHBZ #1027348 sem_post/sem_wait race causing sem_post to return EINVAL +Patch1707: glibc-rh1027348.patch +Patch1708: glibc-rh1027348-1.patch +Patch1709: glibc-rh1027348-2.patch +Patch1710: glibc-rh1027348-3.patch +Patch1711: glibc-rh1027348-4.patch + +# RHBZ #1308728 Fix __times() handling of EFAULT when buf is NULL +Patch1712: glibc-rh1308728.patch + +# RHBZ #1249114 [s390] setcontext/swapcontext does not restore signal mask +Patch1713: glibc-rh1249114.patch +# RHBZ #1249115 S390: backtrace() returns infinitely deep stack ... +Patch1714: glibc-rh1249115.patch + +# RHBZ #1321993: CVE-2016-3075: Stack overflow in nss_dns_getnetbyname_r +Patch1715: glibc-rh1321993.patch + +# RHBZ #1256317 - IS_IN backports. +Patch1716: glibc-rh1256317-21.patch +Patch1717: glibc-rh1256317-20.patch +Patch1718: glibc-rh1256317-19.patch +Patch1719: glibc-rh1256317-18.patch +Patch1720: glibc-rh1256317-17.patch +Patch1721: glibc-rh1256317-16.patch +Patch1722: glibc-rh1256317-15.patch +Patch1723: glibc-rh1256317-14.patch +Patch1724: glibc-rh1256317-13.patch +Patch1725: glibc-rh1256317-12.patch +Patch1726: glibc-rh1256317-11.patch +Patch1727: glibc-rh1256317-10.patch +Patch1728: glibc-rh1256317-9.patch +Patch1729: glibc-rh1256317-8.patch +Patch1730: glibc-rh1256317-7.patch +Patch1731: glibc-rh1256317-6.patch +Patch1732: glibc-rh1256317-5.patch +Patch1733: glibc-rh1256317-4.patch +Patch1734: glibc-rh1256317-3.patch +Patch1735: glibc-rh1256317-2.patch +Patch1736: glibc-rh1256317-1.patch +Patch1737: glibc-rh1256317-0.patch + +# RHBZ #1335286 [Intel 7.3 Bug] (Purley) Backport 64-bit memset from glibc 2.18 +Patch1738: glibc-rh1335286-0.patch +Patch1739: glibc-rh1335286.patch + +# RHBZ #1292018 [Intel 7.3 Bug] Improve branch prediction on Knights Landing/Silvermont +Patch1740: glibc-rh1292018-0.patch +Patch1741: glibc-rh1292018-0a.patch +Patch1742: glibc-rh1292018-0b.patch +Patch1743: glibc-rh1292018-1.patch +Patch1744: glibc-rh1292018-2.patch +Patch1745: glibc-rh1292018-3.patch +Patch1746: glibc-rh1292018-4.patch +Patch1747: glibc-rh1292018-5.patch +Patch1748: glibc-rh1292018-6.patch +Patch1749: glibc-rh1292018-7.patch + +# RHBZ #1255822 glibc: malloc may fall back to calling mmap prematurely if arenas are contended +Patch1750: glibc-rh1255822.patch + +# RHBZ #1298526 [Intel 7.3 FEAT] glibc: AVX-512 optimized memcpy +Patch1751: glibc-rh1298526-0.patch +Patch1752: glibc-rh1298526-1.patch +Patch1753: glibc-rh1298526-2.patch +Patch1754: glibc-rh1298526-3.patch +Patch1755: glibc-rh1298526-4.patch + +# RHBZ #1350733 locale-archive.tmpl cannot be processed by build-locale-archive +Patch1756: glibc-rh1350733-1.patch ############################################################################## # @@ -747,6 +982,21 @@ Patch2065: glibc-rh1156331.patch # Upstream BZ 18557: Fix ruserok scalability issues. Patch2066: glibc-rh1216246.patch +# Backport of fix for malloc arena free list management (upstream bug 19048) +# The preparatory patch removes !PER_THREAD conditional code. +Patch20670: glibc-rh1276753-0.patch +Patch2067: glibc-rh1276753.patch + +# Backport to fix ld.so crash when audit modules provide path (upstream bug 18251) +Patch2068: glibc-rh1211100.patch + +# aarch64 MINSIGSTKSZ/SIGSTKSZ fix +Patch2069: glibc-rh1335629.patch +Patch2070: glibc-rh1335925-1.patch +Patch2071: glibc-rh1335925-2.patch +Patch2072: glibc-rh1335925-3.patch +Patch2073: glibc-rh1335925-4.patch + ############################################################################## # End of glibc patches. ############################################################################## @@ -776,11 +1026,26 @@ Requires(pre): basesystem, libgcc # This is for building auxiliary programs like memusage, nscd # For initial glibc bootstraps it can be commented out -BuildRequires: gd-devel libpng-devel zlib-devel texinfo, libselinux-devel >= 1.33.4-3 -BuildRequires: audit-libs-devel >= 1.1.3, sed >= 3.95, libcap-devel, gettext, nss-devel +BuildRequires: gd-devel libpng-devel zlib-devel +%if %{with docs} +# Removing texinfo will cause check-safety.sh test to fail because it seems to +# trigger documentation generation based on dependencies. We need to fix this +# upstream in some way that doesn't depend on generating docs to validate the +# texinfo. I expect it's simply the wrong dependency for that target. +BuildRequires: texinfo +%endif +%if %{without bootstrap} +BuildRequires: libselinux-devel >= 1.33.4-3 +BuildRequires: nss-devel +%endif +BuildRequires: audit-libs-devel >= 1.1.3, sed >= 3.95, libcap-devel, gettext BuildRequires: /bin/ps, /bin/kill, /bin/awk BuildRequires: systemtap-sdt-devel +%if %{with valgrind} +BuildRequires: /usr/bin/valgrind +%endif + # This is needed to get the _tmpfilesdir macro we use for nscd. BuildRequires: systemd @@ -834,9 +1099,16 @@ BuildRequires: elfutils >= 0.72 BuildRequires: rpm >= 4.2-0.56 %endif -# The testsuite builds static C++ binaries that require a static -# C++ runtime from libstdc++-static. +%if %{without boostrap} +%if %{with testsuite} +# The testsuite builds static C++ binaries that require a C++ compiler +# and static C++ runtime from libstdc++-static. +BuildRequires: gcc-c++ BuildRequires: libstdc++-static +BuildRequires: glibc-static +%endif +%endif + # Filter out all GLIBC_PRIVATE symbols since they are internal to # the package and should be examined by any other tool. @@ -958,7 +1230,10 @@ libraries, as well as national language (locale) support. Summary: A Name Service Caching Daemon (nscd). Group: System Environment/Daemons Requires: %{name} = %{version}-%{release} -Requires: libselinux >= 1.17.10-1, audit-libs >= 1.1.3 +%if %{without bootstrap} +Requires: libselinux >= 1.17.10-1 +%endif +Requires: audit-libs >= 1.1.3 Requires(pre): /usr/sbin/useradd, coreutils Requires(post): systemd-units Requires(preun): systemd-units @@ -1037,6 +1312,7 @@ package or when debugging this package. # Prepare for the build. ############################################################################## %prep + %setup -q -n %{glibcsrcdir} -b1 # Patch order is important as some patches depend on other patches and @@ -1321,18 +1597,26 @@ package or when debugging this package. %patch1605 -p1 %patch1606 -p1 %patch2066 -p1 +%patch20670 -p1 +%patch2067 -p1 +%patch2068 -p1 +%patch2069 -p1 +%patch2070 -p1 +%patch2071 -p1 +%patch2072 -p1 +%patch2073 -p1 # Rebase of microbenchmarks. %patch1607 -p1 %patch1609 -p1 %patch1610 -p1 %patch1611 -p1 -%patch1123 -p1 -%patch1124 -p1 + +# Backport of POWER8 glibc optimizations for RHEL7.3 %patch1612 -p1 %patch1613 -p1 %patch1614 -p1 +%patch1615 -p1 %patch1616 -p1 -%patch0067 -p1 %patch1617 -p1 %patch1618 -p1 %patch1619 -p1 @@ -1341,12 +1625,173 @@ package or when debugging this package. %patch1622 -p1 %patch1623 -p1 -# RHBZ #1331283 - Backport "Coordinate IPv6 definitions for Linux and glibc" +# Backport of upstream IBM z13 patches for RHEL 7.3 %patch1624 -p1 %patch1625 -p1 %patch1626 -p1 %patch1627 -p1 %patch1628 -p1 +%patch1629 -p1 +%patch1630 -p1 +%patch1631 -p1 +%patch1632 -p1 +%patch1633 -p1 +%patch1634 -p1 +%patch1635 -p1 +%patch1636 -p1 +%patch1637 -p1 +%patch1638 -p1 +%patch1639 -p1 +%patch1640 -p1 +%patch1641 -p1 +%patch1642 -p1 +%patch1643 -p1 +%patch1644 -p1 +%patch1645 -p1 +%patch1646 -p1 +%patch1647 -p1 +%patch1648 -p1 +%patch1649 -p1 +%patch1650 -p1 +%patch1651 -p1 +%patch1652 -p1 +%patch1653 -p1 +%patch1654 -p1 + +%patch1123 -p1 +%patch1124 -p1 + +%patch1656 -p1 +%patch1657 -p1 +%patch1658 -p1 +%patch1660 -p1 +%patch0067 -p1 +%patch1661 -p1 +%patch1662 -p1 +%patch1663 -p1 + +%patch1664 -p1 +%patch1665 -p1 +%patch1666 -p1 +%patch1667 -p1 +%patch1668 -p1 +%patch1669 -p1 +%patch1670 -p1 +%patch1671 -p1 +%patch1672 -p1 + +%patch1675 -p1 + +# RHBZ #1324427, parts 1 through 3 +%patch1676 -p1 +%patch1677 -p1 +%patch1678 -p1 + +# RHBZ #1234449, parts 1 through 4 +%patch1679 -p1 +%patch1680 -p1 +%patch1681 -p1 +%patch1682 -p1 + +# RHBZ #1221046 +%patch1683 -p1 + +# RHBZ #971416 +%patch1684 -p1 +%patch1685 -p1 +%patch1686 -p1 + +# RHBZ #1302086 +%patch1687 -p1 +%patch1688 -p1 +%patch1689 -p1 +%patch1690 -p1 +%patch1691 -p1 +%patch1692 -p1 +%patch1693 -p1 +%patch1694 -p1 +%patch1695 -p1 +%patch1696 -p1 +%patch1697 -p1 + +# RHBZ #1346397 +%patch1698 -p1 + +# RHBZ #1211823 +%patch1699 -p1 + +# RHBZ #1268050, parts 1 through 5 +%patch1700 -p1 +%patch1701 -p1 +%patch1702 -p1 +%patch1703 -p1 +%patch1704 -p1 + +# RHBz #1296297, part 1 and 2. +%patch1705 -p1 +%patch1706 -p1 + +# RHBZ #1027348, part 1 through 5. +%patch1707 -p1 +%patch1708 -p1 +%patch1709 -p1 +%patch1710 -p1 +%patch1711 -p1 + +%patch1712 -p1 +%patch1713 -p1 +%patch1714 -p1 + +%patch1715 -p1 + +# RHBZ #1256317, IS_IN backports, parts 1 through 22. +%patch1716 -p1 +%patch1717 -p1 +%patch1718 -p1 +%patch1719 -p1 +%patch1720 -p1 +%patch1721 -p1 +%patch1722 -p1 +%patch1723 -p1 +%patch1724 -p1 +%patch1725 -p1 +%patch1726 -p1 +%patch1727 -p1 +%patch1728 -p1 +%patch1729 -p1 +%patch1730 -p1 +%patch1731 -p1 +%patch1732 -p1 +%patch1733 -p1 +%patch1734 -p1 +%patch1735 -p1 +%patch1736 -p1 +%patch1737 -p1 + +%patch1738 -p1 +%patch1739 -p1 + +# RHBZ #1292018, patches 1 through 10. +%patch1740 -p1 +%patch1741 -p1 +%patch1742 -p1 +%patch1743 -p1 +%patch1744 -p1 +%patch1745 -p1 +%patch1746 -p1 +%patch1747 -p1 +%patch1748 -p1 +%patch1749 -p1 + +%patch1750 -p1 + +# RHBZ #1298526, patch 1 of 5. +%patch1751 -p1 +%patch1752 -p1 +%patch1753 -p1 +%patch1754 -p1 +%patch1755 -p1 +%patch1756 -p1 ############################################################################## # %%prep - Additional prep required... @@ -1380,10 +1825,16 @@ touch locale/programs/*-kw.h ############################################################################## %build -# We built using the native system compilers. +# We build using the native system compilers. GCC=gcc GXX=g++ +# Log system information. +uname -a +cat /proc/cpuinfo +cat /proc/meminfo +df + ############################################################################## # %%build - x86 options. ############################################################################## @@ -1406,38 +1857,50 @@ BuildFlags="-mtune=generic" ############################################################################## %ifarch sparc BuildFlags="-fcall-used-g6" -GCC="gcc -m32" -GXX="g++ -m32" +GCC="$GCC -m32" +GXX="$GXX -m32" %endif %ifarch sparcv9 BuildFlags="-mcpu=ultrasparc -fcall-used-g6" -GCC="gcc -m32" -GXX="g++ -m32" +GCC="$GCC -m32" +GXX="$GXX -m32" %endif %ifarch sparcv9v BuildFlags="-mcpu=niagara -fcall-used-g6" -GCC="gcc -m32" -GXX="g++ -m32" +GCC="$GCC -m32" +GXX="$GXX -m32" %endif %ifarch sparc64 BuildFlags="-mcpu=ultrasparc -mvis -fcall-used-g6" -GCC="gcc -m64" -GXX="g++ -m64" +GCC="$GCC -m64" +GXX="$GXX -m64" %endif %ifarch sparc64v BuildFlags="-mcpu=niagara -mvis -fcall-used-g6" -GCC="gcc -m64" -GXX="g++ -m64" +GCC="$GCC -m64" +GXX="$GXX -m64" %endif + +############################################################################## +# %%build - POWER options. +############################################################################## %ifarch ppc BuildFlags="" -GCC="gcc -mcpu=power7 -mtune=power7" -GXX="g++ -mcpu=power7 -mtune=power7" +GCC="$GCC -mcpu=power7 -mtune=power7" +GXX="$GXX -mcpu=power7 -mtune=power7" +core_with_options="--with-cpu=power7" %endif %ifarch %{power64} BuildFlags="" -GCC="gcc -m64 -mcpu=power7 -mtune=power7" -GXX="g++ -m64 -mcpu=power7 -mtune=power7" +%ifarch ppc64le +GCC="$GCC -mcpu=power8 -mtune=power8" +GXX="$GXX -mcpu=power8 -mtune=power8" +core_with_options="--with-cpu=power8" +%else +GCC="$GCC -m64 -mcpu=power7 -mtune=power7" +GXX="$GXX -m64 -mcpu=power7 -mtune=power7" +core_with_options="--with-cpu=power7" +%endif %endif ############################################################################## @@ -1488,12 +1951,17 @@ configure_CFLAGS="$build_CFLAGS -fno-asynchronous-unwind-tables" %endif --enable-obsolete-rpc \ --enable-systemtap \ -%ifarch ppc %{power64} -%ifnarch ppc64le - --with-cpu=power7 \ + ${core_with_options} \ +%if %{without werror} + --disable-werror \ %endif + --disable-profile \ +%if %{with bootstrap} + --without-selinux \ + --disable-nss-crypt || +%else + --enable-nss-crypt || %endif - --disable-profile --enable-nss-crypt || { cat config.log; false; } make %{?_smp_mflags} -r CFLAGS="$build_CFLAGS" %{silentrules} @@ -1533,18 +2001,18 @@ if [ "$platform" != power6 ]; then %endif export LD_PRELOAD=`pwd`/power6emul/\$LIB/power6emul.so fi -AddOns="$AddOns --with-cpu=power6" GCC="$GCC -mcpu=power6" GXX="$GXX -mcpu=power6" +core_with_options="--with-cpu=power6" build power6 ) %endif %if %{buildpower8} ( - AddOns="$AddOns --with-cpu=power7" - GCC="$GCC -mcpu=power7 -mtune=power8" - GXX="$GXX -mcpu=power7 -mtune=power8" + GCC="$GCC -mcpu=power8 -mtune=power8" + GXX="$GXX -mcpu=power8 -mtune=power8" + core_with_options="--with-cpu=power8" build power8 ) %endif @@ -1714,6 +2182,7 @@ cp -a bits/stdio-lock.h $RPM_BUILD_ROOT%{_prefix}/include/bits/stdio-lock.h # And needs sanitizing as well. cp -a releng/libc-lock.h $RPM_BUILD_ROOT%{_prefix}/include/bits/libc-lock.h +%if %{with docs} # Move the info files if glibc installed them into the wrong location. if [ -d $RPM_BUILD_ROOT%{_prefix}/info -a "%{_infodir}" != "%{_prefix}/info" ]; then mkdir -p $RPM_BUILD_ROOT%{_infodir} @@ -1724,6 +2193,11 @@ fi # Compress all of the info files. gzip -9nvf $RPM_BUILD_ROOT%{_infodir}/libc* +%else +rm -f $RPM_BUILD_ROOT%{_infodir}/dir +rm -f $RPM_BUILD_ROOT%{_infodir}/libc.info* +%endif + # XXX: What is this for? ln -sf libbsd-compat.a $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libbsd.a @@ -1852,7 +2326,10 @@ rm -f $RPM_BUILD_ROOT%{_sbindir}/rpcinfo , \ ! -path "*/lib/debug/*" -printf "/%%P\n" \) find $RPM_BUILD_ROOT -type d \ - \( -path '*%{_prefix}/share/*' ! -path '*%{_infodir}' -o \ + \( -path '*%{_prefix}/share/*' \ +%if %{with docs} + ! -path '*%{_infodir}' -o \ +%endif -path "*%{_prefix}/include/*" \ \) -printf "%%%%dir /%%P\n" } | { @@ -1883,8 +2360,10 @@ for i in $RPM_BUILD_ROOT%{_prefix}/bin/{xtrace,memusage}; do -i $i done +%if %{with docs} # Put the info files into the devel file list. grep '%{_infodir}' < rpm.filelist | grep -v '%{_infodir}/dir' > devel.filelist +%endif # The glibc-headers package includes only common files which are identical # across all multilib packages. We must keep gnu/stubs.h and gnu/lib-names.h @@ -1903,7 +2382,8 @@ grep '%{_prefix}/include' < rpm.filelist \ # the core glibc package. sed -i -e '\|%{_prefix}/%{_lib}/lib.*_p.a|d' \ -e '\|%{_prefix}/include|d' \ - -e '\|%{_infodir}|d' rpm.filelist + -e '\|%{_infodir}|d' \ + rpm.filelist # Put some static files into the devel package. grep '%{_prefix}/%{_lib}/lib.*\.a' < rpm.filelist \ @@ -2005,6 +2485,30 @@ $GCC -Os -g -static -o build-locale-archive build-locale-archive.c \ -L../build-%{target} \ -Wl,--allow-shlib-undefined \ -B../build-%{target}/csu/ -lc -lc_nonshared + +%ifnarch %{auxarches} +# Test run, to make sure the locale archive is not corrupt. The test +# runs against a directory tree under tmp-proot, using --prefix option +# of build-locale-archive. +mkdir -p tmp-root/usr/{lib,share}/locale +touch tmp-root/usr/share/locale/locale.alias +cp ${RPM_BUILD_ROOT}%{_prefix}/lib/locale/locale-archive.tmpl \ + tmp-root/usr/lib/locale/locale-archive.tmpl +# Capture locale list, before build-locale-archive destroys the input file. +../build-%{target}/testrun.sh ../build-%{target}/locale/localedef \ + --list-archive tmp-root/usr/lib/locale/locale-archive.tmpl \ + | sort -o tmp-root/tmpl.list + +./build-locale-archive --verbose --install-langs all --prefix tmp-root + +# Compare the results, to check that no locales were dropped. +../build-%{target}/testrun.sh ../build-%{target}/locale/localedef \ + --list-archive tmp-root/usr/lib/locale/locale-archive \ + | sort -o tmp-root/list +diff -u tmp-root/tmpl.list tmp-root/list +rm -rf tmp-root +%endif + install -m 700 build-locale-archive $RPM_BUILD_ROOT/usr/sbin/build-locale-archive popd @@ -2032,7 +2536,7 @@ ln -sf /lib/ld-linux-armhf.so.3 $RPM_BUILD_ROOT/lib/ld-linux.so.3 ############################################################################## # Run the glibc testsuite ############################################################################## -%if %{run_glibc_tests} +%if %{with testsuite} # Increase timeouts export TIMEOUTFACTOR=16 parent=$$ @@ -2104,6 +2608,17 @@ echo ====================PLT RELOCS LIBC.SO============== readelf -Wr $RPM_BUILD_ROOT/%{_lib}/libc-*.so | sed -n -e "$PLTCMD" echo ====================PLT RELOCS END================== +%if %{with valgrind} +# Finally, check if valgrind runs with the new glibc. +# We want to fail building if valgrind is not able to run with this glibc so +# that we can then coordinate with valgrind to get it fixed before we update +# glibc. +pushd build-%{target} +elf/ld.so --library-path .:elf:nptl:dlfcn /usr/bin/valgrind \ + elf/ld.so --library-path .:elf:nptl:dlfcn /usr/bin/true +popd +%endif + %endif # %{run_glibc_tests} ############################################################################### @@ -2200,9 +2715,11 @@ list_debug_archives >> debuginfocommon.filelist %endif # 0%{?_enable_debug_packages} +%if %{with docs} # Remove the `dir' info-heirarchy file which will be maintained # by the system as it adds info files to the install. rm -f $RPM_BUILD_ROOT%{_infodir}/dir +%endif %ifarch %{auxarches} @@ -2244,7 +2761,8 @@ end if posix.stat("%{_prefix}/lib/locale/locale-archive.tmpl", "size") > 0 then pid = posix.fork() if pid == 0 then - posix.exec("%{_prefix}/sbin/build-locale-archive") + posix.exec("%{_prefix}/sbin/build-locale-archive", "--install-langs", + rpm.expand("%%{_install_langs}")) elseif pid > 0 then posix.wait(pid) end @@ -2255,15 +2773,18 @@ if posix.access("/etc/ld.so.cache") then if posix.stat("%{_prefix}/lib/locale/locale-archive.tmpl", "size") > 0 then pid = posix.fork() if pid == 0 then - posix.exec("%{_prefix}/sbin/build-locale-archive") + posix.exec("%{_prefix}/sbin/build-locale-archive", "--install-langs", + rpm.expand("%%{_install_langs}")) elseif pid > 0 then posix.wait(pid) end end end +%if %{with docs} %post devel /sbin/install-info %{_infodir}/libc.info.gz %{_infodir}/dir > /dev/null 2>&1 || : +%endif %pre headers # this used to be a link and it is causing nightmares now @@ -2271,10 +2792,12 @@ if [ -L %{_prefix}/include/scsi ] ; then rm -f %{_prefix}/include/scsi fi +%if %{with docs} %preun devel if [ "$1" = 0 ]; then /sbin/install-info --delete %{_infodir}/libc.info.gz %{_infodir}/dir > /dev/null 2>&1 || : fi +%endif %post utils -p /sbin/ldconfig @@ -2416,37 +2939,181 @@ rm -f *.filelist* %endif %changelog -* Thu Jun 16 2016 Carlos O'Donell - 2.17-106.8 -- Fix Linux kernel UAPI header synchronization for IPv6 (#1331283). +* Thu Aug 11 2016 Florian Weimer - 2.17-157 +- Rebuild with updated binutils (#1268008) -* Fri May 20 2016 Martin Sebor - 2.17-106.7 -- Make minor compatibility adjustments in headers (#1331283). +* Tue Jul 19 2016 Florian Weimer - 2.17-156 +- malloc arena free free list management fix (#1276753) -* Mon Apr 4 2016 Carlos O'Donell - 2.17-106.6 -- Fix NULL pointer dereference in stub resolver with unconnectable name - server addresses (#1323839). +* Wed Jun 29 2016 Florian Weimer - 2.17-155 +- Basic validity check for locale-archive.tmpl (#1350733) + +* Wed Jun 22 2016 Carlos O'Donell - 2.17-153 +- Add Intel AVX-512 optimized routines (#1298526). + +* Wed Jun 22 2016 Carlos O'Donell - 2.17-151 +- Improve malloc peformance in low-memory situations (#1255822). + +* Wed Jun 22 2016 Carlos O'Donell - 2.17-150 +- Improve performance on Intel Knights Landing/Silvermont (#1292018). + +* Tue Jun 21 2016 Carlos O'Donell - 2.17-149 +- Improve performance on Intel Purley (#1335286). + +* Mon Jun 20 2016 Carlos O'Donell - 2.17-148 +- Support upstream build infrastrucutre changes (#1256317). + +* Sun Jun 19 2016 Florian Weimer - 2.17-147 +- CVE-2016-3075: Stack overflow in nss_dns_getnetbyname_r (#1321993) + +* Sun Jun 19 2016 Carlos O'Donell - 2.17-146 +- s390: Restore signal mask on setcontext/swapcontext (#1249114). +- s390: Fix backtrace in the presence of makecontext (#1249115). + +* Fri Jun 17 2016 Carlos O'Donell - 2.17-145 +- Fix times() handling of EFAULT when buf is NULL (#1308728). + +* Fri Jun 17 2016 Carlos O'Donell - 2.17-144 +- Fix sem_post/sem_wait race causing sem_post to return EINVAL (#1027348). + +* Fri Jun 17 2016 Carlos O'Donell - 2.17-143 +- Support installing only those locales specified by the RPM macro + %%_install_langs (#1296297). + +* Fri Jun 17 2016 Carlos O'Donell - 2.17-142 +- Fix Linux kernel UAPI header synchronization for IPv6 (#1268050). + +* Fri Jun 17 2016 Florian Weimer - 2.17-141 +- Update BIG5-HKSCS charmap to HKSCS-2008 (#1211823) + +* Thu Jun 16 2016 Florian Weimer - 2.17-140 +- Remove printf from signal handler in tst-longjump_chk2 (#1346397) + +* Thu Jun 16 2016 Florian Weimer - 2.17-139 +- Improve libm performance AArch64 (#1302086) + +* Wed Jun 15 2016 Florian Weimer - 2.17-138 +- Search locale archive again after alias expansion (#971416) + +* Wed Jun 15 2016 Florian Weimer - 2.17-137 +- Revert IPv6 name server management changes (#1305132) + +* Fri Jun 10 2016 Yaakov Selkowitz - 2.17-136 +- aarch64: Fix bits/stat.h FTM guards (#1221046) -* Mon Apr 4 2016 Carlos O'Donell - 2.17-106.5 -- Fix memory leak in ftell for wide-oriented streams (#1323781). -- Avoid race condition in _int_free involving fastbins (#1313308). +* Fri May 13 2016 Florian Weimer - 2.17-135 +- aarch64: Fix various minor ABI incompatibilities (#1335925) + +* Fri May 13 2016 Florian Weimer - 2.17-134 +- aarch64: Correct definition of MINSIGSTKSZ/SIGSTKSZ (#1335629) + +* Tue May 3 2016 Carlos O'Donell - 2.17-133 +- Require libselinux for nscd in non-bootstrap configuration (#1255847). + +* Thu Apr 28 2016 Martin Sebor - 2.17-132 +- Fix a number of long-standing issues in the TZ parser (#1234449). + +* Mon Apr 25 2016 Florian Weimer - 2.17-131 +- Remove PER_THREAD preprocessor macro from malloc +- Use final upstream patch for arena free list fix (#1276753) + +* Thu Apr 14 2016 Martin Sebor - 2.17-130 +- Prevent the compiler from clobbering floating point and vector + registers in S390 symbol resolution functions (#1324427). +- Improve posix_fallocate behavior with NFS file descriptors (#1140250). + +* Mon Apr 04 2016 Martin Sebor - 2.17-129 +- Remove a race condition from tst-mqueue5.c test to prevent spurious + failures (#1064063). + +* Mon Apr 04 2016 Martin Sebor - 2.17-128 +- Prevent a deadlock in gethostbyname_r (#1288613). + +* Mon Apr 04 2016 Martin Sebor - 2.17-127 +- Use test-skeleton.c in tests (#1298354). + +* Mon Apr 04 2016 Martin Sebor - 2.17-126 +- Fix inconsistent passwd compensation in nss/bug17079.c (#1293433). + +* Mon Apr 04 2016 Martin Sebor - 2.17-125 +- Backport tst-getpw enhancement to limit the time the test takes up + (#1298349). + +* Mon Apr 04 2016 Florian Weimer - 2.17-124 +- Log system information during build (#1307028). + +* Mon Apr 04 2016 Martin Sebor - 2.17-123 +- Avoid appending duplicate shift sequences in iconv (#1293916). + +* Mon Apr 04 2016 Carlos O'Donell - 2.17-122 +- Reorganize POWER7 and POWER8 support (#1213267). + - Only build POWER7 runtime for ppc64p7. + - Only build POWER8 runtime for ppc64le. + - Configure with --with-cpu=power8 for ppc64le. + - Configure with --with-cpu=power8 for ppc. + - Configure with --with-cpu=power7 for ppc64 default runtime. + +* Mon Apr 04 2016 DJ Delorie - 2.17-121 +- Build require gcc-c++ for the C++ tests. +- Add --with/--without controls for building glibc (#1255847) + - Support --without testsuite option to disable testing after build. + - Support --without benchtests option to disable microbenchmarks + (placeholder for upstream compatibility only) + - Update --with bootstrap to disable valgrind, documentation, + selinux, and nss-crypt during bootstrap. + - Support --without werror to disable building with -Werror. + - Support --without docs to disable build requirement on texinfo. + - Support --with valgrind to enable testing with valgrind. + +* Mon Apr 04 2016 Martin Sebor - 2.17-120 +- Make minor compatibility adjustments in headers (#1268050). + +* Mon Apr 04 2016 Florian Weimer - 2.17-119 +- Avoid aliasing issue in tst-rec-dlopen (#1292224) + +* Mon Apr 04 2016 Florian Weimer - 2.17-118 +- Suppress expected backtrace in tst-malloc-backtrace (#1276631). + +* Mon Apr 04 2016 Florian Weimer - 2.17-117 +- Avoid ld.so crash when audit modules provide path (#1211100) + +* Mon Apr 04 2016 Martin Sebor - 2.17-116 +- Avoid "monstartup: out of memory" error on powerpc64le (#1249102). + +* Mon Apr 04 2016 Martin Sebor - 2.17-115 +- Configure --with-cpu=power8 on powerpc64 to generate POWER8 + instructions for POWER8 runtime (#1183088, #1213267). + +* Mon Apr 04 2016 Martin Sebor - 2.17-114 +- Add enhanced and optimized support for IBM z13 systems (#1268008). + +* Mon Apr 04 2016 Florian Weimer - 2.17-113 +- Prevent the malloc arena free list form turning cyclic (#1276753). + +* Mon Apr 04 2016 Martin Sebor - 2.17-112 +- Backported POWER8 optimizations for math and string functions (#1240351). + +* Mon Apr 04 2016 Carlos O'Donell - 2.17-111 +- Fix NULL pointer dereference in stub resolver with unconnectable name + server addresses (#1320596). -* Fri Feb 5 2016 Florian Weimer - 2.17-106.4 -- Revert problematic libresolv change, not needed for the - CVE-2015-7547 fix (#1296030). +* Thu Mar 31 2016 Carlos O'Donell - 2.17-110 +- Fix memory leak in ftell for wide-oriented streams (#1310530). -* Fri Jan 15 2016 Carlos O'Donell - 2.17-106.3 -- Fix CVE-2015-7547: getaddrinfo() stack-based buffer overflow (#1296030). -- Fix madvise performance issues (#1298930). -- Avoid "monstartup: out of memory" error on powerpc64le (#1298956). +* Fri Feb 12 2016 Florian Weimer - 2.17-109 +- Avoid race condition in _int_free involving fastbins (#1305406). -* Wed Jan 13 2016 Carlos O'Donell - 2.17-106.2 -- Fix CVE-2015-5229: calloc() may return non-zero memory (#1296453). +* Fri Jan 15 2016 Carlos O'Donell - 2.17-108 +- Fix CVE-2015-7547: getaddrinfo() stack-based buffer overflow (#1296031). +- Fix madvise performance issues (#1284959). +- Avoid "monstartup: out of memory" error on powerpc64le (#1249102). +- Update malloc testing for 32-bit POWER (#1293976). -* Wed Oct 28 2015 Florian Weimer - 2.17-106.1 -- Rebuild with corrected release. +* Wed Jan 13 2016 Carlos O'Donell - 2.17-107 +- Fix CVE-2015-5229: calloc() may return non-zero memory (#1293976). -* Wed Oct 28 2015 Florian Weimer - 2.17-106 -- Add fix for CVE-2015-5277 (#1275920). +* Tue Oct 27 2015 Florian Weimer - 2.17-106 +- Add fix for CVE-2015-5277 (#1263134). * Fri Aug 14 2015 Siddhesh Poyarekar - 2.17-105 - Fix up test case for initial-exec fix (#1248208).