diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6862d2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +SOURCES/glibc-2.17-c758a686-releng.tar.gz +SOURCES/glibc-2.17-c758a686.tar.gz diff --git a/.glibc.metadata b/.glibc.metadata new file mode 100644 index 0000000..5ca6e2b --- /dev/null +++ b/.glibc.metadata @@ -0,0 +1,2 @@ +3dd002978c064e6e318eefef5534467fe548603e SOURCES/glibc-2.17-c758a686-releng.tar.gz +4fba0f86423c135f33a82cf8b58664aacf72f628 SOURCES/glibc-2.17-c758a686.tar.gz diff --git a/SOURCES/glibc-aa64-commonpagesize-64k.patch b/SOURCES/glibc-aa64-commonpagesize-64k.patch new file mode 100644 index 0000000..a18a0e3 --- /dev/null +++ b/SOURCES/glibc-aa64-commonpagesize-64k.patch @@ -0,0 +1,11 @@ +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/preconfigure 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/preconfigure 2014-05-12 14:29:52.007239252 -0400 +@@ -8,7 +8,7 @@ + case "$machine" in + aarch64*) + # Parameters to allow auto-detection of -z relro. +- libc_commonpagesize=0x1000 ++ libc_commonpagesize=0x10000 + libc_relro_required=yes + ;; + esac diff --git a/SOURCES/glibc-aa64-setcontext.patch b/SOURCES/glibc-aa64-setcontext.patch new file mode 100644 index 0000000..60fc6a5 --- /dev/null +++ b/SOURCES/glibc-aa64-setcontext.patch @@ -0,0 +1,220 @@ +Backport + +37d350073888887637aa67dddf988d9c4b226032 \ + aarch64: Re-implement setcontext without rt_sigreturn syscall +03ea4d9b6916857e3c2a021f55d2a853cb837398 \ + [AArch64] Simplify getcontext pstate initialization. +6e445a3d2bdf152ebf57d1c92bfea1828e070743 \ + [AArch64] Ensure getcontext() initializes PSTATE. + + +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S +index aff2e32..70b2e32 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/getcontext.S +@@ -1,6 +1,6 @@ + /* Save current context. + +- Copyright (C) 2009-2012 Free Software Foundation, Inc. ++ Copyright (C) 2009-2014 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + +@@ -53,6 +53,9 @@ ENTRY(__getcontext) + mov x2, sp + str x2, [x0, oSP] + ++ /* Initialize the pstate. */ ++ str xzr, [x0, oPSTATE] ++ + /* Figure out where to place the first context extension + block. */ + add x2, x0, #oEXTENSION +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S +index a98f67f..f45a655 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S +@@ -1,6 +1,6 @@ + /* Set current context. + +- Copyright (C) 2009-2012 Free Software Foundation, Inc. ++ Copyright (C) 2009-2014 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + +@@ -22,68 +22,108 @@ + #include "ucontext_i.h" + #include "ucontext-internal.h" + +-/* int setcontext (const ucontext_t *ucp) */ ++/* int __setcontext (const ucontext_t *ucp) + +- .text +- +-ENTRY(__setcontext) +- +- /* Create a signal frame on the stack: +- +- fp +- lr +- ... +- sp-> rt_sigframe +- */ +- +- stp x29, x30, [sp, -16]! +- cfi_adjust_cfa_offset (16) +- cfi_rel_offset (x29, 0) +- cfi_rel_offset (x30, 8) +- +- mov x29, sp +- cfi_def_cfa_register (x29) +- +- /* Allocate space for the sigcontext. */ +- mov w3, #((RT_SIGFRAME_SIZE + SP_ALIGN_SIZE) & SP_ALIGN_MASK) +- sub sp, sp, x3 ++ Restores the machine context in UCP and thereby resumes execution ++ in that context. + +- /* Compute the base address of the ucontext structure. */ +- add x1, sp, #RT_SIGFRAME_UCONTEXT ++ This implementation is intended to be used for *synchronous* context ++ switches only. Therefore, it does not have to restore anything ++ other than the PRESERVED state. */ + +- /* Only ucontext is required in the frame, *copy* it in. */ +- +-#if UCONTEXT_SIZE % 16 +-#error The implementation of setcontext.S assumes sizeof(ucontext_t) % 16 == 0 +-#endif +- +- mov x2, #UCONTEXT_SIZE / 16 +-0: +- ldp x3, x4, [x0], #16 +- stp x3, x4, [x1], #16 +- sub x2, x2, 1 +- cbnz x2, 0b ++ .text + +- /* rt_sigreturn () -- no arguments, sp points to struct rt_sigframe. */ +- mov x8, SYS_ify (rt_sigreturn) ++ENTRY (__setcontext) ++ /* Save a copy of UCP. */ ++ mov x9, x0 ++ ++ /* Set the signal mask with ++ rt_sigprocmask (SIG_SETMASK, mask, NULL, _NSIG/8). */ ++ mov x0, #SIG_SETMASK ++ add x1, x9, #UCONTEXT_SIGMASK ++ mov x2, #0 ++ mov x3, #_NSIG8 ++ mov x8, SYS_ify (rt_sigprocmask) + svc 0 +- +- /* Ooops we failed. Recover the stack */ +- +- mov sp, x29 +- cfi_def_cfa_register (sp) +- +- ldp x29, x30, [sp], 16 +- cfi_adjust_cfa_offset (16) +- cfi_restore (x29) +- cfi_restore (x30) +- b C_SYMBOL_NAME(__syscall_error) +- ++ cbz x0, 1f ++ b C_SYMBOL_NAME (__syscall_error) ++1: ++ /* Restore the general purpose registers. */ ++ mov x0, x9 ++ cfi_def_cfa (x0, 0) ++ cfi_offset (x18, oX0 + 18 * SZREG) ++ cfi_offset (x19, oX0 + 19 * SZREG) ++ cfi_offset (x20, oX0 + 20 * SZREG) ++ cfi_offset (x21, oX0 + 21 * SZREG) ++ cfi_offset (x22, oX0 + 22 * SZREG) ++ cfi_offset (x23, oX0 + 23 * SZREG) ++ cfi_offset (x24, oX0 + 24 * SZREG) ++ cfi_offset (x25, oX0 + 25 * SZREG) ++ cfi_offset (x26, oX0 + 26 * SZREG) ++ cfi_offset (x27, oX0 + 27 * SZREG) ++ cfi_offset (x28, oX0 + 28 * SZREG) ++ cfi_offset (x29, oX0 + 29 * SZREG) ++ cfi_offset (x30, oX0 + 30 * SZREG) ++ ++ cfi_offset ( d8, oV0 + 8 * SZVREG) ++ cfi_offset ( d9, oV0 + 9 * SZVREG) ++ cfi_offset (d10, oV0 + 10 * SZVREG) ++ cfi_offset (d11, oV0 + 11 * SZVREG) ++ cfi_offset (d12, oV0 + 12 * SZVREG) ++ cfi_offset (d13, oV0 + 13 * SZVREG) ++ cfi_offset (d14, oV0 + 14 * SZVREG) ++ cfi_offset (d15, oV0 + 15 * SZVREG) ++ ldp x18, x19, [x0, oX0 + 18 * SZREG] ++ ldp x20, x21, [x0, oX0 + 20 * SZREG] ++ ldp x22, x23, [x0, oX0 + 22 * SZREG] ++ ldp x24, x25, [x0, oX0 + 24 * SZREG] ++ ldp x26, x27, [x0, oX0 + 26 * SZREG] ++ ldp x28, x29, [x0, oX0 + 28 * SZREG] ++ ldr x30, [x0, oX0 + 30 * SZREG] ++ ldr x2, [x0, oSP] ++ mov sp, x2 ++ ++ /* Check for FP SIMD context. We don't support restoring ++ contexts created by the kernel, so this context must have ++ been created by getcontext. Hence we can rely on the ++ first extension block being the FP SIMD context. */ ++ add x2, x0, #oEXTENSION ++ ++ mov w3, #(FPSIMD_MAGIC & 0xffff) ++ movk w3, #(FPSIMD_MAGIC >> 16), lsl #16 ++ ldr w1, [x2, #oHEAD + oMAGIC] ++ cmp w1, w3 ++ b.ne 2f ++ ++ /* 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 ++ ++ add x3, x2, oFPSR ++ ++ ldr w4, [x3] ++ msr fpsr, x4 ++ ++ ldr w4, [x3, oFPCR - oFPSR] ++ msr fpcr, x4 ++ ++2: ++ ldr x16, [x0, oPC] ++ /* Restore arg registers. */ ++ ldp x2, x3, [x0, oX0 + 2 * SZREG] ++ ldp x4, x5, [x0, oX0 + 4 * SZREG] ++ ldp x6, x7, [x0, oX0 + 6 * SZREG] ++ ldp x0, x1, [x0, oX0 + 0 * SZREG] ++ /* Jump to the new pc value. */ ++ br x16 + PSEUDO_END (__setcontext) + weak_alias (__setcontext, setcontext) + +-ENTRY(__startcontext) ++ENTRY (__startcontext) + mov x0, x19 + cbnz x0, __setcontext +-1: b HIDDEN_JUMPTARGET(_exit) +-END(__startcontext) ++1: b HIDDEN_JUMPTARGET (_exit) ++END (__startcontext) +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym +index 1afff78..ab3930c 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym +@@ -37,6 +37,7 @@ STACK_FLAGS stack (ss_flags) + oX0 mcontext (regs) + oSP mcontext (sp) + oPC mcontext (pc) ++oPSTATE mcontext (pstate) + oEXTENSION mcontext (__reserved) + + #define fpsimd_context(member) offsetof (struct fpsimd_context, member) diff --git a/SOURCES/glibc-aarch64-add-ptr_mangle-support.patch b/SOURCES/glibc-aarch64-add-ptr_mangle-support.patch new file mode 100644 index 0000000..dbdc551 --- /dev/null +++ b/SOURCES/glibc-aarch64-add-ptr_mangle-support.patch @@ -0,0 +1,233 @@ +commit 9188b6818a3d1a6e6d89bf10fa4aea27a591494c +Author: Venkataramanan Kumar <venkataramanan.kumar@linaro.org> +Date: Wed Jan 1 17:47:14 2014 +0000 + + [AArch64] Pointer mangling support for AArch64. + +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/__longjmp.S glibc-2.17-c758a686/ports/sysdeps/aarch64/__longjmp.S +index 250f2af..2d38bbf 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/__longjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/__longjmp.S +@@ -50,8 +50,12 @@ ENTRY (__longjmp) + ldp x23, x24, [x0, #JB_X23<<3] + ldp x25, x26, [x0, #JB_X25<<3] + ldp x27, x28, [x0, #JB_X27<<3] ++#ifdef PTR_DEMANGLE ++ ldp x29, x4, [x0, #JB_X29<<3] ++ PTR_DEMANGLE (x30, x4, x3, x2) ++#else + ldp x29, x30, [x0, #JB_X29<<3] +- ++#endif + ldp d8, d9, [x0, #JB_D8<<3] + ldp d10, d11, [x0, #JB_D10<<3] + ldp d12, d13, [x0, #JB_D12<<3] +@@ -87,8 +91,12 @@ ENTRY (__longjmp) + cfi_same_value(d13) + cfi_same_value(d14) + cfi_same_value(d15) +- +- ldr x5, [x0, #JB_SP<<3] ++#ifdef PTR_DEMANGLE ++ ldr x4, [x0, #JB_SP<<3] ++ PTR_DEMANGLE (x5, x4, x3, x2) ++#else ++ ldr x5, [x0, #JB_SP<<3] ++#endif + mov sp, x5 + cmp x1, #0 + mov x0, #1 +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-offsets.h glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-offsets.h +index 84c2ccc..bcf2afa 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-offsets.h ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-offsets.h +@@ -39,6 +39,22 @@ + #define JB_D14 20 + #define JB_D15 21 + ++#ifndef __ASSEMBLER__ ++#include <setjmp.h> ++#include <stdint.h> ++#include <sysdep.h> ++ ++static inline uintptr_t __attribute__ ((unused)) ++_jmpbuf_sp (__jmp_buf jmpbuf) ++{ ++ uintptr_t sp = jmpbuf[JB_SP]; ++#ifdef PTR_DEMANGLE ++ PTR_DEMANGLE (sp); ++#endif ++ return sp; ++} ++#endif ++ + /* Helper for generic ____longjmp_chk(). */ + #define JB_FRAME_ADDRESS(buf) \ +- ((void *) (buf[JB_SP])) ++ ((void *) _jmpbuf_sp (buf)) +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-unwind.h glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-unwind.h +index 22c6c2b..39a5dc2 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-unwind.h ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/jmpbuf-unwind.h +@@ -29,16 +29,6 @@ + #define _JMPBUF_CFA_UNWINDS_ADJ(jmpbuf, context, adj) \ + _JMPBUF_UNWINDS_ADJ (jmpbuf, (void *) _Unwind_GetCFA (context), adj) + +-static inline uintptr_t __attribute__ ((unused)) +-_jmpbuf_sp (__jmp_buf jmpbuf) +-{ +- uintptr_t sp = jmpbuf[JB_SP]; +-#ifdef PTR_DEMANGLE +- PTR_DEMANGLE (sp); +-#endif +- return sp; +-} +- + #define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ + ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj)) + +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +index cb94e01..5822abd 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +@@ -39,13 +39,25 @@ ENTRY (__sigsetjmp) + stp x23, x24, [x0, #JB_X23<<3] + stp x25, x26, [x0, #JB_X25<<3] + stp x27, x28, [x0, #JB_X27<<3] ++ ++#ifdef PTR_MANGLE ++ PTR_MANGLE (x4, x30, x3, x2) ++ stp x29, x4, [x0, #JB_X29<<3] ++#else + stp x29, x30, [x0, #JB_X29<<3] ++#endif + stp d8, d9, [x0, #JB_D8<<3] + stp d10, d11, [x0, #JB_D10<<3] + stp d12, d13, [x0, #JB_D12<<3] + stp d14, d15, [x0, #JB_D14<<3] ++#ifdef PTR_MANGLE ++ mov x4, sp ++ PTR_MANGLE (x5, x4, x3, x2) ++ str x5, [x0, #JB_SP<<3] ++#else + mov x2, sp + str x2, [x0, #JB_SP<<3] ++#endif + #if defined NOT_IN_libc && defined IS_IN_rtld + /* In ld.so we never save the signal mask */ + mov w0, #0 +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/sysdep.h glibc-2.17-c758a686/ports/sysdeps/aarch64/sysdep.h +index 0dd597a..7169ba7 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/sysdep.h +@@ -78,6 +78,17 @@ + # define L(name) .L##name + #endif + ++/* Load or store to/from a pc-relative EXPR into/from R, using T. */ ++#define LDST_PCREL(OP, R, T, EXPR) \ ++ adrp T, EXPR; \ ++ OP R, [T, #:lo12:EXPR];\ ++ ++/* Load or store to/from a got-relative EXPR into/from R, using T. */ ++#define LDST_GLOBAL(OP, R, T, EXPR) \ ++ adrp T, :got:EXPR; \ ++ ldr T, [T, #:got_lo12:EXPR];\ ++ OP R, [T]; ++ + /* Since C identifiers are not normally prefixed with an underscore + on this system, the asm identifier `syscall_error' intrudes on the + C name space. Make sure we use an innocuous name. */ +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +index f3f0ada..5ccf1da 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -371,8 +371,44 @@ __local_syscall_error: \ + + #endif /* __ASSEMBLER__ */ + +-/* Pointer mangling is not yet supported for AArch64. */ +-#define PTR_MANGLE(var) (void) (var) +-#define PTR_DEMANGLE(var) (void) (var) ++/* 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)) ++# ifdef __ASSEMBLER__ ++# define PTR_MANGLE(dst, src, guard, tmp) \ ++ LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \ ++ PTR_MANGLE2 (dst, src, guard) ++/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ ++# define PTR_MANGLE2(dst, src, guard)\ ++ eor dst, src, guard ++# define PTR_DEMANGLE(dst, src, guard, tmp)\ ++ PTR_MANGLE (dst, src, guard, tmp) ++# define PTR_DEMANGLE2(dst, src, guard)\ ++ PTR_MANGLE2 (dst, src, guard) ++# else ++extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; ++# define PTR_MANGLE(var) \ ++ (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local) ++# define PTR_DEMANGLE(var) PTR_MANGLE (var) ++# endif ++#else ++# ifdef __ASSEMBLER__ ++# define PTR_MANGLE(dst, src, guard, tmp) \ ++ LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); \ ++ PTR_MANGLE2 (dst, src, guard) ++/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ ++# define PTR_MANGLE2(dst, src, guard)\ ++ eor dst, src, guard ++# define PTR_DEMANGLE(dst, src, guard, tmp)\ ++ PTR_MANGLE (dst, src, guard, tmp) ++# define PTR_DEMANGLE2(dst, src, guard)\ ++ PTR_MANGLE2 (dst, src, guard) ++# else ++extern uintptr_t __pointer_chk_guard attribute_relro; ++# define PTR_MANGLE(var) \ ++ (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard) ++# define PTR_DEMANGLE(var) PTR_MANGLE (var) ++# endif ++#endif + + #endif /* linux/aarch64/sysdep.h */ +commit 0b1f8e35640f5b3f7af11764ade3ff060211c309 +Author: Carlos O'Donell <carlos@redhat.com> +Date: Mon Sep 23 01:44:38 2013 -0400 + + BZ #15754: Fix test case for ARM. + + Statically built binaries use __pointer_chk_guard_local, + while dynamically built binaries use __pointer_chk_guard. + Provide the right definition depending on the test case + we are building. + +diff --git glibc-2.17-c758a686/elf/Makefile glibc-2.17-c758a686/elf/Makefile +index cb8da93..27d249b 100644 +--- glibc-2.17-c758a686/elf/Makefile ++++ glibc-2.17-c758a686/elf/Makefile +@@ -1019,6 +1019,9 @@ tst-stackguard1-ARGS = --command "$(host-test-program-cmd) --child" + tst-stackguard1-static-ARGS = --command "$(objpfx)tst-stackguard1-static --child" + + tst-ptrguard1-ARGS = --command "$(host-built-program-cmd) --child" ++# When built statically, the pointer guard interface uses ++# __pointer_chk_guard_local. ++CFLAGS-tst-ptrguard1-static.c = -DPTRGUARD_LOCAL + tst-ptrguard1-static-ARGS = --command "$(objpfx)tst-ptrguard1-static --child" + + $(objpfx)tst-leaks1: $(libdl) +diff --git glibc-2.17-c758a686/sysdeps/generic/stackguard-macros.h glibc-2.17-c758a686/sysdeps/generic/stackguard-macros.h +index 4fa3d96..b4a6b23 100644 +--- glibc-2.17-c758a686/sysdeps/generic/stackguard-macros.h ++++ glibc-2.17-c758a686/sysdeps/generic/stackguard-macros.h +@@ -3,5 +3,10 @@ + extern uintptr_t __stack_chk_guard; + #define STACK_CHK_GUARD __stack_chk_guard + ++#ifdef PTRGUARD_LOCAL + extern uintptr_t __pointer_chk_guard_local; +-#define POINTER_CHK_GUARD __pointer_chk_guard_local ++# define POINTER_CHK_GUARD __pointer_chk_guard_local ++#else ++extern uintptr_t __pointer_chk_guard; ++# define POINTER_CHK_GUARD __pointer_chk_guard ++#endif diff --git a/SOURCES/glibc-aarch64-fpu-optional-trapping-exceptions.patch b/SOURCES/glibc-aarch64-fpu-optional-trapping-exceptions.patch new file mode 100644 index 0000000..0afa504 --- /dev/null +++ b/SOURCES/glibc-aarch64-fpu-optional-trapping-exceptions.patch @@ -0,0 +1,122 @@ +commit 302949e2940a9da3f6364a1574619e621b7e1e71 +Author: Marcus Shawcroft <marcus.shawcroft@arm.com> +Date: Fri Mar 7 14:05:20 2014 +0000 + + [PATCH] [AArch64] Optional trapping exceptions support. + + Trapping exceptions in AArch64 are optional. The relevant exception + control bits in FPCR are are defined as RES0 hence the absence of + support can be detected by reading back the FPCR and comparing with + the desired value. + +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/fpu/feenablxcpt.c ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/fpu/feenablxcpt.c +@@ -35,5 +35,18 @@ feenableexcept (int excepts) + + _FPU_SETCW (fpcr); + ++ /* 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. */ ++ if (excepts) ++ { ++ fpu_control_t updated_fpcr; ++ ++ _FPU_GETCW (updated_fpcr); ++ if (((updated_fpcr >> FE_EXCEPT_SHIFT) & excepts) != excepts) ++ return -1; ++ } ++ + return original_excepts; + } +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/fpu/fesetenv.c ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/fpu/fesetenv.c +@@ -24,6 +24,7 @@ fesetenv (const fenv_t *envp) + { + fpu_control_t fpcr; + fpu_fpsr_t fpsr; ++ fpu_control_t updated_fpcr; + + _FPU_GETCW (fpcr); + _FPU_GETFPSR (fpsr); +@@ -51,6 +52,15 @@ fesetenv (const fenv_t *envp) + + _FPU_SETCW (fpcr); + ++ /* 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 ((updated_fpcr & fpcr) != fpcr) ++ return 1; ++ + return 0; + } + +commit 423a7160af7fcffc61aac5e2e36d0b6b5b083214 +Author: Wilco <wdijkstr@arm.com> +Date: Thu Apr 17 09:39:27 2014 +0100 + + Add fenv test support for targets which don't have FP traps. + +(removed unnecessary code to limit it to test-fenv.c --kyle) + +--- glibc-2.17-c758a686/math/test-fenv.c ++++ glibc-2.17-c758a686/math/test-fenv.c +@@ -233,14 +234,9 @@ feenv_nomask_test (const char *flag_name, int fe_exc) + #if defined FE_NOMASK_ENV + int status; + pid_t pid; +- fenv_t saved; + +- fegetenv (&saved); +- errno = 0; +- fesetenv (FE_NOMASK_ENV); +- status = errno; +- fesetenv (&saved); +- if (status == ENOSYS) ++ if (1 ++ && fesetenv (FE_NOMASK_ENV) != 0) + { + printf ("Test: not testing FE_NOMASK_ENV, it isn't implemented.\n"); + return; +@@ -349,7 +345,13 @@ feexcp_nomask_test (const char *flag_name, int fe_exc) + int status; + pid_t pid; + +- printf ("Test: after fedisableexcept (%s) processes will abort\n", ++ if (1 && feenableexcept (fe_exc) == -1) ++ { ++ printf ("Test: not testing feenableexcept, it isn't implemented.\n"); ++ return; ++ } ++ ++ printf ("Test: after feenableexcept (%s) processes will abort\n", + flag_name); + printf (" when feraiseexcept (%s) is called.\n", flag_name); + pid = fork (); +@@ -470,7 +472,6 @@ feenable_test (const char *flag_name, int fe_exc) + { + int excepts; + +- + printf ("Tests for feenableexcepts etc. with flag %s\n", flag_name); + + /* First disable all exceptions. */ +@@ -488,8 +489,12 @@ feenable_test (const char *flag_name, int fe_exc) + flag_name, excepts); + ++count_errors; + } +- + excepts = feenableexcept (fe_exc); ++ if (1 && excepts == -1) ++ { ++ printf ("Test: not testing feenableexcept, it isn't implemented.\n"); ++ return; ++ } + if (excepts == -1) + { + printf ("Test: feenableexcept (%s) failed\n", flag_name); diff --git a/SOURCES/glibc-aarch64-ifunc.patch b/SOURCES/glibc-aarch64-ifunc.patch new file mode 100644 index 0000000..7ee9f1f --- /dev/null +++ b/SOURCES/glibc-aarch64-ifunc.patch @@ -0,0 +1,216 @@ +diff --git glibc-2.17-c758a686/elf/elf.h glibc-2.17-c758a686/elf/elf.h +index 8686fd5..2b10581 100644 +--- glibc-2.17-c758a686/elf/elf.h ++++ glibc-2.17-c758a686/elf/elf.h +@@ -2327,6 +2327,117 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_AARCH64_NONE 0 /* No relocation. */ + #define R_AARCH64_ABS64 257 /* Direct 64 bit. */ + #define R_AARCH64_ABS32 258 /* Direct 32 bit. */ ++#define R_AARCH64_ABS16 259 /* Direct 16-bit. */ ++#define R_AARCH64_PREL64 260 /* PC-relative 64-bit. */ ++#define R_AARCH64_PREL32 261 /* PC-relative 32-bit. */ ++#define R_AARCH64_PREL16 262 /* PC-relative 16-bit. */ ++#define R_AARCH64_MOVW_UABS_G0 263 /* Dir. MOVZ imm. from bits 15:0. */ ++#define R_AARCH64_MOVW_UABS_G0_NC 264 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_UABS_G1 265 /* Dir. MOVZ imm. from bits 31:16. */ ++#define R_AARCH64_MOVW_UABS_G1_NC 266 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_UABS_G2 267 /* Dir. MOVZ imm. from bits 47:32. */ ++#define R_AARCH64_MOVW_UABS_G2_NC 268 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_UABS_G3 269 /* Dir. MOV{K,Z} imm. from 63:48. */ ++#define R_AARCH64_MOVW_SABS_G0 270 /* Dir. MOV{N,Z} imm. from 15:0. */ ++#define R_AARCH64_MOVW_SABS_G1 271 /* Dir. MOV{N,Z} imm. from 31:16. */ ++#define R_AARCH64_MOVW_SABS_G2 272 /* Dir. MOV{N,Z} imm. from 47:32. */ ++#define R_AARCH64_LD_PREL_LO19 273 /* PC-rel. LD imm. from bits 20:2. */ ++#define R_AARCH64_ADR_PREL_LO21 274 /* PC-rel. ADR imm. from bits 20:0. */ ++#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12. */ ++#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check. */ ++#define R_AARCH64_ADD_ABS_LO12_NC 277 /* Dir. ADD imm. from bits 11:0. */ ++#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* Likewise for LD/ST; no check. */ ++#define R_AARCH64_TSTBR14 279 /* PC-rel. TBZ/TBNZ imm. from 15:2. */ ++#define R_AARCH64_CONDBR19 280 /* PC-rel. cond. br. imm. from 20:2. */ ++#define R_AARCH64_JUMP26 282 /* PC-rel. B imm. from bits 27:2. */ ++#define R_AARCH64_CALL26 283 /* Likewise for CALL. */ ++#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1. */ ++#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2. */ ++#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3. */ ++#define R_AARCH64_MOVW_PREL_G0 287 /* PC-rel. MOV{N,Z} imm. from 15:0. */ ++#define R_AARCH64_MOVW_PREL_G0_NC 288 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_PREL_G1 289 /* PC-rel. MOV{N,Z} imm. from 31:16. */ ++#define R_AARCH64_MOVW_PREL_G1_NC 290 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_PREL_G2 291 /* PC-rel. MOV{N,Z} imm. from 47:32. */ ++#define R_AARCH64_MOVW_PREL_G2_NC 292 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_PREL_G3 293 /* PC-rel. MOV{N,Z} imm. from 63:48. */ ++#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4. */ ++#define R_AARCH64_MOVW_GOTOFF_G0 300 /* GOT-rel. off. MOV{N,Z} imm. 15:0. */ ++#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_GOTOFF_G1 302 /* GOT-rel. o. MOV{N,Z} imm. 31:16. */ ++#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_GOTOFF_G2 304 /* GOT-rel. o. MOV{N,Z} imm. 47:32. */ ++#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* Likewise for MOVK; no check. */ ++#define R_AARCH64_MOVW_GOTOFF_G3 306 /* GOT-rel. o. MOV{N,Z} imm. 63:48. */ ++#define R_AARCH64_GOTREL64 307 /* GOT-relative 64-bit. */ ++#define R_AARCH64_GOTREL32 308 /* GOT-relative 32-bit. */ ++#define R_AARCH64_GOT_LD_PREL19 309 /* PC-rel. GOT off. load imm. 20:2. */ ++#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3. */ ++#define R_AARCH64_ADR_GOT_PAGE 311 /* P-page-rel. GOT off. ADRP 32:12. */ ++#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3. */ ++#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* GOT-page-rel. GOT off. LD/ST 14:3 */ ++#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0. */ ++#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12. */ ++#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* direct ADD imm. from 11:0. */ ++#define R_AARCH64_TLSGD_MOVW_G1 515 /* GOT-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0. */ ++#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model. */ ++#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model. */ ++#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* Like 514; local dynamic model. */ ++#define R_AARCH64_TLSLD_MOVW_G1 520 /* Like 515; local dynamic model. */ ++#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model. */ ++#define R_AARCH64_TLSLD_LD_PREL19 522 /* TLS PC-rel. load imm. 20:2. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0. */ ++#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */ ++#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0. */ ++#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check. */ ++#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0. */ ++#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1. */ ++#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2. */ ++#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3. */ ++#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check. */ ++#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0. */ ++#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12. */ ++#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3. */ ++#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0. */ ++#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check. */ ++#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12. */ ++#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0. */ ++#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check. */ ++#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0. */ ++#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */ ++#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1. */ ++#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check. */ ++#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2. */ ++#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check. */ ++#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3. */ ++#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check. */ ++#define R_AARCH64_TLSDESC_LD_PREL19 560 /* PC-rel. load immediate 20:2. */ ++#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0. */ ++#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12. */ ++#define R_AARCH64_TLSDESC_LD64_LO12 563 /* Direct LD off. from 11:3. */ ++#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0. */ ++#define R_AARCH64_TLSDESC_OFF_G1 565 /* GOT-rel. MOV{N,Z} imm. 31:16. */ ++#define R_AARCH64_TLSDESC_OFF_G0_NC 566 /* GOT-rel. MOVK imm. 15:0; no ck. */ ++#define R_AARCH64_TLSDESC_LDR 567 /* Relax LDR. */ ++#define R_AARCH64_TLSDESC_ADD 568 /* Relax ADD. */ ++#define R_AARCH64_TLSDESC_CALL 569 /* Relax BLR. */ ++#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4. */ ++#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check. */ ++#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */ ++#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check. */ + #define R_AARCH64_COPY 1024 /* Copy symbol at runtime. */ + #define R_AARCH64_GLOB_DAT 1025 /* Create GOT entry. */ + #define R_AARCH64_JUMP_SLOT 1026 /* Create PLT entry. */ +@@ -2335,6 +2446,7 @@ typedef Elf32_Addr Elf32_Conflict; + #define R_AARCH64_TLS_DTPREL64 1029 /* Module-relative offset, 64 bit. */ + #define R_AARCH64_TLS_TPREL64 1030 /* TP-relative offset, 64 bit. */ + #define R_AARCH64_TLSDESC 1031 /* TLS Descriptor. */ ++#define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */ + + /* ARM relocs. */ + +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-irel.h glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-irel.h +index 32dee0f..9a48dc2 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-irel.h ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-irel.h +@@ -1,6 +1,6 @@ + /* Machine-dependent ELF indirect relocation inline functions. + AArch64 version. +- Copyright (C) 2012 Free Software Foundation, Inc. ++ Copyright (C) 2012-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 +@@ -22,15 +22,31 @@ + + #include <stdio.h> + #include <unistd.h> ++#include <ldsodefs.h> + +-/* AArch64 does not yet implement IFUNC support. However since +- 2011-06-20 provision of a elf_ifunc_invoke has been mandatory. */ ++#define ELF_MACHINE_IRELA 1 + + static inline ElfW(Addr) + __attribute ((always_inline)) + elf_ifunc_invoke (ElfW(Addr) addr) + { +- return ((ElfW(Addr) (*) (void)) (addr)) (); ++ return ((ElfW(Addr) (*) (unsigned long int)) (addr)) (GLRO(dl_hwcap)); ++} ++ ++static inline void ++__attribute ((always_inline)) ++elf_irela (const ElfW(Rela) *reloc) ++{ ++ ElfW(Addr) *const reloc_addr = (void *) reloc->r_offset; ++ const unsigned long int r_type = ELFW(R_TYPE) (reloc->r_info); ++ ++ if (__glibc_likely (r_type == R_AARCH64_IRELATIVE)) ++ { ++ ElfW(Addr) value = elf_ifunc_invoke (reloc->r_addend); ++ *reloc_addr = value; ++ } ++ else ++ __libc_fatal ("unexpected reloc type in static binary"); + } + + #endif +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-machine.h glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-machine.h +index b1878a7..1db5a5b 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-machine.h ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/dl-machine.h +@@ -23,6 +23,7 @@ + + #include <tls.h> + #include <dl-tlsdesc.h> ++#include <dl-irel.h> + + /* Return nonzero iff ELF header is compatible with the running host. */ + static inline int __attribute__ ((unused)) +@@ -336,6 +337,12 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, + } + break; + ++ case R_AARCH64_IRELATIVE: ++ value = map->l_addr + reloc->r_addend; ++ value = elf_ifunc_invoke (value); ++ *reloc_addr = value; ++ break; ++ + default: + _dl_reloc_bad_type (map, r_type, 0); + break; +@@ -379,6 +386,13 @@ elf_machine_lazy_rel (struct link_map *map, + td->entry = (void*)(D_PTR (map, l_info[ADDRIDX (DT_TLSDESC_PLT)]) + + map->l_addr); + } ++ else if (__glibc_unlikely (r_type == R_AARCH64_IRELATIVE)) ++ { ++ ElfW(Addr) value = map->l_addr + reloc->r_addend; ++ if (__glibc_likely (!skip_ifunc)) ++ value = elf_ifunc_invoke (value); ++ *reloc_addr = value; ++ } + else + _dl_reloc_bad_type (map, r_type, 1); + } diff --git a/SOURCES/glibc-aarch64-rh1076760.patch b/SOURCES/glibc-aarch64-rh1076760.patch new file mode 100644 index 0000000..801bfd6 --- /dev/null +++ b/SOURCES/glibc-aarch64-rh1076760.patch @@ -0,0 +1,20 @@ +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/nptl/tls.h ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/nptl/tls.h +@@ -63,7 +63,7 @@ typedef struct + # define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) + + /* Alignment requirements for the initial TCB. */ +-# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t) ++# define TLS_INIT_TCB_ALIGN __alignof__ (struct pthread) + + /* This is the size of the TCB. */ + # define TLS_TCB_SIZE sizeof (tcbhead_t) +@@ -72,7 +72,7 @@ typedef struct + # define TLS_PRE_TCB_SIZE sizeof (struct pthread) + + /* Alignment requirements for the TCB. */ +-# define TLS_TCB_ALIGN __alignof__ (tcbhead_t) ++# define TLS_TCB_ALIGN __alignof__ (struct pthread) + + /* Install the dtv pointer. The pointer passed is to the element with + index -1 which contain the length. */ diff --git a/SOURCES/glibc-aarch64-syscall-rewrite.patch b/SOURCES/glibc-aarch64-syscall-rewrite.patch new file mode 100644 index 0000000..ad4ab32 --- /dev/null +++ b/SOURCES/glibc-aarch64-syscall-rewrite.patch @@ -0,0 +1,540 @@ +From 9a7cb556eef7cb75b31d0bc05f73c6338dfd8e49 Mon Sep 17 00:00:00 2001 +From: Richard Henderson <rth@redhat.com> +Date: Fri, 30 May 2014 13:57:04 -0400 +Subject: [PATCH] aarch64: Backport syscall rewrite + +From commits: +a60339aaff82beadea6f580e587d64052cb5e3b8 Fix handling of nocancel syscall... +3612eb8f25d978e7e4ac536a34098091f737161c Merge rtld_errno offset w/ mem ref +a6b3657be6bc5067aeec98d990f60765361c6557 Merge __local_multiple_threads ofs... +c69abcee726a6f63d9e5e8f0d9dcc79374ee3ef8 Fix DO_CALL block comment +6e6c2d01ebb1ef839675c7151d2a114f53663386 Remove DOARGS/UNDOARGS macros +ca3cfa40c16ef34c74951a07a57cfcbcd58898b1 Tidy syscall error check +af4e8ef9443e258ebeb0ddf3c5c9579f24dfacd5 Tabify sysdep-cancel.h +a8b4f04ad7dff4f39797a7ab7f8babda54266026 Share code in sysdep-cancel.h +645d44abe3ca6253a9d4762f092e4a1b9d294b11 Pass regno parameter to SINGLE_THREAD_P +b5be4597716eff94149f5529c8eb2cd3b4296188 Improve syscall-cancel stack frame +74f31c18593111725478a991b395ae45661985a3 Fix error return from __ioctl +f0712b543eaddeca8fc6d7a8eb6b5b8d24105ce2 Remove PSEUDO_RET + +And a not-yet-committed cleanup to clone.S. +--- + ports/sysdeps/unix/sysv/linux/aarch64/clone.S | 51 +++--- + ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S | 13 +- + .../unix/sysv/linux/aarch64/nptl/localplt.data | 1 - + .../unix/sysv/linux/aarch64/nptl/sysdep-cancel.h | 189 +++++++-------------- + ports/sysdeps/unix/sysv/linux/aarch64/syscall.S | 4 +- + ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h | 84 ++------- + ports/sysdeps/unix/sysv/linux/aarch64/vfork.S | 4 +- + 7 files changed, 108 insertions(+), 238 deletions(-) + +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/clone.S glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/clone.S +index 8be1464..d5c31f3 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/clone.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/clone.S +@@ -39,46 +39,43 @@ + */ + .text + ENTRY(__clone) ++ /* Save args for the child. */ ++ mov x10, x0 ++ mov x11, x2 ++ mov x12, x3 ++ + /* Sanity check args. */ +- cbz x0, 1f +- cbz x1, 1f +- /* Insert the args onto the new stack. */ +- stp x0, x3, [x1, #-16]! /* Fn, arg. */ ++ mov x0, #-EINVAL ++ cbz x10, .Lsyscall_error ++ cbz x1, .Lsyscall_error + + /* Do the system call. */ ++ /* X0:flags, x1:newsp, x2:parenttidptr, x3:newtls, x4:childtid. */ + mov x0, x2 /* flags */ +- + /* New sp is already in x1. */ + mov x2, x4 /* ptid */ + mov x3, x5 /* tls */ + mov x4, x6 /* ctid */ + +-#ifdef RESET_PID +- /* We rely on the kernel preserving the argument regsiters across a +- each system call so that we can inspect the flags against after +- the clone call. */ +- mov x5, x0 +-#endif +- + mov x8, #SYS_ify(clone) +- /* X0:flags, x1:newsp, x2:parenttidptr, x3:newtls, x4:childtid. */ + svc 0x0 +- cfi_endproc + cmp x0, #0 +- beq 2f +- blt C_SYMBOL_NAME(__syscall_error) ++ beq thread_start ++ blt .Lsyscall_error + RET +-1: mov x0, #-EINVAL +- b syscall_error ++PSEUDO_END (__clone) + +-2: ++ .align 4 ++ .type thread_start, %function ++thread_start: + cfi_startproc + cfi_undefined (x30) + mov x29, 0 ++ + #ifdef RESET_PID +- tbnz x5, #CLONE_THREAD_BIT, 3f ++ tbnz x11, #CLONE_THREAD_BIT, 3f + mov x0, #-1 +- tbnz x5, #CLONE_VM_BIT, 2f ++ tbnz x11, #CLONE_VM_BIT, 2f + mov x8, #SYS_ify(getpid) + svc 0x0 + 2: +@@ -86,18 +83,16 @@ ENTRY(__clone) + sub x1, x1, #PTHREAD_SIZEOF + str w0, [x1, #PTHREAD_PID_OFFSET] + str w0, [x1, #PTHREAD_TID_OFFSET] +- + 3: + #endif +- /* Pick the function arg and call address from the stack and +- execute. */ +- ldp x1, x0, [sp], #16 +- blr x1 ++ ++ /* Pick the function arg execute. */ ++ mov x0, x12 ++ blr x10 + + /* We are done, pass the return value through x0. */ + b HIDDEN_JUMPTARGET(_exit) + cfi_endproc +- cfi_startproc +-PSEUDO_END (__clone) ++ .size thread_start, .-thread_start + + weak_alias (__clone, clone) +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S +index f01fb84..be6c026 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S +@@ -20,13 +20,12 @@ + + .text + ENTRY(__ioctl) +- movz x8, #__NR_ioctl +- sxtw x0, w0 +- svc #0x0 +- cmn x0, #0x1, lsl #12 +- b.hi C_SYMBOL_NAME(__syscall_error) ++ mov x8, #__NR_ioctl ++ sxtw x0, w0 ++ svc #0x0 ++ cmn x0, #4095 ++ b.cs .Lsyscall_error + ret +- +- PSEUDO_END (__ioctl) ++PSEUDO_END (__ioctl) + + weak_alias (__ioctl, ioctl) +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data +index 84af95d..dfca9a7 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data +@@ -12,4 +12,3 @@ libm.so: matherr + libm.so: __signbit + libm.so: __signbitf + libm.so: __signbitl +-libpthread.so: __errno_location +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +index e0e5cc0..a3b9284 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +@@ -26,119 +26,60 @@ + + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ +- .section ".text"; \ +- .type __##syscall_name##_nocancel,%function; \ +- .globl __##syscall_name##_nocancel; \ +- __##syscall_name##_nocancel: \ +- cfi_startproc; \ +- DO_CALL (syscall_name, args); \ +- PSEUDO_RET; \ +- cfi_endproc; \ +- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \ +- ENTRY (name); \ +- SINGLE_THREAD_P; \ +- DOARGS_##args; \ +- bne .Lpseudo_cancel; \ +- DO_CALL (syscall_name, 0); \ +- UNDOARGS_##args; \ +- cmn x0, 4095; \ +- PSEUDO_RET; \ +- .Lpseudo_cancel: \ +- DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \ +- CENABLE; \ +- mov x16, x0; /* put mask in safe place. */ \ +- UNDOCARGS_##args; /* restore syscall args. */ \ +- mov x8, SYS_ify (syscall_name); /* do the call. */ \ +- svc 0; \ +- str x0, [sp, -16]!; /* save syscall return value. */ \ +- cfi_adjust_cfa_offset (16); \ +- mov x0, x16; /* get mask back. */ \ +- CDISABLE; \ +- ldr x0, [sp], 16; \ +- cfi_adjust_cfa_offset (-16); \ +- ldr x30, [sp], 16; \ +- cfi_adjust_cfa_offset (-16); \ +- cfi_restore (x30); \ +- UNDOARGS_##args; \ +- cmn x0, 4095; +- +-# define DOCARGS_0 \ +- str x30, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x30, 0) ++ .section ".text"; \ ++ENTRY (__##syscall_name##_nocancel); \ ++.Lpseudo_nocancel: \ ++ DO_CALL (syscall_name, args); \ ++.Lpseudo_finish: \ ++ cmn x0, 4095; \ ++ b.cs .Lsyscall_error; \ ++ .subsection 2; \ ++ .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \ ++ENTRY (name); \ ++ SINGLE_THREAD_P(16); \ ++ cbz w16, .Lpseudo_nocancel; \ ++ /* Setup common stack frame no matter the number of args. \ ++ Also save the first arg, since it's basically free. */ \ ++ stp x30, x0, [sp, -64]!; \ ++ cfi_adjust_cfa_offset (64); \ ++ cfi_rel_offset (x30, 0); \ ++ DOCARGS_##args; /* save syscall args around CENABLE. */ \ ++ CENABLE; \ ++ mov x16, x0; /* save mask around syscall. */ \ ++ UNDOCARGS_##args; /* restore syscall args. */ \ ++ DO_CALL (syscall_name, args); \ ++ str x0, [sp, 8]; /* save result around CDISABLE. */ \ ++ mov x0, x16; /* restore mask for CDISABLE. */ \ ++ CDISABLE; \ ++ /* Break down the stack frame, restoring result at once. */ \ ++ ldp x30, x0, [sp], 64; \ ++ cfi_adjust_cfa_offset (-64); \ ++ cfi_restore (x30); \ ++ b .Lpseudo_finish; \ ++ cfi_endproc; \ ++ .size name, .-name; \ ++ .previous ++ ++# undef PSEUDO_END ++# define PSEUDO_END(name) \ ++ SYSCALL_ERROR_HANDLER; \ ++ cfi_endproc ++ ++# define DOCARGS_0 ++# define DOCARGS_1 ++# define DOCARGS_2 str x1, [sp, 16] ++# define DOCARGS_3 stp x1, x2, [sp, 16] ++# define DOCARGS_4 DOCARGS_3; str x3, [sp, 32] ++# define DOCARGS_5 DOCARGS_3; stp x3, x4, [sp, 32] ++# define DOCARGS_6 DOCARGS_5; str x5, [sp, 48] + + # define UNDOCARGS_0 +- +-# define DOCARGS_1 \ +- DOCARGS_0; \ +- str x0, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x0, 0) +- +-# define UNDOCARGS_1 \ +- ldr x0, [sp], 16; \ +- cfi_restore (x0); \ +- cfi_adjust_cfa_offset (-16); \ +- +-# define DOCARGS_2 \ +- DOCARGS_1; \ +- str x1, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x1, 0) +- +-# define UNDOCARGS_2 \ +- ldr x1, [sp], 16; \ +- cfi_restore (x1); \ +- cfi_adjust_cfa_offset (-16); \ +- UNDOCARGS_1 +- +-# define DOCARGS_3 \ +- DOCARGS_2; \ +- str x2, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x2, 0) +- +-# define UNDOCARGS_3 \ +- ldr x2, [sp], 16; \ +- cfi_restore (x2); \ +- cfi_adjust_cfa_offset (-16); \ +- UNDOCARGS_2 +- +-# define DOCARGS_4 \ +- DOCARGS_3; \ +- str x3, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x3, 0) +- +-# define UNDOCARGS_4 \ +- ldr x3, [sp], 16; \ +- cfi_restore (x3); \ +- cfi_adjust_cfa_offset (-16); \ +- UNDOCARGS_3 +- +-# define DOCARGS_5 \ +- DOCARGS_4; \ +- str x4, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x4, 0) +- +-# define UNDOCARGS_5 \ +- ldr x4, [sp], 16; \ +- cfi_restore (x4); \ +- cfi_adjust_cfa_offset (-16); \ +- UNDOCARGS_4 +- +-# define DOCARGS_6 \ +- DOCARGS_5; \ +- str x5, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x5, 0) +- +-# define UNDOCARGS_6 \ +- ldr x5, [sp], 16; \ +- cfi_restore (x5); \ +- cfi_adjust_cfa_offset (-16); \ +- UNDOCARGS_5 ++# define UNDOCARGS_1 ldr x0, [sp, 8] ++# define UNDOCARGS_2 ldp x0, x1, [sp, 8] ++# define UNDOCARGS_3 UNDOCARGS_1; ldp x1, x2, [sp, 16] ++# define UNDOCARGS_4 UNDOCARGS_2; ldp x2, x3, [sp, 24] ++# define UNDOCARGS_5 UNDOCARGS_3; ldp x3, x4, [sp, 32] ++# define UNDOCARGS_6 UNDOCARGS_4; ldp x4, x5, [sp, 40] + + # ifdef IS_IN_libpthread + # define CENABLE bl __pthread_enable_asynccancel +@@ -160,11 +101,9 @@ + extern int __local_multiple_threads attribute_hidden; + # define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) + # else +-# define SINGLE_THREAD_P \ +- adrp x16, __local_multiple_threads; \ +- add x16, x16, #:lo12:__local_multiple_threads; \ +- ldr x16, [x16]; \ +- cmp x16, 0; ++# define SINGLE_THREAD_P(R) \ ++ adrp x##R, __local_multiple_threads; \ ++ ldr w##R, [x##R, :lo12:__local_multiple_threads] + # endif + # else + /* There is no __local_multiple_threads for librt, so use the TCB. */ +@@ -173,20 +112,10 @@ extern int __local_multiple_threads attribute_hidden; + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0, 1) + # else +-# define SINGLE_THREAD_P \ +- stp x0, x30, [sp, -16]!; \ +- cfi_adjust_cfa_offset (16); \ +- cfi_rel_offset (x0, 0); \ +- cfi_rel_offset (x30, 8); \ +- bl __read_tp; \ +- sub x0, x0, PTHREAD_SIZEOF; \ +- ldr x16, [x0, PTHREAD_MULTIPLE_THREADS_OFFSET]; \ +- ldp x0, x30, [sp], 16; \ +- cfi_restore (x0); \ +- cfi_restore (x30); \ +- cfi_adjust_cfa_offset (-16); \ +- cmp x16, 0 +-# define SINGLE_THREAD_P_PIC(x) SINGLE_THREAD_P ++# define SINGLE_THREAD_P(R) \ ++ mrs x##R, tpidr_el0; \ ++ sub x##R, x##R, PTHREAD_SIZEOF; \ ++ ldr w##R, [x##R, PTHREAD_MULTIPLE_THREADS_OFFSET] + # endif + # endif + +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/syscall.S glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/syscall.S +index 574fdf1..fac6416 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/syscall.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/syscall.S +@@ -37,8 +37,6 @@ ENTRY (syscall) + mov x6, x7 + svc 0x0 + cmn x0, #4095 +- b.cs 1f ++ b.cs .Lsyscall_error + RET +-1: +- b SYSCALL_ERROR + PSEUDO_END (syscall) +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +index 713bf7d..9961c03 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -58,19 +58,8 @@ + .text; \ + ENTRY (name); \ + DO_CALL (syscall_name, args); \ +- cmn x0, #4095; +- +-/* Notice the use of 'RET' instead of 'ret' the assembler is case +- insensitive and eglibc already uses the preprocessor symbol 'ret' +- so we use the upper case 'RET' to force through a ret instruction +- to the assembler */ +-# define PSEUDO_RET \ +- b.cs 1f; \ +- RET; \ +- 1: \ +- b SYSCALL_ERROR +-# undef ret +-# define ret PSEUDO_RET ++ cmn x0, #4095; \ ++ b.cs .Lsyscall_error + + # undef PSEUDO_END + # define PSEUDO_END(name) \ +@@ -83,15 +72,7 @@ + ENTRY (name); \ + DO_CALL (syscall_name, args); + +-/* Notice the use of 'RET' instead of 'ret' the assembler is case +- insensitive and eglibc already uses the preprocessor symbol 'ret' +- so we use the upper case 'RET' to force through a ret instruction +- to the assembler */ +-# define PSEUDO_RET_NOERRNO \ +- RET; +- +-# undef ret_NOERRNO +-# define ret_NOERRNO PSEUDO_RET_NOERRNO ++# define ret_NOERRNO ret + + # undef PSEUDO_END_NOERRNO + # define PSEUDO_END_NOERRNO(name) \ +@@ -109,47 +90,38 @@ + # define PSEUDO_END_ERRVAL(name) \ + END (name) + +-# define ret_ERRVAL PSEUDO_RET_NOERRNO ++# define ret_ERRVAL ret + ++# define SYSCALL_ERROR .Lsyscall_error + # if NOT_IN_libc +-# define SYSCALL_ERROR __local_syscall_error + # if RTLD_PRIVATE_ERRNO + # define SYSCALL_ERROR_HANDLER \ +-__local_syscall_error: \ ++.Lsyscall_error: \ + adrp x1, C_SYMBOL_NAME(rtld_errno); \ +- add x1, x1, #:lo12:C_SYMBOL_NAME(rtld_errno); \ + neg w0, w0; \ +- str w0, [x1]; \ ++ str w0, [x1, :lo12:C_SYMBOL_NAME(rtld_errno)]; \ + mov x0, -1; \ + RET; + # else + + # define SYSCALL_ERROR_HANDLER \ +-__local_syscall_error: \ +- stp x29, x30, [sp, -32]!; \ +- cfi_adjust_cfa_offset (32); \ +- cfi_rel_offset (x29, 0); \ +- cfi_rel_offset (x30, 8); \ +- add x29, sp, 0; \ +- str x19, [sp,16]; \ +- neg x19, x0; \ +- bl C_SYMBOL_NAME(__errno_location); \ +- str x19, [x0]; \ ++.Lsyscall_error: \ ++ adrp x1, :gottprel:errno; \ ++ neg w2, w0; \ ++ ldr x1, [x1, :gottprel_lo12:errno]; \ ++ mrs x3, tpidr_el0; \ + mov x0, -1; \ +- ldr x19, [sp,16]; \ +- ldp x29, x30, [sp], 32; \ +- cfi_adjust_cfa_offset (-32); \ +- cfi_restore (x29); \ +- cfi_restore (x30); \ ++ str w2, [x1, x3]; \ + RET; + # endif + # else +-# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ +-# define SYSCALL_ERROR __syscall_error ++# define SYSCALL_ERROR_HANDLER \ ++.Lsyscall_error: \ ++ b __syscall_error; + # endif + + /* Linux takes system call args in registers: +- syscall number in the SVC instruction ++ syscall number x8 + arg 1 x0 + arg 2 x1 + arg 3 x2 +@@ -177,28 +149,8 @@ __local_syscall_error: \ + + # undef DO_CALL + # define DO_CALL(syscall_name, args) \ +- DOARGS_##args \ + mov x8, SYS_ify (syscall_name); \ +- svc 0; \ +- UNDOARGS_##args +- +-# define DOARGS_0 /* nothing */ +-# define DOARGS_1 /* nothing */ +-# define DOARGS_2 /* nothing */ +-# define DOARGS_3 /* nothing */ +-# define DOARGS_4 /* nothing */ +-# define DOARGS_5 /* nothing */ +-# define DOARGS_6 /* nothing */ +-# define DOARGS_7 /* nothing */ +- +-# define UNDOARGS_0 /* nothing */ +-# define UNDOARGS_1 /* nothing */ +-# define UNDOARGS_2 /* nothing */ +-# define UNDOARGS_3 /* nothing */ +-# define UNDOARGS_4 /* nothing */ +-# define UNDOARGS_5 /* nothing */ +-# define UNDOARGS_6 /* nothing */ +-# define UNDOARGS_7 /* nothing */ ++ svc 0 + + #else /* not __ASSEMBLER__ */ + +diff --git glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/vfork.S glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/vfork.S +index f2dc49b..3fb68b9 100644 +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/vfork.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/vfork.S +@@ -38,10 +38,8 @@ ENTRY (__vfork) + RESTORE_PID + #endif + cmn x0, #4095 +- b.cs 1f ++ b.cs .Lsyscall_error + RET +-1: +- b SYSCALL_ERROR + + PSEUDO_END (__vfork) + libc_hidden_def (__vfork) +-- +1.8.3.1 + diff --git a/SOURCES/glibc-arm-hardfloat-3.patch b/SOURCES/glibc-arm-hardfloat-3.patch new file mode 100644 index 0000000..d9bebf3 --- /dev/null +++ b/SOURCES/glibc-arm-hardfloat-3.patch @@ -0,0 +1,22 @@ +(Not needed anymore.) + +diff -Nru glibc-2.17-c758a686/elf/dl-load.c glibc-2.17-c758a686/elf/dl-load.c +--- glibc-2.17-c758a686/elf/dl-load.c 2012-06-06 13:07:41.727524312 -0600 ++++ glibc-2.17-c758a686/elf/dl-load.c 2012-06-06 13:11:19.308681002 -0600 +@@ -2093,10 +2093,14 @@ _dl_map_object (struct link_map *loader, + soname = ((const char *) D_PTR (l, l_info[DT_STRTAB]) + + l->l_info[DT_SONAME]->d_un.d_val); + if (strcmp (name, soname) != 0) +- continue; ++#ifdef __arm__ ++ if (strcmp (name, "ld-linux.so.3") ++ || strcmp (soname, "ld-linux-armhf.so.3")) ++#endif ++ continue; + + /* We have a match on a new name -- cache it. */ +- add_name_to_object (l, soname); ++ add_name_to_object (l, name); + l->l_soname_added = 1; + } + diff --git a/SOURCES/glibc-cs-path.patch b/SOURCES/glibc-cs-path.patch new file mode 100644 index 0000000..c94a49a --- /dev/null +++ b/SOURCES/glibc-cs-path.patch @@ -0,0 +1,6 @@ +diff -pruN glibc-2.17-c758a686/sysdeps/unix/confstr.h glibc-2.17-c758a686/sysdeps/unix/confstr.h +--- glibc-2.17-c758a686/sysdeps/unix/confstr.h 2012-12-25 08:32:13.000000000 +0530 ++++ glibc-2.17-c758a686/sysdeps/unix/confstr.h 2014-09-05 20:02:55.698275219 +0530 +@@ -1 +1 @@ +-#define CS_PATH "/bin:/usr/bin" ++#define CS_PATH "/usr/bin" diff --git a/SOURCES/glibc-fedora-__libc_multiple_libcs.patch b/SOURCES/glibc-fedora-__libc_multiple_libcs.patch new file mode 100644 index 0000000..54c6d42 --- /dev/null +++ b/SOURCES/glibc-fedora-__libc_multiple_libcs.patch @@ -0,0 +1,83 @@ +From 16552c01a66633c9e412984d9d92616bd4e5303c Mon Sep 17 00:00:00 2001 +From: Andreas Schwab <schwab@redhat.com> +Date: Fri, 11 Jun 2010 11:04:11 +0200 +Subject: [PATCH] Properly set __libc_multiple_libcs + +* elf/rtld.c (_dl_starting_up): Always define. +(dl_main): Always set _dl_starting_up. +* elf/dl-support.c (_dl_starting_up): Always define. +* elf/dl-init.c (_dl_init): Always clear _dl_starting_up. + +--- + ChangeLog | 7 +++++++ + elf/dl-init.c | 4 ---- + elf/dl-support.c | 2 -- + elf/rtld.c | 4 ---- + 4 files changed, 7 insertions(+), 10 deletions(-) + +--- glibc-2.17-c758a686/elf/dl-init.c ++++ glibc-2.17-c758a686/elf/dl-init.c +@@ -23,11 +23,9 @@ + /* Type of the initializer. */ + typedef void (*init_t) (int, char **, char **); + +-#ifndef HAVE_INLINED_SYSCALLS + /* Flag, nonzero during startup phase. */ + extern int _dl_starting_up; + extern int _dl_starting_up_internal attribute_hidden; +-#endif + + + static void +@@ -132,9 +130,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env) + while (i-- > 0) + call_init (main_map->l_initfini[i], argc, argv, env); + +-#ifndef HAVE_INLINED_SYSCALLS + /* Finished starting up. */ + INTUSE(_dl_starting_up) = 0; +-#endif + } + INTDEF (_dl_init) +--- glibc-2.17-c758a686/elf/dl-support.c ++++ glibc-2.17-c758a686/elf/dl-support.c +@@ -81,10 +81,8 @@ unsigned long long _dl_load_adds; + create a fake scope containing nothing. */ + struct r_scope_elem _dl_initial_searchlist; + +-#ifndef HAVE_INLINED_SYSCALLS + /* Nonzero during startup. */ + int _dl_starting_up = 1; +-#endif + + /* Random data provided by the kernel. */ + void *_dl_random; +--- glibc-2.17-c758a686/elf/rtld.c ++++ glibc-2.17-c758a686/elf/rtld.c +@@ -106,7 +106,6 @@ static struct audit_list + struct audit_list *next; + } *audit_list; + +-#ifndef HAVE_INLINED_SYSCALLS + /* Set nonzero during loading and initialization of executable and + libraries, cleared before the executable's entry point runs. This + must not be initialized to nonzero, because the unused dynamic +@@ -116,7 +115,6 @@ static struct audit_list + never be called. */ + int _dl_starting_up = 0; + INTVARDEF(_dl_starting_up) +-#endif + + /* This is the structure which defines all variables global to ld.so + (except those which cannot be added for some reason). */ +@@ -929,10 +927,8 @@ dl_main (const ElfW(Phdr) *phdr, + /* Process the environment variable which control the behaviour. */ + process_envvars (&mode); + +-#ifndef HAVE_INLINED_SYSCALLS + /* Set up a flag which tells we are just starting. */ + INTUSE(_dl_starting_up) = 1; +-#endif + + if (*user_entry == (ElfW(Addr)) ENTRY_POINT) + { diff --git a/SOURCES/glibc-fedora-elf-init-hidden_undef.patch b/SOURCES/glibc-fedora-elf-init-hidden_undef.patch new file mode 100644 index 0000000..df667ec --- /dev/null +++ b/SOURCES/glibc-fedora-elf-init-hidden_undef.patch @@ -0,0 +1,30 @@ +* Fri May 29 2003 Jakub Jelinek <jakub@redhat.com> 2.3.2-44 +- make __init_array_start etc. symbols in elf-init.oS hidden undefined + +diff -Nru glibc-2.17-c758a686/csu/elf-init.c glibc-2.17-c758a686/csu/elf-init.c +--- glibc-2.17-c758a686/csu/elf-init.c 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/csu/elf-init.c 2012-06-07 12:15:21.570319597 -0600 +@@ -63,6 +63,23 @@ extern void (*__init_array_end []) (int, + extern void (*__fini_array_start []) (void) attribute_hidden; + extern void (*__fini_array_end []) (void) attribute_hidden; + ++#if defined HAVE_VISIBILITY_ATTRIBUTE \ ++ && (defined SHARED || defined LIBC_NONSHARED) ++# define hidden_undef_2(x) #x ++# define hidden_undef_1(x) hidden_undef_2 (x) ++# define hidden_undef(x) \ ++ __asm (hidden_undef_1 (ASM_GLOBAL_DIRECTIVE) " " #x); \ ++ __asm (".hidden " #x); ++#else ++# define hidden_undef(x) ++#endif ++ ++hidden_undef (__preinit_array_start) ++hidden_undef (__preinit_array_end) ++hidden_undef (__init_array_start) ++hidden_undef (__init_array_end) ++hidden_undef (__fini_array_start) ++hidden_undef (__fini_array_end) + + /* These function symbols are provided for the .init/.fini section entry + points automagically by the linker. */ diff --git a/SOURCES/glibc-fedora-elf-rh737223.patch b/SOURCES/glibc-fedora-elf-rh737223.patch new file mode 100644 index 0000000..376f687 --- /dev/null +++ b/SOURCES/glibc-fedora-elf-rh737223.patch @@ -0,0 +1,15 @@ +Binary filesglibc-2.17-c758a686/elf/.rtld.c.rej.swp andglibc-2.17-c758a686/elf/.rtld.c.rej.swp differ +diff -Nru glibc-2.17-c758a686/elf/setup-vdso.h glibc-2.17-c758a686/elf/setup-vdso.h +--- glibc-2.17-c758a686/elf/setup-vdso.h 2012-10-10 21:34:38.000000000 -0600 ++++ glibc-2.17-c758a686/elf/setup-vdso.h 2012-10-11 09:43:14.152958832 -0600 +@@ -93,7 +93,9 @@ setup_vdso (struct link_map *main_map __ + char *copy = malloc (len); + if (copy == NULL) + _dl_fatal_printf ("out of memory\n"); +- l->l_libname->name = l->l_name = memcpy (copy, dsoname, len); ++ l->l_libname->name = memcpy (copy, dsoname, len); ++ if (GLRO(dl_debug_mask)) ++ l->l_name = copy; + } + + /* Add the vDSO to the object list. */ diff --git a/SOURCES/glibc-fedora-gai-canonical.patch b/SOURCES/glibc-fedora-gai-canonical.patch new file mode 100644 index 0000000..7f767ae --- /dev/null +++ b/SOURCES/glibc-fedora-gai-canonical.patch @@ -0,0 +1,124 @@ +Upstream commit, fixing [BZ #15218]: + +commit b957ced8890a4438c8efe2c15e5abf4e327f25cf +Author: Andreas Schwab <schwab@suse.de> +Date: Tue Oct 15 10:21:13 2013 +0200 + + Don't use gethostbyaddr to determine canonical name + + +--- glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c ++++ glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c +@@ -565,8 +565,8 @@ gaih_inet (const char *name, const struct gaih_service *service, + + /* If we do not have to look for IPv6 addresses, use + the simple, old functions, which do not support +- IPv6 scope ids. */ +- if (req->ai_family == AF_INET) ++ IPv6 scope ids, nor retrieving the canonical name. */ ++ if (req->ai_family == AF_INET && (req->ai_flags & AI_CANONNAME) == 0) + { + /* Allocate additional room for struct host_data. */ + size_t tmpbuflen = (512 + MAX_NR_ALIASES * sizeof(char*) +@@ -1107,70 +1107,10 @@ gaih_inet (const char *name, const struct gaih_service *service, + /* Only the first entry gets the canonical name. */ + if (at2 == at && (req->ai_flags & AI_CANONNAME) != 0) + { +- char *tmpbuf2 = NULL; +- bool malloc_tmpbuf2 = false; +- + if (canon == NULL) +- { +- struct hostent *h = NULL; +- int herrno; +- struct hostent th; +- /* Add room for struct host_data. */ +- size_t tmpbuf2len = (512 + (MAX_NR_ALIASES+MAX_NR_ADDRS+1) +- * sizeof(char*) + 16 * sizeof(char)); +- +- do +- { +- if (__libc_use_alloca (alloca_used + 2 * tmpbuf2len)) +- tmpbuf2 = extend_alloca_account (tmpbuf2, tmpbuf2len, +- tmpbuf2len * 2, +- alloca_used); +- else +- { +- char *newp = realloc (malloc_tmpbuf2 ? tmpbuf2 : NULL, +- 2 * tmpbuf2len); +- if (newp == NULL) +- { +- if (malloc_tmpbuf2) +- free (tmpbuf2); +- result = -EAI_MEMORY; +- goto free_and_return; +- } +- +- tmpbuf2 = newp; +- tmpbuf2len = 2 * tmpbuf2len; +- malloc_tmpbuf2 = true; +- } +- +- rc = __gethostbyaddr_r (at2->addr, +- ((at2->family == AF_INET6) +- ? sizeof (struct in6_addr) +- : sizeof (struct in_addr)), +- at2->family, &th, tmpbuf2, +- tmpbuf2len, &h, &herrno); +- } +- while (rc == ERANGE && herrno == NETDB_INTERNAL); +- +- if (rc != 0 && herrno == NETDB_INTERNAL) +- { +- if (malloc_tmpbuf2) +- free (tmpbuf2); +- +- __set_h_errno (herrno); +- result = -EAI_SYSTEM; +- goto free_and_return; +- } +- +- if (h != NULL) +- canon = h->h_name; +- else +- { +- assert (orig_name != NULL); +- /* If the canonical name cannot be determined, use +- the passed in string. */ +- canon = orig_name; +- } +- } ++ /* If the canonical name cannot be determined, use ++ the passed in string. */ ++ canon = orig_name; + + #ifdef HAVE_LIBIDN + if (req->ai_flags & AI_CANONIDN) +@@ -1185,9 +1125,6 @@ gaih_inet (const char *name, const struct gaih_service *service, + int rc = __idna_to_unicode_lzlz (canon, &out, idn_flags); + if (rc != IDNA_SUCCESS) + { +- if (malloc_tmpbuf2) +- free (tmpbuf2); +- + if (rc == IDNA_MALLOC_ERROR) + result = -EAI_MEMORY; + else if (rc == IDNA_DLOPEN_ERROR) +@@ -1217,17 +1154,11 @@ gaih_inet (const char *name, const struct gaih_service *service, + canon = strdup (canon); + if (canon == NULL) + { +- if (malloc_tmpbuf2) +- free (tmpbuf2); +- + result = -EAI_MEMORY; + goto free_and_return; + } + } + } +- +- if (malloc_tmpbuf2) +- free (tmpbuf2); + } + + family = at2->family; diff --git a/SOURCES/glibc-fedora-getrlimit-PLT.patch b/SOURCES/glibc-fedora-getrlimit-PLT.patch new file mode 100644 index 0000000..43cabea --- /dev/null +++ b/SOURCES/glibc-fedora-getrlimit-PLT.patch @@ -0,0 +1,35 @@ +Related upstream commit: + +commit c5c2b7c3fd823fc5c4a52506292a90eba60b0c62 +Author: Joseph Myers <joseph@codesourcery.com> +Date: Sat Dec 6 23:40:48 2014 +0000 + + Fix pthreads getrlimit, gettimeofday namespace (bug 17682). + +--- glibc-2.17-c758a686/include/sys/resource.h ++++ glibc-2.17-c758a686/include/sys/resource.h +@@ -14,5 +14,6 @@ extern int __getrusage (enum __rusage_who __who, struct rusage *__usage) + + extern int __setrlimit (enum __rlimit_resource __resource, + const struct rlimit *__rlimits); ++libc_hidden_proto (__getrlimit) + #endif + #endif +--- glibc-2.17-c758a686/resource/getrlimit.c ++++ glibc-2.17-c758a686/resource/getrlimit.c +@@ -27,6 +27,7 @@ __getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits) + __set_errno (ENOSYS); + return -1; + } ++libc_hidden_def (__getrlimit) + weak_alias (__getrlimit, getrlimit) + + stub_warning (getrlimit) +--- glibc-2.17-c758a686/sysdeps/mach/hurd/getrlimit.c ++++ glibc-2.17-c758a686/sysdeps/mach/hurd/getrlimit.c +@@ -43,4 +43,5 @@ __getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits) + + return 0; + } ++libc_hidden_def (__getrlimit) + weak_alias (__getrlimit, getrlimit) diff --git a/SOURCES/glibc-fedora-i386-tls-direct-seg-refs.patch b/SOURCES/glibc-fedora-i386-tls-direct-seg-refs.patch new file mode 100644 index 0000000..451ebf9 --- /dev/null +++ b/SOURCES/glibc-fedora-i386-tls-direct-seg-refs.patch @@ -0,0 +1,18 @@ +diff -Nru glibc-2.17-c758a686/sysdeps/i386/Makefile glibc-2.17-c758a686/sysdeps/i386/Makefile +--- glibc-2.17-c758a686/sysdeps/i386/Makefile 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/sysdeps/i386/Makefile 2012-06-07 12:15:21.826318641 -0600 +@@ -62,6 +64,14 @@ endif + + ifneq (,$(filter -mno-tls-direct-seg-refs,$(CFLAGS))) + defines += -DNO_TLS_DIRECT_SEG_REFS ++else ++# .a libraries are not performance critical and so we ++# build them without direct TLS segment references ++# always. ++CPPFLAGS-.o += -DNO_TLS_DIRECT_SEG_REFS ++CFLAGS-.o += -mno-tls-direct-seg-refs ++CPPFLAGS-.oS += -DNO_TLS_DIRECT_SEG_REFS ++CFLAGS-.oS += -mno-tls-direct-seg-refs + endif + + ifeq ($(subdir),elf) diff --git a/SOURCES/glibc-fedora-include-bits-ldbl.patch b/SOURCES/glibc-fedora-include-bits-ldbl.patch new file mode 100644 index 0000000..0aa3c0f --- /dev/null +++ b/SOURCES/glibc-fedora-include-bits-ldbl.patch @@ -0,0 +1,36 @@ +Only needed for glibc builds with -mlong-double-64: + + https://sourceware.org/ml/libc-alpha/2017-08/msg01139.html + +This means the patch is no longer needed. + +From 5eb4509a6651d19c7a28c4506d6aa582c9ee095a Mon Sep 17 00:00:00 2001 +From: Jakub Jelinek <jakub@redhat.com> +Date: Wed, 1 Feb 2006 09:30:43 +0000 +Subject: [PATCH] 128-bit long double fixes + +* include/bits/stdlib-ldbl.h: New file. +* include/bits/wchar-ldbl.h: New file. + +--- + ChangeLog | 5 +++++ + include/bits/stdlib-ldbl.h | 1 + + include/bits/wchar-ldbl.h | 1 + + 3 files changed, 7 insertions(+), 0 deletions(-) + create mode 100644 include/bits/stdlib-ldbl.h + create mode 100644 include/bits/wchar-ldbl.h + +diff --git glibc-2.17-c758a686/include/bits/stdlib-ldbl.h glibc-2.17-c758a686/include/bits/stdlib-ldbl.h +new file mode 100644 +index 0000000..6250949 +--- /dev/null ++++ glibc-2.17-c758a686/include/bits/stdlib-ldbl.h +@@ -0,0 +1 @@ ++#include <stdlib/bits/stdlib-ldbl.h> +diff --git glibc-2.17-c758a686/include/bits/wchar-ldbl.h glibc-2.17-c758a686/include/bits/wchar-ldbl.h +new file mode 100644 +index 0000000..29baa2f +--- /dev/null ++++ glibc-2.17-c758a686/include/bits/wchar-ldbl.h +@@ -0,0 +1 @@ ++#include <wcsmbs/bits/wchar-ldbl.h> diff --git a/SOURCES/glibc-fedora-ldd.patch b/SOURCES/glibc-fedora-ldd.patch new file mode 100644 index 0000000..28f18d3 --- /dev/null +++ b/SOURCES/glibc-fedora-ldd.patch @@ -0,0 +1,38 @@ +Upstream commit: + +commit eedca9772e99c72ab4c3c34e43cc764250aa3e3c (HEAD -> master) +Author: Andreas Schwab <schwab@suse.de> +Date: Wed Aug 16 15:59:55 2017 +0200 + + ldd: never run file directly + +--- glibc-2.17-c758a686/elf/ldd.bash.in ++++ glibc-2.17-c758a686/elf/ldd.bash.in +@@ -166,18 +166,6 @@ warning: you do not have execution permission for" "\`$file'" >&2 + fi + done + case $ret in +- 0) +- # If the program exits with exit code 5, it means the process has been +- # invoked with __libc_enable_secure. Fall back to running it through +- # the dynamic linker. +- try_trace "$file" +- rc=$? +- if [ $rc = 5 ]; then +- try_trace "$RTLD" "$file" +- rc=$? +- fi +- [ $rc = 0 ] || result=1 +- ;; + 1) + # This can be a non-ELF binary or no binary at all. + nonelf "$file" || { +@@ -185,7 +173,7 @@ warning: you do not have execution permission for" "\`$file'" >&2 + result=1 + } + ;; +- 2) ++ 0|2) + try_trace "$RTLD" "$file" || result=1 + ;; + *) diff --git a/SOURCES/glibc-fedora-linux-tcsetattr.patch b/SOURCES/glibc-fedora-linux-tcsetattr.patch new file mode 100644 index 0000000..e47d5ec --- /dev/null +++ b/SOURCES/glibc-fedora-linux-tcsetattr.patch @@ -0,0 +1,48 @@ +diff -Nru glibc-2.17-c758a686/sysdeps/unix/sysv/linux/tcsetattr.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/tcsetattr.c +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/tcsetattr.c 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/tcsetattr.c 2012-06-07 12:15:21.831318623 -0600 +@@ -48,6 +48,7 @@ tcsetattr (fd, optional_actions, termios + { + struct __kernel_termios k_termios; + unsigned long int cmd; ++ int retval; + + switch (optional_actions) + { +@@ -79,6 +80,35 @@ tcsetattr (fd, optional_actions, termios + memcpy (&k_termios.c_cc[0], &termios_p->c_cc[0], + __KERNEL_NCCS * sizeof (cc_t)); + +- return INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios); ++ retval = INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios); ++ ++ if (retval == 0 && cmd == TCSETS) ++ { ++ /* The Linux kernel has a bug which silently ignore the invalid ++ c_cflag on pty. We have to check it here. */ ++ int save = errno; ++ retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios); ++ if (retval) ++ { ++ /* We cannot verify if the setting is ok. We don't return ++ an error (?). */ ++ __set_errno (save); ++ retval = 0; ++ } ++ else if ((termios_p->c_cflag & (PARENB | CREAD)) ++ != (k_termios.c_cflag & (PARENB | CREAD)) ++ || ((termios_p->c_cflag & CSIZE) ++ && ((termios_p->c_cflag & CSIZE) ++ != (k_termios.c_cflag & CSIZE)))) ++ { ++ /* It looks like the Linux kernel silently changed the ++ PARENB/CREAD/CSIZE bits in c_cflag. Report it as an ++ error. */ ++ __set_errno (EINVAL); ++ retval = -1; ++ } ++ } ++ ++ return retval; + } + libc_hidden_def (tcsetattr) diff --git a/SOURCES/glibc-fedora-localedata-rh61908.patch b/SOURCES/glibc-fedora-localedata-rh61908.patch new file mode 100644 index 0000000..0cdd09f --- /dev/null +++ b/SOURCES/glibc-fedora-localedata-rh61908.patch @@ -0,0 +1,38 @@ +* Tue Mar 26 2002 Jakub Jelinek <jakub@redhat.com> 2.2.5-28 +- add a couple of .ISO-8859-15 locales (#61908) + +diff -Nru glibc-2.17-c758a686/localedata/SUPPORTED glibc-2.17-c758a686/localedata/SUPPORTED +--- glibc-2.17-c758a686/localedata/SUPPORTED 2012-11-25 12:59:31.000000000 -0700 ++++ glibc-2.17-c758a686/localedata/SUPPORTED 2012-11-26 12:58:43.298223018 -0700 +@@ -89,6 +89,7 @@ cy_GB.UTF-8/UTF-8 \ + cy_GB/ISO-8859-14 \ + da_DK.UTF-8/UTF-8 \ + da_DK/ISO-8859-1 \ ++da_DK.ISO-8859-15/ISO-8859-15 \ + de_AT.UTF-8/UTF-8 \ + de_AT/ISO-8859-1 \ + de_AT@euro/ISO-8859-15 \ +@@ -121,6 +122,7 @@ en_DK.UTF-8/UTF-8 \ + en_DK/ISO-8859-1 \ + en_GB.UTF-8/UTF-8 \ + en_GB/ISO-8859-1 \ ++en_GB.ISO-8859-15/ISO-8859-15 \ + en_HK.UTF-8/UTF-8 \ + en_HK/ISO-8859-1 \ + en_IE.UTF-8/UTF-8 \ +@@ -136,6 +138,7 @@ en_SG.UTF-8/UTF-8 \ + en_SG/ISO-8859-1 \ + en_US.UTF-8/UTF-8 \ + en_US/ISO-8859-1 \ ++en_US.ISO-8859-15/ISO-8859-15 \ + en_ZA.UTF-8/UTF-8 \ + en_ZA/ISO-8859-1 \ + en_ZM/UTF-8 \ +@@ -385,6 +388,7 @@ sv_FI/ISO-8859-1 \ + sv_FI@euro/ISO-8859-15 \ + sv_SE.UTF-8/UTF-8 \ + sv_SE/ISO-8859-1 \ ++sv_SE.ISO-8859-15/ISO-8859-15 \ + sw_KE/UTF-8 \ + sw_TZ/UTF-8 \ + szl_PL/UTF-8 \ diff --git a/SOURCES/glibc-fedora-localedef.patch b/SOURCES/glibc-fedora-localedef.patch new file mode 100644 index 0000000..41deb0a --- /dev/null +++ b/SOURCES/glibc-fedora-localedef.patch @@ -0,0 +1,11 @@ +diff -Nru glibc-2.17-c758a686/localedata/Makefile glibc-2.17-c758a686/localedata/Makefile +--- glibc-2.17-c758a686/localedata/Makefile 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/localedata/Makefile 2012-06-07 12:15:21.776318827 -0600 +@@ -211,6 +211,7 @@ $(INSTALL-SUPPORTED-LOCALES): install-lo + echo -n '...'; \ + input=`echo $$locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'`; \ + $(LOCALEDEF) --alias-file=../intl/locale.alias \ ++ --no-archive \ + -i locales/$$input -c -f charmaps/$$charset \ + $(addprefix --prefix=,$(install_root)) $$locale; \ + echo ' done'; \ diff --git a/SOURCES/glibc-fedora-locarchive.patch b/SOURCES/glibc-fedora-locarchive.patch new file mode 100644 index 0000000..245850a --- /dev/null +++ b/SOURCES/glibc-fedora-locarchive.patch @@ -0,0 +1,51 @@ +This is a part of commit glibc-2.3.3-1492-ga891c7b, +needed for fedora/build-locale-archive.c only. + +diff -Nru glibc-2.17-c758a686/ChangeLog.17 glibc-2.17-c758a686/ChangeLog.17 +--- glibc-2.17-c758a686/ChangeLog.17 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/ChangeLog.17 2012-06-07 12:15:21.564319619 -0600 +@@ -11818,6 +11829,10 @@ d2009-10-30 Ulrich Drepper <drepper@re + [BZ #4368] + * stdlib/stdlib.h: Remove obsolete part of comment for realpath. + ++2007-04-16 Jakub Jelinek <jakub@redhat.com> ++ ++ * locale/programs/locarchive.c (add_alias, insert_name): Remove static. ++ + 2007-04-16 Ulrich Drepper <drepper@redhat.com> + + [BZ #4364] +diff -Nru glibc-2.17-c758a686/locale/programs/locarchive.c glibc-2.17-c758a686/locale/programs/locarchive.c +--- glibc-2.17-c758a686/locale/programs/locarchive.c 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/locale/programs/locarchive.c 2012-06-07 12:15:21.585319540 -0600 +@@ -252,9 +252,9 @@ oldlocrecentcmp (const void *a, const vo + /* forward decls for below */ + static uint32_t add_locale (struct locarhandle *ah, const char *name, + locale_data_t data, bool replace); +-static void add_alias (struct locarhandle *ah, const char *alias, +- bool replace, const char *oldname, +- uint32_t *locrec_offset_p); ++void add_alias (struct locarhandle *ah, const char *alias, ++ bool replace, const char *oldname, ++ uint32_t *locrec_offset_p); + + + static bool +@@ -635,7 +635,7 @@ close_archive (struct locarhandle *ah) + #include "../../intl/explodename.c" + #include "../../intl/l10nflist.c" + +-static struct namehashent * ++struct namehashent * + insert_name (struct locarhandle *ah, + const char *name, size_t name_len, bool replace) + { +@@ -693,7 +693,7 @@ insert_name (struct locarhandle *ah, + return &namehashtab[idx]; + } + +-static void ++void + add_alias (struct locarhandle *ah, const char *alias, bool replace, + const char *oldname, uint32_t *locrec_offset_p) + { diff --git a/SOURCES/glibc-fedora-manual-dircategory.patch b/SOURCES/glibc-fedora-manual-dircategory.patch new file mode 100644 index 0000000..9dce832 --- /dev/null +++ b/SOURCES/glibc-fedora-manual-dircategory.patch @@ -0,0 +1,20 @@ +From 4820b9175535e13df79ce816106016040014916e Mon Sep 17 00:00:00 2001 +From: Jakub Jelinek <jakub@redhat.com> +Date: Fri, 3 Nov 2006 16:31:21 +0000 +Subject: [PATCH] Change @dircategory. + +--- + manual/libc.texinfo | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- glibc-2.17-c758a686/manual/libc.texinfo ++++ glibc-2.17-c758a686/manual/libc.texinfo +@@ -7,7 +7,7 @@ + @include macros.texi + + @comment Tell install-info what to do. +-@dircategory Software libraries ++@dircategory Libraries + @direntry + * Libc: (libc). C library. + @end direntry diff --git a/SOURCES/glibc-fedora-nis-rh188246.patch b/SOURCES/glibc-fedora-nis-rh188246.patch new file mode 100644 index 0000000..f266774 --- /dev/null +++ b/SOURCES/glibc-fedora-nis-rh188246.patch @@ -0,0 +1,21 @@ +From baba5d9461d4e8a581ac26fe4412ad783ffc73e7 Mon Sep 17 00:00:00 2001 +From: Jakub Jelinek <jakub@redhat.com> +Date: Mon, 1 May 2006 08:02:53 +0000 +Subject: [PATCH] Enable SETENT_BATCH_READ nis/nss option by default + +* Mon May 1 2006 Jakub Jelinek <jakub@redhat.com> 2.4.90-4 +- SETENT_BATCH_READ /etc/default/nss option for speeding up + some usages of NIS+ (#188246) + +diff --git glibc-2.17-c758a686/nis/nss glibc-2.17-c758a686/nis/nss +--- glibc-2.17-c758a686/nis/nss ++++ glibc-2.17-c758a686/nis/nss +@@ -25,7 +25,7 @@ + # memory with every getXXent() call. Otherwise each getXXent() call + # might result into a network communication with the server to get + # the next entry. +-#SETENT_BATCH_READ=TRUE ++SETENT_BATCH_READ=TRUE + # + # ADJUNCT_AS_SHADOW + # If set to TRUE, the passwd routines in the NIS NSS module will not diff --git a/SOURCES/glibc-fedora-nptl-linklibc.patch b/SOURCES/glibc-fedora-nptl-linklibc.patch new file mode 100644 index 0000000..e6866ee --- /dev/null +++ b/SOURCES/glibc-fedora-nptl-linklibc.patch @@ -0,0 +1,25 @@ +diff -Nru glibc-2.17-c758a686/nptl/Makefile glibc-2.17-c758a686/nptl/Makefile +--- glibc-2.17-c758a686/nptl/Makefile 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/nptl/Makefile 2012-06-07 12:15:21.816318678 -0600 +@@ -529,15 +529,19 @@ $(addprefix $(objpfx), \ + $(tests) $(xtests) $(test-srcs))): $(objpfx)libpthread.so \ + $(objpfx)libpthread_nonshared.a + $(objpfx)tst-unload: $(common-objpfx)dlfcn/libdl.so +-# $(objpfx)../libc.so is used instead of $(common-objpfx)libc.so, ++# $(objpfx)linklibc.so is used instead of $(common-objpfx)libc.so, + # since otherwise libpthread.so comes before libc.so when linking. + $(addprefix $(objpfx), $(tests-reverse)): \ +- $(objpfx)../libc.so $(objpfx)libpthread.so \ ++ $(objpfx)linklibc.so $(objpfx)libpthread.so \ + $(objpfx)libpthread_nonshared.a + $(objpfx)../libc.so: $(common-objpfx)libc.so ; + $(addprefix $(objpfx),$(tests-static) $(xtests-static)): $(objpfx)libpthread.a + + $(objpfx)tst-atfork2.out: $(objpfx)tst-atfork2mod.so ++ ++$(objpfx)linklibc.so: $(common-objpfx)libc.so ++ ln -s ../libc.so $@ ++generated += libclink.so + else + $(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a + endif diff --git a/SOURCES/glibc-fedora-nscd.patch b/SOURCES/glibc-fedora-nscd.patch new file mode 100644 index 0000000..b236ecc --- /dev/null +++ b/SOURCES/glibc-fedora-nscd.patch @@ -0,0 +1,12 @@ +diff -Nru glibc-2.17-c758a686/nscd/nscd.conf glibc-2.17-c758a686/nscd/nscd.conf +--- glibc-2.17-c758a686/nscd/nscd.conf 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/nscd/nscd.conf 2012-06-07 12:15:21.818318670 -0600 +@@ -33,7 +33,7 @@ + # logfile /var/log/nscd.log + # threads 4 + # max-threads 32 +-# server-user nobody ++ server-user nscd + # stat-user somebody + debug-level 0 + # reload-count 5 diff --git a/SOURCES/glibc-fedora-ppc-unwind.patch b/SOURCES/glibc-fedora-ppc-unwind.patch new file mode 100644 index 0000000..28a1e58 --- /dev/null +++ b/SOURCES/glibc-fedora-ppc-unwind.patch @@ -0,0 +1,23 @@ +(This patch is no longer needed because we currently build all of +glibc with -fno-asynchronous-unwind-tables.) + +glibc-2.3.3-1478-g37582bc + +* Thu Nov 30 2006 Jakub Jelinek <jakub@redhat.com> 2.5.90-9 +- on ppc64 build __libc_start_main without unwind info, + as it breaks MD_FROB_UPDATE_CONTEXT (#217729, #217775; in the + future that could be fixable just by providing .cfi_undefined r2 + in __libc_start_main instead) + +diff -Nru glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile 2012-06-07 12:15:21.828318633 -0600 +@@ -35,6 +35,8 @@ CFLAGS-rtld-memmove.os = $(no-special-re + CFLAGS-rtld-memchr.os = $(no-special-regs) + CFLAGS-rtld-strnlen.os = $(no-special-regs) + ++CFLAGS-libc-start.c += -fno-asynchronous-unwind-tables ++ + ifeq ($(subdir),csu) + sysdep_routines += hp-timing + elide-routines.os += hp-timing diff --git a/SOURCES/glibc-fedora-regcomp-sw11561.patch b/SOURCES/glibc-fedora-regcomp-sw11561.patch new file mode 100644 index 0000000..3366dd9 --- /dev/null +++ b/SOURCES/glibc-fedora-regcomp-sw11561.patch @@ -0,0 +1,155 @@ +Upstream commit: + +commit 7e2f0d2d77e4bc273fe00f99d970605d8e38d4d6 +Author: Andreas Schwab <schwab@suse.de> +Date: Mon Feb 4 10:16:33 2013 +0100 + + Fix handling of collating symbols in regexps + +From c1b97d6d896b1f22fdf5d28471ef7859ec840a57 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab <schwab@redhat.com> +Date: Wed, 1 Sep 2010 17:26:15 +0200 +Subject: [PATCH] Fix handling of collating symbols in regexps + +[BZ #11561] +* posix/regcomp.c (parse_bracket_exp): When looking up collating +elements compare against the byte sequence of it, not its name. + +--- + ChangeLog | 4 +++ + posix/regcomp.c | 72 ++++++++++++++++++++---------------------------------- + 2 files changed, 31 insertions(+), 45 deletions(-) + +--- glibc-2.17-c758a686/posix/regcomp.c ++++ glibc-2.17-c758a686/posix/regcomp.c +@@ -2772,40 +2772,29 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, + + /* Local function for parse_bracket_exp used in _LIBC environement. + Seek the collating symbol entry correspondings to NAME. +- Return the index of the symbol in the SYMB_TABLE. */ ++ Return the index of the symbol in the SYMB_TABLE, ++ or -1 if not found. */ + + auto inline int32_t + __attribute ((always_inline)) +- seek_collating_symbol_entry (name, name_len) +- const unsigned char *name; +- size_t name_len; ++ seek_collating_symbol_entry (const unsigned char *name, size_t name_len) + { +- int32_t hash = elem_hash ((const char *) name, name_len); +- int32_t elem = hash % table_size; +- if (symb_table[2 * elem] != 0) +- { +- int32_t second = hash % (table_size - 2) + 1; +- +- do +- { +- /* First compare the hashing value. */ +- if (symb_table[2 * elem] == hash +- /* Compare the length of the name. */ +- && name_len == extra[symb_table[2 * elem + 1]] +- /* Compare the name. */ +- && memcmp (name, &extra[symb_table[2 * elem + 1] + 1], +- name_len) == 0) +- { +- /* Yep, this is the entry. */ +- break; +- } ++ int32_t elem; + +- /* Next entry. */ +- elem += second; +- } +- while (symb_table[2 * elem] != 0); +- } +- return elem; ++ for (elem = 0; elem < table_size; elem++) ++ if (symb_table[2 * elem] != 0) ++ { ++ int32_t idx = symb_table[2 * elem + 1]; ++ /* Skip the name of collating element name. */ ++ idx += 1 + extra[idx]; ++ if (/* Compare the length of the name. */ ++ name_len == extra[idx] ++ /* Compare the name. */ ++ && memcmp (name, &extra[idx + 1], name_len) == 0) ++ /* Yep, this is the entry. */ ++ return elem; ++ } ++ return -1; + } + + /* Local function for parse_bracket_exp used in _LIBC environment. +@@ -2814,8 +2803,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, + + auto inline unsigned int + __attribute ((always_inline)) +- lookup_collation_sequence_value (br_elem) +- bracket_elem_t *br_elem; ++ lookup_collation_sequence_value (bracket_elem_t *br_elem) + { + if (br_elem->type == SB_CHAR) + { +@@ -2843,7 +2831,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, + int32_t elem, idx; + elem = seek_collating_symbol_entry (br_elem->opr.name, + sym_name_len); +- if (symb_table[2 * elem] != 0) ++ if (elem != -1) + { + /* We found the entry. */ + idx = symb_table[2 * elem + 1]; +@@ -2861,7 +2849,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, + /* Return the collation sequence value. */ + return *(unsigned int *) (extra + idx); + } +- else if (symb_table[2 * elem] == 0 && sym_name_len == 1) ++ else if (sym_name_len == 1) + { + /* No valid character. Match it as a single byte + character. */ +@@ -2883,11 +2871,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, + + auto inline reg_errcode_t + __attribute ((always_inline)) +- build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem) +- re_charset_t *mbcset; +- int *range_alloc; +- bitset_t sbcset; +- bracket_elem_t *start_elem, *end_elem; ++ build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc, ++ bracket_elem_t *start_elem, bracket_elem_t *end_elem) + { + unsigned int ch; + uint32_t start_collseq; +@@ -2966,25 +2951,22 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, + + auto inline reg_errcode_t + __attribute ((always_inline)) +- build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name) +- re_charset_t *mbcset; +- int *coll_sym_alloc; +- bitset_t sbcset; +- const unsigned char *name; ++ build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset, ++ int *coll_sym_alloc, const unsigned char *name) + { + int32_t elem, idx; + size_t name_len = strlen ((const char *) name); + if (nrules != 0) + { + elem = seek_collating_symbol_entry (name, name_len); +- if (symb_table[2 * elem] != 0) ++ if (elem != -1) + { + /* We found the entry. */ + idx = symb_table[2 * elem + 1]; + /* Skip the name of collating element name. */ + idx += 1 + extra[idx]; + } +- else if (symb_table[2 * elem] == 0 && name_len == 1) ++ else if (name_len == 1) + { + /* No valid character, treat it as a normal + character. */ diff --git a/SOURCES/glibc-fedora-streams-rh436349.patch b/SOURCES/glibc-fedora-streams-rh436349.patch new file mode 100644 index 0000000..6b862db --- /dev/null +++ b/SOURCES/glibc-fedora-streams-rh436349.patch @@ -0,0 +1,28 @@ +This is part of commit glibc-2.3.3-1564-gd0b6ac6 + +* Fri Mar 14 2008 Jakub Jelinek <jakub@redhat.com> 2.7.90-11 +- remove <stropts.h>, define _XOPEN_STREAMS -1 (#436349) + +diff -Nru glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h 2012-06-07 12:15:21.817318674 -0600 +@@ -188,4 +188,7 @@ + /* Typed memory objects are not available. */ + #define _POSIX_TYPED_MEMORY_OBJECTS -1 + ++/* Streams are not available. */ ++#define _XOPEN_STREAMS -1 ++ + #endif /* bits/posix_opt.h */ +diff -Nru glibc-2.17-c758a686/streams/Makefile glibc-2.17-c758a686/streams/Makefile +--- glibc-2.17-c758a686/streams/Makefile 2012-06-05 07:42:49.000000000 -0600 ++++ glibc-2.17-c758a686/streams/Makefile 2012-06-07 12:15:21.824318649 -0600 +@@ -20,7 +20,7 @@ + # + subdir := streams + +-headers = stropts.h sys/stropts.h bits/stropts.h bits/xtitypes.h ++#headers = stropts.h sys/stropts.h bits/stropts.h bits/xtitypes.h + routines = isastream getmsg getpmsg putmsg putpmsg fattach fdetach + + include ../Rules diff --git a/SOURCES/glibc-fedora-uname-getrlimit.patch b/SOURCES/glibc-fedora-uname-getrlimit.patch new file mode 100644 index 0000000..3529d0c --- /dev/null +++ b/SOURCES/glibc-fedora-uname-getrlimit.patch @@ -0,0 +1,52 @@ +Related upstream commit: + +commit c5c2b7c3fd823fc5c4a52506292a90eba60b0c62 +Author: Joseph Myers <joseph@codesourcery.com> +Date: Sat Dec 6 23:40:48 2014 +0000 + + Fix pthreads getrlimit, gettimeofday namespace (bug 17682). + +The uname call is again present in Fedora because UTS namespaces can +be used nowadays to change the uname result. + +--- glibc-2.17-c758a686/nptl/Version ++++ glibc-2.17-c758a686/nptl/Versions +@@ -30,6 +30,7 @@ libc { + __libc_alloca_cutoff; + # Internal libc interface to libpthread + __libc_dl_error_tsd; ++ __getrlimit; + } + } + +--- glibc-2.17-c758a686/nptl/nptl-init.c ++++ glibc-2.17-c758a686/nptl/nptl-init.c +@@ -414,7 +414,7 @@ __pthread_initialize_minimal_internal (void) + /* Determine the default allowed stack size. This is the size used + in case the user does not specify one. */ + struct rlimit limit; +- if (getrlimit (RLIMIT_STACK, &limit) != 0 ++ if (__getrlimit (RLIMIT_STACK, &limit) != 0 + || limit.rlim_cur == RLIM_INFINITY) + /* The system limit is not usable. Use an architecture-specific + default. */ +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/Versions ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/Versions +@@ -0,0 +1,6 @@ ++libc { ++ GLIBC_PRIVATE { ++ # Internal libc interface to libpthread ++ __uname; ++ } ++} +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/smp.h ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/i386/smp.h +@@ -36,7 +36,7 @@ is_smp_system (void) + char *cp; + + /* Try reading the number using `sysctl' first. */ +- if (uname (&u.uts) == 0) ++ if (__uname (&u.uts) == 0) + cp = u.uts.version; + else + { diff --git a/SOURCES/glibc-fix-test-write-buf-size.patch b/SOURCES/glibc-fix-test-write-buf-size.patch new file mode 100644 index 0000000..104b97b --- /dev/null +++ b/SOURCES/glibc-fix-test-write-buf-size.patch @@ -0,0 +1,54 @@ +# This patch fixes tst-cancel4, tst-cancel5, tst-cancelx4 and tst-cancelx5 +# failures on newer kernels where the write buffers are larger. +# +# commit e7074e4c5edb0acaa979ea08e533736f906a9d68 +# Author: David S. Miller <davem@davemloft.net> +# Date: Tue Jul 23 02:31:37 2013 -0700 +# +# Increase nptl test case buffer size so we really block on current Linux kernels. +# +# * tst-cancel4.c (WRITE_BUFFER_SIZE): Increase to 16384. +# +# commit 135529b443631f840cc66d0cc395f79c416434d9 +# Author: David S. Miller <davem@davemloft.net> +# Date: Tue Jul 23 11:31:39 2013 -0700 +# +# Remove Linux kernel version ambiguity in comment added by previous commit. +# +# * tst-cancel4.c (WRITE_BUFFER_SIZE): Adjust comment. +# +diff -urN glibc-2.17-c758a686/nptl/tst-cancel4.c glibc-2.17-c758a686/nptl/tst-cancel4.c +--- glibc-2.17-c758a686/nptl/tst-cancel4.c 2014-07-25 22:07:09.130021164 -0400 ++++ glibc-2.17-c758a686/nptl/tst-cancel4.c 2014-07-25 22:12:07.580022919 -0400 +@@ -83,7 +83,30 @@ + # define IPC_ADDVAL 0 + #endif + +-#define WRITE_BUFFER_SIZE 4096 ++/* The WRITE_BUFFER_SIZE value needs to be choosen such that if we set ++ the socket send buffer size to '1', a write of this size on that ++ socket will block. ++ ++ The Linux kernel imposes a minimum send socket buffer size which ++ has changed over the years. As of Linux 3.10 the value is: ++ ++ 2 * (2048 + SKB_DATA_ALIGN(sizeof(struct sk_buff))) ++ ++ which is attempting to make sure that with standard MTUs, ++ TCP can always queue up at least 2 full sized packets. ++ ++ Furthermore, there is logic in the socket send paths that ++ will allow one more packet (of any size) to be queued up as ++ long as some socket buffer space remains. Blocking only ++ occurs when we try to queue up a new packet and the send ++ buffer space has already been fully consumed. ++ ++ Therefore we must set this value to the largest possible value of ++ the formula above (and since it depends upon the size of "struct ++ sk_buff", it is dependent upon machine word size etc.) plus some ++ slack space. */ ++ ++#define WRITE_BUFFER_SIZE 16384 + + /* Cleanup handling test. */ + static int cl_called; diff --git a/SOURCES/glibc-gmake.patch b/SOURCES/glibc-gmake.patch new file mode 100644 index 0000000..8431c0e --- /dev/null +++ b/SOURCES/glibc-gmake.patch @@ -0,0 +1,37 @@ +# +# BZ #16037 +# +# Allow building glibc with make version 4.0 or greater. +# This facilitates testing and QE on non-RHEL environments during +# patch development. +# +# commit 28d708c44bc47b56f6551ff285f78edcf61c208a +# Author: Marc-Antoine Perennou <Marc-Antoine@Perennou.com> +# Date: Thu Oct 31 12:37:50 2013 +1000 +# +# Accept make versions 4.0 and greater +# +diff -urN glibc-2.17-c758a686/configure glibc-2.17-c758a686/configure +--- glibc-2.17-c758a686/configure 2015-01-15 16:32:14.983435268 -0500 ++++ glibc-2.17-c758a686/configure 2015-01-15 16:32:45.396495266 -0500 +@@ -4991,7 +4991,7 @@ + ac_prog_version=`$MAKE --version 2>&1 | sed -n 's/^.*GNU Make[^0-9]*\([0-9][0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; +- 3.79* | 3.[89]*) ++ 3.79* | 3.[89]* | [4-9].* | [1-9][0-9]*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + +diff -urN glibc-2.17-c758a686/configure.in glibc-2.17-c758a686/configure.in +--- glibc-2.17-c758a686/configure.in 2015-01-15 16:32:14.781441511 -0500 ++++ glibc-2.17-c758a686/configure.in 2015-01-15 16:32:34.970817501 -0500 +@@ -945,7 +945,7 @@ + critic_missing="$critic_missing gcc") + AC_CHECK_PROG_VER(MAKE, gnumake gmake make, --version, + [GNU Make[^0-9]*\([0-9][0-9.]*\)], +- [3.79* | 3.[89]*], critic_missing="$critic_missing make") ++ [3.79* | 3.[89]* | [4-9].* | [1-9][0-9]*], critic_missing="$critic_missing make") + + AC_CHECK_PROG_VER(MSGFMT, gnumsgfmt gmsgfmt msgfmt, --version, + [GNU gettext.* \([0-9]*\.[0-9.]*\)], diff --git a/SOURCES/glibc-manual-update.patch b/SOURCES/glibc-manual-update.patch new file mode 100644 index 0000000..bed496b --- /dev/null +++ b/SOURCES/glibc-manual-update.patch @@ -0,0 +1,19408 @@ +# +# Synchronize RHEL 7.1 manual with upstream manual. +# +# Include updates that don't impact material differences +# between the upstream master and 2.17-based RHEL implemenation. +# +diff -urN glibc-2.17-c758a686/manual/argp.texi glibc-2.17-c758a686/manual/argp.texi +--- glibc-2.17-c758a686/manual/argp.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/argp.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -36,6 +36,35 @@ + @comment argp.h + @comment GNU + @deftypefun {error_t} argp_parse (const struct argp *@var{argp}, int @var{argc}, char **@var{argv}, unsigned @var{flags}, int *@var{arg_index}, void *@var{input}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtslocale{} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} ++@c Optionally alloca()tes standard help options, initializes the parser, ++@c then parses individual args in a loop, and then finalizes. ++@c parser_init ++@c calc_sizes ok ++@c option_is_end ok ++@c malloc @ascuheap @acsmem ++@c parser_convert @mtslocale ++@c convert_options @mtslocale ++@c option_is_end ok ++@c option_is_short ok ++@c isprint, but locale may change within the loop ++@c find_long_option ok ++@c group_parse ++@c group->parser (from argp->parser) ++@c parser_parse_next ++@c getopt_long(_only)_r many issues, same as non_r minus @mtasurace ++@c parser_parse_arg ++@c group_parse dup ++@c parser_parse_opt ++@c group_parse dup ++@c argp_error dup @mtasurace:argpbuf @mtsenv @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock ++@c dgettext (bad key error) dup @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c parser_finalize ++@c group_parse ++@c fprintf dup @mtslocale @asucorrupt @aculock @acucorrupt [no @ascuheap @acsmem] ++@c dgettext dup @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c arg_state_help ++@c free dup @ascuhelp @acsmem + The @code{argp_parse} function parses the arguments in @var{argv}, of + length @var{argc}, using the argp parser @var{argp}. @xref{Argp + Parsers}. Passing a null pointer for @var{argp} is the same as using +@@ -660,6 +689,8 @@ + @comment argp.h + @comment GNU + @deftypefun void argp_usage (const struct argp_state *@var{state}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}} ++@c Just calls argp_state_help with stderr and ARGP_HELP_STD_USAGE. + Outputs the standard usage message for the argp parser referred to by + @var{state} to @code{@var{state}->err_stream} and terminate the program + with @code{exit (argp_err_exit_status)}. @xref{Argp Global Variables}. +@@ -669,6 +700,13 @@ + @comment argp.h + @comment GNU + @deftypefun void argp_error (const struct argp_state *@var{state}, const char *@var{fmt}, @dots{}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}} ++@c Lock stream, vasprintf the formatted message into a buffer, print the ++@c buffer prefixed by the short program name (in libc, ++@c argp_short_program_name is a macro that expands to ++@c program_invocation_short_name), releases the buffer, then call ++@c argp_state_help with stream and ARGP_HELP_STD_ERR, unlocking the ++@c stream at the end. + Prints the printf format string @var{fmt} and following args, preceded + by the program name and @samp{:}, and followed by a @w{@samp{Try @dots{} + --help}} message, and terminates the program with an exit status of +@@ -679,6 +717,12 @@ + @comment argp.h + @comment GNU + @deftypefun void argp_failure (const struct argp_state *@var{state}, int @var{status}, int @var{errnum}, const char *@var{fmt}, @dots{}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{}}} ++@c Lock stream, write out the short program name, vasprintf the optional ++@c formatted message to a buffer, print the buffer prefixed by colon and ++@c blank, release the buffer, call strerror_r with an automatic buffer, ++@c print it out after colon and blank, put[w]c a line break, unlock the ++@c stream, then exit unless ARGP_NO_EXIT. + Similar to the standard gnu error-reporting function @code{error}, this + prints the program name and @samp{:}, the printf format string + @var{fmt}, and the appropriate following args. If it is non-zero, the +@@ -695,6 +739,142 @@ + @comment argp.h + @comment GNU + @deftypefun void argp_state_help (const struct argp_state *@var{state}, FILE *@var{stream}, unsigned @var{flags}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}} ++@c Just calls _help with the short program name and optionally exit. ++@c The main problems in _help, besides the usual issues with stream I/O ++@c and translation, are the use of a static buffer (uparams, thus ++@c @mtasurace:argpbuf) that makes the whole thing thread-unsafe, reading ++@c from the environment for ARGP_HELP_FMT, accessing the locale object ++@c multiple times. ++ ++@c _help @mtsenv @mtasurace:argpbuf @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock ++@c dgettext @ascuintl ++@c flockfile @aculock ++@c funlockfile @aculock ++@c fill_in_uparams @mtsenv @mtasurace:argpbuf @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem ++@c argp_failure dup (status = errnum = 0) ++@c atoi dup @mtslocale ++@c argp_hol @ascuheap @acsmem ++@c make_hol @ascuheap @acsmem ++@c hol_add_cluster @ascuheap @acsmem ++@c hol_append @ascuheap @acsmem ++@c hol_set_group ok ++@c hol_find_entry ok ++@c hol_sort @mtslocale @acucorrupt ++@c qsort dup @acucorrupt ++@c hol_entry_qcmp @mtslocale ++@c hol_entry_cmp @mtslocale ++@c group_cmp ok ++@c hol_cluster_cmp ok ++@c group_cmp ok ++@c hol_entry_first_short @mtslocale ++@c hol_entry_short_iterate [@mtslocale] ++@c until_short ok ++@c oshort ok ++@c isprint ok ++@c odoc ok ++@c hol_entry_first_long ok ++@c canon_doc_option @mtslocale ++@c tolower dup ++@c hol_usage @mtslocale @ascuintl @ascuheap @acsmem ++@c hol_entry_short_iterate ok ++@c add_argless_short_opt ok ++@c argp_fmtstream_printf dup ++@c hol_entry_short_iterate @mtslocale @ascuintl @ascuheap @acsmem ++@c usage_argful_short_opt @mtslocale @ascuintl @ascuheap @acsmem ++@c dgettext dup ++@c argp_fmtstream_printf dup ++@c hol_entry_long_iterate @mtslocale @ascuintl @ascuheap @acsmem ++@c usage_long_opt @mtslocale @ascuintl @ascuheap @acsmem ++@c dgettext dup ++@c argp_fmtstream_printf dup ++@c hol_help @mtslocale @mtasurace:argpbuf @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock ++@c hol_entry_help @mtslocale @mtasurace:argpbuf @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_set_lmargin dup ++@c argp_fmtstream_wmargin dup ++@c argp_fmtstream_set_wmargin dup ++@c comma @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_putc dup ++@c hol_cluster_is_child ok ++@c argp_fmtstream_wmargin dup ++@c print_header dup ++@c argp_fmtstream_set_wmargin dup ++@c argp_fmtstream_puts dup ++@c indent_to dup ++@c argp_fmtstream_putc dup ++@c arg @mtslocale @ascuheap @acsmem ++@c argp_fmtstream_printf dup ++@c odoc dup ++@c argp_fmtstream_puts dup ++@c argp_fmtstream_printf dup ++@c print_header @mtslocale @mtasurace:argpbuf @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock ++@c dgettext dup ++@c filter_doc dup ++@c argp_fmtstream_putc dup ++@c indent_to dup ++@c argp_fmtstream_set_lmargin dup ++@c argp_fmtstream_set_wmargin dup ++@c argp_fmtstream_puts dup ++@c free dup ++@c filter_doc dup ++@c argp_fmtstream_point dup ++@c indent_to @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_point dup ++@c argp_fmtstream_putc dup ++@c dgettext dup ++@c filter_doc dup ++@c argp_fmtstream_putc dup ++@c argp_fmtstream_puts dup ++@c free dup ++@c hol_free @ascuheap @acsmem ++@c free dup ++@c argp_args_levels ok ++@c argp_args_usage @mtslocale @ascuintl @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c dgettext dup ++@c filter_doc ok ++@c argp_input ok ++@c argp->help_filter ++@c space @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_point dup ++@c argp_fmtstream_rmargin @mtslocale @asucorrupt @acucorrupt @aculock ++@c argp_fmtstream_update dup ++@c argp_fmtstream_putc dup ++@c argp_fmtstream_write dup ++@c free dup ++@c argp_doc @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock ++@c dgettext @ascuintl ++@c strndup @ascuheap @acsmem ++@c argp_input dup ++@c argp->help_filter ++@c argp_fmtstream_putc @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_ensure dup ++@c argp_fmtstream_write dup ++@c argp_fmtstream_puts dup ++@c argp_fmtstream_point @mtslocale @asucorrupt @acucorrupt @aculock ++@c argp_fmtstream_update dup ++@c argp_fmtstream_lmargin dup ++@c free dup ++@c argp_make_fmtstream @ascuheap @acsmem ++@c argp_fmtstream_free @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_update @mtslocale @asucorrupt @acucorrupt @aculock ++@c put[w]c_unlocked dup ++@c isblank in loop @mtslocale ++@c fxprintf @aculock ++@c fxprintf @aculock ++@c free dup ++@c argp_fmtstream_set_wmargin @mtslocale @asucorrupt @acucorrupt @aculock ++@c argp_fmtstream_update dup ++@c argp_fmtstream_printf @mtslocale @ascuheap @acsmem ++@c argp_fmtstream_ensure dup ++@c vsnprintf dup ++@c argp_fmtstream_set_lmargin @mtslocale @asucorrupt @acucorrupt @aculock ++@c argp_fmtstream_update dup ++@c argp_fmtstream_puts @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_write @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_ensure @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock ++@c argp_fmtstream_update dup ++@c fxprintf @aculock ++@c realloc @ascuheap @acsmem + Outputs a help message for the argp parser referred to by @var{state}, + to @var{stream}. The @var{flags} argument determines what sort of help + message is produced. @xref{Argp Help Flags}. +@@ -928,6 +1108,8 @@ + @comment argp.h + @comment GNU + @deftypefun void argp_help (const struct argp *@var{argp}, FILE *@var{stream}, unsigned @var{flags}, char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}} ++@c Just calls _help. + This outputs a help message for the argp parser @var{argp} to + @var{stream}. The type of messages printed will be determined by + @var{flags}. +diff -urN glibc-2.17-c758a686/manual/arith.texi glibc-2.17-c758a686/manual/arith.texi +--- glibc-2.17-c758a686/manual/arith.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/arith.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -160,6 +160,8 @@ + @comment stdlib.h + @comment ISO + @deftypefun div_t div (int @var{numerator}, int @var{denominator}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Functions in this section are pure, and thus safe. + This function @code{div} computes the quotient and remainder from + the division of @var{numerator} by @var{denominator}, returning the + result in a structure of type @code{div_t}. +@@ -199,6 +201,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun ldiv_t ldiv (long int @var{numerator}, long int @var{denominator}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{ldiv} function is similar to @code{div}, except that the + arguments are of type @code{long int} and the result is returned as a + structure of type @code{ldiv_t}. +@@ -225,6 +228,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun lldiv_t lldiv (long long int @var{numerator}, long long int @var{denominator}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{lldiv} function is like the @code{div} function, but the + arguments are of type @code{long long int} and the result is returned as + a structure of type @code{lldiv_t}. +@@ -256,6 +260,7 @@ + @comment inttypes.h + @comment ISO + @deftypefun imaxdiv_t imaxdiv (intmax_t @var{numerator}, intmax_t @var{denominator}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{imaxdiv} function is like the @code{div} function, but the + arguments are of type @code{intmax_t} and the result is returned as + a structure of type @code{imaxdiv_t}. +@@ -318,6 +323,7 @@ + @comment math.h + @comment ISO + @deftypefn {Macro} int fpclassify (@emph{float-type} @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is a generic macro which works on all floating-point types and + which returns a value of type @code{int}. The possible values are: + +@@ -354,6 +360,7 @@ + @comment math.h + @comment ISO + @deftypefn {Macro} int isfinite (@emph{float-type} @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns a nonzero value if @var{x} is finite: not plus or + minus infinity, and not NaN. It is equivalent to + +@@ -368,6 +375,7 @@ + @comment math.h + @comment ISO + @deftypefn {Macro} int isnormal (@emph{float-type} @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns a nonzero value if @var{x} is finite and normalized. + It is equivalent to + +@@ -379,6 +387,7 @@ + @comment math.h + @comment ISO + @deftypefn {Macro} int isnan (@emph{float-type} @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns a nonzero value if @var{x} is NaN. It is equivalent + to + +@@ -387,6 +396,15 @@ + @end smallexample + @end deftypefn + ++@comment math.h ++@comment GNU ++@deftypefn {Macro} int issignaling (@emph{float-type} @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++This macro returns a nonzero value if @var{x} is a signaling NaN ++(sNaN). It is based on draft TS 18661 and currently enabled as a GNU ++extension. ++@end deftypefn ++ + Another set of floating-point classification functions was provided by + BSD. @Theglibc{} also supports these functions; however, we + recommend that you use the ISO C99 macros in new code. Those are standard +@@ -402,6 +420,7 @@ + @comment math.h + @comment BSD + @deftypefunx int isinfl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function returns @code{-1} if @var{x} represents negative infinity, + @code{1} if @var{x} represents positive infinity, and @code{0} otherwise. + @end deftypefun +@@ -415,6 +434,7 @@ + @comment math.h + @comment BSD + @deftypefunx int isnanl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function returns a nonzero value if @var{x} is a ``not a number'' + value, and zero otherwise. + +@@ -437,6 +457,7 @@ + @comment math.h + @comment BSD + @deftypefunx int finitel (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function returns a nonzero value if @var{x} is finite or a ``not a + number'' value, and zero otherwise. + @end deftypefun +@@ -489,7 +510,8 @@ + is called when certain exceptions occur inside math library functions. + However, the Unix98 standard deprecates this interface. We support it + for historical compatibility, but recommend that you do not use it in +-new programs. ++new programs. When this interface is used, exceptions may not be ++raised. + + @noindent + The exceptions defined in @w{IEEE 754} are: +@@ -705,6 +727,14 @@ + @comment fenv.h + @comment ISO + @deftypefun int feclearexcept (int @var{excepts}) ++@safety{@prelim{}@mtsafe{}@assafe{@assposix{}}@acsafe{@acsposix{}}} ++@c The other functions in this section that modify FP status register ++@c mostly do so with non-atomic load-modify-store sequences, but since ++@c the register is thread-specific, this should be fine, and safe for ++@c cancellation. As long as the FP environment is restored before the ++@c signal handler returns control to the interrupted thread (like any ++@c kernel should do), the functions are also safe for use in signal ++@c handlers. + This function clears all of the supported exception flags indicated by + @var{excepts}. + +@@ -715,6 +745,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int feraiseexcept (int @var{excepts}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function raises the supported exceptions indicated by + @var{excepts}. If more than one exception bit in @var{excepts} is set + the order in which the exceptions are raised is undefined except that +@@ -730,6 +761,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int fetestexcept (int @var{excepts}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Test whether the exception flags indicated by the parameter @var{except} + are currently set. If any of them are, a nonzero value is returned + which specifies which exceptions are set. Otherwise the result is zero. +@@ -766,6 +798,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int fegetexceptflag (fexcept_t *@var{flagp}, int @var{excepts}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function stores in the variable pointed to by @var{flagp} an + implementation-defined value representing the current setting of the + exception flags indicated by @var{excepts}. +@@ -777,6 +810,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int fesetexceptflag (const fexcept_t *@var{flagp}, int @var{excepts}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function restores the flags for the exceptions indicated by + @var{excepts} to the values stored in the variable pointed to by + @var{flagp}. +@@ -798,7 +832,8 @@ + Many of the math functions are defined only over a subset of the real or + complex numbers. Even if they are mathematically defined, their result + may be larger or smaller than the range representable by their return +-type. These are known as @dfn{domain errors}, @dfn{overflows}, and ++type without loss of accuracy. These are known as @dfn{domain errors}, ++@dfn{overflows}, and + @dfn{underflows}, respectively. Math functions do several things when + one of these errors occurs. In this manual we will refer to the + complete response as @dfn{signalling} a domain error, overflow, or +@@ -808,11 +843,20 @@ + exception and returns NaN. It also sets @var{errno} to @code{EDOM}; + this is for compatibility with old systems that do not support @w{IEEE + 754} exception handling. Likewise, when overflow occurs, math +-functions raise the overflow exception and return @math{@infinity{}} or +-@math{-@infinity{}} as appropriate. They also set @var{errno} to +-@code{ERANGE}. When underflow occurs, the underflow exception is +-raised, and zero (appropriately signed) is returned. @var{errno} may be +-set to @code{ERANGE}, but this is not guaranteed. ++functions raise the overflow exception and, in the default rounding ++mode, return @math{@infinity{}} or @math{-@infinity{}} as appropriate ++(in other rounding modes, the largest finite value of the appropriate ++sign is returned when appropriate for that rounding mode). They also ++set @var{errno} to @code{ERANGE} if returning @math{@infinity{}} or ++@math{-@infinity{}}; @var{errno} may or may not be set to ++@code{ERANGE} when a finite value is returned on overflow. When ++underflow occurs, the underflow exception is raised, and zero ++(appropriately signed) or a subnormal value, as appropriate for the ++mathematical result of the function and the rounding mode, is ++returned. @var{errno} may be set to @code{ERANGE}, but this is not ++guaranteed; it is intended that @theglibc{} should set it when the ++underflow is to an appropriately signed zero, but not necessarily for ++other underflows. + + Some of the math functions are defined mathematically to result in a + complex value over parts of their domains. The most familiar example of +@@ -932,6 +976,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int fegetround (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns the currently selected rounding mode, represented by one of the + values of the defined rounding mode macros. + @end deftypefun +@@ -942,6 +987,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int fesetround (int @var{round}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Changes the currently selected rounding mode to @var{round}. If + @var{round} does not correspond to one of the supported rounding modes + nothing is changed. @code{fesetround} returns zero if it changed the +@@ -986,6 +1032,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int fegetenv (fenv_t *@var{envp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Store the floating-point environment in the variable pointed to by + @var{envp}. + +@@ -996,6 +1043,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int feholdexcept (fenv_t *@var{envp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Store the current floating-point environment in the object pointed to by + @var{envp}. Then clear all exception flags, and set the FPU to trap no + exceptions. Not all FPUs support trapping no exceptions; if +@@ -1034,6 +1082,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int fesetenv (const fenv_t *@var{envp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Set the floating-point environment to that described by @var{envp}. + + The function returns zero in case the operation was successful, a +@@ -1043,6 +1092,7 @@ + @comment fenv.h + @comment ISO + @deftypefun int feupdateenv (const fenv_t *@var{envp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Like @code{fesetenv}, this function sets the floating-point environment + to that described by @var{envp}. However, if any exceptions were + flagged in the status word before @code{feupdateenv} was called, they +@@ -1063,6 +1113,7 @@ + @comment fenv.h + @comment GNU + @deftypefun int feenableexcept (int @var{excepts}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This functions enables traps for each of the exceptions as indicated by + the parameter @var{except}. The individual exceptions are described in + @ref{Status bit operations}. Only the specified exceptions are +@@ -1075,6 +1126,7 @@ + @comment fenv.h + @comment GNU + @deftypefun int fedisableexcept (int @var{excepts}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This functions disables traps for each of the exceptions as indicated by + the parameter @var{except}. The individual exceptions are described in + @ref{Status bit operations}. Only the specified exceptions are +@@ -1086,7 +1138,8 @@ + + @comment fenv.h + @comment GNU +-@deftypefun int fegetexcept (int @var{excepts}) ++@deftypefun int fegetexcept (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function returns a bitmask of all currently enabled exceptions. It + returns @code{-1} in case of failure. + @end deftypefun +@@ -1138,6 +1191,7 @@ + @comment inttypes.h + @comment ISO + @deftypefunx intmax_t imaxabs (intmax_t @var{number}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the absolute value of @var{number}. + + Most computers use a two's complement integer representation, in which +@@ -1159,6 +1213,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} fabsl (long double @var{number}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function returns the absolute value of the floating-point number + @var{number}. + @end deftypefun +@@ -1172,6 +1227,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {long double} cabsl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the absolute value of the complex number @var{z} + (@pxref{Complex Numbers}). The absolute value of a complex number is: + +@@ -1181,7 +1237,7 @@ + + This function should always be used instead of the direct formula + because it takes special care to avoid losing precision. It may also +-take advantage of hardware support for this operation. See @code{hypot} ++take advantage of hardware support for this operation. See @code{hypot} + in @ref{Exponents and Logarithms}. + @end deftypefun + +@@ -1209,12 +1265,13 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} frexpl (long double @var{value}, int *@var{exponent}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are used to split the number @var{value} + into a normalized fraction and an exponent. + + If the argument @var{value} is not zero, the return value is @var{value} +-times a power of two, and is always in the range 1/2 (inclusive) to 1 +-(exclusive). The corresponding exponent is stored in ++times a power of two, and its magnitude is always in the range 1/2 ++(inclusive) to 1 (exclusive). The corresponding exponent is stored in + @code{*@var{exponent}}; the return value multiplied by 2 raised to this + exponent equals the original number @var{value}. + +@@ -1234,6 +1291,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} ldexpl (long double @var{value}, int @var{exponent}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the result of multiplying the floating-point + number @var{value} by 2 raised to the power @var{exponent}. (It can + be used to reassemble floating-point numbers that were taken apart +@@ -1248,51 +1306,55 @@ + + @comment math.h + @comment BSD +-@deftypefun double scalb (double @var{value}, int @var{exponent}) ++@deftypefun double scalb (double @var{value}, double @var{exponent}) + @comment math.h + @comment BSD +-@deftypefunx float scalbf (float @var{value}, int @var{exponent}) ++@deftypefunx float scalbf (float @var{value}, float @var{exponent}) + @comment math.h + @comment BSD +-@deftypefunx {long double} scalbl (long double @var{value}, int @var{exponent}) ++@deftypefunx {long double} scalbl (long double @var{value}, long double @var{exponent}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{scalb} function is the BSD name for @code{ldexp}. + @end deftypefun + + @comment math.h + @comment BSD +-@deftypefun {long long int} scalbn (double @var{x}, int @var{n}) ++@deftypefun double scalbn (double @var{x}, int @var{n}) + @comment math.h + @comment BSD +-@deftypefunx {long long int} scalbnf (float @var{x}, int @var{n}) ++@deftypefunx float scalbnf (float @var{x}, int @var{n}) + @comment math.h + @comment BSD +-@deftypefunx {long long int} scalbnl (long double @var{x}, int @var{n}) ++@deftypefunx {long double} scalbnl (long double @var{x}, int @var{n}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{scalbn} is identical to @code{scalb}, except that the exponent + @var{n} is an @code{int} instead of a floating-point number. + @end deftypefun + + @comment math.h + @comment BSD +-@deftypefun {long long int} scalbln (double @var{x}, long int @var{n}) ++@deftypefun double scalbln (double @var{x}, long int @var{n}) + @comment math.h + @comment BSD +-@deftypefunx {long long int} scalblnf (float @var{x}, long int @var{n}) ++@deftypefunx float scalblnf (float @var{x}, long int @var{n}) + @comment math.h + @comment BSD +-@deftypefunx {long long int} scalblnl (long double @var{x}, long int @var{n}) ++@deftypefunx {long double} scalblnl (long double @var{x}, long int @var{n}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{scalbln} is identical to @code{scalb}, except that the exponent + @var{n} is a @code{long int} instead of a floating-point number. + @end deftypefun + + @comment math.h + @comment BSD +-@deftypefun {long long int} significand (double @var{x}) ++@deftypefun double significand (double @var{x}) + @comment math.h + @comment BSD +-@deftypefunx {long long int} significandf (float @var{x}) ++@deftypefunx float significandf (float @var{x}) + @comment math.h + @comment BSD +-@deftypefunx {long long int} significandl (long double @var{x}) ++@deftypefunx {long double} significandl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{significand} returns the mantissa of @var{x} scaled to the range + @math{[1, 2)}. + It is equivalent to @w{@code{scalb (@var{x}, (double) -ilogb (@var{x}))}}. +@@ -1307,7 +1369,7 @@ + + @pindex math.h + The functions listed here perform operations such as rounding and +-truncation of floating-point values. Some of these functions convert ++truncation of floating-point values. Some of these functions convert + floating point numbers to integer values. They are all declared in + @file{math.h}. + +@@ -1327,6 +1389,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} ceill (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions round @var{x} upwards to the nearest integer, + returning that value as a @code{double}. Thus, @code{ceil (1.5)} + is @code{2.0}. +@@ -1341,6 +1404,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} floorl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions round @var{x} downwards to the nearest + integer, returning that value as a @code{double}. Thus, @code{floor + (1.5)} is @code{1.0} and @code{floor (-1.5)} is @code{-2.0}. +@@ -1355,6 +1419,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} truncl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{trunc} functions round @var{x} towards zero to the nearest + integer (returned in floating-point format). Thus, @code{trunc (1.5)} + is @code{1.0} and @code{trunc (-1.5)} is @code{-1.0}. +@@ -1369,6 +1434,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} rintl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions round @var{x} to an integer value according to the + current rounding mode. @xref{Floating Point Parameters}, for + information about the various rounding modes. The default +@@ -1389,6 +1455,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} nearbyintl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the same value as the @code{rint} functions, but + do not raise the inexact exception if @var{x} is not an integer. + @end deftypefun +@@ -1402,6 +1469,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} roundl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are similar to @code{rint}, but they round halfway + cases away from zero instead of to the nearest integer (or other + current rounding mode). +@@ -1416,6 +1484,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long int} lrintl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are just like @code{rint}, but they return a + @code{long int} instead of a floating-point number. + @end deftypefun +@@ -1429,6 +1498,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long long int} llrintl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are just like @code{rint}, but they return a + @code{long long int} instead of a floating-point number. + @end deftypefun +@@ -1442,6 +1512,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long int} lroundl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are just like @code{round}, but they return a + @code{long int} instead of a floating-point number. + @end deftypefun +@@ -1455,6 +1526,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long long int} llroundl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are just like @code{round}, but they return a + @code{long long int} instead of a floating-point number. + @end deftypefun +@@ -1469,6 +1541,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} modfl (long double @var{value}, long double *@var{integer-part}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions break the argument @var{value} into an integer part and a + fractional part (between @code{-1} and @code{1}, exclusive). Their sum + equals @var{value}. Each of the parts has the same sign as @var{value}, +@@ -1495,6 +1568,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} fmodl (long double @var{numerator}, long double @var{denominator}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the remainder from the division of + @var{numerator} by @var{denominator}. Specifically, the return value is + @code{@var{numerator} - @w{@var{n} * @var{denominator}}}, where @var{n} +@@ -1517,6 +1591,7 @@ + @comment math.h + @comment BSD + @deftypefunx {long double} dreml (long double @var{numerator}, long double @var{denominator}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are like @code{fmod} except that they round the + internal quotient @var{n} to the nearest integer instead of towards zero + to an integer. For example, @code{drem (6.5, 2.3)} returns @code{-0.4}, +@@ -1540,6 +1615,7 @@ + @comment math.h + @comment BSD + @deftypefunx {long double} remainderl (long double @var{numerator}, long double @var{denominator}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is another name for @code{drem}. + @end deftypefun + +@@ -1561,6 +1637,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} copysignl (long double @var{x}, long double @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return @var{x} but with the sign of @var{y}. They work + even if @var{x} or @var{y} are NaN or zero. Both of these can carry a + sign (although not all implementations support it) and this is one of +@@ -1576,6 +1653,7 @@ + @comment math.h + @comment ISO + @deftypefun int signbit (@emph{float-type} @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{signbit} is a generic macro which can work on all floating-point + types. It returns a nonzero value if the value of @var{x} has its sign + bit set. +@@ -1594,6 +1672,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} nextafterl (long double @var{x}, long double @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{nextafter} function returns the next representable neighbor of + @var{x} in the direction towards @var{y}. The size of the step between + @var{x} and the result depends on the type of the result. If +@@ -1617,6 +1696,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} nexttowardl (long double @var{x}, long double @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are identical to the corresponding versions of + @code{nextafter} except that their second argument is a @code{long + double}. +@@ -1632,6 +1712,8 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} nanl (const char *@var{tagp}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c The unsafe-but-ruled-safe locale use comes from strtod. + The @code{nan} function returns a representation of NaN, provided that + NaN is supported by the target platform. + @code{nan ("@var{n-char-sequence}")} is equivalent to +@@ -1666,6 +1748,7 @@ + @comment math.h + @comment ISO + @deftypefn Macro int isgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro determines whether the argument @var{x} is greater than + @var{y}. It is equivalent to @code{(@var{x}) > (@var{y})}, but no + exception is raised if @var{x} or @var{y} are NaN. +@@ -1674,6 +1757,7 @@ + @comment math.h + @comment ISO + @deftypefn Macro int isgreaterequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro determines whether the argument @var{x} is greater than or + equal to @var{y}. It is equivalent to @code{(@var{x}) >= (@var{y})}, but no + exception is raised if @var{x} or @var{y} are NaN. +@@ -1682,6 +1766,7 @@ + @comment math.h + @comment ISO + @deftypefn Macro int isless (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro determines whether the argument @var{x} is less than @var{y}. + It is equivalent to @code{(@var{x}) < (@var{y})}, but no exception is + raised if @var{x} or @var{y} are NaN. +@@ -1690,6 +1775,7 @@ + @comment math.h + @comment ISO + @deftypefn Macro int islessequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro determines whether the argument @var{x} is less than or equal + to @var{y}. It is equivalent to @code{(@var{x}) <= (@var{y})}, but no + exception is raised if @var{x} or @var{y} are NaN. +@@ -1698,6 +1784,7 @@ + @comment math.h + @comment ISO + @deftypefn Macro int islessgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro determines whether the argument @var{x} is less or greater + than @var{y}. It is equivalent to @code{(@var{x}) < (@var{y}) || + (@var{x}) > (@var{y})} (although it only evaluates @var{x} and @var{y} +@@ -1710,6 +1797,7 @@ + @comment math.h + @comment ISO + @deftypefn Macro int isunordered (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro determines whether its arguments are unordered. In other + words, it is true if @var{x} or @var{y} are NaN, and false otherwise. + @end deftypefn +@@ -1743,6 +1831,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} fminl (long double @var{x}, long double @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fmin} function returns the lesser of the two values @var{x} + and @var{y}. It is similar to the expression + @smallexample +@@ -1763,6 +1852,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} fmaxl (long double @var{x}, long double @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fmax} function returns the greater of the two values @var{x} + and @var{y}. + +@@ -1779,6 +1869,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} fdiml (long double @var{x}, long double @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fdim} function returns the positive difference between + @var{x} and @var{y}. The positive difference is @math{@var{x} - + @var{y}} if @var{x} is greater than @var{y}, and @math{0} otherwise. +@@ -1796,6 +1887,7 @@ + @comment ISO + @deftypefunx {long double} fmal (long double @var{x}, long double @var{y}, long double @var{z}) + @cindex butterfly ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fma} function performs floating-point multiply-add. This is + the operation @math{(@var{x} @mul{} @var{y}) + @var{z}}, but the + intermediate result is not rounded to the destination type. This can +@@ -1925,6 +2017,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {long double} creall (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the real part of the complex number @var{z}. + @end deftypefun + +@@ -1937,6 +2030,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {long double} cimagl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the imaginary part of the complex number @var{z}. + @end deftypefun + +@@ -1949,6 +2043,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} conjl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the conjugate value of the complex number + @var{z}. The conjugate of a complex number has the same real part and a + negated imaginary part. In other words, @samp{conj(a + bi) = a + -bi}. +@@ -1963,6 +2058,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {long double} cargl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the argument of the complex number @var{z}. + The argument of a complex number is the angle in the complex plane + between the positive real axis and a line passing through zero and the +@@ -1981,8 +2077,9 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} cprojl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the projection of the complex value @var{z} onto +-the Riemann sphere. Values with a infinite imaginary part are projected ++the Riemann sphere. Values with an infinite imaginary part are projected + to positive infinity on the real axis, even if the real part is NaN. If + the real part is infinite, the result is equivalent to + +@@ -2026,6 +2123,15 @@ + @comment stdlib.h + @comment ISO + @deftypefun {long int} strtol (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c strtol uses the thread-local pointer to the locale in effect, and ++@c strtol_l loads the LC_NUMERIC locale data from it early on and once, ++@c but if the locale is the global locale, and another thread calls ++@c setlocale in a way that modifies the pointer to the LC_CTYPE locale ++@c category, the behavior of e.g. IS*, TOUPPER will vary throughout the ++@c execution of the function, because they re-read the locale data from ++@c the given locale pointer. We solved this by documenting setlocale as ++@c MT-Unsafe. + The @code{strtol} (``string-to-long'') function converts the initial + part of @var{string} to a signed integer, which is returned as a value + of type @code{long int}. +@@ -2089,6 +2195,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {long int} wcstol (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstol} function is equivalent to the @code{strtol} function + in nearly all aspects but handles wide character strings. + +@@ -2098,6 +2205,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun {unsigned long int} strtoul (const char *retrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{strtoul} (``string-to-unsigned-long'') function is like + @code{strtol} except it converts to an @code{unsigned long int} value. + The syntax is the same as described above for @code{strtol}. The value +@@ -2116,6 +2224,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {unsigned long int} wcstoul (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstoul} function is equivalent to the @code{strtoul} function + in nearly all aspects but handles wide character strings. + +@@ -2125,6 +2234,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun {long long int} strtoll (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{strtoll} function is like @code{strtol} except that it returns + a @code{long long int} value, and accepts numbers with a correspondingly + larger range. +@@ -2141,6 +2251,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {long long int} wcstoll (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstoll} function is equivalent to the @code{strtoll} function + in nearly all aspects but handles wide character strings. + +@@ -2150,12 +2261,14 @@ + @comment stdlib.h + @comment BSD + @deftypefun {long long int} strtoq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + @code{strtoq} (``string-to-quad-word'') is the BSD name for @code{strtoll}. + @end deftypefun + + @comment wchar.h + @comment GNU + @deftypefun {long long int} wcstoq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstoq} function is equivalent to the @code{strtoq} function + in nearly all aspects but handles wide character strings. + +@@ -2165,6 +2278,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun {unsigned long long int} strtoull (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{strtoull} function is related to @code{strtoll} the same way + @code{strtoul} is related to @code{strtol}. + +@@ -2174,6 +2288,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {unsigned long long int} wcstoull (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstoull} function is equivalent to the @code{strtoull} function + in nearly all aspects but handles wide character strings. + +@@ -2183,12 +2298,14 @@ + @comment stdlib.h + @comment BSD + @deftypefun {unsigned long long int} strtouq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + @code{strtouq} is the BSD name for @code{strtoull}. + @end deftypefun + + @comment wchar.h + @comment GNU + @deftypefun {unsigned long long int} wcstouq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstouq} function is equivalent to the @code{strtouq} function + in nearly all aspects but handles wide character strings. + +@@ -2198,6 +2315,7 @@ + @comment inttypes.h + @comment ISO + @deftypefun intmax_t strtoimax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{strtoimax} function is like @code{strtol} except that it returns + a @code{intmax_t} value, and accepts numbers of a corresponding range. + +@@ -2214,6 +2332,7 @@ + @comment wchar.h + @comment ISO + @deftypefun intmax_t wcstoimax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstoimax} function is equivalent to the @code{strtoimax} function + in nearly all aspects but handles wide character strings. + +@@ -2223,6 +2342,7 @@ + @comment inttypes.h + @comment ISO + @deftypefun uintmax_t strtoumax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{strtoumax} function is related to @code{strtoimax} + the same way that @code{strtoul} is related to @code{strtol}. + +@@ -2233,6 +2353,7 @@ + @comment wchar.h + @comment ISO + @deftypefun uintmax_t wcstoumax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstoumax} function is equivalent to the @code{strtoumax} function + in nearly all aspects but handles wide character strings. + +@@ -2242,6 +2363,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun {long int} atol (const char *@var{string}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + This function is similar to the @code{strtol} function with a @var{base} + argument of @code{10}, except that it need not detect overflow errors. + The @code{atol} function is provided mostly for compatibility with +@@ -2251,6 +2373,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun int atoi (const char *@var{string}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + This function is like @code{atol}, except that it returns an @code{int}. + The @code{atoi} function is also considered obsolete; use @code{strtol} + instead. +@@ -2259,6 +2382,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun {long long int} atoll (const char *@var{string}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + This function is similar to @code{atol}, except it returns a @code{long + long int}. + +@@ -2323,6 +2447,35 @@ + @comment stdlib.h + @comment ISO + @deftypefun double strtod (const char *restrict @var{string}, char **restrict @var{tailptr}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Besides the unsafe-but-ruled-safe locale uses, this uses a lot of ++@c mpn, but it's all safe. ++@c ++@c round_and_return ++@c get_rounding_mode ok ++@c mpn_add_1 ok ++@c mpn_rshift ok ++@c MPN_ZERO ok ++@c MPN2FLOAT -> mpn_construct_(float|double|long_double) ok ++@c str_to_mpn ++@c mpn_mul_1 -> umul_ppmm ok ++@c mpn_add_1 ok ++@c mpn_lshift_1 -> mpn_lshift ok ++@c STRTOF_INTERNAL ++@c MPN_VAR ok ++@c SET_MANTISSA ok ++@c STRNCASECMP ok, wide and narrow ++@c round_and_return ok ++@c mpn_mul ok ++@c mpn_addmul_1 ok ++@c ... mpn_sub ++@c mpn_lshift ok ++@c udiv_qrnnd ok ++@c count_leading_zeros ok ++@c add_ssaaaa ok ++@c sub_ddmmss ok ++@c umul_ppmm ok ++@c mpn_submul_1 ok + The @code{strtod} (``string-to-double'') function converts the initial + part of @var{string} to a floating-point number, which is returned as a + value of type @code{double}. +@@ -2408,6 +2561,7 @@ + @comment stdlib.h + @comment ISO + @deftypefunx {long double} strtold (const char *@var{string}, char **@var{tailptr}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + These functions are analogous to @code{strtod}, but return @code{float} + and @code{long double} values respectively. They report errors in the + same way as @code{strtod}. @code{strtof} can be substantially faster +@@ -2427,6 +2581,7 @@ + @comment stdlib.h + @comment ISO + @deftypefunx {long double} wcstold (const wchar_t *@var{string}, wchar_t **@var{tailptr}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + The @code{wcstod}, @code{wcstof}, and @code{wcstol} functions are + equivalent in nearly all aspect to the @code{strtod}, @code{strtof}, and + @code{strtold} functions but it handles wide character string. +@@ -2439,6 +2594,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun double atof (const char *@var{string}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + This function is similar to the @code{strtod} function, except that it + need not detect overflow and underflow errors. The @code{atof} function + is provided mostly for compatibility with existing code; using +@@ -2447,7 +2603,8 @@ + + @Theglibc{} also provides @samp{_l} versions of these functions, + which take an additional argument, the locale to use in conversion. +-@xref{Parsing of Integers}. ++ ++See also @ref{Parsing of Integers}. + + @node System V Number Conversion + @section Old-fashioned System V number-to-string functions +@@ -2465,9 +2622,10 @@ + @comment stdlib.h + @comment SVID, Unix98 + @deftypefun {char *} ecvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:ecvt}}@asunsafe{}@acsafe{}} + The function @code{ecvt} converts the floating-point number @var{value} + to a string with at most @var{ndigit} decimal digits. The +-returned string contains no decimal point or sign. The first digit of ++returned string contains no decimal point or sign. The first digit of + the string is non-zero (unless @var{value} is actually zero) and the + last digit is rounded to nearest. @code{*@var{decpt}} is set to the + index in the string of the first digit after the decimal point. +@@ -2490,6 +2648,7 @@ + @comment stdlib.h + @comment SVID, Unix98 + @deftypefun {char *} fcvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fcvt}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The function @code{fcvt} is like @code{ecvt}, but @var{ndigit} specifies + the number of digits after the decimal point. If @var{ndigit} is less + than zero, @var{value} is rounded to the @math{@var{ndigit}+1}'th place to the +@@ -2508,6 +2667,9 @@ + @comment stdlib.h + @comment SVID, Unix98 + @deftypefun {char *} gcvt (double @var{value}, int @var{ndigit}, char *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c gcvt calls sprintf, that ultimately calls vfprintf, which malloc()s ++@c args_value if it's too large, but gcvt never exercises this path. + @code{gcvt} is functionally equivalent to @samp{sprintf(buf, "%*g", + ndigit, value}. It is provided only for compatibility's sake. It + returns @var{buf}. +@@ -2522,6 +2684,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun {char *} qecvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:qecvt}}@asunsafe{}@acsafe{}} + This function is equivalent to @code{ecvt} except that it takes a + @code{long double} for the first parameter and that @var{ndigit} is + restricted by the precision of a @code{long double}. +@@ -2530,6 +2693,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun {char *} qfcvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:qfcvt}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This function is equivalent to @code{fcvt} except that it + takes a @code{long double} for the first parameter and that @var{ndigit} is + restricted by the precision of a @code{long double}. +@@ -2538,6 +2702,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun {char *} qgcvt (long double @var{value}, int @var{ndigit}, char *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is equivalent to @code{gcvt} except that it takes a + @code{long double} for the first parameter and that @var{ndigit} is + restricted by the precision of a @code{long double}. +@@ -2558,6 +2723,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int ecvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{ecvt_r} function is the same as @code{ecvt}, except + that it places its result into the user-specified buffer pointed to by + @var{buf}, with length @var{len}. The return value is @code{-1} in +@@ -2569,6 +2735,7 @@ + @comment stdlib.h + @comment SVID, Unix98 + @deftypefun int fcvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fcvt_r} function is the same as @code{fcvt}, except that it + places its result into the user-specified buffer pointed to by + @var{buf}, with length @var{len}. The return value is @code{-1} in +@@ -2580,6 +2747,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int qecvt_r (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{qecvt_r} function is the same as @code{qecvt}, except + that it places its result into the user-specified buffer pointed to by + @var{buf}, with length @var{len}. The return value is @code{-1} in +@@ -2591,6 +2759,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int qfcvt_r (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{qfcvt_r} function is the same as @code{qfcvt}, except + that it places its result into the user-specified buffer pointed to by + @var{buf}, with length @var{len}. The return value is @code{-1} in +diff -urN glibc-2.17-c758a686/manual/charset.texi glibc-2.17-c758a686/manual/charset.texi +--- glibc-2.17-c758a686/manual/charset.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/charset.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -504,6 +504,14 @@ + @comment wchar.h + @comment ISO + @deftypefun int mbsinit (const mbstate_t *@var{ps}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c ps is dereferenced once, unguarded. This would call for @mtsrace:ps, ++@c but since a single word-sized field is (atomically) accessed, any ++@c race here would be harmless. Other functions that take an optional ++@c mbstate_t* argument named ps are marked with @mtasurace:<func>/!ps, ++@c to indicate that the function uses a static buffer if ps is NULL. ++@c These could also have been marked with @mtsrace:ps, but we'll omit ++@c that for brevity, for it's somewhat redundant with the @mtasurace. + The @code{mbsinit} function determines whether the state object pointed + to by @var{ps} is in the initial state. If @var{ps} is a null pointer or + the object is in the initial state the return value is nonzero. Otherwise +@@ -559,6 +567,14 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t btowc (int @var{c}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c Calls btowc_fct or __fct; reads from locale, and from the ++@c get_gconv_fcts result multiple times. get_gconv_fcts calls ++@c __wcsmbs_load_conv to initialize the ctype if it's null. ++@c wcsmbs_load_conv takes a non-recursive wrlock before allocating ++@c memory for the fcts structure, initializing it, and then storing it ++@c in the locale object. The initialization involves dlopening and a ++@c lot more. + The @code{btowc} function (``byte to wide character'') converts a valid + single byte character @var{c} in the initial shift state into the wide + character equivalent using the conversion rules from the currently +@@ -615,6 +631,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int wctob (wint_t @var{c}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{wctob} function (``wide character to byte'') takes as the + parameter a valid wide character. If the multibyte representation for + this character in the initial state is exactly one byte long, the return +@@ -634,6 +651,7 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t mbrtowc (wchar_t *restrict @var{pwc}, const char *restrict @var{s}, size_t @var{n}, mbstate_t *restrict @var{ps}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mbrtowc/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + @cindex stateful + The @code{mbrtowc} function (``multibyte restartable to wide + character'') converts the next multibyte character in the string pointed +@@ -728,6 +746,7 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t mbrlen (const char *restrict @var{s}, size_t @var{n}, mbstate_t *@var{ps}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mbrlen/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{mbrlen} function (``multibyte restartable length'') computes + the number of at most @var{n} bytes starting at @var{s}, which form the + next valid and complete multibyte character. +@@ -786,7 +805,7 @@ + This function simply calls @code{mbrlen} for each multibyte character + in the string and counts the number of function calls. Please note that + we here use @code{MB_LEN_MAX} as the size argument in the @code{mbrlen} +-call. This is acceptable since a) this value is larger then the length of ++call. This is acceptable since a) this value is larger than the length of + the longest multibyte character sequence and b) we know that the string + @var{s} ends with a NUL byte, which cannot be part of any other multibyte + character sequence but the one representing the NUL wide character. +@@ -811,6 +830,50 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t wcrtomb (char *restrict @var{s}, wchar_t @var{wc}, mbstate_t *restrict @var{ps}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:wcrtomb/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c wcrtomb uses a static, non-thread-local unguarded state variable when ++@c PS is NULL. When a state is passed in, and it's not used ++@c concurrently in other threads, this function behaves safely as long ++@c as gconv modules don't bring MT safety issues of their own. ++@c Attempting to load gconv modules or to build conversion chains in ++@c signal handlers may encounter gconv databases or caches in a ++@c partially-updated state, and asynchronous cancellation may leave them ++@c in such states, besides leaking the lock that guards them. ++@c get_gconv_fcts ok ++@c wcsmbs_load_conv ok ++@c norm_add_slashes ok ++@c wcsmbs_getfct ok ++@c gconv_find_transform ok ++@c gconv_read_conf (libc_once) ++@c gconv_lookup_cache ok ++@c find_module_idx ok ++@c find_module ok ++@c gconv_find_shlib (ok) ++@c ->init_fct (assumed ok) ++@c gconv_get_builtin_trans ok ++@c gconv_release_step ok ++@c do_lookup_alias ok ++@c find_derivation ok ++@c derivation_lookup ok ++@c increment_counter ok ++@c gconv_find_shlib ok ++@c step->init_fct (assumed ok) ++@c gen_steps ok ++@c gconv_find_shlib ok ++@c dlopen (presumed ok) ++@c dlsym (presumed ok) ++@c step->init_fct (assumed ok) ++@c step->end_fct (assumed ok) ++@c gconv_get_builtin_trans ok ++@c gconv_release_step ok ++@c add_derivation ok ++@c gconv_close_transform ok ++@c gconv_release_step ok ++@c step->end_fct (assumed ok) ++@c gconv_release_shlib ok ++@c dlclose (presumed ok) ++@c gconv_release_cache ok ++@c ->tomb->__fct (assumed ok) + The @code{wcrtomb} function (``wide character restartable to + multibyte'') converts a single wide character into a multibyte string + corresponding to that wide character. +@@ -955,8 +1018,9 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t mbsrtowcs (wchar_t *restrict @var{dst}, const char **restrict @var{src}, size_t @var{len}, mbstate_t *restrict @var{ps}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mbsrtowcs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{mbsrtowcs} function (``multibyte string restartable to wide +-character string'') converts an NUL-terminated multibyte character ++character string'') converts a NUL-terminated multibyte character + string at @code{*@var{src}} into an equivalent wide character string, + including the NUL wide character at the end. The conversion is started + using the state information from the object pointed to by @var{ps} or +@@ -1039,6 +1103,7 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t wcsrtombs (char *restrict @var{dst}, const wchar_t **restrict @var{src}, size_t @var{len}, mbstate_t *restrict @var{ps}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:wcsrtombs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{wcsrtombs} function (``wide character string restartable to + multibyte string'') converts the NUL-terminated wide character string at + @code{*@var{src}} into an equivalent multibyte character string and +@@ -1084,6 +1149,7 @@ + @comment wchar.h + @comment GNU + @deftypefun size_t mbsnrtowcs (wchar_t *restrict @var{dst}, const char **restrict @var{src}, size_t @var{nmc}, size_t @var{len}, mbstate_t *restrict @var{ps}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mbsnrtowcs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{mbsnrtowcs} function is very similar to the @code{mbsrtowcs} + function. All the parameters are the same except for @var{nmc}, which is + new. The return value is the same as for @code{mbsrtowcs}. +@@ -1136,6 +1202,7 @@ + @comment wchar.h + @comment GNU + @deftypefun size_t wcsnrtombs (char *restrict @var{dst}, const wchar_t **restrict @var{src}, size_t @var{nwc}, size_t @var{len}, mbstate_t *restrict @var{ps}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:wcsnrtombs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{wcsnrtombs} function implements the conversion from wide + character strings to multibyte character strings. It is similar to + @code{wcsrtombs} but, just like @code{mbsnrtowcs}, it takes an extra +@@ -1280,6 +1347,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun int mbtowc (wchar_t *restrict @var{result}, const char *restrict @var{string}, size_t @var{size}) ++@safety{@prelim{}@mtunsafe{@mtasurace{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{mbtowc} (``multibyte to wide character'') function when called + with non-null @var{string} converts the first multibyte character + beginning at @var{string} to its corresponding wide character code. It +@@ -1314,6 +1382,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun int wctomb (char *@var{string}, wchar_t @var{wchar}) ++@safety{@prelim{}@mtunsafe{@mtasurace{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{wctomb} (``wide character to multibyte'') function converts + the wide character code @var{wchar} to its corresponding multibyte + character sequence, and stores the result in bytes starting at +@@ -1353,6 +1422,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun int mblen (const char *@var{string}, size_t @var{size}) ++@safety{@prelim{}@mtunsafe{@mtasurace{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{mblen} function with a non-null @var{string} argument returns + the number of bytes that make up the multibyte character beginning at + @var{string}, never examining more than @var{size} bytes. (The idea is +@@ -1391,6 +1461,9 @@ + @comment stdlib.h + @comment ISO + @deftypefun size_t mbstowcs (wchar_t *@var{wstring}, const char *@var{string}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c Odd... Although this was supposed to be non-reentrant, the internal ++@c state is not a static buffer, but an automatic variable. + The @code{mbstowcs} (``multibyte string to wide character string'') + function converts the null-terminated string of multibyte characters + @var{string} to an array of wide character codes, storing not more than +@@ -1431,6 +1504,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun size_t wcstombs (char *@var{string}, const wchar_t *@var{wstring}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} + The @code{wcstombs} (``wide character string to multibyte string'') + function converts the null-terminated wide character array @var{wstring} + into a string containing multibyte characters, storing not more than +@@ -1618,6 +1692,16 @@ + @comment iconv.h + @comment XPG2 + @deftypefun iconv_t iconv_open (const char *@var{tocode}, const char *@var{fromcode}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c Calls malloc if tocode and/or fromcode are too big for alloca. Calls ++@c strip and upstr on both, then gconv_open. strip and upstr call ++@c isalnum_l and toupper_l with the C locale. gconv_open may MT-safely ++@c tokenize toset, replace unspecified codesets with the current locale ++@c (possibly two different accesses), and finally it calls ++@c gconv_find_transform and initializes the gconv_t result with all the ++@c steps in the conversion sequence, running each one's initializer, ++@c destructing and releasing them all if anything fails. ++ + The @code{iconv_open} function has to be used before starting a + conversion. The two parameters this function takes determine the + source and destination character set for the conversion, and if the +@@ -1625,7 +1709,7 @@ + function returns a handle. + + If the wanted conversion is not available, the @code{iconv_open} function +-returns @code{(iconv_t) -1}. In this case the global variable ++returns @code{(iconv_t) -1}. In this case the global variable + @code{errno} can have the following values: + + @table @code +@@ -1682,6 +1766,12 @@ + @comment iconv.h + @comment XPG2 + @deftypefun int iconv_close (iconv_t @var{cd}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Calls gconv_close to destruct and release each of the conversion ++@c steps, release the gconv_t object, then call gconv_close_transform. ++@c Access to the gconv_t object is not guarded, but calling iconv_close ++@c concurrently with any other use is undefined. ++ + The @code{iconv_close} function frees all resources associated with the + handle @var{cd}, which must have been returned by a successful call to + the @code{iconv_open} function. +@@ -1708,6 +1798,10 @@ + @comment iconv.h + @comment XPG2 + @deftypefun size_t iconv (iconv_t @var{cd}, char **@var{inbuf}, size_t *@var{inbytesleft}, char **@var{outbuf}, size_t *@var{outbytesleft}) ++@safety{@prelim{}@mtsafe{@mtsrace{:cd}}@assafe{}@acunsafe{@acucorrupt{}}} ++@c Without guarding access to the iconv_t object pointed to by cd, call ++@c the conversion function to convert inbuf or flush the internal ++@c conversion state. + @cindex stateful + The @code{iconv} function converts the text in the input buffer + according to the rules associated with the descriptor @var{cd} and +@@ -1744,7 +1838,7 @@ + Therefore an @code{iconv} call to reset the state should always be + performed if some protocol requires this for the output text. + +-The conversion stops for one of three reasons. The first is that all ++The conversion stops for one of three reasons. The first is that all + characters from the input buffer are converted. This actually can mean + two things: either all bytes from the input buffer are consumed or + there are some bytes at the end of the buffer that possibly can form a +@@ -2039,7 +2133,7 @@ + + Unfortunately, the answer is: there is no general solution. On some + systems guessing might help. On those systems most character sets can +-convert to and from UTF-8 encoded @w{ISO 10646} or Unicode text. Beside ++convert to and from UTF-8 encoded @w{ISO 10646} or Unicode text. Beside + this only some very system-specific methods can help. Since the + conversion functions come from loadable modules and these modules must + be stored somewhere in the filesystem, one @emph{could} try to find them +@@ -2239,7 +2333,7 @@ + + So far this section has described how modules are located and considered + to be used. What remains to be described is the interface of the modules +-so that one can write new ones. This section describes the interface as ++so that one can write new ones. This section describes the interface as + it is in use in January 1999. The interface will change a bit in the + future but, with luck, only in an upwardly compatible way. + +@@ -2485,7 +2579,7 @@ + same size, the minimum and maximum values are the same. + + @item __stateful +-This element must be initialized to an nonzero value if the source ++This element must be initialized to a nonzero value if the source + character set is stateful. Otherwise it must be zero. + @end table + +@@ -2824,7 +2918,7 @@ + /* @r{Run the conversion loop. @code{status} is set} + @r{appropriately afterwards.} */ + +- /* @r{If this is the last step, leave the loop. There is} ++ /* @r{If this is the last step, leave the loop. There is} + @r{nothing we can do.} */ + if (data->__is_last) + @{ +diff -urN glibc-2.17-c758a686/manual/check-safety.sh glibc-2.17-c758a686/manual/check-safety.sh +--- glibc-2.17-c758a686/manual/check-safety.sh 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/manual/check-safety.sh 2014-09-12 16:10:06.044792719 -0400 +@@ -0,0 +1,119 @@ ++#! /bin/sh ++ ++# Copyright 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 ++# <http://www.gnu.org/licenses/>. ++ ++ ++# Check that the @safety notes are self-consistent, i.e., that they're ++# in proper order (mt then as then ac), that remarks appear within ++# corresponding sections (mt within mt, etc), that unsafety always has ++# an explicit reason and when there's a reason for unsafety it's not ++# safe, and that there aren't duplicates remarks. ++ ++ ++success=: ++ ++# If no arguments are given, take all *.texi files in the current directory. ++test $# != 0 || set *.texi ++ ++# Check that all safety remarks have entries for all of MT, AS and AC, ++# in this order, with an optional prelim note before them. ++grep -n '^@safety' "$@" | ++grep -v ':@safety{\(@prelim{}\)\?@mt\(un\)\?safe{.*}'\ ++'@as\(un\)\?safe{.*}@ac\(un\)\?safe{.*}}' && ++success=false ++ ++# Check that @mt-started notes appear within @mtsafe or @mtunsafe, ++# that @as-started notes appear within @assafe or @asunsafe, and that ++# @ac-started notes appear within @acsafe or @acunsafe. Also check ++# that @mt, @as and @ac are followed by an s (for safe) or u (for ++# unsafe), but let @mt have as, ac or asc before [su], and let @as ++# have a c (for cancel) before [su]. Also make sure blanks separate ++# each of the annotations. ++grep -n '^@safety' "$@" | ++grep -v ':@safety{\(@prelim{}\)\?'\ ++'@mt\(un\)\?safe{\(@mt\(asc\?\|ac\)\?[su][^ ]*}\)\?'\ ++'\( @mt\(asc\?\|ac\)\?[su][^ ]*}\)*}'\ ++'@as\(un\)\?safe{\(@asc\?[su][^ ]*}\)\?'\ ++'\( @asc\?[su][^ ]*}\)*}'\ ++'@ac\(un\)\?safe{\(@ac[su][^ ]*}\)\?'\ ++'\( @ac[su][^ ]*}\)*}}' && ++success=false ++ ++# Make sure safety lines marked as @mtsafe do not contain any ++# MT-Unsafe remark; that would be @mtu, but there could be as, ac or ++# asc between mt and u. ++grep -n '^@safety.*@mtsafe' "$@" | ++grep '@mt\(asc\?\|ac\)?u' "$@" && ++success=false ++ ++# Make sure @mtunsafe lines contain at least one @mtu remark (with ++# optional as, ac or asc between mt and u). ++grep -n '^@safety.*@mtunsafe' "$@" | ++grep -v '@mtunsafe{.*@mt\(asc\?\|ac\)\?u' && ++success=false ++ ++# Make sure safety lines marked as @assafe do not contain any AS-Unsafe ++# remark, which could be @asu or @mtasu note (with an optional c ++# between as and u in both cases). ++grep -n '^@safety.*@assafe' "$@" | ++grep '@\(mt\)\?asc\?u' && ++success=false ++ ++# Make sure @asunsafe lines contain at least one @asu remark (which ++# could be @ascu, or @mtasu or even @mtascu). ++grep -n '^@safety.*@asunsafe' "$@" | ++grep -v '@mtasc\?u.*@asunsafe\|@asunsafe{.*@asc\?u' && ++success=false ++ ++# Make sure safety lines marked as @acsafe do not contain any ++# AC-Unsafe remark, which could be @acu, @ascu or even @mtacu or ++# @mtascu. ++grep -n '^@safety.*@acsafe' "$@" | ++grep '@\(mt\)\?as\?cu' && ++success=false ++ ++# Make sure @acunsafe lines contain at least one @acu remark (possibly ++# implied by @ascu, @mtacu or @mtascu). ++grep -n '^@safety.*@acunsafe' "$@" | ++grep -v '@\(mtas\?\|as\)cu.*@acunsafe\|@acunsafe{.*@acu' && ++success=false ++ ++# Make sure there aren't duplicate remarks in the same safety note. ++grep -n '^@safety' "$@" | ++grep '[^:]\(@\(mt\|a[sc]\)[^ {]*{[^ ]*}\).*[^:]\1' && ++success=false ++ ++# Check that comments containing safety remarks do not contain {}s, ++# that all @mt remarks appear before @as remarks, that in turn appear ++# before @ac remarks, all properly blank-separated, and that an ++# optional comment about exclusions is between []s at the end of the ++# line. ++grep -n '^@c \+[^@ ]\+\( dup\)\?'\ ++'\( @\(mt\|a[sc]\)[^ ]*\)*\( \[.*\]\)\?$' "$@" | ++grep -v ':@c *[^@{}]*\( @mt[^ {}]*\)*'\ ++'\( @as[^ {}]*\)*\( @ac[^ {}]*\)*\( \[.*\]\)\?$' && ++success=false ++ ++# Check that comments containing safety remarks do not contain ++# duplicate remarks. ++grep -n '^@c \+[^@ ]\+\( dup\)\?'\ ++'\( @\(mt\|a[sc]\)[^ ]*\)*\( \[.*\]\)\?$' "$@" | ++grep '[^:]\(@\(mt\|a[sc]\)[^ ]*\) \(.*[^:]\)\?\1\($\| \)' && ++success=false ++ ++$success +diff -urN glibc-2.17-c758a686/manual/conf.texi glibc-2.17-c758a686/manual/conf.texi +--- glibc-2.17-c758a686/manual/conf.texi 2014-09-12 16:08:17.965070383 -0400 ++++ glibc-2.17-c758a686/manual/conf.texi 2014-09-12 16:10:06.047792712 -0400 +@@ -114,7 +114,7 @@ + + @comment limits.h + @comment POSIX.1 +-@deftypevr Macro int SSIZE_MAX ++@deftypevr Macro ssize_t SSIZE_MAX + The largest value that can fit in an object of type @code{ssize_t}. + Effectively, this is the limit on the number of bytes that can be read + or written in a single operation. +@@ -288,6 +288,17 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {long int} sysconf (int @var{parameter}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c Some parts of the implementation open /proc and /sys files and dirs ++@c to collect system details, using fd and stream I/O depending on the ++@c case. _SC_TZNAME_MAX calls __tzname_max, that (while holding a lock) ++@c calls tzset_internal, that calls getenv if it's called the first ++@c time; there are free and strdup calls in there too. The returned max ++@c value may change over time for TZNAME_MAX, depending on selected ++@c timezones; NPROCS, NPROCS_CONF, PHYS_PAGES, AVPHYS_PAGES, ++@c NGROUPS_MAX, SIGQUEUE_MAX, depending on variable values read from ++@c /proc at each call, and from rlimit-obtained values CHILD_MAX, ++@c OPEN_MAX, ARG_MAX, SIGQUEUE_MAX. + This function is used to inquire about runtime system parameters. The + @var{parameter} argument should be one of the @samp{_SC_} symbols listed + below. +@@ -1121,7 +1132,7 @@ + have on @emph{any} POSIX system. @xref{File Minimums}. + + @cindex limits, link count of files +-@comment limits.h ++@comment limits.h (optional) + @comment POSIX.1 + @deftypevr Macro int LINK_MAX + The uniform system limit (if any) for the number of names for a given +@@ -1348,6 +1359,11 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {long int} pathconf (const char *@var{filename}, int @var{parameter}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c When __statfs_link_max finds an ext* filesystem, it may read ++@c /proc/mounts or similar as a mntent stream. ++@c __statfs_chown_restricted may read from ++@c /proc/sys/fs/xfs/restrict_chown as a file descriptor. + This function is used to inquire about the limits that apply to + the file named @var{filename}. + +@@ -1375,6 +1391,8 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {long int} fpathconf (int @var{filedes}, int @var{parameter}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c Same caveats as pathconf. + This is just like @code{pathconf} except that an open file descriptor + is used to specify the file for which information is requested, instead + of a file name. +@@ -1624,6 +1642,7 @@ + @comment unistd.h + @comment POSIX.2 + @deftypefun size_t confstr (int @var{parameter}, char *@var{buf}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function reads the value of a string-valued system parameter, + storing the string into @var{len} bytes of memory space starting at + @var{buf}. The @var{parameter} argument should be one of the +diff -urN glibc-2.17-c758a686/manual/crypt.texi glibc-2.17-c758a686/manual/crypt.texi +--- glibc-2.17-c758a686/manual/crypt.texi 2014-09-12 16:08:18.169069859 -0400 ++++ glibc-2.17-c758a686/manual/crypt.texi 2014-09-12 16:10:06.042792724 -0400 +@@ -30,15 +30,15 @@ + and the other based on the Data Encryption Standard (DES) that is + compatible with Unix systems. + +-@cindex AUTH_DES ++@vindex AUTH_DES + @cindex FIPS 140-2 + It also provides support for Secure RPC, and some library functions that +-can be used to perform normal DES encryption. The use of DES when +-using @code{AUTH_DES} in Secure RPC for authentication as provided by +-@theglibc{} is not FIPS 140-2 compliant nor is any other use of DES +-within @theglibc{}. It is recommended that Secure RPC should not be used +-for systems that need to be FIPS 140-2 compliant since all forms of +-supported authentication use normal DES. ++can be used to perform normal DES encryption. The @code{AUTH_DES} ++authentication flavor in Secure RPC, as provided by @theglibc{}, ++uses DES and does not comply with FIPS 140-2 nor does any other use of DES ++within @theglibc{}. It is recommended that Secure RPC should not be used ++for systems that need to comply with FIPS 140-2 since all flavors of ++encrypted authentication use normal DES. + + @menu + * Legal Problems:: This software can get you locked up, or worse. +@@ -99,6 +99,13 @@ + @comment unistd.h + @comment BSD + @deftypefun {char *} getpass (const char *@var{prompt}) ++@safety{@prelim{}@mtunsafe{@mtasuterm{}}@asunsafe{@ascuheap{} @asulock{} @asucorrupt{}}@acunsafe{@acuterm{} @aculock{} @acucorrupt{}}} ++@c This function will attempt to create a stream for terminal I/O, but ++@c will fallback to stdio/stderr. It attempts to change the terminal ++@c mode in a thread-unsafe way, write out the prompt, read the password, ++@c then restore the terminal mode. It has a cleanup to close the stream ++@c in case of (synchronous) cancellation, but not to restore the ++@c terminal mode. + + @code{getpass} outputs @var{prompt}, then reads a string in from the + terminal without echoing it. It tries to connect to the real terminal, +@@ -134,6 +141,13 @@ + @comment crypt.h + @comment BSD, SVID + @deftypefun {char *} crypt (const char *@var{key}, const char *@var{salt}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:crypt}}@asunsafe{@asucorrupt{} @asulock{} @ascuheap{} @ascudlopen{}}@acunsafe{@aculock{} @acsmem{}}} ++@c Besides the obvious problem of returning a pointer into static ++@c storage, the DES initializer takes an internal lock with the usual ++@c set of problems for AS- and AC-Safety. The FIPS mode checker and the ++@c NSS implementations of may leak file descriptors if canceled. The ++@c The MD5, SHA256 and SHA512 implementations will malloc on long keys, ++@c and NSS relies on dlopening, which brings about another can of worms. + + The @code{crypt} function takes a password, @var{key}, as a string, and + a @var{salt} character array which is described below, and returns a +@@ -195,6 +209,9 @@ + @comment crypt.h + @comment GNU + @deftypefun {char *} crypt_r (const char *@var{key}, const char *@var{salt}, {struct crypt_data *} @var{data}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @asulock{} @ascuheap{} @ascudlopen{}}@acunsafe{@aculock{} @acsmem{}}} ++@c Compared with crypt, this function fixes the @mtasurace:crypt ++@c problem, but nothing else. + + The @code{crypt_r} function does the same thing as @code{crypt}, but + takes an extra parameter which includes space for its result (among +@@ -241,6 +258,11 @@ + @comment crypt.h + @comment BSD, SVID + @deftypefun void setkey (const char *@var{key}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:crypt}}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@aculock{}}} ++@c The static buffer stores the key, making it fundamentally ++@c thread-unsafe. The locking issues are only in the initialization ++@c path; cancelling the initialization will leave the lock held, it ++@c would otherwise repeat the initialization on the next call. + + The @code{setkey} function sets an internal data structure to be an + expanded form of @var{key}. @var{key} is specified as an array of 64 +@@ -252,6 +274,8 @@ + @comment crypt.h + @comment BSD, SVID + @deftypefun void encrypt (char *@var{block}, int @var{edflag}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:crypt}}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@aculock{}}} ++@c Same issues as setkey. + + The @code{encrypt} function encrypts @var{block} if + @var{edflag} is 0, otherwise it decrypts @var{block}, using a key +@@ -265,9 +289,11 @@ + @comment crypt.h + @comment GNU + @deftypefun void setkey_r (const char *@var{key}, {struct crypt_data *} @var{data}) ++@c @safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@aculock{}}} + @comment crypt.h + @comment GNU + @deftypefunx void encrypt_r (char *@var{block}, int @var{edflag}, {struct crypt_data *} @var{data}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@aculock{}}} + + These are reentrant versions of @code{setkey} and @code{encrypt}. The + only difference is the extra parameter, which stores the expanded +@@ -282,6 +308,7 @@ + @comment rpc/des_crypt.h + @comment SUNRPC + @deftypefun int ecb_crypt (char *@var{key}, char *@var{blocks}, unsigned @var{len}, unsigned @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + The function @code{ecb_crypt} encrypts or decrypts one or more blocks + using DES. Each block is encrypted independently. +@@ -356,6 +383,7 @@ + @comment rpc/des_crypt.h + @comment SUNRPC + @deftypefun int DES_FAILED (int @var{err}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns 1 if @var{err} is a `success' result code from + @code{ecb_crypt} or @code{cbc_crypt}, and 0 otherwise. + @end deftypefun +@@ -363,6 +391,7 @@ + @comment rpc/des_crypt.h + @comment SUNRPC + @deftypefun int cbc_crypt (char *@var{key}, char *@var{blocks}, unsigned @var{len}, unsigned @var{mode}, char *@var{ivec}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + The function @code{cbc_crypt} encrypts or decrypts one or more blocks + using DES in Cipher Block Chaining mode. +@@ -389,6 +418,7 @@ + @comment rpc/des_crypt.h + @comment SUNRPC + @deftypefun void des_setparity (char *@var{key}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + The function @code{des_setparity} changes the 64-bit @var{key}, stored + packed in 8-bit bytes, to have odd parity by altering the low bits of +diff -urN glibc-2.17-c758a686/manual/ctype.texi glibc-2.17-c758a686/manual/ctype.texi +--- glibc-2.17-c758a686/manual/ctype.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/ctype.texi 2014-09-12 16:10:06.042792724 -0400 +@@ -66,6 +66,16 @@ + @comment ctype.h + @comment ISO + @deftypefun int islower (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c The is* macros call __ctype_b_loc to get the ctype array from the ++@c current locale, and then index it by c. __ctype_b_loc reads from ++@c thread-local memory the (indirect) pointer to the ctype array, which ++@c may involve one word access to the global locale object, if that's ++@c the active locale for the thread, and the array, being part of the ++@c locale data, is undeletable, so there's no thread-safety issue. We ++@c might want to mark these with @mtslocale to flag to callers that ++@c changing locales might affect them, even if not these simpler ++@c functions. + Returns true if @var{c} is a lower-case letter. The letter need not be + from the Latin alphabet, any alphabet representable is valid. + @end deftypefun +@@ -74,6 +84,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isupper (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is an upper-case letter. The letter need not be + from the Latin alphabet, any alphabet representable is valid. + @end deftypefun +@@ -82,6 +93,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isalpha (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is an alphabetic character (a letter). If + @code{islower} or @code{isupper} is true of a character, then + @code{isalpha} is also true. +@@ -97,6 +109,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isdigit (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a decimal digit (@samp{0} through @samp{9}). + @end deftypefun + +@@ -104,6 +117,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isalnum (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is an alphanumeric character (a letter or + number); in other words, if either @code{isalpha} or @code{isdigit} is + true of a character, then @code{isalnum} is also true. +@@ -113,6 +127,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isxdigit (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a hexadecimal digit. + Hexadecimal digits include the normal decimal digits @samp{0} through + @samp{9} and the letters @samp{A} through @samp{F} and +@@ -123,6 +138,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int ispunct (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a punctuation character. + This means any printing character that is not alphanumeric or a space + character. +@@ -132,6 +148,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isspace (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a @dfn{whitespace} character. In the standard + @code{"C"} locale, @code{isspace} returns true for only the standard + whitespace characters: +@@ -161,6 +178,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isblank (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a blank character; that is, a space or a tab. + This function was originally a GNU extension, but was added in @w{ISO C99}. + @end deftypefun +@@ -169,6 +187,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isgraph (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a graphic character; that is, a character + that has a glyph associated with it. The whitespace characters are not + considered graphic. +@@ -178,6 +197,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int isprint (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a printing character. Printing characters + include all the graphic characters, plus the space (@samp{ }) character. + @end deftypefun +@@ -186,6 +206,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int iscntrl (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a control character (that is, a character that + is not a printing character). + @end deftypefun +@@ -194,6 +215,7 @@ + @comment ctype.h + @comment SVID, BSD + @deftypefun int isascii (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns true if @var{c} is a 7-bit @code{unsigned char} value that fits + into the US/UK ASCII character set. This function is a BSD extension + and is also an SVID extension. +@@ -227,6 +249,10 @@ + @comment ctype.h + @comment ISO + @deftypefun int tolower (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c The to* macros/functions call different functions that use different ++@c arrays than those of__ctype_b_loc, but the access patterns and ++@c thus safety guarantees are the same. + If @var{c} is an upper-case letter, @code{tolower} returns the corresponding + lower-case letter. If @var{c} is not an upper-case letter, + @var{c} is returned unchanged. +@@ -235,6 +261,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int toupper (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If @var{c} is a lower-case letter, @code{toupper} returns the corresponding + upper-case letter. Otherwise @var{c} is returned unchanged. + @end deftypefun +@@ -242,6 +269,7 @@ + @comment ctype.h + @comment SVID, BSD + @deftypefun int toascii (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function converts @var{c} to a 7-bit @code{unsigned char} value + that fits into the US/UK ASCII character set, by clearing the high-order + bits. This function is a BSD extension and is also an SVID extension. +@@ -250,6 +278,7 @@ + @comment ctype.h + @comment SVID + @deftypefun int _tolower (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is identical to @code{tolower}, and is provided for compatibility + with the SVID. @xref{SVID}.@refill + @end deftypefun +@@ -257,6 +286,7 @@ + @comment ctype.h + @comment SVID + @deftypefun int _toupper (int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is identical to @code{toupper}, and is provided for compatibility + with the SVID. + @end deftypefun +@@ -303,6 +333,18 @@ + @comment wctype.h + @comment ISO + @deftypefun wctype_t wctype (const char *@var{property}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Although the source code of wctype contains multiple references to ++@c the locale, that could each reference different locale_data objects ++@c should the global locale object change while active, the compiler can ++@c and does combine them all into a single dereference that resolves ++@c once to the LCTYPE locale object used throughout the function, so it ++@c is safe in (optimized) practice, if not in theory, even when the ++@c locale changes. Ideally we'd explicitly save the resolved ++@c locale_data object to make it visibly safe instead of safe only under ++@c compiler optimizations, but given the decision that setlocale is ++@c MT-Unsafe, all this would afford us would be the ability to not mark ++@c this function with @mtslocale. + The @code{wctype} returns a value representing a class of wide + characters which is identified by the string @var{property}. Beside + some standard properties each locale can define its own ones. In case +@@ -331,6 +373,8 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswctype (wint_t @var{wc}, wctype_t @var{desc}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c The compressed lookup table returned by wctype is read-only. + This function returns a nonzero value if @var{wc} is in the character + class specified by @var{desc}. @var{desc} must previously be returned + by a successful call to @code{wctype}. +@@ -350,6 +394,16 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswalnum (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c The implicit wctype call in the isw* functions is actually an ++@c optimized version because the category has a known offset, but the ++@c wctype is equally safe when optimized, unsafe with changing locales ++@c if not optimized (thus @mtslocale). Since it's not a macro, we ++@c always optimize, and the locale can't change in any MT-Safe way, it's ++@c fine. The test whether wc is ASCII to use the non-wide is* ++@c macro/function doesn't bring any other safety issues: the test does ++@c not depend on the locale, and each path after the decision resolves ++@c the locale object only once. + This function returns a nonzero value if @var{wc} is an alphanumeric + character (a letter or number); in other words, if either @code{iswalpha} + or @code{iswdigit} is true of a character, then @code{iswalnum} is also +@@ -370,6 +424,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswalpha (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is an alphabetic character (a letter). If + @code{iswlower} or @code{iswupper} is true of a character, then + @code{iswalpha} is also true. +@@ -394,6 +449,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswcntrl (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a control character (that is, a character that + is not a printing character). + +@@ -412,6 +468,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswdigit (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a digit (e.g., @samp{0} through @samp{9}). + Please note that this function does not only return a nonzero value for + @emph{decimal} digits, but for all kinds of digits. A consequence is +@@ -442,6 +499,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswgraph (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a graphic character; that is, a character + that has a glyph associated with it. The whitespace characters are not + considered graphic. +@@ -461,6 +519,7 @@ + @comment ctype.h + @comment ISO + @deftypefun int iswlower (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a lower-case letter. The letter need not be + from the Latin alphabet, any alphabet representable is valid. + +@@ -479,6 +538,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswprint (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a printing character. Printing characters + include all the graphic characters, plus the space (@samp{ }) character. + +@@ -497,6 +557,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswpunct (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a punctuation character. + This means any printing character that is not alphanumeric or a space + character. +@@ -516,6 +577,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswspace (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a @dfn{whitespace} character. In the standard + @code{"C"} locale, @code{iswspace} returns true for only the standard + whitespace characters: +@@ -555,6 +617,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswupper (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is an upper-case letter. The letter need not be + from the Latin alphabet, any alphabet representable is valid. + +@@ -573,6 +636,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswxdigit (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a hexadecimal digit. + Hexadecimal digits include the normal decimal digits @samp{0} through + @samp{9} and the letters @samp{A} through @samp{F} and +@@ -597,6 +661,7 @@ + @comment wctype.h + @comment ISO + @deftypefun int iswblank (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + Returns true if @var{wc} is a blank character; that is, a space or a tab. + This function was originally a GNU extension, but was added in @w{ISO C99}. + It is declared in @file{wchar.h}. +@@ -691,6 +756,8 @@ + @comment wctype.h + @comment ISO + @deftypefun wctrans_t wctrans (const char *@var{property}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Similar implementation, same caveats as wctype. + The @code{wctrans} function has to be used to find out whether a named + mapping is defined in the current locale selected for the + @code{LC_CTYPE} category. If the returned value is non-zero, you can use +@@ -713,6 +780,8 @@ + @comment wctype.h + @comment ISO + @deftypefun wint_t towctrans (wint_t @var{wc}, wctrans_t @var{desc}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Same caveats as iswctype. + @code{towctrans} maps the input character @var{wc} + according to the rules of the mapping for which @var{desc} is a + descriptor, and returns the value it finds. @var{desc} must be +@@ -730,6 +799,9 @@ + @comment wctype.h + @comment ISO + @deftypefun wint_t towlower (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Same caveats as iswalnum, just using a wctrans rather than a wctype ++@c table. + If @var{wc} is an upper-case letter, @code{towlower} returns the corresponding + lower-case letter. If @var{wc} is not an upper-case letter, + @var{wc} is returned unchanged. +@@ -749,6 +821,7 @@ + @comment wctype.h + @comment ISO + @deftypefun wint_t towupper (wint_t @var{wc}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + If @var{wc} is a lower-case letter, @code{towupper} returns the corresponding + upper-case letter. Otherwise @var{wc} is returned unchanged. + +diff -urN glibc-2.17-c758a686/manual/debug.texi glibc-2.17-c758a686/manual/debug.texi +--- glibc-2.17-c758a686/manual/debug.texi 2014-09-12 16:08:17.824070745 -0400 ++++ glibc-2.17-c758a686/manual/debug.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -1,5 +1,5 @@ + @node Debugging Support +-@c @node Debugging Support, Internal Probes, Cryptographic Functions, Top ++@c @node Debugging Support, POSIX Threads, Cryptographic Functions, Top + @c %MENU% Functions to help debugging applications + @chapter Debugging support + +@@ -36,6 +36,16 @@ + @comment execinfo.h + @comment GNU + @deftypefun int backtrace (void **@var{buffer}, int @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{} @ascuheap{} @ascudlopen{} @ascuplugin{} @asulock{}}@acunsafe{@acuinit{} @acsmem{} @aculock{} @acsfd{}}} ++@c The generic implementation just does pointer chasing within the local ++@c stack, without any guarantees that this will handle signal frames ++@c correctly, so it's AS-Unsafe to begin with. However, most (all?) ++@c arches defer to libgcc_s's _Unwind_* implementation, dlopening ++@c libgcc_s.so to that end except in a static version of libc. ++@c libgcc_s's implementation may in turn defer to libunwind. We can't ++@c assume those implementations are AS- or AC-safe, but even if we ++@c could, our own initialization path isn't, and libgcc's implementation ++@c calls malloc and performs internal locking, so... + The @code{backtrace} function obtains a backtrace for the current + thread, as a list of pointers, and places the information into + @var{buffer}. The argument @var{size} should be the number of +@@ -56,6 +66,17 @@ + @comment execinfo.h + @comment GNU + @deftypefun {char **} backtrace_symbols (void *const *@var{buffer}, int @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @aculock{}}} ++@c Collects info returned by _dl_addr in an auto array, allocates memory ++@c for the whole return buffer with malloc then sprintfs into it storing ++@c pointers to the strings into the array entries in the buffer. ++@c _dl_addr takes the recursive dl_load_lock then calls ++@c _dl_find_dso_for_object and determine_info. ++@c _dl_find_dso_for_object calls _dl-addr_inside_object. ++@c All of them are safe as long as the lock is held. ++@c @asucorrupt? It doesn't look like the dynamic loader's data ++@c structures could be in an inconsistent state that would cause ++@c malfunction here. + The @code{backtrace_symbols} function translates the information + obtained from the @code{backtrace} function into an array of strings. + The argument @var{buffer} should be a pointer to an array of addresses +@@ -88,6 +109,11 @@ + @comment execinfo.h + @comment GNU + @deftypefun void backtrace_symbols_fd (void *const *@var{buffer}, int @var{size}, int @var{fd}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}} ++@c Single loop of _dl_addr over addresses, collecting info into an iovec ++@c written out with a writev call per iteration. Addresses and offsets ++@c are converted to hex in auto buffers, so the only potential issue ++@c here is leaking the dl lock in case of cancellation. + The @code{backtrace_symbols_fd} function performs the same translation + as the function @code{backtrace_symbols} function. Instead of returning + the strings to the caller, it writes the strings to the file descriptor +diff -urN glibc-2.17-c758a686/manual/errno.texi glibc-2.17-c758a686/manual/errno.texi +--- glibc-2.17-c758a686/manual/errno.texi 2014-09-12 16:08:17.752070930 -0400 ++++ glibc-2.17-c758a686/manual/errno.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -1293,6 +1293,9 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strerror (int @var{errnum}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:strerror}}@asunsafe{@ascuheap{} @ascuintl{}}@acunsafe{@acsmem{}}} ++@c Calls strerror_r with a static buffer allocated with malloc on the ++@c first use. + The @code{strerror} function maps the error code (@pxref{Checking for + Errors}) specified by the @var{errnum} argument to a descriptive error + message string. The return value is a pointer to this string. +@@ -1310,10 +1313,11 @@ + @comment string.h + @comment GNU + @deftypefun {char *} strerror_r (int @var{errnum}, char *@var{buf}, size_t @var{n}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuintl{}}@acunsafe{}} + The @code{strerror_r} function works like @code{strerror} but instead of + returning the error message in a statically allocated buffer shared by + all threads in the process, it returns a private copy for the +-thread. This might be either some permanent global data or a message ++thread. This might be either some permanent global data or a message + string in the user supplied buffer starting at @var{buf} with the + length of @var{n} bytes. + +@@ -1331,6 +1335,10 @@ + @comment stdio.h + @comment ISO + @deftypefun void perror (const char *@var{message}) ++@safety{@prelim{}@mtsafe{@mtasurace{:stderr}}@asunsafe{@asucorrupt{} @ascuintl{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c Besides strerror_r's and some of fprintf's issues, if stderr is not ++@c oriented yet, create a new stream with a dup of stderr's fd and write ++@c to that instead of stderr, to avoid orienting it. + This function prints an error message to the stream @code{stderr}; + see @ref{Standard Streams}. The orientation of @code{stderr} is not + changed. +@@ -1442,6 +1450,13 @@ + @comment error.h + @comment GNU + @deftypefun void error (int @var{status}, int @var{errnum}, const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @asuheap{} @asuintl{}}@acsafe{}} ++@c Cancellation is disabled throughout the execution. It flushes stdout ++@c and then holds a lock on stderr while printing the program name and ++@c then running error_tail. The non-wide case just runs vfprintf; the ++@c wide case converts the message to an alloca/malloc-allocated buffer ++@c with mbsrtowcs, then prints it with vfwprintf. Afterwards, ++@c print_errno_message calls strerror_r and fxprintf. + The @code{error} function can be used to report general problems during + program execution. The @var{format} argument is a format string just + like those given to the @code{printf} family of functions. The +@@ -1477,6 +1492,15 @@ + @comment error.h + @comment GNU + @deftypefun void error_at_line (int @var{status}, int @var{errnum}, const char *@var{fname}, unsigned int @var{lineno}, const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:error_at_line/error_one_per_line} @mtslocale{}}@asunsafe{@asucorrupt{} @asuheap{} @asuintl{}}@acunsafe{@acucorrupt{/error_one_per_line}}} ++@c The error_one_per_line variable is accessed (without any form of ++@c synchronization, but since it's an int used once, it should be safe ++@c enough) and, if this mode is enabled, static variables used to hold ++@c the last printed file name and line number are accessed and modified ++@c without synchronization; the update is not atomic and it occurs ++@c before disabling cancellation, so it can be interrupted after only ++@c one of the two variables is modified. After that, it's very much ++@c like error. + + The @code{error_at_line} function is very similar to the @code{error} + function. The only difference are the additional parameters @var{fname} +@@ -1508,7 +1532,7 @@ + + @comment error.h + @comment GNU +-@deftypevar {void (*) error_print_progname } (void) ++@deftypevar {void (*error_print_progname)} (void) + If the @code{error_print_progname} variable is defined to a non-zero + value the function pointed to is called by @code{error} or + @code{error_at_line}. It is expected to print the program name or do +@@ -1582,6 +1606,8 @@ + @comment err.h + @comment BSD + @deftypefun void warn (const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Just calls vwarn with the va_list. + The @code{warn} function is roughly equivalent to a call like + @smallexample + error (0, errno, format, @r{the parameters}) +@@ -1594,14 +1620,21 @@ + @comment err.h + @comment BSD + @deftypefun void vwarn (const char *@var{format}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c While holding stderr's recursive lock, it prints the programname, the ++@c given message, and the error string with fw?printf's %m. When the ++@c stream is wide, convert_and_print converts the format string to an ++@c alloca/malloc-created buffer using mbsrtowcs and then calls fwprintf. + The @code{vwarn} function is just like @code{warn} except that the + parameters for the handling of the format string @var{format} are passed +-in as an value of type @code{va_list}. ++in as a value of type @code{va_list}. + @end deftypefun + + @comment err.h + @comment BSD + @deftypefun void warnx (const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Same as warn, but without the strerror translation issues. + The @code{warnx} function is roughly equivalent to a call like + @smallexample + error (0, 0, format, @r{the parameters}) +@@ -1615,14 +1648,18 @@ + @comment err.h + @comment BSD + @deftypefun void vwarnx (const char *@var{format}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Same as vwarn, but without the strerror translation issues. + The @code{vwarnx} function is just like @code{warnx} except that the + parameters for the handling of the format string @var{format} are passed +-in as an value of type @code{va_list}. ++in as a value of type @code{va_list}. + @end deftypefun + + @comment err.h + @comment BSD + @deftypefun void err (int @var{status}, const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Same as warn followed by exit. + The @code{err} function is roughly equivalent to a call like + @smallexample + error (status, errno, format, @r{the parameters}) +@@ -1635,14 +1672,18 @@ + @comment err.h + @comment BSD + @deftypefun void verr (int @var{status}, const char *@var{format}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Same as vwarn followed by exit. + The @code{verr} function is just like @code{err} except that the + parameters for the handling of the format string @var{format} are passed +-in as an value of type @code{va_list}. ++in as a value of type @code{va_list}. + @end deftypefun + + @comment err.h + @comment BSD + @deftypefun void errx (int @var{status}, const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Same as warnx followed by exit. + The @code{errx} function is roughly equivalent to a call like + @smallexample + error (status, 0, format, @r{the parameters}) +@@ -1657,7 +1698,9 @@ + @comment err.h + @comment BSD + @deftypefun void verrx (int @var{status}, const char *@var{format}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c Same as vwarnx followed by exit. + The @code{verrx} function is just like @code{errx} except that the + parameters for the handling of the format string @var{format} are passed +-in as an value of type @code{va_list}. ++in as a value of type @code{va_list}. + @end deftypefun +diff -urN glibc-2.17-c758a686/manual/examples/add.c glibc-2.17-c758a686/manual/examples/add.c +--- glibc-2.17-c758a686/manual/examples/add.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/add.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Example of a Variadic Function +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/argp-ex1.c glibc-2.17-c758a686/manual/examples/argp-ex1.c +--- glibc-2.17-c758a686/manual/examples/argp-ex1.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/argp-ex1.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Argp example #1 -- a minimal program using argp +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/argp-ex2.c glibc-2.17-c758a686/manual/examples/argp-ex2.c +--- glibc-2.17-c758a686/manual/examples/argp-ex2.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/argp-ex2.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Argp example #2 -- a pretty minimal program using argp +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/argp-ex3.c glibc-2.17-c758a686/manual/examples/argp-ex3.c +--- glibc-2.17-c758a686/manual/examples/argp-ex3.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/argp-ex3.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Argp example #3 -- a program with options and arguments using argp +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/argp-ex4.c glibc-2.17-c758a686/manual/examples/argp-ex4.c +--- glibc-2.17-c758a686/manual/examples/argp-ex4.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/argp-ex4.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Argp example #4 -- a program with somewhat more complicated options +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/atexit.c glibc-2.17-c758a686/manual/examples/atexit.c +--- glibc-2.17-c758a686/manual/examples/atexit.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/atexit.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Cleanups on Exit +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/db.c glibc-2.17-c758a686/manual/examples/db.c +--- glibc-2.17-c758a686/manual/examples/db.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/db.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* User and Group Database Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/dir2.c glibc-2.17-c758a686/manual/examples/dir2.c +--- glibc-2.17-c758a686/manual/examples/dir2.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/dir2.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Simple Program to List a Directory, Mark II +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/dir.c glibc-2.17-c758a686/manual/examples/dir.c +--- glibc-2.17-c758a686/manual/examples/dir.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/dir.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Simple Program to List a Directory +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/execinfo.c glibc-2.17-c758a686/manual/examples/execinfo.c +--- glibc-2.17-c758a686/manual/examples/execinfo.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/execinfo.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Obtain a backtrace and print it. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/filecli.c glibc-2.17-c758a686/manual/examples/filecli.c +--- glibc-2.17-c758a686/manual/examples/filecli.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/filecli.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Example of Reading Datagrams +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/filesrv.c glibc-2.17-c758a686/manual/examples/filesrv.c +--- glibc-2.17-c758a686/manual/examples/filesrv.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/filesrv.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Datagram Socket Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/fmtmsgexpl.c glibc-2.17-c758a686/manual/examples/fmtmsgexpl.c +--- glibc-2.17-c758a686/manual/examples/fmtmsgexpl.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/fmtmsgexpl.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* How to use fmtmsg and addseverity. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/genpass.c glibc-2.17-c758a686/manual/examples/genpass.c +--- glibc-2.17-c758a686/manual/examples/genpass.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/genpass.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Encrypting Passwords +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/inetcli.c glibc-2.17-c758a686/manual/examples/inetcli.c +--- glibc-2.17-c758a686/manual/examples/inetcli.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/inetcli.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Byte Stream Socket Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/inetsrv.c glibc-2.17-c758a686/manual/examples/inetsrv.c +--- glibc-2.17-c758a686/manual/examples/inetsrv.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/inetsrv.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Byte Stream Connection Server Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/isockad.c glibc-2.17-c758a686/manual/examples/isockad.c +--- glibc-2.17-c758a686/manual/examples/isockad.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/isockad.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Internet Socket Example using sockaddr_in. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/longopt.c glibc-2.17-c758a686/manual/examples/longopt.c +--- glibc-2.17-c758a686/manual/examples/longopt.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/longopt.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Example of Parsing Long Options with getopt_long. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/memopen.c glibc-2.17-c758a686/manual/examples/memopen.c +--- glibc-2.17-c758a686/manual/examples/memopen.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/memopen.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* String Streams +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/memstrm.c glibc-2.17-c758a686/manual/examples/memstrm.c +--- glibc-2.17-c758a686/manual/examples/memstrm.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/memstrm.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* open_memstream example. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/mkfsock.c glibc-2.17-c758a686/manual/examples/mkfsock.c +--- glibc-2.17-c758a686/manual/examples/mkfsock.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/mkfsock.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Example of Local-Namespace Sockets +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +@@ -45,13 +45,12 @@ + + /* The size of the address is + the offset of the start of the filename, +- plus its length, +- plus one for the terminating null byte. ++ plus its length (not including the terminating null byte). + Alternatively you can just do: + size = SUN_LEN (&name); + */ + size = (offsetof (struct sockaddr_un, sun_path) +- + strlen (name.sun_path) + 1); ++ + strlen (name.sun_path)); + + if (bind (sock, (struct sockaddr *) &name, size) < 0) + { +diff -urN glibc-2.17-c758a686/manual/examples/mkisock.c glibc-2.17-c758a686/manual/examples/mkisock.c +--- glibc-2.17-c758a686/manual/examples/mkisock.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/mkisock.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Internet Socket Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/mygetpass.c glibc-2.17-c758a686/manual/examples/mygetpass.c +--- glibc-2.17-c758a686/manual/examples/mygetpass.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/mygetpass.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Reading Passwords +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/pipe.c glibc-2.17-c758a686/manual/examples/pipe.c +--- glibc-2.17-c758a686/manual/examples/pipe.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/pipe.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Creating a Pipe +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/popen.c glibc-2.17-c758a686/manual/examples/popen.c +--- glibc-2.17-c758a686/manual/examples/popen.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/popen.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Pipe to a Subprocess +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/rprintf.c glibc-2.17-c758a686/manual/examples/rprintf.c +--- glibc-2.17-c758a686/manual/examples/rprintf.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/rprintf.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Printf Extension Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/search.c glibc-2.17-c758a686/manual/examples/search.c +--- glibc-2.17-c758a686/manual/examples/search.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/search.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Searching and Sorting Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/select.c glibc-2.17-c758a686/manual/examples/select.c +--- glibc-2.17-c758a686/manual/examples/select.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/select.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Waiting for Input or Output +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/setjmp.c glibc-2.17-c758a686/manual/examples/setjmp.c +--- glibc-2.17-c758a686/manual/examples/setjmp.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/setjmp.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Introduction to Non-Local Exits +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/sigh1.c glibc-2.17-c758a686/manual/examples/sigh1.c +--- glibc-2.17-c758a686/manual/examples/sigh1.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/sigh1.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Signal Handlers that Return +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/sigusr.c glibc-2.17-c758a686/manual/examples/sigusr.c +--- glibc-2.17-c758a686/manual/examples/sigusr.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/sigusr.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Using kill for Communication +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/stpcpy.c glibc-2.17-c758a686/manual/examples/stpcpy.c +--- glibc-2.17-c758a686/manual/examples/stpcpy.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/stpcpy.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* stpcpy example. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/strdupa.c glibc-2.17-c758a686/manual/examples/strdupa.c +--- glibc-2.17-c758a686/manual/examples/strdupa.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/strdupa.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* strdupa example. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/strftim.c glibc-2.17-c758a686/manual/examples/strftim.c +--- glibc-2.17-c758a686/manual/examples/strftim.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/strftim.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Time Functions Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/strncat.c glibc-2.17-c758a686/manual/examples/strncat.c +--- glibc-2.17-c758a686/manual/examples/strncat.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/strncat.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* strncat example. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/subopt.c glibc-2.17-c758a686/manual/examples/subopt.c +--- glibc-2.17-c758a686/manual/examples/subopt.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/subopt.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Parsing of Suboptions Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/swapcontext.c glibc-2.17-c758a686/manual/examples/swapcontext.c +--- glibc-2.17-c758a686/manual/examples/swapcontext.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/swapcontext.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Complete Context Control +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/termios.c glibc-2.17-c758a686/manual/examples/termios.c +--- glibc-2.17-c758a686/manual/examples/termios.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/termios.c 2014-09-12 16:10:06.046792714 -0400 +@@ -1,5 +1,5 @@ + /* Noncanonical Mode Example +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/testopt.c glibc-2.17-c758a686/manual/examples/testopt.c +--- glibc-2.17-c758a686/manual/examples/testopt.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/testopt.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Example of Parsing Arguments with getopt. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/testpass.c glibc-2.17-c758a686/manual/examples/testpass.c +--- glibc-2.17-c758a686/manual/examples/testpass.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/testpass.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* Verify a password. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/examples/timeval_subtract.c glibc-2.17-c758a686/manual/examples/timeval_subtract.c +--- glibc-2.17-c758a686/manual/examples/timeval_subtract.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/examples/timeval_subtract.c 2014-09-12 16:10:06.047792712 -0400 +@@ -1,5 +1,5 @@ + /* struct timeval subtraction. +- Copyright (C) 1991-2012 Free Software Foundation, Inc. ++ Copyright (C) 1991-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License +diff -urN glibc-2.17-c758a686/manual/filesys.texi glibc-2.17-c758a686/manual/filesys.texi +--- glibc-2.17-c758a686/manual/filesys.texi 2014-09-12 16:08:17.966070381 -0400 ++++ glibc-2.17-c758a686/manual/filesys.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -58,6 +58,25 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {char *} getcwd (char *@var{buffer}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c If buffer is NULL, this function calls malloc and realloc, and, in ++@c case of error, free. Linux offers a getcwd syscall that we use on ++@c GNU/Linux systems, but it may fail if the pathname is too long. As a ++@c fallback, and on other systems, the generic implementation opens each ++@c parent directory with opendir, which allocates memory for the ++@c directory stream with malloc. If a fstatat64 syscall is not ++@c available, very deep directory trees may also have to malloc to build ++@c longer sequences of ../../../... than those supported by a global ++@c const read-only string. ++ ++@c linux/__getcwd ++@c posix/__getcwd ++@c malloc/realloc/free if buffer is NULL, or if dir is too deep ++@c lstat64 -> see its own entry ++@c fstatat64 ++@c direct syscall if possible, alloca+snprintf+*stat64 otherwise ++@c openat64_not_cancel_3, close_not_cancel_no_status ++@c __fdopendir, __opendir, __readdir, rewinddir + The @code{getcwd} function returns an absolute file name representing + the current working directory, storing it in the character array + @var{buffer} that you provide. The @var{size} argument is how you tell +@@ -116,6 +135,9 @@ + @comment unistd.h + @comment BSD + @deftypefn {Deprecated Function} {char *} getwd (char *@var{buffer}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @ascuintl{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c Besides the getcwd safety issues, it calls strerror_r on error, which ++@c brings in all of the i18n issues. + This is similar to @code{getcwd}, but has no way to specify the size of + the buffer. @Theglibc{} provides @code{getwd} only + for backwards compatibility with BSD. +@@ -130,6 +152,9 @@ + @comment unistd.h + @comment GNU + @deftypefun {char *} get_current_dir_name (void) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c Besides getcwd, which this function calls as a fallback, it calls ++@c getenv, with the potential thread-safety issues that brings about. + @vindex PWD + This @code{get_current_dir_name} function is basically equivalent to + @w{@code{getcwd (NULL, 0)}}. The only difference is that the value of +@@ -145,6 +170,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int chdir (const char *@var{filename}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is used to set the process's working directory to + @var{filename}. + +@@ -158,6 +184,7 @@ + @comment unistd.h + @comment XPG + @deftypefun int fchdir (int @var{filedes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is used to set the process's working directory to + directory associated with the file descriptor @var{filedes}. + +@@ -294,12 +321,14 @@ + @comment dirent.h + @comment BSD + @deftypefun int IFTODT (mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This returns the @code{d_type} value corresponding to @var{mode}. + @end deftypefun + + @comment dirent.h + @comment BSD + @deftypefun mode_t DTTOIF (int @var{dtype}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This returns the @code{st_mode} value corresponding to @var{dtype}. + @end deftypefun + @end table +@@ -342,6 +371,9 @@ + @comment dirent.h + @comment POSIX.1 + @deftypefun {DIR *} opendir (const char *@var{dirname}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c Besides the safe syscall, we have to allocate the DIR object with ++@c __alloc_dir, that calls malloc. + The @code{opendir} function opens and returns a directory stream for + reading the directory whose file name is @var{dirname}. The stream has + type @code{DIR *}. +@@ -381,6 +413,8 @@ + @comment dirent.h + @comment GNU + @deftypefun {DIR *} fdopendir (int @var{fd}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c The DIR object is allocated with __alloc_dir, that calls malloc. + The @code{fdopendir} function works just like @code{opendir} but + instead of taking a file name and opening a file descriptor for the + directory the caller is required to provide a file descriptor. This +@@ -425,6 +459,7 @@ + @comment dirent.h + @comment GNU + @deftypefun int dirfd (DIR *@var{dirstream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function @code{dirfd} returns the file descriptor associated with + the directory stream @var{dirstream}. This descriptor can be used until + the directory is closed with @code{closedir}. If the directory stream +@@ -443,6 +478,12 @@ + @comment dirent.h + @comment POSIX.1 + @deftypefun {struct dirent *} readdir (DIR *@var{dirstream}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:dirstream}}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c This function holds dirstream's non-recursive lock, which brings ++@c about the usual issues with locks and async signals and cancellation, ++@c but the lock taking is not enough to make the returned value safe to ++@c use, since it points to a stream's internal buffer that can be ++@c overwritten by subsequent calls or even released by closedir. + This function reads the next entry from the directory. It normally + returns a pointer to a structure containing information about the + file. This structure is associated with the @var{dirstream} handle +@@ -478,6 +519,7 @@ + @comment dirent.h + @comment GNU + @deftypefun int readdir_r (DIR *@var{dirstream}, struct dirent *@var{entry}, struct dirent **@var{result}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + This function is a version of @code{readdir} which performs internal + locking. Like @code{readdir} it returns the next entry from the + directory. To prevent conflicts between simultaneously running +@@ -549,6 +591,7 @@ + @comment dirent.h + @comment LFS + @deftypefun {struct dirent64 *} readdir64 (DIR *@var{dirstream}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:dirstream}}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + The @code{readdir64} function is just like the @code{readdir} function + except that it returns a pointer to a record of type @code{struct + dirent64}. Some of the members of this data type (notably @code{d_ino}) +@@ -560,6 +603,7 @@ + @comment dirent.h + @comment LFS + @deftypefun int readdir64_r (DIR *@var{dirstream}, struct dirent64 *@var{entry}, struct dirent64 **@var{result}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + The @code{readdir64_r} function is equivalent to the @code{readdir_r} + function except that it takes parameters of base type @code{struct + dirent64} instead of @code{struct dirent} in the second and third +@@ -570,6 +614,10 @@ + @comment dirent.h + @comment POSIX.1 + @deftypefun int closedir (DIR *@var{dirstream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{/hurd}}@acunsafe{@acsmem{} @acsfd{} @aculock{/hurd}}} ++@c No synchronization in the posix implementation, only in the hurd ++@c one. This is regarded as safe because it is undefined behavior if ++@c other threads could still be using the dir stream while it's closed. + This function closes the directory stream @var{dirstream}. It returns + @code{0} on success and @code{-1} on failure. + +@@ -609,6 +657,7 @@ + @comment dirent.h + @comment POSIX.1 + @deftypefun void rewinddir (DIR *@var{dirstream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + The @code{rewinddir} function is used to reinitialize the directory + stream @var{dirstream}, so that if you call @code{readdir} it + returns information about the first entry in the directory again. This +@@ -622,6 +671,10 @@ + @comment dirent.h + @comment BSD + @deftypefun {long int} telldir (DIR *@var{dirstream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd} @asulock{/bsd}}@acunsafe{@acsmem{/bsd} @aculock{/bsd}}} ++@c The implementation is safe on most platforms, but on BSD it uses ++@c cookies, buckets and records, and the global array of pointers to ++@c dynamically allocated records is guarded by a non-recursive lock. + The @code{telldir} function returns the file position of the directory + stream @var{dirstream}. You can use this value with @code{seekdir} to + restore the directory stream to that position. +@@ -630,6 +683,10 @@ + @comment dirent.h + @comment BSD + @deftypefun void seekdir (DIR *@var{dirstream}, long int @var{pos}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd} @asulock{/bsd}}@acunsafe{@acsmem{/bsd} @aculock{/bsd}}} ++@c The implementation is safe on most platforms, but on BSD it uses ++@c cookies, buckets and records, and the global array of pointers to ++@c dynamically allocated records is guarded by a non-recursive lock. + The @code{seekdir} function sets the file position of the directory + stream @var{dirstream} to @var{pos}. The value @var{pos} must be the + result of a previous call to @code{telldir} on this particular stream; +@@ -648,7 +705,20 @@ + + @comment dirent.h + @comment BSD/SVID +-@deftypefun int scandir (const char *@var{dir}, struct dirent ***@var{namelist}, int (*@var{selector}) (const struct dirent *), int (*@var{cmp}) (const void *, const void *)) ++@deftypefun int scandir (const char *@var{dir}, struct dirent ***@var{namelist}, int (*@var{selector}) (const struct dirent *), int (*@var{cmp}) (const struct dirent **, const struct dirent **)) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c The scandir function calls __opendirat, __readdir, and __closedir to ++@c go over the named dir; malloc and realloc to allocate the namelist ++@c and copies of each selected dirent, besides the selector, if given, ++@c and qsort and the cmp functions if the latter is given. In spite of ++@c the cleanup handler that releases memory and the file descriptor in ++@c case of synchronous cancellation, an asynchronous cancellation may ++@c still leak memory and a file descriptor. Although readdir is unsafe ++@c in general, the use of an internal dir stream for sequential scanning ++@c of the directory with copying of dirents before subsequent calls ++@c makes the use safe, and the fact that the dir stream is private to ++@c each scandir call does away with the lock issues in readdir and ++@c closedir. + + The @code{scandir} function scans the contents of the directory selected + by @var{dir}. The result in *@var{namelist} is an array of pointers to +@@ -678,7 +748,9 @@ + + @comment dirent.h + @comment BSD/SVID +-@deftypefun int alphasort (const void *@var{a}, const void *@var{b}) ++@deftypefun int alphasort (const struct dirent **@var{a}, const struct dirent **@var{b}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c Calls strcoll. + The @code{alphasort} function behaves like the @code{strcoll} function + (@pxref{String/Array Comparison}). The difference is that the arguments + are not string pointers but instead they are of type +@@ -690,7 +762,10 @@ + + @comment dirent.h + @comment GNU +-@deftypefun int versionsort (const void *@var{a}, const void *@var{b}) ++@deftypefun int versionsort (const struct dirent **@var{a}, const struct dirent **@var{b}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Calls strverscmp, which will accesses the locale object multiple ++@c times. + The @code{versionsort} function is like @code{alphasort} except that it + uses the @code{strverscmp} function internally. + @end deftypefun +@@ -702,7 +777,9 @@ + + @comment dirent.h + @comment GNU +-@deftypefun int scandir64 (const char *@var{dir}, struct dirent64 ***@var{namelist}, int (*@var{selector}) (const struct dirent64 *), int (*@var{cmp}) (const void *, const void *)) ++@deftypefun int scandir64 (const char *@var{dir}, struct dirent64 ***@var{namelist}, int (*@var{selector}) (const struct dirent64 *), int (*@var{cmp}) (const struct dirent64 **, const struct dirent64 **)) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c See scandir. + The @code{scandir64} function works like the @code{scandir} function + except that the directory entries it returns are described by elements + of type @w{@code{struct dirent64}}. The function pointed to by +@@ -720,7 +797,9 @@ + + @comment dirent.h + @comment GNU +-@deftypefun int alphasort64 (const void *@var{a}, const void *@var{b}) ++@deftypefun int alphasort64 (const struct dirent64 **@var{a}, const struct dirent **@var{b}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c See alphasort. + The @code{alphasort64} function behaves like the @code{strcoll} function + (@pxref{String/Array Comparison}). The difference is that the arguments + are not string pointers but instead they are of type +@@ -732,7 +811,9 @@ + + @comment dirent.h + @comment GNU +-@deftypefun int versionsort64 (const void *@var{a}, const void *@var{b}) ++@deftypefun int versionsort64 (const struct dirent64 **@var{a}, const struct dirent64 **@var{b}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c See versionsort. + The @code{versionsort64} function is like @code{alphasort64}, excepted that it + uses the @code{strverscmp} function internally. + @end deftypefun +@@ -812,7 +893,7 @@ + file does not exist. The situation for @code{nftw} is different. + + This value is only available if the program is compiled with +-@code{_BSD_SOURCE} or @code{_XOPEN_EXTENDED} defined before including ++@code{_XOPEN_EXTENDED} defined before including + the first header. The original SVID systems do not have symbolic links. + @end vtable + +@@ -913,6 +994,8 @@ + @comment ftw.h + @comment SVID + @deftypefun int ftw (const char *@var{filename}, __ftw_func_t @var{func}, int @var{descriptors}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c see nftw for safety details + The @code{ftw} function calls the callback function given in the + parameter @var{func} for every item which is found in the directory + specified by @var{filename} and all directories below. The function +@@ -963,6 +1046,7 @@ + @comment ftw.h + @comment Unix98 + @deftypefun int ftw64 (const char *@var{filename}, __ftw64_func_t @var{func}, int @var{descriptors}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} + This function is similar to @code{ftw} but it can work on filesystems + with large files. File information is reported using a variable of type + @code{struct stat64} which is passed by reference to the callback +@@ -976,6 +1060,17 @@ + @comment ftw.h + @comment XPG4.2 + @deftypefun int nftw (const char *@var{filename}, __nftw_func_t @var{func}, int @var{descriptors}, int @var{flag}) ++@safety{@prelim{}@mtsafe{@mtasscwd{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{} @acscwd{}}} ++@c ftw_startup calls alloca, malloc, free, xstat/lxstat, tdestroy, and ftw_dir ++@c if FTW_CHDIR, call open, and fchdir, or chdir and getcwd ++@c ftw_dir calls open_dir_stream, readdir64, process_entry, closedir ++@c if FTW_CHDIR, also calls fchdir ++@c open_dir_stream calls malloc, realloc, readdir64, free, closedir, ++@c then openat64_not_cancel_3 and fdopendir or opendir, then dirfd. ++@c process_entry may cal realloc, fxstatat/lxstat/xstat, ftw_dir, and ++@c find_object (tsearch) and add_object (tfind). ++@c Since each invocation of *ftw uses its own private search tree, none ++@c of the search tree concurrency issues apply. + The @code{nftw} function works like the @code{ftw} functions. They call + the callback function @var{func} for all items found in the directory + @var{filename} and below. At most @var{descriptors} file descriptors +@@ -1036,6 +1131,7 @@ + @comment ftw.h + @comment Unix98 + @deftypefun int nftw64 (const char *@var{filename}, __nftw64_func_t @var{func}, int @var{descriptors}, int @var{flag}) ++@safety{@prelim{}@mtsafe{@mtasscwd{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{} @acscwd{}}} + This function is similar to @code{nftw} but it can work on filesystems + with large files. File information is reported using a variable of type + @code{struct stat64} which is passed by reference to the callback +@@ -1079,6 +1175,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int link (const char *@var{oldname}, const char *@var{newname}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{link} function makes a new link to the existing file named by + @var{oldname}, under the new name @var{newname}. + +@@ -1186,6 +1283,7 @@ + @comment unistd.h + @comment BSD + @deftypefun int symlink (const char *@var{oldname}, const char *@var{newname}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{symlink} function makes a symbolic link to @var{oldname} named + @var{newname}. + +@@ -1222,7 +1320,8 @@ + + @comment unistd.h + @comment BSD +-@deftypefun int readlink (const char *@var{filename}, char *@var{buffer}, size_t @var{size}) ++@deftypefun ssize_t readlink (const char *@var{filename}, char *@var{buffer}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{readlink} function gets the value of the symbolic link + @var{filename}. The file name that the link points to is copied into + @var{buffer}. This file name string is @emph{not} null-terminated; +@@ -1282,6 +1381,8 @@ + @comment stdlib.h + @comment GNU + @deftypefun {char *} canonicalize_file_name (const char *@var{name}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c Calls realpath. + + The @code{canonicalize_file_name} function returns the absolute name of + the file named by @var{name} which contains no @code{.}, @code{..} +@@ -1323,6 +1424,8 @@ + @comment stdlib.h + @comment XPG + @deftypefun {char *} realpath (const char *restrict @var{name}, char *restrict @var{resolved}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c Calls malloc, realloc, getcwd, lxstat64, readlink, alloca. + + A call to @code{realpath} where the @var{resolved} parameter is + @code{NULL} behaves exactly like @code{canonicalize_file_name}. The +@@ -1362,6 +1465,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int unlink (const char *@var{filename}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{unlink} function deletes the file name @var{filename}. If + this is a file's sole name, the file itself is also deleted. (Actually, + if any process has the file open when this happens, deletion is +@@ -1404,6 +1508,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int rmdir (const char *@var{filename}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @cindex directories, deleting + @cindex deleting a directory + The @code{rmdir} function deletes a directory. The directory must be +@@ -1431,6 +1536,8 @@ + @comment stdio.h + @comment ISO + @deftypefun int remove (const char *@var{filename}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Calls unlink and rmdir. + This is the @w{ISO C} function to remove a file. It works like + @code{unlink} for files and like @code{rmdir} for directories. + @code{remove} is declared in @file{stdio.h}. +@@ -1446,6 +1553,10 @@ + @comment stdio.h + @comment ISO + @deftypefun int rename (const char *@var{oldname}, const char *@var{newname}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c In the absence of a rename syscall, there's an emulation with link ++@c and unlink, but it's racy, even more so if newname exists and is ++@c unlinked first. + The @code{rename} function renames the file @var{oldname} to + @var{newname}. The file formerly accessible under the name + @var{oldname} is afterwards accessible as @var{newname} instead. (If +@@ -1541,6 +1652,7 @@ + @comment sys/stat.h + @comment POSIX.1 + @deftypefun int mkdir (const char *@var{filename}, mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{mkdir} function creates a new, empty directory with name + @var{filename}. + +@@ -1882,6 +1994,7 @@ + @comment sys/stat.h + @comment POSIX.1 + @deftypefun int stat (const char *@var{filename}, struct stat *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{stat} function returns information about the attributes of the + file named by @w{@var{filename}} in the structure pointed to by @var{buf}. + +@@ -1908,8 +2021,9 @@ + @comment sys/stat.h + @comment Unix98 + @deftypefun int stat64 (const char *@var{filename}, struct stat64 *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{stat} but it is also able to work on +-files larger then @math{2^31} bytes on 32-bit systems. To be able to do ++files larger than @math{2^31} bytes on 32-bit systems. To be able to do + this the result is stored in a variable of type @code{struct stat64} to + which @var{buf} must point. + +@@ -1921,6 +2035,7 @@ + @comment sys/stat.h + @comment POSIX.1 + @deftypefun int fstat (int @var{filedes}, struct stat *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fstat} function is like @code{stat}, except that it takes an + open file descriptor as an argument instead of a file name. + @xref{Low-Level I/O}. +@@ -1942,6 +2057,7 @@ + @comment sys/stat.h + @comment Unix98 + @deftypefun int fstat64 (int @var{filedes}, struct stat64 *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{fstat} but is able to work on large + files on 32-bit platforms. For large files the file descriptor + @var{filedes} should be obtained by @code{open64} or @code{creat64}. +@@ -1953,9 +2069,16 @@ + replaces the interface for small files on 32-bit machines. + @end deftypefun + ++@c fstatat will call alloca and snprintf if the syscall is not ++@c available. ++@c @safety{@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++ + @comment sys/stat.h + @comment BSD + @deftypefun int lstat (const char *@var{filename}, struct stat *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct system call through lxstat, sometimes with an xstat conv call ++@c afterwards. + The @code{lstat} function is like @code{stat}, except that it does not + follow symbolic links. If @var{filename} is the name of a symbolic + link, @code{lstat} returns information about the link itself; otherwise +@@ -1969,8 +2092,11 @@ + @comment sys/stat.h + @comment Unix98 + @deftypefun int lstat64 (const char *@var{filename}, struct stat64 *@var{buf}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct system call through lxstat64, sometimes with an xstat conv ++@c call afterwards. + This function is similar to @code{lstat} but it is also able to work on +-files larger then @math{2^31} bytes on 32-bit systems. To be able to do ++files larger than @math{2^31} bytes on 32-bit systems. To be able to do + this the result is stored in a variable of type @code{struct stat64} to + which @var{buf} must point. + +@@ -2007,12 +2133,14 @@ + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_ISDIR (mode_t @var{m}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns non-zero if the file is a directory. + @end deftypefn + + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_ISCHR (mode_t @var{m}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns non-zero if the file is a character special file (a + device like a terminal). + @end deftypefn +@@ -2020,6 +2148,7 @@ + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_ISBLK (mode_t @var{m}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns non-zero if the file is a block special file (a device + like a disk). + @end deftypefn +@@ -2027,12 +2156,14 @@ + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_ISREG (mode_t @var{m}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns non-zero if the file is a regular file. + @end deftypefn + + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_ISFIFO (mode_t @var{m}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns non-zero if the file is a FIFO special file, or a + pipe. @xref{Pipes and FIFOs}. + @end deftypefn +@@ -2040,6 +2171,7 @@ + @comment sys/stat.h + @comment GNU + @deftypefn Macro int S_ISLNK (mode_t @var{m}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns non-zero if the file is a symbolic link. + @xref{Symbolic Links}. + @end deftypefn +@@ -2047,6 +2179,7 @@ + @comment sys/stat.h + @comment GNU + @deftypefn Macro int S_ISSOCK (mode_t @var{m}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns non-zero if the file is a socket. @xref{Sockets}. + @end deftypefn + +@@ -2129,6 +2262,7 @@ + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_TYPEISMQ (struct stat *@var{s}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If the system implement POSIX message queues as distinct objects and the + file is a message queue object, this macro returns a non-zero value. + In all other cases the result is zero. +@@ -2137,6 +2271,7 @@ + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_TYPEISSEM (struct stat *@var{s}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If the system implement POSIX semaphores as distinct objects and the + file is a semaphore object, this macro returns a non-zero value. + In all other cases the result is zero. +@@ -2145,8 +2280,9 @@ + @comment sys/stat.h + @comment POSIX + @deftypefn Macro int S_TYPEISSHM (struct stat *@var{s}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If the system implement POSIX shared memory objects as distinct objects +-and the file is an shared memory object, this macro returns a non-zero ++and the file is a shared memory object, this macro returns a non-zero + value. In all other cases the result is zero. + @end deftypefn + +@@ -2189,6 +2325,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int chown (const char *@var{filename}, uid_t @var{owner}, gid_t @var{group}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{chown} function changes the owner of the file @var{filename} to + @var{owner}, and its group owner to @var{group}. + +@@ -2222,7 +2359,8 @@ + + @comment unistd.h + @comment BSD +-@deftypefun int fchown (int @var{filedes}, int @var{owner}, int @var{group}) ++@deftypefun int fchown (int @var{filedes}, uid_t @var{owner}, gid_t @var{group}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is like @code{chown}, except that it changes the owner of the open + file with descriptor @var{filedes}. + +@@ -2502,6 +2641,7 @@ + @comment sys/stat.h + @comment POSIX.1 + @deftypefun mode_t umask (mode_t @var{mask}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{umask} function sets the file creation mask of the current + process to @var{mask}, and returns the previous value of the file + creation mask. +@@ -2527,6 +2667,7 @@ + @comment sys/stat.h + @comment GNU + @deftypefun mode_t getumask (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Return the current value of the file creation mask for the current + process. This function is a GNU extension and is only available on + @gnuhurdsystems{}. +@@ -2535,6 +2676,7 @@ + @comment sys/stat.h + @comment POSIX.1 + @deftypefun int chmod (const char *@var{filename}, mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{chmod} function sets the access permission bits for the file + named by @var{filename} to @var{mode}. + +@@ -2574,7 +2716,8 @@ + + @comment sys/stat.h + @comment BSD +-@deftypefun int fchmod (int @var{filedes}, int @var{mode}) ++@deftypefun int fchmod (int @var{filedes}, mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is like @code{chmod}, except that it changes the permissions of the + currently open file given by @var{filedes}. + +@@ -2645,6 +2788,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int access (const char *@var{filename}, int @var{how}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{access} function checks to see whether the file named by + @var{filename} can be accessed in the way specified by the @var{how} + argument. The @var{how} argument either can be the bitwise OR of the +@@ -2746,7 +2890,7 @@ + need to include the header file @file{utime.h} to use this facility. + @pindex utime.h + +-@comment time.h ++@comment utime.h + @comment POSIX.1 + @deftp {Data Type} {struct utimbuf} + The @code{utimbuf} structure is used with the @code{utime} function to +@@ -2762,9 +2906,12 @@ + @end table + @end deftp + +-@comment time.h ++@comment utime.h + @comment POSIX.1 + @deftypefun int utime (const char *@var{filename}, const struct utimbuf *@var{times}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c In the absence of a utime syscall, it non-atomically converts times ++@c to a struct timeval and calls utimes. + This function is used to modify the file times associated with the file + named @var{filename}. + +@@ -2815,7 +2962,11 @@ + + @comment sys/time.h + @comment BSD +-@deftypefun int utimes (const char *@var{filename}, struct timeval @var{tvp}@t{[2]}) ++@deftypefun int utimes (const char *@var{filename}, const struct timeval @var{tvp}@t{[2]}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c In the absence of a utimes syscall, it non-atomically converts tvp ++@c to struct timespec array and issues a utimensat syscall, or to ++@c struct utimbuf and calls utime. + This function sets the file access and modification times of the file + @var{filename}. The new file access time is specified by + @code{@var{tvp}[0]}, and the new modification time by +@@ -2829,7 +2980,10 @@ + + @comment sys/time.h + @comment BSD +-@deftypefun int lutimes (const char *@var{filename}, struct timeval @var{tvp}@t{[2]}) ++@deftypefun int lutimes (const char *@var{filename}, const struct timeval @var{tvp}@t{[2]}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Since there's no lutimes syscall, it non-atomically converts tvp ++@c to struct timespec array and issues a utimensat syscall. + This function is like @code{utimes}, except that it does not follow + symbolic links. If @var{filename} is the name of a symbolic link, + @code{lutimes} sets the file access and modification times of the +@@ -2845,7 +2999,11 @@ + + @comment sys/time.h + @comment BSD +-@deftypefun int futimes (int @var{fd}, struct timeval @var{tvp}@t{[2]}) ++@deftypefun int futimes (int @var{fd}, const struct timeval @var{tvp}@t{[2]}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Since there's no futimes syscall, it non-atomically converts tvp ++@c to struct timespec array and issues a utimensat syscall, falling back ++@c to utimes on a /proc/self/fd symlink. + This function is like @code{utimes}, except that it takes an open file + descriptor as an argument instead of a file name. @xref{Low-Level + I/O}. This function comes from FreeBSD, and is not available on all +@@ -2900,6 +3058,8 @@ + @comment unistd.h + @comment X/Open + @deftypefun int truncate (const char *@var{filename}, off_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c In the absence of a truncate syscall, we use open and ftruncate. + + The @code{truncate} function changes the size of @var{filename} to + @var{length}. If @var{length} is shorter than the previous length, data +@@ -2944,6 +3104,8 @@ + @comment unistd.h + @comment Unix98 + @deftypefun int truncate64 (const char *@var{name}, off64_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c In the absence of a syscall, try truncate if length fits. + This function is similar to the @code{truncate} function. The + difference is that the @var{length} argument is 64 bits wide even on 32 + bits machines, which allows the handling of files with sizes up to +@@ -2957,6 +3119,7 @@ + @comment unistd.h + @comment POSIX + @deftypefun int ftruncate (int @var{fd}, off_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + This is like @code{truncate}, but it works on a file descriptor @var{fd} + for an opened file instead of a file name to identify the object. The +@@ -3021,6 +3184,8 @@ + @comment unistd.h + @comment Unix98 + @deftypefun int ftruncate64 (int @var{id}, off64_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c In the absence of a syscall, try ftruncate if length fits. + This function is similar to the @code{ftruncate} function. The + difference is that the @var{length} argument is 64 bits wide even on 32 + bits machines which allows the handling of files with sizes up to +@@ -3082,7 +3247,11 @@ + + @comment sys/stat.h + @comment BSD +-@deftypefun int mknod (const char *@var{filename}, int @var{mode}, int @var{dev}) ++@deftypefun int mknod (const char *@var{filename}, mode_t @var{mode}, dev_t @var{dev}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Instead of issuing the syscall directly, we go through xmknod. ++@c Although the internal xmknod takes a dev_t*, that could lead to ++@c @mtsrace races, it's passed a pointer to mknod's dev. + The @code{mknod} function makes a special file with name @var{filename}. + The @var{mode} specifies the mode of the file, and may include the various + special file bits, such as @code{S_IFCHR} (for a character special file) +@@ -3134,6 +3303,20 @@ + @comment stdio.h + @comment ISO + @deftypefun {FILE *} tmpfile (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @acsfd{} @aculock{}}} ++@c The unsafety issues are those of fdopen, plus @acsfd because of the ++@c open. ++@c __path_search (internal buf, !dir, const pfx, !try_tmpdir) ok ++@c libc_secure_genenv only if try_tmpdir ++@c xstat64, strlen, strcmp, sprintf ++@c __gen_tempname (internal tmpl, __GT_FILE) ok ++@c strlen, memcmp, getpid, open/mkdir/lxstat64 ok ++@c HP_TIMING_NOW if available ok ++@c gettimeofday (!tz) first time, or every time if no HP_TIMING_NOW ok ++@c static value is used and modified without synchronization ok ++@c but the use is as a source of non-cryptographic randomness ++@c with retries in case of collision, so it should be safe ++@c unlink, fdopen + This function creates a temporary binary file for update mode, as if by + calling @code{fopen} with mode @code{"wb+"}. The file is deleted + automatically when it is closed or when the program terminates. (On +@@ -3150,9 +3333,10 @@ + @comment stdio.h + @comment Unix98 + @deftypefun {FILE *} tmpfile64 (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @acsfd{} @aculock{}}} + This function is similar to @code{tmpfile}, but the stream it returns a + pointer to was opened using @code{tmpfile64}. Therefore this stream can +-be used for files larger then @math{2^31} bytes on 32-bit machines. ++be used for files larger than @math{2^31} bytes on 32-bit machines. + + Please note that the return type is still @code{FILE *}. There is no + special @code{FILE} type for the LFS interface. +@@ -3165,6 +3349,11 @@ + @comment stdio.h + @comment ISO + @deftypefun {char *} tmpnam (char *@var{result}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:tmpnam/!result}}@asunsafe{}@acsafe{}} ++@c The passed-in buffer should not be modified concurrently with the ++@c call. ++@c __path_search (static or passed-in buf, !dir, !pfx, !try_tmpdir) ok ++@c __gen_tempname (internal tmpl, __GT_NOCREATE) ok + This function constructs and returns a valid file name that does not + refer to any existing file. If the @var{result} argument is a null + pointer, the return value is a pointer to an internal static string, +@@ -3189,6 +3378,7 @@ + @comment stdio.h + @comment GNU + @deftypefun {char *} tmpnam_r (char *@var{result}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is nearly identical to the @code{tmpnam} function, except + that if @var{result} is a null pointer it returns a null pointer. + +@@ -3225,6 +3415,13 @@ + @comment stdio.h + @comment SVID + @deftypefun {char *} tempnam (const char *@var{dir}, const char *@var{prefix}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c There's no way (short of being setuid) to avoid getenv("TMPDIR"), ++@c even with a non-NULL dir. ++@c ++@c __path_search (internal buf, dir, pfx, try_tmpdir) unsafe getenv ++@c __gen_tempname (internal tmpl, __GT_NOCREATE) ok ++@c strdup + This function generates a unique temporary file name. If @var{prefix} + is not a null pointer, up to five characters of this string are used as + a prefix for the file name. The return value is a string newly +@@ -3288,6 +3485,8 @@ + @comment stdlib.h + @comment Unix + @deftypefun {char *} mktemp (char *@var{template}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c __gen_tempname (caller tmpl, __GT_NOCREATE) ok + The @code{mktemp} function generates a unique file name by modifying + @var{template} as described above. If successful, it returns + @var{template} as modified. If @code{mktemp} cannot find a unique file +@@ -3306,6 +3505,8 @@ + @comment stdlib.h + @comment BSD + @deftypefun int mkstemp (char *@var{template}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} ++@c __gen_tempname (caller tmpl, __GT_FILE) ok + The @code{mkstemp} function generates a unique file name just as + @code{mktemp} does, but it also opens the file for you with @code{open} + (@pxref{Opening and Closing Files}). If successful, it modifies +@@ -3328,6 +3529,8 @@ + @comment stdlib.h + @comment BSD + @deftypefun {char *} mkdtemp (char *@var{template}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c __gen_tempname (caller tmpl, __GT_DIR) ok + The @code{mkdtemp} function creates a directory with a unique name. If + it succeeds, it overwrites @var{template} with the name of the + directory, and returns @var{template}. As with @code{mktemp} and +@@ -3349,3 +3552,23 @@ + @xref{Creating Directories}. + + The @code{mkdtemp} function comes from OpenBSD. ++ ++@c FIXME these are undocumented: ++@c faccessat ++@c fchmodat ++@c fchownat ++@c futimesat ++@c fstatat (there's a commented-out safety assessment for this one) ++@c linkat ++@c mkdirat ++@c mkfifoat ++@c name_to_handle_at ++@c openat ++@c open_by_handle_at ++@c readlinkat ++@c renameat ++@c scandirat ++@c symlinkat ++@c unlinkat ++@c utimensat ++@c mknodat +diff -urN glibc-2.17-c758a686/manual/freemanuals.texi glibc-2.17-c758a686/manual/freemanuals.texi +--- glibc-2.17-c758a686/manual/freemanuals.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/freemanuals.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -1,4 +1,7 @@ +-@appendix Free Software Needs Free Documentation ++@c freemanuals.texi - blurb for free documentation. ++@c This file is intended to be included within another document, ++@c hence no sectioning command or @node. ++ + @cindex free documentation + + The biggest deficiency in the free software community today is not in +diff -urN glibc-2.17-c758a686/manual/getopt.texi glibc-2.17-c758a686/manual/getopt.texi +--- glibc-2.17-c758a686/manual/getopt.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/getopt.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -59,7 +59,29 @@ + + @comment unistd.h + @comment POSIX.2 +-@deftypefun int getopt (int @var{argc}, char **@var{argv}, const char *@var{options}) ++@deftypefun int getopt (int @var{argc}, char *const *@var{argv}, const char *@var{options}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:getopt} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} ++@c Swapping elements of passed-in argv may be partial in case of ++@c cancellation. Gettext brings about a whole lot of AS and AC safety ++@c issues. The getopt API involves returning values in the ++@c non-thread-specific optarg variable, which adds another thread-safety ++@c issue. Given print_errors, it may output errors to stderr, which may ++@c self-deadlock, leak locks, or encounter (in a signal handler) or ++@c leave (in case of cancellation) stderr in an inconsistent state. ++@c Various implicit, indirect uses of malloc, in uses of memstream and ++@c asprintf for error-printing, bring about the usual malloc issues. ++@c (The explicit use of malloc in a conditional situation in ++@c _getopt_initialize is never exercised in glibc.) ++@c ++@c _getopt_internal ++@c _getopt_internal_r ++@c gettext ++@c _getopt_initialize ++@c getenv ++@c malloc if USE_NONOPTION_FLAGS, never defined in libc ++@c open_memstream ++@c lockfile, unlockfile, __fxprintf -> stderr ++@c asprintf + The @code{getopt} function gets the next option argument from the + argument list specified by the @var{argv} and @var{argc} arguments. + Normally these values come directly from the arguments received by +@@ -225,6 +247,8 @@ + @comment getopt.h + @comment GNU + @deftypefun int getopt_long (int @var{argc}, char *const *@var{argv}, const char *@var{shortopts}, const struct option *@var{longopts}, int *@var{indexptr}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:getopt} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} ++@c Same issues as getopt. + Decode options from the vector @var{argv} (whose length is @var{argc}). + The argument @var{shortopts} describes the short options to accept, just as + it does in @code{getopt}. The argument @var{longopts} describes the long +@@ -278,6 +302,8 @@ + @comment getopt.h + @comment GNU + @deftypefun int getopt_long_only (int @var{argc}, char *const *@var{argv}, const char *@var{shortopts}, const struct option *@var{longopts}, int *@var{indexptr}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:getopt} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} ++@c Same issues as getopt. + + The @code{getopt_long_only} function is equivalent to the + @code{getopt_long} function but it allows to specify the user of the +diff -urN glibc-2.17-c758a686/manual/install-plain.texi glibc-2.17-c758a686/manual/install-plain.texi +--- glibc-2.17-c758a686/manual/install-plain.texi 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/manual/install-plain.texi 2014-09-12 16:10:06.046792714 -0400 +@@ -0,0 +1,5 @@ ++@c This is for making the `INSTALL' file for the distribution. ++@c Makeinfo ignores it when processing the file from the include. ++@setfilename INSTALL ++@set plain ++@include install.texi +diff -urN glibc-2.17-c758a686/manual/install.texi glibc-2.17-c758a686/manual/install.texi +--- glibc-2.17-c758a686/manual/install.texi 2014-09-12 16:08:17.783070851 -0400 ++++ glibc-2.17-c758a686/manual/install.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -1,10 +1,10 @@ +-@c This is for making the `INSTALL' file for the distribution. +-@c Makeinfo ignores it when processing the file from the include. +-@setfilename INSTALL + @include macros.texi + @include pkgvers.texi + ++@ifclear plain + @node Installation, Maintenance, Library Summary, Top ++@end ifclear ++ + @c %MENU% How to install the GNU C Library + @appendix Installing @theglibc{} + +@@ -21,6 +21,7 @@ + You will need recent versions of several GNU tools: definitely GCC and + GNU Make, and possibly others. @xref{Tools for Compilation}, below. + ++@ifclear plain + @menu + * Configuring and compiling:: How to compile and test GNU libc. + * Running make install:: How to install it once you've got it +@@ -29,6 +30,7 @@ + * Linux:: Specific advice for GNU/Linux systems. + * Reporting Bugs:: So they'll get fixed. + @end menu ++@end ifclear + + @node Configuring and compiling + @appendixsec Configuring and compiling @theglibc{} +@@ -138,11 +140,6 @@ + Don't build libraries with profiling information. You may want to use + this option if you don't plan to do profiling. + +-@item --disable-versioning +-Don't compile the shared libraries with symbol version information. +-Doing this will make the resulting library incompatible with old +-binaries, so it's not recommended. +- + @item --enable-static-nss + Compile static versions of the NSS (Name Service Switch) libraries. + This is not recommended because it defeats the purpose of NSS; a program +@@ -155,6 +152,14 @@ + prevented though there generally is no reason since it creates + compatibility problems. + ++@item --enable-hardcoded-path-in-tests ++By default, dynamic tests are linked to run with the installed C library. ++This option hardcodes the newly built C library path in dynamic tests ++so that they can be invoked directly. ++ ++@item --enable-lock-elision=yes ++Enable lock elision for pthread mutexes by default. ++ + @pindex pt_chown + @findex grantpt + @item --enable-pt_chown +@@ -180,11 +185,11 @@ + + If you only specify @samp{--host}, @code{configure} will prepare for a + native compile but use what you specify instead of guessing what your +-system is. This is most useful to change the CPU submodel. For example, +-if @code{configure} guesses your machine as @code{i586-pc-linux-gnu} but +-you want to compile a library for 386es, give +-@samp{--host=i386-pc-linux-gnu} or just @samp{--host=i386-linux} and add +-the appropriate compiler flags (@samp{-mcpu=i386} will do the trick) to ++system is. This is most useful to change the CPU submodel. For example, ++if @code{configure} guesses your machine as @code{i686-pc-linux-gnu} but ++you want to compile a library for 586es, give ++@samp{--host=i586-pc-linux-gnu} or just @samp{--host=i586-linux} and add ++the appropriate compiler flags (@samp{-mcpu=i586} will do the trick) to + @var{CFLAGS}. + + If you specify just @samp{--build}, @code{configure} will get confused. +@@ -230,6 +235,12 @@ + system such as @file{/etc/passwd}, @file{/etc/nsswitch.conf} and others. + These files must all contain correct and sensible content. + ++Normally, @code{make check} will run all the tests before reporting ++all problems found and exiting with error status if any problems ++occurred. You can specify @samp{stop-on-test-failure=y} when running ++@code{make check} to make the test run stop and exit with an error ++status immediately when a failure occurs. ++ + To format the @cite{GNU C Library Reference Manual} for printing, type + @w{@code{make dvi}}. You need a working @TeX{} installation to do + this. The distribution builds the on-line formatted version of the +@@ -264,13 +275,15 @@ + In general, when testing @theglibc{}, @samp{test-wrapper} may be set + to the name and arguments of any program to run newly built binaries. + This program must preserve the arguments to the binary being run, its +-working directory, all environment variables set as part of testing +-and the standard input, output and error file descriptors. If ++working directory and the standard input, output and error file ++descriptors. If + @samp{@var{test-wrapper} env} will not work to run a program with + environment variables set, then @samp{test-wrapper-env} must be set to + a program that runs a newly built program with environment variable + assignments in effect, those assignments being specified as +-@samp{@var{var}=@var{value}} before the name of the program to be run. ++@samp{@var{var}=@var{value}} before the name of the program to be ++run. If multiple assignments to the same variable are specified, ++the last assignment specified must take precedence. + + + @node Running make install +@@ -278,7 +291,7 @@ + @cindex installing + + To install the library and its header files, and the Info files of the +-manual, type @code{env LANGUAGE=C LC_ALL=C make install}. This will ++manual, type @code{make install}. This will + build things, if necessary, before installing them; however, you should + still compile everything first. If you are installing @theglibc{} as your + primary C library, we recommend that you shut the system down to +@@ -317,14 +330,11 @@ + well. + + One auxiliary program, @file{/usr/libexec/pt_chown}, is installed setuid +-@code{root}. This program is invoked by the @code{grantpt} function; it +-sets the permissions on a pseudoterminal so it can be used by the +-calling process. This means programs like @code{xterm} and +-@code{screen} do not have to be setuid to get a pty. (There may be +-other reasons why they need privileges.) If you are using a +-Linux kernel with the @code{devptsfs} or @code{devfs} filesystems +-providing pty slaves, you don't need this program; otherwise you do. +-The source for @file{pt_chown} is in @file{login/programs/pt_chown.c}. ++@code{root} if the @samp{--enable-pt_chown} configuration option is used. ++This program is invoked by the @code{grantpt} function; it sets the ++permissions on a pseudoterminal so it can be used by the calling process. ++If you are using a Linux kernel with the @code{devpts} filesystem enabled ++and mounted at @file{/dev/pts}, you don't need this program. + + After installation you might want to configure the timezone and locale + installation of your system. @Theglibc{} comes with a locale +@@ -362,9 +372,9 @@ + bugs or lack features. + + @item +-GCC 4.3 or newer, GCC 4.6 recommended ++GCC 4.4 or newer, GCC 4.6 recommended + +-GCC 4.3 or higher is required; as of this writing, GCC 4.6 is the ++GCC 4.4 or higher is required; as of this writing, GCC 4.6 is the + compiler we advise to use to build @theglibc{}. + + You can use whatever compiler you like to compile programs that use +@@ -388,10 +398,11 @@ + mechanism for the info files is not present or works differently. + + @item +-GNU @code{awk} 3.0, or higher ++GNU @code{awk} 3.1.2, or higher + +-@code{Awk} is used in several places to generate files. +-@code{gawk} 3.0 is known to work. ++@code{awk} is used in several places to generate files. ++Some @code{gawk} extensions are used, including the @code{asorti} ++function, which was introduced in version 3.1.2 of @code{gawk}. + + @item + Perl 5 +@@ -412,7 +423,7 @@ + @end itemize + + @noindent +-If you change any of the @file{configure.in} files you will also need ++If you change any of the @file{configure.ac} files you will also need + + @itemize @bullet + @item +@@ -436,7 +447,7 @@ + @cindex kernel header files + + If you are installing @theglibc{} on @gnulinuxsystems{}, you need to have +-the header files from a 2.6.19.1 or newer kernel around for reference. ++the header files from a 2.6.32 or newer kernel around for reference. + These headers must be installed using @samp{make headers_install}; the + headers present in the kernel source directory are not suitable for + direct use by @theglibc{}. You do not need to use that kernel, just have +diff -urN glibc-2.17-c758a686/manual/intro.texi glibc-2.17-c758a686/manual/intro.texi +--- glibc-2.17-c758a686/manual/intro.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/intro.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -159,6 +159,14 @@ + These include utilities for dealing with regular expressions and other + pattern matching facilities (@pxref{Pattern Matching}). + ++@menu ++* POSIX Safety Concepts:: Safety concepts from POSIX. ++* Unsafe Features:: Features that make functions unsafe. ++* Conditionally Safe Features:: Features that make functions unsafe ++ in the absence of workarounds. ++* Other Safety Remarks:: Additional safety features and remarks. ++@end menu ++ + @comment Roland sez: + @comment The GNU C library as it stands conforms to 1003.2 draft 11, which + @comment specifies: +@@ -172,6 +180,725 @@ + @comment <wordexp.h> (not yet implemented) + @comment confstr + ++@node POSIX Safety Concepts, Unsafe Features, , POSIX ++@subsubsection POSIX Safety Concepts ++@cindex POSIX Safety Concepts ++ ++This manual documents various safety properties of @glibcadj{} ++functions, in lines that follow their prototypes and look like: ++ ++@sampsafety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++ ++The properties are assessed according to the criteria set forth in the ++POSIX standard for such safety contexts as Thread-, Async-Signal- and ++Async-Cancel- -Safety. Intuitive definitions of these properties, ++attempting to capture the meaning of the standard definitions, follow. ++ ++@itemize @bullet ++ ++@item ++@cindex MT-Safe ++@cindex Thread-Safe ++@code{MT-Safe} or Thread-Safe functions are safe to call in the presence ++of other threads. MT, in MT-Safe, stands for Multi Thread. ++ ++Being MT-Safe does not imply a function is atomic, nor that it uses any ++of the memory synchronization mechanisms POSIX exposes to users. It is ++even possible that calling MT-Safe functions in sequence does not yield ++an MT-Safe combination. For example, having a thread call two MT-Safe ++functions one right after the other does not guarantee behavior ++equivalent to atomic execution of a combination of both functions, since ++concurrent calls in other threads may interfere in a destructive way. ++ ++Whole-program optimizations that could inline functions across library ++interfaces may expose unsafe reordering, and so performing inlining ++across the @glibcadj{} interface is not recommended. The documented ++MT-Safety status is not guaranteed under whole-program optimization. ++However, functions defined in user-visible headers are designed to be ++safe for inlining. ++ ++ ++@item ++@cindex AS-Safe ++@cindex Async-Signal-Safe ++@code{AS-Safe} or Async-Signal-Safe functions are safe to call from ++asynchronous signal handlers. AS, in AS-Safe, stands for Asynchronous ++Signal. ++ ++Many functions that are AS-Safe may set @code{errno}, or modify the ++floating-point environment, because their doing so does not make them ++unsuitable for use in signal handlers. However, programs could ++misbehave should asynchronous signal handlers modify this thread-local ++state, and the signal handling machinery cannot be counted on to ++preserve it. Therefore, signal handlers that call functions that may ++set @code{errno} or modify the floating-point environment @emph{must} ++save their original values, and restore them before returning. ++ ++ ++@item ++@cindex AC-Safe ++@cindex Async-Cancel-Safe ++@code{AC-Safe} or Async-Cancel-Safe functions are safe to call when ++asynchronous cancellation is enabled. AC in AC-Safe stands for ++Asynchronous Cancellation. ++ ++The POSIX standard defines only three functions to be AC-Safe, namely ++@code{pthread_cancel}, @code{pthread_setcancelstate}, and ++@code{pthread_setcanceltype}. At present @theglibc{} provides no ++guarantees beyond these three functions, but does document which ++functions are presently AC-Safe. This documentation is provided for use ++by @theglibc{} developers. ++ ++Just like signal handlers, cancellation cleanup routines must configure ++the floating point environment they require. The routines cannot assume ++a floating point environment, particularly when asynchronous ++cancellation is enabled. If the configuration of the floating point ++environment cannot be performed atomically then it is also possible that ++the environment encountered is internally inconsistent. ++ ++ ++@item ++@cindex MT-Unsafe ++@cindex Thread-Unsafe ++@cindex AS-Unsafe ++@cindex Async-Signal-Unsafe ++@cindex AC-Unsafe ++@cindex Async-Cancel-Unsafe ++@code{MT-Unsafe}, @code{AS-Unsafe}, @code{AC-Unsafe} functions are not ++safe to call within the safety contexts described above. Calling them ++within such contexts invokes undefined behavior. ++ ++Functions not explicitly documented as safe in a safety context should ++be regarded as Unsafe. ++ ++ ++@item ++@cindex Preliminary ++@code{Preliminary} safety properties are documented, indicating these ++properties may @emph{not} be counted on in future releases of ++@theglibc{}. ++ ++Such preliminary properties are the result of an assessment of the ++properties of our current implementation, rather than of what is ++mandated and permitted by current and future standards. ++ ++Although we strive to abide by the standards, in some cases our ++implementation is safe even when the standard does not demand safety, ++and in other cases our implementation does not meet the standard safety ++requirements. The latter are most likely bugs; the former, when marked ++as @code{Preliminary}, should not be counted on: future standards may ++require changes that are not compatible with the additional safety ++properties afforded by the current implementation. ++ ++Furthermore, the POSIX standard does not offer a detailed definition of ++safety. We assume that, by ``safe to call'', POSIX means that, as long ++as the program does not invoke undefined behavior, the ``safe to call'' ++function behaves as specified, and does not cause other functions to ++deviate from their specified behavior. We have chosen to use its loose ++definitions of safety, not because they are the best definitions to use, ++but because choosing them harmonizes this manual with POSIX. ++ ++Please keep in mind that these are preliminary definitions and ++annotations, and certain aspects of the definitions are still under ++discussion and might be subject to clarification or change. ++ ++Over time, we envision evolving the preliminary safety notes into stable ++commitments, as stable as those of our interfaces. As we do, we will ++remove the @code{Preliminary} keyword from safety notes. As long as the ++keyword remains, however, they are not to be regarded as a promise of ++future behavior. ++ ++ ++@end itemize ++ ++Other keywords that appear in safety notes are defined in subsequent ++sections. ++ ++ ++@node Unsafe Features, Conditionally Safe Features, POSIX Safety Concepts, POSIX ++@subsubsection Unsafe Features ++@cindex Unsafe Features ++ ++Functions that are unsafe to call in certain contexts are annotated with ++keywords that document their features that make them unsafe to call. ++AS-Unsafe features in this section indicate the functions are never safe ++to call when asynchronous signals are enabled. AC-Unsafe features ++indicate they are never safe to call when asynchronous cancellation is ++enabled. There are no MT-Unsafe marks in this section. ++ ++@itemize @bullet ++ ++@item @code{lock} ++@cindex lock ++ ++Functions marked with @code{lock} as an AS-Unsafe feature may be ++interrupted by a signal while holding a non-recursive lock. If the ++signal handler calls another such function that takes the same lock, the ++result is a deadlock. ++ ++Functions annotated with @code{lock} as an AC-Unsafe feature may, if ++cancelled asynchronously, fail to release a lock that would have been ++released if their execution had not been interrupted by asynchronous ++thread cancellation. Once a lock is left taken, attempts to take that ++lock will block indefinitely. ++ ++ ++@item @code{corrupt} ++@cindex corrupt ++ ++Functions marked with @code{corrupt} as an AS-Unsafe feature may corrupt ++data structures and misbehave when they interrupt, or are interrupted ++by, another such function. Unlike functions marked with @code{lock}, ++these take recursive locks to avoid MT-Safety problems, but this is not ++enough to stop a signal handler from observing a partially-updated data ++structure. Further corruption may arise from the interrupted function's ++failure to notice updates made by signal handlers. ++ ++Functions marked with @code{corrupt} as an AC-Unsafe feature may leave ++data structures in a corrupt, partially updated state. Subsequent uses ++of the data structure may misbehave. ++ ++@c A special case, probably not worth documenting separately, involves ++@c reallocing, or even freeing pointers. Any case involving free could ++@c be easily turned into an ac-safe leak by resetting the pointer before ++@c releasing it; I don't think we have any case that calls for this sort ++@c of fixing. Fixing the realloc cases would require a new interface: ++@c instead of @code{ptr=realloc(ptr,size)} we'd have to introduce ++@c @code{acsafe_realloc(&ptr,size)} that would modify ptr before ++@c releasing the old memory. The ac-unsafe realloc could be implemented ++@c in terms of an internal interface with this semantics (say ++@c __acsafe_realloc), but since realloc can be overridden, the function ++@c we call to implement realloc should not be this internal interface, ++@c but another internal interface that calls __acsafe_realloc if realloc ++@c was not overridden, and calls the overridden realloc with async ++@c cancel disabled. --lxoliva ++ ++ ++@item @code{heap} ++@cindex heap ++ ++Functions marked with @code{heap} may call heap memory management ++functions from the @code{malloc}/@code{free} family of functions and are ++only as safe as those functions. This note is thus equivalent to: ++ ++@sampsafety{@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++ ++ ++@c Check for cases that should have used plugin instead of or in ++@c addition to this. Then, after rechecking gettext, adjust i18n if ++@c needed. ++@item @code{dlopen} ++@cindex dlopen ++ ++Functions marked with @code{dlopen} use the dynamic loader to load ++shared libraries into the current execution image. This involves ++opening files, mapping them into memory, allocating additional memory, ++resolving symbols, applying relocations and more, all of this while ++holding internal dynamic loader locks. ++ ++The locks are enough for these functions to be AS- and AC-Unsafe, but ++other issues may arise. At present this is a placeholder for all ++potential safety issues raised by @code{dlopen}. ++ ++@c dlopen runs init and fini sections of the module; does this mean ++@c dlopen always implies plugin? ++ ++ ++@item @code{plugin} ++@cindex plugin ++ ++Functions annotated with @code{plugin} may run code from plugins that ++may be external to @theglibc{}. Such plugin functions are assumed to be ++MT-Safe, AS-Unsafe and AC-Unsafe. Examples of such plugins are stack ++@cindex NSS ++unwinding libraries, name service switch (NSS) and character set ++@cindex iconv ++conversion (iconv) back-ends. ++ ++Although the plugins mentioned as examples are all brought in by means ++of dlopen, the @code{plugin} keyword does not imply any direct ++involvement of the dynamic loader or the @code{libdl} interfaces, those ++are covered by @code{dlopen}. For example, if one function loads a ++module and finds the addresses of some of its functions, while another ++just calls those already-resolved functions, the former will be marked ++with @code{dlopen}, whereas the latter will get the @code{plugin}. When ++a single function takes all of these actions, then it gets both marks. ++ ++ ++@item @code{i18n} ++@cindex i18n ++ ++Functions marked with @code{i18n} may call internationalization ++functions of the @code{gettext} family and will be only as safe as those ++functions. This note is thus equivalent to: ++ ++@sampsafety{@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascudlopen{}}@acunsafe{@acucorrupt{}}} ++ ++ ++@item @code{timer} ++@cindex timer ++ ++Functions marked with @code{timer} use the @code{alarm} function or ++similar to set a time-out for a system call or a long-running operation. ++In a multi-threaded program, there is a risk that the time-out signal ++will be delivered to a different thread, thus failing to interrupt the ++intended thread. Besides being MT-Unsafe, such functions are always ++AS-Unsafe, because calling them in signal handlers may interfere with ++timers set in the interrupted code, and AC-Unsafe, because there is no ++safe way to guarantee an earlier timer will be reset in case of ++asynchronous cancellation. ++ ++@end itemize ++ ++ ++@node Conditionally Safe Features, Other Safety Remarks, Unsafe Features, POSIX ++@subsubsection Conditionally Safe Features ++@cindex Conditionally Safe Features ++ ++For some features that make functions unsafe to call in certain ++contexts, there are known ways to avoid the safety problem other than ++refraining from calling the function altogether. The keywords that ++follow refer to such features, and each of their definitions indicate ++how the whole program needs to be constrained in order to remove the ++safety problem indicated by the keyword. Only when all the reasons that ++make a function unsafe are observed and addressed, by applying the ++documented constraints, does the function become safe to call in a ++context. ++ ++@itemize @bullet ++ ++@item @code{init} ++@cindex init ++ ++Functions marked with @code{init} as an MT-Unsafe feature perform ++MT-Unsafe initialization when they are first called. ++ ++Calling such a function at least once in single-threaded mode removes ++this specific cause for the function to be regarded as MT-Unsafe. If no ++other cause for that remains, the function can then be safely called ++after other threads are started. ++ ++Functions marked with @code{init} as an AS- or AC-Unsafe feature use the ++internal @code{libc_once} machinery or similar to initialize internal ++data structures. ++ ++If a signal handler interrupts such an initializer, and calls any ++function that also performs @code{libc_once} initialization, it will ++deadlock if the thread library has been loaded. ++ ++Furthermore, if an initializer is partially complete before it is ++canceled or interrupted by a signal whose handler requires the same ++initialization, some or all of the initialization may be performed more ++than once, leaking resources or even resulting in corrupt internal data. ++ ++Applications that need to call functions marked with @code{init} as an ++AS- or AC-Unsafe feature should ensure the initialization is performed ++before configuring signal handlers or enabling cancellation, so that the ++AS- and AC-Safety issues related with @code{libc_once} do not arise. ++ ++@c We may have to extend the annotations to cover conditions in which ++@c initialization may or may not occur, since an initial call in a safe ++@c context is no use if the initialization doesn't take place at that ++@c time: it doesn't remove the risk for later calls. ++ ++ ++@item @code{race} ++@cindex race ++ ++Functions annotated with @code{race} as an MT-Safety issue operate on ++objects in ways that may cause data races or similar forms of ++destructive interference out of concurrent execution. In some cases, ++the objects are passed to the functions by users; in others, they are ++used by the functions to return values to users; in others, they are not ++even exposed to users. ++ ++We consider access to objects passed as (indirect) arguments to ++functions to be data race free. The assurance of data race free objects ++is the caller's responsibility. We will not mark a function as ++MT-Unsafe or AS-Unsafe if it misbehaves when users fail to take the ++measures required by POSIX to avoid data races when dealing with such ++objects. As a general rule, if a function is documented as reading from ++an object passed (by reference) to it, or modifying it, users ought to ++use memory synchronization primitives to avoid data races just as they ++would should they perform the accesses themselves rather than by calling ++the library function. @code{FILE} streams are the exception to the ++general rule, in that POSIX mandates the library to guard against data ++races in many functions that manipulate objects of this specific opaque ++type. We regard this as a convenience provided to users, rather than as ++a general requirement whose expectations should extend to other types. ++ ++In order to remind users that guarding certain arguments is their ++responsibility, we will annotate functions that take objects of certain ++types as arguments. We draw the line for objects passed by users as ++follows: objects whose types are exposed to users, and that users are ++expected to access directly, such as memory buffers, strings, and ++various user-visible @code{struct} types, do @emph{not} give reason for ++functions to be annotated with @code{race}. It would be noisy and ++redundant with the general requirement, and not many would be surprised ++by the library's lack of internal guards when accessing objects that can ++be accessed directly by users. ++ ++As for objects that are opaque or opaque-like, in that they are to be ++manipulated only by passing them to library functions (e.g., ++@code{FILE}, @code{DIR}, @code{obstack}, @code{iconv_t}), there might be ++additional expectations as to internal coordination of access by the ++library. We will annotate, with @code{race} followed by a colon and the ++argument name, functions that take such objects but that do not take ++care of synchronizing access to them by default. For example, ++@code{FILE} stream @code{unlocked} functions will be annotated, but ++those that perform implicit locking on @code{FILE} streams by default ++will not, even though the implicit locking may be disabled on a ++per-stream basis. ++ ++In either case, we will not regard as MT-Unsafe functions that may ++access user-supplied objects in unsafe ways should users fail to ensure ++the accesses are well defined. The notion prevails that users are ++expected to safeguard against data races any user-supplied objects that ++the library accesses on their behalf. ++ ++@c The above describes @mtsrace; @mtasurace is described below. ++ ++This user responsibility does not apply, however, to objects controlled ++by the library itself, such as internal objects and static buffers used ++to return values from certain calls. When the library doesn't guard ++them against concurrent uses, these cases are regarded as MT-Unsafe and ++AS-Unsafe (although the @code{race} mark under AS-Unsafe will be omitted ++as redundant with the one under MT-Unsafe). As in the case of ++user-exposed objects, the mark may be followed by a colon and an ++identifier. The identifier groups all functions that operate on a ++certain unguarded object; users may avoid the MT-Safety issues related ++with unguarded concurrent access to such internal objects by creating a ++non-recursive mutex related with the identifier, and always holding the ++mutex when calling any function marked as racy on that identifier, as ++they would have to should the identifier be an object under user ++control. The non-recursive mutex avoids the MT-Safety issue, but it ++trades one AS-Safety issue for another, so use in asynchronous signals ++remains undefined. ++ ++When the identifier relates to a static buffer used to hold return ++values, the mutex must be held for as long as the buffer remains in use ++by the caller. Many functions that return pointers to static buffers ++offer reentrant variants that store return values in caller-supplied ++buffers instead. In some cases, such as @code{tmpname}, the variant is ++chosen not by calling an alternate entry point, but by passing a ++non-@code{NULL} pointer to the buffer in which the returned values are ++to be stored. These variants are generally preferable in multi-threaded ++programs, although some of them are not MT-Safe because of other ++internal buffers, also documented with @code{race} notes. ++ ++ ++@item @code{const} ++@cindex const ++ ++Functions marked with @code{const} as an MT-Safety issue non-atomically ++modify internal objects that are better regarded as constant, because a ++substantial portion of @theglibc{} accesses them without ++synchronization. Unlike @code{race}, that causes both readers and ++writers of internal objects to be regarded as MT-Unsafe and AS-Unsafe, ++this mark is applied to writers only. Writers remain equally MT- and ++AS-Unsafe to call, but the then-mandatory constness of objects they ++modify enables readers to be regarded as MT-Safe and AS-Safe (as long as ++no other reasons for them to be unsafe remain), since the lack of ++synchronization is not a problem when the objects are effectively ++constant. ++ ++The identifier that follows the @code{const} mark will appear by itself ++as a safety note in readers. Programs that wish to work around this ++safety issue, so as to call writers, may use a non-recursve ++@code{rwlock} associated with the identifier, and guard @emph{all} calls ++to functions marked with @code{const} followed by the identifier with a ++write lock, and @emph{all} calls to functions marked with the identifier ++by itself with a read lock. The non-recursive locking removes the ++MT-Safety problem, but it trades one AS-Safety problem for another, so ++use in asynchronous signals remains undefined. ++ ++@c But what if, instead of marking modifiers with const:id and readers ++@c with just id, we marked writers with race:id and readers with ro:id? ++@c Instead of having to define each instance of “id”, we'd have a ++@c general pattern governing all such “id”s, wherein race:id would ++@c suggest the need for an exclusive/write lock to make the function ++@c safe, whereas ro:id would indicate “id” is expected to be read-only, ++@c but if any modifiers are called (while holding an exclusive lock), ++@c then ro:id-marked functions ought to be guarded with a read lock for ++@c safe operation. ro:env or ro:locale, for example, seems to convey ++@c more clearly the expectations and the meaning, than just env or ++@c locale. ++ ++ ++@item @code{sig} ++@cindex sig ++ ++Functions marked with @code{sig} as a MT-Safety issue (that implies an ++identical AS-Safety issue, omitted for brevity) may temporarily install ++a signal handler for internal purposes, which may interfere with other ++uses of the signal, identified after a colon. ++ ++This safety problem can be worked around by ensuring that no other uses ++of the signal will take place for the duration of the call. Holding a ++non-recursive mutex while calling all functions that use the same ++temporary signal; blocking that signal before the call and resetting its ++handler afterwards is recommended. ++ ++There is no safe way to guarantee the original signal handler is ++restored in case of asynchronous cancellation, therefore so-marked ++functions are also AC-Unsafe. ++ ++@c fixme: at least deferred cancellation should get it right, and would ++@c obviate the restoring bit below, and the qualifier above. ++ ++Besides the measures recommended to work around the MT- and AS-Safety ++problem, in order to avert the cancellation problem, disabling ++asynchronous cancellation @emph{and} installing a cleanup handler to ++restore the signal to the desired state and to release the mutex are ++recommended. ++ ++ ++@item @code{term} ++@cindex term ++ ++Functions marked with @code{term} as an MT-Safety issue may change the ++terminal settings in the recommended way, namely: call @code{tcgetattr}, ++modify some flags, and then call @code{tcsetattr}; this creates a window ++in which changes made by other threads are lost. Thus, functions marked ++with @code{term} are MT-Unsafe. The same window enables changes made by ++asynchronous signals to be lost. These functions are also AS-Unsafe, ++but the corresponding mark is omitted as redundant. ++ ++It is thus advisable for applications using the terminal to avoid ++concurrent and reentrant interactions with it, by not using it in signal ++handlers or blocking signals that might use it, and holding a lock while ++calling these functions and interacting with the terminal. This lock ++should also be used for mutual exclusion with functions marked with ++@code{@mtasurace{:tcattr(fd)}}, where @var{fd} is a file descriptor for ++the controlling terminal. The caller may use a single mutex for ++simplicity, or use one mutex per terminal, even if referenced by ++different file descriptors. ++ ++Functions marked with @code{term} as an AC-Safety issue are supposed to ++restore terminal settings to their original state, after temporarily ++changing them, but they may fail to do so if cancelled. ++ ++@c fixme: at least deferred cancellation should get it right, and would ++@c obviate the restoring bit below, and the qualifier above. ++ ++Besides the measures recommended to work around the MT- and AS-Safety ++problem, in order to avert the cancellation problem, disabling ++asynchronous cancellation @emph{and} installing a cleanup handler to ++restore the terminal settings to the original state and to release the ++mutex are recommended. ++ ++ ++@end itemize ++ ++ ++@node Other Safety Remarks, , Conditionally Safe Features, POSIX ++@subsubsection Other Safety Remarks ++@cindex Other Safety Remarks ++ ++Additional keywords may be attached to functions, indicating features ++that do not make a function unsafe to call, but that may need to be ++taken into account in certain classes of programs: ++ ++@itemize @bullet ++ ++@item @code{locale} ++@cindex locale ++ ++Functions annotated with @code{locale} as an MT-Safety issue read from ++the locale object without any form of synchronization. Functions ++annotated with @code{locale} called concurrently with locale changes may ++behave in ways that do not correspond to any of the locales active ++during their execution, but an unpredictable mix thereof. ++ ++We do not mark these functions as MT- or AS-Unsafe, however, because ++functions that modify the locale object are marked with ++@code{const:locale} and regarded as unsafe. Being unsafe, the latter ++are not to be called when multiple threads are running or asynchronous ++signals are enabled, and so the locale can be considered effectively ++constant in these contexts, which makes the former safe. ++ ++@c Should the locking strategy suggested under @code{const} be used, ++@c failure to guard locale uses is not as fatal as data races in ++@c general: unguarded uses will @emph{not} follow dangling pointers or ++@c access uninitialized, unmapped or recycled memory. Each access will ++@c read from a consistent locale object that is or was active at some ++@c point during its execution. Without synchronization, however, it ++@c cannot even be assumed that, after a change in locale, earlier ++@c locales will no longer be used, even after the newly-chosen one is ++@c used in the thread. Nevertheless, even though unguarded reads from ++@c the locale will not violate type safety, functions that access the ++@c locale multiple times may invoke all sorts of undefined behavior ++@c because of the unexpected locale changes. ++ ++ ++@item @code{env} ++@cindex env ++ ++Functions marked with @code{env} as an MT-Safety issue access the ++environment with @code{getenv} or similar, without any guards to ensure ++safety in the presence of concurrent modifications. ++ ++We do not mark these functions as MT- or AS-Unsafe, however, because ++functions that modify the environment are all marked with ++@code{const:env} and regarded as unsafe. Being unsafe, the latter are ++not to be called when multiple threads are running or asynchronous ++signals are enabled, and so the environment can be considered ++effectively constant in these contexts, which makes the former safe. ++ ++ ++@item @code{hostid} ++@cindex hostid ++ ++The function marked with @code{hostid} as an MT-Safety issue reads from ++the system-wide data structures that hold the ``host ID'' of the ++machine. These data structures cannot generally be modified atomically. ++Since it is expected that the ``host ID'' will not normally change, the ++function that reads from it (@code{gethostid}) is regarded as safe, ++whereas the function that modifies it (@code{sethostid}) is marked with ++@code{@mtasuconst{:@mtshostid{}}}, indicating it may require special ++care if it is to be called. In this specific case, the special care ++amounts to system-wide (not merely intra-process) coordination. ++ ++ ++@item @code{sigintr} ++@cindex sigintr ++ ++Functions marked with @code{sigintr} as an MT-Safety issue access the ++@code{_sigintr} internal data structure without any guards to ensure ++safety in the presence of concurrent modifications. ++ ++We do not mark these functions as MT- or AS-Unsafe, however, because ++functions that modify the this data structure are all marked with ++@code{const:sigintr} and regarded as unsafe. Being unsafe, the latter ++are not to be called when multiple threads are running or asynchronous ++signals are enabled, and so the data structure can be considered ++effectively constant in these contexts, which makes the former safe. ++ ++ ++@item @code{fd} ++@cindex fd ++ ++Functions annotated with @code{fd} as an AC-Safety issue may leak file ++descriptors if asynchronous thread cancellation interrupts their ++execution. ++ ++Functions that allocate or deallocate file descriptors will generally be ++marked as such. Even if they attempted to protect the file descriptor ++allocation and deallocation with cleanup regions, allocating a new ++descriptor and storing its number where the cleanup region could release ++it cannot be performed as a single atomic operation. Similarly, ++releasing the descriptor and taking it out of the data structure ++normally responsible for releasing it cannot be performed atomically. ++There will always be a window in which the descriptor cannot be released ++because it was not stored in the cleanup handler argument yet, or it was ++already taken out before releasing it. It cannot be taken out after ++release: an open descriptor could mean either that the descriptor still ++has to be closed, or that it already did so but the descriptor was ++reallocated by another thread or signal handler. ++ ++Such leaks could be internally avoided, with some performance penalty, ++by temporarily disabling asynchronous thread cancellation. However, ++since callers of allocation or deallocation functions would have to do ++this themselves, to avoid the same sort of leak in their own layer, it ++makes more sense for the library to assume they are taking care of it ++than to impose a performance penalty that is redundant when the problem ++is solved in upper layers, and insufficient when it is not. ++ ++This remark by itself does not cause a function to be regarded as ++AC-Unsafe. However, cumulative effects of such leaks may pose a ++problem for some programs. If this is the case, suspending asynchronous ++cancellation for the duration of calls to such functions is recommended. ++ ++ ++@item @code{mem} ++@cindex mem ++ ++Functions annotated with @code{mem} as an AC-Safety issue may leak ++memory if asynchronous thread cancellation interrupts their execution. ++ ++The problem is similar to that of file descriptors: there is no atomic ++interface to allocate memory and store its address in the argument to a ++cleanup handler, or to release it and remove its address from that ++argument, without at least temporarily disabling asynchronous ++cancellation, which these functions do not do. ++ ++This remark does not by itself cause a function to be regarded as ++generally AC-Unsafe. However, cumulative effects of such leaks may be ++severe enough for some programs that disabling asynchronous cancellation ++for the duration of calls to such functions may be required. ++ ++ ++@item @code{cwd} ++@cindex cwd ++ ++Functions marked with @code{cwd} as an MT-Safety issue may temporarily ++change the current working directory during their execution, which may ++cause relative pathnames to be resolved in unexpected ways in other ++threads or within asynchronous signal or cancellation handlers. ++ ++This is not enough of a reason to mark so-marked functions as MT- or ++AS-Unsafe, but when this behavior is optional (e.g., @code{nftw} with ++@code{FTW_CHDIR}), avoiding the option may be a good alternative to ++using full pathnames or file descriptor-relative (e.g. @code{openat}) ++system calls. ++ ++ ++@item @code{!posix} ++@cindex !posix ++ ++This remark, as an MT-, AS- or AC-Safety note to a function, indicates ++the safety status of the function is known to differ from the specified ++status in the POSIX standard. For example, POSIX does not require a ++function to be Safe, but our implementation is, or vice-versa. ++ ++For the time being, the absence of this remark does not imply the safety ++properties we documented are identical to those mandated by POSIX for ++the corresponding functions. ++ ++ ++@item @code{:identifier} ++@cindex :identifier ++ ++Annotations may sometimes be followed by identifiers, intended to group ++several functions that e.g. access the data structures in an unsafe way, ++as in @code{race} and @code{const}, or to provide more specific ++information, such as naming a signal in a function marked with ++@code{sig}. It is envisioned that it may be applied to @code{lock} and ++@code{corrupt} as well in the future. ++ ++In most cases, the identifier will name a set of functions, but it may ++name global objects or function arguments, or identifiable properties or ++logical components associated with them, with a notation such as ++e.g. @code{:buf(arg)} to denote a buffer associated with the argument ++@var{arg}, or @code{:tcattr(fd)} to denote the terminal attributes of a ++file descriptor @var{fd}. ++ ++The most common use for identifiers is to provide logical groups of ++functions and arguments that need to be protected by the same ++synchronization primitive in order to ensure safe operation in a given ++context. ++ ++ ++@item @code{/condition} ++@cindex /condition ++ ++Some safety annotations may be conditional, in that they only apply if a ++boolean expression involving arguments, global variables or even the ++underlying kernel evaluates evaluates to true. Such conditions as ++@code{/hurd} or @code{/!linux!bsd} indicate the preceding marker only ++applies when the underlying kernel is the HURD, or when it is neither ++Linux nor a BSD kernel, respectively. @code{/!ps} and ++@code{/one_per_line} indicate the preceding marker only applies when ++argument @var{ps} is NULL, or global variable @var{one_per_line} is ++nonzero. ++ ++When all marks that render a function unsafe are adorned with such ++conditions, and none of the named conditions hold, then the function can ++be regarded as safe. ++ ++ ++@end itemize ++ + + @node Berkeley Unix, SVID, POSIX, Standards and Portability + @subsection Berkeley Unix +@@ -556,19 +1283,59 @@ + Here is an overview of the contents of the remaining chapters of + this manual. + ++@c The chapter overview ordering is: ++@c Error Reporting (2) ++@c Virtual Memory Allocation and Paging (3) ++@c Character Handling (4) ++@c Strings and Array Utilities (5) ++@c Character Set Handling (6) ++@c Locales and Internationalization (7) ++@c Searching and Sorting (9) ++@c Pattern Matching (10) ++@c Input/Output Overview (11) ++@c Input/Output on Streams (12) ++@c Low-level Input/Ooutput (13) ++@c File System Interface (14) ++@c Pipes and FIFOs (15) ++@c Sockets (16) ++@c Low-Level Terminal Interface (17) ++@c Syslog (18) ++@c Mathematics (19) ++@c Aritmetic Functions (20) ++@c Date and Time (21) ++@c Non-Local Exist (23) ++@c Signal Handling (24) ++@c The Basic Program/System Interface (25) ++@c Processes (26) ++@c Job Control (28) ++@c System Databases and Name Service Switch (29) ++@c Users and Groups (30) -- References `User Database' and `Group Database' ++@c System Management (31) ++@c System Configuration Parameters (32) ++@c C Language Facilities in the Library (AA) ++@c Summary of Library Facilities (AB) ++@c Installing (AC) ++@c Library Maintenance (AD) ++ ++@c The following chapters need overview text to be added: ++@c Message Translation (8) ++@c Resource Usage And Limitations (22) ++@c Inter-Process Communication (27) ++@c DES Encryption and Password Handling (33) ++@c Debugging support (34) ++@c POSIX Threads (35) ++@c Internal Probes (36) ++@c Platform-specific facilities (AE) ++@c Contributors to (AF) ++@c Free Software Needs Free Documentation (AG) ++@c GNU Lesser General Public License (AH) ++@c GNU Free Documentation License (AI) ++ + @itemize @bullet + @item + @ref{Error Reporting}, describes how errors detected by the library + are reported. + +-@item +-@ref{Language Features}, contains information about library support for +-standard parts of the C language, including things like the @code{sizeof} +-operator and the symbolic constant @code{NULL}, how to write functions +-accepting variable numbers of arguments, and constants describing the +-ranges and other properties of the numerical types. There is also a simple +-debugging mechanism which allows you to put assertions in your code, and +-have diagnostic messages printed if the tests fail. + + @item + @ref{Memory}, describes @theglibc{}'s facilities for managing and +@@ -588,6 +1355,26 @@ + byte arrays, including operations such as copying and comparison. + + @item ++@ref{Character Set Handling}, contains information about manipulating ++characters and strings using character sets larger than will fit in ++the usual @code{char} data type. ++ ++@item ++@ref{Locales}, describes how selecting a particular country ++or language affects the behavior of the library. For example, the locale ++affects collation sequences for strings and how monetary values are ++formatted. ++ ++@item ++@ref{Searching and Sorting}, contains information about functions ++for searching and sorting arrays. You can use these functions on any ++kind of array by providing an appropriate comparison function. ++ ++@item ++@ref{Pattern Matching}, presents functions for matching regular expressions ++and shell file name patterns, and for expanding words as the shell does. ++ ++@item + @ref{I/O Overview}, gives an overall look at the input and output + facilities in the library, and contains information about basic concepts + such as file names. +@@ -639,30 +1426,10 @@ + numbers from strings. + + @item +-@ref{Searching and Sorting}, contains information about functions +-for searching and sorting arrays. You can use these functions on any +-kind of array by providing an appropriate comparison function. +- +-@item +-@ref{Pattern Matching}, presents functions for matching regular expressions +-and shell file name patterns, and for expanding words as the shell does. +- +-@item + @ref{Date and Time}, describes functions for measuring both calendar time + and CPU time, as well as functions for setting alarms and timers. + + @item +-@ref{Character Set Handling}, contains information about manipulating +-characters and strings using character sets larger than will fit in +-the usual @code{char} data type. +- +-@item +-@ref{Locales}, describes how selecting a particular country +-or language affects the behavior of the library. For example, the locale +-affects collation sequences for strings and how monetary values are +-formatted. +- +-@item + @ref{Non-Local Exits}, contains descriptions of the @code{setjmp} and + @code{longjmp} functions. These functions provide a facility for + @code{goto}-like jumps which can jump from one function to another. +@@ -708,6 +1475,15 @@ + compatibility with POSIX. + + @item ++@ref{Language Features}, contains information about library support for ++standard parts of the C language, including things like the @code{sizeof} ++operator and the symbolic constant @code{NULL}, how to write functions ++accepting variable numbers of arguments, and constants describing the ++ranges and other properties of the numerical types. There is also a simple ++debugging mechanism which allows you to put assertions in your code, and ++have diagnostic messages printed if the tests fail. ++ ++@item + @ref{Library Summary}, gives a summary of all the functions, variables, and + macros in the library, with complete data types and function prototypes, + and says what standard or system each is derived from. +diff -urN glibc-2.17-c758a686/manual/ipc.texi glibc-2.17-c758a686/manual/ipc.texi +--- glibc-2.17-c758a686/manual/ipc.texi 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/manual/ipc.texi 2014-09-12 16:10:06.047792712 -0400 +@@ -0,0 +1,116 @@ ++@node Inter-Process Communication, Job Control, Processes, Top ++@c %MENU% All about inter-process communication ++@chapter Inter-Process Communication ++@cindex ipc ++ ++This chapter describes the @glibcadj{} inter-process communication primitives. ++ ++@menu ++* Semaphores:: Support for creating and managing semaphores ++@end menu ++ ++@node Semaphores ++@section Semaphores ++ ++@Theglibc{} implements the semaphore APIs as defined in POSIX and ++System V. Semaphores can be used by multiple processes to coordinate shared ++resources. The following is a complete list of the semaphore functions provided ++by @theglibc{}. ++ ++@c Need descriptions for all of these functions. ++ ++@subsection System V Semaphores ++@deftypefun int semctl (int @var{semid}, int @var{semnum}, int @var{cmd}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{/linux}}} ++@c syscall(ipc) ok ++@c ++@c AC-unsafe because we need to translate the new kernel ++@c semid_ds buf into the userspace layout. Cancellation ++@c at that point results in an inconsistent userspace ++@c semid_ds. ++@end deftypefun ++ ++@deftypefun int semget (key_t @var{key}, int @var{nsems}, int @var{semflg}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c syscall(ipc) ok ++@end deftypefun ++ ++@deftypefun int semop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c syscall(ipc) ok ++@end deftypefun ++ ++@deftypefun int semtimedop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops}, const struct timespec *@var{timeout}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c syscall(ipc) ok ++@end deftypefun ++ ++@subsection POSIX Semaphores ++ ++@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}} ++@c Does not atomically update sem_t therefore AC-unsafe ++@c because it can leave sem_t partially initialized. ++@end deftypefun ++ ++@deftypefun int sem_destroy (sem_t *@var{sem}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Function does nothing and is therefore always safe. ++@end deftypefun ++ ++@deftypefun sem_t *sem_open (const char *@var{name}, int @var{oflag}, ...); ++@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acuinit{}}} ++@c pthread_once asuinit ++@c ++@c We are AC-Unsafe becuase we use pthread_once to initialize ++@c a global variable that holds the location of the mounted ++@c shmfs on Linux. ++@end deftypefun ++ ++@deftypefun int sem_close (sem_t *@var{sem}); ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c lll_lock asulock aculock ++@c twalk mtsrace{:root} ++@c ++@c We are AS-unsafe because we take a non-recursive lock. ++@c We are AC-unsafe because several internal data structures ++@c are not updated atomically. ++@end deftypefun ++ ++@deftypefun int sem_unlink (const char *@var{name}); ++@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acucorrupt{}}} ++@c pthread_once asuinit acucorrupt aculock ++@c mempcpy acucorrupt ++@end deftypefun ++ ++@deftypefun int sem_wait (sem_t *@var{sem}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}} ++@c atomic_increment (nwaiters) acucorrupt ++@c ++@c Given the use atomic operations this function seems ++@c to be AS-safe. It is AC-unsafe because there is still ++@c a window between atomic_decrement and the pthread_push ++@c of the handler that undoes that operation. A cancellation ++@c at that point would fail to remove the process from the ++@c waiters count. ++@end deftypefun ++ ++@deftypefun int sem_timedwait (sem_t *@var{sem}, const struct timespec *@var{abstime}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}} ++@c Same safety issues as sem_wait. ++@end deftypefun ++ ++@deftypefun int sem_trywait (sem_t *@var{sem}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c All atomic operations are safe in all contexts. ++@end deftypefun ++ ++@deftypefun int sem_post (sem_t *@var{sem}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Same safety as sem_trywait. ++@end deftypefun ++ ++@deftypefun int sem_getvalue (sem_t *@var{sem}, int *@var{sval}); ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Atomic write of a value is safe in all contexts. ++@end deftypefun +diff -urN glibc-2.17-c758a686/manual/job.texi glibc-2.17-c758a686/manual/job.texi +--- glibc-2.17-c758a686/manual/job.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/job.texi 2014-09-12 16:10:06.048792709 -0400 +@@ -1,4 +1,4 @@ +-@node Job Control, Name Service Switch, Processes, Top ++@node Job Control, Name Service Switch, Inter-Process Communication, Top + @c %MENU% All about process groups and sessions + @chapter Job Control + +@@ -1039,6 +1039,10 @@ + @comment stdio.h + @comment POSIX.1 + @deftypefun {char *} ctermid (char *@var{string}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This function is a stub by default; the actual implementation, for ++@c posix systems, returns an internal buffer if passed a NULL string, ++@c but the internal buffer is always set to /dev/tty. + The @code{ctermid} function returns a string containing the file name of + the controlling terminal for the current process. If @var{string} is + not a null pointer, it should be an array that can hold at least +@@ -1075,6 +1079,12 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun pid_t setsid (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is usually a direct syscall, but if a syscall is not available, ++@c we use a stub, or Hurd- and BSD-specific implementations. The former ++@c uses a mutex and a hurd critical section, and the latter issues a few ++@c syscalls, so both seem safe, the locking on Hurd is safe because of ++@c the critical section. + The @code{setsid} function creates a new session. The calling process + becomes the session leader, and is put in a new process group whose + process group ID is the same as the process ID of that process. There +@@ -1098,6 +1108,8 @@ + @comment unistd.h + @comment SVID + @deftypefun pid_t getsid (pid_t @var{pid}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Stub or direct syscall, except on hurd, where it is equally safe. + + The @code{getsid} function returns the process group ID of the session + leader of the specified process. If a @var{pid} is @code{0}, the +@@ -1118,39 +1130,21 @@ + @end table + @end deftypefun + +-The @code{getpgrp} function has two definitions: one derived from BSD +-Unix, and one from the POSIX.1 standard. The feature test macros you +-have selected (@pxref{Feature Test Macros}) determine which definition +-you get. Specifically, you get the BSD version if you define +-@code{_BSD_SOURCE}; otherwise, you get the POSIX version if you define +-@code{_POSIX_SOURCE} or @code{_GNU_SOURCE}. Programs written for old +-BSD systems will not include @file{unistd.h}, which defines +-@code{getpgrp} specially under @code{_BSD_SOURCE}. You must link such +-programs with the @code{-lbsd-compat} option to get the BSD definition.@refill +-@pindex -lbsd-compat +-@pindex bsd-compat +-@cindex BSD compatibility library +- + @comment unistd.h + @comment POSIX.1 +-@deftypefn {POSIX.1 Function} pid_t getpgrp (void) +-The POSIX.1 definition of @code{getpgrp} returns the process group ID of ++@deftypefun pid_t getpgrp (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++The @code{getpgrp} function returns the process group ID of + the calling process. +-@end deftypefn +- +-@comment unistd.h +-@comment BSD +-@deftypefn {BSD Function} pid_t getpgrp (pid_t @var{pid}) +-The BSD definition of @code{getpgrp} returns the process group ID of the +-process @var{pid}. You can supply a value of @code{0} for the @var{pid} +-argument to get information about the calling process. +-@end deftypefn ++@end deftypefun + + @comment unistd.h +-@comment SVID +-@deftypefn {System V Function} int getpgid (pid_t @var{pid}) ++@comment POSIX.1 ++@deftypefun int getpgid (pid_t @var{pid}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Stub or direct syscall, except on hurd, where it is equally safe. + +-@code{getpgid} is the same as the BSD function @code{getpgrp}. It ++The @code{getpgid} function + returns the process group ID of the process @var{pid}. You can supply a + value of @code{0} for the @var{pid} argument to get information about + the calling process. +@@ -1166,11 +1160,13 @@ + process group ID of the process with ID @var{pid} from the calling + process. + @end table +-@end deftypefn ++@end deftypefun + + @comment unistd.h + @comment POSIX.1 + @deftypefun int setpgid (pid_t @var{pid}, pid_t @var{pgid}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Stub or direct syscall, except on hurd, where it is equally safe. + The @code{setpgid} function puts the process @var{pid} into the process + group @var{pgid}. As a special case, either @var{pid} or @var{pgid} can + be zero to indicate the process ID of the calling process. +@@ -1208,6 +1204,8 @@ + @comment unistd.h + @comment BSD + @deftypefun int setpgrp (pid_t @var{pid}, pid_t @var{pgid}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall or setpgid wrapper. + This is the BSD Unix name for @code{setpgid}. Both functions do exactly + the same thing. + @end deftypefun +@@ -1230,6 +1228,8 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun pid_t tcgetpgrp (int @var{filedes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Stub, or ioctl on BSD and GNU/Linux. + This function returns the process group ID of the foreground process + group associated with the terminal open on descriptor @var{filedes}. + +@@ -1258,6 +1258,8 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int tcsetpgrp (int @var{filedes}, pid_t @var{pgid}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Stub, or ioctl on BSD and GNU/Linux. + This function is used to set a terminal's foreground process group ID. + The argument @var{filedes} is a descriptor which specifies the terminal; + @var{pgid} specifies the process group. The calling process must be a +@@ -1297,6 +1299,8 @@ + @comment termios.h + @comment Unix98 + @deftypefun pid_t tcgetsid (int @var{fildes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Ioctl call, if available, or tcgetpgrp followed by getsid. + This function is used to obtain the process group ID of the session + for which the terminal specified by @var{fildes} is the controlling terminal. + If the call is successful the group ID is returned. Otherwise the +diff -urN glibc-2.17-c758a686/manual/lang.texi glibc-2.17-c758a686/manual/lang.texi +--- glibc-2.17-c758a686/manual/lang.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/lang.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -51,6 +51,8 @@ + @comment assert.h + @comment ISO + @deftypefn Macro void assert (int @var{expression}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} ++@c assert_fail_base calls asprintf, and fflushes stderr. + Verify the programmer's belief that @var{expression} is nonzero at + this point in the program. + +@@ -91,6 +93,8 @@ + @comment assert.h + @comment GNU + @deftypefn Macro void assert_perror (int @var{errnum}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} ++@c assert_fail_base calls asprintf, and fflushes stderr. + Similar to @code{assert}, but verifies that @var{errnum} is zero. + + If @code{NDEBUG} is not defined, @code{assert_perror} tests the value of +@@ -423,6 +427,8 @@ + @comment stdarg.h + @comment ISO + @deftypefn {Macro} void va_start (va_list @var{ap}, @var{last-required}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is no longer provided by glibc, but rather by the compiler. + This macro initializes the argument pointer variable @var{ap} to point + to the first of the optional arguments of the current function; + @var{last-required} must be the last required argument to the function. +@@ -431,6 +437,11 @@ + @comment stdarg.h + @comment ISO + @deftypefn {Macro} @var{type} va_arg (va_list @var{ap}, @var{type}) ++@safety{@prelim{}@mtsafe{@mtsrace{:ap}}@assafe{}@acunsafe{@acucorrupt{}}} ++@c This is no longer provided by glibc, but rather by the compiler. ++@c Unlike the other va_ macros, that either start/end the lifetime of ++@c the va_list object or don't modify it, this one modifies ap, and it ++@c may leave it in a partially updated state. + The @code{va_arg} macro returns the value of the next optional argument, + and modifies the value of @var{ap} to point to the subsequent argument. + Thus, successive uses of @code{va_arg} return successive optional +@@ -445,6 +456,8 @@ + @comment stdarg.h + @comment ISO + @deftypefn {Macro} void va_end (va_list @var{ap}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is no longer provided by glibc, but rather by the compiler. + This ends the use of @var{ap}. After a @code{va_end} call, further + @code{va_arg} calls with the same @var{ap} may not work. You should invoke + @code{va_end} before returning from the function in which @code{va_start} +@@ -466,6 +479,8 @@ + @comment ISO + @deftypefn {Macro} void va_copy (va_list @var{dest}, va_list @var{src}) + @deftypefnx {Macro} void __va_copy (va_list @var{dest}, va_list @var{src}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is no longer provided by glibc, but rather by the compiler. + The @code{va_copy} macro allows copying of objects of type + @code{va_list} even if this is not an integral type. The argument pointer + in @var{dest} is initialized to point to the same argument as the +@@ -1212,7 +1227,9 @@ + @comment stddef.h + @comment ISO + @deftypefn {Macro} size_t offsetof (@var{type}, @var{member}) +-This expands to a integer constant expression that is the offset of the ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is no longer provided by glibc, but rather by the compiler. ++This expands to an integer constant expression that is the offset of the + structure member named @var{member} in the structure type @var{type}. + For example, @code{offsetof (struct s, elem)} is the offset, in bytes, + of the member @code{elem} in a @code{struct s}. +diff -urN glibc-2.17-c758a686/manual/libc.texinfo glibc-2.17-c758a686/manual/libc.texinfo +--- glibc-2.17-c758a686/manual/libc.texinfo 2014-09-12 16:08:17.677071123 -0400 ++++ glibc-2.17-c758a686/manual/libc.texinfo 2014-09-12 16:10:25.996741462 -0400 +@@ -7,7 +7,7 @@ + @include macros.texi + + @comment Tell install-info what to do. +-@dircategory Libraries ++@dircategory Software libraries + @direntry + * Libc: (libc). C library. + @end direntry +@@ -46,7 +46,7 @@ + @value{VERSION} @value{PKGVERSION}. + @end ifclear + +-Copyright @copyright{} 1993--2012 Free Software Foundation, Inc. ++Copyright @copyright{} 1993--2014 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version +@@ -118,6 +118,7 @@ + @include chapters.texi + + @node Free Manuals, Copying, Contributors, Top ++@appendix Free Software Needs Free Documentation + @include freemanuals.texi + + @node Copying, Documentation License, Free Manuals, Top +diff -urN glibc-2.17-c758a686/manual/libc-texinfo.sh glibc-2.17-c758a686/manual/libc-texinfo.sh +--- glibc-2.17-c758a686/manual/libc-texinfo.sh 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/libc-texinfo.sh 2014-09-12 16:10:06.042792724 -0400 +@@ -91,9 +91,11 @@ + * Variable Index:: Index of variables and variable-like macros. + * File Index:: Index of programs and files. + ++ @detailmenu + --- The Detailed Node Listing --- + EOF + cat ${OUTDIR}lmenu.$$ ++ echo '@end detailmenu' + echo '@end menu'; } >${OUTDIR}top-menu.texi.$$ + mv -f ${OUTDIR}top-menu.texi.$$ ${OUTDIR}top-menu.texi + +diff -urN glibc-2.17-c758a686/manual/libdl.texi glibc-2.17-c758a686/manual/libdl.texi +--- glibc-2.17-c758a686/manual/libdl.texi 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/manual/libdl.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -0,0 +1,10 @@ ++@c FIXME these are undocumented: ++@c dladdr ++@c dladdr1 ++@c dlclose ++@c dlerror ++@c dlinfo ++@c dlmopen ++@c dlopen ++@c dlsym ++@c dlvsym +diff -urN glibc-2.17-c758a686/manual/llio.texi glibc-2.17-c758a686/manual/llio.texi +--- glibc-2.17-c758a686/manual/llio.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/llio.texi 2014-09-12 16:10:06.047792712 -0400 +@@ -78,6 +82,7 @@ + @comment fcntl.h + @comment POSIX.1 + @deftypefun int open (const char *@var{filename}, int @var{flags}[, mode_t @var{mode}]) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + The @code{open} function creates and returns a new file descriptor for + the file named by @var{filename}. Initially, the file position + indicator for the file is at the beginning of the file. The argument +@@ -164,6 +169,7 @@ + @comment fcntl.h + @comment Unix98 + @deftypefun int open64 (const char *@var{filename}, int @var{flags}[, mode_t @var{mode}]) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + This function is similar to @code{open}. It returns a file descriptor + which can be used to access the file named by @var{filename}. The only + difference is that on 32 bit systems the file is opened in the +@@ -178,6 +184,7 @@ + @comment fcntl.h + @comment POSIX.1 + @deftypefn {Obsolete function} int creat (const char *@var{filename}, mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + This function is obsolete. The call: + + @smallexample +@@ -202,6 +209,7 @@ + @comment fcntl.h + @comment Unix98 + @deftypefn {Obsolete function} int creat64 (const char *@var{filename}, mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + This function is similar to @code{creat}. It returns a file descriptor + which can be used to access the file named by @var{filename}. The only + the difference is that on 32 bit systems the file is opened in the +@@ -219,6 +227,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int close (int @var{filedes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + The function @code{close} closes the file descriptor @var{filedes}. + Closing a file has the following consequences: + +@@ -300,6 +309,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun ssize_t read (int @var{filedes}, void *@var{buffer}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{read} function reads up to @var{size} bytes from the file + with descriptor @var{filedes}, storing the results in the @var{buffer}. + (This is not necessarily a character string, and no terminating null +@@ -395,6 +405,10 @@ + @comment unistd.h + @comment Unix98 + @deftypefun ssize_t pread (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off_t @var{offset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is usually a safe syscall. The sysdeps/posix fallback emulation ++@c is not MT-Safe because it uses lseek, read and lseek back, but is it ++@c used anywhere? + The @code{pread} function is similar to the @code{read} function. The + first three arguments are identical, and the return values and error + codes also correspond. +@@ -430,6 +444,10 @@ + @comment unistd.h + @comment Unix98 + @deftypefun ssize_t pread64 (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off64_t @var{offset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is usually a safe syscall. The sysdeps/posix fallback emulation ++@c is not MT-Safe because it uses lseek64, read and lseek64 back, but is ++@c it used anywhere? + This function is similar to the @code{pread} function. The difference + is that the @var{offset} parameter is of type @code{off64_t} instead of + @code{off_t} which makes it possible on 32 bit machines to address +@@ -447,6 +465,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun ssize_t write (int @var{filedes}, const void *@var{buffer}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{write} function writes up to @var{size} bytes from + @var{buffer} to the file with descriptor @var{filedes}. The data in + @var{buffer} is not necessarily a character string and a null character is +@@ -557,6 +576,10 @@ + @comment unistd.h + @comment Unix98 + @deftypefun ssize_t pwrite (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off_t @var{offset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is usually a safe syscall. The sysdeps/posix fallback emulation ++@c is not MT-Safe because it uses lseek, write and lseek back, but is it ++@c used anywhere? + The @code{pwrite} function is similar to the @code{write} function. The + first three arguments are identical, and the return values and error codes + also correspond. +@@ -592,6 +615,10 @@ + @comment unistd.h + @comment Unix98 + @deftypefun ssize_t pwrite64 (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off64_t @var{offset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is usually a safe syscall. The sysdeps/posix fallback emulation ++@c is not MT-Safe because it uses lseek64, write and lseek64 back, but ++@c is it used anywhere? + This function is similar to the @code{pwrite} function. The difference + is that the @var{offset} parameter is of type @code{off64_t} instead of + @code{off_t} which makes it possible on 32 bit machines to address +@@ -624,6 +651,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun off_t lseek (int @var{filedes}, off_t @var{offset}, int @var{whence}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{lseek} function is used to change the file position of the + file with descriptor @var{filedes}. + +@@ -713,6 +741,7 @@ + @comment unistd.h + @comment Unix98 + @deftypefun off64_t lseek64 (int @var{filedes}, off64_t @var{offset}, int @var{whence}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to the @code{lseek} function. The difference + is that the @var{offset} parameter is of type @code{off64_t} instead of + @code{off_t} which makes it possible on 32 bit machines to address +@@ -825,6 +854,7 @@ + @comment stdio.h + @comment POSIX.1 + @deftypefun {FILE *} fdopen (int @var{filedes}, const char *@var{opentype}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @aculock{}}} + The @code{fdopen} function returns a new stream for the file descriptor + @var{filedes}. + +@@ -853,6 +883,7 @@ + @comment stdio.h + @comment POSIX.1 + @deftypefun int fileno (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function returns the file descriptor associated with the stream + @var{stream}. If an error is detected (for example, if the @var{stream} + is not valid) or if @var{stream} does not do I/O to a file, +@@ -862,6 +893,7 @@ + @comment stdio.h + @comment GNU + @deftypefun int fileno_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fileno_unlocked} function is equivalent to the @code{fileno} + function except that it does not implicitly lock the stream if the state + is @code{FSETLOCKING_INTERNAL}. +@@ -1055,7 +1087,7 @@ + @comment BSD + @deftp {Data Type} {struct iovec} + +-The @code{iovec} structure describes a buffer. It contains two fields: ++The @code{iovec} structure describes a buffer. It contains two fields: + + @table @code + +@@ -1071,6 +1103,11 @@ + @comment sys/uio.h + @comment BSD + @deftypefun ssize_t readv (int @var{filedes}, const struct iovec *@var{vector}, int @var{count}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c The fallback sysdeps/posix implementation, used even on GNU/Linux ++@c with old kernels that lack a full readv/writev implementation, may ++@c malloc the buffer into which data is read, if the total read size is ++@c too large for alloca. + + The @code{readv} function reads data from @var{filedes} and scatters it + into the buffers described in @var{vector}, which is taken to be +@@ -1089,6 +1126,11 @@ + @comment sys/uio.h + @comment BSD + @deftypefun ssize_t writev (int @var{filedes}, const struct iovec *@var{vector}, int @var{count}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c The fallback sysdeps/posix implementation, used even on GNU/Linux ++@c with old kernels that lack a full readv/writev implementation, may ++@c malloc the buffer from which data is written, if the total write size ++@c is too large for alloca. + + The @code{writev} function gathers data from the buffers described in + @var{vector}, which is taken to be @var{count} structures long, and writes +@@ -1103,8 +1145,8 @@ + + @end deftypefun + +-@c Note - I haven't read this anywhere. I surmised it from my knowledge +-@c of computer science. Thus, there could be subtleties I'm missing. ++@c Note - I haven't read this anywhere. I surmised it from my knowledge ++@c of computer science. Thus, there could be subtleties I'm missing. + + Note that if the buffers are small (under about 1kB), high-level streams + may be easier to use than these functions. However, @code{readv} and +@@ -1149,6 +1191,7 @@ + @comment sys/mman.h + @comment POSIX + @deftypefun {void *} mmap (void *@var{address}, size_t @var{length}, int @var{protect}, int @var{flags}, int @var{filedes}, off_t @var{offset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + The @code{mmap} function creates a new mapping, connected to bytes + (@var{offset}) to (@var{offset} + @var{length} - 1) in the file open on +@@ -1156,8 +1199,8 @@ + is created, which is not removed by closing the file. + + @var{address} gives a preferred starting address for the mapping. +-@code{NULL} expresses no preference. Any previous mapping at that +-address is automatically removed. The address you give may still be ++@code{NULL} expresses no preference. Any previous mapping at that ++address is automatically removed. The address you give may still be + changed, unless you use the @code{MAP_FIXED} flag. + + @vindex PROT_READ +@@ -1221,13 +1264,13 @@ + + @c Linux has some other MAP_ options, which I have not discussed here. + @c MAP_DENYWRITE, MAP_EXECUTABLE and MAP_GROWSDOWN don't seem applicable to +-@c user programs (and I don't understand the last two). MAP_LOCKED does ++@c user programs (and I don't understand the last two). MAP_LOCKED does + @c not appear to be implemented. + + @end vtable + +-@code{mmap} returns the address of the new mapping, or @math{-1} for an +-error. ++@code{mmap} returns the address of the new mapping, or ++@code{MAP_FAILED} for an error. + + Possible errors include: + +@@ -1268,6 +1311,9 @@ + @comment sys/mman.h + @comment LFS + @deftypefun {void *} mmap64 (void *@var{address}, size_t @var{length}, int @var{protect}, int @var{flags}, int @var{filedes}, off64_t @var{offset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c The page_shift auto detection when MMAP2_PAGE_SHIFT is -1 (it never ++@c is) would be thread-unsafe. + The @code{mmap64} function is equivalent to the @code{mmap} function but + the @var{offset} parameter is of type @code{off64_t}. On 32-bit systems + this allows the file associated with the @var{filedes} descriptor to be +@@ -1284,6 +1330,7 @@ + @comment sys/mman.h + @comment POSIX + @deftypefun int munmap (void *@var{addr}, size_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{munmap} removes any memory maps from (@var{addr}) to (@var{addr} + + @var{length}). @var{length} should be the length of the mapping. +@@ -1310,6 +1357,7 @@ + @comment sys/mman.h + @comment POSIX + @deftypefun int msync (void *@var{address}, size_t @var{length}, int @var{flags}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + When using shared mappings, the kernel can write the file at any time + before the mapping is removed. To be certain data has actually been +@@ -1357,17 +1405,18 @@ + @comment sys/mman.h + @comment GNU + @deftypefun {void *} mremap (void *@var{address}, size_t @var{length}, size_t @var{new_length}, int @var{flag}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + This function can be used to change the size of an existing memory + area. @var{address} and @var{length} must cover a region entirely mapped +-in the same @code{mmap} statement. A new mapping with the same ++in the same @code{mmap} statement. A new mapping with the same + characteristics will be returned with the length @var{new_length}. + +-One option is possible, @code{MREMAP_MAYMOVE}. If it is given in ++One option is possible, @code{MREMAP_MAYMOVE}. If it is given in + @var{flags}, the system may remove the existing mapping and create a new + one of the desired length in another location. + +-The address of the resulting mapping is returned, or @math{-1}. Possible ++The address of the resulting mapping is returned, or @math{-1}. Possible + error codes include: + + @table @code +@@ -1405,6 +1454,7 @@ + @comment sys/mman.h + @comment POSIX + @deftypefun int madvise (void *@var{addr}, size_t @var{length}, int @var{advice}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + This function can be used to provide the system with @var{advice} about + the intended usage patterns of the memory region starting at @var{addr} +@@ -1418,11 +1468,11 @@ + The region should receive no further special treatment. + + @item MADV_RANDOM +-The region will be accessed via random page references. The kernel ++The region will be accessed via random page references. The kernel + should page-in the minimal number of pages for each page fault. + + @item MADV_SEQUENTIAL +-The region will be accessed via sequential page references. This ++The region will be accessed via sequential page references. This + may cause the kernel to aggressively read-ahead, expecting further + sequential references after any page fault within this region. + +@@ -1471,6 +1521,58 @@ + @end table + @end deftypefun + ++@comment sys/mman.h ++@comment POSIX ++@deftypefn Function int shm_open (const char *@var{name}, int @var{oflag}, mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asuinit{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c shm_open @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_once(where_is_shmfs) @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd ++@c where_is_shmfs @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c statfs dup ok ++@c setmntent dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c getmntent_r dup @mtslocale @ascuheap @aculock @acsmem [no @asucorrupt @acucorrupt; exclusive stream] ++@c strcmp dup ok ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c mempcpy dup ok ++@c endmntent dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c strlen dup ok ++@c strchr dup ok ++@c mempcpy dup ok ++@c open dup @acsfd ++@c fcntl dup ok ++@c close dup @acsfd ++ ++This function returns a file descriptor that can be used to allocate shared ++memory via mmap. Unrelated processes can use same @var{name} to create or ++open existing shared memory objects. ++ ++A @var{name} argument specifies the shared memory object to be opened. ++In @theglibc{} it must be a string smaller than @code{NAME_MAX} bytes starting ++with an optional slash but containing no other slashes. ++ ++The semantics of @var{oflag} and @var{mode} arguments is same as in @code{open}. ++ ++@code{shm_open} returns the file descriptor on success or @math{-1} on error. ++On failure @code{errno} is set. ++@end deftypefn ++ ++@deftypefn Function int shm_unlink (const char *@var{name}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asuinit{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c shm_unlink @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_once(where_is_shmfs) dup @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd ++@c strlen dup ok ++@c strchr dup ok ++@c mempcpy dup ok ++@c unlink dup ok ++ ++This function is inverse of @code{shm_open} and removes the object with ++the given @var{name} previously created by @code{shm_open}. ++ ++@code{shm_unlink} returns @math{0} on success or @math{-1} on error. ++On failure @code{errno} is set. ++@end deftypefn ++ + @node Waiting for I/O + @section Waiting for Input or Output + @cindex waiting for input or output +@@ -1531,6 +1633,7 @@ + @comment sys/types.h + @comment BSD + @deftypefn Macro void FD_ZERO (fd_set *@var{set}) ++@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}} + This macro initializes the file descriptor set @var{set} to be the + empty set. + @end deftypefn +@@ -1538,6 +1641,9 @@ + @comment sys/types.h + @comment BSD + @deftypefn Macro void FD_SET (int @var{filedes}, fd_set *@var{set}) ++@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}} ++@c Setting a bit isn't necessarily atomic, so there's a potential race ++@c here if set is not used exclusively. + This macro adds @var{filedes} to the file descriptor set @var{set}. + + The @var{filedes} parameter must not have side effects since it is +@@ -1547,6 +1653,9 @@ + @comment sys/types.h + @comment BSD + @deftypefn Macro void FD_CLR (int @var{filedes}, fd_set *@var{set}) ++@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}} ++@c Setting a bit isn't necessarily atomic, so there's a potential race ++@c here if set is not used exclusively. + This macro removes @var{filedes} from the file descriptor set @var{set}. + + The @var{filedes} parameter must not have side effects since it is +@@ -1556,6 +1665,7 @@ + @comment sys/types.h + @comment BSD + @deftypefn Macro int FD_ISSET (int @var{filedes}, const fd_set *@var{set}) ++@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}} + This macro returns a nonzero value (true) if @var{filedes} is a member + of the file descriptor set @var{set}, and zero (false) otherwise. + +@@ -1568,6 +1678,10 @@ + @comment sys/types.h + @comment BSD + @deftypefun int select (int @var{nfds}, fd_set *@var{read-fds}, fd_set *@var{write-fds}, fd_set *@var{except-fds}, struct timeval *@var{timeout}) ++@safety{@prelim{}@mtsafe{@mtsrace{:read-fds} @mtsrace{:write-fds} @mtsrace{:except-fds}}@assafe{}@acsafe{}} ++@c The select syscall is preferred, but pselect6 may be used instead, ++@c which requires converting timeout to a timespec and back. The ++@c conversions are not atomic. + The @code{select} function blocks the calling process until there is + activity on any of the specified sets of file descriptors, or until the + timeout period has expired. +@@ -1669,15 +1783,14 @@ + + @comment unistd.h + @comment X/Open +-@deftypefun int sync (void) ++@deftypefun void sync (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + A call to this function will not return as long as there is data which + has not been written to the device. All dirty buffers in the kernel will + be written and so an overall consistent system can be achieved (if no + other process in parallel writes data). + + A prototype for @code{sync} can be found in @file{unistd.h}. +- +-The return value is zero to indicate no error. + @end deftypefun + + Programs more often want to ensure that data written to a given file is +@@ -1687,6 +1800,7 @@ + @comment unistd.h + @comment POSIX + @deftypefun int fsync (int @var{fildes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fsync} function can be used to make sure all data associated with + the open file @var{fildes} is written to the device associated with the + descriptor. The function call does not return unless all actions have +@@ -1724,6 +1838,7 @@ + @comment unistd.h + @comment POSIX + @deftypefun int fdatasync (int @var{fildes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + When a call to the @code{fdatasync} function returns, it is ensured + that all of the file data is written to the device. For all pending I/O + operations, the parts guaranteeing data integrity finished. +@@ -1925,6 +2040,158 @@ + @comment aio.h + @comment POSIX.1b + @deftypefun int aio_read (struct aiocb *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} ++@c Calls aio_enqueue_request. ++@c aio_enqueue_request @asulock @ascuheap @aculock @acsmem ++@c pthread_self ok ++@c pthread_getschedparam @asulock @aculock ++@c lll_lock (pthread descriptor's lock) @asulock @aculock ++@c sched_getparam ok ++@c sched_getscheduler ok ++@c lll_unlock @aculock ++@c pthread_mutex_lock (aio_requests_mutex) @asulock @aculock ++@c get_elem @ascuheap @acsmem [@asucorrupt @acucorrupt] ++@c realloc @ascuheap @acsmem ++@c calloc @ascuheap @acsmem ++@c aio_create_helper_thread @asulock @ascuheap @aculock @acsmem ++@c pthread_attr_init ok ++@c pthread_attr_setdetachstate ok ++@c pthread_get_minstack ok ++@c pthread_attr_setstacksize ok ++@c sigfillset ok ++@c memset ok ++@c sigdelset ok ++@c SYSCALL rt_sigprocmask ok ++@c pthread_create @asulock @ascuheap @aculock @acsmem ++@c lll_lock (default_pthread_attr_lock) @asulock @aculock ++@c alloca/malloc @ascuheap @acsmem ++@c lll_unlock @aculock ++@c allocate_stack @asulock @ascuheap @aculock @acsmem ++@c getpagesize dup ++@c lll_lock (default_pthread_attr_lock) @asulock @aculock ++@c lll_unlock @aculock ++@c _dl_allocate_tls @ascuheap @acsmem ++@c _dl_allocate_tls_storage @ascuheap @acsmem ++@c memalign @ascuheap @acsmem ++@c memset ok ++@c allocate_dtv dup ++@c free @ascuheap @acsmem ++@c allocate_dtv @ascuheap @acsmem ++@c calloc @ascuheap @acsmem ++@c INSTALL_DTV ok ++@c list_add dup ++@c get_cached_stack ++@c lll_lock (stack_cache_lock) @asulock @aculock ++@c list_for_each ok ++@c list_entry dup ++@c FREE_P dup ++@c stack_list_del dup ++@c stack_list_add dup ++@c lll_unlock @aculock ++@c _dl_allocate_tls_init ok ++@c GET_DTV ok ++@c mmap ok ++@c atomic_increment_val ok ++@c munmap ok ++@c change_stack_perm ok ++@c mprotect ok ++@c mprotect ok ++@c stack_list_del dup ++@c _dl_deallocate_tls dup ++@c munmap ok ++@c THREAD_COPY_STACK_GUARD ok ++@c THREAD_COPY_POINTER_GUARD ok ++@c atomic_exchange_acq ok ++@c lll_futex_wake ok ++@c deallocate_stack @asulock @ascuheap @aculock @acsmem ++@c lll_lock (state_cache_lock) @asulock @aculock ++@c stack_list_del ok ++@c atomic_write_barrier ok ++@c list_del ok ++@c atomic_write_barrier ok ++@c queue_stack @ascuheap @acsmem ++@c stack_list_add ok ++@c atomic_write_barrier ok ++@c list_add ok ++@c atomic_write_barrier ok ++@c free_stacks @ascuheap @acsmem ++@c list_for_each_prev_safe ok ++@c list_entry ok ++@c FREE_P ok ++@c stack_list_del dup ++@c _dl_deallocate_tls dup ++@c munmap ok ++@c _dl_deallocate_tls @ascuheap @acsmem ++@c free @ascuheap @acsmem ++@c lll_unlock @aculock ++@c create_thread @asulock @ascuheap @aculock @acsmem ++@c td_eventword ++@c td_eventmask ++@c do_clone @asulock @ascuheap @aculock @acsmem ++@c PREPARE_CREATE ok ++@c lll_lock (pd->lock) @asulock @aculock ++@c atomic_increment ok ++@c clone ok ++@c atomic_decrement ok ++@c atomic_exchange_acq ok ++@c lll_futex_wake ok ++@c deallocate_stack dup ++@c sched_setaffinity ok ++@c tgkill ok ++@c sched_setscheduler ok ++@c atomic_compare_and_exchange_bool_acq ok ++@c nptl_create_event ok ++@c lll_unlock (pd->lock) @aculock ++@c free @ascuheap @acsmem ++@c pthread_attr_destroy ok (cpuset won't be set, so free isn't called) ++@c add_request_to_runlist ok ++@c pthread_cond_signal ok ++@c aio_free_request ok ++@c pthread_mutex_unlock @aculock ++ ++@c (in the new thread, initiated with clone) ++@c start_thread ok ++@c HP_TIMING_NOW ok ++@c ctype_init @mtslocale ++@c atomic_exchange_acq ok ++@c lll_futex_wake ok ++@c sigemptyset ok ++@c sigaddset ok ++@c setjmp ok ++@c CANCEL_ASYNC -> pthread_enable_asynccancel ok ++@c do_cancel ok ++@c pthread_unwind ok ++@c Unwind_ForcedUnwind or longjmp ok [@ascuheap @acsmem?] ++@c lll_lock @asulock @aculock ++@c lll_unlock @asulock @aculock ++@c CANCEL_RESET -> pthread_disable_asynccancel ok ++@c lll_futex_wait ok ++@c ->start_routine ok ----- ++@c call_tls_dtors @asulock @ascuheap @aculock @acsmem ++@c user-supplied dtor ++@c rtld_lock_lock_recursive (dl_load_lock) @asulock @aculock ++@c rtld_lock_unlock_recursive @aculock ++@c free @ascuheap @acsmem ++@c nptl_deallocate_tsd @ascuheap @acsmem ++@c tsd user-supplied dtors ok ++@c free @ascuheap @acsmem ++@c libc_thread_freeres ++@c libc_thread_subfreeres ok ++@c atomic_decrement_and_test ok ++@c td_eventword ok ++@c td_eventmask ok ++@c atomic_compare_exchange_bool_acq ok ++@c nptl_death_event ok ++@c lll_robust_dead ok ++@c getpagesize ok ++@c madvise ok ++@c free_tcb @asulock @ascuheap @aculock @acsmem ++@c free @ascuheap @acsmem ++@c deallocate_stack @asulock @ascuheap @aculock @acsmem ++@c lll_futex_wait ok ++@c exit_thread_inline ok ++@c syscall(exit) ok ++ + This function initiates an asynchronous read operation. It + immediately returns after the operation was enqueued or when an + error was encountered. +@@ -1989,7 +2256,8 @@ + + @comment aio.h + @comment Unix98 +-@deftypefun int aio_read64 (struct aiocb *@var{aiocbp}) ++@deftypefun int aio_read64 (struct aiocb64 *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} + This function is similar to the @code{aio_read} function. The only + difference is that on @w{32 bit} machines, the file descriptor should + be opened in the large file mode. Internally, @code{aio_read64} uses +@@ -2008,13 +2276,14 @@ + @comment aio.h + @comment POSIX.1b + @deftypefun int aio_write (struct aiocb *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} + This function initiates an asynchronous write operation. The function + call immediately returns after the operation was enqueued or if before + this happens an error was encountered. + + The first @code{aiocbp->aio_nbytes} bytes from the buffer starting at + @code{aiocbp->aio_buf} are written to the file for which +-@code{aiocbp->aio_fildes} is an descriptor, starting at the absolute ++@code{aiocbp->aio_fildes} is a descriptor, starting at the absolute + position @code{aiocbp->aio_offset} in the file. + + If prioritized I/O is supported by the platform, the +@@ -2073,7 +2342,8 @@ + + @comment aio.h + @comment Unix98 +-@deftypefun int aio_write64 (struct aiocb *@var{aiocbp}) ++@deftypefun int aio_write64 (struct aiocb64 *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} + This function is similar to the @code{aio_write} function. The only + difference is that on @w{32 bit} machines the file descriptor should + be opened in the large file mode. Internally @code{aio_write64} uses +@@ -2095,6 +2365,12 @@ + @comment aio.h + @comment POSIX.1b + @deftypefun int lio_listio (int @var{mode}, struct aiocb *const @var{list}[], int @var{nent}, struct sigevent *@var{sig}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} ++@c Call lio_listio_internal, that takes the aio_requests_mutex lock and ++@c enqueues each request. Then, it waits for notification or prepares ++@c for it before releasing the lock. Even though it performs memory ++@c allocation and locking of its own, it doesn't add any classes of ++@c safety issues that aren't already covered by aio_enqueue_request. + The @code{lio_listio} function can be used to enqueue an arbitrary + number of read and write requests at one time. The requests can all be + meant for the same file, all for different files or every solution in +@@ -2177,7 +2453,8 @@ + + @comment aio.h + @comment Unix98 +-@deftypefun int lio_listio64 (int @var{mode}, struct aiocb *const @var{list}, int @var{nent}, struct sigevent *@var{sig}) ++@deftypefun int lio_listio64 (int @var{mode}, struct aiocb64 *const @var{list}[], int @var{nent}, struct sigevent *@var{sig}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} + This function is similar to the @code{lio_listio} function. The only + difference is that on @w{32 bit} machines, the file descriptor should + be opened in the large file mode. Internally, @code{lio_listio64} uses +@@ -2206,6 +2483,7 @@ + @comment aio.h + @comment POSIX.1b + @deftypefun int aio_error (const struct aiocb *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function determines the error state of the request described by the + @code{struct aiocb} variable pointed to by @var{aiocbp}. If the + request has not yet terminated the value returned is always +@@ -2227,6 +2505,7 @@ + @comment aio.h + @comment Unix98 + @deftypefun int aio_error64 (const struct aiocb64 *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{aio_error} with the only difference + that the argument is a reference to a variable of type @code{struct + aiocb64}. +@@ -2239,7 +2518,8 @@ + + @comment aio.h + @comment POSIX.1b +-@deftypefun ssize_t aio_return (const struct aiocb *@var{aiocbp}) ++@deftypefun ssize_t aio_return (struct aiocb *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function can be used to retrieve the return status of the operation + carried out by the request described in the variable pointed to by + @var{aiocbp}. As long as the error status of this request as returned +@@ -2262,7 +2542,8 @@ + + @comment aio.h + @comment Unix98 +-@deftypefun int aio_return64 (const struct aiocb64 *@var{aiocbp}) ++@deftypefun ssize_t aio_return64 (struct aiocb64 *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{aio_return} with the only difference + that the argument is a reference to a variable of type @code{struct + aiocb64}. +@@ -2291,6 +2572,9 @@ + @comment aio.h + @comment POSIX.1b + @deftypefun int aio_fsync (int @var{op}, struct aiocb *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} ++@c After fcntl to check that the FD is open, it calls ++@c aio_enqueue_request. + Calling this function forces all I/O operations operating queued at the + time of the function call operating on the file descriptor + @code{aiocbp->aio_fildes} into the synchronized I/O completion state +@@ -2322,8 +2606,7 @@ + @item EAGAIN + The request could not be enqueued due to temporary lack of resources. + @item EBADF +-The file descriptor @code{aiocbp->aio_fildes} is not valid or not open +-for writing. ++The file descriptor @code{@var{aiocbp}->aio_fildes} is not valid. + @item EINVAL + The implementation does not support I/O synchronization or the @var{op} + parameter is other than @code{O_DSYNC} and @code{O_SYNC}. +@@ -2339,6 +2622,7 @@ + @comment aio.h + @comment Unix98 + @deftypefun int aio_fsync64 (int @var{op}, struct aiocb64 *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} + This function is similar to @code{aio_fsync} with the only difference + that the argument is a reference to a variable of type @code{struct + aiocb64}. +@@ -2365,6 +2649,9 @@ + @comment aio.h + @comment POSIX.1b + @deftypefun int aio_suspend (const struct aiocb *const @var{list}[], int @var{nent}, const struct timespec *@var{timeout}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c Take aio_requests_mutex, set up waitlist and requestlist, wait ++@c for completion or timeout, and release the mutex. + When calling this function, the calling thread is suspended until at + least one of the requests pointed to by the @var{nent} elements of the + array @var{list} has completed. If any of the requests has already +@@ -2403,6 +2690,7 @@ + @comment aio.h + @comment Unix98 + @deftypefun int aio_suspend64 (const struct aiocb64 *const @var{list}[], int @var{nent}, const struct timespec *@var{timeout}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + This function is similar to @code{aio_suspend} with the only difference + that the argument is a reference to a variable of type @code{struct + aiocb64}. +@@ -2430,6 +2718,16 @@ + @comment aio.h + @comment POSIX.1b + @deftypefun int aio_cancel (int @var{fildes}, struct aiocb *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} ++@c After fcntl to check the fd is open, hold aio_requests_mutex, call ++@c aio_find_req_fd, aio_remove_request, then aio_notify and ++@c aio_free_request each request before releasing the lock. ++@c aio_notify calls aio_notify_only and free, besides cond signal or ++@c similar. aio_notify_only calls pthread_attr_init, ++@c pthread_attr_setdetachstate, malloc, pthread_create, ++@c notify_func_wrapper, aio_sigqueue, getpid, raise. ++@c notify_func_wraper calls aio_start_notify_thread, free and then the ++@c notifier function. + The @code{aio_cancel} function can be used to cancel one or more + outstanding requests. If the @var{aiocbp} parameter is @code{NULL}, the + function tries to cancel all of the outstanding requests which would process +@@ -2477,6 +2775,7 @@ + @comment aio.h + @comment Unix98 + @deftypefun int aio_cancel64 (int @var{fildes}, struct aiocb64 *@var{aiocbp}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} + This function is similar to @code{aio_cancel} with the only difference + that the argument is a reference to a variable of type @code{struct + aiocb64}. +@@ -2532,6 +2831,8 @@ + @comment aio.h + @comment GNU + @deftypefun void aio_init (const struct aioinit *@var{init}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c All changes to global objects are guarded by aio_requests_mutex. + This function must be called before any other AIO function. Calling it + is completely voluntary, as it is only meant to help the AIO + implementation perform better. +@@ -2566,6 +2867,7 @@ + @comment fcntl.h + @comment POSIX.1 + @deftypefun int fcntl (int @var{filedes}, int @var{command}, @dots{}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{fcntl} function performs the operation specified by + @var{command} on the file descriptor @var{filedes}. Some commands + require additional arguments to be supplied. These additional arguments +@@ -2592,7 +2894,7 @@ + Set flags associated with the open file. @xref{File Status Flags}. + + @item F_GETLK +-Get a file lock. @xref{File Locks}. ++Test a file lock. @xref{File Locks}. + + @item F_SETLK + Set or clear a file lock. @xref{File Locks}. +@@ -2648,6 +2962,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int dup (int @var{old}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function copies descriptor @var{old} to the first available + descriptor number (the first number not currently open). It is + equivalent to @code{fcntl (@var{old}, F_DUPFD, 0)}. +@@ -2656,6 +2971,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int dup2 (int @var{old}, int @var{new}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function copies the descriptor @var{old} to descriptor number + @var{new}. + +@@ -2929,19 +3245,19 @@ + But most programs will want to be portable to other POSIX.1 systems and + should use the POSIX.1 names above instead. + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment GNU + @deftypevr Macro int O_READ + Open the file for reading. Same as @code{O_RDONLY}; only defined on GNU. + @end deftypevr + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment GNU + @deftypevr Macro int O_WRITE + Open the file for writing. Same as @code{O_WRONLY}; only defined on GNU. + @end deftypevr + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment GNU + @deftypevr Macro int O_EXEC + Open the file for executing. Only defined on GNU. +@@ -3045,7 +3361,7 @@ + The following three file name translation flags exist only on + @gnuhurdsystems{}. + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment GNU + @deftypevr Macro int O_IGNORE_CTTY + Do not recognize the named file as the controlling terminal, even if it +@@ -3054,7 +3370,7 @@ + @xref{Job Control}. + @end deftypevr + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment GNU + @deftypevr Macro int O_NOLINK + If the named file is a symbolic link, open the link itself instead of +@@ -3063,7 +3379,7 @@ + @cindex symbolic link, opening + @end deftypevr + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment GNU + @deftypevr Macro int O_NOTRANS + If the named file is specially translated, do not invoke the translator. +@@ -3095,7 +3411,7 @@ + The remaining operating modes are BSD extensions. They exist only + on some systems. On other systems, these macros are not defined. + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment BSD + @deftypevr Macro int O_SHLOCK + Acquire a shared lock on the file, as with @code{flock}. +@@ -3106,7 +3422,7 @@ + the lock on the new file first. + @end deftypevr + +-@comment fcntl.h ++@comment fcntl.h (optional) + @comment BSD + @deftypevr Macro int O_EXLOCK + Acquire an exclusive lock on the file, as with @code{flock}. +@@ -3599,7 +4134,7 @@ + @gnusystems{} can handle most input/output operations on many different + devices and objects in terms of a few file primitives - @code{read}, + @code{write} and @code{lseek}. However, most devices also have a few +-peculiar operations which do not fit into this model. Such as: ++peculiar operations which do not fit into this model. Such as: + + @itemize @bullet + +@@ -3634,6 +4169,7 @@ + @comment sys/ioctl.h + @comment BSD + @deftypefun int ioctl (int @var{filedes}, int @var{command}, @dots{}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + The @code{ioctl} function performs the generic I/O operation + @var{command} on @var{filedes}. +@@ -3653,3 +4189,6 @@ + Most IOCTLs are OS-specific and/or only used in special system utilities, + and are thus beyond the scope of this document. For an example of the use + of an IOCTL, see @ref{Out-of-Band Data}. ++ ++@c FIXME this is undocumented: ++@c dup3 +diff -urN glibc-2.17-c758a686/manual/locale.texi glibc-2.17-c758a686/manual/locale.texi +--- glibc-2.17-c758a686/manual/locale.texi 2014-09-12 16:08:18.266069610 -0400 ++++ glibc-2.17-c758a686/manual/locale.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -231,6 +231,136 @@ + @comment locale.h + @comment ISO + @deftypefun {char *} setlocale (int @var{category}, const char *@var{locale}) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtslocale{}} @mtsenv{}}@asunsafe{@asuinit{} @asulock{} @ascuheap{} @asucorrupt{}}@acunsafe{@acuinit{} @acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c Uses of the global locale object are unguarded in functions that ++@c ought to be MT-Safe, so we're ruling out the use of this function ++@c once threads are started. It takes a write lock itself, but it may ++@c return a pointer loaded from the global locale object after releasing ++@c the lock, or before taking it. ++@c setlocale @mtasuconst:@mtslocale @mtsenv @asuinit @ascuheap @asulock @asucorrupt @acucorrupt @acsmem @acsfd @aculock ++@c libc_rwlock_wrlock @asulock @aculock ++@c libc_rwlock_unlock @aculock ++@c getenv LOCPATH @mtsenv ++@c malloc @ascuheap @acsmem ++@c free @ascuheap @acsmem ++@c new_composite_name ok ++@c setdata ok ++@c setname ok ++@c _nl_find_locale @mtsenv @asuinit @ascuheap @asulock @asucorrupt @acucorrupt @acsmem @acsfd @aculock ++@c getenv LC_ALL and LANG @mtsenv ++@c _nl_load_locale_from_archive @ascuheap @acucorrupt @acsmem @acsfd ++@c sysconf _SC_PAGE_SIZE ok ++@c _nl_normalize_codeset @ascuheap @acsmem ++@c isalnum_l ok (C locale) ++@c isdigit_l ok (C locale) ++@c malloc @ascuheap @acsmem ++@c tolower_l ok (C locale) ++@c open_not_cancel_2 @acsfd ++@c fxstat64 ok ++@c close_not_cancel_no_status ok ++@c __mmap64 @acsmem ++@c calculate_head_size ok ++@c __munmap ok ++@c compute_hashval ok ++@c qsort dup @acucorrupt ++@c rangecmp ok ++@c malloc @ascuheap @acsmem ++@c strdup @ascuheap @acsmem ++@c _nl_intern_locale_data @ascuheap @acsmem ++@c malloc @ascuheap @acsmem ++@c free @ascuheap @acsmem ++@c _nl_expand_alias @ascuheap @asulock @acsmem @acsfd @aculock ++@c libc_lock_lock @asulock @aculock ++@c bsearch ok ++@c alias_compare ok ++@c strcasecmp ok ++@c read_alias_file @ascuheap @asulock @acsmem @acsfd @aculock ++@c fopen @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking ok ++@c feof_unlocked ok ++@c fgets_unlocked ok ++@c isspace ok (locale mutex is locked) ++@c extend_alias_table @ascuheap @acsmem ++@c realloc @ascuheap @acsmem ++@c realloc @ascuheap @acsmem ++@c fclose @ascuheap @asulock @acsmem @acsfd @aculock ++@c qsort @ascuheap @acsmem ++@c alias_compare dup ++@c libc_lock_unlock @aculock ++@c _nl_explode_name @ascuheap @acsmem ++@c _nl_find_language ok ++@c _nl_normalize_codeset dup @ascuheap @acsmem ++@c _nl_make_l10nflist @ascuheap @acsmem ++@c malloc @ascuheap @acsmem ++@c free @ascuheap @acsmem ++@c __argz_stringify ok ++@c __argz_count ok ++@c __argz_next ok ++@c _nl_load_locale @ascuheap @acsmem @acsfd ++@c open_not_cancel_2 @acsfd ++@c __fxstat64 ok ++@c close_not_cancel_no_status ok ++@c mmap @acsmem ++@c malloc @ascuheap @acsmem ++@c read_not_cancel ok ++@c free @ascuheap @acsmem ++@c _nl_intern_locale_data dup @ascuheap @acsmem ++@c munmap ok ++@c __gconv_compare_alias @asuinit @ascuheap @asucorrupt @asulock @acsmem@acucorrupt @acsfd @aculock ++@c __gconv_read_conf @asuinit @ascuheap @asucorrupt @asulock @acsmem@acucorrupt @acsfd @aculock ++@c (libc_once-initializes gconv_cache and gconv_path_envvar; they're ++@c never modified afterwards) ++@c __gconv_load_cache @ascuheap @acsmem @acsfd ++@c getenv GCONV_PATH @mtsenv ++@c open_not_cancel @acsfd ++@c __fxstat64 ok ++@c close_not_cancel_no_status ok ++@c mmap @acsmem ++@c malloc @ascuheap @acsmem ++@c __read ok ++@c free @ascuheap @acsmem ++@c munmap ok ++@c __gconv_get_path @asulock @ascuheap @aculock @acsmem @acsfd ++@c getcwd @ascuheap @acsmem @acsfd ++@c libc_lock_lock @asulock @aculock ++@c malloc @ascuheap @acsmem ++@c strtok_r ok ++@c libc_lock_unlock @aculock ++@c read_conf_file @ascuheap @asucorrupt @asulock @acsmem @acucorrupt @acsfd @aculock ++@c fopen @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking ok ++@c feof_unlocked ok ++@c getdelim @ascuheap @asucorrupt @acsmem @acucorrupt ++@c isspace_l ok (C locale) ++@c add_alias ++@c isspace_l ok (C locale) ++@c toupper_l ok (C locale) ++@c add_alias2 dup @ascuheap @acucorrupt @acsmem ++@c add_module @ascuheap @acsmem ++@c isspace_l ok (C locale) ++@c toupper_l ok (C locale) ++@c strtol ok (@mtslocale but we hold the locale lock) ++@c tfind __gconv_alias_db ok ++@c __gconv_alias_compare dup ok ++@c calloc @ascuheap @acsmem ++@c insert_module dup @ascuheap ++@c __tfind ok (because the tree is read only by then) ++@c __gconv_alias_compare dup ok ++@c insert_module @ascuheap ++@c free @ascuheap ++@c add_alias2 @ascuheap @acucorrupt @acsmem ++@c detect_conflict ok, reads __gconv_modules_db ++@c malloc @ascuheap @acsmem ++@c tsearch __gconv_alias_db @ascuheap @acucorrupt @acsmem [exclusive tree, no @mtsrace] ++@c __gconv_alias_compare ok ++@c free @ascuheap ++@c __gconv_compare_alias_cache ok ++@c find_module_idx ok ++@c do_lookup_alias ok ++@c __tfind ok (because the tree is read only by then) ++@c __gconv_alias_compare ok ++@c strndup @ascuheap @acsmem ++@c strcasecmp_l ok (C locale) + The function @code{setlocale} sets the current locale for category + @var{category} to @var{locale}. + +@@ -496,6 +626,10 @@ + @comment locale.h + @comment ISO + @deftypefun {struct lconv *} localeconv (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:localeconv} @mtslocale{}}@asunsafe{}@acsafe{}} ++@c This function reads from multiple components of the locale object, ++@c without synchronization, while writing to the static buffer it uses ++@c as the return value. + The @code{localeconv} function returns a pointer to a structure whose + components contain information about how numeric and monetary values + should be formatted in the current locale. +@@ -762,6 +896,9 @@ + @comment langinfo.h + @comment XOPEN + @deftypefun {char *} nl_langinfo (nl_item @var{item}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c It calls _nl_langinfo_l with the current locale, which returns a ++@c pointer into constant strings defined in locale data structures. + The @code{nl_langinfo} function can be used to access individual + elements of the locale categories. Unlike the @code{localeconv} + function, which returns all the information, @code{nl_langinfo} +@@ -1056,6 +1193,11 @@ + numbers according to these rules. + + @deftypefun ssize_t strfmon (char *@var{s}, size_t @var{maxsize}, const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c It (and strfmon_l) both call vstrfmon_l, which, besides accessing the ++@c locale object passed to it, accesses the active locale through ++@c isdigit (but to_digit assumes ASCII digits only). It may call ++@c __printf_fp (@mtslocale @ascuheap @acsmem) and guess_grouping (safe). + The @code{strfmon} function is similar to the @code{strftime} function + in that it takes a buffer, its size, a format string, + and values to write into the buffer as text in a form specified +@@ -1267,6 +1409,10 @@ + @comment GNU + @comment stdlib.h + @deftypefun int rpmatch (const char *@var{response}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c Calls nl_langinfo with YESEXPR and NOEXPR, triggering @mtslocale but ++@c it's regcomp and regexec that bring in all of the safety issues. ++@c regfree is also called, but it doesn't introduce any further issues. + The function @code{rpmatch} checks the string in @var{response} whether + or not it is a correct yes-or-no answer and if yes, which one. The + check uses the @code{YESEXPR} and @code{NOEXPR} data in the +@@ -1318,5 +1464,5 @@ + free (line); + @end smallexample + +-Note that the loop continues until an read error is detected or until a ++Note that the loop continues until a read error is detected or until a + definitive (positive or negative) answer is read. +diff -urN glibc-2.17-c758a686/manual/macros.texi glibc-2.17-c758a686/manual/macros.texi +--- glibc-2.17-c758a686/manual/macros.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/macros.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -35,16 +35,225 @@ + GNU/Linux and GNU/Hurd systems + @end macro + +-@c Descrption applying to GNU/Hurd systems; that is, systems using the ++@c Description applying to GNU/Hurd systems; that is, systems using the + @c GNU Hurd with the GNU C Library. + @macro gnuhurdsystems + GNU/Hurd systems + @end macro + +-@c Descrption applying to GNU/Linux systems; that is, systems using ++@c Description applying to GNU/Linux systems; that is, systems using + @c the Linux kernel with the GNU C Library. + @macro gnulinuxsystems + GNU/Linux systems + @end macro + ++@c Document the safety functions as preliminary. It does NOT expand its ++@c comments. ++@macro prelim {comments} ++Preliminary: ++ ++@end macro ++@c Document a function as thread safe. ++@macro mtsafe {comments} ++| MT-Safe \comments\ ++ ++@end macro ++@c Document a function as thread unsafe. ++@macro mtunsafe {comments} ++| MT-Unsafe \comments\ ++ ++@end macro ++@c Document a function as safe for use in asynchronous signal handlers. ++@macro assafe {comments} ++| AS-Safe \comments\ ++ ++@end macro ++@c Document a function as unsafe for use in asynchronous signal ++@c handlers. This distinguishes unmarked functions, for which this ++@c property has not been assessed, from those that have been analyzed. ++@macro asunsafe {comments} ++| AS-Unsafe \comments\ ++ ++@end macro ++@c Document a function as safe for use when asynchronous cancellation is ++@c enabled. ++@macro acsafe {comments} ++| AC-Safe \comments\ ++ ++@end macro ++@c Document a function as unsafe for use when asynchronous cancellation ++@c is enabled. This distinguishes unmarked functions, for which this ++@c property has not been assessed, from those that have been analyzed. ++@macro acunsafe {comments} ++| AC-Unsafe \comments\ ++ ++@end macro ++@c Format safety properties without referencing the section of the ++@c definitions. To be used in the definitions of the properties ++@c themselves. ++@macro sampsafety {notes} ++@noindent ++\notes\| ++ ++ ++@end macro ++@c Format the safety properties of a function. ++@macro safety {notes} ++\notes\| @xref{POSIX Safety Concepts}. ++ ++ ++@end macro ++@c Function is MT- and AS-Unsafe due to an internal race. ++@macro mtasurace {comments} ++race\comments\ ++@end macro ++@c Function is AS-Unsafe due to an internal race. ++@macro asurace {comments} ++race\comments\ ++@end macro ++@c Function is MT-Safe, but with potential race on user-supplied object ++@c of opaque type. ++@macro mtsrace {comments} ++race\comments\ ++@end macro ++@c Function is MT- and AS-Unsafe for modifying an object that is decreed ++@c MT-constant due to MT-Unsafe accesses elsewhere. ++@macro mtasuconst {comments} ++const\comments\ ++@end macro ++@c Function accesses the assumed-constant locale object. ++@macro mtslocale {comments} ++locale\comments\ ++@end macro ++@c Function accesses the assumed-constant environment. ++@macro mtsenv {comments} ++env\comments\ ++@end macro ++@c Function accesses the assumed-constant hostid. ++@macro mtshostid {comments} ++hostid\comments\ ++@end macro ++@c Function accesses the assumed-constant _sigintr variable. ++@macro mtssigintr {comments} ++sigintr\comments\ ++@end macro ++@c Function performs MT-Unsafe initialization at the first call. ++@macro mtuinit {comments} ++init\comments\ ++@end macro ++@c Function performs libc_once AS-Unsafe initialization. ++@macro asuinit {comments} ++init\comments\ ++@end macro ++@c Function performs libc_once AC-Unsafe initialization. ++@macro acuinit {comments} ++init\comments\ ++@end macro ++@c Function is AS-Unsafe because it takes a non-recursive mutex that may ++@c already be held by the function interrupted by the signal. ++@macro asulock {comments} ++lock\comments\ ++@end macro ++@c Function is AC-Unsafe because it may fail to release a mutex. ++@macro aculock {comments} ++lock\comments\ ++@end macro ++@c Function is AS-Unsafe because some data structure may be inconsistent ++@c due to an ongoing updated interrupted by a signal. ++@macro asucorrupt {comments} ++corrupt\comments\ ++@end macro ++@c Function is AC-Unsafe because some data structure may be left ++@c inconsistent when cancelled. ++@macro acucorrupt {comments} ++corrupt\comments\ ++@end macro ++@c Function is AS- and AC-Unsafe because of malloc/free. ++@macro ascuheap {comments} ++heap\comments\ ++@end macro ++@c Function is AS-Unsafe because of malloc/free. ++@macro asuheap {comments} ++heap\comments\ ++@end macro ++@c Function is AS- and AC-Unsafe because of dlopen/dlclose. ++@macro ascudlopen {comments} ++dlopen\comments\ ++@end macro ++@c Function is AS- and AC-Unsafe because of unknown plugins. ++@macro ascuplugin {comments} ++plugin\comments\ ++@end macro ++@c Function is AS- and AC-Unsafe because of i18n. ++@macro ascuintl {comments} ++i18n\comments\ ++@end macro ++@c Function is AS--Unsafe because of i18n. ++@macro asuintl {comments} ++i18n\comments\ ++@end macro ++@c Function may leak file descriptors if async-cancelled. ++@macro acsfd {comments} ++fd\comments\ ++@end macro ++@c Function may leak memory if async-cancelled. ++@macro acsmem {comments} ++mem\comments\ ++@end macro ++@c Function is unsafe due to temporary overriding a signal handler. ++@macro mtascusig {comments} ++sig\comments\ ++@end macro ++@c Function is MT- and AS-Unsafe due to temporarily changing attributes ++@c of the controlling terminal. ++@macro mtasuterm {comments} ++term\comments\ ++@end macro ++@c Function is AC-Unsafe for failing to restore attributes of the ++@c controlling terminal. ++@macro acuterm {comments} ++term\comments\ ++@end macro ++@c Function sets timers atomically. ++@macro mtstimer {comments} ++timer\comments\ ++@end macro ++@c Function sets and restores timers. ++@macro mtascutimer {comments} ++timer\comments\ ++@end macro ++@c Function temporarily changes the current working directory. ++@macro mtasscwd {comments} ++cwd\comments\ ++@end macro ++@c Function may fail to restore to the original current working ++@c directory after temporarily changing it. ++@macro acscwd {comments} ++cwd\comments\ ++@end macro ++@c Function is MT-Safe while POSIX says it needn't be MT-Safe. ++@macro mtsposix {comments} ++!posix\comments\ ++@end macro ++@c Function is MT-Unsafe while POSIX says it should be MT-Safe. ++@macro mtuposix {comments} ++!posix\comments\ ++@end macro ++@c Function is AS-Safe while POSIX says it needn't be AS-Safe. ++@macro assposix {comments} ++!posix\comments\ ++@end macro ++@c Function is AS-Unsafe while POSIX says it should be AS-Safe. ++@macro asuposix {comments} ++!posix\comments\ ++@end macro ++@c Function is AC-Safe while POSIX says it needn't be AC-Safe. ++@macro acsposix {comments} ++!posix\comments\ ++@end macro ++@c Function is AC-Unsafe while POSIX says it should be AC-Safe. ++@macro acuposix {comments} ++!posix\comments\ ++@end macro ++ + @end ifclear +diff -urN glibc-2.17-c758a686/manual/maint.texi glibc-2.17-c758a686/manual/maint.texi +--- glibc-2.17-c758a686/manual/maint.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/maint.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -316,7 +316,7 @@ + The top-level @file{configure} script uses the shell @code{.} command to + read the @file{configure} file in each system-dependent directory + chosen, in order. The @file{configure} files are often generated from +-@file{configure.in} files using Autoconf. ++@file{configure.ac} files using Autoconf. + + A system-dependent @file{configure} script will usually add things to + the shell variables @samp{DEFS} and @samp{config_vars}; see the +@@ -329,14 +329,14 @@ + just @w{@samp{--with-@var{package}}} (no argument), then it sets + @w{@samp{with_@var{package}}} to @samp{yes}. + +-@item configure.in ++@item configure.ac + + This file is an Autoconf input fragment to be processed into the file + @file{configure} in this subdirectory. @xref{Introduction,,, + autoconf.info, Autoconf: Generating Automatic Configuration Scripts}, + for a description of Autoconf. You should write either @file{configure} +-or @file{configure.in}, but not both. The first line of +-@file{configure.in} should invoke the @code{m4} macro ++or @file{configure.ac}, but not both. The first line of ++@file{configure.ac} should invoke the @code{m4} macro + @samp{GLIBC_PROVIDES}. This macro does several @code{AC_PROVIDE} calls + for Autoconf macros which are used by the top-level @file{configure} + script; without this, those macros might be invoked again unnecessarily +@@ -424,7 +424,7 @@ + files specific to those machine architectures, but not specific to any + particular operating system. There might be subdirectories for + specializations of those architectures, such as +-@w{@file{sysdeps/m68k/68020}}. Code which is specific to the ++@w{@file{sysdeps/m68k/68020}}. Code which is specific to the + floating-point coprocessor used with a particular machine should go in + @w{@file{sysdeps/@var{machine}/fpu}}. + +diff -urN glibc-2.17-c758a686/manual/Makefile glibc-2.17-c758a686/manual/Makefile +--- glibc-2.17-c758a686/manual/Makefile 2014-09-12 16:08:17.823070748 -0400 ++++ glibc-2.17-c758a686/manual/Makefile 2014-09-12 16:10:06.045792717 -0400 +@@ -1,5 +1,4 @@ +-# Copyright (C) 1992-2012 +-# Free Software Foundation, Inc. ++# Copyright (C) 1992-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 +@@ -20,14 +19,10 @@ + + subdir := manual + +-# Allow override +-INSTALL_INFO = install-info ++include ../Makeconfig + + .PHONY: dvi pdf info html + +-# Get glibc's configuration info. +-include ../Makeconfig +- + dvi: $(objpfx)libc.dvi + pdf: $(objpfx)libc.pdf + +@@ -42,8 +37,8 @@ + intro errno memory ctype string charset locale \ + message search pattern io stdio llio filesys \ + pipe socket terminal syslog math arith time \ +- resource setjmp signal startup process job nss \ +- users sysinfo conf crypt debug probes) ++ resource setjmp signal startup process ipc job \ ++ nss users sysinfo conf crypt debug threads probes) + add-chapters = $(wildcard $(foreach d, $(add-ons), ../$d/$d.texi)) + appendices = lang.texi header.texi install.texi maint.texi platform.texi \ + contrib.texi +@@ -89,6 +84,7 @@ + $(objpfx)summary.texi: $(objpfx)stamp-summary ; + $(objpfx)stamp-summary: summary.awk $(filter-out $(objpfx)summary.texi, \ + $(texis-path)) ++ -$(SHELL) ./check-safety.sh $(filter-out $(objpfx)%, $(texis-path)) + $(AWK) -f $^ | sort -t'' -df -k 1,1 | tr '\014' '\012' \ + > $(objpfx)summary-tmp + $(move-if-change) $(objpfx)summary-tmp $(objpfx)summary.texi +@@ -145,8 +141,7 @@ + mv -f $@.new $@ + + $(objpfx)%.info: %.texinfo +- LANGUAGE=C LC_ALL=C $(MAKEINFO) -P $(objpfx) --output=`basename $@` $< +- mv `basename $@`* $(objpfx) ++ LANGUAGE=C LC_ALL=C $(MAKEINFO) -P $(objpfx) --output=$@ $< + + $(objpfx)%.dvi: %.texinfo + cd $(objpfx);$(TEXI2DVI) -I $(shell cd $(<D) && pwd) --output=$@ \ +@@ -159,19 +154,19 @@ + + # Distribution. + minimal-dist = summary.awk texis.awk tsort.awk libc-texinfo.sh libc.texinfo \ +- libm-err.texi stamp-libm-err \ ++ libm-err.texi stamp-libm-err check-safety.sh \ + $(filter-out summary.texi, $(nonexamples)) \ + $(patsubst %.c.texi,examples/%.c, $(examples)) + + indices = cp fn pg tp vr ky +-generated-dirs := libc +-generated = libc.dvi libc.pdf libc.tmp libc.info* \ +- stubs \ +- texis summary.texi stamp-summary *.c.texi \ +- $(foreach index,$(indices),libc.$(index) libc.$(index)s) \ +- libc.log libc.aux libc.toc \ +- $(libc-texi-generated) \ +- stamp-libm-err stamp-version ++generated-dirs += libc ++generated += libc.dvi libc.pdf libc.tmp libc.info* \ ++ stubs \ ++ texis summary.texi stamp-summary *.c.texi \ ++ $(foreach index,$(indices),libc.$(index) libc.$(index)s) \ ++ libc.log libc.aux libc.toc \ ++ $(libc-texi-generated) \ ++ stamp-libm-err stamp-version + + include ../Rules + +diff -urN glibc-2.17-c758a686/manual/math.texi glibc-2.17-c758a686/manual/math.texi +--- glibc-2.17-c758a686/manual/math.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/math.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -157,6 +157,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} sinl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the sine of @var{x}, where @var{x} is given in + radians. The return value is in the range @code{-1} to @code{1}. + @end deftypefun +@@ -170,6 +171,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} cosl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the cosine of @var{x}, where @var{x} is given in + radians. The return value is in the range @code{-1} to @code{1}. + @end deftypefun +@@ -183,6 +185,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} tanl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the tangent of @var{x}, where @var{x} is given in + radians. + +@@ -205,6 +208,7 @@ + @comment math.h + @comment GNU + @deftypefunx void sincosl (long double @var{x}, long double *@var{sinx}, long double *@var{cosx}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the sine of @var{x} in @code{*@var{sinx}} and the + cosine of @var{x} in @code{*@var{cos}}, where @var{x} is given in + radians. Both values, @code{*@var{sinx}} and @code{*@var{cosx}}, are in +@@ -233,6 +237,9 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} csinl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c There are calls to nan* that could trigger @mtslocale if they didn't get ++@c empty strings. + These functions return the complex sine of @var{z}. + The mathematical definition of the complex sine is + +@@ -253,6 +260,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} ccosl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the complex cosine of @var{z}. + The mathematical definition of the complex cosine is + +@@ -273,6 +281,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} ctanl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the complex tangent of @var{z}. + The mathematical definition of the complex tangent is + +@@ -307,6 +316,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} asinl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the arc sine of @var{x}---that is, the value whose + sine is @var{x}. The value is in units of radians. Mathematically, + there are infinitely many such values; the one actually returned is the +@@ -326,6 +336,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} acosl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the arc cosine of @var{x}---that is, the value + whose cosine is @var{x}. The value is in units of radians. + Mathematically, there are infinitely many such values; the one actually +@@ -345,6 +356,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} atanl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the arc tangent of @var{x}---that is, the value + whose tangent is @var{x}. The value is in units of radians. + Mathematically, there are infinitely many such values; the one actually +@@ -360,6 +372,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} atan2l (long double @var{y}, long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function computes the arc tangent of @var{y}/@var{x}, but the signs + of both arguments are used to determine the quadrant of the result, and + @var{x} is permitted to be zero. The return value is given in radians +@@ -388,6 +401,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} casinl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the complex arc sine of @var{z}---that is, the + value whose sine is @var{z}. The value returned is in radians. + +@@ -404,6 +418,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} cacosl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the complex arc cosine of @var{z}---that is, the + value whose cosine is @var{z}. The value returned is in radians. + +@@ -421,6 +436,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} catanl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the complex arc tangent of @var{z}---that is, + the value whose tangent is @var{z}. The value is in units of radians. + @end deftypefun +@@ -441,6 +457,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} expl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute @code{e} (the base of natural logarithms) raised + to the power @var{x}. + +@@ -457,6 +474,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} exp2l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute @code{2} raised to the power @var{x}. + Mathematically, @code{exp2 (x)} is the same as @code{exp (x * log (2))}. + @end deftypefun +@@ -479,6 +497,7 @@ + @comment math.h + @comment GNU + @deftypefunx {long double} pow10l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute @code{10} raised to the power @var{x}. + Mathematically, @code{exp10 (x)} is the same as @code{exp (x * log (10))}. + +@@ -496,6 +515,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} logl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions compute the natural logarithm of @var{x}. @code{exp (log + (@var{x}))} equals @var{x}, exactly in mathematics and approximately in + C. +@@ -514,6 +534,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} log10l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the base-10 logarithm of @var{x}. + @code{log10 (@var{x})} equals @code{log (@var{x}) / log (10)}. + +@@ -528,6 +549,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} log2l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the base-2 logarithm of @var{x}. + @code{log2 (@var{x})} equals @code{log (@var{x}) / log (2)}. + @end deftypefun +@@ -541,6 +563,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} logbl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions extract the exponent of @var{x} and return it as a + floating-point value. If @code{FLT_RADIX} is two, @code{logb} is equal + to @code{floor (log2 (x))}, except it's probably faster. +@@ -560,6 +583,7 @@ + @comment math.h + @comment ISO + @deftypefunx int ilogbl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions are equivalent to the corresponding @code{logb} + functions except that they return signed integer values. + @end deftypefun +@@ -619,6 +643,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} powl (long double @var{base}, long double @var{power}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These are general exponentiation functions, returning @var{base} raised + to @var{power}. + +@@ -638,6 +663,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} sqrtl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the nonnegative square root of @var{x}. + + If @var{x} is negative, @code{sqrt} signals a domain error. +@@ -654,6 +680,7 @@ + @comment math.h + @comment BSD + @deftypefunx {long double} cbrtl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the cube root of @var{x}. They cannot + fail; every representable real value has a representable real cube root. + @end deftypefun +@@ -667,6 +694,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} hypotl (long double @var{x}, long double @var{y}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return @code{sqrt (@var{x}*@var{x} + + @var{y}*@var{y})}. This is the length of the hypotenuse of a right + triangle with sides of length @var{x} and @var{y}, or the distance +@@ -684,6 +712,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} expm1l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return a value equivalent to @code{exp (@var{x}) - 1}. + They are computed in a way that is accurate even if @var{x} is + near zero---a case where @code{exp (@var{x}) - 1} would be inaccurate owing +@@ -699,6 +728,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} log1pl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions returns a value equivalent to @w{@code{log (1 + @var{x})}}. + They are computed in a way that is accurate even if @var{x} is + near zero. +@@ -719,6 +749,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} cexpl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return @code{e} (the base of natural + logarithms) raised to the power of @var{z}. + Mathematically, this corresponds to the value +@@ -740,6 +771,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} clogl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the natural logarithm of @var{z}. + Mathematically, this corresponds to the value + +@@ -766,8 +798,9 @@ + @comment complex.h + @comment GNU + @deftypefunx {complex long double} clog10l (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the base 10 logarithm of the complex value +-@var{z}. Mathematically, this corresponds to the value ++@var{z}. Mathematically, this corresponds to the value + + @ifnottex + @math{log (z) = log10 (cabs (z)) + I * carg (z)} +@@ -788,6 +821,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} csqrtl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the complex square root of the argument @var{z}. Unlike + the real-valued functions, they are defined for all values of @var{z}. + @end deftypefun +@@ -801,6 +835,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} cpowl (complex long double @var{base}, complex long double @var{power}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return @var{base} raised to the power of + @var{power}. This is equivalent to @w{@code{cexp (y * clog (x))}} + @end deftypefun +@@ -821,6 +856,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} sinhl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the hyperbolic sine of @var{x}, defined + mathematically as @w{@code{(exp (@var{x}) - exp (-@var{x})) / 2}}. They + may signal overflow if @var{x} is too large. +@@ -835,6 +871,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} coshl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These function return the hyperbolic cosine of @var{x}, + defined mathematically as @w{@code{(exp (@var{x}) + exp (-@var{x})) / 2}}. + They may signal overflow if @var{x} is too large. +@@ -849,6 +886,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} tanhl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the hyperbolic tangent of @var{x}, + defined mathematically as @w{@code{sinh (@var{x}) / cosh (@var{x})}}. + They may signal overflow if @var{x} is too large. +@@ -868,6 +906,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} csinhl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the complex hyperbolic sine of @var{z}, defined + mathematically as @w{@code{(exp (@var{z}) - exp (-@var{z})) / 2}}. + @end deftypefun +@@ -881,6 +920,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} ccoshl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the complex hyperbolic cosine of @var{z}, defined + mathematically as @w{@code{(exp (@var{z}) + exp (-@var{z})) / 2}}. + @end deftypefun +@@ -894,6 +934,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} ctanhl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the complex hyperbolic tangent of @var{z}, + defined mathematically as @w{@code{csinh (@var{z}) / ccosh (@var{z})}}. + @end deftypefun +@@ -910,6 +951,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} asinhl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the inverse hyperbolic sine of @var{x}---the + value whose hyperbolic sine is @var{x}. + @end deftypefun +@@ -923,6 +965,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} acoshl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the inverse hyperbolic cosine of @var{x}---the + value whose hyperbolic cosine is @var{x}. If @var{x} is less than + @code{1}, @code{acosh} signals a domain error. +@@ -937,6 +980,7 @@ + @comment math.h + @comment ISO + @deftypefunx {long double} atanhl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the inverse hyperbolic tangent of @var{x}---the + value whose hyperbolic tangent is @var{x}. If the absolute value of + @var{x} is greater than @code{1}, @code{atanh} signals a domain error; +@@ -954,6 +998,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} casinhl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the inverse complex hyperbolic sine of + @var{z}---the value whose complex hyperbolic sine is @var{z}. + @end deftypefun +@@ -967,6 +1012,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} cacoshl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the inverse complex hyperbolic cosine of + @var{z}---the value whose complex hyperbolic cosine is @var{z}. Unlike + the real-valued functions, there are no restrictions on the value of @var{z}. +@@ -981,6 +1027,7 @@ + @comment complex.h + @comment ISO + @deftypefunx {complex long double} catanhl (complex long double @var{z}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + These functions return the inverse complex hyperbolic tangent of + @var{z}---the value whose complex hyperbolic tangent is @var{z}. Unlike + the real-valued functions, there are no restrictions on the value of +@@ -1005,6 +1052,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} erfl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{erf} returns the error function of @var{x}. The error + function is defined as + @tex +@@ -1026,6 +1074,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} erfcl (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{erfc} returns @code{1.0 - erf(@var{x})}, but computed in a + fashion that avoids round-off error when @var{x} is large. + @end deftypefun +@@ -1039,6 +1088,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} lgammal (long double @var{x}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:signgam}}@asunsafe{}@acsafe{}} + @code{lgamma} returns the natural logarithm of the absolute value of + the gamma function of @var{x}. The gamma function is defined as + @tex +@@ -1077,6 +1127,7 @@ + @comment math.h + @comment XPG + @deftypefunx {long double} lgammal_r (long double @var{x}, int *@var{signp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{lgamma_r} is just like @code{lgamma}, but it stores the sign of + the intermediate result in the variable pointed to by @var{signp} + instead of in the @var{signgam} global. This means it is reentrant. +@@ -1091,6 +1142,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} gammal (long double @var{x}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:signgam}}@asunsafe{}@acsafe{}} + These functions exist for compatibility reasons. They are equivalent to + @code{lgamma} etc. It is better to use @code{lgamma} since for one the + name reflects better the actual computation, moreover @code{lgamma} is +@@ -1106,6 +1158,7 @@ + @comment math.h + @comment XPG, ISO + @deftypefunx {long double} tgammal (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{tgamma} applies the gamma function to @var{x}. The gamma + function is defined as + @tex +@@ -1129,6 +1182,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} j0l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{j0} returns the Bessel function of the first kind of order 0 of + @var{x}. It may signal underflow if @var{x} is too large. + @end deftypefun +@@ -1142,6 +1196,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} j1l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{j1} returns the Bessel function of the first kind of order 1 of + @var{x}. It may signal underflow if @var{x} is too large. + @end deftypefun +@@ -1155,6 +1210,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} jnl (int @var{n}, long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{jn} returns the Bessel function of the first kind of order + @var{n} of @var{x}. It may signal underflow if @var{x} is too large. + @end deftypefun +@@ -1168,6 +1224,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} y0l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{y0} returns the Bessel function of the second kind of order 0 of + @var{x}. It may signal underflow if @var{x} is too large. If @var{x} + is negative, @code{y0} signals a domain error; if it is zero, +@@ -1183,6 +1240,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} y1l (long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{y1} returns the Bessel function of the second kind of order 1 of + @var{x}. It may signal underflow if @var{x} is too large. If @var{x} + is negative, @code{y1} signals a domain error; if it is zero, +@@ -1198,6 +1256,7 @@ + @comment math.h + @comment SVID + @deftypefunx {long double} ynl (int @var{n}, long double @var{x}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{yn} returns the Bessel function of the second kind of order @var{n} of + @var{x}. It may signal underflow if @var{x} is too large. If @var{x} + is negative, @code{yn} signals a domain error; if it is zero, +@@ -1227,10 +1286,80 @@ + @noindent + where @math{p} is the number of bits in the mantissa of the + floating-point number representation. Ideally the error for all +-functions is always less than 0.5ulps. Using rounding bits this is also +-possible and normally implemented for the basic operations. To achieve +-the same for the complex math functions requires a lot more work and +-this has not yet been done. ++functions is always less than 0.5ulps in round-to-nearest mode. Using ++rounding bits this is also ++possible and normally implemented for the basic operations. Except ++for certain functions such as @code{sqrt}, @code{fma} and @code{rint} ++whose results are fully specified by reference to corresponding IEEE ++754 floating-point operations, and conversions between strings and ++floating point, @theglibc{} does not aim for correctly rounded results ++for functions in the math library, and does not aim for correctness in ++whether ``inexact'' exceptions are raised. Instead, the goals for ++accuracy of functions without fully specified results are as follows; ++some functions have bugs meaning they do not meet these goals in all ++cases. In future, @theglibc{} may provide some other correctly ++rounding functions under the names such as @code{crsin} proposed for ++an extension to ISO C. ++ ++@itemize @bullet ++ ++@item ++Each function with a floating-point result behaves as if it computes ++an infinite-precision result that is within a few ulp (in both real ++and complex parts, for functions with complex results) of the ++mathematically correct value of the function (interpreted together ++with ISO C or POSIX semantics for the function in question) at the ++exact value passed as the input. Exceptions are raised appropriately ++for this value and in accordance with IEEE 754 / ISO C / POSIX ++semantics, and it is then rounded according to the current rounding ++direction to the result that is returned to the user. @code{errno} ++may also be set (@pxref{Math Error Reporting}). ++ ++@item ++For the IBM @code{long double} format, as used on PowerPC GNU/Linux, ++the accuracy goal is weaker for input values not exactly representable ++in 106 bits of precision; it is as if the input value is some value ++within 0.5ulp of the value actually passed, where ``ulp'' is ++interpreted in terms of a fixed-precision 106-bit mantissa, but not ++necessarily the exact value actually passed with discontiguous ++mantissa bits. ++ ++@item ++Functions behave as if the infinite-precision result computed is zero, ++infinity or NaN if and only if that is the mathematically correct ++infinite-precision result. They behave as if the infinite-precision ++result computed always has the same sign as the mathematically correct ++result. ++ ++@item ++If the mathematical result is more than a few ulp above the overflow ++threshold for the current rounding direction, the value returned is ++the appropriate overflow value for the current rounding direction, ++with the overflow exception raised. ++ ++@item ++If the mathematical result has magnitude well below half the least ++subnormal magnitude, the returned value is either zero or the least ++subnormal (in each case, with the correct sign), according to the ++current rounding direction and with the underflow exception raised. ++ ++@item ++Where the mathematical result underflows and is not exactly ++representable as a floating-point value, the underflow exception is ++raised (so there may be spurious underflow exceptions in cases where ++the underflowing result is exact, but not missing underflow exceptions ++in cases where it is inexact). ++ ++@item ++@Theglibc{} does not aim for functions to satisfy other properties of ++the underlying mathematical function, such as monotonicity, where not ++implied by the above goals. ++ ++@item ++All the above applies to both real and complex parts, for complex ++functions. ++ ++@end itemize + + Therefore many of the functions in the math library have errors. The + table lists the maximum error for each function which is exposed by one +@@ -1314,6 +1443,8 @@ + @comment stdlib.h + @comment ISO + @deftypefun int rand (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c Just calls random. + The @code{rand} function returns the next pseudo-random number in the + series. The value ranges from @code{0} to @code{RAND_MAX}. + @end deftypefun +@@ -1321,6 +1452,8 @@ + @comment stdlib.h + @comment ISO + @deftypefun void srand (unsigned int @var{seed}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c Alias to srandom. + This function establishes @var{seed} as the seed for a new series of + pseudo-random numbers. If you call @code{rand} before a seed has been + established with @code{srand}, it uses the value @code{1} as a default +@@ -1337,6 +1470,7 @@ + @comment stdlib.h + @comment POSIX.1 + @deftypefun int rand_r (unsigned int *@var{seed}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function returns a random number in the range 0 to @code{RAND_MAX} + just as @code{rand} does. However, all its state is stored in the + @var{seed} argument. This means the RNG's state can only have as many +@@ -1363,8 +1497,11 @@ + @comment stdlib.h + @comment BSD + @deftypefun {long int} random (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c Takes a lock and calls random_r with an automatic variable and the ++@c global state, while holding a lock. + This function returns the next pseudo-random number in the sequence. +-The value returned ranges from @code{0} to @code{RAND_MAX}. ++The value returned ranges from @code{0} to @code{2147483647}. + + @strong{NB:} Temporarily this function was defined to return a + @code{int32_t} value to indicate that the return value always contains +@@ -1376,6 +1513,11 @@ + @comment stdlib.h + @comment BSD + @deftypefun void srandom (unsigned int @var{seed}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c Takes a lock and calls srandom_r with an automatic variable and a ++@c static buffer. There's no MT-safety issue because the static buffer ++@c is internally protected by a lock, although other threads may modify ++@c the set state before it is used. + The @code{srandom} function sets the state of the random number + generator based on the integer @var{seed}. If you supply a @var{seed} value + of @code{1}, this will cause @code{random} to reproduce the default set +@@ -1387,7 +1529,8 @@ + + @comment stdlib.h + @comment BSD +-@deftypefun {void *} initstate (unsigned int @var{seed}, void *@var{state}, size_t @var{size}) ++@deftypefun {char *} initstate (unsigned int @var{seed}, char *@var{state}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + The @code{initstate} function is used to initialize the random number + generator state. The argument @var{state} is an array of @var{size} + bytes, used to hold the state information. It is initialized based on +@@ -1401,7 +1544,8 @@ + + @comment stdlib.h + @comment BSD +-@deftypefun {void *} setstate (void *@var{state}) ++@deftypefun {char *} setstate (char *@var{state}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + The @code{setstate} function restores the random number state + information @var{state}. The argument must have been the result of + a previous call to @var{initstate} or @var{setstate}. +@@ -1442,6 +1586,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int random_r (struct random_data *restrict @var{buf}, int32_t *restrict @var{result}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}} + The @code{random_r} function behaves exactly like the @code{random} + function except that it uses and modifies the state in the object + pointed to by the first parameter instead of the global state. +@@ -1450,6 +1595,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int srandom_r (unsigned int @var{seed}, struct random_data *@var{buf}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}} + The @code{srandom_r} function behaves exactly like the @code{srandom} + function except that it uses and modifies the state in the object + pointed to by the second parameter instead of the global state. +@@ -1458,6 +1604,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int initstate_r (unsigned int @var{seed}, char *restrict @var{statebuf}, size_t @var{statelen}, struct random_data *restrict @var{buf}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}} + The @code{initstate_r} function behaves exactly like the @code{initstate} + function except that it uses and modifies the state in the object + pointed to by the fourth parameter instead of the global state. +@@ -1466,6 +1613,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int setstate_r (char *restrict @var{statebuf}, struct random_data *restrict @var{buf}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}} + The @code{setstate_r} function behaves exactly like the @code{setstate} + function except that it uses and modifies the state in the object + pointed to by the first parameter instead of the global state. +@@ -1512,6 +1660,12 @@ + @comment stdlib.h + @comment SVID + @deftypefun double drand48 (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} ++@c Uses of the static state buffer are not guarded by a lock (thus ++@c @mtasurace:drand48), so they may be found or left at a ++@c partially-updated state in case of calls from within signal handlers ++@c or cancellation. None of this will break safety rules or invoke ++@c undefined behavior, but it may affect randomness. + This function returns a @code{double} value in the range of @code{0.0} + to @code{1.0} (exclusive). The random bits are determined by the global + state of the random number generator in the C library. +@@ -1525,6 +1679,9 @@ + @comment stdlib.h + @comment SVID + @deftypefun double erand48 (unsigned short int @var{xsubi}[3]) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} ++@c The static buffer is just initialized with default parameters, which ++@c are later read to advance the state held in xsubi. + This function returns a @code{double} value in the range of @code{0.0} + to @code{1.0} (exclusive), similarly to @code{drand48}. The argument is + an array describing the state of the random number generator. +@@ -1537,6 +1694,7 @@ + @comment stdlib.h + @comment SVID + @deftypefun {long int} lrand48 (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} + The @code{lrand48} function returns an integer value in the range of + @code{0} to @code{2^31} (exclusive). Even if the size of the @code{long + int} type can take more than 32 bits, no higher numbers are returned. +@@ -1547,6 +1705,7 @@ + @comment stdlib.h + @comment SVID + @deftypefun {long int} nrand48 (unsigned short int @var{xsubi}[3]) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} + This function is similar to the @code{lrand48} function in that it + returns a number in the range of @code{0} to @code{2^31} (exclusive) but + the state of the random number generator used to produce the random bits +@@ -1561,6 +1720,7 @@ + @comment stdlib.h + @comment SVID + @deftypefun {long int} mrand48 (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} + The @code{mrand48} function is similar to @code{lrand48}. The only + difference is that the numbers returned are in the range @code{-2^31} to + @code{2^31} (exclusive). +@@ -1569,6 +1729,7 @@ + @comment stdlib.h + @comment SVID + @deftypefun {long int} jrand48 (unsigned short int @var{xsubi}[3]) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} + The @code{jrand48} function is similar to @code{nrand48}. The only + difference is that the numbers returned are in the range @code{-2^31} to + @code{2^31} (exclusive). For the @code{xsubi} parameter the same +@@ -1582,6 +1743,7 @@ + @comment stdlib.h + @comment SVID + @deftypefun void srand48 (long int @var{seedval}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} + The @code{srand48} function sets the most significant 32 bits of the + internal state of the random number generator to the least + significant 32 bits of the @var{seedval} parameter. The lower 16 bits +@@ -1601,6 +1763,7 @@ + @comment stdlib.h + @comment SVID + @deftypefun {unsigned short int *} seed48 (unsigned short int @var{seed16v}[3]) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} + The @code{seed48} function initializes all 48 bits of the state of the + internal random number generator from the contents of the parameter + @var{seed16v}. Here the lower 16 bits of the first element of +@@ -1628,6 +1791,7 @@ + @comment stdlib.h + @comment SVID + @deftypefun void lcong48 (unsigned short int @var{param}[7]) ++@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}} + The @code{lcong48} function allows the user to change the complete state + of the random number generator. Unlike @code{srand48} and + @code{seed48}, this function also changes the constants in the +@@ -1660,6 +1824,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int drand48_r (struct drand48_data *@var{buffer}, double *@var{result}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + This function is equivalent to the @code{drand48} function with the + difference that it does not modify the global random number generator + parameters but instead the parameters in the buffer supplied through the +@@ -1677,6 +1842,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int erand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, double *@var{result}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + The @code{erand48_r} function works like @code{erand48}, but in addition + it takes an argument @var{buffer} which describes the random number + generator. The state of the random number generator is taken from the +@@ -1692,7 +1858,8 @@ + + @comment stdlib.h + @comment GNU +-@deftypefun int lrand48_r (struct drand48_data *@var{buffer}, double *@var{result}) ++@deftypefun int lrand48_r (struct drand48_data *@var{buffer}, long int *@var{result}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + This function is similar to @code{lrand48}, but in addition it takes a + pointer to a buffer describing the state of the random number generator + just like @code{drand48}. +@@ -1707,6 +1874,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int nrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + The @code{nrand48_r} function works like @code{nrand48} in that it + produces a random number in the range @code{0} to @code{2^31}. But instead + of using the global parameters for the congruential formula it uses the +@@ -1722,7 +1890,8 @@ + + @comment stdlib.h + @comment GNU +-@deftypefun int mrand48_r (struct drand48_data *@var{buffer}, double *@var{result}) ++@deftypefun int mrand48_r (struct drand48_data *@var{buffer}, long int *@var{result}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + This function is similar to @code{mrand48} but like the other reentrant + functions it uses the random number generator described by the value in + the buffer pointed to by @var{buffer}. +@@ -1737,6 +1906,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int jrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + The @code{jrand48_r} function is similar to @code{jrand48}. Like the + other reentrant functions of this function family it uses the + congruential formula parameters from the buffer pointed to by +@@ -1771,6 +1941,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int srand48_r (long int @var{seedval}, struct drand48_data *@var{buffer}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + The description of the random number generator represented by the + information in @var{buffer} is initialized similarly to what the function + @code{srand48} does. The state is initialized from the parameter +@@ -1786,6 +1957,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int seed48_r (unsigned short int @var{seed16v}[3], struct drand48_data *@var{buffer}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + This function is similar to @code{srand48_r} but like @code{seed48} it + initializes all 48 bits of the state from the parameter @var{seed16v}. + +@@ -1802,6 +1974,7 @@ + @comment stdlib.h + @comment GNU + @deftypefun int lcong48_r (unsigned short int @var{param}[7], struct drand48_data *@var{buffer}) ++@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}} + This function initializes all aspects of the random number generator + described in @var{buffer} with the data in @var{param}. Here it is + especially true that the function does more than just copying the +diff -urN glibc-2.17-c758a686/manual/memory.texi glibc-2.17-c758a686/manual/memory.texi +--- glibc-2.17-c758a686/manual/memory.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/memory.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -302,6 +302,245 @@ + @comment malloc.h stdlib.h + @comment ISO + @deftypefun {void *} malloc (size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c Malloc hooks and __morecore pointers, as well as such parameters as ++@c max_n_mmaps and max_mmapped_mem, are accessed without guards, so they ++@c could pose a thread safety issue; in order to not declare malloc ++@c MT-unsafe, it's modifying the hooks and parameters while multiple ++@c threads are active that is regarded as unsafe. An arena's next field ++@c is initialized and never changed again, except for main_arena's, ++@c that's protected by list_lock; next_free is only modified while ++@c list_lock is held too. All other data members of an arena, as well ++@c as the metadata of the memory areas assigned to it, are only modified ++@c while holding the arena's mutex (fastbin pointers use catomic ops ++@c because they may be modified by free without taking the arena's ++@c lock). Some reassurance was needed for fastbins, for it wasn't clear ++@c how they were initialized. It turns out they are always ++@c zero-initialized: main_arena's, for being static data, and other ++@c arena's, for being just-mmapped memory. ++ ++@c Leaking file descriptors and memory in case of cancellation is ++@c unavoidable without disabling cancellation, but the lock situation is ++@c a bit more complicated: we don't have fallback arenas for malloc to ++@c be safe to call from within signal handlers. Error-checking mutexes ++@c or trylock could enable us to try and use alternate arenas, even with ++@c -DPER_THREAD (enabled by default), but supporting interruption ++@c (cancellation or signal handling) while holding the arena list mutex ++@c would require more work; maybe blocking signals and disabling async ++@c cancellation while manipulating the arena lists? ++ ++@c __libc_malloc @asulock @aculock @acsfd @acsmem ++@c force_reg ok ++@c *malloc_hook unguarded ++@c arena_lookup ok ++@c tsd_getspecific ok, TLS ++@c arena_lock @asulock @aculock @acsfd @acsmem ++@c mutex_lock @asulock @aculock ++@c arena_get2 @asulock @aculock @acsfd @acsmem ++@c get_free_list @asulock @aculock ++@c mutex_lock (list_lock) dup @asulock @aculock ++@c mutex_unlock (list_lock) dup @aculock ++@c mutex_lock (arena lock) dup @asulock @aculock [returns locked] ++@c tsd_setspecific ok, TLS ++@c __get_nprocs ext ok @acsfd ++@c NARENAS_FROM_NCORES ok ++@c catomic_compare_and_exchange_bool_acq ok ++@c _int_new_arena ok @asulock @aculock @acsmem ++@c new_heap ok @acsmem ++@c mmap ok @acsmem ++@c munmap ok @acsmem ++@c mprotect ok ++@c chunk2mem ok ++@c set_head ok ++@c tsd_setspecific dup ok ++@c mutex_init ok ++@c mutex_lock (just-created mutex) ok, returns locked ++@c mutex_lock (list_lock) dup @asulock @aculock ++@c atomic_write_barrier ok ++@c mutex_unlock (list_lock) @aculock ++@c catomic_decrement ok ++@c reused_arena @asulock @aculock ++@c reads&writes next_to_use and iterates over arena next without guards ++@c those are harmless as long as we don't drop arenas from the ++@c NEXT list, and we never do; when a thread terminates, ++@c arena_thread_freeres prepends the arena to the free_list ++@c NEXT_FREE list, but NEXT is never modified, so it's safe! ++@c mutex_trylock (arena lock) @asulock @aculock ++@c mutex_lock (arena lock) dup @asulock @aculock ++@c tsd_setspecific dup ok ++@c _int_malloc @acsfd @acsmem ++@c checked_request2size ok ++@c REQUEST_OUT_OF_RANGE ok ++@c request2size ok ++@c get_max_fast ok ++@c fastbin_index ok ++@c fastbin ok ++@c catomic_compare_and_exhange_val_acq ok ++@c malloc_printerr dup @mtsenv ++@c if we get to it, we're toast already, undefined behavior must have ++@c been invoked before ++@c libc_message @mtsenv [no leaks with cancellation disabled] ++@c FATAL_PREPARE ok ++@c pthread_setcancelstate disable ok ++@c libc_secure_getenv @mtsenv ++@c getenv @mtsenv ++@c open_not_cancel_2 dup @acsfd ++@c strchrnul ok ++@c WRITEV_FOR_FATAL ok ++@c writev ok ++@c mmap ok @acsmem ++@c munmap ok @acsmem ++@c BEFORE_ABORT @acsfd ++@c backtrace ok ++@c write_not_cancel dup ok ++@c backtrace_symbols_fd @aculock ++@c open_not_cancel_2 dup @acsfd ++@c read_not_cancel dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c abort ok ++@c itoa_word ok ++@c abort ok ++@c check_remalloced_chunk ok/disabled ++@c chunk2mem dup ok ++@c alloc_perturb ok ++@c in_smallbin_range ok ++@c smallbin_index ok ++@c bin_at ok ++@c last ok ++@c malloc_consolidate ok ++@c get_max_fast dup ok ++@c clear_fastchunks ok ++@c unsorted_chunks dup ok ++@c fastbin dup ok ++@c atomic_exchange_acq ok ++@c check_inuse_chunk dup ok/disabled ++@c chunk_at_offset dup ok ++@c chunksize dup ok ++@c inuse_bit_at_offset dup ok ++@c unlink dup ok ++@c clear_inuse_bit_at_offset dup ok ++@c in_smallbin_range dup ok ++@c set_head dup ok ++@c malloc_init_state ok ++@c bin_at dup ok ++@c set_noncontiguous dup ok ++@c set_max_fast dup ok ++@c initial_top ok ++@c unsorted_chunks dup ok ++@c check_malloc_state ok/disabled ++@c set_inuse_bit_at_offset ok ++@c check_malloced_chunk ok/disabled ++@c largebin_index ok ++@c have_fastchunks ok ++@c unsorted_chunks ok ++@c bin_at ok ++@c chunksize ok ++@c chunk_at_offset ok ++@c set_head ok ++@c set_foot ok ++@c mark_bin ok ++@c idx2bit ok ++@c first ok ++@c unlink ok ++@c malloc_printerr dup ok ++@c in_smallbin_range dup ok ++@c idx2block ok ++@c idx2bit dup ok ++@c next_bin ok ++@c sysmalloc @acsfd @acsmem ++@c MMAP @acsmem ++@c set_head dup ok ++@c check_chunk ok/disabled ++@c chunk2mem dup ok ++@c chunksize dup ok ++@c chunk_at_offset dup ok ++@c heap_for_ptr ok ++@c grow_heap ok ++@c mprotect ok ++@c set_head dup ok ++@c new_heap @acsmem ++@c MMAP dup @acsmem ++@c munmap @acsmem ++@c top ok ++@c set_foot dup ok ++@c contiguous ok ++@c MORECORE ok ++@c *__morecore ok unguarded ++@c __default_morecore ++@c sbrk ok ++@c force_reg dup ok ++@c *__after_morecore_hook unguarded ++@c set_noncontiguous ok ++@c malloc_printerr dup ok ++@c _int_free (have_lock) @acsfd @acsmem [@asulock @aculock] ++@c chunksize dup ok ++@c mutex_unlock dup @aculock/!have_lock ++@c malloc_printerr dup ok ++@c check_inuse_chunk ok/disabled ++@c chunk_at_offset dup ok ++@c mutex_lock dup @asulock @aculock/@have_lock ++@c chunk2mem dup ok ++@c free_perturb ok ++@c set_fastchunks ok ++@c catomic_and ok ++@c fastbin_index dup ok ++@c fastbin dup ok ++@c catomic_compare_and_exchange_val_rel ok ++@c chunk_is_mmapped ok ++@c contiguous dup ok ++@c prev_inuse ok ++@c unlink dup ok ++@c inuse_bit_at_offset dup ok ++@c clear_inuse_bit_at_offset ok ++@c unsorted_chunks dup ok ++@c in_smallbin_range dup ok ++@c set_head dup ok ++@c set_foot dup ok ++@c check_free_chunk ok/disabled ++@c check_chunk dup ok/disabled ++@c have_fastchunks dup ok ++@c malloc_consolidate dup ok ++@c systrim ok ++@c MORECORE dup ok ++@c *__after_morecore_hook dup unguarded ++@c set_head dup ok ++@c check_malloc_state ok/disabled ++@c top dup ok ++@c heap_for_ptr dup ok ++@c heap_trim @acsfd @acsmem ++@c top dup ok ++@c chunk_at_offset dup ok ++@c prev_chunk ok ++@c chunksize dup ok ++@c prev_inuse dup ok ++@c delete_heap @acsmem ++@c munmap dup @acsmem ++@c unlink dup ok ++@c set_head dup ok ++@c shrink_heap @acsfd ++@c check_may_shrink_heap @acsfd ++@c open_not_cancel_2 @acsfd ++@c read_not_cancel ok ++@c close_not_cancel_no_status @acsfd ++@c MMAP dup ok ++@c madvise ok ++@c munmap_chunk @acsmem ++@c chunksize dup ok ++@c chunk_is_mmapped dup ok ++@c chunk2mem dup ok ++@c malloc_printerr dup ok ++@c munmap dup @acsmem ++@c check_malloc_state ok/disabled ++@c arena_get_retry @asulock @aculock @acsfd @acsmem ++@c mutex_unlock dup @aculock ++@c mutex_lock dup @asulock @aculock ++@c arena_get2 dup @asulock @aculock @acsfd @acsmem ++@c mutex_unlock @aculock ++@c mem2chunk ok ++@c chunk_is_mmapped ok ++@c arena_for_chunk ok ++@c chunk_non_main_arena ok ++@c heap_for_ptr ok + This function returns a pointer to a newly allocated block @var{size} + bytes long, or a null pointer if the block could not be allocated. + @end deftypefun +@@ -355,7 +594,7 @@ + void * + xmalloc (size_t size) + @{ +- register void *value = malloc (size); ++ void *value = malloc (size); + if (value == 0) + fatal ("virtual memory exhausted"); + return value; +@@ -371,7 +610,7 @@ + char * + savestring (const char *ptr, size_t len) + @{ +- register char *value = (char *) xmalloc (len + 1); ++ char *value = (char *) xmalloc (len + 1); + value[len] = '\0'; + return (char *) memcpy (value, ptr, len); + @} +@@ -380,10 +619,10 @@ + + The block that @code{malloc} gives you is guaranteed to be aligned so + that it can hold any type of data. On @gnusystems{}, the address is +-always a multiple of eight on most systems, and a multiple of 16 on ++always a multiple of eight on 32-bit systems, and a multiple of 16 on + 64-bit systems. Only rarely is any higher boundary (such as a page +-boundary) necessary; for those cases, use @code{memalign}, +-@code{posix_memalign} or @code{valloc} (@pxref{Aligned Memory Blocks}). ++boundary) necessary; for those cases, use @code{aligned_alloc} or ++@code{posix_memalign} (@pxref{Aligned Memory Blocks}). + + Note that the memory located after the end of the block is likely to be + in use for something else; perhaps a block already allocated by another +@@ -407,6 +646,21 @@ + @comment malloc.h stdlib.h + @comment ISO + @deftypefun void free (void *@var{ptr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c __libc_free @asulock @aculock @acsfd @acsmem ++@c releasing memory into fastbins modifies the arena without taking ++@c its mutex, but catomic operations ensure safety. If two (or more) ++@c threads are running malloc and have their own arenas locked when ++@c each gets a signal whose handler free()s large (non-fastbin-able) ++@c blocks from each other's arena, we deadlock; this is a more general ++@c case of @asulock. ++@c *__free_hook unguarded ++@c mem2chunk ok ++@c chunk_is_mmapped ok, chunk bits not modified after allocation ++@c chunksize ok ++@c munmap_chunk dup @acsmem ++@c arena_for_chunk dup ok ++@c _int_free (!have_lock) dup @asulock @aculock @acsfd @acsmem + The @code{free} function deallocates the block of memory pointed at + by @var{ptr}. + @end deftypefun +@@ -414,6 +668,8 @@ + @comment stdlib.h + @comment Sun + @deftypefun void cfree (void *@var{ptr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c alias to free + This function does the same thing as @code{free}. It's provided for + backward compatibility with SunOS; you should use @code{free} instead. + @end deftypefun +@@ -471,6 +727,48 @@ + @comment malloc.h stdlib.h + @comment ISO + @deftypefun {void *} realloc (void *@var{ptr}, size_t @var{newsize}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c It may call the implementations of malloc and free, so all of their ++@c issues arise, plus the realloc hook, also accessed without guards. ++ ++@c __libc_realloc @asulock @aculock @acsfd @acsmem ++@c *__realloc_hook unguarded ++@c __libc_free dup @asulock @aculock @acsfd @acsmem ++@c __libc_malloc dup @asulock @aculock @acsfd @acsmem ++@c mem2chunk dup ok ++@c chunksize dup ok ++@c malloc_printerr dup ok ++@c checked_request2size dup ok ++@c chunk_is_mmapped dup ok ++@c mremap_chunk ++@c chunksize dup ok ++@c __mremap ok ++@c set_head dup ok ++@c MALLOC_COPY ok ++@c memcpy ok ++@c munmap_chunk dup @acsmem ++@c arena_for_chunk dup ok ++@c mutex_lock (arena mutex) dup @asulock @aculock ++@c _int_realloc @acsfd @acsmem ++@c malloc_printerr dup ok ++@c check_inuse_chunk dup ok/disabled ++@c chunk_at_offset dup ok ++@c chunksize dup ok ++@c set_head_size dup ok ++@c chunk_at_offset dup ok ++@c set_head dup ok ++@c chunk2mem dup ok ++@c inuse dup ok ++@c unlink dup ok ++@c _int_malloc dup @acsfd @acsmem ++@c mem2chunk dup ok ++@c MALLOC_COPY dup ok ++@c _int_free (have_lock) dup @acsfd @acsmem ++@c set_inuse_bit_at_offset dup ok ++@c set_head dup ok ++@c mutex_unlock (arena mutex) dup @aculock ++@c _int_free (!have_lock) dup @asulock @aculock @acsfd @acsmem ++ + The @code{realloc} function changes the size of the block whose address is + @var{ptr} to be @var{newsize}. + +@@ -502,7 +800,7 @@ + void * + xrealloc (void *ptr, size_t size) + @{ +- register void *value = realloc (ptr, size); ++ void *value = realloc (ptr, size); + if (value == 0) + fatal ("Virtual memory exhausted"); + return value; +@@ -530,6 +828,25 @@ + @comment malloc.h stdlib.h + @comment ISO + @deftypefun {void *} calloc (size_t @var{count}, size_t @var{eltsize}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c Same caveats as malloc. ++ ++@c __libc_calloc @asulock @aculock @acsfd @acsmem ++@c *__malloc_hook dup unguarded ++@c memset dup ok ++@c arena_get @asulock @aculock @acsfd @acsmem ++@c arena_lookup dup ok ++@c arena_lock dup @asulock @aculock @acsfd @acsmem ++@c top dup ok ++@c chunksize dup ok ++@c heap_for_ptr dup ok ++@c _int_malloc dup @acsfd @acsmem ++@c arena_get_retry dup @asulock @aculock @acsfd @acsmem ++@c mutex_unlock dup @aculock ++@c mem2chunk dup ok ++@c chunk_is_mmapped dup ok ++@c MALLOC_ZERO ok ++@c memset dup ok + This function allocates a block long enough to contain a vector of + @var{count} elements, each of size @var{eltsize}. Its contents are + cleared to zero before @code{calloc} returns. +@@ -616,28 +933,89 @@ + The address of a block returned by @code{malloc} or @code{realloc} in + @gnusystems{} is always a multiple of eight (or sixteen on 64-bit + systems). If you need a block whose address is a multiple of a higher +-power of two than that, use @code{memalign}, @code{posix_memalign}, or +-@code{valloc}. @code{memalign} is declared in @file{malloc.h} and +-@code{posix_memalign} is declared in @file{stdlib.h}. +- +-With @theglibc{}, you can use @code{free} to free the blocks that +-@code{memalign}, @code{posix_memalign}, and @code{valloc} return. That +-does not work in BSD, however---BSD does not provide any way to free +-such blocks. ++power of two than that, use @code{aligned_alloc} or @code{posix_memalign}. ++@code{aligned_alloc} and @code{posix_memalign} are declared in ++@file{stdlib.h}. ++ ++@comment stdlib.h ++@deftypefun {void *} aligned_alloc (size_t @var{alignment}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c Alias to memalign. ++The @code{aligned_alloc} function allocates a block of @var{size} bytes whose ++address is a multiple of @var{alignment}. The @var{alignment} must be a ++power of two and @var{size} must be a multiple of @var{alignment}. ++ ++The @code{aligned_alloc} function returns a null pointer on error and sets ++@code{errno} to one of the following values: ++ ++@table @code ++@item ENOMEM ++There was insufficient memory available to satisfy the request. ++ ++@item EINVAL ++@var{alignment} is not a power of two. ++ ++This function was introduced in @w{ISO C11} and hence may have better ++portability to modern non-POSIX systems than @code{posix_memalign}. ++@end table ++ ++@end deftypefun + + @comment malloc.h + @comment BSD + @deftypefun {void *} memalign (size_t @var{boundary}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c Same issues as malloc. The padding bytes are safely freed in ++@c _int_memalign, with the arena still locked. ++ ++@c __libc_memalign @asulock @aculock @acsfd @acsmem ++@c *__memalign_hook dup unguarded ++@c __libc_malloc dup @asulock @aculock @acsfd @acsmem ++@c arena_get dup @asulock @aculock @acsfd @acsmem ++@c _int_memalign @acsfd @acsmem ++@c _int_malloc dup @acsfd @acsmem ++@c checked_request2size dup ok ++@c mem2chunk dup ok ++@c chunksize dup ok ++@c chunk_is_mmapped dup ok ++@c set_head dup ok ++@c chunk2mem dup ok ++@c set_inuse_bit_at_offset dup ok ++@c set_head_size dup ok ++@c _int_free (have_lock) dup @acsfd @acsmem ++@c chunk_at_offset dup ok ++@c check_inuse_chunk dup ok ++@c arena_get_retry dup @asulock @aculock @acsfd @acsmem ++@c mutex_unlock dup @aculock + The @code{memalign} function allocates a block of @var{size} bytes whose + address is a multiple of @var{boundary}. The @var{boundary} must be a + power of two! The function @code{memalign} works by allocating a + somewhat larger block, and then returning an address within the block + that is on the specified boundary. ++ ++The @code{memalign} function returns a null pointer on error and sets ++@code{errno} to one of the following values: ++ ++@table @code ++@item ENOMEM ++There was insufficient memory available to satisfy the request. ++ ++@item EINVAL ++@var{alignment} is not a power of two. ++ ++@end table ++ ++The @code{memalign} function is obsolete and @code{aligned_alloc} or ++@code{posix_memalign} should be used instead. + @end deftypefun + + @comment stdlib.h + @comment POSIX + @deftypefun int posix_memalign (void **@var{memptr}, size_t @var{alignment}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c Calls memalign unless the requirements are not met (powerof2 macro is ++@c safe given an automatic variable as an argument) or there's a ++@c memalign hook (accessed unguarded, but safely). + The @code{posix_memalign} function is similar to the @code{memalign} + function in that it returns a buffer of @var{size} bytes aligned to a + multiple of @var{alignment}. But it adds one requirement to the +@@ -647,13 +1025,58 @@ + If the function succeeds in allocation memory a pointer to the allocated + memory is returned in @code{*@var{memptr}} and the return value is zero. + Otherwise the function returns an error value indicating the problem. ++The possible error values returned are: ++ ++@table @code ++@item ENOMEM ++There was insufficient memory available to satisfy the request. + +-This function was introduced in POSIX 1003.1d. ++@item EINVAL ++@var{alignment} is not a power of two multiple of @code{sizeof (void *)}. ++ ++@end table ++ ++This function was introduced in POSIX 1003.1d. Although this function is ++superseded by @code{aligned_alloc}, it is more portable to older POSIX ++systems that do not support @w{ISO C11}. + @end deftypefun + + @comment malloc.h stdlib.h + @comment BSD + @deftypefun {void *} valloc (size_t @var{size}) ++@safety{@prelim{}@mtunsafe{@mtuinit{}}@asunsafe{@asuinit{} @asulock{}}@acunsafe{@acuinit{} @aculock{} @acsfd{} @acsmem{}}} ++@c __libc_valloc @mtuinit @asuinit @asulock @aculock @acsfd @acsmem ++@c ptmalloc_init (once) @mtsenv @asulock @aculock @acsfd @acsmem ++@c _dl_addr @asucorrupt? @aculock ++@c __rtld_lock_lock_recursive (dl_load_lock) @asucorrupt? @aculock ++@c _dl_find_dso_for_object ok, iterates over dl_ns and its _ns_loaded objs ++@c the ok above assumes no partial updates on dl_ns and _ns_loaded ++@c that could confuse a _dl_addr call in a signal handler ++@c _dl_addr_inside_object ok ++@c determine_info ok ++@c __rtld_lock_unlock_recursive (dl_load_lock) @aculock ++@c thread_atfork @asulock @aculock @acsfd @acsmem ++@c __register_atfork @asulock @aculock @acsfd @acsmem ++@c lll_lock (__fork_lock) @asulock @aculock ++@c fork_handler_alloc @asulock @aculock @acsfd @acsmem ++@c calloc dup @asulock @aculock @acsfd @acsmem ++@c __linkin_atfork ok ++@c catomic_compare_and_exchange_bool_acq ok ++@c lll_unlock (__fork_lock) @aculock ++@c *_environ @mtsenv ++@c next_env_entry ok ++@c strcspn dup ok ++@c __libc_mallopt dup @mtasuconst:mallopt [setting mp_] ++@c __malloc_check_init @mtasuconst:malloc_hooks [setting hooks] ++@c *__malloc_initialize_hook unguarded, ok ++@c *__memalign_hook dup ok, unguarded ++@c arena_get dup @asulock @aculock @acsfd @acsmem ++@c _int_valloc @acsfd @acsmem ++@c malloc_consolidate dup ok ++@c _int_memalign dup @acsfd @acsmem ++@c arena_get_retry dup @asulock @aculock @acsfd @acsmem ++@c _int_memalign dup @acsfd @acsmem ++@c mutex_unlock dup @aculock + Using @code{valloc} is like using @code{memalign} and passing the page size + as the value of the second argument. It is implemented like this: + +@@ -667,6 +1090,9 @@ + + @ref{Query Memory Parameters} for more information about the memory + subsystem. ++ ++The @code{valloc} function is obsolete and @code{aligned_alloc} or ++@code{posix_memalign} should be used instead. + @end deftypefun + + @node Malloc Tunable Parameters +@@ -678,30 +1104,34 @@ + @pindex malloc.h + + @deftypefun int mallopt (int @var{param}, int @var{value}) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasuconst{:mallopt}}@asunsafe{@asuinit{} @asulock{}}@acunsafe{@acuinit{} @aculock{}}} ++@c __libc_mallopt @mtuinit @mtasuconst:mallopt @asuinit @asulock @aculock ++@c ptmalloc_init (once) dup @mtsenv @asulock @aculock @acsfd @acsmem ++@c mutex_lock (main_arena->mutex) @asulock @aculock ++@c malloc_consolidate dup ok ++@c set_max_fast ok ++@c mutex_unlock dup @aculock ++ + When calling @code{mallopt}, the @var{param} argument specifies the + parameter to be set, and @var{value} the new value to be set. Possible + choices for @var{param}, as defined in @file{malloc.h}, are: + + @table @code +-@item M_TRIM_THRESHOLD +-This is the minimum size (in bytes) of the top-most, releasable chunk +-that will cause @code{sbrk} to be called with a negative argument in +-order to return memory to the system. +-@item M_TOP_PAD +-This parameter determines the amount of extra memory to obtain from the +-system when a call to @code{sbrk} is required. It also specifies the +-number of bytes to retain when shrinking the heap by calling @code{sbrk} +-with a negative argument. This provides the necessary hysteresis in +-heap size such that excessive amounts of system calls can be avoided. ++@comment TODO: @item M_ARENA_MAX ++@comment - Document ARENA_MAX env var. ++@comment TODO: @item M_ARENA_TEST ++@comment - Document ARENA_TEST env var. ++@comment TODO: @item M_CHECK_ACTION ++@item M_MMAP_MAX ++The maximum number of chunks to allocate with @code{mmap}. Setting this ++to zero disables all use of @code{mmap}. + @item M_MMAP_THRESHOLD + All chunks larger than this value are allocated outside the normal + heap, using the @code{mmap} system call. This way it is guaranteed + that the memory for these chunks can be returned to the system on + @code{free}. Note that requests smaller than this threshold might still + be allocated via @code{mmap}. +-@item M_MMAP_MAX +-The maximum number of chunks to allocate with @code{mmap}. Setting this +-to zero disables all use of @code{mmap}. ++@comment TODO: @item M_MXFAST + @item M_PERTURB + If non-zero, memory blocks are filled with values depending on some + low order bits of this parameter when they are allocated (except when +@@ -710,6 +1140,16 @@ + guarantee that the freed block will have any specific values. It only + guarantees that the content the block had before it was freed will be + overwritten. ++@item M_TOP_PAD ++This parameter determines the amount of extra memory to obtain from the ++system when a call to @code{sbrk} is required. It also specifies the ++number of bytes to retain when shrinking the heap by calling @code{sbrk} ++with a negative argument. This provides the necessary hysteresis in ++heap size such that excessive amounts of system calls can be avoided. ++@item M_TRIM_THRESHOLD ++This is the minimum size (in bytes) of the top-most, releasable chunk ++that will cause @code{sbrk} to be called with a negative argument in ++order to return memory to the system. + @end table + + @end deftypefun +@@ -728,6 +1168,17 @@ + @comment mcheck.h + @comment GNU + @deftypefun int mcheck (void (*@var{abortfn}) (enum mcheck_status @var{status})) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mcheck} @mtasuconst{:malloc_hooks}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} ++@c The hooks must be set up before malloc is first used, which sort of ++@c implies @mtuinit/@asuinit but since the function is a no-op if malloc ++@c was already used, that doesn't pose any safety issues. The actual ++@c problem is with the hooks, designed for single-threaded ++@c fully-synchronous operation: they manage an unguarded linked list of ++@c allocated blocks, and get temporarily overwritten before calling the ++@c allocation functions recursively while holding the old hooks. There ++@c are no guards for thread safety, and inconsistent hooks may be found ++@c within signal handlers or left behind in case of cancellation. ++ + Calling @code{mcheck} tells @code{malloc} to perform occasional + consistency checks. These will catch things such as writing + past the end of a block that was allocated with @code{malloc}. +@@ -770,6 +1221,18 @@ + @end deftypefun + + @deftypefun {enum mcheck_status} mprobe (void *@var{pointer}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mcheck} @mtasuconst{:malloc_hooks}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} ++@c The linked list of headers may be modified concurrently by other ++@c threads, and it may find a partial update if called from a signal ++@c handler. It's mostly read only, so cancelling it might be safe, but ++@c it will modify global state that, if cancellation hits at just the ++@c right spot, may be left behind inconsistent. This path is only taken ++@c if checkhdr finds an inconsistency. If the inconsistency could only ++@c occur because of earlier undefined behavior, that wouldn't be an ++@c additional safety issue problem, but because of the other concurrency ++@c issues in the mcheck hooks, the apparent inconsistency could be the ++@c result of mcheck's own internal data race. So, AC-Unsafe it is. ++ + The @code{mprobe} function lets you explicitly check for inconsistencies + in a particular allocated block. You must have already called + @code{mcheck} at the beginning of the program, to do its occasional +@@ -896,16 +1359,18 @@ + @comment malloc.h + @comment GNU + @defvar __memalign_hook +-The value of this variable is a pointer to function that @code{memalign} +-uses whenever it is called. You should define this function to look +-like @code{memalign}; that is, like: ++The value of this variable is a pointer to function that @code{aligned_alloc}, ++@code{memalign}, @code{posix_memalign} and @code{valloc} use whenever they ++are called. You should define this function to look like @code{aligned_alloc}; ++that is, like: + + @smallexample + void *@var{function} (size_t @var{alignment}, size_t @var{size}, const void *@var{caller}) + @end smallexample + + The value of @var{caller} is the return address found on the stack when +-the @code{memalign} function was called. This value allows you to trace the ++the @code{aligned_alloc}, @code{memalign}, @code{posix_memalign} or ++@code{valloc} functions are called. This value allows you to trace the + memory consumption of the program. + @end defvar + +@@ -1082,6 +1547,24 @@ + @comment malloc.h + @comment SVID + @deftypefun {struct mallinfo} mallinfo (void) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasuconst{:mallopt}}@asunsafe{@asuinit{} @asulock{}}@acunsafe{@acuinit{} @aculock{}}} ++@c Accessing mp_.n_mmaps and mp_.max_mmapped_mem, modified with atomics ++@c but non-atomically elsewhere, may get us inconsistent results. We ++@c mark the statistics as unsafe, rather than the fast-path functions ++@c that collect the possibly inconsistent data. ++ ++@c __libc_mallinfo @mtuinit @mtasuconst:mallopt @asuinit @asulock @aculock ++@c ptmalloc_init (once) dup @mtsenv @asulock @aculock @acsfd @acsmem ++@c mutex_lock dup @asulock @aculock ++@c int_mallinfo @mtasuconst:mallopt [mp_ access on main_arena] ++@c malloc_consolidate dup ok ++@c check_malloc_state dup ok/disabled ++@c chunksize dup ok ++@c fastbin dupo ok ++@c bin_at dup ok ++@c last dup ok ++@c mutex_unlock @aculock ++ + This function returns information about the current dynamic memory usage + in a structure of type @code{struct mallinfo}. + @end deftypefun +@@ -1112,6 +1595,14 @@ + Allocate a block of @var{size} bytes, starting on a page boundary. + @xref{Aligned Memory Blocks}. + ++@item void *aligned_alloc (size_t @var{size}, size_t @var{alignment}) ++Allocate a block of @var{size} bytes, starting on an address that is a ++multiple of @var{alignment}. @xref{Aligned Memory Blocks}. ++ ++@item int posix_memalign (void **@var{memptr}, size_t @var{alignment}, size_t @var{size}) ++Allocate a block of @var{size} bytes, starting on an address that is a ++multiple of @var{alignment}. @xref{Aligned Memory Blocks}. ++ + @item void *memalign (size_t @var{size}, size_t @var{boundary}) + Allocate a block of @var{size} bytes, starting on an address that is a + multiple of @var{boundary}. @xref{Aligned Memory Blocks}. +@@ -1134,7 +1625,8 @@ + A pointer to a function that @code{free} uses whenever it is called. + + @item void (*__memalign_hook) (size_t @var{size}, size_t @var{alignment}, const void *@var{caller}) +-A pointer to a function that @code{memalign} uses whenever it is called. ++A pointer to a function that @code{aligned_alloc}, @code{memalign}, ++@code{posix_memalign} and @code{valloc} use whenever they are called. + + @item struct mallinfo mallinfo (void) + Return information about the current dynamic memory usage. +@@ -1171,6 +1663,20 @@ + @comment mcheck.h + @comment GNU + @deftypefun void mtrace (void) ++@safety{@prelim{}@mtunsafe{@mtsenv{} @mtasurace{:mtrace} @mtasuconst{:malloc_hooks} @mtuinit{}}@asunsafe{@asuinit{} @ascuheap{} @asucorrupt{} @asulock{}}@acunsafe{@acuinit{} @acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Like the mcheck hooks, these are not designed with thread safety in ++@c mind, because the hook pointers are temporarily modified without ++@c regard to other threads, signals or cancellation. ++ ++@c mtrace @mtuinit @mtasurace:mtrace @mtsenv @asuinit @ascuheap @asucorrupt @acuinit @acucorrupt @aculock @acsfd @acsmem ++@c __libc_secure_getenv dup @mtsenv ++@c malloc dup @ascuheap @acsmem ++@c fopen dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c fcntl dup ok ++@c setvbuf dup @aculock ++@c fprintf dup (on newly-created stream) @aculock ++@c __cxa_atexit (once) dup @asulock @aculock @acsmem ++@c free dup @ascuheap @acsmem + When the @code{mtrace} function is called it looks for an environment + variable named @code{MALLOC_TRACE}. This variable is supposed to + contain a valid file name. The user must have write access. If the +@@ -1194,6 +1700,11 @@ + @comment mcheck.h + @comment GNU + @deftypefun void muntrace (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mtrace} @mtasuconst{:malloc_hooks} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{} @aculock{} @acsfd{}}} ++ ++@c muntrace @mtasurace:mtrace @mtslocale @asucorrupt @ascuheap @acucorrupt @acsmem @aculock @acsfd ++@c fprintf (fputs) dup @mtslocale @asucorrupt @ascuheap @acsmem @aculock @acucorrupt ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd + The @code{muntrace} function can be called after @code{mtrace} was used + to enable tracing the @code{malloc} calls. If no (successful) call of + @code{mtrace} was made @code{muntrace} does nothing. +@@ -1505,6 +2016,20 @@ + @comment obstack.h + @comment GNU + @deftypefun int obstack_init (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acsafe{@acsmem{}}} ++@c obstack_init @mtsrace:obstack-ptr @acsmem ++@c _obstack_begin @acsmem ++@c chunkfun = obstack_chunk_alloc (suggested malloc) ++@c freefun = obstack_chunk_free (suggested free) ++@c *chunkfun @acsmem ++@c obstack_chunk_alloc user-supplied ++@c *obstack_alloc_failed_handler user-supplied ++@c -> print_and_abort (default) ++@c ++@c print_and_abort ++@c _ dup @ascuintl ++@c fxprintf dup @asucorrupt @aculock @acucorrupt ++@c exit @acucorrupt? + Initialize obstack @var{obstack-ptr} for allocation of objects. This + function calls the obstack's @code{obstack_chunk_alloc} function. If + allocation of memory fails, the function pointed to by +@@ -1560,6 +2085,10 @@ + @comment obstack.h + @comment GNU + @deftypefun {void *} obstack_alloc (struct obstack *@var{obstack-ptr}, int @var{size}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_alloc @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_blank dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_finish dup @mtsrace:obstack-ptr @acucorrupt + This allocates an uninitialized block of @var{size} bytes in an obstack + and returns its address. Here @var{obstack-ptr} specifies which obstack + to allocate the block in; it is the address of the @code{struct obstack} +@@ -1594,6 +2123,10 @@ + @comment obstack.h + @comment GNU + @deftypefun {void *} obstack_copy (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_copy @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_grow dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_finish dup @mtsrace:obstack-ptr @acucorrupt + This allocates a block and initializes it by copying @var{size} + bytes of data starting at @var{address}. It calls + @code{obstack_alloc_failed_handler} if allocation of memory by +@@ -1603,6 +2136,10 @@ + @comment obstack.h + @comment GNU + @deftypefun {void *} obstack_copy0 (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_copy0 @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_grow0 dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_finish dup @mtsrace:obstack-ptr @acucorrupt + Like @code{obstack_copy}, but appends an extra byte containing a null + character. This extra byte is not counted in the argument @var{size}. + @end deftypefun +@@ -1635,6 +2172,10 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_free (struct obstack *@var{obstack-ptr}, void *@var{object}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{}}} ++@c obstack_free @mtsrace:obstack-ptr @acucorrupt ++@c (obstack_free) @mtsrace:obstack-ptr @acucorrupt ++@c *freefun dup user-supplied + If @var{object} is a null pointer, everything allocated in the obstack + is freed. Otherwise, @var{object} must be the address of an object + allocated in the obstack. Then @var{object} is freed, along with +@@ -1739,6 +2280,13 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_blank (struct obstack *@var{obstack-ptr}, int @var{size}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_blank @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c _obstack_newchunk @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c *chunkfun dup @acsmem ++@c *obstack_alloc_failed_handler dup user-supplied ++@c *freefun ++@c obstack_blank_fast dup @mtsrace:obstack-ptr + The most basic function for adding to a growing object is + @code{obstack_blank}, which adds space without initializing it. + @end deftypefun +@@ -1746,6 +2294,10 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_grow (struct obstack *@var{obstack-ptr}, void *@var{data}, int @var{size}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_grow @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c _obstack_newchunk dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c memcpy ok + To add a block of initialized space, use @code{obstack_grow}, which is + the growing-object analogue of @code{obstack_copy}. It adds @var{size} + bytes of data to the growing object, copying the contents from +@@ -1755,6 +2307,12 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_grow0 (struct obstack *@var{obstack-ptr}, void *@var{data}, int @var{size}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_grow0 @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c (no sequence point between storing NUL and incrementing next_free) ++@c (multiple changes to next_free => @acucorrupt) ++@c _obstack_newchunk dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c memcpy ok + This is the growing-object analogue of @code{obstack_copy0}. It adds + @var{size} bytes copied from @var{data}, followed by an additional null + character. +@@ -1763,6 +2321,10 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_1grow (struct obstack *@var{obstack-ptr}, char @var{c}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_1grow @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c _obstack_newchunk dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_1grow_fast dup @mtsrace:obstack-ptr @acucorrupt @acsmem + To add one character at a time, use the function @code{obstack_1grow}. + It adds a single byte containing @var{c} to the growing object. + @end deftypefun +@@ -1770,6 +2332,10 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_ptr_grow (struct obstack *@var{obstack-ptr}, void *@var{data}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_ptr_grow @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c _obstack_newchunk dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_ptr_grow_fast dup @mtsrace:obstack-ptr + Adding the value of a pointer one can use the function + @code{obstack_ptr_grow}. It adds @code{sizeof (void *)} bytes + containing the value of @var{data}. +@@ -1778,6 +2344,10 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_int_grow (struct obstack *@var{obstack-ptr}, int @var{data}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_int_grow @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c _obstack_newchunk dup @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c obstack_int_grow_fast dup @mtsrace:obstack-ptr + A single value of type @code{int} can be added by using the + @code{obstack_int_grow} function. It adds @code{sizeof (int)} bytes to + the growing object and initializes them with the value of @var{data}. +@@ -1786,6 +2356,8 @@ + @comment obstack.h + @comment GNU + @deftypefun {void *} obstack_finish (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{}}} ++@c obstack_finish @mtsrace:obstack-ptr @acucorrupt + When you are finished growing the object, use the function + @code{obstack_finish} to close it off and return its final address. + +@@ -1805,6 +2377,7 @@ + @comment obstack.h + @comment GNU + @deftypefun int obstack_object_size (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acsafe{}} + This function returns the current size of the growing object, in bytes. + Remember to call this function @emph{before} finishing the object. + After it is finished, @code{obstack_object_size} will return zero. +@@ -1848,6 +2421,7 @@ + @comment obstack.h + @comment GNU + @deftypefun int obstack_room (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acsafe{}} + This returns the number of bytes that can be added safely to the current + growing object (or to an object about to be started) in obstack + @var{obstack} using the fast growth functions. +@@ -1859,6 +2433,9 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_1grow_fast (struct obstack *@var{obstack-ptr}, char @var{c}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c obstack_1grow_fast @mtsrace:obstack-ptr @acucorrupt @acsmem ++@c (no sequence point between copying c and incrementing next_free) + The function @code{obstack_1grow_fast} adds one byte containing the + character @var{c} to the growing object in obstack @var{obstack-ptr}. + @end deftypefun +@@ -1866,6 +2443,8 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_ptr_grow_fast (struct obstack *@var{obstack-ptr}, void *@var{data}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acsafe{}} ++@c obstack_ptr_grow_fast @mtsrace:obstack-ptr + The function @code{obstack_ptr_grow_fast} adds @code{sizeof (void *)} + bytes containing the value of @var{data} to the growing object in + obstack @var{obstack-ptr}. +@@ -1874,6 +2453,8 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_int_grow_fast (struct obstack *@var{obstack-ptr}, int @var{data}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acsafe{}} ++@c obstack_int_grow_fast @mtsrace:obstack-ptr + The function @code{obstack_int_grow_fast} adds @code{sizeof (int)} bytes + containing the value of @var{data} to the growing object in obstack + @var{obstack-ptr}. +@@ -1882,6 +2463,8 @@ + @comment obstack.h + @comment GNU + @deftypefun void obstack_blank_fast (struct obstack *@var{obstack-ptr}, int @var{size}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acsafe{}} ++@c obstack_blank_fast @mtsrace:obstack-ptr + The function @code{obstack_blank_fast} adds @var{size} bytes to the + growing object in obstack @var{obstack-ptr} without initializing them. + @end deftypefun +@@ -1909,7 +2492,7 @@ + int room = obstack_room (obstack); + if (room == 0) + @{ +- /* @r{Not enough room. Add one character slowly,} ++ /* @r{Not enough room. Add one character slowly,} + @r{which may copy to a new chunk and make room.} */ + obstack_1grow (obstack, *ptr++); + len--; +@@ -1940,6 +2523,7 @@ + @comment obstack.h + @comment GNU + @deftypefun {void *} obstack_base (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acsafe{}} + This function returns the tentative address of the beginning of the + currently growing object in @var{obstack-ptr}. If you finish the object + immediately, it will have that address. If you make it larger first, it +@@ -1953,6 +2537,7 @@ + @comment obstack.h + @comment GNU + @deftypefun {void *} obstack_next_free (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acsafe{}} + This function returns the address of the first free byte in the current + chunk of obstack @var{obstack-ptr}. This is the end of the currently + growing object. If no object is growing, @code{obstack_next_free} +@@ -1962,6 +2547,8 @@ + @comment obstack.h + @comment GNU + @deftypefun int obstack_object_size (struct obstack *@var{obstack-ptr}) ++@c dup ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack-ptr}}@assafe{}@acsafe{}} + This function returns the size in bytes of the currently growing object. + This is equivalent to + +@@ -1986,6 +2573,7 @@ + @comment obstack.h + @comment GNU + @deftypefn Macro int obstack_alignment_mask (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The value is a bit mask; a bit that is 1 indicates that the corresponding + bit in the address of an object should be 0. The mask value should be one + less than a power of 2; the effect is that all object addresses are +@@ -2053,6 +2641,7 @@ + @comment obstack.h + @comment GNU + @deftypefn Macro int obstack_chunk_size (struct obstack *@var{obstack-ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This returns the chunk size of the given obstack. + @end deftypefn + +@@ -2172,6 +2761,7 @@ + @comment stdlib.h + @comment GNU, BSD + @deftypefun {void *} alloca (size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The return value of @code{alloca} is the address of a block of @var{size} + bytes of memory, allocated in the stack frame of the calling function. + @end deftypefun +@@ -2354,6 +2944,7 @@ + @comment unistd.h + @comment BSD + @deftypefun int brk (void *@var{addr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{brk} sets the high end of the calling process' data segment to + @var{addr}. +@@ -2396,6 +2987,8 @@ + @comment unistd.h + @comment BSD + @deftypefun void *sbrk (ptrdiff_t @var{delta}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++ + This function is the same as @code{brk} except that you specify the new + end of the data segment as an offset @var{delta} from the current end + and on success the return value is the address of the resulting end of +@@ -2535,6 +3128,7 @@ + @comment sys/mman.h + @comment POSIX.1b + @deftypefun int mlock (const void *@var{addr}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{mlock} locks a range of the calling process' virtual pages. + +@@ -2588,6 +3182,7 @@ + @comment sys/mman.h + @comment POSIX.1b + @deftypefun int munlock (const void *@var{addr}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{munlock} unlocks a range of the calling process' virtual pages. + +@@ -2600,6 +3195,7 @@ + @comment sys/mman.h + @comment POSIX.1b + @deftypefun int mlockall (int @var{flags}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{mlockall} locks all the pages in a process' virtual memory address + space, and/or any that are added to it in the future. This includes the +@@ -2676,6 +3272,7 @@ + @comment sys/mman.h + @comment POSIX.1b + @deftypefun int munlockall (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{munlockall} unlocks every page in the calling process' virtual + address space and turn off @code{MCL_FUTURE} future locking mode. +diff -urN glibc-2.17-c758a686/manual/message.texi glibc-2.17-c758a686/manual/message.texi +--- glibc-2.17-c758a686/manual/message.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/message.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -2,9 +2,9 @@ + @c %MENU% How to make the program speak the user's language + @chapter Message Translation + +-The program's interface with the human should be designed in a way to +-ease the human the task. One of the possibilities is to use messages in +-whatever language the user prefers. ++The program's interface with the user should be designed to ease the user's ++task. One way to ease the user's task is to use messages in whatever ++language the user prefers. + + Printing messages in different languages can be implemented in different + ways. One could add all the different languages in the source code and +@@ -40,7 +40,7 @@ + @end itemize + + The two approaches mainly differ in the implementation of this last +-step. The design decisions made for this influences the whole rest. ++step. Decisions made in the last step influence the rest of the design. + + @menu + * Message catalogs a la X/Open:: The @code{catgets} family of functions. +@@ -86,7 +86,32 @@ + @comment nl_types.h + @comment X/Open + @deftypefun nl_catd catopen (const char *@var{cat_name}, int @var{flag}) +-The @code{catgets} function tries to locate the message data file names ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c catopen @mtsenv @ascuheap @acsmem ++@c strchr ok ++@c setlocale(,NULL) ok ++@c getenv @mtsenv ++@c strlen ok ++@c alloca ok ++@c stpcpy ok ++@c malloc @ascuheap @acsmem ++@c __open_catalog @ascuheap @acsmem ++@c strchr ok ++@c open_not_cancel_2 @acsfd ++@c strlen ok ++@c ENOUGH ok ++@c alloca ok ++@c memcpy ok ++@c fxstat64 ok ++@c __set_errno ok ++@c mmap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c read_not_cancel ok ++@c free dup @ascuheap @acsmem ++@c munmap ok ++@c close_not_cancel_no_status ok ++@c free @ascuheap @acsmem ++The @code{catopen} function tries to locate the message data file names + @var{cat_name} and loads it when found. The return value is of an + opaque type and can be used in calls to the other functions to refer to + this loaded catalog. +@@ -243,6 +268,7 @@ + + + @deftypefun {char *} catgets (nl_catd @var{catalog_desc}, int @var{set}, int @var{message}, const char *@var{string}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function @code{catgets} has to be used to access the massage catalog + previously opened using the @code{catopen} function. The + @var{catalog_desc} parameter must be a value previously returned by +@@ -281,6 +307,11 @@ + Usage}). + + @deftypefun int catclose (nl_catd @var{catalog_desc}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c catclose @ascuheap @acucorrupt @acsmem ++@c __set_errno ok ++@c munmap ok ++@c free @ascuheap @acsmem + The @code{catclose} function can be used to free the resources + associated with a message catalog which previously was opened by a call + to @code{catopen}. If the resources can be successfully freed the +@@ -803,12 +834,14 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} gettext (const char *@var{msgid}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Wrapper for dcgettext. + The @code{gettext} function searches the currently selected message + catalogs for a string which is equal to @var{msgid}. If there is such a + string available it is returned. Otherwise the argument string + @var{msgid} is returned. + +-Please note that all though the return value is @code{char *} the ++Please note that although the return value is @code{char *} the + returned string must not be changed. This broken type results from the + history of the function and does not reflect the way the function should + be used. +@@ -850,6 +883,8 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} dgettext (const char *@var{domainname}, const char *@var{msgid}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Wrapper for dcgettext. + The @code{dgettext} functions acts just like the @code{gettext} + function. It only takes an additional first argument @var{domainname} + which guides the selection of the message catalogs which are searched +@@ -864,6 +899,102 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} dcgettext (const char *@var{domainname}, const char *@var{msgid}, int @var{category}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c dcgettext @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c dcigettext @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c libc_rwlock_rdlock @asulock @aculock ++@c current_locale_name ok [protected from @mtslocale] ++@c tfind ok ++@c libc_rwlock_unlock ok ++@c plural_lookup ok ++@c plural_eval ok ++@c rawmemchr ok ++@c DETERMINE_SECURE ok, nothing ++@c strcmp ok ++@c strlen ok ++@c getcwd @ascuheap @acsmem @acsfd ++@c strchr ok ++@c stpcpy ok ++@c category_to_name ok ++@c guess_category_value @mtsenv ++@c getenv @mtsenv ++@c current_locale_name dup ok [protected from @mtslocale by dcigettext] ++@c strcmp ok ++@c ENABLE_SECURE ok ++@c _nl_find_domain @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c libc_rwlock_rdlock dup @asulock @aculock ++@c _nl_make_l10nflist dup @ascuheap @acsmem ++@c libc_rwlock_unlock dup ok ++@c _nl_load_domain @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock_recursive @aculock ++@c libc_lock_unlock_recursive @aculock ++@c open->open_not_cancel_2 @acsfd ++@c fstat ok ++@c mmap dup @acsmem ++@c close->close_not_cancel_no_status @acsfd ++@c malloc dup @ascuheap @acsmem ++@c read->read_not_cancel ok ++@c munmap dup @acsmem ++@c W dup ok ++@c strlen dup ok ++@c get_sysdep_segment_value ok ++@c memcpy dup ok ++@c hash_string dup ok ++@c free dup @ascuheap @acsmem ++@c libc_rwlock_init ok ++@c _nl_find_msg dup @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c libc_rwlock_fini ok ++@c EXTRACT_PLURAL_EXPRESSION @ascuheap @acsmem ++@c strstr dup ok ++@c isspace ok ++@c strtoul ok ++@c PLURAL_PARSE @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c INIT_GERMANIC_PLURAL ok, nothing ++@c the pre-C99 variant is @acucorrupt [protected from @mtuinit by dcigettext] ++@c _nl_expand_alias dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c _nl_explode_name dup @ascuheap @acsmem ++@c libc_rwlock_wrlock dup @asulock @aculock ++@c free dup @asulock @aculock @acsfd @acsmem ++@c _nl_find_msg @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c _nl_load_domain dup @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem ++@c strlen ok ++@c hash_string ok ++@c W ok ++@c SWAP ok ++@c bswap_32 ok ++@c strcmp ok ++@c get_output_charset @mtsenv @ascuheap @acsmem ++@c getenv dup @mtsenv ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c memcpy dup ok ++@c libc_rwlock_rdlock dup @asulock @aculock ++@c libc_rwlock_unlock dup ok ++@c libc_rwlock_wrlock dup @asulock @aculock ++@c realloc @ascuheap @acsmem ++@c strdup @ascuheap @acsmem ++@c strstr ok ++@c strcspn ok ++@c mempcpy dup ok ++@c norm_add_slashes dup ok ++@c gconv_open @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c [protected from @mtslocale by dcigettext locale lock] ++@c free dup @ascuheap @acsmem ++@c libc_lock_lock @asulock @aculock ++@c calloc @ascuheap @acsmem ++@c gconv dup @acucorrupt [protected from @mtsrace and @asucorrupt by lock] ++@c libc_lock_unlock ok ++@c malloc @ascuheap @acsmem ++@c mempcpy ok ++@c memcpy ok ++@c strcpy ok ++@c libc_rwlock_wrlock @asulock @aculock ++@c tsearch @ascuheap @acucorrupt @acsmem [protected from @mtsrace and @asucorrupt] ++@c transcmp ok ++@c strmp dup ok ++@c free @ascuheap @acsmem + The @code{dcgettext} adds another argument to those which + @code{dgettext} takes. This argument @var{category} specifies the last + piece of information needed to localize the message catalog. I.e., the +@@ -967,7 +1098,7 @@ + second best choice to fall back on the language of the developer and + simply not translate any message. Instead a user might be better able + to read the messages in another language and so the user of the program +-should be able to define an precedence order of languages. ++should be able to define a precedence order of languages. + @end itemize + + We can divide the configuration actions in two parts: the one is +@@ -988,6 +1119,13 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} textdomain (const char *@var{domainname}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} ++@c textdomain @asulock @ascuheap @aculock @acsmem ++@c libc_rwlock_wrlock @asulock @aculock ++@c strcmp ok ++@c strdup @ascuheap @acsmem ++@c free @ascuheap @acsmem ++@c libc_rwlock_unlock ok + The @code{textdomain} function sets the default domain, which is used in + all future @code{gettext} calls, to @var{domainname}. Please note that + @code{dgettext} and @code{dcgettext} calls are not influenced if the +@@ -1019,6 +1157,14 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} bindtextdomain (const char *@var{domainname}, const char *@var{dirname}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c bindtextdomain @ascuheap @acsmem ++@c set_binding_values @ascuheap @acsmem ++@c libc_rwlock_wrlock dup @asulock @aculock ++@c strcmp dup ok ++@c strdup dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem + The @code{bindtextdomain} function can be used to specify the directory + which contains the message catalogs for domain @var{domainname} for the + different languages. To be correct, this is the directory where the +@@ -1114,7 +1260,7 @@ + extended @code{gettext} interface should be used. + + These extra functions are taking instead of the one key string two +-strings and an numerical argument. The idea behind this is that using ++strings and a numerical argument. The idea behind this is that using + the numerical argument and the first string as a key, the implementation + can select using rules specified by the translator the right plural + form. The two string arguments then will be used to provide a return +@@ -1134,6 +1280,8 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} ngettext (const char *@var{msgid1}, const char *@var{msgid2}, unsigned long int @var{n}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Wrapper for dcngettext. + The @code{ngettext} function is similar to the @code{gettext} function + as it finds the message catalogs in the same way. But it takes two + extra arguments. The @var{msgid1} parameter must contain the singular +@@ -1157,6 +1305,8 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} dngettext (const char *@var{domain}, const char *@var{msgid1}, const char *@var{msgid2}, unsigned long int @var{n}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Wrapper for dcngettext. + The @code{dngettext} is similar to the @code{dgettext} function in the + way the message catalog is selected. The difference is that it takes + two extra parameter to provide the correct plural form. These two +@@ -1166,6 +1316,8 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} dcngettext (const char *@var{domain}, const char *@var{msgid1}, const char *@var{msgid2}, unsigned long int @var{n}, int @var{category}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Wrapper for dcigettext. + The @code{dcngettext} is similar to the @code{dcgettext} function in the + way the message catalog is selected. The difference is that it takes + two extra parameter to provide the correct plural form. These two +@@ -1422,6 +1574,9 @@ + @comment libintl.h + @comment GNU + @deftypefun {char *} bind_textdomain_codeset (const char *@var{domainname}, const char *@var{codeset}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c bind_textdomain_codeset @ascuheap @acsmem ++@c set_binding_values dup @ascuheap @acsmem + The @code{bind_textdomain_codeset} function can be used to specify the + output character set for message catalogs for domain @var{domainname}. + The @var{codeset} argument must be a valid codeset name which can be used +@@ -1429,7 +1584,7 @@ + + If the @var{codeset} parameter is the null pointer, + @code{bind_textdomain_codeset} returns the currently selected codeset +-for the domain with the name @var{domainname}. It returns @code{NULL} if ++for the domain with the name @var{domainname}. It returns @code{NULL} if + no codeset has yet been selected. + + The @code{bind_textdomain_codeset} function can be used several times. +@@ -1441,7 +1596,8 @@ + allocated internally in the function and must not be changed by the + user. If the system went out of core during the execution of + @code{bind_textdomain_codeset}, the return value is @code{NULL} and the +-global variable @var{errno} is set accordingly. @end deftypefun ++global variable @var{errno} is set accordingly. ++@end deftypefun + + + @node GUI program problems +diff -urN glibc-2.17-c758a686/manual/nss.texi glibc-2.17-c758a686/manual/nss.texi +--- glibc-2.17-c758a686/manual/nss.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/nss.texi 2014-09-12 16:10:25.996741462 -0400 +@@ -10,7 +10,7 @@ + using files (e.g., @file{/etc/passwd}), but other nameservices (like the + Network Information Service (NIS) and the Domain Name Service (DNS)) + became popular, and were hacked into the C library, usually with a fixed +-search order (@pxref{frobnicate, , ,jargon, The Jargon File}). ++search order. + + @Theglibc{} contains a cleaner solution of this problem. It is + designed after a method used by Sun Microsystems in the C library of +diff -urN glibc-2.17-c758a686/manual/pattern.texi glibc-2.17-c758a686/manual/pattern.texi +--- glibc-2.17-c758a686/manual/pattern.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/pattern.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -28,6 +28,38 @@ + @comment fnmatch.h + @comment POSIX.2 + @deftypefun int fnmatch (const char *@var{pattern}, const char *@var{string}, int @var{flags}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c fnmatch @mtsenv @mtslocale @ascuheap @acsmem ++@c strnlen dup ok ++@c mbsrtowcs ++@c memset dup ok ++@c malloc dup @ascuheap @acsmem ++@c mbsinit dup ok ++@c free dup @ascuheap @acsmem ++@c FCT = internal_fnwmatch @mtsenv @mtslocale @ascuheap @acsmem ++@c FOLD @mtslocale ++@c towlower @mtslocale ++@c EXT @mtsenv @mtslocale @ascuheap @acsmem ++@c STRLEN = wcslen dup ok ++@c getenv @mtsenv ++@c malloc dup @ascuheap @acsmem ++@c MEMPCPY = wmempcpy dup ok ++@c FCT dup @mtsenv @mtslocale @ascuheap @acsmem ++@c STRCAT = wcscat dup ok ++@c free dup @ascuheap @acsmem ++@c END @mtsenv ++@c getenv @mtsenv ++@c MEMCHR = wmemchr dup ok ++@c getenv @mtsenv ++@c IS_CHAR_CLASS = is_char_class @mtslocale ++@c wctype @mtslocale ++@c BTOWC ok ++@c ISWCTYPE ok ++@c auto findidx dup ok ++@c elem_hash dup ok ++@c memcmp dup ok ++@c collseq_table_lookup dup ok ++@c NO_LEADING_PERIOD ok + This function tests whether the string @var{string} matches the pattern + @var{pattern}. It returns @code{0} if they do match; otherwise, it + returns the nonzero value @code{FNM_NOMATCH}. The arguments +@@ -36,11 +68,8 @@ + The argument @var{flags} is a combination of flag bits that alter the + details of matching. See below for a list of the defined flags. + +-In @theglibc{}, @code{fnmatch} cannot experience an ``error''---it +-always returns an answer for whether the match succeeds. However, other +-implementations of @code{fnmatch} might sometimes report ``errors''. +-They would do so by returning nonzero values that are not equal to +-@code{FNM_NOMATCH}. ++In @theglibc{}, @code{fnmatch} might sometimes report ``errors'' by ++returning nonzero values that are not equal to @code{FNM_NOMATCH}. + @end deftypefun + + These are the available flags for the @var{flags} argument: +@@ -234,6 +263,12 @@ + (*) (const char *,} @w{struct stat *)}}. + + This is a GNU extension. ++ ++@item gl_flags ++The flags used when @code{glob} was called. In addition, @code{GLOB_MAGCHAR} ++might be set. See @ref{Flags for Globbing} for more details. ++ ++This is a GNU extension. + @end table + @end deftp + +@@ -312,12 +347,75 @@ + (*) (const char *,} @w{struct stat64 *)}}. + + This is a GNU extension. ++ ++@item gl_flags ++The flags used when @code{glob} was called. In addition, @code{GLOB_MAGCHAR} ++might be set. See @ref{Flags for Globbing} for more details. ++ ++This is a GNU extension. + @end table + @end deftp + + @comment glob.h + @comment POSIX.2 + @deftypefun int glob (const char *@var{pattern}, int @var{flags}, int (*@var{errfunc}) (const char *@var{filename}, int @var{error-code}), glob_t *@var{vector-ptr}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtsenv{} @mtascusig{:ALRM} @mtascutimer{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c glob @mtasurace:utent @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c strlen dup ok ++@c strchr dup ok ++@c malloc dup @ascuheap @acsmem ++@c mempcpy dup ok ++@c next_brace_sub ok ++@c free dup @ascuheap @acsmem ++@c globfree dup @asucorrupt @ascuheap @acucorrupt @acsmem ++@c glob_pattern_p ok ++@c glob_pattern_type dup ok ++@c getenv dup @mtsenv ++@c GET_LOGIN_NAME_MAX ok ++@c getlogin_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c GETPW_R_SIZE_MAX ok ++@c getpwnam_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c memcpy dup ok ++@c memchr dup ok ++@c *pglob->gl_stat user-supplied ++@c stat64 dup ok ++@c S_ISDIR dup ok ++@c strdup dup @ascuheap @acsmem ++@c glob_pattern_type ok ++@c glob_in_dir @mtsenv @mtslocale @asucorrupt @ascuheap @acucorrupt @acsfd @acsmem ++@c strlen dup ok ++@c glob_pattern_type dup ok ++@c malloc dup @ascuheap @acsmem ++@c mempcpy dup ok ++@c *pglob->gl_stat user-supplied ++@c stat64 dup ok ++@c free dup @ascuheap @acsmem ++@c *pglob->gl_opendir user-supplied ++@c opendir dup @ascuheap @acsmem @acsfd ++@c dirfd dup ok ++@c *pglob->gl_readdir user-supplied ++@c CONVERT_DIRENT_DIRENT64 ok ++@c readdir64 ok [protected by exclusive use of the stream] ++@c REAL_DIR_ENTRY ok ++@c DIRENT_MIGHT_BE_DIR ok ++@c fnmatch dup @mtsenv @mtslocale @ascuheap @acsmem ++@c DIRENT_MIGHT_BE_SYMLINK ok ++@c link_exists_p ok ++@c link_exists2_p ok ++@c strlen dup ok ++@c mempcpy dup ok ++@c *pglob->gl_stat user-supplied ++@c fxstatat64 dup ok ++@c realloc dup @ascuheap @acsmem ++@c pglob->gl_closedir user-supplied ++@c closedir @ascuheap @acsmem @acsfd ++@c prefix_array dup @asucorrupt @ascuheap @acucorrupt @acsmem ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c mempcpy dup ok ++@c strcpy dup ok + The function @code{glob} does globbing using the pattern @var{pattern} + in the current directory. It puts the result in a newly allocated + vector, and stores the size and address of this vector into +@@ -389,6 +487,8 @@ + @comment glob.h + @comment GNU + @deftypefun int glob64 (const char *@var{pattern}, int @var{flags}, int (*@var{errfunc}) (const char *@var{filename}, int @var{error-code}), glob64_t *@var{vector-ptr}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtsenv{} @mtascusig{:ALRM} @mtascutimer{} @mtslocale{}}@asunsafe{@ascudlopen{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Same code as glob, but with glob64_t #defined as glob_t. + The @code{glob64} function was added as part of the Large File Summit + extensions but is not part of the original LFS proposal. The reason for + this is simple: it is not necessary. The necessity for a @code{glob64} +@@ -408,10 +508,12 @@ + @node Flags for Globbing + @subsection Flags for Globbing + +-This section describes the flags that you can specify in the ++This section describes the standard flags that you can specify in the + @var{flags} argument to @code{glob}. Choose the flags you want, + and combine them with the C bitwise OR operator @code{|}. + ++Note that there are @ref{More Flags for Globbing} available as GNU extensions. ++ + @vtable @code + @comment glob.h + @comment POSIX.2 +@@ -481,13 +583,6 @@ + + @comment glob.h + @comment POSIX.2 +-@item GLOB_NOSORT +-Don't sort the file names; return them in no particular order. +-(In practice, the order will depend on the order of the entries in +-the directory.) The only reason @emph{not} to sort is to save time. +- +-@comment glob.h +-@comment POSIX.2 + @item GLOB_NOESCAPE + Don't treat the @samp{\} character specially in patterns. Normally, + @samp{\} quotes the following character, turning off its special meaning +@@ -500,6 +595,13 @@ + @code{glob} does its work by calling the function @code{fnmatch} + repeatedly. It handles the flag @code{GLOB_NOESCAPE} by turning on the + @code{FNM_NOESCAPE} flag in calls to @code{fnmatch}. ++ ++@comment glob.h ++@comment POSIX.2 ++@item GLOB_NOSORT ++Don't sort the file names; return them in no particular order. ++(In practice, the order will depend on the order of the entries in ++the directory.) The only reason @emph{not} to sort is to save time. + @end vtable + + @node More Flags for Globbing +@@ -651,6 +753,9 @@ + @comment glob.h + @comment POSIX.2 + @deftypefun void globfree (glob_t *@var{pglob}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c globfree dup @asucorrupt @ascuheap @acucorrupt @acsmem ++@c free dup @ascuheap @acsmem + The @code{globfree} function frees all resources allocated by previous + calls to @code{glob} associated with the object pointed to by + @var{pglob}. This function should be called whenever the currently used +@@ -660,6 +765,7 @@ + @comment glob.h + @comment GNU + @deftypefun void globfree64 (glob64_t *@var{pglob}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} + This function is equivalent to @code{globfree} but it frees records of + type @code{glob64_t} which were allocated by @code{glob64}. + @end deftypefun +@@ -722,6 +828,250 @@ + @comment regex.h + @comment POSIX.2 + @deftypefun int regcomp (regex_t *restrict @var{compiled}, const char *restrict @var{pattern}, int @var{cflags}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c All of the issues have to do with memory allocation and multi-byte ++@c character handling present in the input string, or implied by ranges ++@c or inverted character classes. ++@c (re_)malloc @ascuheap @acsmem ++@c re_compile_internal @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c (re_)realloc @ascuheap @acsmem [no @asucorrupt @acucorrupt for we zero the buffer] ++@c init_dfa @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c (re_)malloc @ascuheap @acsmem ++@c calloc @ascuheap @acsmem ++@c _NL_CURRENT ok ++@c _NL_CURRENT_WORD ok ++@c btowc @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c libc_lock_init ok ++@c re_string_construct @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_construct_common ok ++@c re_string_realloc_buffers @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c build_wcs_upper_buffer @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c isascii ok ++@c mbsinit ok ++@c toupper ok ++@c mbrtowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c iswlower @mtslocale ++@c towupper @mtslocale ++@c wcrtomb dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c (re_)malloc dup @ascuheap @acsmem ++@c build_upper_buffer ok (@mtslocale but optimized) ++@c islower ok ++@c toupper ok ++@c build_wcs_buffer @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c mbrtowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_translate_buffer ok ++@c parse @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c fetch_token @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c peek_token @mtslocale ++@c re_string_eoi ok ++@c re_string_peek_byte ok ++@c re_string_cur_idx ok ++@c re_string_length ok ++@c re_string_peek_byte_case @mtslocale ++@c re_string_peek_byte dup ok ++@c re_string_is_single_byte_char ok ++@c isascii ok ++@c re_string_peek_byte dup ok ++@c re_string_wchar_at ok ++@c re_string_skip_bytes ok ++@c re_string_skip_bytes dup ok ++@c parse_reg_exp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c parse_branch @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c parse_expression @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c create_token_tree dup @ascuheap @acsmem ++@c re_string_eoi dup ok ++@c re_string_first_byte ok ++@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c create_tree dup @ascuheap @acsmem ++@c parse_sub_exp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c parse_reg_exp dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c postorder() @ascuheap @acsmem ++@c free_tree @ascuheap @acsmem ++@c free_token dup @ascuheap @acsmem ++@c create_tree dup @ascuheap @acsmem ++@c parse_bracket_exp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c _NL_CURRENT dup ok ++@c _NL_CURRENT_WORD dup ok ++@c calloc dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c peek_token_bracket ok ++@c re_string_eoi dup ok ++@c re_string_peek_byte dup ok ++@c re_string_first_byte dup ok ++@c re_string_cur_idx dup ok ++@c re_string_length dup ok ++@c re_string_skip_bytes dup ok ++@c bitset_set ok ++@c re_string_skip_bytes ok ++@c parse_bracket_element @mtslocale ++@c re_string_char_size_at ok ++@c re_string_wchar_at dup ok ++@c re_string_skip_bytes dup ok ++@c parse_bracket_symbol @mtslocale ++@c re_string_eoi dup ok ++@c re_string_fetch_byte_case @mtslocale ++@c re_string_fetch_byte ok ++@c re_string_first_byte dup ok ++@c isascii ok ++@c re_string_char_size_at dup ok ++@c re_string_skip_bytes dup ok ++@c re_string_fetch_byte dup ok ++@c re_string_peek_byte dup ok ++@c re_string_skip_bytes dup ok ++@c peek_token_bracket dup ok ++@c auto build_range_exp @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c auto lookup_collation_sequence_value @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c btowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c collseq_table_lookup ok ++@c auto seek_collating_symbol_entry dup ok ++@c (re_)realloc dup @ascuheap @acsmem ++@c collseq_table_lookup dup ok ++@c bitset_set dup ok ++@c (re_)realloc dup @ascuheap @acsmem ++@c build_equiv_class @mtslocale @ascuheap @acsmem ++@c _NL_CURRENT ok ++@c auto findidx ok ++@c bitset_set dup ok ++@c (re_)realloc dup @ascuheap @acsmem ++@c auto build_collating_symbol @ascuheap @acsmem ++@c auto seek_collating_symbol_entry ok ++@c bitset_set dup ok ++@c (re_)realloc dup @ascuheap @acsmem ++@c build_charclass @mtslocale @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c bitset_set dup ok ++@c isalnum ok ++@c iscntrl ok ++@c isspace ok ++@c isalpha ok ++@c isdigit ok ++@c isprint ok ++@c isupper ok ++@c isblank ok ++@c isgraph ok ++@c ispunct ok ++@c isxdigit ok ++@c bitset_not ok ++@c bitset_mask ok ++@c create_token_tree dup @ascuheap @acsmem ++@c create_tree dup @ascuheap @acsmem ++@c free_charset dup @ascuheap @acsmem ++@c init_word_char @mtslocale ++@c isalnum ok ++@c build_charclass_op @mtslocale @ascuheap @acsmem ++@c calloc dup @ascuheap @acsmem ++@c build_charclass dup @mtslocale @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c free_charset dup @ascuheap @acsmem ++@c bitset_set dup ok ++@c bitset_not dup ok ++@c bitset_mask dup ok ++@c create_token_tree dup @ascuheap @acsmem ++@c create_tree dup @ascuheap @acsmem ++@c parse_dup_op @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_cur_idx dup ok ++@c fetch_number @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_set_index ok ++@c postorder() @ascuheap @acsmem ++@c free_tree dup @ascuheap @acsmem ++@c mark_opt_subexp ok ++@c duplicate_tree @ascuheap @acsmem ++@c create_token_tree dup @ascuheap @acsmem ++@c create_tree dup @ascuheap @acsmem ++@c postorder() @ascuheap @acsmem ++@c free_tree dup @ascuheap @acsmem ++@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c parse_branch dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c create_tree dup @ascuheap @acsmem ++@c create_tree @ascuheap @acsmem ++@c create_token_tree @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c analyze @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c preorder() @ascuheap @acsmem ++@c optimize_subexps ok ++@c calc_next ok ++@c link_nfa_nodes @ascuheap @acsmem ++@c re_node_set_init_1 @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c re_node_set_init_2 @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c postorder() @ascuheap @acsmem ++@c lower_subexps @ascuheap @acsmem ++@c lower_subexp @ascuheap @acsmem ++@c create_tree dup @ascuheap @acsmem ++@c calc_first @ascuheap @acsmem ++@c re_dfa_add_node @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c re_node_set_init_empty ok ++@c calc_eclosure @ascuheap @acsmem ++@c calc_eclosure_iter @ascuheap @acsmem ++@c re_node_set_alloc @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c duplicate_node_closure @ascuheap @acsmem ++@c re_node_set_empty ok ++@c duplicate_node @ascuheap @acsmem ++@c re_dfa_add_node dup @ascuheap @acsmem ++@c re_node_set_insert @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c search_duplicated_node ok ++@c re_node_set_merge @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c re_node_set_free @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c re_node_set_insert dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c calc_inveclosure @ascuheap @acsmem ++@c re_node_set_init_empty dup ok ++@c re_node_set_insert_last @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c optimize_utf8 ok ++@c create_initial_state @ascuheap @acsmem ++@c re_node_set_init_copy @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c re_node_set_init_empty dup ok ++@c re_node_set_contains ok ++@c re_node_set_merge dup @ascuheap @acsmem ++@c re_acquire_state_context @ascuheap @acsmem ++@c calc_state_hash ok ++@c re_node_set_compare ok ++@c create_cd_newstate @ascuheap @acsmem ++@c calloc dup @ascuheap @acsmem ++@c re_node_set_init_copy dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c free_state @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c NOT_SATISFY_PREV_CONSTRAINT ok ++@c re_node_set_remove_at ok ++@c register_state @ascuheap @acsmem ++@c re_node_set_alloc dup @ascuheap @acsmem ++@c re_node_set_insert_last dup @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c free_workarea_compile @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c re_string_destruct @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c free_dfa_content @ascuheap @acsmem ++@c free_token @ascuheap @acsmem ++@c free_charset @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_compile_fastmap @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_compile_fastmap_iter @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_set_fastmap ok ++@c tolower ok ++@c mbrtowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c wcrtomb dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c towlower @mtslocale ++@c _NL_CURRENT ok ++@c (re_)free @ascuheap @acsmem + The function @code{regcomp} ``compiles'' a regular expression into a + data structure that you can use with @code{regexec} to match against a + string. The compiled regular expression format is designed for +@@ -871,6 +1221,247 @@ + @comment regex.h + @comment POSIX.2 + @deftypefun int regexec (const regex_t *restrict @var{compiled}, const char *restrict @var{string}, size_t @var{nmatch}, regmatch_t @var{matchptr}[restrict], int @var{eflags}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c libc_lock_lock @asulock @aculock ++@c re_search_internal @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_allocate @ascuheap @acsmem ++@c re_string_construct_common dup ok ++@c re_string_realloc_buffers dup @ascuheap @acsmem ++@c match_ctx_init @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c re_string_byte_at ok ++@c re_string_first_byte dup ok ++@c check_matching @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_cur_idx dup ok ++@c acquire_init_state_context dup @ascuheap @acsmem ++@c re_string_context_at ok ++@c re_string_byte_at dup ok ++@c bitset_contain ok ++@c re_acquire_state_context dup @ascuheap @acsmem ++@c check_subexp_matching_top @ascuheap @acsmem ++@c match_ctx_add_subtop @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c calloc dup @ascuheap @acsmem ++@c transit_state_bkref @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_cur_idx dup ok ++@c re_string_context_at dup ok ++@c NOT_SATISFY_NEXT_CONSTRAINT ok ++@c get_subexp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_get_buffer ok ++@c search_cur_bkref_entry ok ++@c clean_state_log_if_needed @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c extend_buffers @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_realloc_buffers dup @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c build_wcs_upper_buffer dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c build_upper_buffer dup ok (@mtslocale but optimized) ++@c build_wcs_buffer dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_translate_buffer dup ok ++@c get_subexp_sub @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c check_arrival @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c (re_)realloc dup @ascuheap @acsmem ++@c re_string_context_at dup ok ++@c re_node_set_init_1 dup @ascuheap @acsmem ++@c check_arrival_expand_ecl @ascuheap @acsmem ++@c re_node_set_alloc dup @ascuheap @acsmem ++@c find_subexp_node ok ++@c re_node_set_merge dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c check_arrival_expand_ecl_sub @ascuheap @acsmem ++@c re_node_set_contains dup ok ++@c re_node_set_insert dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_node_set_init_copy dup @ascuheap @acsmem ++@c re_node_set_init_empty dup ok ++@c expand_bkref_cache @ascuheap @acsmem ++@c search_cur_bkref_entry dup ok ++@c re_node_set_contains dup ok ++@c re_node_set_init_1 dup @ascuheap @acsmem ++@c check_arrival_expand_ecl dup @ascuheap @acsmem ++@c re_node_set_merge dup @ascuheap @acsmem ++@c re_node_set_init_copy dup @ascuheap @acsmem ++@c re_node_set_insert dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_acquire_state @ascuheap @acsmem ++@c calc_state_hash dup ok ++@c re_node_set_compare dup ok ++@c create_ci_newstate @ascuheap @acsmem ++@c calloc dup @ascuheap @acsmem ++@c re_node_set_init_copy dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c register_state dup @ascuheap @acsmem ++@c free_state dup @ascuheap @acsmem ++@c re_acquire_state_context dup @ascuheap @acsmem ++@c re_node_set_merge dup @ascuheap @acsmem ++@c check_arrival_add_next_nodes @mtslocale @ascuheap @acsmem ++@c re_node_set_init_empty dup ok ++@c check_node_accept_bytes @mtslocale @ascuheap @acsmem ++@c re_string_byte_at dup ok ++@c re_string_char_size_at dup ok ++@c re_string_elem_size_at @mtslocale ++@c _NL_CURRENT_WORD dup ok ++@c _NL_CURRENT dup ok ++@c auto findidx dup ok ++@c _NL_CURRENT_WORD dup ok ++@c _NL_CURRENT dup ok ++@c collseq_table_lookup dup ok ++@c find_collation_sequence_value @mtslocale ++@c _NL_CURRENT_WORD dup ok ++@c _NL_CURRENT dup ok ++@c auto findidx dup ok ++@c wcscoll @mtslocale @ascuheap @acsmem ++@c re_node_set_empty dup ok ++@c re_node_set_merge dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_node_set_insert dup @ascuheap @acsmem ++@c re_acquire_state dup @ascuheap @acsmem ++@c check_node_accept ok ++@c re_string_byte_at dup ok ++@c bitset_contain dup ok ++@c re_string_context_at dup ok ++@c NOT_SATISFY_NEXT_CONSTRAINT dup ok ++@c match_ctx_add_entry @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c clean_state_log_if_needed dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c extend_buffers dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c find_subexp_node dup ok ++@c calloc dup @ascuheap @acsmem ++@c check_arrival dup *** ++@c match_ctx_add_sublast @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c re_acquire_state_context dup @ascuheap @acsmem ++@c re_node_set_init_union @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c re_node_set_init_copy dup @ascuheap @acsmem ++@c re_node_set_init_empty dup ok ++@c re_node_set_free dup @ascuheap @acsmem ++@c check_subexp_matching_top dup @ascuheap @acsmem ++@c check_halt_state_context ok ++@c re_string_context_at dup ok ++@c check_halt_node_context ok ++@c NOT_SATISFY_NEXT_CONSTRAINT dup ok ++@c re_string_eoi dup ok ++@c extend_buffers dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c transit_state @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c transit_state_mb @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_context_at dup ok ++@c NOT_SATISFY_NEXT_CONSTRAINT dup ok ++@c check_node_accept_bytes dup @mtslocale @ascuheap @acsmem ++@c re_string_cur_idx dup ok ++@c clean_state_log_if_needed @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_node_set_init_union dup @ascuheap @acsmem ++@c re_acquire_state_context dup @ascuheap @acsmem ++@c re_string_fetch_byte dup ok ++@c re_string_context_at dup ok ++@c build_trtable @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c group_nodes_into_DFAstates @ascuheap @acsmem ++@c bitset_empty dup ok ++@c bitset_set dup ok ++@c bitset_merge dup ok ++@c bitset_set_all ok ++@c bitset_clear ok ++@c bitset_contain dup ok ++@c bitset_copy ok ++@c re_node_set_init_copy dup @ascuheap @acsmem ++@c re_node_set_insert dup @ascuheap @acsmem ++@c re_node_set_init_1 dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_node_set_alloc dup @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c bitset_empty ok ++@c re_node_set_empty dup ok ++@c re_node_set_merge dup @ascuheap @acsmem ++@c re_acquire_state_context dup @ascuheap @acsmem ++@c bitset_merge ok ++@c calloc dup @ascuheap @acsmem ++@c bitset_contain dup ok ++@c merge_state_with_log @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c re_string_cur_idx dup ok ++@c re_node_set_init_union dup @ascuheap @acsmem ++@c re_string_context_at dup ok ++@c re_node_set_free dup @ascuheap @acsmem ++@c check_subexp_matching_top @ascuheap @acsmem ++@c match_ctx_add_subtop dup @ascuheap @acsmem ++@c transit_state_bkref dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c find_recover_state ++@c re_string_cur_idx dup ok ++@c re_string_skip_bytes dup ok ++@c merge_state_with_log dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c check_halt_state_context dup ok ++@c prune_impossible_nodes @mtslocale @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c sift_ctx_init ok ++@c re_node_set_init_empty dup ok ++@c sift_states_backward @mtslocale @ascuheap @acsmem ++@c re_node_set_init_1 dup @ascuheap @acsmem ++@c update_cur_sifted_state @mtslocale @ascuheap @acsmem ++@c add_epsilon_src_nodes @ascuheap @acsmem ++@c re_acquire_state dup @ascuheap @acsmem ++@c re_node_set_alloc dup @ascuheap @acsmem ++@c re_node_set_merge dup @ascuheap @acsmem ++@c re_node_set_add_intersect @ascuheap @acsmem ++@c (re_)realloc dup @ascuheap @acsmem ++@c check_subexp_limits @ascuheap @acsmem ++@c sub_epsilon_src_nodes @ascuheap @acsmem ++@c re_node_set_init_empty dup ok ++@c re_node_set_contains dup ok ++@c re_node_set_add_intersect dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_node_set_remove_at dup ok ++@c re_node_set_contains dup ok ++@c re_acquire_state dup @ascuheap @acsmem ++@c sift_states_bkref @mtslocale @ascuheap @acsmem ++@c search_cur_bkref_entry dup ok ++@c check_dst_limits ok ++@c search_cur_bkref_entry dup ok ++@c check_dst_limits_calc_pos ok ++@c check_dst_limits_calc_pos_1 ok ++@c re_node_set_init_copy dup @ascuheap @acsmem ++@c re_node_set_insert dup @ascuheap @acsmem ++@c sift_states_backward dup @mtslocale @ascuheap @acsmem ++@c merge_state_array dup @ascuheap @acsmem ++@c re_node_set_remove ok ++@c re_node_set_contains dup ok ++@c re_node_set_remove_at dup ok ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c re_node_set_empty dup ok ++@c build_sifted_states @mtslocale @ascuheap @acsmem ++@c sift_states_iter_mb @mtslocale @ascuheap @acsmem ++@c check_node_accept_bytes dup @mtslocale @ascuheap @acsmem ++@c check_node_accept dup ok ++@c check_dst_limits dup ok ++@c re_node_set_insert dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c check_halt_state_context dup ok ++@c merge_state_array @ascuheap @acsmem ++@c re_node_set_init_union dup @ascuheap @acsmem ++@c re_acquire_state dup @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c set_regs @ascuheap @acsmem ++@c (re_)malloc dup @ascuheap @acsmem ++@c re_node_set_init_empty dup ok ++@c free_fail_stack_return @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c update_regs ok ++@c re_node_set_free dup @ascuheap @acsmem ++@c pop_fail_stack @ascuheap @acsmem ++@c re_node_set_free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c match_ctx_free @ascuheap @acsmem ++@c match_ctx_clean @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c (re_)free dup @ascuheap @acsmem ++@c re_string_destruct dup @ascuheap @acsmem ++@c libc_lock_unlock @aculock + This function tries to match the compiled regular expression + @code{*@var{compiled}} against @var{string}. + +@@ -1033,6 +1624,9 @@ + @comment regex.h + @comment POSIX.2 + @deftypefun void regfree (regex_t *@var{compiled}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c (re_)free dup @ascuheap @acsmem ++@c free_dfa_content dup @ascuheap @acsmem + Calling @code{regfree} frees all the storage that @code{*@var{compiled}} + points to. This includes various internal fields of the @code{regex_t} + structure that aren't documented in this manual. +@@ -1050,6 +1644,8 @@ + @comment regex.h + @comment POSIX.2 + @deftypefun size_t regerror (int @var{errcode}, const regex_t *restrict @var{compiled}, char *restrict @var{buffer}, size_t @var{length}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c regerror calls gettext, strcmp and mempcpy or memcpy. + This function produces an error message string for the error code + @var{errcode}, and stores the string in @var{length} bytes of memory + starting at @var{buffer}. For the @var{compiled} argument, supply the +@@ -1215,6 +1811,145 @@ + @comment wordexp.h + @comment POSIX.2 + @deftypefun int wordexp (const char *@var{words}, wordexp_t *@var{word-vector-ptr}, int @var{flags}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtasuconst{:@mtsenv{}} @mtsenv{} @mtascusig{:ALRM} @mtascutimer{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuintl{} @ascuheap{} @asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c wordexp @mtasurace:utent @mtasuconst:@mtsenv @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuintl @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsfd @acsmem ++@c w_newword ok ++@c wordfree dup @asucorrupt @ascuheap @acucorrupt @acsmem ++@c calloc dup @ascuheap @acsmem ++@c getenv dup @mtsenv ++@c strcpy dup ok ++@c parse_backslash @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c parse_dollars @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c parse_arith @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c w_newword dup ok ++@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c parse_backtick dup @ascuplugin @ascuheap @aculock @acsfd @acsmem ++@c parse_qtd_backslash dup @ascuheap @acsmem ++@c eval_expr @mtslocale ++@c eval_expr_multidiv @mtslocale ++@c eval_expr_val @mtslocale ++@c isspace dup @mtslocale ++@c eval_expr dup @mtslocale ++@c isspace dup @mtslocale ++@c isspace dup @mtslocale ++@c free dup @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c w_addstr dup @ascuheap @acsmem ++@c itoa_word dup ok ++@c parse_comm @ascuplugin @ascuheap @aculock @acsfd @acsmem ++@c w_newword dup ok ++@c pthread_setcancelstate @ascuplugin @ascuheap @acsmem ++@c (disable cancellation around exec_comm; it may do_cancel the ++@c second time, if async cancel is enabled) ++@c THREAD_ATOMIC_CMPXCHG_VAL dup ok ++@c CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS dup ok ++@c do_cancel @ascuplugin @ascuheap @acsmem ++@c THREAD_ATOMIC_BIT_SET dup ok ++@c pthread_unwind @ascuplugin @ascuheap @acsmem ++@c Unwind_ForcedUnwind if available @ascuplugin @ascuheap @acsmem ++@c libc_unwind_longjmp otherwise ++@c cleanups ++@c exec_comm @ascuplugin @ascuheap @aculock @acsfd @acsmem ++@c pipe2 dup ok ++@c pipe dup ok ++@c fork dup @ascuplugin @aculock ++@c close dup @acsfd ++@c on child: exec_comm_child -> exec or abort ++@c waitpid dup ok ++@c read dup ok ++@c w_addmem dup @ascuheap @acsmem ++@c strchr dup ok ++@c w_addword dup @ascuheap @acsmem ++@c w_newword dup ok ++@c w_addchar dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c kill dup ok ++@c free dup @ascuheap @acsmem ++@c parse_param @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c reads from __libc_argc and __libc_argv without guards ++@c w_newword dup ok ++@c isalpha dup @mtslocale^^ ++@c w_addchar dup @ascuheap @acsmem ++@c isalnum dup @mtslocale^^ ++@c isdigit dup @mtslocale^^ ++@c strchr dup ok ++@c itoa_word dup ok ++@c atoi dup @mtslocale ++@c getpid dup ok ++@c w_addstr dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c stpcpy dup ok ++@c w_addword dup @ascuheap @acsmem ++@c strdup dup @ascuheap @acsmem ++@c getenv dup @mtsenv ++@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c parse_tilde dup @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c fnmatch dup @mtsenv @mtslocale @ascuheap @acsmem ++@c mempcpy dup ok ++@c _ dup @ascuintl ++@c fxprintf dup @aculock ++@c setenv dup @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c strspn dup ok ++@c strcspn dup ok ++@c parse_backtick @ascuplugin @ascuheap @aculock @acsfd @acsmem ++@c w_newword dup ok ++@c exec_comm dup @ascuplugin @ascuheap @aculock @acsfd @acsmem ++@c free dup @ascuheap @acsmem ++@c parse_qtd_backslash dup @ascuheap @acsmem ++@c parse_backslash dup @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c parse_dquote @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c parse_backtick dup @ascuplugin @ascuheap @aculock @acsfd @acsmem ++@c parse_qtd_backslash dup @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c w_addword dup @ascuheap @acsmem ++@c strdup dup @ascuheap @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c parse_squote dup @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c parse_tilde @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c strchr dup ok ++@c w_addchar dup @ascuheap @acsmem ++@c getenv dup @mtsenv ++@c w_addstr dup @ascuheap @acsmem ++@c strlen dup ok ++@c w_addmem dup @ascuheap @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c mempcpy dup ok ++@c getuid dup ok ++@c getpwuid_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getpwnam_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c parse_glob @mtasurace:utent @mtasuconst:@mtsenv @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c strchr dup ok ++@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c parse_qtd_backslash @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c parse_backslash dup @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c w_addword dup @ascuheap @acsmem ++@c w_newword dup ok ++@c do_parse_glob @mtasurace:utent @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @aculock @acsfd @acsmem ++@c glob dup @mtasurace:utent @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @aculock @acsfd @acsmem [auto glob_t avoids @asucorrupt @acucorrupt] ++@c w_addstr dup @ascuheap @acsmem ++@c w_addchar dup @ascuheap @acsmem ++@c globfree dup @ascuheap @acsmem [auto glob_t avoids @asucorrupt @acucorrupt] ++@c free dup @ascuheap @acsmem ++@c w_newword dup ok ++@c strdup dup @ascuheap @acsmem ++@c w_addword dup @ascuheap @acsmem ++@c wordfree dup @asucorrupt @ascuheap @acucorrupt @acsmem ++@c strchr dup ok ++@c w_addchar dup @ascuheap @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem + Perform word expansion on the string @var{words}, putting the result in + a newly allocated vector, and store the size and address of this vector + into @code{*@var{word-vector-ptr}}. The argument @var{flags} is a +@@ -1278,6 +2013,9 @@ + @comment wordexp.h + @comment POSIX.2 + @deftypefun void wordfree (wordexp_t *@var{word-vector-ptr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c wordfree dup @asucorrupt @ascuheap @acucorrupt @acsmem ++@c free dup @ascuheap @acsmem + Free the storage used for the word-strings and vector that + @code{*@var{word-vector-ptr}} points to. This does not free the + structure @code{*@var{word-vector-ptr}} itself---only the other +diff -urN glibc-2.17-c758a686/manual/pipe.texi glibc-2.17-c758a686/manual/pipe.texi +--- glibc-2.17-c758a686/manual/pipe.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/pipe.texi 2014-09-12 16:10:06.048792709 -0400 +@@ -56,6 +56,8 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int pipe (int @var{filedes}@t{[2]}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} ++@c On Linux, syscall pipe2. On HURD, call socketpair. + The @code{pipe} function creates a pipe and puts the file descriptors + for the reading and writing ends of the pipe (respectively) into + @code{@var{filedes}[0]} and @code{@var{filedes}[1]}. +@@ -108,6 +110,41 @@ + @comment stdio.h + @comment POSIX.2, SVID, BSD + @deftypefun {FILE *} popen (const char *@var{command}, const char *@var{mode}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c popen @ascuheap @asucorrupt @acucorrupt @aculock @acsfd @acsmem ++@c malloc dup @ascuheap @acsmem ++@c _IO_init ok ++@c _IO_no_init ok ++@c _IO_old_init ok ++@c _IO_lock_init ok ++@c _IO_new_file_init @asucorrupt @acucorrupt @aculock @acsfd ++@c _IO_link_in @asucorrupt @acucorrupt @aculock @acsfd ++@c the linked list is guarded by a recursive lock; ++@c it may get corrupted with async signals and cancellation ++@c _IO_lock_lock dup @aculock ++@c _IO_flockfile dup @aculock ++@c _IO_funlockfile dup @aculock ++@c _IO_lock_unlock dup @aculock ++@c _IO_new_proc_open @asucorrupt @acucorrupt @aculock @acsfd ++@c the linked list is guarded by a recursive lock; ++ @c it may get corrupted with async signals and cancellation ++@c _IO_file_is_open ok ++@c pipe2 dup @acsfd ++@c pipe dup @acsfd ++@c _IO_fork=fork @aculock ++@c _IO_close=close_not_cancel dup @acsfd ++@c fcntl dup ok ++@c _IO_lock_lock @aculock ++@c _IO_lock_unlock @aculock ++@c _IO_mask_flags ok [no @mtasurace:stream, nearly but sufficiently exclusive access] ++@c _IO_un_link @asucorrupt @acucorrupt @aculock @acsfd ++@c the linked list is guarded by a recursive lock; ++@c it may get corrupted with async signals and cancellation ++@c _IO_lock_lock dup @aculock ++@c _IO_flockfile dup @aculock ++@c _IO_funlockfile dup @aculock ++@c _IO_lock_unlock dup @aculock ++@c free dup @ascuheap @acsmem + The @code{popen} function is closely related to the @code{system} + function; see @ref{Running a Command}. It executes the shell command + @var{command} as a subprocess. However, instead of waiting for the +@@ -131,6 +168,77 @@ + @comment stdio.h + @comment POSIX.2, SVID, BSD + @deftypefun int pclose (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @ascuplugin{} @asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c Although the stream cannot be used after the call, even in case of ++@c async cancellation, because the stream must not be used after pclose ++@c is called, other stdio linked lists and their locks may be left in ++@c corrupt states; that's where the corrupt and lock annotations come ++@c from. ++@c ++@c pclose @ascuheap @ascuplugin @asucorrupt @asulock @acucorrupt @aculock @acsfd @acsmem ++@c _IO_new_fclose @ascuheap @ascuplugin @asucorrupt @asulock @acucorrupt @aculock @acsfd @acsmem ++@c _IO_un_link dup @asucorrupt @acucorrupt @aculock @acsfd ++@c _IO_acquire_lock dup @aculock ++@c _IO_flockfile dup @aculock ++@c _IO_file_close_it @ascuheap @ascuplugin @asucorrupt @aculock @acucorrupt @acsfd @acsmem ++@c _IO_file_is_open dup ok ++@c _IO_do_flush @asucorrupt @ascuplugin @acucorrupt ++@c _IO_do_write @asucorrupt @acucorrupt ++@c new_do_write @asucorrupt @acucorrupt ++@c _IO_SYSSEEK ok ++@c lseek64 dup ok ++@c _IO_SYSWRITE ok ++@c write_not_cancel dup ok ++@c write dup ok ++@c _IO_adjust_column ok ++@c _IO_setg dup @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_wdo_write @asucorrupt @ascuplugin @acucorrupt ++@c _IO_new_do_write=_IO_do_write dup @asucorrupt @acucorrupt ++@c *cc->__codecvt_do_out @ascuplugin ++@c _IO_wsetg dup @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_unsave_markers @ascuheap @asucorrupt @acucorrupt @acsmem ++@c _IO_have_backup dup ok ++@c _IO_free_backup_area dup @ascuheap @asucorrupt @acucorrupt @acsmem ++@c _IO_SYSCLOSE @aculock @acucorrupt @acsfd ++@c _IO_lock_lock dup @aculock ++@c _IO_close=close_not_cancel dup @acsfd ++@c _IO_lock_unlock dup @aculock ++@c _IO_waitpid=waitpid_not_cancel dup ok ++@c _IO_have_wbackup ok ++@c _IO_free_wbackup_area @ascuheap @asucorrupt @acucorrupt @acsmem ++@c _IO_in_backup dup ok ++@c _IO_switch_to_main_wget_area @asucorrupt @acucorrupt ++@c free dup @ascuheap @acsmem ++@c _IO_wsetb @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_wsetg @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_wsetp @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_setb @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_setg @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_setp @asucorrupt @acucorrupt [no @mtasurace:stream, locked] ++@c _IO_un_link dup @asucorrupt @acucorrupt @aculock @acsfd ++@c _IO_release_lock dup @aculock ++@c _IO_funlockfile dup @aculock ++@c _IO_FINISH @ascuheap @ascuplugin @asucorrupt @acucorrupt @aculock @acsfd @acsmem ++@c _IO_new_file_finish @ascuheap @ascuplugin @asucorrupt @acucorrupt @aculock @acsfd @acsmem ++@c _IO_file_is_open dup ok ++@c _IO_do_flush dup @ascuplugin @asucorrupt @acucorrupt ++@c _IO_SYSCLOSE dup @aculock @acucorrupt @acsfd ++@c _IO_default_finish @ascuheap @asucorrupt @acucorrupt @aculock @acsfd @acsmem ++@c FREE_BUF @acsmem ++@c munmap dup @acsmem ++@c free dup @ascuheap @acsmem ++@c _IO_un_link dup @asucorrupt @acucorrupt @aculock @acsfd ++@c _IO_lock_fini ok ++@c libc_lock_fini_recursive ok ++@c libc_lock_lock dup @asulock @aculock ++@c gconv_release_step ok ++@c libc_lock_unlock dup @asulock @aculock ++@c _IO_have_backup ok ++@c _IO_free_backup_area @ascuheap @asucorrupt @acucorrupt @acsmem ++@c _IO_in_backup ok ++@c _IO_switch_to_main_get_area @asucorrupt @acucorrupt ++@c free dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem + The @code{pclose} function is used to close a stream created by @code{popen}. + It waits for the child process to terminate and returns its status value, + as for the @code{system} function. +@@ -168,6 +276,8 @@ + @comment sys/stat.h + @comment POSIX.1 + @deftypefun int mkfifo (const char *@var{filename}, mode_t @var{mode}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On generic Posix, calls xmknod. + The @code{mkfifo} function makes a FIFO special file with name + @var{filename}. The @var{mode} argument is used to set the file's + permissions; see @ref{Setting Permissions}. +diff -urN glibc-2.17-c758a686/manual/platform.texi glibc-2.17-c758a686/manual/platform.texi +--- glibc-2.17-c758a686/manual/platform.texi 2014-09-12 16:08:17.865070640 -0400 ++++ glibc-2.17-c758a686/manual/platform.texi 2014-09-12 16:10:06.046792714 -0400 +@@ -15,6 +15,7 @@ + operating system are declared in @file{sys/platform/ppc.h}. + + @deftypefun {uint64_t} __ppc_get_timebase (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Read the current value of the Time Base Register. + + The @dfn{Time Base Register} is a 64-bit register that stores a monotonically +@@ -28,6 +29,17 @@ + @end deftypefun + + @deftypefun {uint64_t} __ppc_get_timebase_freq (void) ++@safety{@prelim{}@mtunsafe{@mtuinit{}}@asunsafe{@asucorrupt{:init}}@acunsafe{@acucorrupt{:init}}} ++@c __ppc_get_timebase_freq=__get_timebase_freq @mtuinit @acsfd ++@c __get_clockfreq @mtuinit @asucorrupt:init @acucorrupt:init @acsfd ++@c the initialization of the static timebase_freq is not exactly ++@c safe, because hp_timing_t cannot be atomically set up. ++@c syscall:get_tbfreq ok ++@c open dup @acsfd ++@c read dup ok ++@c memcpy dup ok ++@c memmem dup ok ++@c close dup @acsfd + Read the current frequency at which the Time Base Register is updated. + + This frequency is not related to the processor clock or the bus clock. +@@ -42,17 +54,20 @@ + Section 3.2}. + + @deftypefun {void} __ppc_yield (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Provide a hint that performance will probably be improved if shared resources + dedicated to the executing processor are released for use by other processors. + @end deftypefun + + @deftypefun {void} __ppc_mdoio (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Provide a hint that performance will probably be improved if shared resources + dedicated to the executing processor are released until all outstanding storage + accesses to caching-inhibited storage have been completed. + @end deftypefun + + @deftypefun {void} __ppc_mdoom (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Provide a hint that performance will probably be improved if shared resources + dedicated to the executing processor are released until all outstanding storage + accesses to cacheable storage for which the data is not in the cache have been +@@ -60,6 +75,7 @@ + @end deftypefun + + @deftypefun {void} __ppc_set_ppr_med (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Set the Program Priority Register to medium value (default). + + The @dfn{Program Priority Register} (PPR) is a 64-bit register that controls +@@ -73,9 +89,11 @@ + @end deftypefun + + @deftypefun {void} __ppc_set_ppr_low (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Set the Program Priority Register to low value. + @end deftypefun + + @deftypefun {void} __ppc_set_ppr_med_low (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Set the Program Priority Register to medium low value. + @end deftypefun +diff -urN glibc-2.17-c758a686/manual/process.texi glibc-2.17-c758a686/manual/process.texi +--- glibc-2.17-c758a686/manual/process.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/process.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -1,4 +1,4 @@ +-@node Processes, Job Control, Program Basics, Top ++@node Processes, Inter-Process Communication, Program Basics, Top + @c %MENU% How to create processes and run other programs + @chapter Processes + +@@ -55,6 +55,43 @@ + @comment ISO + @deftypefun int system (const char *@var{command}) + @pindex sh ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}} ++@c system @ascuplugin @ascuheap @asulock @aculock @acsmem ++@c do_system @ascuplugin @ascuheap @asulock @aculock @acsmem ++@c sigemptyset dup ok ++@c libc_lock_lock @asulock @aculock ++@c ADD_REF ok ++@c sigaction dup ok ++@c SUB_REF ok ++@c libc_lock_unlock @aculock ++@c sigaddset dup ok ++@c sigprocmask dup ok ++@c CLEANUP_HANDLER @ascuplugin @ascuheap @acsmem ++@c libc_cleanup_region_start @ascuplugin @ascuheap @acsmem ++@c pthread_cleanup_push_defer @ascuplugin @ascuheap @acsmem ++@c CANCELLATION_P @ascuplugin @ascuheap @acsmem ++@c CANCEL_ENABLED_AND_CANCELED ok ++@c do_cancel @ascuplugin @ascuheap @acsmem ++@c cancel_handler ok ++@c kill syscall ok ++@c waitpid dup ok ++@c libc_lock_lock ok ++@c sigaction dup ok ++@c libc_lock_unlock ok ++@c FORK ok ++@c clone syscall ok ++@c waitpid dup ok ++@c CLEANUP_RESET ok ++@c libc_cleanup_region_end ok ++@c pthread_cleanup_pop_restore ok ++@c SINGLE_THREAD_P ok ++@c LIBC_CANCEL_ASYNC @ascuplugin @ascuheap @acsmem ++@c libc_enable_asynccancel @ascuplugin @ascuheap @acsmem ++@c CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS dup ok ++@c do_cancel dup @ascuplugin @ascuheap @acsmem ++@c LIBC_CANCEL_RESET ok ++@c libc_disable_asynccancel ok ++@c lll_futex_wait dup ok + This function executes @var{command} as a shell command. In @theglibc{}, + it always uses the default shell @code{sh} to run the command. + In particular, it searches the directories in @code{PATH} to find +@@ -157,12 +194,14 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun pid_t getpid (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getpid} function returns the process ID of the current process. + @end deftypefun + + @comment unistd.h + @comment POSIX.1 + @deftypefun pid_t getppid (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getppid} function returns the process ID of the parent of the + current process. + @end deftypefun +@@ -177,6 +216,19 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun pid_t fork (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{}}@acunsafe{@aculock{}}} ++@c The nptl/.../linux implementation safely collects fork_handlers into ++@c an alloca()ed linked list and increments ref counters; it uses atomic ++@c ops and retries, avoiding locking altogether. It then takes the ++@c IO_list lock, resets the thread-local pid, and runs fork. The parent ++@c restores the thread-local pid, releases the lock, and runs parent ++@c handlers, decrementing the ref count and signaling futex wait if ++@c requested by unregister_atfork. The child bumps the fork generation, ++@c sets the thread-local pid, resets cpu clocks, initializes the robust ++@c mutex list, the stream locks, the IO_list lock, the dynamic loader ++@c lock, runs the child handlers, reseting ref counters to 1, and ++@c initializes the fork lock. These are all safe, unless atfork ++@c handlers themselves are unsafe. + The @code{fork} function creates a new process. + + If the operation is successful, there are then both parent and child +@@ -242,6 +294,9 @@ + @comment unistd.h + @comment BSD + @deftypefun pid_t vfork (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{}}@acunsafe{@aculock{}}} ++@c The vfork implementation proper is a safe syscall, but it may fall ++@c back to fork if the vfork syscall is not available. + The @code{vfork} function is similar to @code{fork} but on some systems + it is more efficient; however, there are restrictions you must follow to + use it safely. +@@ -287,6 +342,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int execv (const char *@var{filename}, char *const @var{argv}@t{[]}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{execv} function executes the file named by @var{filename} as a + new process image. + +@@ -305,6 +361,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int execl (const char *@var{filename}, const char *@var{arg0}, @dots{}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is similar to @code{execv}, but the @var{argv} strings are + specified individually instead of as an array. A null pointer must be + passed as the last such argument. +@@ -313,6 +370,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int execve (const char *@var{filename}, char *const @var{argv}@t{[]}, char *const @var{env}@t{[]}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is similar to @code{execv}, but permits you to specify the environment + for the new program explicitly as the @var{env} argument. This should + be an array of strings in the same format as for the @code{environ} +@@ -322,6 +380,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int execle (const char *@var{filename}, const char *@var{arg0}, @dots{}, char *const @var{env}@t{[]}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is similar to @code{execl}, but permits you to specify the + environment for the new program explicitly. The environment argument is + passed following the null pointer that marks the last @var{argv} +@@ -332,6 +391,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int execvp (const char *@var{filename}, char *const @var{argv}@t{[]}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{execvp} function is similar to @code{execv}, except that it + searches the directories listed in the @code{PATH} environment variable + (@pxref{Standard Environment}) to find the full file name of a +@@ -345,6 +405,7 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int execlp (const char *@var{filename}, const char *@var{arg0}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This function is like @code{execl}, except that it performs the same + file name searching as the @code{execvp} function. + @end deftypefun +@@ -462,6 +523,7 @@ + @comment sys/wait.h + @comment POSIX.1 + @deftypefun pid_t waitpid (pid_t @var{pid}, int *@var{status-ptr}, int @var{options}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{waitpid} function is used to request status information from a + child process whose process ID is @var{pid}. Normally, the calling + process is suspended until the child process makes status information +@@ -565,6 +627,7 @@ + @comment sys/wait.h + @comment POSIX.1 + @deftypefun pid_t wait (int *@var{status-ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is a simplified version of @code{waitpid}, and is used to wait + until any one child process terminates. The call: + +@@ -591,6 +654,7 @@ + @comment sys/wait.h + @comment BSD + @deftypefun pid_t wait4 (pid_t @var{pid}, int *@var{status-ptr}, int @var{options}, struct rusage *@var{usage}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If @var{usage} is a null pointer, @code{wait4} is equivalent to + @code{waitpid (@var{pid}, @var{status-ptr}, @var{options})}. + +@@ -643,6 +707,7 @@ + @comment sys/wait.h + @comment POSIX.1 + @deftypefn Macro int WIFEXITED (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns a nonzero value if the child process terminated + normally with @code{exit} or @code{_exit}. + @end deftypefn +@@ -650,6 +715,7 @@ + @comment sys/wait.h + @comment POSIX.1 + @deftypefn Macro int WEXITSTATUS (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If @code{WIFEXITED} is true of @var{status}, this macro returns the + low-order 8 bits of the exit status value from the child process. + @xref{Exit Status}. +@@ -658,6 +724,7 @@ + @comment sys/wait.h + @comment POSIX.1 + @deftypefn Macro int WIFSIGNALED (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns a nonzero value if the child process terminated + because it received a signal that was not handled. + @xref{Signal Handling}. +@@ -666,6 +733,7 @@ + @comment sys/wait.h + @comment POSIX.1 + @deftypefn Macro int WTERMSIG (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If @code{WIFSIGNALED} is true of @var{status}, this macro returns the + signal number of the signal that terminated the child process. + @end deftypefn +@@ -673,6 +741,7 @@ + @comment sys/wait.h + @comment BSD + @deftypefn Macro int WCOREDUMP (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns a nonzero value if the child process terminated + and produced a core dump. + @end deftypefn +@@ -680,12 +749,14 @@ + @comment sys/wait.h + @comment POSIX.1 + @deftypefn Macro int WIFSTOPPED (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro returns a nonzero value if the child process is stopped. + @end deftypefn + + @comment sys/wait.h + @comment POSIX.1 + @deftypefn Macro int WSTOPSIG (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If @code{WIFSTOPPED} is true of @var{status}, this macro returns the + signal number of the signal that caused the child process to stop. + @end deftypefn +@@ -739,6 +810,7 @@ + @comment sys/wait.h + @comment BSD + @deftypefun pid_t wait3 (union wait *@var{status-ptr}, int @var{options}, struct rusage *@var{usage}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + If @var{usage} is a null pointer, @code{wait3} is equivalent to + @code{waitpid (-1, @var{status-ptr}, @var{options})}. + +diff -urN glibc-2.17-c758a686/manual/resource.texi glibc-2.17-c758a686/manual/resource.texi +--- glibc-2.17-c758a686/manual/resource.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/resource.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -25,6 +25,8 @@ + @comment sys/resource.h + @comment BSD + @deftypefun int getrusage (int @var{processes}, struct rusage *@var{rusage}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On HURD, this calls task_info 3 times. On UNIX, it's a syscall. + This function reports resource usage totals for processes specified by + @var{processes}, storing the information in @code{*@var{rusage}}. + +@@ -129,9 +131,11 @@ + @code{vtimes} and its @code{vtimes} data structure are declared in + @file{sys/vtimes.h}. + @pindex sys/vtimes.h +-@comment vtimes.h + +-@deftypefun int vtimes (struct vtimes @var{current}, struct vtimes @var{child}) ++@comment sys/vtimes.h ++@deftypefun int vtimes (struct vtimes *@var{current}, struct vtimes *@var{child}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Calls getrusage twice. + + @code{vtimes} reports resource usage totals for a process. + +@@ -223,6 +227,8 @@ + @comment sys/resource.h + @comment BSD + @deftypefun int getrlimit (int @var{resource}, struct rlimit *@var{rlp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on most systems. + Read the current and maximum limits for the resource @var{resource} + and store them in @code{*@var{rlp}}. + +@@ -237,6 +243,8 @@ + @comment sys/resource.h + @comment Unix98 + @deftypefun int getrlimit64 (int @var{resource}, struct rlimit64 *@var{rlp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on most systems, wrapper to getrlimit otherwise. + This function is similar to @code{getrlimit} but its second parameter is + a pointer to a variable of type @code{struct rlimit64}, which allows it + to read values which wouldn't fit in the member of a @code{struct +@@ -250,6 +258,8 @@ + @comment sys/resource.h + @comment BSD + @deftypefun int setrlimit (int @var{resource}, const struct rlimit *@var{rlp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on most systems; lock-taking critical section on HURD. + Store the current and maximum limits for the resource @var{resource} + in @code{*@var{rlp}}. + +@@ -275,6 +285,8 @@ + @comment sys/resource.h + @comment Unix98 + @deftypefun int setrlimit64 (int @var{resource}, const struct rlimit64 *@var{rlp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Wrapper for setrlimit or direct syscall. + This function is similar to @code{setrlimit} but its second parameter is + a pointer to a variable of type @code{struct rlimit64} which allows it + to set values which wouldn't fit in the member of a @code{struct +@@ -419,7 +431,7 @@ + + @comment sys/resource.h + @comment BSD +-@deftypevr Constant int RLIM_INFINITY ++@deftypevr Constant rlim_t RLIM_INFINITY + This constant stands for a value of ``infinity'' when supplied as + the limit value in @code{setrlimit}. + @end deftypevr +@@ -433,7 +445,10 @@ + + @comment ulimit.h + @comment BSD +-@deftypefun int ulimit (int @var{cmd}, @dots{}) ++@deftypefun {long int} ulimit (int @var{cmd}, @dots{}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Wrapper for getrlimit, setrlimit or ++@c sysconf(_SC_OPEN_MAX)->getdtablesize->getrlimit. + + @code{ulimit} gets the current limit or sets the current and maximum + limit for a particular resource for the calling process according to the +@@ -480,6 +495,10 @@ + @comment sys/vlimit.h + @comment BSD + @deftypefun int vlimit (int @var{resource}, int @var{limit}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:setrlimit}}@asunsafe{}@acsafe{}} ++@c It calls getrlimit and modifies the rlim_cur field before calling ++@c setrlimit. There's a window for a concurrent call to setrlimit that ++@c modifies e.g. rlim_max, which will be lost if running as super-user. + + @code{vlimit} sets the current limit for a resource for a process. + +@@ -778,6 +797,8 @@ + @comment sched.h + @comment POSIX + @deftypefun int sched_setscheduler (pid_t @var{pid}, int @var{policy}, const struct sched_param *@var{param}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + This function sets both the absolute priority and the scheduling policy + for a process. +@@ -848,6 +869,8 @@ + @comment sched.h + @comment POSIX + @deftypefun int sched_getscheduler (pid_t @var{pid}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + This function returns the scheduling policy assigned to the process with + Process ID (pid) @var{pid}, or the calling process if @var{pid} is zero. +@@ -881,6 +904,8 @@ + @comment sched.h + @comment POSIX + @deftypefun int sched_setparam (pid_t @var{pid}, const struct sched_param *@var{param}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + This function sets a process' absolute priority. + +@@ -893,7 +918,9 @@ + + @comment sched.h + @comment POSIX +-@deftypefun int sched_getparam (pid_t @var{pid}, const struct sched_param *@var{param}) ++@deftypefun int sched_getparam (pid_t @var{pid}, struct sched_param *@var{param}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + This function returns a process' absolute priority. + +@@ -922,7 +949,9 @@ + + @comment sched.h + @comment POSIX +-@deftypefun int sched_get_priority_min (int *@var{policy}) ++@deftypefun int sched_get_priority_min (int @var{policy}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + This function returns the lowest absolute priority value that is + allowable for a process with scheduling policy @var{policy}. +@@ -942,7 +971,9 @@ + + @comment sched.h + @comment POSIX +-@deftypefun int sched_get_priority_max (int *@var{policy}) ++@deftypefun int sched_get_priority_max (int @var{policy}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + This function returns the highest absolute priority value that is + allowable for a process that with scheduling policy @var{policy}. +@@ -963,6 +994,8 @@ + @comment sched.h + @comment POSIX + @deftypefun int sched_rr_get_interval (pid_t @var{pid}, struct timespec *@var{interval}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + This function returns the length of the quantum (time slice) used with + the Round Robin scheduling policy, if it is used, for the process with +@@ -987,6 +1020,8 @@ + @comment sched.h + @comment POSIX + @deftypefun int sched_yield (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on Linux; alias to swtch on HURD. + + This function voluntarily gives up the process' claim on the CPU. + +@@ -1045,7 +1080,7 @@ + about. + + But just to be clear about the scope of this scheduling: Any time a +-process with a absolute priority of 0 and a process with an absolute ++process with an absolute priority of 0 and a process with an absolute + priority higher than 0 are ready to run at the same time, the one with + absolute priority 0 does not run. If it's already running when the + higher priority ready-to-run process comes into existence, it stops +@@ -1138,6 +1173,8 @@ + @comment sys/resource.h + @comment BSD,POSIX + @deftypefun int getpriority (int @var{class}, int @var{id}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on UNIX. On HURD, calls _hurd_priority_which_map. + Return the nice value of a set of processes; @var{class} and @var{id} + specify which ones (see below). If the processes specified do not all + have the same nice value, this returns the lowest value that any of them +@@ -1165,6 +1202,8 @@ + @comment sys/resource.h + @comment BSD,POSIX + @deftypefun int setpriority (int @var{class}, int @var{id}, int @var{niceval}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on UNIX. On HURD, calls _hurd_priority_which_map. + Set the nice value of a set of processes to @var{niceval}; @var{class} + and @var{id} specify which ones (see below). + +@@ -1222,6 +1261,11 @@ + @comment unistd.h + @comment BSD + @deftypefun int nice (int @var{increment}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:setpriority}}@asunsafe{}@acsafe{}} ++@c Calls getpriority before and after setpriority, using the result of ++@c the first call to compute the argument for setpriority. This creates ++@c a window for a concurrent setpriority (or nice) call to be lost or ++@c exhibit surprising behavior. + Increment the nice value of the calling process by @var{increment}. + The return value is the new nice value on success, and @code{-1} on + failure. In the case of failure, @code{errno} will be set to the +@@ -1319,6 +1363,10 @@ + @comment sched.h + @comment GNU + @deftypefn Macro void CPU_ZERO (cpu_set_t *@var{set}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c CPU_ZERO ok ++@c __CPU_ZERO_S ok ++@c memset dup ok + This macro initializes the CPU set @var{set} to be the empty set. + + This macro is a GNU extension and is defined in @file{sched.h}. +@@ -1327,6 +1375,11 @@ + @comment sched.h + @comment GNU + @deftypefn Macro void CPU_SET (int @var{cpu}, cpu_set_t *@var{set}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c CPU_SET ok ++@c __CPU_SET_S ok ++@c __CPUELT ok ++@c __CPUMASK ok + This macro adds @var{cpu} to the CPU set @var{set}. + + The @var{cpu} parameter must not have side effects since it is +@@ -1338,6 +1391,11 @@ + @comment sched.h + @comment GNU + @deftypefn Macro void CPU_CLR (int @var{cpu}, cpu_set_t *@var{set}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c CPU_CLR ok ++@c __CPU_CLR_S ok ++@c __CPUELT dup ok ++@c __CPUMASK dup ok + This macro removes @var{cpu} from the CPU set @var{set}. + + The @var{cpu} parameter must not have side effects since it is +@@ -1349,6 +1407,11 @@ + @comment sched.h + @comment GNU + @deftypefn Macro int CPU_ISSET (int @var{cpu}, const cpu_set_t *@var{set}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c CPU_ISSET ok ++@c __CPU_ISSET_S ok ++@c __CPUELT dup ok ++@c __CPUMASK dup ok + This macro returns a nonzero value (true) if @var{cpu} is a member + of the CPU set @var{set}, and zero (false) otherwise. + +@@ -1365,6 +1428,9 @@ + @comment sched.h + @comment GNU + @deftypefun int sched_getaffinity (pid_t @var{pid}, size_t @var{cpusetsize}, cpu_set_t *@var{cpuset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Wrapped syscall to zero out past the kernel cpu set size; Linux ++@c only. + + This functions stores the CPU affinity mask for the process or thread + with the ID @var{pid} in the @var{cpusetsize} bytes long bitmap +@@ -1393,6 +1459,9 @@ + @comment sched.h + @comment GNU + @deftypefun int sched_setaffinity (pid_t @var{pid}, size_t @var{cpusetsize}, const cpu_set_t *@var{cpuset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Wrapped syscall to detect attempts to set bits past the kernel cpu ++@c set size; Linux only. + + This function installs the @var{cpusetsize} bytes long affinity mask + pointed to by @var{cpuset} for the process or thread with the ID @var{pid}. +@@ -1516,6 +1585,9 @@ + @comment unistd.h + @comment BSD + @deftypefun int getpagesize (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Obtained from the aux vec at program startup time. GNU/Linux/m68k is ++@c the exception, with the possibility of a syscall. + The @code{getpagesize} function returns the page size of the process. + This value is fixed for the runtime of the process but can vary in + different runs of the application. +@@ -1559,6 +1631,8 @@ + @comment sys/sysinfo.h + @comment GNU + @deftypefun {long int} get_phys_pages (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c This fopens a /proc file and scans it for the requested information. + The @code{get_phys_pages} function returns the total number of pages of + physical the system has. To get the amount of memory this number has to + be multiplied by the page size. +@@ -1569,7 +1643,8 @@ + @comment sys/sysinfo.h + @comment GNU + @deftypefun {long int} get_avphys_pages (void) +-The @code{get_phys_pages} function returns the number of available pages of ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++The @code{get_avphys_pages} function returns the number of available pages of + physical the system has. To get the amount of memory this number has to + be multiplied by the page size. + +@@ -1614,6 +1689,9 @@ + @comment sys/sysinfo.h + @comment GNU + @deftypefun int get_nprocs_conf (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c This function reads from from /sys using dir streams (single user, so ++@c no @mtasurace issue), and on some arches, from /proc using streams. + The @code{get_nprocs_conf} function returns the number of processors the + operating system configured. + +@@ -1623,6 +1701,8 @@ + @comment sys/sysinfo.h + @comment GNU + @deftypefun int get_nprocs (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} ++@c This function reads from /proc using file descriptor I/O. + The @code{get_nprocs} function returns the number of available processors. + + This function is a GNU extension. +@@ -1638,8 +1718,12 @@ + @comment stdlib.h + @comment BSD + @deftypefun int getloadavg (double @var{loadavg}[], int @var{nelem}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} ++@c Calls host_info on HURD; on Linux, opens /proc/loadavg, reads from ++@c it, closes it, without cancellation point, and calls strtod_l with ++@c the C locale to convert the strings to doubles. + This function gets the 1, 5 and 15 minute load averages of the +-system. The values are placed in @var{loadavg}. @code{getloadavg} will ++system. The values are placed in @var{loadavg}. @code{getloadavg} will + place at most @var{nelem} elements into the array but never more than + three elements. The return value is the number of elements written to + @var{loadavg}, or -1 on error. +diff -urN glibc-2.17-c758a686/manual/search.texi glibc-2.17-c758a686/manual/search.texi +--- glibc-2.17-c758a686/manual/search.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/search.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -71,7 +71,8 @@ + + @comment search.h + @comment SVID +-@deftypefun {void *} lfind (const void *@var{key}, void *@var{base}, size_t *@var{nmemb}, size_t @var{size}, comparison_fn_t @var{compar}) ++@deftypefun {void *} lfind (const void *@var{key}, const void *@var{base}, size_t *@var{nmemb}, size_t @var{size}, comparison_fn_t @var{compar}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{lfind} function searches in the array with @code{*@var{nmemb}} + elements of @var{size} bytes pointed to by @var{base} for an element + which matches the one pointed to by @var{key}. The function pointed to +@@ -90,6 +91,21 @@ + @comment search.h + @comment SVID + @deftypefun {void *} lsearch (const void *@var{key}, void *@var{base}, size_t *@var{nmemb}, size_t @var{size}, comparison_fn_t @var{compar}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c A signal handler that interrupted an insertion and performed an ++@c insertion itself would leave the array in a corrupt state (e.g. one ++@c new element initialized twice, with parts of both initializations ++@c prevailing, and another uninitialized element), but this is just a ++@c special case of races on user-controlled objects, that have to be ++@c avoided by users. ++ ++@c In case of cancellation, we know the array won't be left in a corrupt ++@c state; the new element is initialized before the element count is ++@c incremented, and the compiler can't reorder these operations because ++@c it can't know that they don't alias. So, we'll either cancel after ++@c the increment and the initialization are both complete, or the ++@c increment won't have taken place, and so how far the initialization ++@c got doesn't matter. + The @code{lsearch} function is similar to the @code{lfind} function. It + searches the given array for an element and returns it if found. The + difference is that if no matching element is found the @code{lsearch} +@@ -113,6 +129,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun {void *} bsearch (const void *@var{key}, const void *@var{array}, size_t @var{count}, size_t @var{size}, comparison_fn_t @var{compare}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{bsearch} function searches the sorted array @var{array} for an object + that is equivalent to @var{key}. The array contains @var{count} elements, + each of which is of size @var{size} bytes. +@@ -146,6 +163,7 @@ + @comment stdlib.h + @comment ISO + @deftypefun void qsort (void *@var{array}, size_t @var{count}, size_t @var{size}, comparison_fn_t @var{compare}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}} + The @var{qsort} function sorts the array @var{array}. The array contains + @var{count} elements, each of which is of size @var{size}. + +@@ -256,6 +274,9 @@ + @comment search.h + @comment SVID + @deftypefun int hcreate (size_t @var{nel}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hsearch}}@asunsafe{@ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c hcreate @mtasurace:hsearch @ascuheap @acucorrupt @acsmem ++@c hcreate_r dup @mtsrace:htab @ascuheap @acucorrupt @acsmem + The @code{hcreate} function creates a hashing table which can contain at + least @var{nel} elements. There is no possibility to grow this table so + it is necessary to choose the value for @var{nel} wisely. The method +@@ -270,7 +291,7 @@ + The weakest aspect of this function is that there can be at most one + hashing table used through the whole program. The table is allocated + in local memory out of control of the programmer. As an extension @theglibc{} +-provides an additional set of functions with an reentrant ++provides an additional set of functions with a reentrant + interface which provide a similar interface but which allow to keep + arbitrarily many hashing tables. + +@@ -285,6 +306,9 @@ + @comment search.h + @comment SVID + @deftypefun void hdestroy (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hsearch}}@asunsafe{@ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c hdestroy @mtasurace:hsearch @ascuheap @acucorrupt @acsmem ++@c hdestroy_r dup @mtsrace:htab @ascuheap @acucorrupt @acsmem + The @code{hdestroy} function can be used to free all the resources + allocated in a previous call of @code{hcreate}. After a call to this + function it is again possible to call @code{hcreate} and allocate a new +@@ -328,6 +352,9 @@ + @comment search.h + @comment SVID + @deftypefun {ENTRY *} hsearch (ENTRY @var{item}, ACTION @var{action}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hsearch}}@asunsafe{}@acunsafe{@acucorrupt{/action==ENTER}}} ++@c hsearch @mtasurace:hsearch @acucorrupt/action==ENTER ++@c hsearch_r dup @mtsrace:htab @acucorrupt/action==ENTER + To search in a hashing table created using @code{hcreate} the + @code{hsearch} function must be used. This function can perform simple + search for an element (if @var{action} has the @code{FIND}) or it can +@@ -358,6 +385,24 @@ + @comment search.h + @comment GNU + @deftypefun int hcreate_r (size_t @var{nel}, struct hsearch_data *@var{htab}) ++@safety{@prelim{}@mtsafe{@mtsrace{:htab}}@asunsafe{@ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c Unlike the lsearch array, the htab is (at least in part) opaque, so ++@c let's make it absolutely clear that ensuring exclusive access is a ++@c caller responsibility. ++ ++@c Cancellation is unlikely to leave the htab in a corrupt state: the ++@c last field to be initialized is the one that tells whether the entire ++@c data structure was initialized, and there's a function call (calloc) ++@c in between that will often ensure all other fields are written before ++@c the table. However, should this call be inlined (say with LTO), this ++@c assumption may not hold. The calloc call doesn't cross our library ++@c interface barrier, so let's consider this could happen and mark this ++@c with @acucorrupt. It's no safety loss, since we already have ++@c @ascuheap anyway... ++ ++@c hcreate_r @mtsrace:htab @ascuheap @acucorrupt @acsmem ++@c isprime ok ++@c calloc dup @ascuheap @acsmem + The @code{hcreate_r} function initializes the object pointed to by + @var{htab} to contain a hashing table with at least @var{nel} elements. + So this function is equivalent to the @code{hcreate} function except +@@ -376,6 +421,16 @@ + @comment search.h + @comment GNU + @deftypefun void hdestroy_r (struct hsearch_data *@var{htab}) ++@safety{@prelim{}@mtsafe{@mtsrace{:htab}}@asunsafe{@ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c The table is released while the table pointer still points to it. ++@c Async cancellation is thus unsafe, but it already was because we call ++@c free(). Using the table in a handler while it's being released would ++@c also be dangerous, but calling free() already makes it unsafe, and ++@c the requirement on the caller to ensure exclusive access already ++@c guarantees this doesn't happen, so we don't get @asucorrupt. ++ ++@c hdestroy_r @mtsrace:htab @ascuheap @acucorrupt @acsmem ++@c free dup @ascuheap @acsmem + The @code{hdestroy_r} function frees all resources allocated by the + @code{hcreate_r} function for this very same object @var{htab}. As for + @code{hdestroy} it is the programs responsibility to free the strings +@@ -385,6 +440,13 @@ + @comment search.h + @comment GNU + @deftypefun int hsearch_r (ENTRY @var{item}, ACTION @var{action}, ENTRY **@var{retval}, struct hsearch_data *@var{htab}) ++@safety{@prelim{}@mtsafe{@mtsrace{:htab}}@assafe{}@acunsafe{@acucorrupt{/action==ENTER}}} ++@c Callers have to ensure mutual exclusion; insertion, if cancelled, ++@c leaves the table in a corrupt state. ++ ++@c hsearch_r @mtsrace:htab @acucorrupt/action==ENTER ++@c strlen dup ok ++@c strcmp dup ok + The @code{hsearch_r} function is equivalent to @code{hsearch}. The + meaning of the first two arguments is identical. But instead of + operating on a single global hashing table the function works on the +@@ -401,7 +463,7 @@ + + @table @code + @item ENOMEM +-The table is filled and @code{hsearch_r} was called with an so far ++The table is filled and @code{hsearch_r} was called with a so far + unknown key and @var{action} set to @code{ENTER}. + @item ESRCH + The @var{action} parameter is @code{FIND} and no corresponding element +@@ -436,6 +498,12 @@ + @comment search.h + @comment SVID + @deftypefun {void *} tsearch (const void *@var{key}, void **@var{rootp}, comparison_fn_t @var{compar}) ++@safety{@prelim{}@mtsafe{@mtsrace{:rootp}}@asunsafe{@ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c The tree is not modified in a thread-safe manner, and rotations may ++@c leave the tree in an inconsistent state that could be observed in an ++@c asynchronous signal handler (except for the caller-synchronization ++@c requirement) or after asynchronous cancellation of the thread ++@c performing the rotation or the insertion. + The @code{tsearch} function searches in the tree pointed to by + @code{*@var{rootp}} for an element matching @var{key}. The function + pointed to by @var{compar} is used to determine whether two elements +@@ -465,6 +533,7 @@ + @comment search.h + @comment SVID + @deftypefun {void *} tfind (const void *@var{key}, void *const *@var{rootp}, comparison_fn_t @var{compar}) ++@safety{@prelim{}@mtsafe{@mtsrace{:rootp}}@assafe{}@acsafe{}} + The @code{tfind} function is similar to the @code{tsearch} function. It + locates an element matching the one pointed to by @var{key} and returns + a pointer to this element. But if no matching element is available no +@@ -479,6 +548,7 @@ + @comment search.h + @comment SVID + @deftypefun {void *} tdelete (const void *@var{key}, void **@var{rootp}, comparison_fn_t @var{compar}) ++@safety{@prelim{}@mtsafe{@mtsrace{:rootp}}@asunsafe{@ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} + To remove a specific element matching @var{key} from the tree + @code{tdelete} can be used. It locates the matching element using the + same method as @code{tfind}. The corresponding element is then removed +@@ -492,6 +562,7 @@ + @comment search.h + @comment GNU + @deftypefun void tdestroy (void *@var{vroot}, __free_fn_t @var{freefct}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + If the complete search tree has to be removed one can use + @code{tdestroy}. It frees all resources allocated by the @code{tsearch} + function to generate the tree pointed to by @var{vroot}. +@@ -546,6 +617,7 @@ + @comment search.h + @comment SVID + @deftypefun void twalk (const void *@var{root}, __action_fn_t @var{action}) ++@safety{@prelim{}@mtsafe{@mtsrace{:root}}@assafe{}@acsafe{}} + For each node in the tree with a node pointed to by @var{root}, the + @code{twalk} function calls the function provided by the parameter + @var{action}. For leaf nodes the function is called exactly once with +diff -urN glibc-2.17-c758a686/manual/setjmp.texi glibc-2.17-c758a686/manual/setjmp.texi +--- glibc-2.17-c758a686/manual/setjmp.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/setjmp.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -107,6 +107,10 @@ + @comment setjmp.h + @comment ISO + @deftypefn Macro int setjmp (jmp_buf @var{state}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c _setjmp ok ++@c __sigsetjmp(!savemask) ok ++@c __sigjmp_save(!savemask) ok, does not call sigprocmask + When called normally, @code{setjmp} stores information about the + execution state of the program in @var{state} and returns zero. If + @code{longjmp} is later used to perform a non-local exit to this +@@ -116,6 +120,20 @@ + @comment setjmp.h + @comment ISO + @deftypefun void longjmp (jmp_buf @var{state}, int @var{value}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{} @asucorrupt{} @asulock{/hurd}}@acunsafe{@acucorrupt{} @aculock{/hurd}}} ++@c __libc_siglongjmp @ascuplugin @asucorrupt @asulock/hurd @acucorrupt @aculock/hurd ++@c _longjmp_unwind @ascuplugin @asucorrupt @acucorrupt ++@c __pthread_cleanup_upto @ascuplugin @asucorrupt @acucorrupt ++@c plugins may be unsafe themselves, but even if they weren't, this ++@c function isn't robust WRT async signals and cancellation: ++@c cleanups aren't taken off the stack right away, only after all ++@c cleanups have been run. This means that async-cancelling ++@c longjmp, or interrupting longjmp with an async signal handler ++@c that calls longjmp may run the same cleanups multiple times. ++@c _JMPBUF_UNWINDS_ADJ ok ++@c *cleanup_buf->__routine @ascuplugin ++@c sigprocmask(SIG_SETMASK) dup @asulock/hurd @aculock/hurd ++@c __longjmp ok + This function restores current execution to the state saved in + @var{state}, and continues execution from the call to @code{setjmp} that + established that return point. Returning from @code{setjmp} by means of +@@ -141,7 +159,7 @@ + statement (such as @samp{if}, @samp{switch}, or @samp{while}). + + @item +-As one operand of a equality or comparison operator that appears as the ++As one operand of an equality or comparison operator that appears as the + test expression of a selection or iteration statement. The other + operand must be an integer constant expression. + +@@ -199,6 +217,11 @@ + @comment setjmp.h + @comment POSIX.1 + @deftypefun int sigsetjmp (sigjmp_buf @var{state}, int @var{savesigs}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c sigsetjmp @asulock/hurd @aculock/hurd ++@c __sigsetjmp(savemask) @asulock/hurd @aculock/hurd ++@c __sigjmp_save(savemask) @asulock/hurd @aculock/hurd ++@c sigprocmask(SIG_BLOCK probe) dup @asulock/hurd @aculock/hurd + This is similar to @code{setjmp}. If @var{savesigs} is nonzero, the set + of blocked signals is saved in @var{state} and will be restored if a + @code{siglongjmp} is later performed with this @var{state}. +@@ -207,6 +230,8 @@ + @comment setjmp.h + @comment POSIX.1 + @deftypefun void siglongjmp (sigjmp_buf @var{state}, int @var{value}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{} @asucorrupt{} @asulock{/hurd}}@acunsafe{@acucorrupt{} @aculock{/hurd}}} ++@c Alias to longjmp. + This is similar to @code{longjmp} except for the type of its @var{state} + argument. If the @code{sigsetjmp} call that set this @var{state} used a + nonzero @var{savesigs} flag, @code{siglongjmp} also restores the set of +@@ -237,7 +262,7 @@ + @comment SVID + @deftp {Data Type} ucontext_t + +-The @code{ucontext_t} type is defined as a structure with as least the ++The @code{ucontext_t} type is defined as a structure with at least the + following elements: + + @table @code +@@ -267,6 +292,10 @@ + @comment ucontext.h + @comment SVID + @deftypefun int getcontext (ucontext_t *@var{ucp}) ++@safety{@prelim{}@mtsafe{@mtsrace{:ucp}}@assafe{}@acsafe{}} ++@c Linux-only implementations in assembly, including sigprocmask ++@c syscall. A few cases call the sigprocmask function, but that's safe ++@c too. The ppc case is implemented in terms of a swapcontext syscall. + The @code{getcontext} function initializes the variable pointed to by + @var{ucp} with the context of the calling thread. The context contains + the content of the registers, the signal mask, and the current stack. +@@ -278,25 +307,26 @@ + @end deftypefun + + The @code{getcontext} function is similar to @code{setjmp} but it does +-not provide an indication of whether the function returns for the first +-time or whether the initialized context was used and the execution is +-resumed at just that point. If this is necessary the user has to take +-determine this herself. This must be done carefully since the context +-contains registers which might contain register variables. This is a +-good situation to define variables with @code{volatile}. ++not provide an indication of whether @code{getcontext} is returning for ++the first time or whether an initialized context has just been restored. ++If this is necessary the user has to determine this herself. This must ++be done carefully since the context contains registers which might contain ++register variables. This is a good situation to define variables with ++@code{volatile}. + + Once the context variable is initialized it can be used as is or it can +-be modified. The latter is normally done to implement co-routines or +-similar constructs. The @code{makecontext} function is what has to be +-used to do that. ++be modified using the @code{makecontext} function. The latter is normally ++done when implementing co-routines or similar constructs. + + @comment ucontext.h + @comment SVID + @deftypefun void makecontext (ucontext_t *@var{ucp}, void (*@var{func}) (void), int @var{argc}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtsrace{:ucp}}@assafe{}@acsafe{}} ++@c Linux-only implementations mostly in assembly, nothing unsafe. + +-The @var{ucp} parameter passed to the @code{makecontext} shall be ++The @var{ucp} parameter passed to @code{makecontext} shall be + initialized by a call to @code{getcontext}. The context will be +-modified to in a way so that if the context is resumed it will start by ++modified in a way such that if the context is resumed it will start by + calling the function @code{func} which gets @var{argc} integer arguments + passed. The integer arguments which are to be passed should follow the + @var{argc} parameter in the call to @code{makecontext}. +@@ -316,7 +346,7 @@ + While allocating the memory for the stack one has to be careful. Most + modern processors keep track of whether a certain memory region is + allowed to contain code which is executed or not. Data segments and +-heap memory is normally not tagged to allow this. The result is that ++heap memory are normally not tagged to allow this. The result is that + programs would fail. Examples for such code include the calling + sequences the GNU C compiler generates for calls to nested functions. + Safe ways to allocate stacks correctly include using memory on the +@@ -332,13 +362,22 @@ + allocated for the stack and the size of the memory region is stored in + @code{ss_size}. There are implements out there which require + @code{ss_sp} to be set to the value the stack pointer will have (which +-can depending on the direction the stack grows be different). This ++can, depending on the direction the stack grows, be different). This + difference makes the @code{makecontext} function hard to use and it + requires detection of the platform at compile time. + + @comment ucontext.h + @comment SVID + @deftypefun int setcontext (const ucontext_t *@var{ucp}) ++@safety{@prelim{}@mtsafe{@mtsrace{:ucp}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} ++@c Linux-only implementations mostly in assembly. Some ports use ++@c sigreturn or swapcontext syscalls; others restore the signal mask ++@c first and then proceed restore other registers in userland, which ++@c leaves a window for cancellation or async signals with misaligned or ++@c otherwise corrupt stack. ??? Switching to a different stack, or even ++@c to an earlier state on the same stack, may conflict with pthread ++@c cleanups. This is not quite MT-Unsafe, it's a different kind of ++@c safety issue. + + The @code{setcontext} function restores the context described by + @var{ucp}. The context is not modified and can be reused as often as +@@ -357,6 +396,9 @@ + terminates normally with an exit status value of @code{EXIT_SUCCESS} + (@pxref{Program Termination}). + ++If the context was created by a call to a signal handler or from any ++other source then the behaviour of @code{setcontext} is unspecified. ++ + Since the context contains information about the stack no two threads + should use the same context at the same time. The result in most cases + would be disastrous. +@@ -372,6 +414,10 @@ + @comment ucontext.h + @comment SVID + @deftypefun int swapcontext (ucontext_t *restrict @var{oucp}, const ucontext_t *restrict @var{ucp}) ++@safety{@prelim{}@mtsafe{@mtsrace{:oucp} @mtsrace{:ucp}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} ++@c Linux-only implementations mostly in assembly. Some ports call or ++@c inline getcontext and/or setcontext, adjusting the saved context in ++@c between, so we inherit the potential issues of both. + + The @code{swapcontext} function is similar to @code{setcontext} but + instead of just replacing the current context the latter is first saved +@@ -385,15 +431,15 @@ + If @code{swapcontext} succeeds the function does not return unless the + context @var{oucp} is used without prior modification by + @code{makecontext}. The return value in this case is @code{0}. If the +-function fails it returns @code{-1} and set @var{errno} accordingly. ++function fails it returns @code{-1} and sets @var{errno} accordingly. + @end deftypefun + + @heading Example for SVID Context Handling + + The easiest way to use the context handling functions is as a + replacement for @code{setjmp} and @code{longjmp}. The context contains +-on most platforms more information which might lead to less surprises +-but this also means using these functions is more expensive (beside ++on most platforms more information which may lead to fewer surprises ++but this also means using these functions is more expensive (besides + being less portable). + + @smallexample +@@ -440,11 +486,11 @@ + This an example how the context functions can be used to implement + co-routines or cooperative multi-threading. All that has to be done is + to call every once in a while @code{swapcontext} to continue running a +-different context. It is not allowed to do the context switching from +-the signal handler directly since neither @code{setcontext} nor +-@code{swapcontext} are functions which can be called from a signal +-handler. But setting a variable in the signal handler and checking it +-in the body of the functions which are executed. Since +-@code{swapcontext} is saving the current context it is possible to have +-multiple different scheduling points in the code. Execution will always +-resume where it was left. ++different context. It is not recommended to do the context switching from ++the signal handler directly since leaving the signal handler via ++@code{setcontext} if the signal was delivered during code that was not ++asynchronous signal safe could lead to problems. Setting a variable in ++the signal handler and checking it in the body of the functions which ++are executed is a safer approach. Since @code{swapcontext} is saving the ++current context it is possible to have multiple different scheduling points ++in the code. Execution will always resume where it was left. +diff -urN glibc-2.17-c758a686/manual/signal.texi glibc-2.17-c758a686/manual/signal.texi +--- glibc-2.17-c758a686/manual/signal.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/signal.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -889,6 +889,20 @@ + @comment string.h + @comment GNU + @deftypefun {char *} strsignal (int @var{signum}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:strsignal} @mtslocale{}}@asunsafe{@asuinit{} @ascuintl{} @asucorrupt{} @ascuheap{}}@acunsafe{@acuinit{} @acucorrupt{} @acsmem{}}} ++@c strsignal @mtasurace:strsignal @mtslocale @asuinit @ascuintl @asucorrupt @ascuheap @acucorrupt @acsmem ++@c uses a static buffer if tsd key creation fails ++@c [once] init ++@c libc_key_create ok ++@c pthread_key_create dup ok ++@c getbuffer @asucorrupt @ascuheap @acsmem ++@c libc_getspecific ok ++@c pthread_getspecific dup ok ++@c malloc dup @ascuheap @acsmem ++@c libc_setspecific @asucorrupt @ascuheap @acucorrupt @acsmem ++@c pthread_setspecific dup @asucorrupt @ascuheap @acucorrupt @acsmem ++@c snprintf dup @mtslocale @ascuheap @acsmem ++@c _ @ascuintl + This function returns a pointer to a statically-allocated string + containing a message describing the signal @var{signum}. You + should not modify the contents of this string; and, since it can be +@@ -903,6 +917,12 @@ + @comment signal.h + @comment BSD + @deftypefun void psignal (int @var{signum}, const char *@var{message}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuintl{} @ascuheap{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{}}} ++@c psignal @mtslocale @asucorrupt @ascuintl @ascuheap @aculock @acucorrupt @acsmem ++@c _ @ascuintl ++@c fxprintf @asucorrupt @aculock @acucorrupt ++@c asprintf @mtslocale @ascuheap @acsmem ++@c free dup @ascuheap @acsmem + This function prints a message describing the signal @var{signum} to the + standard error output stream @code{stderr}; see @ref{Standard Streams}. + +@@ -972,6 +992,12 @@ + @comment signal.h + @comment ISO + @deftypefun sighandler_t signal (int @var{signum}, sighandler_t @var{action}) ++@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}} ++@c signal ok ++@c sigemptyset dup ok ++@c sigaddset dup ok ++@c sigismember dup ok ++@c sigaction dup ok + The @code{signal} function establishes @var{action} as the action for + the signal @var{signum}. + +@@ -1094,6 +1120,10 @@ + @comment signal.h + @comment GNU + @deftypefun sighandler_t sysv_signal (int @var{signum}, sighandler_t @var{action}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c sysv_signal ok ++@c sigemptyset dup ok ++@c sigaction dup ok + The @code{sysv_signal} implements the behavior of the standard + @code{signal} function as found on SVID systems. The difference to BSD + systems is that the handler is deinstalled after a delivery of a signal. +@@ -1106,6 +1136,8 @@ + @comment signal.h + @comment SVID + @deftypefun sighandler_t ssignal (int @var{signum}, sighandler_t @var{action}) ++@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}} ++@c Aliases signal and bsd_signal. + The @code{ssignal} function does the same thing as @code{signal}; it is + provided only for compatibility with SVID. + @end deftypefun +@@ -1172,6 +1204,7 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigaction (int @var{signum}, const struct sigaction *restrict @var{action}, struct sigaction *restrict @var{old-action}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @var{action} argument is used to set up a new action for the signal + @var{signum}, while the @var{old-action} argument is used to return + information about the action previously associated with this symbol. +@@ -2168,6 +2194,14 @@ + @comment signal.h + @comment ISO + @deftypefun int raise (int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c raise ok ++@c [posix] ++@c getpid dup ok ++@c kill dup ok ++@c [linux] ++@c syscall(gettid) ok ++@c syscall(tgkill) ok + The @code{raise} function sends the signal @var{signum} to the calling + process. It returns zero if successful and a nonzero value if it fails. + About the only reason for failure would be if the value of @var{signum} +@@ -2177,6 +2211,8 @@ + @comment signal.h + @comment SVID + @deftypefun int gsignal (int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Aliases raise. + The @code{gsignal} function does the same thing as @code{raise}; it is + provided only for compatibility with SVID. + @end deftypefun +@@ -2269,6 +2305,11 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int kill (pid_t @var{pid}, int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c The hurd implementation is not a critical section, so it's not ++@c immediately obvious that, in case of cancellation, it won't leak ++@c ports or the memory allocated by proc_getpgrppids when pid <= 0. ++@c Since none of these make it AC-Unsafe, I'm leaving them out. + The @code{kill} function sends the signal @var{signum} to the process + or process group specified by @var{pid}. Besides the signals listed in + @ref{Standard Signals}, @var{signum} can also have a value of zero to +@@ -2325,6 +2366,8 @@ + @comment signal.h + @comment BSD + @deftypefun int killpg (int @var{pgid}, int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Calls kill with -pgid. + This is similar to @code{kill}, but sends signal @var{signum} to the + process group @var{pgid}. This function is provided for compatibility + with BSD; using @code{kill} to do this is more portable. +@@ -2497,6 +2540,8 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigemptyset (sigset_t *@var{set}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Just memsets all of set to zero. + This function initializes the signal set @var{set} to exclude all of the + defined signals. It always returns @code{0}. + @end deftypefun +@@ -2504,6 +2549,7 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigfillset (sigset_t *@var{set}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function initializes the signal set @var{set} to include + all of the defined signals. Again, the return value is @code{0}. + @end deftypefun +@@ -2511,6 +2557,7 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigaddset (sigset_t *@var{set}, int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function adds the signal @var{signum} to the signal set @var{set}. + All @code{sigaddset} does is modify @var{set}; it does not block or + unblock any signals. +@@ -2527,6 +2574,7 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigdelset (sigset_t *@var{set}, int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function removes the signal @var{signum} from the signal set + @var{set}. All @code{sigdelset} does is modify @var{set}; it does not + block or unblock any signals. The return value and error conditions are +@@ -2538,6 +2586,7 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigismember (const sigset_t *@var{set}, int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{sigismember} function tests whether the signal @var{signum} is + a member of the signal set @var{set}. It returns @code{1} if the signal + is in the set, @code{0} if not, and @code{-1} if there is an error. +@@ -2566,7 +2615,7 @@ + + Note that you must not use @code{sigprocmask} in multi-threaded processes, + because each thread has its own signal mask and there is no single process +-signal mask. According to POSIX, the behavior of @code{sigprocmask} in a ++signal mask. According to POSIX, the behavior of @code{sigprocmask} in a + multi-threaded process is ``unspecified''. + Instead, use @code{pthread_sigmask}. + @ifset linuxthreads +@@ -2576,6 +2625,10 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigprocmask (int @var{how}, const sigset_t *restrict @var{set}, sigset_t *restrict @var{oldset}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/bsd(SIG_UNBLOCK)}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c This takes the hurd_self_sigstate-returned object's lock on HURD. On ++@c BSD, SIG_UNBLOCK is emulated with two sigblock calls, which ++@c introduces a race window. + The @code{sigprocmask} function is used to examine or change the calling + process's signal mask. The @var{how} argument determines how the signal + mask is changed, and must be one of the following values: +@@ -2759,6 +2812,10 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigpending (sigset_t *@var{set}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c Direct rt_sigpending syscall on most systems. On hurd, calls ++@c hurd_self_sigstate, it copies the sigstate's pending while holding ++@c its lock. + The @code{sigpending} function stores information about pending signals + in @var{set}. If there is a pending signal that is blocked from + delivery, then that signal is a member of the returned set. (You can +@@ -2921,7 +2978,18 @@ + + @comment unistd.h + @comment POSIX.1 +-@deftypefun int pause () ++@deftypefun int pause (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/!bsd!linux}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c The signal mask read by sigprocmask may be overridden by another ++@c thread or by a signal handler before we call sigsuspend. Is this a ++@c safety issue? Probably not. ++@c pause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd ++@c [ports/linux/generic] ++@c syscall_pause ok ++@c [posix] ++@c sigemptyset dup ok ++@c sigprocmask(SIG_BLOCK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] ++@c sigsuspend dup @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd + The @code{pause} function suspends program execution until a signal + arrives whose action is either to execute a handler function, or to + terminate the process. +@@ -3017,6 +3085,18 @@ + @comment signal.h + @comment POSIX.1 + @deftypefun int sigsuspend (const sigset_t *@var{set}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/!bsd!linux}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c sigsuspend @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd ++@c [posix] @mtasurace:sigprocmask/!bsd!linux ++@c saving and restoring the procmask is racy ++@c sigprocmask(SIG_SETMASK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] ++@c pause @asulock/hurd @aculock/hurd ++@c [bsd] ++@c sigismember dup ok ++@c sigmask dup ok ++@c sigpause dup ok [no @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd] ++@c [linux] ++@c do_sigsuspend ok + This function replaces the process's signal mask with @var{set} and then + suspends the process until a signal is delivered whose action is either + to terminate the process or invoke a signal handling function. In other +@@ -3150,6 +3230,9 @@ + @comment signal.h + @comment XPG + @deftypefun int sigaltstack (const stack_t *restrict @var{stack}, stack_t *restrict @var{oldstack}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c Syscall on Linux and BSD; the HURD implementation takes a lock on ++@c the hurd_self_sigstate-returned struct. + The @code{sigaltstack} function specifies an alternate stack for use + during signal handling. When a signal is received by the process and + its action indicates that the signal stack is used, the system arranges +@@ -3195,7 +3278,9 @@ + + @comment signal.h + @comment BSD +-@deftypefun int sigstack (const struct sigstack *@var{stack}, struct sigstack *@var{oldstack}) ++@deftypefun int sigstack (struct sigstack *@var{stack}, struct sigstack *@var{oldstack}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c Lossy and dangerous (no size limit) wrapper for sigaltstack. + The @code{sigstack} function specifies an alternate stack for use during + signal handling. When a signal is received by the process and its + action indicates that the signal stack is used, the system arranges a +@@ -3301,6 +3386,13 @@ + @comment signal.h + @comment BSD + @deftypefun int sigvec (int @var{signum}, const struct sigvec *@var{action}, struct sigvec *@var{old-action}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This is mostly a safe wrapper for sigaction. The exception are ++@c systems that lack SA_RESETHAND, in which a signal handler wrapper is ++@c used that calls sigaction to reset the handler before calling the ++@c user-supplied handler; it's unlikely that this emulation is used ++@c anywhere, for user-supplied flags and mask don't seem to be used ++@c the way one would expect. + This function is the equivalent of @code{sigaction} (@pxref{Advanced Signal + Handling}); it installs the action @var{action} for the signal @var{signum}, + returning information about the previous action in effect for that signal +@@ -3310,6 +3402,14 @@ + @comment signal.h + @comment BSD + @deftypefun int siginterrupt (int @var{signum}, int @var{failflag}) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtssigintr{}}}@asunsafe{}@acunsafe{@acucorrupt{}}} ++@c This calls sigaction twice, once to get the current sigaction for the ++@c specified signal, another to apply the flags change. This could ++@c override the effects of a concurrent sigaction call. It also ++@c modifies without any guards the global _sigintr variable, that ++@c bsd_signal reads from, and it may leave _sigintr modified without ++@c overriding the active handler if cancelled between the two ++@c operations. + This function specifies which approach to use when certain primitives + are interrupted by handling signal @var{signum}. If @var{failflag} is + false, signal @var{signum} restarts primitives. If @var{failflag} is +@@ -3323,6 +3423,8 @@ + @comment signal.h + @comment BSD + @deftypefn Macro int sigmask (int @var{signum}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c This just shifts signum. + This macro returns a signal mask that has the bit for signal @var{signum} + set. You can bitwise-OR the results of several calls to @code{sigmask} + together to specify more than one signal. For example, +@@ -3339,6 +3441,11 @@ + @comment signal.h + @comment BSD + @deftypefun int sigblock (int @var{mask}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c On most POSIX systems, this is a wrapper for sigprocmask(SIG_BLOCK). ++@c The exception are BSD systems other than 4.4, where it is a syscall. ++@c sigblock @asulock/hurd @aculock/hurd ++@c sigprocmask(SIG_BLOCK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] + This function is equivalent to @code{sigprocmask} (@pxref{Process Signal + Mask}) with a @var{how} argument of @code{SIG_BLOCK}: it adds the + signals specified by @var{mask} to the calling process's set of blocked +@@ -3348,6 +3455,11 @@ + @comment signal.h + @comment BSD + @deftypefun int sigsetmask (int @var{mask}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c On most POSIX systems, this is a wrapper for sigprocmask(SIG_SETMASK). ++@c The exception are BSD systems other than 4.4, where it is a syscall. ++@c sigsetmask @asulock/hurd @aculock/hurd ++@c sigprocmask(SIG_SETMASK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] + This function equivalent to @code{sigprocmask} (@pxref{Process + Signal Mask}) with a @var{how} argument of @code{SIG_SETMASK}: it sets + the calling process's signal mask to @var{mask}. The return value is +@@ -3357,6 +3469,15 @@ + @comment signal.h + @comment BSD + @deftypefun int sigpause (int @var{mask}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/!bsd!linux}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} ++@c sigpause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd ++@c [posix] ++@c __sigpause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd ++@c do_sigpause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd ++@c sigprocmask(0) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] ++@c sigdelset dup ok ++@c sigset_set_old_mask dup ok ++@c sigsuspend dup @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd + This function is the equivalent of @code{sigsuspend} (@pxref{Waiting + for a Signal}): it sets the calling process's signal mask to @var{mask}, + and waits for a signal to arrive. On return the previous set of blocked +diff -urN glibc-2.17-c758a686/manual/socket.texi glibc-2.17-c758a686/manual/socket.texi +--- glibc-2.17-c758a686/manual/socket.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/socket.texi 2014-09-12 16:10:06.046792714 -0400 +@@ -394,6 +394,8 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int bind (int @var{socket}, struct sockaddr *@var{addr}, socklen_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, except on Hurd. + The @code{bind} function assigns an address to the socket + @var{socket}. The @var{addr} and @var{length} arguments specify the + address; the detailed format of the address depends on the namespace. +@@ -442,6 +444,9 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int getsockname (int @var{socket}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsmem{/hurd}}} ++@c Direct syscall, except on Hurd, where it seems like it might leak ++@c VM if cancelled. + The @code{getsockname} function returns information about the + address of the socket @var{socket} in the locations specified by the + @var{addr} and @var{length-ptr} arguments. Note that the +@@ -501,6 +506,14 @@ + @comment net/if.h + @comment IPv6 basic API + @deftypefun {unsigned int} if_nametoindex (const char *@var{ifname}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c It opens a socket to use ioctl on the fd to get the index. ++@c opensock may call socket and access multiple times until it finds a ++@c socket family that works. The Linux implementation has a potential ++@c concurrency issue WRT last_type and last_family not being updated ++@c atomically, but it is harmless; the generic implementation, OTOH, ++@c takes a lock, which makes all callers AS- and AC-Unsafe. ++@c opensock @asulock @aculock @acsfd + This function yields the interface index corresponding to a particular + name. If no interface exists with the name given, it returns 0. + @end deftypefun +@@ -508,6 +521,9 @@ + @comment net/if.h + @comment IPv6 basic API + @deftypefun {char *} if_indextoname (unsigned int @var{ifindex}, char *@var{ifname}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c It opens a socket with opensock to use ioctl on the fd to get the ++@c name from the index. + This function maps an interface index to its corresponding name. The + returned name is placed in the buffer pointed to by @code{ifname}, which + must be at least @code{IFNAMSIZ} bytes in length. If the index was +@@ -534,6 +550,39 @@ + @comment net/if.h + @comment IPv6 basic API + @deftypefun {struct if_nameindex *} if_nameindex (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{/hurd}}@acunsafe{@aculock{/hurd} @acsfd{} @acsmem{}}} ++@c if_nameindex @ascuheap @asulock/hurd @aculock/hurd @acsfd @acsmem ++@c [linux] ++@c netlink_open @acsfd @acsmem/hurd ++@c socket dup @acsfd ++@c memset dup ok ++@c bind dup ok ++@c netlink_close dup @acsfd ++@c getsockname dup @acsmem/hurd ++@c netlink_request @ascuheap @acsmem ++@c getpagesize dup ok ++@c malloc dup @ascuheap @acsmem ++@c netlink_sendreq ok ++@c memset dup ok ++@c sendto dup ok ++@c recvmsg dup ok ++@c memcpy dup ok ++@c free dup @ascuheap @acsmem ++@c netlink_free_handle @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c netlink_close @acsfd ++@c close dup @acsfd ++@c malloc dup @asuheap @acsmem ++@c strndup @ascuheap @acsmem ++@c if_freenameindex @ascuheap @acsmem ++@c [hurd] ++@c opensock dup @asulock @aculock @acsfd ++@c hurd_socket_server ok ++@c pfinet_siocgifconf ok ++@c malloc @ascuheap @acsmem ++@c strdup @ascuheap @acsmem ++@c ioctl dup ok ++@c free @ascuheap @acsmem + This function returns an array of @code{if_nameindex} structures, one + for every interface that is present. The end of the list is indicated + by a structure with an interface of 0 and a null name pointer. If an +@@ -546,6 +595,9 @@ + @comment net/if.h + @comment IPv6 basic API + @deftypefun void if_freenameindex (struct if_nameindex *@var{ptr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c if_freenameindex @ascuheap @acsmem ++@c free dup @ascuheap @acsmem + This function frees the structure returned by an earlier call to + @code{if_nameindex}. + @end deftypefun +@@ -660,6 +712,7 @@ + @comment sys/un.h + @comment BSD + @deftypefn {Macro} int SUN_LEN (@emph{struct sockaddr_un *} @var{ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The macro computes the length of socket address in the local namespace. + @end deftypefn + +@@ -689,7 +742,7 @@ + To create a socket in the IPv4 Internet namespace, use the symbolic name + @code{PF_INET} of this namespace as the @var{namespace} argument to + @code{socket} or @code{socketpair}. For IPv6 addresses you need the +-macro @code{PF_INET6}. These macros are defined in @file{sys/socket.h}. ++macro @code{PF_INET6}. These macros are defined in @file{sys/socket.h}. + @pindex sys/socket.h + + @comment sys/socket.h +@@ -726,12 +779,12 @@ + * Internet Address Formats:: How socket addresses are specified in the + Internet namespace. + * Host Addresses:: All about host addresses of Internet host. +-* Protocols Database:: Referring to protocols by name. + * Ports:: Internet port numbers. + * Services Database:: Ports may have symbolic names. + * Byte Order:: Different hosts may use different byte + ordering conventions; you need to + canonicalize host address and port number. ++* Protocols Database:: Referring to protocols by name. + * Inet Example:: Putting it all together. + @end menu + +@@ -1035,6 +1088,13 @@ + @comment arpa/inet.h + @comment BSD + @deftypefun int inet_aton (const char *@var{name}, struct in_addr *@var{addr}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c inet_aton @mtslocale ++@c isdigit dup @mtslocale ++@c strtoul dup @mtslocale ++@c isascii dup @mtslocale ++@c isspace dup @mtslocale ++@c htonl dup ok + This function converts the IPv4 Internet host address @var{name} + from the standard numbers-and-dots notation into binary data and stores + it in the @code{struct in_addr} that @var{addr} points to. +@@ -1044,10 +1104,13 @@ + @comment arpa/inet.h + @comment BSD + @deftypefun {uint32_t} inet_addr (const char *@var{name}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c inet_addr @mtslocale ++@c inet_aton dup @mtslocale + This function converts the IPv4 Internet host address @var{name} from the + standard numbers-and-dots notation into binary data. If the input is + not valid, @code{inet_addr} returns @code{INADDR_NONE}. This is an +-obsolete interface to @code{inet_aton}, described immediately above. It ++obsolete interface to @code{inet_aton}, described immediately above. It + is obsolete because @code{INADDR_NONE} is a valid address + (255.255.255.255), and @code{inet_aton} provides a cleaner way to + indicate error return. +@@ -1056,9 +1119,15 @@ + @comment arpa/inet.h + @comment BSD + @deftypefun {uint32_t} inet_network (const char *@var{name}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c inet_network @mtslocale ++@c isdigit dup @mtslocale ++@c isxdigit dup @mtslocale ++@c tolower dup @mtslocale ++@c isspace dup @mtslocale + This function extracts the network number from the address @var{name}, +-given in the standard numbers-and-dots notation. The returned address is +-in host order. If the input is not valid, @code{inet_network} returns ++given in the standard numbers-and-dots notation. The returned address is ++in host order. If the input is not valid, @code{inet_network} returns + @code{-1}. + + The function works only with traditional IPv4 class A, B and C network +@@ -1069,6 +1138,10 @@ + @comment arpa/inet.h + @comment BSD + @deftypefun {char *} inet_ntoa (struct in_addr @var{addr}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asurace{}}@acsafe{}} ++@c inet_ntoa @mtslocale @asurace ++@c writes to a thread-local static buffer ++@c snprintf @mtslocale [no @ascuheap or @acsmem] + This function converts the IPv4 Internet host address @var{addr} to a + string in the standard numbers-and-dots notation. The return value is + a pointer into a statically-allocated buffer. Subsequent calls will +@@ -1087,6 +1160,9 @@ + @comment arpa/inet.h + @comment BSD + @deftypefun {struct in_addr} inet_makeaddr (uint32_t @var{net}, uint32_t @var{local}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c inet_makeaddr ok ++@c htonl dup ok + This function makes an IPv4 Internet host address by combining the network + number @var{net} with the local-address-within-network number + @var{local}. +@@ -1095,6 +1171,11 @@ + @comment arpa/inet.h + @comment BSD + @deftypefun uint32_t inet_lnaof (struct in_addr @var{addr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c inet_lnaof ok ++@c ntohl dup ok ++@c IN_CLASSA ok ++@c IN_CLASSB ok + This function returns the local-address-within-network part of the + Internet host address @var{addr}. + +@@ -1106,6 +1187,11 @@ + @comment arpa/inet.h + @comment BSD + @deftypefun uint32_t inet_netof (struct in_addr @var{addr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c inet_netof ok ++@c ntohl dup ok ++@c IN_CLASSA ok ++@c IN_CLASSB ok + This function returns the network number part of the Internet host + address @var{addr}. + +@@ -1117,6 +1203,16 @@ + @comment arpa/inet.h + @comment IPv6 basic API + @deftypefun int inet_pton (int @var{af}, const char *@var{cp}, void *@var{buf}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c inet_pton @mtslocale ++@c inet_pton4 ok ++@c memcpy dup ok ++@c inet_pton6 @mtslocale ++@c memset dup ok ++@c tolower dup @mtslocale ++@c strchr dup ok ++@c inet_pton4 dup ok ++@c memcpy dup ok + This function converts an Internet address (either IPv4 or IPv6) from + presentation (textual) to network (binary) format. @var{af} should be + either @code{AF_INET} or @code{AF_INET6}, as appropriate for the type of +@@ -1127,7 +1223,17 @@ + + @comment arpa/inet.h + @comment IPv6 basic API +-@deftypefun {const char *} inet_ntop (int @var{af}, const void *@var{cp}, char *@var{buf}, size_t @var{len}) ++@deftypefun {const char *} inet_ntop (int @var{af}, const void *@var{cp}, char *@var{buf}, socklen_t @var{len}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c inet_ntop @mtslocale ++@c inet_ntop4 @mtslocale ++@c sprintf dup @mtslocale [no @ascuheap or @acsmem] ++@c strcpy dup ok ++@c inet_ntop6 @mtslocale ++@c memset dup ok ++@c inet_ntop4 dup @mtslocale ++@c sprintf dup @mtslocale [no @ascuheap or @acsmem] ++@c strcpy dup ok + This function converts an Internet address (either IPv4 or IPv6) from + network (binary) to presentation (textual) form. @var{af} should be + either @code{AF_INET} or @code{AF_INET6}, as appropriate. @var{cp} is a +@@ -1211,6 +1317,71 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct hostent *} gethostbyname (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hostbyname} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}} ++@c gethostbyname @mtasurace:hostbyname @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c nss_hostname_digits_dots @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c res_maybe_init(!preinit) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c res_iclose @acsuheap @acsmem @acsfd ++@c close_not_cancel_no_status dup @acsfd ++@c free dup @acsuheap @acsmem ++@c res_vinit @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c res_randomid ok ++@c getpid dup ok ++@c getenv dup @mtsenv ++@c strncpy dup ok ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking dup ok [no concurrent uses] ++@c fgets_unlocked dup ok [no concurrent uses] ++@c MATCH ok ++@c strncmp dup ok ++@c strpbrk dup ok ++@c strchr dup ok ++@c inet_aton dup @mtslocale ++@c htons dup ++@c inet_pton dup @mtslocale ++@c malloc dup @ascuheap @acsmem ++@c IN6_IS_ADDR_LINKLOCAL ok ++@c htonl dup ok ++@c IN6_IS_ADDR_MC_LINKLOCAL ok ++@c if_nametoindex dup @asulock @aculock @acsfd ++@c strtoul dup @mtslocale ++@c ISSORTMASK ok ++@c strchr dup ok ++@c isascii dup @mtslocale ++@c isspace dup @mtslocale ++@c net_mask ok ++@c ntohl dup ok ++@c IN_CLASSA dup ok ++@c htonl dup ok ++@c IN_CLASSB dup ok ++@c res_setoptions @mtslocale ++@c strncmp dup ok ++@c atoi dup @mtslocale ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c inet_makeaddr dup ok ++@c gethostname dup ok ++@c strcpy dup ok ++@c rawmemchr dup ok ++@c res_ninit @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c res_vinit dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c isdigit dup @mtslocale ++@c isxdigit dup @mtslocale ++@c strlen dup ok ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c memset dup ok ++@c inet_aton dup @mtslocale ++@c inet_pton dup @mtslocale ++@c strcpy dup ok ++@c memcpy dup ok ++@c strchr dup ok ++@c gethostbyname_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c set_h_errno ok + The @code{gethostbyname} function returns information about the host + named @var{name}. If the lookup fails, it returns a null pointer. + @end deftypefun +@@ -1218,6 +1389,16 @@ + @comment netdb.h + @comment IPv6 Basic API + @deftypefun {struct hostent *} gethostbyname2 (const char *@var{name}, int @var{af}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hostbyname2} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}} ++@c gethostbyname2 @mtasurace:hostbyname2 @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c nss_hostname_digits_dots dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c gethostbyname2_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c set_h_errno dup ok + The @code{gethostbyname2} function is like @code{gethostbyname}, but + allows the caller to specify the desired address family (e.g.@: + @code{AF_INET} or @code{AF_INET6}) of the result. +@@ -1225,11 +1406,20 @@ + + @comment netdb.h + @comment BSD +-@deftypefun {struct hostent *} gethostbyaddr (const char *@var{addr}, size_t @var{length}, int @var{format}) ++@deftypefun {struct hostent *} gethostbyaddr (const void *@var{addr}, socklen_t @var{length}, int @var{format}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hostbyaddr} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}} ++@c gethostbyaddr @mtasurace:hostbyaddr @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c gethostbyaddr_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c set_h_errno dup ok + The @code{gethostbyaddr} function returns information about the host + with Internet address @var{addr}. The parameter @var{addr} is not + really a pointer to char - it can be a pointer to an IPv4 or an IPv6 +-address. The @var{length} argument is the size (in bytes) of the address ++address. The @var{length} argument is the size (in bytes) of the address + at @var{addr}. @var{format} specifies the address format; for an IPv4 + Internet address, specify a value of @code{AF_INET}; for an IPv6 + Internet address, use @code{AF_INET6}. +@@ -1282,6 +1472,76 @@ + @comment netdb.h + @comment GNU + @deftypefun int gethostbyname_r (const char *restrict @var{name}, struct hostent *restrict @var{result_buf}, char *restrict @var{buf}, size_t @var{buflen}, struct hostent **restrict @var{result}, int *restrict @var{h_errnop}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}} ++@c gethostbyname_r @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c nss_hostname_digits_dots dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c nscd_gethostbyname_r @mtsenv @ascuheap @acsfd @acsmem ++@c nscd_gethst_r @mtsenv @ascuheap @acsfd @acsmem ++@c getenv dup @mtsenv ++@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem ++@c nscd_cache_search dup ok ++@c memcpy dup ok ++@c nscd_open_socket dup @acsfd ++@c readvall dup ok ++@c readall dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c nscd_drop_map_ref dup @ascuheap @acsmem ++@c nscd_unmap dup @ascuheap @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c res_hconf_init @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem [no @asuinit:reshconf @acuinit:reshconf, conditionally called] ++@c res_hconf.c:do_init @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem ++@c memset dup ok ++@c getenv dup @mtsenv ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking dup ok [no concurrent uses] ++@c fgets_unlocked dup ok [no concurrent uses] ++@c strchrnul dup ok ++@c res_hconf.c:parse_line @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem ++@c skip_ws dup @mtslocale ++@c skip_string dup @mtslocale ++@c strncasecmp dup @mtslocale ++@c strlen dup ok ++@c asprintf dup @mtslocale @ascuheap @acsmem ++@c fxprintf dup @asucorrupt @aculock @acucorrupt ++@c free dup @ascuheap @acsmem ++@c arg_trimdomain_list dup @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem ++@c arg_spoof dup @mtslocale ++@c arg_bool dup @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem ++@c isspace dup @mtslocale ++@c fclose dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c arg_spoof @mtslocale ++@c skip_string @mtslocale ++@c isspace dup @mtslocale ++@c strncasecmp dup @mtslocale ++@c arg_bool @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem ++@c strncasecmp dup @mtslocale ++@c asprintf dup @mtslocale @ascuheap @acsmem ++@c fxprintf dup @asucorrupt @aculock @acucorrupt ++@c free dup @ascuheap @acsmem ++@c arg_trimdomain_list @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem ++@c skip_string dup @mtslocale ++@c asprintf dup @mtslocale @ascuheap @acsmem ++@c fxprintf dup @asucorrupt @aculock @acucorrupt ++@c free dup @ascuheap @acsmem ++@c strndup dup @ascuheap @acsmem ++@c skip_ws @mtslocale ++@c isspace dup @mtslocale ++@c nss_hosts_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_database_lookup dup @mtslocale @ascuheap @asulock @acucorrupt @acsmem @acsfd @aculock ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_gethostbyname_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_hconf_reorder_addrs @asulock @ascuheap @aculock @acsmem @acsfd ++@c socket dup @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c ifreq @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c if_nextreq dup ok ++@c ioctl dup ok ++@c realloc dup @ascuheap @acsmem ++@c if_freereq dup @acsmem ++@c libc_lock_unlock dup @aculock ++@c close dup @acsfd + The @code{gethostbyname_r} function returns information about the host + named @var{name}. The caller must pass a pointer to an object of type + @code{struct hostent} in the @var{result_buf} parameter. In addition +@@ -1290,37 +1550,42 @@ + parameters. + + A pointer to the buffer, in which the result is stored, is available in +-@code{*@var{result}} after the function call successfully returned. If +-an error occurs or if no entry is found, the pointer @code{*@var{result}} +-is a null pointer. Success is signalled by a zero return value. If the +-function failed the return value is an error number. In addition to the +-errors defined for @code{gethostbyname} it can also be @code{ERANGE}. +-In this case the call should be repeated with a larger buffer. +-Additional error information is not stored in the global variable +-@code{h_errno} but instead in the object pointed to by @var{h_errnop}. ++@code{*@var{result}} after the function call successfully returned. The ++buffer passed as the @var{buf} parameter can be freed only once the caller ++has finished with the result hostent struct, or has copied it including all ++the other memory that it points to. If an error occurs or if no entry is ++found, the pointer @code{*@var{result}} is a null pointer. Success is ++signalled by a zero return value. If the function failed the return value ++is an error number. In addition to the errors defined for ++@code{gethostbyname} it can also be @code{ERANGE}. In this case the call ++should be repeated with a larger buffer. Additional error information is ++not stored in the global variable @code{h_errno} but instead in the object ++pointed to by @var{h_errnop}. + + Here's a small example: + @smallexample + struct hostent * + gethostname (char *host) + @{ +- struct hostent hostbuf, *hp; ++ struct hostent *hostbuf, *hp; + size_t hstbuflen; + char *tmphstbuf; + int res; + int herr; + ++ hostbuf = malloc (sizeof (struct hostent)); + hstbuflen = 1024; +- /* Allocate buffer, remember to free it to avoid memory leakage. */ + tmphstbuf = malloc (hstbuflen); + +- while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, ++ while ((res = gethostbyname_r (host, hostbuf, tmphstbuf, hstbuflen, + &hp, &herr)) == ERANGE) + @{ + /* Enlarge the buffer. */ + hstbuflen *= 2; + tmphstbuf = realloc (tmphstbuf, hstbuflen); + @} ++ ++ free (tmphstbuf); + /* Check for errors. */ + if (res || hp == NULL) + return NULL; +@@ -1332,6 +1597,17 @@ + @comment netdb.h + @comment GNU + @deftypefun int gethostbyname2_r (const char *@var{name}, int @var{af}, struct hostent *restrict @var{result_buf}, char *restrict @var{buf}, size_t @var{buflen}, struct hostent **restrict @var{result}, int *restrict @var{h_errnop}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}} ++@c gethostbyname2_r @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c nss_hostname_digits_dots dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c nscd_gethostbyname2_r @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem ++@c nscd_gethst_r dup @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c res_hconf_init dup @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem [no @asuinit:reshconf @acuinit:reshconf, conditionally called] ++@c nss_hosts_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_gethostbyname2_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_hconf_reorder_addrs dup @asulock @ascuheap @aculock @acsmem @acsfd + The @code{gethostbyname2_r} function is like @code{gethostbyname_r}, but + allows the caller to specify the desired address family (e.g.@: + @code{AF_INET} or @code{AF_INET6}) for the result. +@@ -1339,11 +1615,26 @@ + + @comment netdb.h + @comment GNU +-@deftypefun int gethostbyaddr_r (const char *@var{addr}, size_t @var{length}, int @var{format}, struct hostent *restrict @var{result_buf}, char *restrict @var{buf}, size_t @var{buflen}, struct hostent **restrict @var{result}, int *restrict @var{h_errnop}) ++@deftypefun int gethostbyaddr_r (const void *@var{addr}, socklen_t @var{length}, int @var{format}, struct hostent *restrict @var{result_buf}, char *restrict @var{buf}, size_t @var{buflen}, struct hostent **restrict @var{result}, int *restrict @var{h_errnop}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}} ++@c gethostbyaddr_r @mtsenv @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @aculock @acucorrupt @acsmem @acsfd ++@c memcmp dup ok ++@c nscd_gethostbyaddr_r @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem ++@c nscd_gethst_r dup @mtsenv @ascuheap @asulock @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c res_hconf_init dup @mtsenv @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem [no @asuinit:reshconf @acuinit:reshconf, conditionally called] ++@c nss_hosts_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_gethostbyaddr_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_hconf_reorder_addrs dup @asulock @ascuheap @aculock @acsmem @acsfd ++@c res_hconf_trim_domains @mtslocale ++@c res_hconf_trim_domain @mtslocale ++@c strlen dup ok ++@c strcasecmp dup @mtslocale + The @code{gethostbyaddr_r} function returns information about the host + with Internet address @var{addr}. The parameter @var{addr} is not + really a pointer to char - it can be a pointer to an IPv4 or an IPv6 +-address. The @var{length} argument is the size (in bytes) of the address ++address. The @var{length} argument is the size (in bytes) of the address + at @var{addr}. @var{format} specifies the address format; for an IPv4 + Internet address, specify a value of @code{AF_INET}; for an IPv6 + Internet address, use @code{AF_INET6}. +@@ -1362,6 +1653,18 @@ + @comment netdb.h + @comment BSD + @deftypefun void sethostent (int @var{stayopen}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hostent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c sethostent @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_setent(nss_hosts_lookup2) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c set_h_errno dup ok ++@c setup(nss_hosts_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *lookup_fct = nss_hosts_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:hostent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock dup @aculock + This function opens the hosts database to begin scanning it. You can + then call @code{gethostent} to read the entries. + +@@ -1377,6 +1680,27 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct hostent *} gethostent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hostent} @mtasurace{:hostentbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c gethostent @mtasurace:hostent @mtasurace:hostentbuf @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent(gethostent_r) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c malloc dup @ascuheap @acsmem ++@c *func = gethostent_r dup @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c gethostent_r @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent_r(nss_hosts_lookup2) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c setup(nss_hosts_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:hostent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *sfct.f @mtasurace:hostent @ascuplugin ++@c libc_lock_unlock dup @aculock ++ + This function returns the next entry in the hosts database. It + returns a null pointer if there are no more entries. + @end deftypefun +@@ -1384,6 +1708,15 @@ + @comment netdb.h + @comment BSD + @deftypefun void endhostent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:hostent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c endhostent @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock @asulock @aculock ++@c nss_endent(nss_hosts_lookup2) @mtasurace:hostent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c setup(nss_passwd_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:hostent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock @aculock + This function closes the hosts database. + @end deftypefun + +@@ -1483,6 +1816,34 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct servent *} getservbyname (const char *@var{name}, const char *@var{proto}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:servbyname} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getservbyname =~ getpwuid @mtasurace:servbyname @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getservbyname_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getservbyname_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_getservbyname_r @ascuheap @acsfd @acsmem ++@c nscd_getserv_r @ascuheap @acsfd @acsmem ++@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c mempcpy dup ok ++@c memcpy dup ok ++@c nscd_cache_search dup ok ++@c nscd_open_socket dup @acsfd ++@c readvall dup ok ++@c readall dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c nscd_drop_map_ref dup @ascuheap @acsmem ++@c nscd_unmap dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c nss_services_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_getservbyname_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + The @code{getservbyname} function returns information about the + service named @var{name} using protocol @var{proto}. If it can't find + such a service, it returns a null pointer. +@@ -1494,6 +1855,21 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct servent *} getservbyport (int @var{port}, const char *@var{proto}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:servbyport} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getservbyport =~ getservbyname @mtasurace:servbyport @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getservbyport_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getservbyport_r =~ getservbyname_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_getservbyport_r @ascuheap @acsfd @acsmem ++@c nscd_getserv_r dup @ascuheap @acsfd @acsmem ++@c nss_services_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_getservbyport_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + The @code{getservbyport} function returns information about the + service at port @var{port} using protocol @var{proto}. If it can't + find such a service, it returns a null pointer. +@@ -1507,6 +1883,16 @@ + @comment netdb.h + @comment BSD + @deftypefun void setservent (int @var{stayopen}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:servent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c setservent @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_setent(nss_services_lookup2) @mtasurace:servenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c setup(nss_services_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *lookup_fct = nss_services_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:servent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock dup @aculock + This function opens the services database to begin scanning it. + + If the @var{stayopen} argument is nonzero, this sets a flag so that +@@ -1519,6 +1905,25 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct servent *} getservent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:servent} @mtasurace{:serventbuf} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getservent @mtasurace:servent @mtasurace:serventbuf @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent(getservent_r) @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c malloc dup @ascuheap @acsmem ++@c *func = getservent_r dup @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getservent_r @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent_r(nss_services_lookup2) @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c setup(nss_services_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:servent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *sfct.f @mtasurace:servent @ascuplugin ++@c libc_lock_unlock dup @aculock + This function returns the next entry in the services database. If + there are no more entries, it returns a null pointer. + @end deftypefun +@@ -1526,6 +1931,14 @@ + @comment netdb.h + @comment BSD + @deftypefun void endservent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:servent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c endservent @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock @asulock @aculock ++@c nss_endent(nss_services_lookup2) @mtasurace:servent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c setup(nss_services_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:servent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock @aculock + This function closes the services database. + @end deftypefun + +@@ -1571,6 +1984,11 @@ + @comment netinet/in.h + @comment BSD + @deftypefun {uint16_t} htons (uint16_t @var{hostshort}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c htons ok ++@c bswap_16 ok ++@c bswap_constant_16 ok ++ + This function converts the @code{uint16_t} integer @var{hostshort} from + host byte order to network byte order. + @end deftypefun +@@ -1578,6 +1996,8 @@ + @comment netinet/in.h + @comment BSD + @deftypefun {uint16_t} ntohs (uint16_t @var{netshort}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Alias to htons. + This function converts the @code{uint16_t} integer @var{netshort} from + network byte order to host byte order. + @end deftypefun +@@ -1585,6 +2005,9 @@ + @comment netinet/in.h + @comment BSD + @deftypefun {uint32_t} htonl (uint32_t @var{hostlong}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c htonl ok ++@c bswap_32 dup ok + This function converts the @code{uint32_t} integer @var{hostlong} from + host byte order to network byte order. + +@@ -1594,6 +2017,8 @@ + @comment netinet/in.h + @comment BSD + @deftypefun {uint32_t} ntohl (uint32_t @var{netlong}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Alias to htonl. + This function converts the @code{uint32_t} integer @var{netlong} from + network byte order to host byte order. + +@@ -1658,6 +2083,20 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct protoent *} getprotobyname (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:protobyname} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getprotobyname =~ getpwuid @mtasurace:protobyname @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getprotobyname_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getprotobyname_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c no nscd support ++@c nss_protocols_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_getprotobyname_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + The @code{getprotobyname} function returns information about the + network protocol named @var{name}. If there is no such protocol, it + returns a null pointer. +@@ -1666,6 +2105,20 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct protoent *} getprotobynumber (int @var{protocol}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:protobynumber} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getprotobynumber =~ getpwuid @mtasurace:protobynumber @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getprotobynumber_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getprotobynumber_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c no nscd support ++@c nss_protocols_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_getprotobynumber_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + The @code{getprotobynumber} function returns information about the + network protocol with number @var{protocol}. If there is no such + protocol, it returns a null pointer. +@@ -1678,6 +2131,16 @@ + @comment netdb.h + @comment BSD + @deftypefun void setprotoent (int @var{stayopen}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:protoent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c setprotoent @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_setent(nss_protocols_lookup2) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c setup(nss_protocols_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *lookup_fct = nss_protocols_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:protoent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock dup @aculock + This function opens the protocols database to begin scanning it. + + If the @var{stayopen} argument is nonzero, this sets a flag so that +@@ -1690,6 +2153,25 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct protoent *} getprotoent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:protoent} @mtasurace{:protoentbuf} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getprotoent @mtasurace:protoent @mtasurace:protoentbuf @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent(getprotoent_r) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c malloc dup @ascuheap @acsmem ++@c *func = getprotoent_r dup @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getprotoent_r @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent_r(nss_protocols_lookup2) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c setup(nss_protocols_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:servent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *sfct.f @mtasurace:protoent @ascuplugin ++@c libc_lock_unlock dup @aculock + This function returns the next entry in the protocols database. It + returns a null pointer if there are no more entries. + @end deftypefun +@@ -1697,6 +2179,14 @@ + @comment netdb.h + @comment BSD + @deftypefun void endprotoent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:protoent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c endprotoent @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock @asulock @aculock ++@c nss_endent(nss_protocols_lookup2) @mtasurace:protoent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c setup(nss_protocols_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:protoent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock @aculock + This function closes the protocols database. + @end deftypefun + +@@ -1766,6 +2256,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int socket (int @var{namespace}, int @var{style}, int @var{protocol}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + This function creates a socket and specifies communication style + @var{style}, which should be one of the socket styles listed in + @ref{Communication Styles}. The @var{namespace} argument specifies +@@ -1828,6 +2319,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int shutdown (int @var{socket}, int @var{how}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{shutdown} function shuts down the connection of socket + @var{socket}. The argument @var{how} specifies what action to + perform: +@@ -1879,6 +2371,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int socketpair (int @var{namespace}, int @var{style}, int @var{protocol}, int @var{filedes}@t{[2]}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + This function creates a socket pair, returning the file descriptors in + @code{@var{filedes}[0]} and @code{@var{filedes}[1]}. The socket pair + is a full-duplex communications channel, so that both reading and writing +@@ -1972,6 +2465,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int connect (int @var{socket}, struct sockaddr *@var{addr}, socklen_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{connect} function initiates a connection from the socket + with file descriptor @var{socket} to the socket whose address is + specified by the @var{addr} and @var{length} arguments. (This socket +@@ -2071,6 +2565,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int listen (int @var{socket}, int @var{n}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + The @code{listen} function enables the socket @var{socket} to accept + connections, thus making it a server socket. + +@@ -2123,6 +2618,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int accept (int @var{socket}, struct sockaddr *@var{addr}, socklen_t *@var{length_ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} + This function is used to accept a connection request on the server + socket @var{socket}. + +@@ -2181,6 +2677,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int getpeername (int @var{socket}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getpeername} function returns the address of the socket that + @var{socket} is connected to; it stores the address in the memory space + specified by @var{addr} and @var{length-ptr}. It stores the length of +@@ -2248,7 +2745,8 @@ + + @comment sys/socket.h + @comment BSD +-@deftypefun int send (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}) ++@deftypefun ssize_t send (int @var{socket}, const void *@var{buffer}, size_t @var{size}, int @var{flags}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{send} function is like @code{write}, but with the additional + flags @var{flags}. The possible values of @var{flags} are described + in @ref{Socket Data Options}. +@@ -2315,7 +2813,8 @@ + + @comment sys/socket.h + @comment BSD +-@deftypefun int recv (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}) ++@deftypefun ssize_t recv (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{recv} function is like @code{read}, but with the additional + flags @var{flags}. The possible values of @var{flags} are described + in @ref{Socket Data Options}. +@@ -2643,7 +3142,8 @@ + + @comment sys/socket.h + @comment BSD +-@deftypefun int sendto (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}, struct sockaddr *@var{addr}, socklen_t @var{length}) ++@deftypefun ssize_t sendto (int @var{socket}, const void *@var{buffer}, size_t @var{size}, int @var{flags}, struct sockaddr *@var{addr}, socklen_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{sendto} function transmits the data in the @var{buffer} + through the socket @var{socket} to the destination address specified + by the @var{addr} and @var{length} arguments. The @var{size} argument +@@ -2678,7 +3178,8 @@ + + @comment sys/socket.h + @comment BSD +-@deftypefun int recvfrom (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr}) ++@deftypefun ssize_t recvfrom (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{recvfrom} function reads one packet from the socket + @var{socket} into the buffer @var{buffer}. The @var{size} argument + specifies the maximum number of bytes to be read. +@@ -2725,7 +3226,8 @@ + + @comment sys/socket.h + @comment BSD +-@deftypefun int sendmsg (int @var{socket}, const struct msghdr *@var{message}, int @var{flags}) ++@deftypefun ssize_t sendmsg (int @var{socket}, const struct msghdr *@var{message}, int @var{flags}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + This function is defined as a cancellation point in multi-threaded + programs, so one has to be prepared for this and make sure that +@@ -2736,7 +3238,8 @@ + + @comment sys/socket.h + @comment BSD +-@deftypefun int recvmsg (int @var{socket}, struct msghdr *@var{message}, int @var{flags}) ++@deftypefun ssize_t recvmsg (int @var{socket}, struct msghdr *@var{message}, int @var{flags}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + This function is defined as a cancellation point in multi-threaded + programs, so one has to be prepared for this and make sure that +@@ -2924,6 +3427,7 @@ + @comment sys/socket.h + @comment BSD + @deftypefun int getsockopt (int @var{socket}, int @var{level}, int @var{optname}, void *@var{optval}, socklen_t *@var{optlen-ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getsockopt} function gets information about the value of + option @var{optname} at level @var{level} for socket @var{socket}. + +@@ -2953,7 +3457,8 @@ + + @comment sys/socket.h + @comment BSD +-@deftypefun int setsockopt (int @var{socket}, int @var{level}, int @var{optname}, void *@var{optval}, socklen_t @var{optlen}) ++@deftypefun int setsockopt (int @var{socket}, int @var{level}, int @var{optname}, const void *@var{optval}, socklen_t @var{optlen}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is used to set the socket option @var{optname} at level + @var{level} for socket @var{socket}. The value of the option is passed + in the buffer @var{optval} of size @var{optlen}. +@@ -3150,6 +3655,21 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct netent *} getnetbyname (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netbyname} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getnetbyname =~ getpwuid @mtasurace:netbyname @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getnetbyname_r dup @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getnetbyname_r =~ getpwuid_r @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c no nscd support ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c nss_networks_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_getnetbyname_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + The @code{getnetbyname} function returns information about the network + named @var{name}. It returns a null pointer if there is no such + network. +@@ -3157,7 +3677,21 @@ + + @comment netdb.h + @comment BSD +-@deftypefun {struct netent *} getnetbyaddr (unsigned long int @var{net}, int @var{type}) ++@deftypefun {struct netent *} getnetbyaddr (uint32_t @var{net}, int @var{type}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netbyaddr} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getnetbyaddr =~ getpwuid @mtasurace:netbyaddr @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getnetbyaddr_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getnetbyaddr_r =~ getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c no nscd support ++@c nss_networks_lookup2 =~ nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_getnetbyaddr_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + The @code{getnetbyaddr} function returns information about the network + of type @var{type} with number @var{net}. You should specify a value of + @code{AF_INET} for the @var{type} argument for Internet networks. +@@ -3173,6 +3707,17 @@ + @comment netdb.h + @comment BSD + @deftypefun void setnetent (int @var{stayopen}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c setnetent @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_setent(nss_networks_lookup2) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c setup(nss_networks_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *lookup_fct = nss_networks_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:netent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock dup @aculock + This function opens and rewinds the networks database. + + If the @var{stayopen} argument is nonzero, this sets a flag so that +@@ -3185,6 +3730,26 @@ + @comment netdb.h + @comment BSD + @deftypefun {struct netent *} getnetent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netent} @mtasurace{:netentbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getnetent @mtasurace:netent @mtasurace:netentbuf @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent(getnetent_r) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c malloc dup @ascuheap @acsmem ++@c *func = getnetent_r dup @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock ++@c ++@c getnetent_r @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent_r(nss_networks_lookup2) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c setup(nss_networks_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:servent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *sfct.f @mtasurace:netent @ascuplugin ++@c libc_lock_unlock dup @aculock + This function returns the next entry in the networks database. It + returns a null pointer if there are no more entries. + @end deftypefun +@@ -3192,5 +3757,14 @@ + @comment netdb.h + @comment BSD + @deftypefun void endnetent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netent} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c endnetent @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock @asulock @aculock ++@c nss_endent(nss_networks_lookup2) @mtasurace:netent @mtsenv @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c res_maybe_init(!preinit) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c setup(nss_networks_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:netent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock @aculock + This function closes the networks database. + @end deftypefun +diff -urN glibc-2.17-c758a686/manual/startup.texi glibc-2.17-c758a686/manual/startup.texi +--- glibc-2.17-c758a686/manual/startup.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/startup.texi 2014-09-12 16:10:06.042792724 -0400 +@@ -41,7 +41,7 @@ + * Program Termination:: Telling the system you're done; return status + @end menu + +-@node Program Arguments ++@node Program Arguments, Environment Variables, , Program Basics + @section Program Arguments + @cindex program arguments + @cindex command line arguments +@@ -220,7 +220,12 @@ + available. + + @comment stdlib.h +-@deftypefun int getsubopt (char **@var{optionp}, const char* const *@var{tokens}, char **@var{valuep}) ++@deftypefun int getsubopt (char **@var{optionp}, char *const *@var{tokens}, char **@var{valuep}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c getsubopt ok ++@c strchrnul dup ok ++@c memchr dup ok ++@c strncmp dup ok + + The @var{optionp} parameter must be a pointer to a variable containing + the address of the string to process. When the function returns the +@@ -258,7 +263,7 @@ + @end smallexample + + +-@node Environment Variables ++@node Environment Variables, Auxiliary Vector, Program Arguments, Program Basics + @section Environment Variables + + @cindex environment variable +@@ -322,6 +327,8 @@ + @comment stdlib.h + @comment ISO + @deftypefun {char *} getenv (const char *@var{name}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@assafe{}@acsafe{}} ++@c Unguarded access to __environ. + This function returns a string that is the value of the environment + variable @var{name}. You must not modify this string. In some non-Unix + systems not using @theglibc{}, it might be overwritten by subsequent +@@ -333,6 +340,8 @@ + @comment stdlib.h + @comment GNU + @deftypefun {char *} secure_getenv (const char *@var{name}) ++@safety{@prelim{}@mtsafe{@mtsenv{}}@assafe{}@acsafe{}} ++@c Calls getenv unless secure mode is enabled. + This function is similar to @code{getenv}, but it returns a null + pointer if the environment is untrusted. This happens when the + program file has SUID or SGID bits set. General-purpose libraries +@@ -346,6 +355,13 @@ + @comment stdlib.h + @comment SVID + @deftypefun int putenv (char *@var{string}) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c putenv @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c strchr dup ok ++@c strndup dup @ascuheap @acsmem ++@c add_to_environ dup @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c free dup @ascuheap @acsmem ++@c unsetenv dup @mtasuconst:@mtsenv @asulock @aculock + The @code{putenv} function adds or removes definitions from the environment. + If the @var{string} is of the form @samp{@var{name}=@var{value}}, the + definition is added to the environment. Otherwise, the @var{string} is +@@ -358,20 +374,37 @@ + The difference to the @code{setenv} function is that the exact string + given as the parameter @var{string} is put into the environment. If the + user should change the string after the @code{putenv} call this will +-reflect in automatically in the environment. This also requires that +-@var{string} is no automatic variable which scope is left before the ++reflect automatically in the environment. This also requires that ++@var{string} not be an automatic variable whose scope is left before the + variable is removed from the environment. The same applies of course to + dynamically allocated variables which are freed later. + +-This function is part of the extended Unix interface. Since it was also +-available in old SVID libraries you should define either +-@var{_XOPEN_SOURCE} or @var{_SVID_SOURCE} before including any header. ++This function is part of the extended Unix interface. You should define ++@var{_XOPEN_SOURCE} before including any header. + @end deftypefun + + + @comment stdlib.h + @comment BSD + @deftypefun int setenv (const char *@var{name}, const char *@var{value}, int @var{replace}) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c setenv @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c add_to_environ @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c strlen dup ok ++@c libc_lock_lock @asulock @aculock ++@c strncmp dup ok ++@c realloc dup @ascuheap @acsmem ++@c libc_lock_unlock @aculock ++@c malloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c mempcpy dup ok ++@c memcpy dup ok ++@c KNOWN_VALUE ok ++@c tfind(strcmp) [no @mtsrace guarded access] ++@c strcmp dup ok ++@c STORE_VALUE @ascuheap @acucorrupt @acsmem ++@c tsearch(strcmp) @ascuheap @acucorrupt @acsmem [no @mtsrace or @asucorrupt guarded access makes for mtsafe and @asulock] ++@c strcmp dup ok + The @code{setenv} function can be used to add a new definition to the + environment. The entry with the name @var{name} is replaced by the + value @samp{@var{name}=@var{value}}. Please note that this is also true +@@ -395,6 +428,13 @@ + @comment stdlib.h + @comment BSD + @deftypefun int unsetenv (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c unsetenv @mtasuconst:@mtsenv @asulock @aculock ++@c strchr dup ok ++@c strlen dup ok ++@c libc_lock_lock @asulock @aculock ++@c strncmp dup ok ++@c libc_lock_unlock @aculock + Using this function one can remove an entry completely from the + environment. If the environment contains an entry with the key + @var{name} this whole entry is removed. A call to this function is +@@ -418,6 +458,11 @@ + @comment stdlib.h + @comment GNU + @deftypefun int clearenv (void) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}} ++@c clearenv @mtasuconst:@mtsenv @ascuheap @asulock @aculock @acsmem ++@c libc_lock_lock @asulock @aculock ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock @aculock + The @code{clearenv} function removes all entries from the environment. + Using @code{putenv} and @code{setenv} new entries can be added again + later. +@@ -622,10 +667,13 @@ + @subsection Definition of @code{getauxval} + @comment sys/auxv.h + @deftypefun {unsigned long int} getauxval (unsigned long int @var{type}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Reads from hwcap or iterates over constant auxv. + This function is used to inquire about the entries in the auxiliary + vector. The @var{type} argument should be one of the @samp{AT_} symbols + defined in @file{elf.h}. If a matching entry is found, the value is +-returned; if the entry is not found, zero is returned. ++returned; if the entry is not found, zero is returned and @code{errno} is ++set to @code{ENOENT}. + @end deftypefun + + For some platforms, the key @code{AT_HWCAP} is the easiest way to inquire +@@ -677,6 +725,7 @@ + @comment unistd.h + @comment ??? + @deftypefun {long int} syscall (long int @var{sysno}, @dots{}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{syscall} performs a generic system call. + +@@ -782,6 +831,10 @@ + @comment stdlib.h + @comment ISO + @deftypefun void exit (int @var{status}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:exit}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} ++@c Access to the atexit/on_exit list, the libc_atexit hook and tls dtors ++@c is not guarded. Streams must be flushed, and that triggers the usual ++@c AS and AC issues with streams. + The @code{exit} function tells the system that the program is done, which + causes it to terminate the process. + +@@ -898,6 +951,15 @@ + @comment stdlib.h + @comment ISO + @deftypefun int atexit (void (*@var{function}) (void)) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}} ++@c atexit @ascuheap @asulock @aculock @acsmem ++@c cxa_atexit @ascuheap @asulock @aculock @acsmem ++@c __internal_atexit @ascuheap @asulock @aculock @acsmem ++@c __new_exitfn @ascuheap @asulock @aculock @acsmem ++@c __libc_lock_lock @asulock @aculock ++@c calloc dup @ascuheap @acsmem ++@c __libc_lock_unlock @aculock ++@c atomic_write_barrier dup ok + The @code{atexit} function registers the function @var{function} to be + called at normal program termination. The @var{function} is called with + no arguments. +@@ -909,6 +971,10 @@ + @comment stdlib.h + @comment SunOS + @deftypefun int on_exit (void (*@var{function})(int @var{status}, void *@var{arg}), void *@var{arg}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}} ++@c on_exit @ascuheap @asulock @aculock @acsmem ++@c new_exitfn dup @ascuheap @asulock @aculock @acsmem ++@c atomic_write_barrier dup ok + This function is a somewhat more powerful variant of @code{atexit}. It + accepts two arguments, a function @var{function} and an arbitrary + pointer @var{arg}. At normal program termination, the @var{function} is +@@ -940,6 +1006,10 @@ + @comment stdlib.h + @comment ISO + @deftypefun void abort (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} ++@c The implementation takes a recursive lock and attempts to support ++@c calls from signal handlers, but if we're in the middle of flushing or ++@c using streams, we may encounter them in inconsistent states. + The @code{abort} function causes abnormal program termination. This + does not execute cleanup functions registered with @code{atexit} or + @code{on_exit}. +@@ -967,6 +1037,9 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun void _exit (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall (exit_group or exit); calls __task_terminate on hurd, ++@c and abort in the generic posix implementation. + The @code{_exit} function is the primitive for causing a process to + terminate with status @var{status}. Calling this function does not + execute cleanup functions registered with @code{atexit} or +@@ -976,6 +1049,8 @@ + @comment stdlib.h + @comment ISO + @deftypefun void _Exit (int @var{status}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Alias for _exit. + The @code{_Exit} function is the @w{ISO C} equivalent to @code{_exit}. + The @w{ISO C} committee members were not sure whether the definitions of + @code{_exit} and @code{_Exit} were compatible so they have not used the +diff -urN glibc-2.17-c758a686/manual/stdio.texi glibc-2.17-c758a686/manual/stdio.texi +--- glibc-2.17-c758a686/manual/stdio.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/stdio.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -148,6 +148,8 @@ + @comment stdio.h + @comment ISO + @deftypefun {FILE *} fopen (const char *@var{filename}, const char *@var{opentype}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @acsfd{} @aculock{}}} ++@c fopen may leak the list lock if cancelled within _IO_link_in. + The @code{fopen} function opens a stream for I/O to the file + @var{filename}, and returns a pointer to the stream. + +@@ -265,9 +267,10 @@ + @comment stdio.h + @comment Unix98 + @deftypefun {FILE *} fopen64 (const char *@var{filename}, const char *@var{opentype}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @acsfd{} @aculock{}}} + This function is similar to @code{fopen} but the stream it returns a + pointer for is opened using @code{open64}. Therefore this stream can be +-used even on files larger then @math{2^31} bytes on 32 bit machines. ++used even on files larger than @math{2^31} bytes on 32 bit machines. + + Please note that the return type is still @code{FILE *}. There is no + special @code{FILE} type for the LFS interface. +@@ -294,6 +297,16 @@ + @comment stdio.h + @comment ISO + @deftypefun {FILE *} freopen (const char *@var{filename}, const char *@var{opentype}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @acsfd{}}} ++@c Like most I/O operations, this one is guarded by a recursive lock, ++@c released even upon cancellation, but cancellation may leak file ++@c descriptors and leave the stream in an inconsistent state (e.g., ++@c still bound to the closed descriptor). Also, if the stream is ++@c part-way through a significant update (say running freopen) when a ++@c signal handler calls freopen again on the same stream, the result is ++@c likely to be an inconsistent stream, and the possibility of closing ++@c twice file descriptor number that the stream used to use, the second ++@c time when it might have already been reused by another thread. + This function is like a combination of @code{fclose} and @code{fopen}. + It first closes the stream referred to by @var{stream}, ignoring any + errors that are detected in the process. (Because errors are ignored, +@@ -320,6 +333,7 @@ + @comment stdio.h + @comment Unix98 + @deftypefun {FILE *} freopen64 (const char *@var{filename}, const char *@var{opentype}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @acsfd{}}} + This function is similar to @code{freopen}. The only difference is that + on 32 bit machine the stream returned is able to read beyond the + @math{2^31} bytes limits imposed by the normal interface. It should be +@@ -341,6 +355,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun int __freadable (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{__freadable} function determines whether the stream + @var{stream} was opened to allow reading. In this case the return value + is nonzero. For write-only streams the function returns zero. +@@ -351,6 +366,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun int __fwritable (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{__fwritable} function determines whether the stream + @var{stream} was opened to allow writing. In this case the return value + is nonzero. For read-only streams the function returns zero. +@@ -364,6 +380,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun int __freading (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{__freading} function determines whether the stream + @var{stream} was last read from or whether it is opened read-only. In + this case the return value is nonzero, otherwise it is zero. +@@ -377,6 +394,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun int __fwriting (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{__fwriting} function determines whether the stream + @var{stream} was last written to or whether it is opened write-only. In + this case the return value is nonzero, otherwise it is zero. +@@ -396,6 +414,21 @@ + @comment stdio.h + @comment ISO + @deftypefun int fclose (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c After fclose, it is undefined behavior to use the stream it points ++@c to. Therefore, one must only call fclose when the stream is ++@c otherwise unused. Concurrent uses started before will complete ++@c successfully because of the lock, which makes it MT-Safe. Calling it ++@c from a signal handler is perfectly safe if the stream is known to be ++@c no longer used, which is a precondition for fclose to be safe in the ++@c first place; since this is no further requirement, fclose is safe for ++@c use in async signals too. After calling fclose, you can no longer ++@c use the stream, not even to fclose it again, so its memory and file ++@c descriptor may leak if fclose is canceled before @c releasing them. ++@c That the stream must be unused and it becomes unused after the call ++@c is what would enable fclose to be AS- and AC-Safe while freopen ++@c isn't. However, because of the possibility of leaving __gconv_lock ++@c taken upon cancellation, AC-Safety is lost. + This function causes @var{stream} to be closed and the connection to + the corresponding file to be broken. Any buffered output is written + and any buffered input is discarded. The @code{fclose} function returns +@@ -418,6 +451,12 @@ + @comment stdio.h + @comment GNU + @deftypefun int fcloseall (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:streams}}@asunsafe{}@acsafe{}} ++@c Like fclose, using any previously-opened streams after fcloseall is ++@c undefined. However, the implementation of fcloseall isn't equivalent ++@c to calling fclose for all streams: it just flushes and unbuffers all ++@c streams, without any locking. It's the flushing without locking that ++@c makes it unsafe. + This function causes all open streams of the process to be closed and + the connection to corresponding files to be broken. All buffered data + is written and any buffered input is discarded. The @code{fcloseall} +@@ -474,6 +513,9 @@ + @comment stdio.h + @comment POSIX + @deftypefun void flockfile (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}} ++@c There's no way to tell whether the lock was acquired before or after ++@c cancellation so as to unlock only when appropriate. + The @code{flockfile} function acquires the internal locking object + associated with the stream @var{stream}. This ensures that no other + thread can explicitly through @code{flockfile}/@code{ftrylockfile} or +@@ -485,6 +527,7 @@ + @comment stdio.h + @comment POSIX + @deftypefun int ftrylockfile (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}} + The @code{ftrylockfile} function tries to acquire the internal locking + object associated with the stream @var{stream} just like + @code{flockfile}. But unlike @code{flockfile} this function does not +@@ -496,8 +539,9 @@ + @comment stdio.h + @comment POSIX + @deftypefun void funlockfile (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}} + The @code{funlockfile} function releases the internal locking object of +-the stream @var{stream}. The stream must have been locked before by a ++the stream @var{stream}. The stream must have been locked before by a + call to @code{flockfile} or a successful call of @code{ftrylockfile}. + The implicit locking performed by the stream operations do not count. + The @code{funlockfile} function does not return an error status and the +@@ -621,6 +665,15 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun int __fsetlocking (FILE *@var{stream}, int @var{type}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asulock{}}@acsafe{}} ++@c Changing the implicit-locking status of a stream while it's in use by ++@c another thread may cause a lock to be implicitly acquired and not ++@c released, or vice-versa. This function should probably hold the lock ++@c while changing this setting, to make sure we don't change it while ++@c there are any concurrent uses. Meanwhile, callers should acquire the ++@c lock themselves to be safe, and even concurrent uses with external ++@c locking will be fine, as long as functions that require external ++@c locking are not called without holding locks. + + The @code{__fsetlocking} function can be used to select whether the + stream operations will implicitly acquire the locking object of the +@@ -725,6 +778,10 @@ + @comment wchar.h + @comment ISO + @deftypefun int fwide (FILE *@var{stream}, int @var{mode}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{}}} ++@c Querying is always safe, but changing the stream when it's in use ++@c upthread may be problematic. Like most lock-acquiring functions, ++@c this one may leak the lock if canceled. + + The @code{fwide} function can be used to set and query the state of the + orientation of the stream @var{stream}. If the @var{mode} parameter has +@@ -811,6 +868,16 @@ + @comment stdio.h + @comment ISO + @deftypefun int fputc (int @var{c}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} ++@c If the stream is in use when interrupted by a signal, the recursive ++@c lock won't help ensure the stream is consistent; indeed, if fputc ++@c gets a signal precisely before the post-incremented _IO_write_ptr ++@c value is stored, we may overwrite the interrupted write. Conversely, ++@c depending on compiler optimizations, the incremented _IO_write_ptr ++@c may be stored before the character is stored in the buffer, ++@c corrupting the stream if async cancel hits between the two stores. ++@c There may be other reasons for AS- and AC-unsafety in the overflow ++@c cases. + The @code{fputc} function converts the character @var{c} to type + @code{unsigned char}, and writes it to the stream @var{stream}. + @code{EOF} is returned if a write error occurs; otherwise the +@@ -820,6 +887,7 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t fputwc (wchar_t @var{wc}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} + The @code{fputwc} function writes the wide character @var{wc} to the + stream @var{stream}. @code{WEOF} is returned if a write error occurs; + otherwise the character @var{wc} is returned. +@@ -828,13 +896,18 @@ + @comment stdio.h + @comment POSIX + @deftypefun int fputc_unlocked (int @var{c}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} ++@c The unlocked functions can't possibly satisfy the MT-Safety ++@c requirements on their own, because they require external locking for ++@c safety. + The @code{fputc_unlocked} function is equivalent to the @code{fputc} + function except that it does not implicitly lock the stream. + @end deftypefun + + @comment wchar.h + @comment POSIX +-@deftypefun wint_t fputwc_unlocked (wint_t @var{wc}, FILE *@var{stream}) ++@deftypefun wint_t fputwc_unlocked (wchar_t @var{wc}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fputwc_unlocked} function is equivalent to the @code{fputwc} + function except that it does not implicitly lock the stream. + +@@ -844,6 +917,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int putc (int @var{c}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} + This is just like @code{fputc}, except that most systems implement it as + a macro, making it faster. One consequence is that it may evaluate the + @var{stream} argument more than once, which is an exception to the +@@ -854,6 +928,7 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t putwc (wchar_t @var{wc}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} + This is just like @code{fputwc}, except that it can be implement as + a macro, making it faster. One consequence is that it may evaluate the + @var{stream} argument more than once, which is an exception to the +@@ -864,6 +939,7 @@ + @comment stdio.h + @comment POSIX + @deftypefun int putc_unlocked (int @var{c}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{putc_unlocked} function is equivalent to the @code{putc} + function except that it does not implicitly lock the stream. + @end deftypefun +@@ -871,6 +947,7 @@ + @comment wchar.h + @comment GNU + @deftypefun wint_t putwc_unlocked (wchar_t @var{wc}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{putwc_unlocked} function is equivalent to the @code{putwc} + function except that it does not implicitly lock the stream. + +@@ -880,6 +957,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int putchar (int @var{c}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} + The @code{putchar} function is equivalent to @code{putc} with + @code{stdout} as the value of the @var{stream} argument. + @end deftypefun +@@ -887,6 +965,7 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t putwchar (wchar_t @var{wc}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} + The @code{putwchar} function is equivalent to @code{putwc} with + @code{stdout} as the value of the @var{stream} argument. + @end deftypefun +@@ -894,6 +973,7 @@ + @comment stdio.h + @comment POSIX + @deftypefun int putchar_unlocked (int @var{c}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:stdout}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{putchar_unlocked} function is equivalent to the @code{putchar} + function except that it does not implicitly lock the stream. + @end deftypefun +@@ -901,6 +981,7 @@ + @comment wchar.h + @comment GNU + @deftypefun wint_t putwchar_unlocked (wchar_t @var{wc}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:stdout}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{putwchar_unlocked} function is equivalent to the @code{putwchar} + function except that it does not implicitly lock the stream. + +@@ -910,6 +991,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int fputs (const char *@var{s}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} + The function @code{fputs} writes the string @var{s} to the stream + @var{stream}. The terminating null character is not written. + This function does @emph{not} add a newline character, either. +@@ -933,6 +1015,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int fputws (const wchar_t *@var{ws}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} + The function @code{fputws} writes the wide character string @var{ws} to + the stream @var{stream}. The terminating null character is not written. + This function does @emph{not} add a newline character, either. It +@@ -945,6 +1028,7 @@ + @comment stdio.h + @comment GNU + @deftypefun int fputs_unlocked (const char *@var{s}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fputs_unlocked} function is equivalent to the @code{fputs} + function except that it does not implicitly lock the stream. + +@@ -954,6 +1038,7 @@ + @comment wchar.h + @comment GNU + @deftypefun int fputws_unlocked (const wchar_t *@var{ws}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fputws_unlocked} function is equivalent to the @code{fputws} + function except that it does not implicitly lock the stream. + +@@ -963,6 +1048,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int puts (const char *@var{s}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{puts} function writes the string @var{s} to the stream + @code{stdout} followed by a newline. The terminating null character of + the string is not written. (Note that @code{fputs} does @emph{not} +@@ -982,6 +1068,7 @@ + @comment stdio.h + @comment SVID + @deftypefun int putw (int @var{w}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function writes the word @var{w} (that is, an @code{int}) to + @var{stream}. It is provided for compatibility with SVID, but we + recommend you use @code{fwrite} instead (@pxref{Block Input/Output}). +@@ -1014,6 +1101,11 @@ + @comment stdio.h + @comment ISO + @deftypefun int fgetc (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} ++@c Same caveats as fputc, but instead of losing a write in case of async ++@c signals, we may read the same character more than once, and the ++@c stream may be left in odd states due to cancellation in the underflow ++@c cases. + This function reads the next character as an @code{unsigned char} from + the stream @var{stream} and returns its value, converted to an + @code{int}. If an end-of-file condition or read error occurs, +@@ -1023,6 +1115,7 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t fgetwc (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function reads the next wide character from the stream @var{stream} + and returns its value. If an end-of-file condition or read error + occurs, @code{WEOF} is returned instead. +@@ -1031,6 +1124,7 @@ + @comment stdio.h + @comment POSIX + @deftypefun int fgetc_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fgetc_unlocked} function is equivalent to the @code{fgetc} + function except that it does not implicitly lock the stream. + @end deftypefun +@@ -1038,6 +1132,7 @@ + @comment wchar.h + @comment GNU + @deftypefun wint_t fgetwc_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fgetwc_unlocked} function is equivalent to the @code{fgetwc} + function except that it does not implicitly lock the stream. + +@@ -1047,6 +1142,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int getc (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This is just like @code{fgetc}, except that it is permissible (and + typical) for it to be implemented as a macro that evaluates the + @var{stream} argument more than once. @code{getc} is often highly +@@ -1057,6 +1153,7 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t getwc (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This is just like @code{fgetwc}, except that it is permissible for it to + be implemented as a macro that evaluates the @var{stream} argument more + than once. @code{getwc} can be highly optimized, so it is usually the +@@ -1066,6 +1163,7 @@ + @comment stdio.h + @comment POSIX + @deftypefun int getc_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{getc_unlocked} function is equivalent to the @code{getc} + function except that it does not implicitly lock the stream. + @end deftypefun +@@ -1073,6 +1171,7 @@ + @comment wchar.h + @comment GNU + @deftypefun wint_t getwc_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{getwc_unlocked} function is equivalent to the @code{getwc} + function except that it does not implicitly lock the stream. + +@@ -1082,6 +1181,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int getchar (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{getchar} function is equivalent to @code{getc} with @code{stdin} + as the value of the @var{stream} argument. + @end deftypefun +@@ -1089,6 +1189,7 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t getwchar (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{getwchar} function is equivalent to @code{getwc} with @code{stdin} + as the value of the @var{stream} argument. + @end deftypefun +@@ -1096,6 +1197,7 @@ + @comment stdio.h + @comment POSIX + @deftypefun int getchar_unlocked (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:stdin}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{getchar_unlocked} function is equivalent to the @code{getchar} + function except that it does not implicitly lock the stream. + @end deftypefun +@@ -1103,6 +1205,7 @@ + @comment wchar.h + @comment GNU + @deftypefun wint_t getwchar_unlocked (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:stdin}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{getwchar_unlocked} function is equivalent to the @code{getwchar} + function except that it does not implicitly lock the stream. + +@@ -1145,6 +1248,7 @@ + @comment stdio.h + @comment SVID + @deftypefun int getw (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function reads a word (that is, an @code{int}) from @var{stream}. + It's provided for compatibility with SVID. We recommend you use + @code{fread} instead (@pxref{Block Input/Output}). Unlike @code{getc}, +@@ -1173,6 +1277,12 @@ + @comment stdio.h + @comment GNU + @deftypefun ssize_t getline (char **@var{lineptr}, size_t *@var{n}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{}}} ++@c Besides the usual possibility of getting an inconsistent stream in a ++@c signal handler or leaving it inconsistent in case of cancellation, ++@c the possibility of leaving a dangling pointer upon cancellation ++@c between reallocing the buffer at *lineptr and updating the pointer ++@c brings about another case of @acucorrupt. + This function reads an entire line from @var{stream}, storing the text + (including the newline and a terminating null character) in a buffer + and storing the buffer address in @code{*@var{lineptr}}. +@@ -1188,7 +1298,8 @@ + + If you set @code{*@var{lineptr}} to a null pointer, and @code{*@var{n}} + to zero, before the call, then @code{getline} allocates the initial +-buffer for you by calling @code{malloc}. ++buffer for you by calling @code{malloc}. This buffer remains allocated ++even if @code{getline} encounters errors and is unable to read any bytes. + + In either case, when @code{getline} returns, @code{*@var{lineptr}} is + a @code{char *} which points to the text of the line. +@@ -1208,6 +1319,8 @@ + @comment stdio.h + @comment GNU + @deftypefun ssize_t getdelim (char **@var{lineptr}, size_t *@var{n}, int @var{delimiter}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{}}} ++@c See the getline @acucorrupt note. + This function is like @code{getline} except that the character which + tells it to stop reading is not necessarily newline. The argument + @var{delimiter} specifies the delimiter character; @code{getdelim} keeps +@@ -1232,6 +1345,7 @@ + @comment stdio.h + @comment ISO + @deftypefun {char *} fgets (char *@var{s}, int @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{fgets} function reads characters from the stream @var{stream} + up to and including a newline character and stores them in the string + @var{s}, adding a null character to mark the end of the string. You +@@ -1255,6 +1369,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} fgetws (wchar_t *@var{ws}, int @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{fgetws} function reads wide characters from the stream + @var{stream} up to and including a newline character and stores them in + the string @var{ws}, adding a null wide character to mark the end of the +@@ -1280,6 +1395,7 @@ + @comment stdio.h + @comment GNU + @deftypefun {char *} fgets_unlocked (char *@var{s}, int @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fgets_unlocked} function is equivalent to the @code{fgets} + function except that it does not implicitly lock the stream. + +@@ -1289,6 +1405,7 @@ + @comment wchar.h + @comment GNU + @deftypefun {wchar_t *} fgetws_unlocked (wchar_t *@var{ws}, int @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fgetws_unlocked} function is equivalent to the @code{fgetws} + function except that it does not implicitly lock the stream. + +@@ -1298,6 +1415,7 @@ + @comment stdio.h + @comment ISO + @deftypefn {Deprecated function} {char *} gets (char *@var{s}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The function @code{gets} reads characters from the stream @code{stdin} + up to the next newline character, and stores them in the string @var{s}. + The newline character is discarded (note that this differs from the +@@ -1388,6 +1506,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int ungetc (int @var{c}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{ungetc} function pushes back the character @var{c} onto the + input stream @var{stream}. So the next input from @var{stream} will + read @var{c} before anything else. +@@ -1425,6 +1544,7 @@ + @comment wchar.h + @comment ISO + @deftypefun wint_t ungetwc (wint_t @var{wc}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{ungetwc} function behaves just like @code{ungetc} just that it + pushes back a wide character. + @end deftypefun +@@ -1483,6 +1603,7 @@ + @comment stdio.h + @comment ISO + @deftypefun size_t fread (void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function reads up to @var{count} objects of size @var{size} into + the array @var{data}, from the stream @var{stream}. It returns the + number of objects actually read, which might be less than @var{count} if +@@ -1498,6 +1619,7 @@ + @comment stdio.h + @comment GNU + @deftypefun size_t fread_unlocked (void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fread_unlocked} function is equivalent to the @code{fread} + function except that it does not implicitly lock the stream. + +@@ -1507,6 +1629,7 @@ + @comment stdio.h + @comment ISO + @deftypefun size_t fwrite (const void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function writes up to @var{count} objects of size @var{size} from + the array @var{data}, to the stream @var{stream}. The return value is + normally @var{count}, if the call succeeds. Any other value indicates +@@ -1516,6 +1639,7 @@ + @comment stdio.h + @comment GNU + @deftypefun size_t fwrite_unlocked (const void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fwrite_unlocked} function is equivalent to the @code{fwrite} + function except that it does not implicitly lock the stream. + +@@ -1670,7 +1794,7 @@ + + @defvr Macro NL_ARGMAX + The value of @code{NL_ARGMAX} is the maximum value allowed for the +-specification of an positional parameter in a @code{printf} call. The ++specification of a positional parameter in a @code{printf} call. The + actual value in effect at runtime can be retrieved by using + @code{sysconf} using the @code{_SC_NL_ARGMAX} parameter @pxref{Sysconf + Definition}. +@@ -2257,6 +2381,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int printf (const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + The @code{printf} function prints the optional arguments under the + control of the template string @var{template} to the stream + @code{stdout}. It returns the number of characters printed, or a +@@ -2266,6 +2391,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int wprintf (const wchar_t *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + The @code{wprintf} function prints the optional arguments under the + control of the wide template string @var{template} to the stream + @code{stdout}. It returns the number of wide characters printed, or a +@@ -2275,6 +2401,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int fprintf (FILE *@var{stream}, const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is just like @code{printf}, except that the output is + written to the stream @var{stream} instead of @code{stdout}. + @end deftypefun +@@ -2282,6 +2409,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int fwprintf (FILE *@var{stream}, const wchar_t *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is just like @code{wprintf}, except that the output is + written to the stream @var{stream} instead of @code{stdout}. + @end deftypefun +@@ -2289,6 +2417,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int sprintf (char *@var{s}, const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is like @code{printf}, except that the output is stored in the character + array @var{s} instead of written to a stream. A null character is written + to mark the end of the string. +@@ -2313,6 +2442,7 @@ + @comment wchar.h + @comment GNU + @deftypefun int swprintf (wchar_t *@var{s}, size_t @var{size}, const wchar_t *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is like @code{wprintf}, except that the output is stored in the + wide character array @var{ws} instead of written to a stream. A null + wide character is written to mark the end of the string. The @var{size} +@@ -2330,13 +2460,14 @@ + parameters. @code{swprintf} in fact corresponds to the @code{snprintf} + function. Since the @code{sprintf} function can be dangerous and should + be avoided the @w{ISO C} committee refused to make the same mistake +-again and decided to not define an function exactly corresponding to ++again and decided to not define a function exactly corresponding to + @code{sprintf}. + @end deftypefun + + @comment stdio.h + @comment GNU + @deftypefun int snprintf (char *@var{s}, size_t @var{size}, const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{snprintf} function is similar to @code{sprintf}, except that + the @var{size} argument specifies the maximum number of characters to + produce. The trailing null character is counted towards this limit, so +@@ -2407,6 +2538,7 @@ + @comment stdio.h + @comment GNU + @deftypefun int asprintf (char **@var{ptr}, const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This function is similar to @code{sprintf}, except that it dynamically + allocates a string (as with @code{malloc}; @pxref{Unconstrained + Allocation}) to hold the output, instead of putting the output in a +@@ -2416,7 +2548,7 @@ + location. + + The return value is the number of characters allocated for the buffer, or +-less than zero if an error occurred. Usually this means that the buffer ++less than zero if an error occurred. Usually this means that the buffer + could not be allocated. + + Here is how to use @code{asprintf} to get the same result as the +@@ -2439,6 +2571,7 @@ + @comment stdio.h + @comment GNU + @deftypefun int obstack_printf (struct obstack *@var{obstack}, const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} + This function is similar to @code{asprintf}, except that it uses the + obstack @var{obstack} to allocate the space. @xref{Obstacks}. + +@@ -2509,6 +2642,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int vprintf (const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is similar to @code{printf} except that, instead of taking + a variable number of arguments directly, it takes an argument list + pointer @var{ap}. +@@ -2517,6 +2651,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int vwprintf (const wchar_t *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is similar to @code{wprintf} except that, instead of taking + a variable number of arguments directly, it takes an argument list + pointer @var{ap}. +@@ -2525,6 +2660,48 @@ + @comment stdio.h + @comment ISO + @deftypefun int vfprintf (FILE *@var{stream}, const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} ++@c Although vfprintf sets up a cleanup region to release the lock on the ++@c output stream, it doesn't use it to release args_value or string in ++@c case of cancellation. This doesn't make it unsafe, but cancelling it ++@c may leak memory. The unguarded use of __printf_function_table is ++@c also of concern for all callers. ++@c _itoa ok ++@c _udiv_qrnnd_preinv ok ++@c group_number ok ++@c _i18n_number_rewrite ++@c __wctrans ok ++@c __towctrans @mtslocale ++@c __wcrtomb ok? dup below ++@c outdigit_value ok ++@c outdigitwc_value ok ++@c outchar ok ++@c outstring ok ++@c PAD ok ++@c __printf_fp @mtslocale @ascuheap @acsmem ++@c __printf_fphex @mtslocale ++@c __readonly_area ++@c [GNU/Linux] fopen, strtoul, free ++@c __strerror_r ok if no translation, check otherwise ++@c __btowc ? gconv-modules ++@c __wcrtomb ok (not using internal state) gconv-modules ++@c ARGCHECK ++@c UNBUFFERED_P (tested before taking the stream lock) ++@c buffered_vfprintf ok ++@c __find_spec(wc|mb) ++@c read_int ++@c __libc_use_alloca ++@c process_arg ++@c process_string_arg ++@c extend_alloca ++@c __parse_one_spec(wc|mb) ++@c *__printf_arginfo_table unguarded ++@c __printf_va_arg_table-> unguarded ++@c *__printf_function_table unguarded ++@c done_add ++@c printf_unknown ++@c outchar ++@c _itoa_word + This is the equivalent of @code{fprintf} with the variable argument list + specified directly as for @code{vprintf}. + @end deftypefun +@@ -2532,6 +2709,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int vfwprintf (FILE *@var{stream}, const wchar_t *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This is the equivalent of @code{fwprintf} with the variable argument list + specified directly as for @code{vwprintf}. + @end deftypefun +@@ -2539,6 +2717,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int vsprintf (char *@var{s}, const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is the equivalent of @code{sprintf} with the variable argument list + specified directly as for @code{vprintf}. + @end deftypefun +@@ -2546,6 +2725,7 @@ + @comment wchar.h + @comment GNU + @deftypefun int vswprintf (wchar_t *@var{s}, size_t @var{size}, const wchar_t *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is the equivalent of @code{swprintf} with the variable argument list + specified directly as for @code{vwprintf}. + @end deftypefun +@@ -2553,6 +2733,7 @@ + @comment stdio.h + @comment GNU + @deftypefun int vsnprintf (char *@var{s}, size_t @var{size}, const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is the equivalent of @code{snprintf} with the variable argument list + specified directly as for @code{vprintf}. + @end deftypefun +@@ -2560,6 +2741,7 @@ + @comment stdio.h + @comment GNU + @deftypefun int vasprintf (char **@var{ptr}, const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{vasprintf} function is the equivalent of @code{asprintf} with the + variable argument list specified directly as for @code{vprintf}. + @end deftypefun +@@ -2567,6 +2749,10 @@ + @comment stdio.h + @comment GNU + @deftypefun int obstack_vprintf (struct obstack *@var{obstack}, const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtsrace{:obstack} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c The obstack is not guarded by mutexes, it might be at an inconsistent ++@c state within a signal handler, and it could be left at an ++@c inconsistent state in case of cancellation. + The @code{obstack_vprintf} function is the equivalent of + @code{obstack_printf} with the variable argument list specified directly + as for @code{vprintf}.@refill +@@ -2639,6 +2825,7 @@ + @comment printf.h + @comment GNU + @deftypefun size_t parse_printf_format (const char *@var{template}, size_t @var{n}, int *@var{argtypes}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + This function returns information about the number and types of + arguments expected by the @code{printf} template string @var{template}. + The information is stored in the array @var{argtypes}; each element of +@@ -2879,6 +3066,12 @@ + @comment printf.h + @comment GNU + @deftypefun int register_printf_function (int @var{spec}, printf_function @var{handler-function}, printf_arginfo_function @var{arginfo-function}) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:printfext}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @aculock{}}} ++@c This function is guarded by the global non-recursive libc lock, but ++@c users of the variables it sets aren't, and those should be MT-Safe, ++@c so we're ruling out the use of this extension with threads. Calling ++@c it from a signal handler may self-deadlock, and cancellation may ++@c leave the lock held, besides leaking allocated memory. + This function defines the conversion specifier character @var{spec}. + Thus, if @var{spec} is @code{'Y'}, it defines the conversion @samp{%Y}. + You can redefine the built-in conversions like @samp{%s}, but flag +@@ -3125,6 +3318,12 @@ + @comment printf.h + @comment GNU + @deftypefun int printf_size (FILE *@var{fp}, const struct printf_info *@var{info}, const void *const *@var{args}) ++@safety{@prelim{}@mtsafe{@mtsrace{:fp} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @acucorrupt{}}} ++@c This is meant to be called by vfprintf, that should hold the lock on ++@c the stream, but if this function is called directly, output will be ++@c racy, besides the uses of the global locale object while other ++@c threads may be changing it and the possbility of leaving the stream ++@c object in an inconsistent state in case of cancellation. + Print a given floating point number as for the format @code{%f} except + that there is a postfix character indicating the divisor for the + number to make this less than 1000. There are two possible divisors: +@@ -3183,6 +3382,7 @@ + @comment printf.h + @comment GNU + @deftypefun int printf_size_info (const struct printf_info *@var{info}, size_t @var{n}, int *@var{argtypes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function will return in @var{argtypes} the information about the + used parameters in the way the @code{vfprintf} implementation expects + it. The format always takes one argument. +@@ -3672,7 +3872,7 @@ + To read in characters that belong to an arbitrary set of your choice, + use the @samp{%[} conversion. You specify the set between the @samp{[} + character and a following @samp{]} character, using the same syntax used +-in regular expressions. As special cases: ++in regular expressions for explicit sets of characters. As special cases: + + @itemize @bullet + @item +@@ -3692,6 +3892,10 @@ + The @samp{%[} conversion does not skip over initial whitespace + characters. + ++Note that the @dfn{character class} syntax available in character sets ++that appear inside regular expressions (such as @samp{[:alpha:]}) is ++@emph{not} available in the @samp{%[} conversion. ++ + Here are some examples of @samp{%[} conversions and what they mean: + + @table @samp +@@ -3799,6 +4003,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int scanf (const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + The @code{scanf} function reads formatted input from the stream + @code{stdin} under the control of the template string @var{template}. + The optional arguments are pointers to the places which receive the +@@ -3813,6 +4018,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int wscanf (const wchar_t *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + The @code{wscanf} function reads formatted input from the stream + @code{stdin} under the control of the template string @var{template}. + The optional arguments are pointers to the places which receive the +@@ -3827,6 +4033,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int fscanf (FILE *@var{stream}, const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is just like @code{scanf}, except that the input is read + from the stream @var{stream} instead of @code{stdin}. + @end deftypefun +@@ -3834,6 +4041,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int fwscanf (FILE *@var{stream}, const wchar_t *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is just like @code{wscanf}, except that the input is read + from the stream @var{stream} instead of @code{stdin}. + @end deftypefun +@@ -3841,6 +4049,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int sscanf (const char *@var{s}, const char *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is like @code{scanf}, except that the characters are taken from the + null-terminated string @var{s} instead of from a stream. Reaching the + end of the string is treated as an end-of-file condition. +@@ -3853,7 +4062,8 @@ + + @comment wchar.h + @comment ISO +-@deftypefun int swscanf (const wchar_t *@var{ws}, const char *@var{template}, @dots{}) ++@deftypefun int swscanf (const wchar_t *@var{ws}, const wchar_t *@var{template}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is like @code{wscanf}, except that the characters are taken from the + null-terminated string @var{ws} instead of from a stream. Reaching the + end of the string is treated as an end-of-file condition. +@@ -3880,6 +4090,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int vscanf (const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is similar to @code{scanf}, but instead of taking + a variable number of arguments directly, it takes an argument list + pointer @var{ap} of type @code{va_list} (@pxref{Variadic Functions}). +@@ -3888,6 +4099,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int vwscanf (const wchar_t *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This function is similar to @code{wscanf}, but instead of taking + a variable number of arguments directly, it takes an argument list + pointer @var{ap} of type @code{va_list} (@pxref{Variadic Functions}). +@@ -3896,6 +4108,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int vfscanf (FILE *@var{stream}, const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This is the equivalent of @code{fscanf} with the variable argument list + specified directly as for @code{vscanf}. + @end deftypefun +@@ -3903,6 +4116,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int vfwscanf (FILE *@var{stream}, const wchar_t *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}} + This is the equivalent of @code{fwscanf} with the variable argument list + specified directly as for @code{vwscanf}. + @end deftypefun +@@ -3910,6 +4124,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int vsscanf (const char *@var{s}, const char *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is the equivalent of @code{sscanf} with the variable argument list + specified directly as for @code{vscanf}. + @end deftypefun +@@ -3917,6 +4132,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int vswscanf (const wchar_t *@var{s}, const wchar_t *@var{template}, va_list @var{ap}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This is the equivalent of @code{swscanf} with the variable argument list + specified directly as for @code{vwscanf}. + @end deftypefun +@@ -3966,6 +4182,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int feof (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}} + The @code{feof} function returns nonzero if and only if the end-of-file + indicator for the stream @var{stream} is set. + +@@ -3975,6 +4192,9 @@ + @comment stdio.h + @comment GNU + @deftypefun int feof_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c There isn't much of a thread unsafety risk in reading a flag word and ++@c testing a bit in it. + The @code{feof_unlocked} function is equivalent to the @code{feof} + function except that it does not implicitly lock the stream. + +@@ -3986,6 +4206,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int ferror (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}} + The @code{ferror} function returns nonzero if and only if the error + indicator for the stream @var{stream} is set, indicating that an error + has occurred on a previous operation on the stream. +@@ -3996,6 +4217,7 @@ + @comment stdio.h + @comment GNU + @deftypefun int ferror_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{ferror_unlocked} function is equivalent to the @code{ferror} + function except that it does not implicitly lock the stream. + +@@ -4023,6 +4245,7 @@ + @comment stdio.h + @comment ISO + @deftypefun void clearerr (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}} + This function clears the end-of-file and error indicators for the + stream @var{stream}. + +@@ -4033,6 +4256,7 @@ + @comment stdio.h + @comment GNU + @deftypefun void clearerr_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@assafe{}@acsafe{}} + The @code{clearerr_unlocked} function is equivalent to the @code{clearerr} + function except that it does not implicitly lock the stream. + +@@ -4146,6 +4370,7 @@ + @comment stdio.h + @comment ISO + @deftypefun {long int} ftell (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function returns the current file position of the stream + @var{stream}. + +@@ -4158,6 +4383,7 @@ + @comment stdio.h + @comment Unix98 + @deftypefun off_t ftello (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{ftello} function is similar to @code{ftell}, except that it + returns a value of type @code{off_t}. Systems which support this type + use it to describe all file positions, unlike the POSIX specification +@@ -4181,6 +4407,7 @@ + @comment stdio.h + @comment Unix98 + @deftypefun off64_t ftello64 (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function is similar to @code{ftello} with the only difference that + the return value is of type @code{off64_t}. This also requires that the + stream @var{stream} was opened using either @code{fopen64}, +@@ -4196,6 +4423,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int fseek (FILE *@var{stream}, long int @var{offset}, int @var{whence}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{fseek} function is used to change the file position of the + stream @var{stream}. The value of @var{whence} must be one of the + constants @code{SEEK_SET}, @code{SEEK_CUR}, or @code{SEEK_END}, to +@@ -4215,6 +4443,7 @@ + @comment stdio.h + @comment Unix98 + @deftypefun int fseeko (FILE *@var{stream}, off_t @var{offset}, int @var{whence}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function is similar to @code{fseek} but it corrects a problem with + @code{fseek} in a system with POSIX types. Using a value of type + @code{long int} for the offset is not compatible with POSIX. +@@ -4238,6 +4467,7 @@ + @comment stdio.h + @comment Unix98 + @deftypefun int fseeko64 (FILE *@var{stream}, off64_t @var{offset}, int @var{whence}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function is similar to @code{fseeko} with the only difference that + the @var{offset} parameter is of type @code{off64_t}. This also + requires that the stream @var{stream} was opened using either +@@ -4286,6 +4516,7 @@ + @comment stdio.h + @comment ISO + @deftypefun void rewind (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{rewind} function positions the stream @var{stream} at the + beginning of the file. It is equivalent to calling @code{fseek} or + @code{fseeko} on the @var{stream} with an @var{offset} argument of +@@ -4407,6 +4638,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int fgetpos (FILE *@var{stream}, fpos_t *@var{position}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function stores the value of the file position indicator for the + stream @var{stream} in the @code{fpos_t} object pointed to by + @var{position}. If successful, @code{fgetpos} returns zero; otherwise +@@ -4421,6 +4653,7 @@ + @comment stdio.h + @comment Unix98 + @deftypefun int fgetpos64 (FILE *@var{stream}, fpos64_t *@var{position}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function is similar to @code{fgetpos} but the file position is + returned in a variable of type @code{fpos64_t} to which @var{position} + points. +@@ -4433,6 +4666,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int fsetpos (FILE *@var{stream}, const fpos_t *@var{position}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function sets the file position indicator for the stream @var{stream} + to the position @var{position}, which must have been set by a previous + call to @code{fgetpos} on the same stream. If successful, @code{fsetpos} +@@ -4449,6 +4683,7 @@ + @comment stdio.h + @comment Unix98 + @deftypefun int fsetpos64 (FILE *@var{stream}, const fpos64_t *@var{position}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function is similar to @code{fsetpos} but the file position used + for positioning is provided in a variable of type @code{fpos64_t} to + which @var{position} points. +@@ -4560,6 +4795,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int fflush (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function causes any buffered output on @var{stream} to be delivered + to the file. If @var{stream} is a null pointer, then + @code{fflush} causes buffered output on @emph{all} open output streams +@@ -4572,6 +4808,7 @@ + @comment stdio.h + @comment POSIX + @deftypefun int fflush_unlocked (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{fflush_unlocked} function is equivalent to the @code{fflush} + function except that it does not implicitly lock the stream. + @end deftypefun +@@ -4588,6 +4825,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun void _flushlbf (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + The @code{_flushlbf} function flushes all line buffered streams + currently opened. + +@@ -4609,6 +4847,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun void __fpurge (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} + The @code{__fpurge} function causes the buffer of the stream + @var{stream} to be emptied. If the stream is currently in read mode all + input in the buffer is lost. If the stream is in output mode the +@@ -4633,6 +4872,7 @@ + @comment stdio.h + @comment ISO + @deftypefun int setvbuf (FILE *@var{stream}, char *@var{buf}, int @var{mode}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function is used to specify that the stream @var{stream} should + have the buffering mode @var{mode}, which can be either @code{_IOFBF} + (for full buffering), @code{_IOLBF} (for line buffering), or +@@ -4710,6 +4950,7 @@ + @comment stdio.h + @comment ISO + @deftypefun void setbuf (FILE *@var{stream}, char *@var{buf}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + If @var{buf} is a null pointer, the effect of this function is + equivalent to calling @code{setvbuf} with a @var{mode} argument of + @code{_IONBF}. Otherwise, it is equivalent to calling @code{setvbuf} +@@ -4723,6 +4964,7 @@ + @comment stdio.h + @comment BSD + @deftypefun void setbuffer (FILE *@var{stream}, char *@var{buf}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + If @var{buf} is a null pointer, this function makes @var{stream} unbuffered. + Otherwise, it makes @var{stream} fully buffered using @var{buf} as the + buffer. The @var{size} argument specifies the length of @var{buf}. +@@ -4734,6 +4976,7 @@ + @comment stdio.h + @comment BSD + @deftypefun void setlinebuf (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} + This function makes @var{stream} be line buffered, and allocates the + buffer for you. + +@@ -4748,6 +4991,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun int __flbf (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{__flbf} function will return a nonzero value in case the + stream @var{stream} is line buffered. Otherwise the return value is + zero. +@@ -4761,6 +5005,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun size_t __fbufsize (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acsafe{}} + The @code{__fbufsize} function return the size of the buffer in the + stream @var{stream}. This value can be used to optimize the use of the + stream. +@@ -4771,6 +5016,7 @@ + @comment stdio_ext.h + @comment GNU + @deftypefun size_t __fpending (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtsrace{:stream}}@asunsafe{@asucorrupt{}}@acsafe{}} + The @code{__fpending} + function returns the number of bytes currently in the output buffer. + For wide-oriented stream the measuring unit is wide characters. This +@@ -4818,6 +5064,10 @@ + @comment stdio.h + @comment GNU + @deftypefun {FILE *} fmemopen (void *@var{buf}, size_t @var{size}, const char *@var{opentype}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @aculock{}}} ++@c Unlike open_memstream, fmemopen does (indirectly) call _IO_link_in, ++@c bringing with it additional potential for async trouble with ++@c list_all_lock. + This function opens a stream that allows the access specified by the + @var{opentype} argument, that reads from or writes to the buffer specified + by the argument @var{buf}. This array must be at least @var{size} bytes long. +@@ -4870,6 +5120,7 @@ + @comment stdio.h + @comment GNU + @deftypefun {FILE *} open_memstream (char **@var{ptr}, size_t *@var{sizeloc}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This function opens a stream for writing to a buffer. The buffer is + allocated dynamically and grown as necessary, using @code{malloc}. + After you've closed the stream, this buffer is your responsibility to +@@ -4985,6 +5236,7 @@ + @comment stdio.h + @comment GNU + @deftypefun {FILE *} fopencookie (void *@var{cookie}, const char *@var{opentype}, cookie_io_functions_t @var{io-functions}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @aculock{}}} + This function actually creates the stream for communicating with the + @var{cookie} using the functions in the @var{io-functions} argument. + The @var{opentype} argument is interpreted as for @code{fopen}; +@@ -5053,26 +5305,26 @@ + + @comment stdio.h + @comment GNU +-@deftp {Data Type} cookie_read_function ++@deftp {Data Type} cookie_read_function_t + This is the data type that the read function for a custom stream should have. + If you declare the function as shown above, this is the type it will have. + @end deftp + + @comment stdio.h + @comment GNU +-@deftp {Data Type} cookie_write_function ++@deftp {Data Type} cookie_write_function_t + The data type of the write function for a custom stream. + @end deftp + + @comment stdio.h + @comment GNU +-@deftp {Data Type} cookie_seek_function ++@deftp {Data Type} cookie_seek_function_t + The data type of the seek function for a custom stream. + @end deftp + + @comment stdio.h + @comment GNU +-@deftp {Data Type} cookie_close_function ++@deftp {Data Type} cookie_close_function_t + The data type of the close function for a custom stream. + @end deftp + +@@ -5166,6 +5418,7 @@ + @comment fmtmsg.h + @comment XPG + @deftypefun int fmtmsg (long int @var{classification}, const char *@var{label}, int @var{severity}, const char *@var{text}, const char *@var{action}, const char *@var{tag}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acsafe{}} + Display a message described by its parameters on the device(s) specified + in the @var{classification} parameter. The @var{label} parameter + identifies the source of the message. The string should consist of two +@@ -5306,6 +5559,7 @@ + but this is toilsome. + + @deftypefun int addseverity (int @var{severity}, const char *@var{string}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}} + This function allows the introduction of new severity classes which can be + addressed by the @var{severity} parameter of the @code{fmtmsg} function. + The @var{severity} parameter of @code{addseverity} must match the value +diff -urN glibc-2.17-c758a686/manual/string.texi glibc-2.17-c758a686/manual/string.texi +--- glibc-2.17-c758a686/manual/string.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/string.texi 2014-09-12 16:10:06.045792717 -0400 +@@ -200,7 +200,7 @@ + @cindex parameter promotion + Some of the memory and string functions take single characters as + arguments. Since a value of type @code{char} is automatically promoted +-into an value of type @code{int} when used as a parameter, the functions ++into a value of type @code{int} when used as a parameter, the functions + are declared with @code{int} as the type of the parameter in question. + In case of the wide character function the situation is similarly: the + parameter type for a single wide character is @code{wint_t} and not +@@ -219,6 +219,7 @@ + @comment string.h + @comment ISO + @deftypefun size_t strlen (const char *@var{s}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strlen} function returns the length of the null-terminated + string @var{s} in bytes. (In other words, it returns the offset of the + terminating null character within the array.) +@@ -285,6 +286,7 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t wcslen (const wchar_t *@var{ws}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wcslen} function is the wide character equivalent to + @code{strlen}. The return value is the number of wide characters in the + wide character string pointed to by @var{ws} (this is also the offset of +@@ -300,6 +302,7 @@ + @comment string.h + @comment GNU + @deftypefun size_t strnlen (const char *@var{s}, size_t @var{maxlen}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strnlen} function returns the length of the string @var{s} in + bytes if this length is smaller than @var{maxlen} bytes. Otherwise it + returns @var{maxlen}. Therefore this function is equivalent to +@@ -322,6 +325,7 @@ + @comment wchar.h + @comment GNU + @deftypefun size_t wcsnlen (const wchar_t *@var{ws}, size_t @var{maxlen}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{wcsnlen} is the wide character equivalent to @code{strnlen}. The + @var{maxlen} parameter specifies the maximum number of wide characters. + +@@ -367,6 +371,7 @@ + @comment string.h + @comment ISO + @deftypefun {void *} memcpy (void *restrict @var{to}, const void *restrict @var{from}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{memcpy} function copies @var{size} bytes from the object + beginning at @var{from} into the object beginning at @var{to}. The + behavior of this function is undefined if the two arrays @var{to} and +@@ -388,6 +393,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wmemcpy (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wmemcpy} function copies @var{size} wide characters from the object + beginning at @var{wfrom} into the object beginning at @var{wto}. The + behavior of this function is undefined if the two arrays @var{wto} and +@@ -413,6 +419,7 @@ + @comment string.h + @comment GNU + @deftypefun {void *} mempcpy (void *restrict @var{to}, const void *restrict @var{from}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{mempcpy} function is nearly identical to the @code{memcpy} + function. It copies @var{size} bytes from the object beginning at + @code{from} into the object pointed to by @var{to}. But instead of +@@ -440,6 +447,7 @@ + @comment wchar.h + @comment GNU + @deftypefun {wchar_t *} wmempcpy (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wmempcpy} function is nearly identical to the @code{wmemcpy} + function. It copies @var{size} wide characters from the object + beginning at @code{wfrom} into the object pointed to by @var{wto}. But +@@ -468,6 +476,7 @@ + @comment string.h + @comment ISO + @deftypefun {void *} memmove (void *@var{to}, const void *@var{from}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{memmove} copies the @var{size} bytes at @var{from} into the + @var{size} bytes at @var{to}, even if those two blocks of space + overlap. In the case of overlap, @code{memmove} is careful to copy the +@@ -479,7 +488,8 @@ + + @comment wchar.h + @comment ISO +-@deftypefun {wchar_t *} wmemmove (wchar *@var{wto}, const wchar_t *@var{wfrom}, size_t @var{size}) ++@deftypefun {wchar_t *} wmemmove (wchar_t *@var{wto}, const wchar_t *@var{wfrom}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{wmemmove} copies the @var{size} wide characters at @var{wfrom} + into the @var{size} wide characters at @var{wto}, even if those two + blocks of space overlap. In the case of overlap, @code{memmove} is +@@ -507,6 +517,7 @@ + @comment string.h + @comment SVID + @deftypefun {void *} memccpy (void *restrict @var{to}, const void *restrict @var{from}, int @var{c}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function copies no more than @var{size} bytes from @var{from} to + @var{to}, stopping if a byte matching @var{c} is found. The return + value is a pointer into @var{to} one byte past where @var{c} was copied, +@@ -517,6 +528,7 @@ + @comment string.h + @comment ISO + @deftypefun {void *} memset (void *@var{block}, int @var{c}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function copies the value of @var{c} (converted to an + @code{unsigned char}) into each of the first @var{size} bytes of the + object beginning at @var{block}. It returns the value of @var{block}. +@@ -525,6 +537,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wmemset (wchar_t *@var{block}, wchar_t @var{wc}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function copies the value of @var{wc} into each of the first + @var{size} wide characters of the object beginning at @var{block}. It + returns the value of @var{block}. +@@ -533,6 +546,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strcpy (char *restrict @var{to}, const char *restrict @var{from}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This copies characters from the string @var{from} (up to and including + the terminating null character) into the string @var{to}. Like + @code{memcpy}, this function has undefined results if the strings +@@ -542,6 +556,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcscpy (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This copies wide characters from the string @var{wfrom} (up to and + including the terminating null wide character) into the string + @var{wto}. Like @code{wmemcpy}, this function has undefined results if +@@ -551,6 +566,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strncpy (char *restrict @var{to}, const char *restrict @var{from}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{strcpy} but always copies exactly + @var{size} characters into @var{to}. + +@@ -576,6 +592,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcsncpy (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{wcscpy} but always copies exactly + @var{size} wide characters into @var{wto}. + +@@ -602,6 +619,7 @@ + @comment string.h + @comment SVID + @deftypefun {char *} strdup (const char *@var{s}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This function copies the null-terminated string @var{s} into a newly + allocated string. The string is allocated using @code{malloc}; see + @ref{Unconstrained Allocation}. If @code{malloc} cannot allocate space +@@ -612,6 +630,7 @@ + @comment wchar.h + @comment GNU + @deftypefun {wchar_t *} wcsdup (const wchar_t *@var{ws}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This function copies the null-terminated wide character string @var{ws} + into a newly allocated string. The string is allocated using + @code{malloc}; see @ref{Unconstrained Allocation}. If @code{malloc} +@@ -625,6 +644,7 @@ + @comment string.h + @comment GNU + @deftypefun {char *} strndup (const char *@var{s}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + This function is similar to @code{strdup} but always copies at most + @var{size} characters into the newly allocated string. + +@@ -642,6 +662,7 @@ + @comment string.h + @comment Unknown origin + @deftypefun {char *} stpcpy (char *restrict @var{to}, const char *restrict @var{from}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is like @code{strcpy}, except that it returns a pointer to + the end of the string @var{to} (that is, the address of the terminating + null character @code{to + strlen (from)}) rather than the beginning. +@@ -664,6 +685,7 @@ + @comment wchar.h + @comment GNU + @deftypefun {wchar_t *} wcpcpy (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is like @code{wcscpy}, except that it returns a pointer to + the end of the string @var{wto} (that is, the address of the terminating + null character @code{wto + strlen (wfrom)}) rather than the beginning. +@@ -679,10 +701,11 @@ + @comment string.h + @comment GNU + @deftypefun {char *} stpncpy (char *restrict @var{to}, const char *restrict @var{from}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{stpcpy} but copies always exactly + @var{size} characters into @var{to}. + +-If the length of @var{from} is more then @var{size}, then @code{stpncpy} ++If the length of @var{from} is more than @var{size}, then @code{stpncpy} + copies just the first @var{size} characters and returns a pointer to the + character directly following the one which was copied last. Note that in + this case there is no null terminator written into @var{to}. +@@ -704,10 +727,11 @@ + @comment wchar.h + @comment GNU + @deftypefun {wchar_t *} wcpncpy (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{wcpcpy} but copies always exactly + @var{wsize} characters into @var{wto}. + +-If the length of @var{wfrom} is more then @var{size}, then ++If the length of @var{wfrom} is more than @var{size}, then + @code{wcpncpy} copies just the first @var{size} wide characters and + returns a pointer to the wide character directly following the last + non-null wide character which was copied last. Note that in this case +@@ -731,6 +755,7 @@ + @comment string.h + @comment GNU + @deftypefn {Macro} {char *} strdupa (const char *@var{s}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This macro is similar to @code{strdup} but allocates the new string + using @code{alloca} instead of @code{malloc} (@pxref{Variable Size + Automatic}). This means of course the returned string has the same +@@ -757,6 +782,7 @@ + @comment string.h + @comment GNU + @deftypefn {Macro} {char *} strndupa (const char *@var{s}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is similar to @code{strndup} but like @code{strdupa} it + allocates the new string using @code{alloca} + @pxref{Variable Size Automatic}. The same advantages and limitations +@@ -772,6 +798,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strcat (char *restrict @var{to}, const char *restrict @var{from}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strcat} function is similar to @code{strcpy}, except that the + characters from @var{from} are concatenated or appended to the end of + @var{to}, instead of overwriting it. That is, the first character from +@@ -794,6 +821,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcscat (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wcscat} function is similar to @code{wcscpy}, except that the + characters from @var{wfrom} are concatenated or appended to the end of + @var{wto}, instead of overwriting it. That is, the first character from +@@ -942,6 +970,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strncat (char *restrict @var{to}, const char *restrict @var{from}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is like @code{strcat} except that not more than @var{size} + characters from @var{from} are appended to the end of @var{to}. A + single null character is also always appended to @var{to}, so the total +@@ -955,8 +984,8 @@ + char * + strncat (char *to, const char *from, size_t size) + @{ +- to[strlen (to) + size] = '\0'; +- strncpy (to + strlen (to), from, size); ++ memcpy (to + strlen (to), from, strnlen (from, size)); ++ to[strlen (to) + strnlen (from, size)] = '\0'; + return to; + @} + @end group +@@ -968,6 +997,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcsncat (wchar_t *restrict @var{wto}, const wchar_t *restrict @var{wfrom}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is like @code{wcscat} except that not more than @var{size} + characters from @var{from} are appended to the end of @var{to}. A + single null character is also always appended to @var{to}, so the total +@@ -982,8 +1012,8 @@ + wcsncat (wchar_t *restrict wto, const wchar_t *restrict wfrom, + size_t size) + @{ +- wto[wcslen (to) + size] = L'\0'; +- wcsncpy (wto + wcslen (wto), wfrom, size); ++ memcpy (wto + wcslen (wto), wfrom, wcsnlen (wfrom, size) * sizeof (wchar_t)); ++ wto[wcslen (to) + wcsnlen (wfrom, size)] = '\0'; + return wto; + @} + @end group +@@ -1012,6 +1042,7 @@ + @comment string.h + @comment BSD + @deftypefun void bcopy (const void *@var{from}, void *@var{to}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is a partially obsolete alternative for @code{memmove}, derived from + BSD. Note that it is not quite equivalent to @code{memmove}, because the + arguments are not in the same order and there is no return value. +@@ -1020,6 +1051,7 @@ + @comment string.h + @comment BSD + @deftypefun void bzero (void *@var{block}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is a partially obsolete alternative for @code{memset}, derived from + BSD. Note that it is not as general as @code{memset}, because the only + value it can store is zero. +@@ -1055,6 +1087,7 @@ + @comment string.h + @comment ISO + @deftypefun int memcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function @code{memcmp} compares the @var{size} bytes of memory + beginning at @var{a1} against the @var{size} bytes of memory beginning + at @var{a2}. The value returned has the same sign as the difference +@@ -1065,9 +1098,10 @@ + @code{0}. + @end deftypefun + +-@comment wcjar.h ++@comment wchar.h + @comment ISO + @deftypefun int wmemcmp (const wchar_t *@var{a1}, const wchar_t *@var{a2}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function @code{wmemcmp} compares the @var{size} wide characters + beginning at @var{a1} against the @var{size} wide characters beginning + at @var{a2}. The value returned is smaller than or larger than zero +@@ -1120,6 +1154,7 @@ + @comment string.h + @comment ISO + @deftypefun int strcmp (const char *@var{s1}, const char *@var{s2}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strcmp} function compares the string @var{s1} against + @var{s2}, returning a value that has the same sign as the difference + between the first differing pair of characters (interpreted as +@@ -1139,6 +1174,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int wcscmp (const wchar_t *@var{ws1}, const wchar_t *@var{ws2}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + The @code{wcscmp} function compares the wide character string @var{ws1} + against @var{ws2}. The value returned is smaller than or larger than zero +@@ -1159,6 +1195,11 @@ + @comment string.h + @comment BSD + @deftypefun int strcasecmp (const char *@var{s1}, const char *@var{s2}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Although this calls tolower multiple times, it's a macro, and ++@c strcasecmp is optimized so that the locale pointer is read only once. ++@c There are some asm implementations too, for which the single-read ++@c from locale TLS pointers also applies. + This function is like @code{strcmp}, except that differences in case are + ignored. How uppercase and lowercase characters are related is + determined by the currently selected locale. In the standard @code{"C"} +@@ -1171,7 +1212,10 @@ + + @comment wchar.h + @comment GNU +-@deftypefun int wcscasecmp (const wchar_t *@var{ws1}, const wchar_T *@var{ws2}) ++@deftypefun int wcscasecmp (const wchar_t *@var{ws1}, const wchar_t *@var{ws2}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Since towlower is not a macro, the locale object may be read multiple ++@c times. + This function is like @code{wcscmp}, except that differences in case are + ignored. How uppercase and lowercase characters are related is + determined by the currently selected locale. In the standard @code{"C"} +@@ -1185,6 +1229,7 @@ + @comment string.h + @comment ISO + @deftypefun int strncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is the similar to @code{strcmp}, except that no more than + @var{size} characters are compared. In other words, if the two + strings are the same in their first @var{size} characters, the +@@ -1194,6 +1239,7 @@ + @comment wchar.h + @comment ISO + @deftypefun int wcsncmp (const wchar_t *@var{ws1}, const wchar_t *@var{ws2}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function is the similar to @code{wcscmp}, except that no more than + @var{size} wide characters are compared. In other words, if the two + strings are the same in their first @var{size} wide characters, the +@@ -1203,6 +1249,7 @@ + @comment string.h + @comment BSD + @deftypefun int strncasecmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + This function is like @code{strncmp}, except that differences in case + are ignored. Like @code{strcasecmp}, it is locale dependent how + uppercase and lowercase characters are related. +@@ -1214,6 +1261,7 @@ + @comment wchar.h + @comment GNU + @deftypefun int wcsncasecmp (const wchar_t *@var{ws1}, const wchar_t *@var{s2}, size_t @var{n}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} + This function is like @code{wcsncmp}, except that differences in case + are ignored. Like @code{wcscasecmp}, it is locale dependent how + uppercase and lowercase characters are related. +@@ -1247,6 +1295,8 @@ + @comment string.h + @comment GNU + @deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c Calls isdigit multiple times, locale may change in between. + The @code{strverscmp} function compares the string @var{s1} against + @var{s2}, considering them as holding indices/version numbers. The + return value follows the same conventions as found in the +@@ -1258,7 +1308,7 @@ + mode, where each sequence of digits is taken as a whole. If we reach the + end of these two parts without noticing a difference, we return to the + standard comparison mode. There are two types of numeric parts: +-"integral" and "fractional" (those begin with a '0'). The types ++"integral" and "fractional" (those begin with a '0'). The types + of the numeric parts affect the way we sort them: + + @itemize @bullet +@@ -1297,6 +1347,7 @@ + @comment string.h + @comment BSD + @deftypefun int bcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is an obsolete alias for @code{memcmp}, derived from BSD. + @end deftypefun + +@@ -1343,6 +1394,9 @@ + @comment string.h + @comment ISO + @deftypefun int strcoll (const char *@var{s1}, const char *@var{s2}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c Calls strcoll_l with the current locale, which dereferences only the ++@c LC_COLLATE data pointer. + The @code{strcoll} function is similar to @code{strcmp} but uses the + collating sequence of the current locale for collation (the + @code{LC_COLLATE} locale). +@@ -1351,6 +1405,8 @@ + @comment wchar.h + @comment ISO + @deftypefun int wcscoll (const wchar_t *@var{ws1}, const wchar_t *@var{ws2}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c Same as strcoll, but calling wcscoll_l. + The @code{wcscoll} function is similar to @code{wcscmp} but uses the + collating sequence of the current locale for collation (the + @code{LC_COLLATE} locale). +@@ -1370,7 +1426,7 @@ + compare_elements (const void *v1, const void *v2) + @{ + char * const *p1 = v1; +- char * const *p1 = v2; ++ char * const *p2 = v2; + + return strcoll (*p1, *p2); + @} +@@ -1391,6 +1447,7 @@ + @comment string.h + @comment ISO + @deftypefun size_t strxfrm (char *restrict @var{to}, const char *restrict @var{from}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The function @code{strxfrm} transforms the string @var{from} using the + collation transformation determined by the locale currently selected for + collation, and stores the transformed string in the array @var{to}. Up +@@ -1420,6 +1477,7 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t wcsxfrm (wchar_t *restrict @var{wto}, const wchar_t *@var{wfrom}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The function @code{wcsxfrm} transforms wide character string @var{wfrom} + using the collation transformation determined by the locale currently + selected for collation, and stores the transformed string in the array +@@ -1514,8 +1572,8 @@ + @} + + /* @r{Sort @code{temp_array} by comparing transformed strings.} */ +- qsort (temp_array, sizeof (struct sorter), +- nstrings, compare_elements); ++ qsort (temp_array, nstrings, ++ sizeof (struct sorter), compare_elements); + + /* @r{Put the elements back in the permanent array} + @r{in their sorted order.} */ +@@ -1579,6 +1637,7 @@ + @comment string.h + @comment ISO + @deftypefun {void *} memchr (const void *@var{block}, int @var{c}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function finds the first occurrence of the byte @var{c} (converted + to an @code{unsigned char}) in the initial @var{size} bytes of the + object beginning at @var{block}. The return value is a pointer to the +@@ -1588,6 +1647,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wmemchr (const wchar_t *@var{block}, wchar_t @var{wc}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function finds the first occurrence of the wide character @var{wc} + in the initial @var{size} wide characters of the object beginning at + @var{block}. The return value is a pointer to the located wide +@@ -1597,6 +1657,7 @@ + @comment string.h + @comment GNU + @deftypefun {void *} rawmemchr (const void *@var{block}, int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Often the @code{memchr} function is used with the knowledge that the + byte @var{c} is available in the memory block specified by the + parameters. But this means that the @var{size} parameter is not really +@@ -1627,6 +1688,7 @@ + @comment string.h + @comment GNU + @deftypefun {void *} memrchr (const void *@var{block}, int @var{c}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function @code{memrchr} is like @code{memchr}, except that it searches + backwards from the end of the block defined by @var{block} and @var{size} + (instead of forwards from the front). +@@ -1637,6 +1699,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strchr (const char *@var{string}, int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strchr} function finds the first occurrence of the character + @var{c} (converted to a @code{char}) in the null-terminated string + beginning at @var{string}. The return value is a pointer to the located +@@ -1663,6 +1726,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcschr (const wchar_t *@var{wstring}, int @var{wc}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wcschr} function finds the first occurrence of the wide + character @var{wc} in the null-terminated wide character string + beginning at @var{wstring}. The return value is a pointer to the +@@ -1678,6 +1742,7 @@ + @comment string.h + @comment GNU + @deftypefun {char *} strchrnul (const char *@var{string}, int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{strchrnul} is the same as @code{strchr} except that if it does + not find the character, it returns a pointer to string's terminating + null character rather than a null pointer. +@@ -1688,6 +1753,7 @@ + @comment wchar.h + @comment GNU + @deftypefun {wchar_t *} wcschrnul (const wchar_t *@var{wstring}, wchar_t @var{wc}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{wcschrnul} is the same as @code{wcschr} except that if it does not + find the wide character, it returns a pointer to wide character string's + terminating null wide character rather than a null pointer. +@@ -1723,6 +1789,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strrchr (const char *@var{string}, int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function @code{strrchr} is like @code{strchr}, except that it searches + backwards from the end of the string @var{string} (instead of forwards + from the front). +@@ -1737,6 +1804,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcsrchr (const wchar_t *@var{wstring}, wchar_t @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The function @code{wcsrchr} is like @code{wcschr}, except that it searches + backwards from the end of the string @var{wstring} (instead of forwards + from the front). +@@ -1745,6 +1813,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strstr (const char *@var{haystack}, const char *@var{needle}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is like @code{strchr}, except that it searches @var{haystack} for a + substring @var{needle} rather than just a single character. It + returns a pointer into the string @var{haystack} that is the first +@@ -1763,6 +1832,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcsstr (const wchar_t *@var{haystack}, const wchar_t *@var{needle}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is like @code{wcschr}, except that it searches @var{haystack} for a + substring @var{needle} rather than just a single wide character. It + returns a pointer into the string @var{haystack} that is the first wide +@@ -1773,7 +1843,8 @@ + @comment wchar.h + @comment XPG + @deftypefun {wchar_t *} wcswcs (const wchar_t *@var{haystack}, const wchar_t *@var{needle}) +-@code{wcswcs} is an deprecated alias for @code{wcsstr}. This is the ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@code{wcswcs} is a deprecated alias for @code{wcsstr}. This is the + name originally used in the X/Open Portability Guide before the + @w{Amendment 1} to @w{ISO C90} was published. + @end deftypefun +@@ -1782,6 +1853,9 @@ + @comment string.h + @comment GNU + @deftypefun {char *} strcasestr (const char *@var{haystack}, const char *@var{needle}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c There may be multiple calls of strncasecmp, each accessing the locale ++@c object independently. + This is like @code{strstr}, except that it ignores case in searching for + the substring. Like @code{strcasecmp}, it is locale dependent how + uppercase and lowercase characters are related. +@@ -1800,6 +1874,7 @@ + @comment string.h + @comment GNU + @deftypefun {void *} memmem (const void *@var{haystack}, size_t @var{haystack-len},@*const void *@var{needle}, size_t @var{needle-len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This is like @code{strstr}, but @var{needle} and @var{haystack} are byte + arrays rather than null-terminated strings. @var{needle-len} is the + length of @var{needle} and @var{haystack-len} is the length of +@@ -1811,6 +1886,7 @@ + @comment string.h + @comment ISO + @deftypefun size_t strspn (const char *@var{string}, const char *@var{skipset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strspn} (``string span'') function returns the length of the + initial substring of @var{string} that consists entirely of characters that + are members of the set specified by the string @var{skipset}. The order +@@ -1831,6 +1907,7 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t wcsspn (const wchar_t *@var{wstring}, const wchar_t *@var{skipset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wcsspn} (``wide character string span'') function returns the + length of the initial substring of @var{wstring} that consists entirely + of wide characters that are members of the set specified by the string +@@ -1841,6 +1918,7 @@ + @comment string.h + @comment ISO + @deftypefun size_t strcspn (const char *@var{string}, const char *@var{stopset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strcspn} (``string complement span'') function returns the length + of the initial substring of @var{string} that consists entirely of characters + that are @emph{not} members of the set specified by the string @var{stopset}. +@@ -1862,6 +1940,7 @@ + @comment wchar.h + @comment ISO + @deftypefun size_t wcscspn (const wchar_t *@var{wstring}, const wchar_t *@var{stopset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wcscspn} (``wide character string complement span'') function + returns the length of the initial substring of @var{wstring} that + consists entirely of wide characters that are @emph{not} members of the +@@ -1873,6 +1952,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strpbrk (const char *@var{string}, const char *@var{stopset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{strpbrk} (``string pointer break'') function is related to + @code{strcspn}, except that it returns a pointer to the first character + in @var{string} that is a member of the set @var{stopset} instead of the +@@ -1897,6 +1977,7 @@ + @comment wchar.h + @comment ISO + @deftypefun {wchar_t *} wcspbrk (const wchar_t *@var{wstring}, const wchar_t *@var{stopset}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{wcspbrk} (``wide character string pointer break'') function is + related to @code{wcscspn}, except that it returns a pointer to the first + wide character in @var{wstring} that is a member of the set +@@ -1910,6 +1991,7 @@ + @comment string.h + @comment BSD + @deftypefun {char *} index (const char *@var{string}, int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{index} is another name for @code{strchr}; they are exactly the same. + New code should always use @code{strchr} since this name is defined in + @w{ISO C} while @code{index} is a BSD invention which never was available +@@ -1919,6 +2001,7 @@ + @comment string.h + @comment BSD + @deftypefun {char *} rindex (const char *@var{string}, int @var{c}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{rindex} is another name for @code{strrchr}; they are exactly the same. + New code should always use @code{strrchr} since this name is defined in + @w{ISO C} while @code{rindex} is a BSD invention which never was available +@@ -1940,6 +2023,7 @@ + @comment string.h + @comment ISO + @deftypefun {char *} strtok (char *restrict @var{newstring}, const char *restrict @var{delimiters}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:strtok}}@asunsafe{}@acsafe{}} + A string can be split into tokens by making a series of calls to the + function @code{strtok}. + +@@ -1978,7 +2062,8 @@ + + @comment wchar.h + @comment ISO +-@deftypefun {wchar_t *} wcstok (wchar_t *@var{newstring}, const char *@var{delimiters}) ++@deftypefun {wchar_t *} wcstok (wchar_t *@var{newstring}, const wchar_t *@var{delimiters}, wchar_t **@var{save_ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + A string can be split into tokens by making a series of calls to the + function @code{wcstok}. + +@@ -1986,11 +2071,8 @@ + the first call only. The @code{wcstok} function uses this to set up + some internal state information. Subsequent calls to get additional + tokens from the same wide character string are indicated by passing a +-null pointer as the @var{newstring} argument. Calling @code{wcstok} +-with another non-null @var{newstring} argument reinitializes the state +-information. It is guaranteed that no other library function ever calls +-@code{wcstok} behind your back (which would mess up this internal state +-information). ++null pointer as the @var{newstring} argument, which causes the pointer ++previously stored in @var{save_ptr} to be used instead. + + The @var{delimiters} argument is a wide character string that specifies + a set of delimiters that may surround the token being extracted. All +@@ -1999,8 +2081,10 @@ + delimiters marks the beginning of the next token. The end of the token + is found by looking for the next wide character that is a member of the + delimiter set. This wide character in the original wide character +-string @var{newstring} is overwritten by a null wide character, and the +-pointer to the beginning of the token in @var{newstring} is returned. ++string @var{newstring} is overwritten by a null wide character, the ++pointer past the overwritten wide character is saved in @var{save_ptr}, ++and the pointer to the beginning of the token in @var{newstring} is ++returned. + + On the next call to @code{wcstok}, the searching begins at the next + wide character beyond the one that marked the end of the previous token. +@@ -2010,11 +2094,6 @@ + If the end of the wide character string @var{newstring} is reached, or + if the remainder of string consists only of delimiter wide characters, + @code{wcstok} returns a null pointer. +- +-Note that ``character'' is here used in the sense of byte. In a string +-using a multibyte character encoding (abstract) character consisting of +-more than one byte are not treated as an entity. Each byte is treated +-separately. The function is not locale-dependent. + @end deftypefun + + @strong{Warning:} Since @code{strtok} and @code{wcstok} alter the string +@@ -2039,7 +2118,7 @@ + structure, then it is error-prone to modify the data structure + temporarily. + +-The functions @code{strtok} and @code{wcstok} are not reentrant. ++The function @code{strtok} is not reentrant, whereas @code{wcstok} is. + @xref{Nonreentrancy}, for a discussion of where and why reentrancy is + important. + +@@ -2075,13 +2154,15 @@ + @comment string.h + @comment POSIX + @deftypefun {char *} strtok_r (char *@var{newstring}, const char *@var{delimiters}, char **@var{save_ptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Just like @code{strtok}, this function splits the string into several + tokens which can be accessed by successive calls to @code{strtok_r}. +-The difference is that the information about the next token is stored in +-the space pointed to by the third argument, @var{save_ptr}, which is a +-pointer to a string pointer. Calling @code{strtok_r} with a null +-pointer for @var{newstring} and leaving @var{save_ptr} between the calls +-unchanged does the job without hindering reentrancy. ++The difference is that, as in @code{wcstok}, the information about the ++next token is stored in the space pointed to by the third argument, ++@var{save_ptr}, which is a pointer to a string pointer. Calling ++@code{strtok_r} with a null pointer for @var{newstring} and leaving ++@var{save_ptr} between the calls unchanged does the job without ++hindering reentrancy. + + This function is defined in POSIX.1 and can be found on many systems + which support multi-threading. +@@ -2090,6 +2171,7 @@ + @comment string.h + @comment BSD + @deftypefun {char *} strsep (char **@var{string_ptr}, const char *@var{delimiter}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function has a similar functionality as @code{strtok_r} with the + @var{newstring} argument replaced by the @var{save_ptr} argument. The + initialization of the moving pointer has to be done by the user. +@@ -2141,6 +2223,7 @@ + @comment string.h + @comment GNU + @deftypefun {char *} basename (const char *@var{filename}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The GNU version of the @code{basename} function returns the last + component of the path in @var{filename}. This function is the preferred + usage, since it does not modify the argument, @var{filename}, and +@@ -2175,8 +2258,9 @@ + + @comment libgen.h + @comment XPG +-@deftypefun {char *} basename (char *@var{path}) +-This is the standard XPG defined @code{basename}. It is similar in ++@deftypefun {char *} basename (const char *@var{path}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++This is the standard XPG defined @code{basename}. It is similar in + spirit to the GNU version, but may modify the @var{path} by removing + trailing '/' characters. If the @var{path} is made up entirely of '/' + characters, then "/" will be returned. Also, if @var{path} is +@@ -2211,6 +2295,7 @@ + @comment libgen.h + @comment XPG + @deftypefun {char *} dirname (char *@var{path}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{dirname} function is the compliment to the XPG version of + @code{basename}. It returns the parent directory of the file specified + by @var{path}. If @var{path} is @code{NULL}, an empty string, or +@@ -2233,6 +2318,8 @@ + @comment string.h + @comment GNU + @deftypefun {char *} strfry (char *@var{string}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Calls initstate_r, time, getpid, strlen, and random_r. + + @code{strfry} creates a pseudorandom anagram of a string, replacing the + input with the anagram in place. For each position in the string, +@@ -2268,6 +2355,7 @@ + @comment string.h + @comment GNU + @deftypefun {void *} memfrob (void *@var{mem}, size_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + + @code{memfrob} transforms (frobnicates) each byte of the data structure + at @var{mem}, which is @var{length} bytes long, by bitwise exclusive +@@ -2291,13 +2379,14 @@ + + To store or transfer binary data in environments which only support text + one has to encode the binary data by mapping the input bytes to +-characters in the range allowed for storing or transfering. SVID ++characters in the range allowed for storing or transferring. SVID + systems (and nowadays XPG compliant systems) provide minimal support for + this task. + + @comment stdlib.h + @comment XPG + @deftypefun {char *} l64a (long int @var{n}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:l64a}}@asunsafe{}@acsafe{}} + This function encodes a 32-bit input value using characters from the + basic character set. It returns a pointer to a 7 character buffer which + contains an encoded version of @var{n}. To encode a series of bytes the +@@ -2373,6 +2462,7 @@ + @comment stdlib.h + @comment XPG + @deftypefun {long int} a64l (const char *@var{string}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The parameter @var{string} should contain a string which was produced by + a call to @code{l64a}. The function processes at least 6 characters of + this string, and decodes the characters it finds according to the table +@@ -2459,6 +2549,7 @@ + @comment argz.h + @comment GNU + @deftypefun {error_t} argz_create (char *const @var{argv}[], char **@var{argz}, size_t *@var{argz_len}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{argz_create} function converts the Unix-style argument vector + @var{argv} (a vector of pointers to normal C strings, terminated by + @code{(char *)0}; @pxref{Program Arguments}) into an argz vector with +@@ -2468,6 +2559,7 @@ + @comment argz.h + @comment GNU + @deftypefun {error_t} argz_create_sep (const char *@var{string}, int @var{sep}, char **@var{argz}, size_t *@var{argz_len}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{argz_create_sep} function converts the null-terminated string + @var{string} into an argz vector (returned in @var{argz} and + @var{argz_len}) by splitting it into elements at every occurrence of the +@@ -2477,13 +2569,15 @@ + @comment argz.h + @comment GNU + @deftypefun {size_t} argz_count (const char *@var{argz}, size_t @var{arg_len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + Returns the number of elements in the argz vector @var{argz} and + @var{argz_len}. + @end deftypefun + + @comment argz.h + @comment GNU +-@deftypefun {void} argz_extract (char *@var{argz}, size_t @var{argz_len}, char **@var{argv}) ++@deftypefun {void} argz_extract (const char *@var{argz}, size_t @var{argz_len}, char **@var{argv}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{argz_extract} function converts the argz vector @var{argz} and + @var{argz_len} into a Unix-style argument vector stored in @var{argv}, + by putting pointers to every element in @var{argz} into successive +@@ -2501,6 +2595,7 @@ + @comment argz.h + @comment GNU + @deftypefun {void} argz_stringify (char *@var{argz}, size_t @var{len}, int @var{sep}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{argz_stringify} converts @var{argz} into a normal string with + the elements separated by the character @var{sep}, by replacing each + @code{'\0'} inside @var{argz} (except the last one, which terminates the +@@ -2511,6 +2606,8 @@ + @comment argz.h + @comment GNU + @deftypefun {error_t} argz_add (char **@var{argz}, size_t *@var{argz_len}, const char *@var{str}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c Calls strlen and argz_append. + The @code{argz_add} function adds the string @var{str} to the end of the + argz vector @code{*@var{argz}}, and updates @code{*@var{argz}} and + @code{*@var{argz_len}} accordingly. +@@ -2519,6 +2616,7 @@ + @comment argz.h + @comment GNU + @deftypefun {error_t} argz_add_sep (char **@var{argz}, size_t *@var{argz_len}, const char *@var{str}, int @var{delim}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{argz_add_sep} function is similar to @code{argz_add}, but + @var{str} is split into separate elements in the result at occurrences of + the character @var{delim}. This is useful, for instance, for +@@ -2529,6 +2627,7 @@ + @comment argz.h + @comment GNU + @deftypefun {error_t} argz_append (char **@var{argz}, size_t *@var{argz_len}, const char *@var{buf}, size_t @var{buf_len}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{argz_append} function appends @var{buf_len} bytes starting at + @var{buf} to the argz vector @code{*@var{argz}}, reallocating + @code{*@var{argz}} to accommodate it, and adding @var{buf_len} to +@@ -2538,6 +2637,8 @@ + @comment argz.h + @comment GNU + @deftypefun {void} argz_delete (char **@var{argz}, size_t *@var{argz_len}, char *@var{entry}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c Calls free if no argument is left. + If @var{entry} points to the beginning of one of the elements in the + argz vector @code{*@var{argz}}, the @code{argz_delete} function will + remove this entry and reallocate @code{*@var{argz}}, modifying +@@ -2549,6 +2650,8 @@ + @comment argz.h + @comment GNU + @deftypefun {error_t} argz_insert (char **@var{argz}, size_t *@var{argz_len}, char *@var{before}, const char *@var{entry}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c Calls argz_add or realloc and memmove. + The @code{argz_insert} function inserts the string @var{entry} into the + argz vector @code{*@var{argz}} at a point just before the existing + element pointed to by @var{before}, reallocating @code{*@var{argz}} and +@@ -2561,7 +2664,8 @@ + + @comment argz.h + @comment GNU +-@deftypefun {char *} argz_next (char *@var{argz}, size_t @var{argz_len}, const char *@var{entry}) ++@deftypefun {char *} argz_next (const char *@var{argz}, size_t @var{argz_len}, const char *@var{entry}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{argz_next} function provides a convenient way of iterating + over the elements in the argz vector @var{argz}. It returns a pointer + to the next element in @var{argz} after the element @var{entry}, or +@@ -2595,6 +2699,7 @@ + @comment argz.h + @comment GNU + @deftypefun error_t argz_replace (@w{char **@var{argz}, size_t *@var{argz_len}}, @w{const char *@var{str}, const char *@var{with}}, @w{unsigned *@var{replace_count}}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + Replace any occurrences of the string @var{str} in @var{argz} with + @var{with}, reallocating @var{argz} as necessary. If + @var{replace_count} is non-zero, @code{*@var{replace_count}} will be +@@ -2630,6 +2735,7 @@ + @comment envz.h + @comment GNU + @deftypefun {char *} envz_entry (const char *@var{envz}, size_t @var{envz_len}, const char *@var{name}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{envz_entry} function finds the entry in @var{envz} with the name + @var{name}, and returns a pointer to the whole entry---that is, the argz + element which begins with @var{name} followed by a @code{'='} character. If +@@ -2639,6 +2745,7 @@ + @comment envz.h + @comment GNU + @deftypefun {char *} envz_get (const char *@var{envz}, size_t @var{envz_len}, const char *@var{name}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{envz_get} function finds the entry in @var{envz} with the name + @var{name} (like @code{envz_entry}), and returns a pointer to the value + portion of that entry (following the @code{'='}). If there is no entry with +@@ -2648,6 +2755,9 @@ + @comment envz.h + @comment GNU + @deftypefun {error_t} envz_add (char **@var{envz}, size_t *@var{envz_len}, const char *@var{name}, const char *@var{value}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} ++@c Calls envz_remove, which calls enz_entry and argz_delete, and then ++@c argz_add or equivalent code that reallocs and appends name=value. + The @code{envz_add} function adds an entry to @code{*@var{envz}} + (updating @code{*@var{envz}} and @code{*@var{envz_len}}) with the name + @var{name}, and value @var{value}. If an entry with the same name +@@ -2659,6 +2769,7 @@ + @comment envz.h + @comment GNU + @deftypefun {error_t} envz_merge (char **@var{envz}, size_t *@var{envz_len}, const char *@var{envz2}, size_t @var{envz2_len}, int @var{override}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} + The @code{envz_merge} function adds each entry in @var{envz2} to @var{envz}, + as if with @code{envz_add}, updating @code{*@var{envz}} and + @code{*@var{envz_len}}. If @var{override} is true, then values in @var{envz2} +@@ -2672,6 +2783,10 @@ + @comment envz.h + @comment GNU + @deftypefun {void} envz_strip (char **@var{envz}, size_t *@var{envz_len}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{envz_strip} function removes any null entries from @var{envz}, + updating @code{*@var{envz}} and @code{*@var{envz_len}}. + @end deftypefun ++ ++@c FIXME this are undocumented: ++@c strcasecmp_l @safety{@mtsafe{}@assafe{}@acsafe{}} see strcasecmp +diff -urN glibc-2.17-c758a686/manual/summary.awk glibc-2.17-c758a686/manual/summary.awk +--- glibc-2.17-c758a686/manual/summary.awk 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/summary.awk 2014-09-12 16:10:06.042792724 -0400 +@@ -1,5 +1,5 @@ + # awk script to create summary.texinfo from the library texinfo files. +-# Copyright (C) 1992, 1993, 1997, 2001 Free Software Foundation, Inc. ++# Copyright (C) 1992-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 +diff -urN glibc-2.17-c758a686/manual/sysinfo.texi glibc-2.17-c758a686/manual/sysinfo.texi +--- glibc-2.17-c758a686/manual/sysinfo.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/sysinfo.texi 2014-09-12 16:10:06.048792709 -0400 +@@ -91,6 +91,9 @@ + @comment unistd.h + @comment BSD + @deftypefun int gethostname (char *@var{name}, size_t @var{size}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on unix; implemented in terms of uname on posix and of ++@c hurd_get_host_config on hurd. + This function returns the host name of the system on which it is called, + in the array @var{name}. The @var{size} argument specifies the size of + this array, in bytes. Note that this is @emph{not} the DNS hostname. +@@ -121,6 +124,9 @@ + @comment unistd.h + @comment BSD + @deftypefun int sethostname (const char *@var{name}, size_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on unix; implemented in terms of hurd_set_host_config ++@c on hurd. + The @code{sethostname} function sets the host name of the system that + calls it to @var{name}, a string with length @var{length}. Only + privileged processes are permitted to do this. +@@ -145,6 +151,8 @@ + @comment unistd.h + @comment ??? + @deftypefun int getdomainnname (char *@var{name}, size_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Syscalls uname, then strlen and memcpy. + @cindex NIS domain name + @cindex YP domain name + +@@ -159,6 +167,8 @@ + @comment unistd.h + @comment ??? + @deftypefun int setdomainname (const char *@var{name}, size_t @var{length}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall. + @cindex NIS domain name + @cindex YP domain name + +@@ -173,6 +183,10 @@ + @comment unistd.h + @comment BSD + @deftypefun {long int} gethostid (void) ++@safety{@prelim{}@mtsafe{@mtshostid{} @mtsenv{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{} @acsfd{}}} ++@c On HURD, calls _hurd_get_host_config and strtol. On Linux, open ++@c HOSTIDFILE, reads an int32_t and closes; if that fails, it calls ++@c gethostname and gethostbyname_r to use the h_addr. + This function returns the ``host ID'' of the machine the program is + running on. By convention, this is usually the primary Internet IP address + of that machine, converted to a @w{@code{long int}}. However, on some +@@ -190,6 +204,7 @@ + @comment unistd.h + @comment BSD + @deftypefun int sethostid (long int @var{id}) ++@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtshostid{}}}@asunsafe{}@acunsafe{@acucorrupt{} @acsfd{}}} + The @code{sethostid} function sets the ``host ID'' of the host machine + to @var{id}. Only privileged processes are permitted to do this. Usually + it happens just once, at system boot time. +@@ -226,7 +241,7 @@ + + As a bonus, @code{uname} also gives some information identifying the + particular system your program is running on. This is the same information +-which you can get with functions targetted to this purpose described in ++which you can get with functions targeted to this purpose described in + @ref{Host Identification}. + + +@@ -296,6 +311,10 @@ + @comment sys/utsname.h + @comment POSIX.1 + @deftypefun int uname (struct utsname *@var{info}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall on unix; the posix fallback is to call gethostname and ++@c then fills in the other fields with constants; on HURD, it calls ++@c proc_uname and then gethostname. + The @code{uname} function fills in the structure pointed to by + @var{info} with information about the operating system and host machine. + A non-negative value indicates that the data was successfully stored. +@@ -471,6 +490,12 @@ + @comment fstab.h + @comment BSD + @deftypefun int setfsent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fsent}}@asunsafe{@ascuheap{} @asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c setfsent @mtasurace:fsent @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsmem @acsfd ++@c fstab_init(1) @mtasurace:fsent @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsmem @acsfd ++@c malloc dup @ascuheap @acsmem ++@c rewind dup @asucorrupt @acucorrupt [no @aculock] ++@c setmntent dup @ascuheap @asulock @acsmem @acsfd @aculock + This function makes sure that the internal read pointer for the + @file{fstab} file is at the beginning of the file. This is done by + either opening the file or resetting the read pointer. +@@ -486,6 +511,9 @@ + @comment fstab.h + @comment BSD + @deftypefun void endfsent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fsent}}@asunsafe{@ascuheap{} @asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c endfsent @mtasurace:fsent @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsmem @acsfd ++@c endmntent dup @ascuheap @asulock @aculock @acsmem @acsfd + This function makes sure that all resources acquired by a prior call to + @code{setfsent} (explicitly or implicitly by calling @code{getfsent}) are + freed. +@@ -494,6 +522,13 @@ + @comment fstab.h + @comment BSD + @deftypefun {struct fstab *} getfsent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fsent} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c getfsent @mtasurace:fsent @mtslocale @asucorrupt @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c fstab_init(0) dup @mtasurace:fsent @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsmem @acsfd ++@c fstab_fetch @mtasurace:fsent @mtslocale @asucorrupt @ascuheap @acucorrupt @aculock @acsmem ++@c getmntent_r dup @mtslocale @asucorrupt @ascuheap @acucorrupt @aculock @acsmem ++@c fstab_convert @mtasurace:fsent ++@c hasmntopt dup ok + This function returns the next entry of the @file{fstab} file. If this + is the first call to any of the functions handling @file{fstab} since + program start or the last call of @code{endfsent}, the file will be +@@ -508,6 +543,12 @@ + @comment fstab.h + @comment BSD + @deftypefun {struct fstab *} getfsspec (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fsent} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c getffsspec @mtasurace:fsent @mtslocale @asucorrupt @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c fstab_init(1) dup @mtasurace:fsent @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsmem @acsfd ++@c fstab_fetch dup @mtasurace:fsent @mtslocale @asucorrupt @ascuheap @acucorrupt @aculock @acsmem ++@c strcmp dup ok ++@c fstab_convert dup @mtasurace:fsent + This function returns the next entry of the @file{fstab} file which has + a string equal to @var{name} pointed to by the @code{fs_spec} element. + Since there is normally exactly one entry for each special device it +@@ -525,6 +566,12 @@ + @comment fstab.h + @comment BSD + @deftypefun {struct fstab *} getfsfile (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fsent} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c getffsfile @mtasurace:fsent @mtslocale @asucorrupt @ascuheap @asulock @acucorrupt @aculock @acsmem ++@c fstab_init(1) dup @mtasurace:fsent @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsmem @acsfd ++@c fstab_fetch dup @mtasurace:fsent @mtslocale @asucorrupt @ascuheap @acucorrupt @aculock @acsmem ++@c strcmp dup ok ++@c fstab_convert dup @mtasurace:fsent + This function returns the next entry of the @file{fstab} file which has + a string equal to @var{name} pointed to by the @code{fs_file} element. + Since there is normally exactly one entry for each mount point it +@@ -640,6 +687,13 @@ + @comment mntent.h + @comment BSD + @deftypefun {FILE *} setmntent (const char *@var{file}, const char *@var{mode}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @acsfd{} @aculock{}}} ++@c setmntent @ascuheap @asulock @acsmem @acsfd @aculock ++@c strlen dup ok ++@c mempcpy dup ok ++@c memcpy dup ok ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking dup ok [no @mtasurace:stream @asulock: exclusive stream] + The @code{setmntent} function prepares the file named @var{FILE} which + must be in the format of a @file{fstab} and @file{mtab} file for the + upcoming processing through the other functions of the family. The +@@ -655,6 +709,9 @@ + @comment mntent.h + @comment BSD + @deftypefun int endmntent (FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c endmntent @ascuheap @asulock @aculock @acsmem @acsfd ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd + This function takes for the @var{stream} parameter a file handle which + previously was returned from the @code{setmntent} call. + @code{endmntent} closes the stream and frees all resources. +@@ -666,6 +723,12 @@ + @comment mntent.h + @comment BSD + @deftypefun {struct mntent *} getmntent (FILE *@var{stream}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:mntentbuf} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asuinit{}}@acunsafe{@acuinit{} @acucorrupt{} @aculock{} @acsmem{}}} ++@c getmntent @mtasurace:mntentbuf @mtslocale @asucorrupt @ascuheap @asuinit @acuinit @acucorrupt @aculock @acsmem ++@c libc_once @ascuheap @asuinit @acuinit @acsmem ++@c allocate @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c getmntent_r dup @mtslocale @asucorrupt @ascuheap @acucorrupt @aculock @acsmem + The @code{getmntent} function takes as the parameter a file handle + previously returned by successful call to @code{setmntent}. It returns + a pointer to a static variable of type @code{struct mntent} which is +@@ -691,7 +754,17 @@ + + @comment mntent.h + @comment BSD +-@deftypefun {struct mntent *} getmntent_r (FILE *@var{stream}, struct mentent *@var{result}, char *@var{buffer}, int @var{bufsize}) ++@deftypefun {struct mntent *} getmntent_r (FILE *@var{stream}, struct mntent *@var{result}, char *@var{buffer}, int @var{bufsize}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}} ++@c getmntent_r @mtslocale @asucorrupt @ascuheap @acucorrupt @aculock @acsmem ++@c flockfile dup @aculock ++@c fgets_unlocked dup @asucorrupt @acucorrupt [locked, so no @mtsrace:stream] ++@c funlockfile dup @aculock ++@c strchr dup ok ++@c strspn dup ok ++@c strsep dup ok ++@c decode_name ok ++@c sscanf dup @mtslocale @ascuheap @acsmem + The @code{getmntent_r} function is the reentrant variant of + @code{getmntent}. It also returns the next entry from the file and + returns a pointer. The actual variable the values are stored in is not +@@ -717,6 +790,12 @@ + @comment mntent.h + @comment BSD + @deftypefun int addmntent (FILE *@var{stream}, const struct mntent *@var{mnt}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:stream} @mtslocale{}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}} ++@c addmntent @mtasurace:stream @mtslocale @asucorrupt @acucorrupt ++@c fseek dup @asucorrupt @acucorrupt [no @aculock] ++@c encode_name ok ++@c fprintf dup @mtslocale @asucorrupt @acucorrupt [no @ascuheap @acsmem, no @aculock] ++@c fflush dup @asucorrupt @acucorrupt [no @aculock] + The @code{addmntent} function allows adding a new entry to the file + previously opened with @code{setmntent}. The new entries are always + appended. I.e., even if the position of the file descriptor is not at +@@ -740,6 +819,11 @@ + @comment mntent.h + @comment BSD + @deftypefun {char *} hasmntopt (const struct mntent *@var{mnt}, const char *@var{opt}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c hasmntopt ok ++@c strlen dup ok ++@c strstr dup ok ++@c strchr dup ok + This function can be used to check whether the string pointed to by the + @code{mnt_opts} element of the variable pointed to by @var{mnt} contains + the option @var{opt}. If this is true a pointer to the beginning of the +@@ -778,6 +862,8 @@ + @comment sys/mount.h + @comment SVID, BSD + @deftypefun {int} mount (const char *@var{special_file}, const char *@var{dir}, const char *@var{fstype}, unsigned long int @var{options}, const void *@var{data}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall. + + @code{mount} mounts or remounts a filesystem. The two operations are + quite different and are merged rather unnaturally into this one function. +@@ -982,6 +1068,8 @@ + @comment sys/mount.h + @comment GNU + @deftypefun {int} umount2 (const char *@var{file}, int @var{flags}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall. + + @code{umount2} unmounts a filesystem. + +@@ -1047,6 +1135,8 @@ + @comment sys/mount.h + @comment SVID, GNU + @deftypefun {int} umount (const char *@var{file}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall or wrapper for umount2. + + @code{umount} does the same thing as @code{umount2} with @var{flags} set + to zeroes. It is more widely available than @code{umount2} but since it +@@ -1062,11 +1152,13 @@ + This section describes the @code{sysctl} function, which gets and sets + a variety of system parameters. + +-The symbols used in this section are declared in the file @file{sysctl.h}. ++The symbols used in this section are declared in the file @file{sys/sysctl.h}. + +-@comment sysctl.h ++@comment sys/sysctl.h + @comment BSD + @deftypefun int sysctl (int *@var{names}, int @var{nlen}, void *@var{oldval}, size_t *@var{oldlenp}, void *@var{newval}, size_t @var{newlen}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct syscall, Linux only. + + @code{sysctl} gets or sets a specified system parameter. There are so + many of these parameters that it is not practical to list them all here, +@@ -1090,7 +1182,7 @@ + a particular parameter, you specify a path through the structure in a + way analogous to specifying the pathname of a file. Each component of + the path is specified by an integer and each of these integers has a +-macro defined for it by @file{sysctl.h}. @var{names} is the path, in ++macro defined for it by @file{sys/sysctl.h}. @var{names} is the path, in + the form of an array of integers. Each component of the path is one + element of the array, in order. @var{nlen} is the number of components + in the path. +diff -urN glibc-2.17-c758a686/manual/syslog.texi glibc-2.17-c758a686/manual/syslog.texi +--- glibc-2.17-c758a686/manual/syslog.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/syslog.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -147,6 +147,17 @@ + @comment syslog.h + @comment BSD + @deftypefun void openlog (const char *@var{ident}, int @var{option}, int @var{facility}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c openlog @asulock @aculock @acsfd ++@c libc_lock_lock @asulock @aculock ++@c openlog_internal @acsfd [always guarded by syslog_lock, so no race] ++@c strncpy dup ok ++@c socket dup @acsfd ++@c fcntl dup ok ++@c connect dup ok ++@c close dup @acsfd ++@c cancel_handler(NULL) @aculock ++@c libc_lock_unlock @aculock + + @code{openlog} opens or reopens a connection to Syslog in preparation + for submitting messages. +@@ -275,7 +286,39 @@ + @c syslog() is implemented as a call to vsyslog(). + @comment syslog.h + @comment BSD +-@deftypefun void syslog (int @var{facility_priority}, char *@var{format}, @dots{}) ++@deftypefun void syslog (int @var{facility_priority}, const char *@var{format}, @dots{}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c syslog @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c va_start dup ok ++@c vsyslog_chk @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c syslog(INTERNALLOG) dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c open_memstream @ascuheap @acsmem ++@c stpcpy dup ok ++@c getpid dup ok ++@c mempcpy dup ok ++@c fsetlocking [no @mtasurace:stream @asulock for exclusive stream] ++@c fprintf @mtslocale @ascuheap @acsmem [no @asucorrupt @aculock @acucorrupt on temp memstream] ++@c time dup ok ++@c localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c strftime_l(C) dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c ftell dup ok [no @asucorrupt @aculock @acucorrupt on temp memstream] ++@c fputs_unlocked dup ok [no @mtasurace:stream @asucorrupt @acucorrupt on temp memstream] ++@c putc_unlocked dup ok [no @mtasurace:stream @asucorrupt @acucorrupt on temp memstream] ++@c vfprintf/vfprintf_chk dup @mtslocale @ascuheap @acsmem [no @mtasurace:stream @asucorrupt @acucorrupt on temp memstream] ++@c fclose dup @ascuheap @acsmem [no @asulock @aculock @acsfd on caller-locked memstream] ++@c writev dup ok ++@c libc_lock_lock dup @asulock @aculock ++@c memset dup ok ++@c sigemptyset dup ok ++@c sigaction(SIGPIPE) dup @mtasusig:PIPE @acusig:PIPE ++@c openlog_internal dup @acsfd ++@c send dup ok ++@c closelog_internal dup @acsfd ++@c open dup @acsfd ++@c dprintf dup ok ++@c libc_lock_unlock @asulock @aculock ++@c free dup @acsuheap @acsmem ++@c va_end dup ok + + @code{syslog} submits a message to the Syslog facility. It does this by + writing to the Unix domain socket @code{/dev/log}. +@@ -403,7 +446,10 @@ + + @comment syslog.h + @comment BSD +-@deftypefun void vsyslog (int @var{facility_priority}, char *@var{format}, va_list @var{arglist}) ++@deftypefun void vsyslog (int @var{facility_priority}, const char *@var{format}, va_list @var{arglist}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c vsyslog @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c vsyslog_chk dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd + + This is functionally identical to @code{syslog}, with the BSD style variable + length argument. +@@ -420,6 +466,13 @@ + @comment syslog.h + @comment BSD + @deftypefun void closelog (void) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c closelog @asulock @aculock @acsfd ++@c libc_lock_lock @asulock @aculock ++@c closelog_internal @acsfd [always guarded by syslog_lock, so no race] ++@c close dup@acsfd ++@c cancel_handler(NULL) @aculock ++@c libc_lock_unlock @aculock + + @code{closelog} closes the current Syslog connection, if there is one. + This includes closing the @file{/dev/log} socket, if it is open. +@@ -450,6 +503,10 @@ + @comment syslog.h + @comment BSD + @deftypefun int setlogmask (int @var{mask}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:LogMask}}@asunsafe{}@acsafe{}} ++@c Read and modify are not guarded by syslog_lock, so concurrent changes ++@c or even uses are undefined. This should use an atomic swap instead, ++@c at least for modifications. + + @code{setlogmask} sets a mask (the ``logmask'') that determines which + future @code{syslog} calls shall be ignored. If a program has not +diff -urN glibc-2.17-c758a686/manual/terminal.texi glibc-2.17-c758a686/manual/terminal.texi +--- glibc-2.17-c758a686/manual/terminal.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/terminal.texi 2014-09-12 16:10:06.047792712 -0400 +@@ -44,6 +44,9 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int isatty (int @var{filedes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c isatty ok ++@c tcgetattr dup ok + This function returns @code{1} if @var{filedes} is a file descriptor + associated with an open terminal device, and @math{0} otherwise. + @end deftypefun +@@ -55,6 +58,20 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {char *} ttyname (int @var{filedes}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:ttyname}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c ttyname @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd ++@c isatty dup ok ++@c fstat dup ok ++@c memcpy dup ok ++@c getttyname @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd ++@c opendir @ascuheap @acsmem @acsfd ++@c readdir ok [protected by exclusive access] ++@c strcmp dup ok ++@c free dup @asulock @aculock @acsfd @acsmem ++@c malloc dup @asulock @aculock @acsfd @acsmem ++@c closedir @ascuheap @acsmem @acsfd ++@c mempcpy dup ok ++@c stat dup ok + If the file descriptor @var{filedes} is associated with a terminal + device, the @code{ttyname} function returns a pointer to a + statically-allocated, null-terminated string containing the file name of +@@ -65,6 +82,18 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int ttyname_r (int @var{filedes}, char *@var{buf}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} ++@c ttyname_r @ascuheap @acsmem @acsfd ++@c isatty dup ok ++@c fstat dup ok ++@c memcpy dup ok ++@c getttyname_r @ascuheap @acsmem @acsfd ++@c opendir @ascuheap @acsmem @acsfd ++@c readdir ok [protected by exclusive access] ++@c strcmp dup ok ++@c closedir @ascuheap @acsmem @acsfd ++@c stpncpy dup ok ++@c stat dup ok + The @code{ttyname_r} function is similar to the @code{ttyname} function + except that it places its result into the user-specified buffer starting + at @var{buf} with length @var{len}. +@@ -264,6 +293,9 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int tcgetattr (int @var{filedes}, struct termios *@var{termios-p}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Converting the kernel-returned termios data structure to the userland ++@c format does not ensure atomic or consistent writing. + This function is used to examine the attributes of the terminal + device with file descriptor @var{filedes}. The attributes are returned + in the structure that @var{termios-p} points to. +@@ -284,6 +316,9 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int tcsetattr (int @var{filedes}, int @var{when}, const struct termios *@var{termios-p}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Converting the incoming termios data structure to the kernel format ++@c does not ensure atomic or consistent reading. + This function sets the attributes of the terminal device with file + descriptor @var{filedes}. The new attributes are taken from the + structure that @var{termios-p} points to. +@@ -621,7 +656,7 @@ + of characters, carriage return followed by linefeed. + @end deftypevr + +-@comment termios.h ++@comment termios.h (optional) + @comment BSD + @deftypevr Macro tcflag_t OXTABS + If this bit is set, convert tab characters on output into the appropriate +@@ -630,7 +665,7 @@ + @gnulinuxsystems{} it is available as @code{XTABS}. + @end deftypevr + +-@comment termios.h ++@comment termios.h (optional) + @comment BSD + @deftypevr Macro tcflag_t ONOEOT + If this bit is set, discard @kbd{C-d} characters (code @code{004}) on +@@ -962,7 +997,7 @@ + While this bit is set, all output is discarded. @xref{Other Special}. + @end deftypevr + +-@comment termios.h ++@comment termios.h (optional) + @comment BSD + @deftypevr Macro tcflag_t NOKERNINFO + Setting this bit disables handling of the STATUS character. +@@ -1016,6 +1051,10 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun speed_t cfgetospeed (const struct termios *@var{termios-p}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct access to a single termios field, except on Linux, where ++@c multiple accesses may take place. No worries either way, callers ++@c must ensure mutual exclusion on such non-opaque types. + This function returns the output line speed stored in the structure + @code{*@var{termios-p}}. + @end deftypefun +@@ -1023,6 +1062,7 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun speed_t cfgetispeed (const struct termios *@var{termios-p}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function returns the input line speed stored in the structure + @code{*@var{termios-p}}. + @end deftypefun +@@ -1030,6 +1070,7 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int cfsetospeed (struct termios *@var{termios-p}, speed_t @var{speed}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function stores @var{speed} in @code{*@var{termios-p}} as the output + speed. The normal return value is @math{0}; a value of @math{-1} + indicates an error. If @var{speed} is not a speed, @code{cfsetospeed} +@@ -1039,6 +1080,7 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int cfsetispeed (struct termios *@var{termios-p}, speed_t @var{speed}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + This function stores @var{speed} in @code{*@var{termios-p}} as the input + speed. The normal return value is @math{0}; a value of @math{-1} + indicates an error. If @var{speed} is not a speed, @code{cfsetospeed} +@@ -1048,6 +1090,14 @@ + @comment termios.h + @comment BSD + @deftypefun int cfsetspeed (struct termios *@var{termios-p}, speed_t @var{speed}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c There's no guarantee that the two calls are atomic, but since this is ++@c not an opaque type, callers ought to ensure mutual exclusion to the ++@c termios object. ++ ++@c cfsetspeed ok ++@c cfsetispeed ok ++@c cfsetospeed ok + This function stores @var{speed} in @code{*@var{termios-p}} as both the + input and output speeds. The normal return value is @math{0}; a value + of @math{-1} indicates an error. If @var{speed} is not a speed, +@@ -1625,6 +1675,10 @@ + @comment termios.h + @comment BSD + @deftypefun void cfmakeraw (struct termios *@var{termios-p}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c There's no guarantee the changes are atomic, but since this is not an ++@c opaque type, callers ought to ensure mutual exclusion to the termios ++@c object. + This function provides an easy way to set up @code{*@var{termios-p}} for + what has traditionally been called ``raw mode'' in BSD. This uses + noncanonical input, and turns off most processing to give an unmodified +@@ -1678,6 +1732,8 @@ + @comment sgtty.h + @comment BSD + @deftypefun int gtty (int @var{filedes}, struct sgttyb *@var{attributes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct ioctl, BSD only. + This function gets the attributes of a terminal. + + @code{gtty} sets *@var{attributes} to describe the terminal attributes +@@ -1686,7 +1742,9 @@ + + @comment sgtty.h + @comment BSD +-@deftypefun int stty (int @var{filedes}, struct sgttyb *@var{attributes}) ++@deftypefun int stty (int @var{filedes}, const struct sgttyb *@var{attributes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct ioctl, BSD only. + + This function sets the attributes of a terminal. + +@@ -1710,6 +1768,12 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int tcsendbreak (int @var{filedes}, int @var{duration}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:tcattr(filedes)/bsd}}@asunsafe{}@acunsafe{@acucorrupt{/bsd}}} ++@c On Linux, this calls just one out of two ioctls; on BSD, it's two ++@c ioctls with a select (for the delay only) in between, the first ++@c setting and the latter clearing the break status. The BSD ++@c implementation may leave the break enabled if cancelled, and threads ++@c and signals may cause the break to be interrupted before requested. + This function generates a break condition by transmitting a stream of + zero bits on the terminal associated with the file descriptor + @var{filedes}. The duration of the break is controlled by the +@@ -1738,6 +1802,8 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int tcdrain (int @var{filedes}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct ioctl. + The @code{tcdrain} function waits until all queued + output to the terminal @var{filedes} has been transmitted. + +@@ -1772,6 +1838,8 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int tcflush (int @var{filedes}, int @var{queue}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Direct ioctl. + The @code{tcflush} function is used to clear the input and/or output + queues associated with the terminal file @var{filedes}. The @var{queue} + argument specifies which queue(s) to clear, and can be one of the +@@ -1822,6 +1890,11 @@ + @comment termios.h + @comment POSIX.1 + @deftypefun int tcflow (int @var{filedes}, int @var{action}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:tcattr(filedes)/bsd}}@asunsafe{}@acsafe{}} ++@c Direct ioctl on Linux. On BSD, the TCO* actions are a single ioctl, ++@c whereas the TCI actions first call tcgetattr and then write to the fd ++@c the c_cc character corresponding to the action; there's a window for ++@c another thread to change the xon/xoff characters. + The @code{tcflow} function is used to perform operations relating to + XON/XOFF flow control on the terminal file specified by @var{filedes}. + +@@ -1931,6 +2004,14 @@ + @comment stdlib.h + @comment GNU + @deftypefun int getpt (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} ++@c On BSD, tries to open multiple potential pty names, returning on the ++@c first success. On Linux, try posix_openpt first, then fallback to ++@c the BSD implementation. The posix implementation opens the ptmx ++@c device, checks with statfs that /dev/pts is a devpts or that /dev is ++@c a devfs, and returns the fd; static variables devpts_mounted and ++@c have_no_dev_ptmx are safely initialized so as to avoid repeated ++@c tests. + The @code{getpt} function returns a new file descriptor for the next + available master pseudo-terminal. The normal return value from + @code{getpt} is a non-negative integer file descriptor. In the case of +@@ -1948,6 +2029,32 @@ + @comment stdlib.h + @comment SVID, XPG4.2 + @deftypefun int grantpt (int @var{filedes}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c grantpt @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c unix/grantpt:pts_name @acsuheap @acsmem ++@c ptsname_internal dup ok (but this is Linux-only!) ++@c memchr dup ok ++@c realloc dup @acsuheap @acsmem ++@c malloc dup @acsuheap @acsmem ++@c free dup @acsuheap @acsmem ++@c fcntl dup ok ++@c getuid dup ok ++@c chown dup ok ++@c sysconf(_SC_GETGR_R_SIZE_MAX) ok ++@c getgrnam_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getgid dup ok ++@c chmod dup ok ++@c fork dup @aculock ++@c [child] ++@c setrlimit ++@c dup2 ++@c CLOSE_ALL_FDS ++@c execle ++@c _exit ++@c waitpid dup ok ++@c WIFEXITED dup ok ++@c WEXITSTATUS dup ok ++@c free dup @ascuheap @acsmem + The @code{grantpt} function changes the ownership and access permission + of the slave pseudo-terminal device corresponding to the master + pseudo-terminal device associated with the file descriptor +@@ -1985,6 +2092,13 @@ + @comment stdlib.h + @comment SVID, XPG4.2 + @deftypefun int unlockpt (int @var{filedes}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} ++@c unlockpt @ascuheap/bsd @acsmem @acsfd ++@c /bsd ++@c ptsname_r dup @ascuheap @acsmem @acsfd ++@c revoke ok (syscall) ++@c /linux ++@c ioctl dup ok + The @code{unlockpt} function unlocks the slave pseudo-terminal device + corresponding to the master pseudo-terminal device associated with the + file descriptor @var{filedes}. On many systems, the slave can only be +@@ -2008,6 +2122,9 @@ + @comment stdlib.h + @comment SVID, XPG4.2 + @deftypefun {char *} ptsname (int @var{filedes}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:ptsname}}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} ++@c ptsname @mtasurace:ptsname @ascuheap/bsd @acsmem @acsfd ++@c ptsname_r dup @ascuheap/bsd @acsmem @acsfd + If the file descriptor @var{filedes} is associated with a + master pseudo-terminal device, the @code{ptsname} function returns a + pointer to a statically-allocated, null-terminated string containing the +@@ -2018,6 +2135,37 @@ + @comment stdlib.h + @comment GNU + @deftypefun int ptsname_r (int @var{filedes}, char *@var{buf}, size_t @var{len}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} ++@c ptsname_r @ascuheap/bsd @acsmem @acsfd ++@c /hurd ++@c term_get_peername ok ++@c strlen dup ok ++@c memcpy dup ok ++@c /bsd ++@c isatty dup ok ++@c strlen dup ok ++@c ttyname_r dup @ascuheap @acsmem @acsfd ++@c stat dup ok ++@c /linux ++@c ptsname_internal ok ++@c isatty dup ok ++@c ioctl dup ok ++@c strlen dup ok ++@c itoa_word dup ok ++@c stpcpy dup ok ++@c memcpy dup ok ++@c fxstat64 dup ok ++@c MASTER_P ok ++@c major ok ++@c gnu_dev_major ok ++@c minor ok ++@c gnu_dev_minor ok ++@c minor dup ok ++@c xstat64 dup ok ++@c S_ISCHR dup ok ++@c SLAVE_P ok ++@c major dup ok ++@c minor dup ok + The @code{ptsname_r} function is similar to the @code{ptsname} function + except that it places its result into the user-specified buffer starting + at @var{buf} with length @var{len}. +@@ -2083,6 +2231,22 @@ + @comment pty.h + @comment BSD + @deftypefun int openpty (int *@var{amaster}, int *@var{aslave}, char *@var{name}, const struct termios *@var{termp}, const struct winsize *@var{winp}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c openpty @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getpt @acsfd ++@c grantpt @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c unlockpt dup @ascuheap/bsd @acsmem @acsfd ++@c openpty:pts_name @acsuheap @acsmem @acsfd ++@c ptsname_r dup @ascuheap/bsd @acsmem @acsfd ++@c realloc dup @acsuheap @acsmem ++@c malloc dup @acsuheap @acsmem ++@c free dup @acsuheap @acsmem ++@c open dup @acsfd ++@c free dup @acsuheap @acsmem ++@c tcsetattr dup ok ++@c ioctl dup ok ++@c strcpy dup ok ++@c close dup @acsfd + This function allocates and opens a pseudo-terminal pair, returning the + file descriptor for the master in @var{*amaster}, and the file + descriptor for the slave in @var{*aslave}. If the argument @var{name} +@@ -2114,6 +2278,16 @@ + @comment pty.h + @comment BSD + @deftypefun int forkpty (int *@var{amaster}, char *@var{name}, const struct termios *@var{termp}, const struct winsize *@var{winp}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c forkpty @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c openpty dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c fork dup @aculock ++@c close dup @acsfd ++@c /child ++@c close dup @acsfd ++@c login_tty dup @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd ++@c _exit dup ok ++@c close dup @acsfd + This function is similar to the @code{openpty} function, but in + addition, forks a new process (@pxref{Creating a Process}) and makes the + newly opened slave pseudo-terminal device the controlling terminal +diff -urN glibc-2.17-c758a686/manual/texinfo.tex glibc-2.17-c758a686/manual/texinfo.tex +--- glibc-2.17-c758a686/manual/texinfo.tex 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/texinfo.tex 2014-09-12 16:10:06.047792712 -0400 +@@ -3,11 +3,11 @@ + % Load plain if necessary, i.e., if running under initex. + \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi + % +-\def\texinfoversion{2012-01-19.16} ++\def\texinfoversion{2014-05-05.10} + % + % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, + % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +-% 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. ++% 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. + % + % This texinfo.tex file is free software: you can redistribute it and/or + % modify it under the terms of the GNU General Public License as +@@ -24,13 +24,14 @@ + % + % As a special exception, when this file is read by TeX when processing + % a Texinfo source document, you may use the result without +-% restriction. (This has been our intent since Texinfo was invented.) ++% restriction. This Exception is an additional permission under section 7 ++% of the GNU General Public License, version 3 ("GPLv3"). + % + % Please try the latest version of texinfo.tex before submitting bug + % reports; you can get the latest version from: +-% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +-% ftp://tug.org/tex/texinfo.tex +-% (and all CTAN mirrors, see http://www.ctan.org). ++% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or ++% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or ++% http://www.gnu.org/software/texinfo/ (the Texinfo home page) + % The texinfo.tex in any given distribution could well be out + % of date, so if that's what you're using, please check. + % +@@ -280,9 +281,9 @@ + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% +- \the\toks0 \the\toks2 +- \noexpand\or \the\toks4 \the\toks6 +- \noexpand\else \the\toks8 ++ \the\toks0 \the\toks2 % 0: top marks (\last...) ++ \noexpand\or \the\toks4 \the\toks6 % 1: bottom marks (default, \prev...) ++ \noexpand\else \the\toks8 % 2: color marks + }% + } + % \topmark doesn't work for the very first chapter (after the title +@@ -321,10 +322,13 @@ + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). ++ \def\commmonheadfootline{\let\hsize=\pagewidth \texinfochars} ++ % + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi +- \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% ++ \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% ++ % + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi +- \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% ++ \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to +@@ -594,7 +598,7 @@ + \def\:{\spacefactor=1000 } + + % @* forces a line break. +-\def\*{\hfil\break\hbox{}\ignorespaces} ++\def\*{\unskip\hfil\break\hbox{}\ignorespaces} + + % @/ allows a line break. + \let\/=\allowbreak +@@ -887,7 +891,7 @@ + \def\popthisfilestack{\errthisfilestackempty} + \def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} +- ++% + \def\thisfile{} + + % @center line +@@ -895,36 +899,46 @@ + % + \parseargdef\center{% + \ifhmode +- \let\next\centerH ++ \let\centersub\centerH + \else +- \let\next\centerV ++ \let\centersub\centerV + \fi +- \next{\hfil \ignorespaces#1\unskip \hfil}% ++ \centersub{\hfil \ignorespaces#1\unskip \hfil}% ++ \let\centersub\relax % don't let the definition persist, just in case + } +-\def\centerH#1{% +- {% +- \hfil\break +- \advance\hsize by -\leftskip +- \advance\hsize by -\rightskip +- \line{#1}% +- \break +- }% ++\def\centerH#1{{% ++ \hfil\break ++ \advance\hsize by -\leftskip ++ \advance\hsize by -\rightskip ++ \line{#1}% ++ \break ++}} ++% ++\newcount\centerpenalty ++\def\centerV#1{% ++ % The idea here is the same as in \startdefun, \cartouche, etc.: if ++ % @center is the first thing after a section heading, we need to wipe ++ % out the negative parskip inserted by \sectionheading, but still ++ % prevent a page break here. ++ \centerpenalty = \lastpenalty ++ \ifnum\centerpenalty>10000 \vskip\parskip \fi ++ \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi ++ \line{\kern\leftskip #1\kern\rightskip}% + } +-\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} + + % @sp n outputs n lines of vertical space +- ++% + \parseargdef\sp{\vskip #1\baselineskip} + + % @comment ...line which is ignored... + % @c is the same as @comment + % @ignore ... @end ignore is another way to write a comment +- ++% + \def\comment{\begingroup \catcode`\^^M=\other% + \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% + \commentxxx} + {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} +- ++% + \let\c=\comment + + % @paragraphindent NCHARS +@@ -1097,7 +1111,7 @@ + % for display in the outlines, and in other places. Thus, we have to + % double any backslashes. Otherwise, a name like "\node" will be + % interpreted as a newline (\n), followed by o, d, e. Not good. +-% ++% + % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and + % related messages. The final outcome is that it is up to the TeX user + % to double the backslashes and otherwise make the string valid, so +@@ -1107,7 +1121,7 @@ + % #1 is a control sequence in which to do the replacements, + % which we \xdef. + \def\txiescapepdf#1{% +- \ifx\pdfescapestring\relax ++ \ifx\pdfescapestring\thisisundefined + % No primitive available; should we give a warning or log? + % Many times it won't matter. + \else +@@ -1124,10 +1138,12 @@ + + \ifpdf + % +- % Color manipulation macros based on pdfcolor.tex, ++ % Color manipulation macros using ideas from pdfcolor.tex, + % except using rgb instead of cmyk; the latter is said to render as a + % very dark gray on-screen and a very dark halftone in print, instead +- % of actual black. ++ % of actual black. The dark red here is dark enough to print on paper as ++ % nearly black, but still distinguishable for online viewing. We use ++ % black by default, though. + \def\rgbDarkRed{0.50 0.09 0.12} + \def\rgbBlack{0 0 0} + % +@@ -1173,8 +1189,8 @@ + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% +- \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% +- \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% ++ \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% ++ \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % pdftex (and the PDF format) support .pdf, .png, .jpg (among + % others). Let's try in that order, PDF first since if +@@ -1212,8 +1228,8 @@ + \else + \immediate\pdfximage + \fi +- \ifdim \wd0 >0pt width \imagewidth \fi +- \ifdim \wd2 >0pt height \imageheight \fi ++ \ifdim \wd0 >0pt width \pdfimagewidth \fi ++ \ifdim \wd2 >0pt height \pdfimageheight \fi + \ifnum\pdftexversion<13 + #1.\pdfimgext + \else +@@ -1237,10 +1253,9 @@ + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1} + % +- % by default, use a color that is dark enough to print on paper as +- % nearly black, but still distinguishable for online viewing. +- \def\urlcolor{\rgbDarkRed} +- \def\linkcolor{\rgbDarkRed} ++ % by default, use black for everything. ++ \def\urlcolor{\rgbBlack} ++ \def\linkcolor{\rgbBlack} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines +@@ -1357,12 +1372,17 @@ + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces +- \ifx\p\space\else\addtokens{\filename}{\PP}% +- \advance\filenamelength by 1 +- \fi ++ \addtokens{\filename}{\PP}% ++ \advance\filenamelength by 1 + \fi + \nextsp} +- \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} ++ \def\getfilename#1{% ++ \filenamelength=0 ++ % If we don't expand the argument now, \skipspaces will get ++ % snagged on things like "@value{foo}". ++ \edef\temp{#1}% ++ \expandafter\skipspaces\temp|\relax ++ } + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else +@@ -1459,9 +1479,6 @@ + \def\ttsl{\setfontstyle{ttsl}} + + +-% Default leading. +-\newdimen\textleading \textleading = 13.2pt +- + % Set the baselineskip to #1, and the lineskip and strut size + % correspondingly. There is no deep meaning behind these magic numbers + % used as factors; they just match (closely enough) what Knuth defined. +@@ -1473,6 +1490,7 @@ + % can get a sort of poor man's double spacing by redefining this. + \def\baselinefactor{1} + % ++\newdimen\textleading + \def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 +@@ -1745,18 +1763,24 @@ + \fi\fi + + +-% Set the font macro #1 to the font named #2, adding on the +-% specified font prefix (normally `cm'). ++% Set the font macro #1 to the font named \fontprefix#2. + % #3 is the font's design size, #4 is a scale factor, #5 is the CMap +-% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass +-% empty to omit). ++% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). ++% Example: ++% #1 = \textrm ++% #2 = \rmshape ++% #3 = 10 ++% #4 = \mainmagstep ++% #5 = OT1 ++% + \def\setfont#1#2#3#4#5{% + \font#1=\fontprefix#2#3 scaled #4 + \csname cmap#5\endcsname#1% + } + % This is what gets called when #5 of \setfont is empty. + \let\cmap\gobble +-% emacs-page end of cmaps ++% ++% (end of cmaps) + + % Use cm as the default font prefix. + % To specify the font prefix, you must define \fontprefix +@@ -1766,7 +1790,7 @@ + \fi + % Support font families that don't use the same naming scheme as CM. + \def\rmshape{r} +-\def\rmbshape{bx} %where the normal face is bold ++\def\rmbshape{bx} % where the normal face is bold + \def\bfshape{b} + \def\bxshape{bx} + \def\ttshape{tt} +@@ -1781,8 +1805,7 @@ + \def\scshape{csc} + \def\scbshape{csc} + +-% Definitions for a main text size of 11pt. This is the default in +-% Texinfo. ++% Definitions for a main text size of 11pt. (The default in Texinfo.) + % + \def\definetextfontsizexi{% + % Text fonts (11.2pt, magstep1). +@@ -1907,7 +1930,7 @@ + \textleading = 13.2pt % line spacing for 11pt CM + \textfonts % reset the current fonts + \rm +-} % end of 11pt text font size definitions ++} % end of 11pt text font size definitions, \definetextfontsizexi + + + % Definitions to make the main text be 10pt Computer Modern, with +@@ -2039,7 +2062,7 @@ + \textleading = 12pt % line spacing for 10pt CM + \textfonts % reset the current fonts + \rm +-} % end of 10pt text font size definitions ++} % end of 10pt text font size definitions, \definetextfontsizex + + + % We provide the user-level command +@@ -2123,7 +2146,7 @@ + \let\tenttsl=\secttsl + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% +- \resetmathfonts \setleading{16pt}} ++ \resetmathfonts \setleading{17pt}} + \def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc +@@ -2254,8 +2277,6 @@ + + \gdef\markupsetcodequoteleft{\let`\codequoteleft} + \gdef\markupsetcodequoteright{\let'\codequoteright} +- +-\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} + } + + \let\markupsetuplqcode \markupsetcodequoteleft +@@ -2264,6 +2285,9 @@ + \let\markupsetuplqexample \markupsetcodequoteleft + \let\markupsetuprqexample \markupsetcodequoteright + % ++\let\markupsetuplqkbd \markupsetcodequoteleft ++\let\markupsetuprqkbd \markupsetcodequoteright ++% + \let\markupsetuplqsamp \markupsetcodequoteleft + \let\markupsetuprqsamp \markupsetcodequoteright + % +@@ -2273,8 +2297,6 @@ + \let\markupsetuplqverbatim \markupsetcodequoteleft + \let\markupsetuprqverbatim \markupsetcodequoteright + +-\let\markupsetuplqkbd \markupsetnoligaturesquoteleft +- + % Allow an option to not use regular directed right quote/apostrophe + % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). + % The undirected quote is ugly, so don't make it the default, but it +@@ -2359,13 +2381,14 @@ + \ifx\next,% + \else\ifx\next-% + \else\ifx\next.% ++ \else\ifx\next\.% ++ \else\ifx\next\comma% + \else\ptexslash +- \fi\fi\fi ++ \fi\fi\fi\fi\fi + \aftersmartic + } + +-% like \smartslanted except unconditionally uses \ttsl, and no ic. +-% @var is set to this for defun arguments. ++% Unconditional use \ttsl, and no ic. @var is set to this for defuns. + \def\ttslanted#1{{\ttsl #1}} + + % @cite is like \smartslanted except unconditionally use \sl. We never want +@@ -2430,34 +2453,12 @@ + % @samp. + \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} + +-% definition of @key that produces a lozenge. Doesn't adjust to text size. +-%\setfont\keyrm\rmshape{8}{1000}{OT1} +-%\font\keysy=cmsy9 +-%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +-% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +-% \vbox{\hrule\kern-0.4pt +-% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +-% \kern-0.4pt\hrule}% +-% \kern-.06em\raise0.4pt\hbox{\angleright}}}} +- +-% definition of @key with no lozenge. If the current font is already +-% monospace, don't change it; that way, we respect @kbdinputstyle. But +-% if it isn't monospace, then use \tt. +-% +-\def\key#1{{\setupmarkupstyle{key}% +- \nohyphenation +- \ifmonospace\else\tt\fi +- #1}\null} +- +-% ctrl is no longer a Texinfo command. +-\def\ctrl #1{{\tt \rawbackslash \hat}#1} ++% @indicateurl is \samp, that is, with quotes. ++\let\indicateurl=\samp + +-% @file, @option are the same as @samp. +-\let\file=\samp +-\let\option=\samp +- +-% @code is a modification of @t, +-% which makes spaces the same size as normal in the surrounding text. ++% @code (and similar) prints in typewriter, but with spaces the same ++% size as normal in the surrounding text, without hyphenation, etc. ++% This is a subroutine for that. + \def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. +@@ -2480,14 +2481,14 @@ + } + + % We *must* turn on hyphenation at `-' and `_' in @code. ++% (But see \codedashfinish below.) + % Otherwise, it is too hard to avoid overfull hboxes + % in the Emacs manual, the Library manual, etc. +- ++% + % Unfortunately, TeX uses one parameter (\hyphenchar) to control + % both hyphenation at - and hyphenation within words. + % We must therefore turn them both off (\tclose does that) +-% and arrange explicitly to hyphenate at a dash. +-% -- rms. ++% and arrange explicitly to hyphenate at a dash. -- rms. + { + \catcode`\-=\active \catcode`\_=\active + \catcode`\'=\active \catcode`\`=\active +@@ -2501,17 +2502,38 @@ + \let-\codedash + \let_\codeunder + \else +- \let-\realdash ++ \let-\normaldash + \let_\realunder + \fi ++ % Given -foo (with a single dash), we do not want to allow a break ++ % after the hyphen. ++ \global\let\codedashprev=\codedash ++ % + \codex + } ++ % ++ \gdef\codedash{\futurelet\next\codedashfinish} ++ \gdef\codedashfinish{% ++ \normaldash % always output the dash character itself. ++ % ++ % Now, output a discretionary to allow a line break, unless ++ % (a) the next character is a -, or ++ % (b) the preceding character is a -. ++ % E.g., given --posix, we do not want to allow a break after either -. ++ % Given --foo-bar, we do want to allow a break between the - and the b. ++ \ifx\next\codedash \else ++ \ifx\codedashprev\codedash ++ \else \discretionary{}{}{}\fi ++ \fi ++ % we need the space after the = for the case when \next itself is a ++ % space token; it would get swallowed otherwise. As in @code{- a}. ++ \global\let\codedashprev= \next ++ } + } +- ++\def\normaldash{-} ++% + \def\codex #1{\tclose{#1}\endgroup} + +-\def\realdash{-} +-\def\codedash{-\discretionary{}{}{}} + \def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) +@@ -2525,9 +2547,9 @@ + } + + % An additional complication: the above will allow breaks after, e.g., +-% each of the four underscores in __typeof__. This is undesirable in +-% some manuals, especially if they don't have long identifiers in +-% general. @allowcodebreaks provides a way to control this. ++% each of the four underscores in __typeof__. This is bad. ++% @allowcodebreaks provides a document-level way to turn breaking at - ++% and _ on and off. + % + \newif\ifallowcodebreaks \allowcodebreakstrue + +@@ -2546,37 +2568,28 @@ + \fi\fi + } + +-% @uref (abbreviation for `urlref') takes an optional (comma-separated) +-% second argument specifying the text to display and an optional third +-% arg as text to display instead of (rather than in addition to) the url +-% itself. First (mandatory) arg is the url. +-% (This \urefnobreak definition isn't used now, leaving it for a while +-% for comparison.) +-\def\urefnobreak#1{\dourefnobreak #1,,,\finish} +-\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup +- \unsepspaces +- \pdfurl{#1}% +- \setbox0 = \hbox{\ignorespaces #3}% +- \ifdim\wd0 > 0pt +- \unhbox0 % third arg given, show only that +- \else +- \setbox0 = \hbox{\ignorespaces #2}% +- \ifdim\wd0 > 0pt +- \ifpdf +- \unhbox0 % PDF: 2nd arg given, show only it +- \else +- \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url +- \fi +- \else +- \code{#1}% only url given, so show it +- \fi +- \fi +- \endlink +-\endgroup} ++% For @command, @env, @file, @option quotes seem unnecessary, ++% so use \code rather than \samp. ++\let\command=\code ++\let\env=\code ++\let\file=\code ++\let\option=\code + +-% This \urefbreak definition is the active one. ++% @uref (abbreviation for `urlref') aka @url takes an optional ++% (comma-separated) second argument specifying the text to display and ++% an optional third arg as text to display instead of (rather than in ++% addition to) the url itself. First (mandatory) arg is the url. ++ ++% TeX-only option to allow changing PDF output to show only the second ++% arg (if given), and not the url (which is then just the link target). ++\newif\ifurefurlonlylink ++ ++% The main macro is \urefbreak, which allows breaking at expected ++% places within the url. (There used to be another version, which ++% didn't support automatic breaking.) + \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} + \let\uref=\urefbreak ++% + \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} + \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example + \unsepspaces +@@ -2585,12 +2598,19 @@ + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else +- \setbox0 = \hbox{\ignorespaces #2}% ++ \setbox0 = \hbox{\ignorespaces #2}% look for second arg + \ifdim\wd0 > 0pt + \ifpdf +- \unhbox0 % PDF: 2nd arg given, show only it ++ \ifurefurlonlylink ++ % PDF plus option to not display url, show just arg ++ \unhbox0 ++ \else ++ % PDF, normally display both arg and url for consistency, ++ % visibility, if the pdf is eventually used to print, etc. ++ \unhbox0\ (\urefcode{#1})% ++ \fi + \else +- \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url ++ \unhbox0\ (\urefcode{#1})% DVI, always show arg and url + \fi + \else + \urefcode{#1}% only url given, so show it +@@ -2630,8 +2650,10 @@ + % we put a little stretch before and after the breakable chars, to help + % line breaking of long url's. The unequal skips make look better in + % cmtt at least, especially for dots. +-\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } +-\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } ++\def\urefprestretchamount{.13em} ++\def\urefpoststretchamount{.1em} ++\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax} ++\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax} + % + \def\urefcodeamp{\urefprestretch \&\urefpoststretch} + \def\urefcodedot{\urefprestretch .\urefpoststretch} +@@ -2692,10 +2714,6 @@ + \let\email=\uref + \fi + +-% @kbd is like @code, except that if the argument is just one @key command, +-% then @kbd has no effect. +-\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} +- + % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), + % `example' (@kbd uses ttsl only inside of @example and friends), + % or `code' (@kbd uses normal tty font always). +@@ -2719,16 +2737,36 @@ + % Default is `distinct'. + \kbdinputstyle distinct + ++% @kbd is like @code, except that if the argument is just one @key command, ++% then @kbd has no effect. ++\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} ++ + \def\xkey{\key} +-\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +-\ifx\one\xkey\ifx\threex\three \key{#2}% +-\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi +-\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} ++\def\kbdsub#1#2#3\par{% ++ \def\one{#1}\def\three{#3}\def\threex{??}% ++ \ifx\one\xkey\ifx\threex\three \key{#2}% ++ \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi ++ \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi ++} + +-% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +-\let\indicateurl=\code +-\let\env=\code +-\let\command=\code ++% definition of @key that produces a lozenge. Doesn't adjust to text size. ++%\setfont\keyrm\rmshape{8}{1000}{OT1} ++%\font\keysy=cmsy9 ++%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% ++% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% ++% \vbox{\hrule\kern-0.4pt ++% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% ++% \kern-0.4pt\hrule}% ++% \kern-.06em\raise0.4pt\hbox{\angleright}}}} ++ ++% definition of @key with no lozenge. If the current font is already ++% monospace, don't change it; that way, we respect @kbdinputstyle. But ++% if it isn't monospace, then use \tt. ++% ++\def\key#1{{\setupmarkupstyle{key}% ++ \nohyphenation ++ \ifmonospace\else\tt\fi ++ #1}\null} + + % @clicksequence{File @click{} Open ...} + \def\clicksequence#1{\begingroup #1\endgroup} +@@ -2836,6 +2874,9 @@ + } + } + ++% ctrl is no longer a Texinfo command, but leave this definition for fun. ++\def\ctrl #1{{\tt \rawbackslash \hat}#1} ++ + % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. + % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, + % except specified as a normal braced arg, so no newlines to worry about. +@@ -2847,6 +2888,15 @@ + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi + } ++% ++% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if ++% FMTNAME is tex, else ELSE-TEXT. ++\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} ++\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% ++ \def\inlinefmtname{#1}% ++ \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi ++} ++% + % For raw, must switch into @tex before parsing the argument, to avoid + % setting catcodes prematurely. Doing it this way means that, for + % example, @inlineraw{html, foo{bar} gets a parse error instead of being +@@ -2863,6 +2913,23 @@ + \endgroup % close group opened by \tex. + } + ++% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. ++% ++\long\def\inlineifset#1{\doinlineifset #1,\finish} ++\long\def\doinlineifset#1,#2,\finish{% ++ \def\inlinevarname{#1}% ++ \expandafter\ifx\csname SET\inlinevarname\endcsname\relax ++ \else\ignorespaces#2\fi ++} ++ ++% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. ++% ++\long\def\inlineifclear#1{\doinlineifclear #1,\finish} ++\long\def\doinlineifclear#1,#2,\finish{% ++ \def\inlinevarname{#1}% ++ \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi ++} ++ + + \message{glyphs,} + % and logos. +@@ -3126,12 +3193,17 @@ + % hopefully nobody will notice/care. + \edef\ecsize{\csname\curfontsize ecsize\endcsname}% + \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% +- \ifx\curfontstyle\bfstylename +- % bold: +- \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize +- \else +- % regular: +- \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize ++ \ifmonospace ++ % typewriter: ++ \font\thisecfont = ectt\ecsize \space at \nominalsize ++ \else ++ \ifx\curfontstyle\bfstylename ++ % bold: ++ \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize ++ \else ++ % regular: ++ \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize ++ \fi + \fi + \thisecfont + } +@@ -3244,6 +3316,20 @@ + \finishedtitlepagetrue + } + ++% Settings used for typesetting titles: no hyphenation, no indentation, ++% don't worry much about spacing, ragged right. This should be used ++% inside a \vbox, and fonts need to be set appropriately first. Because ++% it is always used for titles, nothing else, we call \rmisbold. \par ++% should be specified before the end of the \vbox, since a vbox is a group. ++% ++\def\raggedtitlesettings{% ++ \rmisbold ++ \hyphenpenalty=10000 ++ \parindent=0pt ++ \tolerance=5000 ++ \ptexraggedright ++} ++ + % Macros to be used within @titlepage: + + \let\subtitlerm=\tenrm +@@ -3251,7 +3337,7 @@ + + \parseargdef\title{% + \checkenv\titlepage +- \leftline{\titlefonts\rmisbold #1} ++ \vbox{\titlefonts \raggedtitlesettings #1\par}% + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +@@ -3599,7 +3685,7 @@ + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + % +- % Try typesetting the item mark that if the document erroneously says ++ % Try typesetting the item mark so that if the document erroneously says + % something like @itemize @samp (intending @table), there's an error + % right away at the @itemize. It's not the best error message in the + % world, but it's better than leaving it to the @item. This means if +@@ -3850,18 +3936,22 @@ + + % multitable-only commands. + % +-% @headitem starts a heading row, which we typeset in bold. +-% Assignments have to be global since we are inside the implicit group +-% of an alignment entry. \everycr resets \everytab so we don't have to ++% @headitem starts a heading row, which we typeset in bold. Assignments ++% have to be global since we are inside the implicit group of an ++% alignment entry. \everycr below resets \everytab so we don't have to + % undo it ourselves. + \def\headitemfont{\b}% for people to use in the template row; not changeable + \def\headitem{% + \checkenv\multitable + \crcr ++ \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings + \global\everytab={\bf}% can't use \headitemfont since the parsing differs + \the\everytab % for the first item + }% + % ++% default for tables with no headings. ++\let\headitemcrhook=\relax ++% + % A \tab used to include \hskip1sp. But then the space in a template + % line is not enough. That is bad. So let's go back to just `&' until + % we again encounter the problem the 1sp was intended to solve. +@@ -3892,15 +3982,15 @@ + % + \everycr = {% + \noalign{% +- \global\everytab={}% ++ \global\everytab={}% Reset from possible headitem. + \global\colcount=0 % Reset the column counter. +- % Check for saved footnotes, etc. ++ % ++ % Check for saved footnotes, etc.: + \checkinserts +- % Keeps underfull box messages off when table breaks over pages. +- %\filbreak +- % Maybe so, but it also creates really weird page breaks when the +- % table breaks over pages. Wouldn't \vfil be better? Wait until the +- % problem manifests itself, so it can be fixed for real --karl. ++ % ++ % Perhaps a \nobreak, then reset: ++ \headitemcrhook ++ \global\let\headitemcrhook=\relax + }% + }% + % +@@ -4139,7 +4229,7 @@ + \def\value{\begingroup\makevalueexpandable\valuexxx} + \def\valuexxx#1{\expandablevalue{#1}\endgroup} + { +- \catcode`\- = \active \catcode`\_ = \active ++ \catcode`\-=\active \catcode`\_=\active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue +@@ -4148,7 +4238,7 @@ + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. +- \let-\realdash \let_\normalunderscore ++ \let-\normaldash \let_\normalunderscore + } + } + +@@ -4160,6 +4250,11 @@ + % it will fail (although perhaps we could fix that with sufficient work + % to do a one-level expansion on the result, instead of complete). + % ++% Unfortunately, this has the consequence that when _ is in the *value* ++% of an @set, it does not print properly in the roman fonts (get the cmr ++% dot accent at position 126 instead). No fix comes to mind, and it's ++% been this way since 2003 or earlier, so just ignore it. ++% + \def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% +@@ -4172,7 +4267,8 @@ + % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined + % with @set. + % +-% To get special treatment of `@end ifset,' call \makeond and the redefine. ++% To get the special treatment we need for `@end ifset,' we call ++% \makecond and then redefine. + % + \makecond{ifset} + \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +@@ -4188,7 +4284,7 @@ + } + \def\ifsetfail{\doignore{ifset}} + +-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been ++% @ifclear VAR ... @end executes the `...' iff VAR has never been + % defined with @set, or has been undefined with @clear. + % + % The `\else' inside the `\doifset' parameter is a trick to reuse the +@@ -4199,6 +4295,35 @@ + \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} + \def\ifclearfail{\doignore{ifclear}} + ++% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written ++% without the @) is in fact defined. We can only feasibly check at the ++% TeX level, so something like `mathcode' is going to considered ++% defined even though it is not a Texinfo command. ++% ++\makecond{ifcommanddefined} ++\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} ++% ++\def\doifcmddefined#1#2{{% ++ \makevalueexpandable ++ \let\next=\empty ++ \expandafter\ifx\csname #2\endcsname\relax ++ #1% If not defined, \let\next as above. ++ \fi ++ \expandafter ++ }\next ++} ++\def\ifcmddefinedfail{\doignore{ifcommanddefined}} ++ ++% @ifcommandnotdefined CMD ... handled similar to @ifclear above. ++\makecond{ifcommandnotdefined} ++\def\ifcommandnotdefined{% ++ \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} ++\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} ++ ++% Set the `txicommandconditionals' variable, so documents have a way to ++% test if the @ifcommand...defined conditionals are available. ++\set txicommandconditionals ++ + % @dircategory CATEGORY -- specify a category of the dir file + % which this file should belong to. Ignore this in TeX. + \let\dircategory=\comment +@@ -4307,7 +4432,7 @@ + % complicated, when \tex is in effect and \{ is a \delimiter again. + % We can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. Perhaps we +- % should define @lbrace and @rbrace commands a la @comma. ++ % should use @lbracechar and @rbracechar? + \def\{{{\tt\char123}}% + \def\}{{\tt\char125}}% + % +@@ -4328,8 +4453,7 @@ + % @end macro + % ... + % @funindex commtest +- % +- % The above is not enough to reproduce the bug, but it gives the flavor. ++ % This is not enough to reproduce the bug, but it gives the flavor. + % + % Sample whatsit resulting: + % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} +@@ -4435,6 +4559,7 @@ + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright ++ \definedummyword\lbracechar + \definedummyword\leq + \definedummyword\minus + \definedummyword\ogonek +@@ -4447,6 +4572,7 @@ + \definedummyword\quoteleft + \definedummyword\quoteright + \definedummyword\quotesinglbase ++ \definedummyword\rbracechar + \definedummyword\result + \definedummyword\textdegree + % +@@ -4498,6 +4624,7 @@ + \definedummyword\t + % + % Commands that take arguments. ++ \definedummyword\abbr + \definedummyword\acronym + \definedummyword\anchor + \definedummyword\cite +@@ -4509,7 +4636,9 @@ + \definedummyword\emph + \definedummyword\env + \definedummyword\file ++ \definedummyword\image + \definedummyword\indicateurl ++ \definedummyword\inforef + \definedummyword\kbd + \definedummyword\key + \definedummyword\math +@@ -4525,8 +4654,21 @@ + \definedummyword\verb + \definedummyword\w + \definedummyword\xref ++ % ++ % Consider: ++ % @macro mkind{arg1,arg2} ++ % @cindex \arg2\ ++ % @end macro ++ % @mkind{foo, bar} ++ % The space after the comma will end up in the temporary definition ++ % that we make for arg2 (see \parsemargdef ff.). We want all this to be ++ % expanded for the sake of the index, so we end up just seeing "bar". ++ \let\xeatspaces = \eatspaces + } + ++% For testing: output @{ and @} in index sort strings as \{ and \}. ++\newif\ifusebracesinindexes ++ + % \indexnofonts is used when outputting the strings to sort the index + % by, and when constructing control sequence names. It eliminates all + % control sequences and just writes whatever the best ASCII sort string +@@ -4555,8 +4697,16 @@ + % Unfortunately, texindex is not prepared to handle braces in the + % content at all. So for index sorting, we map @{ and @} to strings + % starting with |, since that ASCII character is between ASCII { and }. +- \def\{{|a}% +- \def\}{|b}% ++ \ifusebracesinindexes ++ \def\lbracechar{\lbracecmd}% ++ \def\rbracechar{\rbracecmd}% ++ \else ++ \def\lbracechar{|a}% ++ \def\rbracechar{|b}% ++ \fi ++ \let\{=\lbracechar ++ \let\}=\rbracechar ++ % + % + % Non-English letters. + \def\AA{AA}% +@@ -4732,10 +4882,9 @@ + % + % ..., ready, GO: + % +-\def\safewhatsit#1{% +-\ifhmode ++\def\safewhatsit#1{\ifhmode + #1% +-\else ++ \else + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \whatsitskip = \lastskip + \edef\lastskipmacro{\the\lastskip}% +@@ -4759,7 +4908,6 @@ + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: +- % + % @deffn deffn-whatever + % @vindex index-whatever + % Description. +@@ -4772,8 +4920,7 @@ + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +-\fi +-} ++\fi} + + % The index entry written in the file actually looks like + % \entry {sortstring}{page}{topic} +@@ -5520,14 +5667,6 @@ + + % Define @majorheading, @heading and @subheading + +-% NOTE on use of \vbox for chapter headings, section headings, and such: +-% 1) We use \vbox rather than the earlier \line to permit +-% overlong headings to fold. +-% 2) \hyphenpenalty is set to 10000 because hyphenation in a +-% heading is obnoxious; this forbids it. +-% 3) Likewise, headings look best if no \parindent is used, and +-% if justification is not attempted. Hence \raggedright. +- + \def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +@@ -5535,10 +5674,8 @@ + + \def\chapheading{\chapbreak \parsearg\chapheadingzzz} + \def\chapheadingzzz#1{% +- {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 +- \parindent=0pt\ptexraggedright +- \rmisbold #1\hfill}}% +- \bigskip \par\penalty 200\relax ++ \vbox{\chapfonts \raggedtitlesettings #1\par}% ++ \nobreak\bigskip \nobreak + \suppressfirstparagraphindent + } + +@@ -5697,8 +5834,7 @@ + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. +- \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright +- \hangindent=\wd0 \centerparametersmaybe ++ \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title +@@ -5720,18 +5856,18 @@ + \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} + % + \def\unnchfopen #1{% +-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 +- \parindent=0pt\ptexraggedright +- \rmisbold #1\hfill}}\bigskip \par\nobreak ++ \chapoddpage ++ \vbox{\chapfonts \raggedtitlesettings #1\par}% ++ \nobreak\bigskip\nobreak + } + \def\chfopen #1#2{\chapoddpage {\chapfonts + \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% + \par\penalty 5000 % + } + \def\centerchfopen #1{% +-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 +- \parindent=0pt +- \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak ++ \chapoddpage ++ \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% ++ \nobreak\bigskip \nobreak + } + \def\CHAPFopen{% + \global\let\chapmacro=\chfopen +@@ -5822,7 +5958,7 @@ + % + % Now the second mark, after the heading break. No break points + % between here and the heading. +- \let\prevsectiondefs=\lastsectiondefs ++ \global\let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. +@@ -5876,14 +6012,15 @@ + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a +- % discardable item.) ++ % discardable item.) However, when a paragraph is not started next ++ % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out ++ % or the negative glue will cause weirdly wrong output, typically ++ % obscuring the section heading with something else. + \vskip-\parskip + % +- % This is purely so the last item on the list is a known \penalty > +- % 10000. This is so \startdefun can avoid allowing breakpoints after +- % section headings. Otherwise, it would insert a valid breakpoint between: +- % @section sec-whatever +- % @deffn def-whatever ++ % This is so the last item on the main vertical list is a known ++ % \penalty > 10000, so \startdefun, etc., can recognize the situation ++ % and do the needful. + \penalty 10001 + } + +@@ -6188,8 +6325,8 @@ + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other +- \catcode`\`=\other +- \catcode`\'=\other ++ \catcode `\`=\other ++ \catcode `\'=\other + \escapechar=`\\ + % + % ' is active in math mode (mathcode"8000). So reset it, and all our +@@ -6213,7 +6350,7 @@ + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext +- \expandafter \let\csname top\endcsname=\ptextop % outer ++ \expandafter \let\csname top\endcsname=\ptextop % we've made it outer + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% +@@ -6297,13 +6434,11 @@ + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip +- % Flag to tell @lisp, etc., not to narrow margin. +- \let\nonarrowing = t% + % + % If this cartouche directly follows a sectioning command, we need the + % \parskip glue (backspaced over by default) or the cartouche can + % collide with the section heading. +- \ifnum\lastpenalty>10000 \vskip\parskip \fi ++ \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi + % + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt +@@ -6338,7 +6473,7 @@ + \newdimen\nonfillparindent + \def\nonfillstart{% + \aboveenvbreak +- \hfuzz = 12pt % Don't be fussy ++ \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output +@@ -6465,9 +6600,13 @@ + + + % @raggedright does more-or-less normal line breaking but no right +-% justification. From plain.tex. ++% justification. From plain.tex. Don't stretch around special ++% characters in urls in this environment, since the stretch at the right ++% should be enough. + \envdef\raggedright{% +- \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax ++ \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax ++ \def\urefprestretchamount{0pt}% ++ \def\urefpoststretchamount{0pt}% + } + \let\Eraggedright\par + +@@ -6496,16 +6635,9 @@ + \makedispenvdef{quotation}{\quotationstart} + % + \def\quotationstart{% +- {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip +- \parindent=0pt +- % +- % @cartouche defines \nonarrowing to inhibit narrowing at next level down. ++ \indentedblockstart % same as \indentedblock, but increase right margin too. + \ifx\nonarrowing\relax +- \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing +- \exdentamount = \lispnarrowing +- \else +- \let\nonarrowing = \relax + \fi + \parsearg\quotationlabel + } +@@ -6531,6 +6663,32 @@ + \fi + } + ++% @indentedblock is like @quotation, but indents only on the left and ++% has no optional argument. ++% ++\makedispenvdef{indentedblock}{\indentedblockstart} ++% ++\def\indentedblockstart{% ++ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip ++ \parindent=0pt ++ % ++ % @cartouche defines \nonarrowing to inhibit narrowing at next level down. ++ \ifx\nonarrowing\relax ++ \advance\leftskip by \lispnarrowing ++ \exdentamount = \lispnarrowing ++ \else ++ \let\nonarrowing = \relax ++ \fi ++} ++ ++% Keep a nonzero parskip for the environment, since we're doing normal filling. ++% ++\def\Eindentedblock{% ++ \par ++ {\parskip=0pt \afterenvbreak}% ++} ++\def\Esmallindentedblock{\Eindentedblock} ++ + + % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} + % If we want to allow any <char> as delimiter, +@@ -7009,7 +7167,10 @@ + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we +- % want a way to get ttsl. Let's try @var for that. ++ % want a way to get ttsl. We used to recommend @var for that, so ++ % leave the code in, but it's strange for @var to lead to typewriter. ++ % Nowadays we recommend @code, since the difference between a ttsl hyphen ++ % and a tt hyphen is pretty tiny. @code also disables ?` !`. + \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + #1% + \sl\hyphenchar\font=45 +@@ -7338,7 +7499,7 @@ + + % Parse the optional {params} list. Set up \paramno and \paramlist + % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH +-% in the params list to some hook where the argument si to be expanded. If ++% in the params list to some hook where the argument is to be expanded. If + % there are less than 10 arguments that hook is to be replaced by ##N where N + % is the position in that list, that is to say the macro arguments are to be + % defined `a la TeX in the macro body. +@@ -7793,7 +7954,7 @@ + \fi\fi + } + +- ++% + % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is + % the node name, #2 the name of the Info cross-reference, #3 the printed + % node name, #4 the name of the Info file, #5 the name of the printed +@@ -7803,16 +7964,21 @@ + \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} + \def\ref#1{\xrefX[#1,,,,,,,]} + % +-\newbox\topbox ++\newbox\toprefbox + \newbox\printedrefnamebox ++\newbox\infofilenamebox + \newbox\printedmanualbox + % + \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + % ++ % Get args without leading/trailing spaces. + \def\printedrefname{\ignorespaces #3}% + \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% + % ++ \def\infofilename{\ignorespaces #4}% ++ \setbox\infofilenamebox = \hbox{\infofilename\unskip}% ++ % + \def\printedmanual{\ignorespaces #5}% + \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% + % +@@ -7845,12 +8011,20 @@ + \ifpdf + {\indexnofonts + \turnoffactive ++ \makevalueexpandable + % This expands tokens, so do it after making catcode changes, so _ +- % etc. don't get their TeX definitions. ++ % etc. don't get their TeX definitions. This ignores all spaces in ++ % #4, including (wrongly) those in the middle of the filename. + \getfilename{#4}% + % ++ % This (wrongly) does not take account of leading or trailing ++ % spaces in #1, which should be ignored. + \edef\pdfxrefdest{#1}% +- \txiescapepdf\pdfxrefdest ++ \ifx\pdfxrefdest\empty ++ \def\pdfxrefdest{Top}% no empty targets ++ \else ++ \txiescapepdf\pdfxrefdest % escape PDF special chars ++ \fi + % + \leavevmode + \startlink attr{/Border [0 0 0]}% +@@ -7883,7 +8057,7 @@ + \printedrefname + \fi + % +- % if the user also gave the printed manual name (fifth arg), append ++ % If the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd\printedmanualbox > 0pt + \space \putwordin{} \cite{\printedmanual}% +@@ -7898,32 +8072,20 @@ + % this is a loss. Therefore, we give the text of the node name + % again, so it is as if TeX is seeing it for the first time. + % +- % Cross-manual reference. Only include the "Section ``foo'' in" if +- % the foo is neither missing or Top. Thus, @xref{,,,foo,The Foo Manual} +- % outputs simply "see The Foo Manual". + \ifdim \wd\printedmanualbox > 0pt +- % What is the 7sp about? The idea is that we also want to omit +- % the Section part if we would be printing "Top", since they are +- % clearly trying to refer to the whole manual. But, this being +- % TeX, we can't easily compare strings while ignoring the possible +- % spaces before and after in the input. By adding the arbitrary +- % 7sp, we make it much less likely that a real node name would +- % happen to have the same width as "Top" (e.g., in a monospaced font). +- % I hope it will never happen in practice. ++ % Cross-manual reference with a printed manual name. + % +- % For the same basic reason, we retypeset the "Top" at every +- % reference, since the current font is indeterminate. ++ \crossmanualxref{\cite{\printedmanual\unskip}}% ++ % ++ \else\ifdim \wd\infofilenamebox > 0pt ++ % Cross-manual reference with only an info filename (arg 4), no ++ % printed manual name (arg 5). This is essentially the same as ++ % the case above; we output the filename, since we have nothing else. + % +- \setbox\topbox = \hbox{Top\kern7sp}% +- \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% +- \ifdim \wd2 > 7sp +- \ifdim \wd2 = \wd\topbox \else +- \putwordSection{} ``\printedrefname'' \putwordin{}\space +- \fi +- \fi +- \cite{\printedmanual}% ++ \crossmanualxref{\code{\infofilename\unskip}}% ++ % + \else +- % Reference in this manual. ++ % Reference within this manual. + % + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand +@@ -7944,11 +8106,37 @@ + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% +- \fi ++ \fi\fi + \fi + \endlink + \endgroup} + ++% Output a cross-manual xref to #1. Used just above (twice). ++% ++% Only include the text "Section ``foo'' in" if the foo is neither ++% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply ++% "see The Foo Manual", the idea being to refer to the whole manual. ++% ++% But, this being TeX, we can't easily compare our node name against the ++% string "Top" while ignoring the possible spaces before and after in ++% the input. By adding the arbitrary 7sp below, we make it much less ++% likely that a real node name would have the same width as "Top" (e.g., ++% in a monospaced font). Hopefully it will never happen in practice. ++% ++% For the same basic reason, we retypeset the "Top" at every ++% reference, since the current font is indeterminate. ++% ++\def\crossmanualxref#1{% ++ \setbox\toprefbox = \hbox{Top\kern7sp}% ++ \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% ++ \ifdim \wd2 > 7sp % nonempty? ++ \ifdim \wd2 = \wd\toprefbox \else % same as Top? ++ \putwordSection{} ``\printedrefname'' \putwordin{}\space ++ \fi ++ \fi ++ #1% ++} ++ + % This macro is called from \xrefX for the `[nodename]' part of xref + % output. It's a separate macro only so it can be changed more easily, + % since square brackets don't work well in some documents. Particularly +@@ -8173,6 +8361,7 @@ + \gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent ++ % + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % +@@ -8196,6 +8385,11 @@ + % + \gdef\dofootnote{% + \insert\footins\bgroup ++ % ++ % Nested footnotes are not supported in TeX, that would take a lot ++ % more work. (\startsavinginserts does not suffice.) ++ \let\footnote=\errfootnote ++ % + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. +@@ -8233,13 +8427,19 @@ + } + }%end \catcode `\@=11 + ++\def\errfootnote{% ++ \errhelp=\EMsimple ++ \errmessage{Nested footnotes not supported in texinfo.tex, ++ even though they work in makeinfo; sorry} ++} ++ + % In case a @footnote appears in a vbox, save the footnote text and create + % the real \insert just after the vbox finished. Otherwise, the insertion + % would be lost. + % Similarly, if a @footnote appears inside an alignment, save the footnote + % text to a box and make the \insert when a row of the table is finished. + % And the same can be done for other insert classes. --kasal, 16nov03. +- ++% + % Replace the \insert primitive by a cheating macro. + % Deeper inside, just make sure that the saved insertions are not spilled + % out prematurely. +@@ -8316,7 +8516,7 @@ + it from ftp://tug.org/tex/epsf.tex.} + % + \def\image#1{% +- \ifx\epsfbox\thisiundefined ++ \ifx\epsfbox\thisisundefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% +@@ -8340,6 +8540,13 @@ + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue ++ \else \ifx\centersub\centerV ++ % for @center @image, we need a vbox so we can have our vertical space ++ \imagevmodetrue ++ \vbox\bgroup % vbox has better behavior than vtop herev ++ \fi\fi ++ % ++ \ifimagevmode + \nobreak\medskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space +@@ -8349,9 +8556,13 @@ + \fi + % + % Leave vertical mode so that indentation from an enclosing +- % environment such as @quotation is respected. On the other hand, if +- % it's at the top level, we don't want the normal paragraph indentation. +- \noindent ++ % environment such as @quotation is respected. ++ % However, if we're at the top level, we don't want the ++ % normal paragraph indentation. ++ % On the other hand, if we are in the case of @center @image, we don't ++ % want to start a paragraph, which will create a hsize-width box and ++ % eradicate the centering. ++ \ifx\centersub\centerV\else \noindent \fi + % + % Output the image. + \ifpdf +@@ -8363,7 +8574,10 @@ + \epsfbox{#1.eps}% + \fi + % +- \ifimagevmode \medskip \fi % space after the standalone image ++ \ifimagevmode ++ \medskip % space after a standalone image ++ \fi ++ \ifx\centersub\centerV \egroup \fi + \endgroup} + + +@@ -9793,11 +10007,9 @@ + \catcode`\"=\active + \def\activedoublequote{{\tt\char34}} + \let"=\activedoublequote +-\catcode`\~=\active +-\def~{{\tt\char126}} ++\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde + \chardef\hat=`\^ +-\catcode`\^=\active +-\def^{{\tt \hat}} ++\catcode`\^=\active \def\activehat{{\tt \hat}} \let^ = \activehat + + \catcode`\_=\active + \def_{\ifusingtt\normalunderscore\_} +@@ -9807,16 +10019,26 @@ + + \catcode`\|=\active + \def|{{\tt\char124}} ++ + \chardef \less=`\< +-\catcode`\<=\active +-\def<{{\tt \less}} ++\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless + \chardef \gtr=`\> +-\catcode`\>=\active +-\def>{{\tt \gtr}} +-\catcode`\+=\active +-\def+{{\tt \char 43}} +-\catcode`\$=\active +-\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix ++\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr ++\catcode`\+=\active \def+{{\tt \char 43}} ++\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix ++ ++% used for headline/footline in the output routine, in case the page ++% breaks in the middle of an @tex block. ++\def\texinfochars{% ++ \let< = \activeless ++ \let> = \activegtr ++ \let~ = \activetilde ++ \let^ = \activehat ++ \markupsetuplqdefault \markupsetuprqdefault ++ \let\b = \strong ++ \let\i = \smartitalic ++ % in principle, all other definitions in \tex have to be undone too. ++} + + % If a .fmt file is being used, characters that might appear in a file + % name cannot be active until we have parsed the command line. +@@ -9866,22 +10088,26 @@ + @gdef@otherbackslash{@let\=@realbackslash} + + % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +-% the literal character `\'. ++% the literal character `\'. Also revert - to its normal character, in ++% case the active - from code has slipped in. + % +-@def@normalturnoffactive{% +- @let"=@normaldoublequote +- @let$=@normaldollar %$ font-lock fix +- @let+=@normalplus +- @let<=@normalless +- @let>=@normalgreater +- @let\=@normalbackslash +- @let^=@normalcaret +- @let_=@normalunderscore +- @let|=@normalverticalbar +- @let~=@normaltilde +- @markupsetuplqdefault +- @markupsetuprqdefault +- @unsepspaces ++{@catcode`- = @active ++ @gdef@normalturnoffactive{% ++ @let-=@normaldash ++ @let"=@normaldoublequote ++ @let$=@normaldollar %$ font-lock fix ++ @let+=@normalplus ++ @let<=@normalless ++ @let>=@normalgreater ++ @let\=@normalbackslash ++ @let^=@normalcaret ++ @let_=@normalunderscore ++ @let|=@normalverticalbar ++ @let~=@normaltilde ++ @markupsetuplqdefault ++ @markupsetuprqdefault ++ @unsepspaces ++ } + } + + % Make _ and + \other characters, temporarily. +diff -urN glibc-2.17-c758a686/manual/threads.texi glibc-2.17-c758a686/manual/threads.texi +--- glibc-2.17-c758a686/manual/threads.texi 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/manual/threads.texi 2014-09-12 16:10:06.042792724 -0400 +@@ -0,0 +1,254 @@ ++@node POSIX Threads ++@c @node POSIX Threads, Internal Probes, Cryptographic Functions, Top ++@chapter POSIX Threads ++@c %MENU% POSIX Threads ++@cindex pthreads ++ ++This chapter describes the @glibcadj{} POSIX Thread implementation. ++ ++@menu ++* Thread-specific Data:: Support for creating and ++ managing thread-specific data ++* Non-POSIX Extensions:: Additional functions to extend ++ POSIX Thread functionality ++@end menu ++ ++@node Thread-specific Data ++@section Thread-specific Data ++ ++The @glibcadj{} implements functions to allow users to create and manage ++data specific to a thread. Such data may be destroyed at thread exit, ++if a destructor is provided. The following functions are defined: ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_key_create (pthread_key_t *@var{key}, void (*@var{destructor})(void*)) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c pthread_key_create ok ++@c KEY_UNUSED ok ++@c KEY_USABLE ok ++Create a thread-specific data key for the calling thread, referenced by ++@var{key}. ++ ++Objects declared with the C++11 @code{thread_local} keyword are destroyed ++before thread-specific data, so they should not be used in thread-specific ++data destructors or even as members of the thread-specific data, since the ++latter is passed as an argument to the destructor function. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_key_delete (pthread_key_t @var{key}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c pthread_key_delete ok ++@c This uses atomic compare and exchange to increment the seq number ++@c after testing it's not a KEY_UNUSED seq number. ++@c KEY_UNUSED dup ok ++Destroy the thread-specific data @var{key} in the calling thread. The ++destructor for the thread-specific data is not called during destruction, nor ++is it called during thread exit. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun void *pthread_getspecific (pthread_key_t @var{key}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c pthread_getspecific ok ++Return the thread-specific data associated with @var{key} in the calling ++thread. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_setspecific (pthread_key_t @var{key}, const void *@var{value}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}} ++@c pthread_setspecific @asucorrupt @ascuheap @acucorrupt @acsmem ++@c a level2 block may be allocated by a signal handler after ++@c another call already made a decision to allocate it, thus losing ++@c the allocated value. the seq number is updated before the ++@c value, which might cause an earlier-generation value to seem ++@c current if setspecific is cancelled or interrupted by a signal ++@c KEY_UNUSED ok ++@c calloc dup @ascuheap @acsmem ++Associate the thread-specific @var{value} with @var{key} in the calling thread. ++@end deftypefun ++ ++ ++@node Non-POSIX Extensions ++@section Non-POSIX Extensions ++ ++In addition to implementing the POSIX API for threads, @theglibc{} provides ++additional functions and interfaces to provide functionality not specified in ++the standard. ++ ++@menu ++* Default Thread Attributes:: Setting default attributes for ++ threads in a process. ++@end menu ++ ++@node Default Thread Attributes ++@subsection Setting Process-wide defaults for thread attributes ++ ++@Theglibc{} provides non-standard API functions to set and get the default ++attributes used in the creation of threads in a process. ++ ++@comment pthread.h ++@comment GNU ++@deftypefun int pthread_getattr_default_np (pthread_attr_t *@var{attr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c Takes lock around read from default_pthread_attr. ++Get the default attribute values and set @var{attr} to match. This ++function returns @math{0} on success and a non-zero error code on ++failure. ++@end deftypefun ++ ++@comment pthread.h ++@comment GNU ++@deftypefun int pthread_setattr_default_np (pthread_attr_t *@var{attr}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}} ++@c pthread_setattr_default_np @ascuheap @asulock @aculock @acsmem ++@c check_sched_policy_attr ok ++@c check_sched_priority_attr ok ++@c sched_get_priority_min dup ok ++@c sched_get_priority_max dup ok ++@c check_cpuset_attr ok ++@c determine_cpumask_size ok ++@c check_stacksize_attr ok ++@c lll_lock @asulock @aculock ++@c free dup @ascuheap @acsmem ++@c realloc dup @ascuheap @acsmem ++@c memcpy dup ok ++@c lll_unlock @asulock @aculock ++Set the default attribute values to match the values in @var{attr}. The ++function returns @math{0} on success and a non-zero error code on failure. ++The following error codes are defined for this function: ++ ++@table @code ++@item EINVAL ++At least one of the values in @var{attr} does not qualify as valid for the ++attributes or the stack address is set in the attribute. ++@item ENOMEM ++The system does not have sufficient memory. ++@end table ++@end deftypefun ++ ++@c FIXME these are undocumented: ++@c pthread_atfork ++@c pthread_attr_destroy ++@c pthread_attr_getaffinity_np ++@c pthread_attr_getdetachstate ++@c pthread_attr_getguardsize ++@c pthread_attr_getinheritsched ++@c pthread_attr_getschedparam ++@c pthread_attr_getschedpolicy ++@c pthread_attr_getscope ++@c pthread_attr_getstack ++@c pthread_attr_getstackaddr ++@c pthread_attr_getstacksize ++@c pthread_attr_init ++@c pthread_attr_setaffinity_np ++@c pthread_attr_setdetachstate ++@c pthread_attr_setguardsize ++@c pthread_attr_setinheritsched ++@c pthread_attr_setschedparam ++@c pthread_attr_setschedpolicy ++@c pthread_attr_setscope ++@c pthread_attr_setstack ++@c pthread_attr_setstackaddr ++@c pthread_attr_setstacksize ++@c pthread_barrierattr_destroy ++@c pthread_barrierattr_getpshared ++@c pthread_barrierattr_init ++@c pthread_barrierattr_setpshared ++@c pthread_barrier_destroy ++@c pthread_barrier_init ++@c pthread_barrier_wait ++@c pthread_cancel ++@c pthread_cleanup_push ++@c pthread_cleanup_pop ++@c pthread_condattr_destroy ++@c pthread_condattr_getclock ++@c pthread_condattr_getpshared ++@c pthread_condattr_init ++@c pthread_condattr_setclock ++@c pthread_condattr_setpshared ++@c pthread_cond_broadcast ++@c pthread_cond_destroy ++@c pthread_cond_init ++@c pthread_cond_signal ++@c pthread_cond_timedwait ++@c pthread_cond_wait ++@c pthread_create ++@c pthread_detach ++@c pthread_equal ++@c pthread_exit ++@c pthread_getaffinity_np ++@c pthread_getattr_np ++@c pthread_getconcurrency ++@c pthread_getcpuclockid ++@c pthread_getname_np ++@c pthread_getschedparam ++@c pthread_join ++@c pthread_kill ++@c pthread_kill_other_threads_np ++@c pthread_mutexattr_destroy ++@c pthread_mutexattr_getkind_np ++@c pthread_mutexattr_getprioceiling ++@c pthread_mutexattr_getprotocol ++@c pthread_mutexattr_getpshared ++@c pthread_mutexattr_getrobust ++@c pthread_mutexattr_getrobust_np ++@c pthread_mutexattr_gettype ++@c pthread_mutexattr_init ++@c pthread_mutexattr_setkind_np ++@c pthread_mutexattr_setprioceiling ++@c pthread_mutexattr_setprotocol ++@c pthread_mutexattr_setpshared ++@c pthread_mutexattr_setrobust ++@c pthread_mutexattr_setrobust_np ++@c pthread_mutexattr_settype ++@c pthread_mutex_consistent ++@c pthread_mutex_consistent_np ++@c pthread_mutex_destroy ++@c pthread_mutex_getprioceiling ++@c pthread_mutex_init ++@c pthread_mutex_lock ++@c pthread_mutex_setprioceiling ++@c pthread_mutex_timedlock ++@c pthread_mutex_trylock ++@c pthread_mutex_unlock ++@c pthread_once ++@c pthread_rwlockattr_destroy ++@c pthread_rwlockattr_getkind_np ++@c pthread_rwlockattr_getpshared ++@c pthread_rwlockattr_init ++@c pthread_rwlockattr_setkind_np ++@c pthread_rwlockattr_setpshared ++@c pthread_rwlock_destroy ++@c pthread_rwlock_init ++@c pthread_rwlock_rdlock ++@c pthread_rwlock_timedrdlock ++@c pthread_rwlock_timedwrlock ++@c pthread_rwlock_tryrdlock ++@c pthread_rwlock_trywrlock ++@c pthread_rwlock_unlock ++@c pthread_rwlock_wrlock ++@c pthread_self ++@c pthread_setaffinity_np ++@c pthread_setcancelstate ++@c pthread_setcanceltype ++@c pthread_setconcurrency ++@c pthread_setname_np ++@c pthread_setschedparam ++@c pthread_setschedprio ++@c pthread_sigmask ++@c pthread_sigqueue ++@c pthread_spin_destroy ++@c pthread_spin_init ++@c pthread_spin_lock ++@c pthread_spin_trylock ++@c pthread_spin_unlock ++@c pthread_testcancel ++@c pthread_timedjoin_np ++@c pthread_tryjoin_np ++@c pthread_yield +diff -urN glibc-2.17-c758a686/manual/time.texi glibc-2.17-c758a686/manual/time.texi +--- glibc-2.17-c758a686/manual/time.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/time.texi 2014-09-12 16:10:06.044792719 -0400 +@@ -79,6 +79,7 @@ + @comment time.h + @comment ISO + @deftypefun double difftime (time_t @var{time1}, time_t @var{time0}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{difftime} function returns the number of seconds of elapsed + time between calendar time @var{time1} and calendar time @var{time0}, as + a value of type @code{double}. The difference ignores leap seconds +@@ -246,6 +247,12 @@ + @comment time.h + @comment ISO + @deftypefun clock_t clock (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On Hurd, this calls task_info twice and adds user and system time ++@c from both basic and thread time info structs. On generic posix, ++@c calls times and adds utime and stime. On bsd, calls getrusage and ++@c safely converts stime and utime to clock. On linux, calls ++@c clock_gettime. + This function returns the calling process' current CPU time. If the CPU + time is not available or cannot be represented, @code{clock} returns the + value @code{(clock_t)(-1)}. +@@ -310,6 +317,12 @@ + @comment sys/times.h + @comment POSIX.1 + @deftypefun clock_t times (struct tms *@var{buffer}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On HURD, this calls task_info twice, for basic and thread times info, ++@c adding user and system times into tms, and then gettimeofday, to ++@c compute the real time. On BSD, it calls getclktck, getrusage (twice) ++@c and time. On Linux, it's a syscall with special handling to account ++@c for clock_t counts that look like error values. + The @code{times} function stores the processor time information for + the calling process in @var{buffer}. + +@@ -409,6 +422,7 @@ + @comment time.h + @comment ISO + @deftypefun time_t time (time_t *@var{result}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{time} function returns the current calendar time as a value of + type @code{time_t}. If the argument @var{result} is not a null pointer, + the calendar time value is also stored in @code{*@var{result}}. If the +@@ -420,7 +434,9 @@ + @c Linux. + @comment time.h + @comment SVID, XPG +-@deftypefun int stime (time_t *@var{newtime}) ++@deftypefun int stime (const time_t *@var{newtime}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On unix, this is implemented in terms of settimeofday. + @code{stime} sets the system clock, i.e., it tells the system that the + current calendar time is @var{newtime}, where @code{newtime} is + interpreted as described in the above definition of @code{time_t}. +@@ -475,6 +491,12 @@ + @comment sys/time.h + @comment BSD + @deftypefun int gettimeofday (struct timeval *@var{tp}, struct timezone *@var{tzp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On most GNU/Linux systems this is a direct syscall, but the posix/ ++@c implementation (not used on GNU/Linux or GNU/Hurd) relies on time and ++@c localtime_r, saving and restoring tzname in an unsafe manner. ++@c On some GNU/Linux variants, ifunc resolvers are used in shared libc ++@c for vdso resolution. ifunc-vdso-revisit. + The @code{gettimeofday} function returns the current calendar time as + the elapsed time since the epoch in the @code{struct timeval} structure + indicated by @var{tp}. (@pxref{Elapsed Time} for a description of +@@ -498,6 +520,9 @@ + @comment sys/time.h + @comment BSD + @deftypefun int settimeofday (const struct timeval *@var{tp}, const struct timezone *@var{tzp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On HURD, it calls host_set_time with a privileged port. On other ++@c unix systems, it's a syscall. + The @code{settimeofday} function sets the current calendar time in the + system clock according to the arguments. As for @code{gettimeofday}, + the calendar time is represented as the elapsed time since the epoch. +@@ -539,6 +564,10 @@ + @comment sys/time.h + @comment BSD + @deftypefun int adjtime (const struct timeval *@var{delta}, struct timeval *@var{olddelta}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On hurd and mach, call host_adjust_time with a privileged port. On ++@c Linux, it's implemented in terms of adjtimex. On other unixen, it's ++@c a syscall. + This function speeds up or slows down the system clock in order to make + a gradual adjustment. This ensures that the calendar time reported by + the system clock is always monotonically increasing, which might not +@@ -577,6 +606,8 @@ + @comment sys/timex.h + @comment GNU + @deftypefun int adjtimex (struct timex *@var{timex}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c It's a syscall, only available on linux. + + @code{adjtimex} is functionally identical to @code{ntp_adjtime}. + @xref{High Accuracy Clock}. +@@ -674,6 +705,10 @@ + @comment time.h + @comment ISO + @deftypefun {struct tm *} localtime (const time_t *@var{time}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:tmbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c Calls tz_convert with a static buffer. ++@c localtime @mtasurace:tmbuf @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c tz_convert dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd + The @code{localtime} function converts the simple time pointed to by + @var{time} to broken-down time representation, expressed relative to the + user's specified time zone. +@@ -687,9 +722,8 @@ + as a broken-down time; typically this is because the year cannot fit into + an @code{int}. + +-Calling @code{localtime} has one other effect: it sets the variable +-@code{tzname} with information about the current time zone. @xref{Time +-Zone Functions}. ++Calling @code{localtime} also sets the current time zone as if ++@code{tzset} were called. @xref{Time Zone Functions}. + @end deftypefun + + Using the @code{localtime} function is a big problem in multi-threaded +@@ -699,6 +733,87 @@ + @comment time.h + @comment POSIX.1c + @deftypefun {struct tm *} localtime_r (const time_t *@var{time}, struct tm *@var{resultp}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c localtime_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c tz_convert(use_localtime) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c tzset_internal @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c always called with tzset_lock held ++@c sets static is_initialized before initialization; ++@c reads and sets old_tz; sets tz_rules. ++@c some of the issues only apply on the first call. ++@c subsequent calls only trigger these when called by localtime; ++@c otherwise, they're ok. ++@c getenv dup @mtsenv ++@c strcmp dup ok ++@c strdup @ascuheap ++@c tzfile_read @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c memcmp dup ok ++@c strstr dup ok ++@c getenv dup @mtsenv ++@c asprintf dup @mtslocale @ascuheap @acsmem ++@c stat64 dup ok ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fileno dup ok ++@c fstat64 dup ok ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c free dup @ascuheap @acsmem ++@c fsetlocking dup ok [no @mtasurace:stream @asulock, exclusive] ++@c fread_unlocked dup ok [no @mtasurace:stream @asucorrupt @acucorrupt] ++@c memcpy dup ok ++@c decode ok ++@c bswap_32 dup ok ++@c fseek dup ok [no @mtasurace:stream @asucorrupt @acucorrupt] ++@c ftello dup ok [no @mtasurace:stream @asucorrupt @acucorrupt] ++@c malloc dup @ascuheap @acsmem ++@c decode64 ok ++@c bswap_64 dup ok ++@c getc_unlocked ok [no @mtasurace:stream @asucorrupt @acucorrupt] ++@c tzstring dup @ascuheap @acsmem ++@c compute_tzname_max dup ok [guarded by tzset_lock] ++@c memset dup ok ++@c update_vars ok [guarded by tzset_lock] ++@c sets daylight, timezone, tzname and tzname_cur_max; ++@c called only with tzset_lock held, unless tzset_parse_tz ++@c (internal, but not static) gets called by users; given the its ++@c double-underscore-prefixed name, this interface violation could ++@c be regarded as undefined behavior. ++@c strlen ok ++@c tzset_parse_tz @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c sscanf dup @mtslocale @ascuheap @acsmem ++@c isalnum dup @mtsenv ++@c tzstring @ascuheap @acsmem ++@c reads and changes tzstring_list without synchronization, but ++@c only called with tzset_lock held (save for interface violations) ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c strcpy dup ok ++@c isdigit dup @mtslocale ++@c compute_offset ok ++@c tzfile_default @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c sets tzname, timezone, types, zone_names, rule_*off, etc; no guards ++@c strlen dup ok ++@c tzfile_read dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c mempcpy dup ok ++@c compute_tzname_max ok [if guarded by tzset_lock] ++@c iterates over zone_names; no guards ++@c free dup @ascuheap @acsmem ++@c strtoul dup @mtslocale ++@c update_vars dup ok ++@c tzfile_compute(use_localtime) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c sets tzname; no guards. with !use_localtime, as in gmtime, it's ok ++@c tzstring dup @acsuheap @acsmem ++@c tzset_parse_tz dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c offtime dup ok ++@c tz_compute dup ok ++@c strcmp dup ok ++@c offtime ok ++@c isleap dup ok ++@c tz_compute ok ++@c compute_change ok ++@c isleap ok ++@c libc_lock_unlock dup @aculock ++ + The @code{localtime_r} function works just like the @code{localtime} + function. It takes a pointer to a variable containing a simple time + and converts it to the broken-down time format. +@@ -715,6 +830,9 @@ + @comment time.h + @comment ISO + @deftypefun {struct tm *} gmtime (const time_t *@var{time}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:tmbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c gmtime @mtasurace:tmbuf @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c tz_convert dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd + This function is similar to @code{localtime}, except that the broken-down + time is expressed as Coordinated Universal Time (UTC) (formerly called + Greenwich Mean Time (GMT)) rather than relative to a local time zone. +@@ -728,6 +846,15 @@ + @comment time.h + @comment POSIX.1c + @deftypefun {struct tm *} gmtime_r (const time_t *@var{time}, struct tm *@var{resultp}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c You'd think tz_convert could avoid some safety issues with ++@c !use_localtime, but no such luck: tzset_internal will always bring ++@c about all possible AS and AC problems when it's first called. ++@c Calling any of localtime,gmtime_r once would run the initialization ++@c and avoid the heap, mem and fd issues in gmtime* in subsequent calls, ++@c but the unsafe locking would remain. ++@c gmtime_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c tz_convert(gmtime_r) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd + This function is similar to @code{localtime_r}, except that it converts + just like @code{gmtime} the given time as Coordinated Universal Time. + +@@ -739,30 +866,58 @@ + @comment time.h + @comment ISO + @deftypefun time_t mktime (struct tm *@var{brokentime}) +-The @code{mktime} function is used to convert a broken-down time structure +-to a simple time representation. It also ``normalizes'' the contents of +-the broken-down time structure, by filling in the day of week and day of +-year based on the other date and time components. ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c mktime @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c passes a static localtime_offset to mktime_internal; it is read ++@c once, used as an initial guess, and updated at the end, but not ++@c used except as a guess for subsequent calls, so it should be safe. ++@c Even though a compiler might delay the load and perform it multiple ++@c times (bug 16346), there are at least two unconditional uses of the ++@c auto variable in which the first load is stored, separated by a ++@c call to an external function, and a conditional change of the ++@c variable before the external call, so refraining from allocating a ++@c local variable at the first load would be a very bad optimization. ++@c tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c mktime_internal(localtime_r) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c ydhms_diff ok ++@c ranged_convert(localtime_r) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c *convert = localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c time_t_avg dup ok ++@c guess_time_tm dup ok ++@c ydhms_diff dup ok ++@c time_t_add_ok ok ++@c time_t_avg ok ++@c isdst_differ ok ++@c time_t_int_add_ok ok ++The @code{mktime} function converts a broken-down time structure to a ++simple time representation. It also normalizes the contents of the ++broken-down time structure, and fills in some components based on the ++values of the others. + + The @code{mktime} function ignores the specified contents of the +-@code{tm_wday} and @code{tm_yday} members of the broken-down time ++@code{tm_wday}, @code{tm_yday}, @code{tm_gmtoff}, and @code{tm_zone} ++members of the broken-down time + structure. It uses the values of the other components to determine the + calendar time; it's permissible for these components to have + unnormalized values outside their normal ranges. The last thing that + @code{mktime} does is adjust the components of the @var{brokentime} +-structure (including the @code{tm_wday} and @code{tm_yday}). ++structure, including the members that were initially ignored. + + If the specified broken-down time cannot be represented as a simple time, + @code{mktime} returns a value of @code{(time_t)(-1)} and does not modify + the contents of @var{brokentime}. + +-Calling @code{mktime} also sets the variable @code{tzname} with +-information about the current time zone. @xref{Time Zone Functions}. ++Calling @code{mktime} also sets the current time zone as if ++@code{tzset} were called; @code{mktime} uses this information instead ++of @var{brokentime}'s initial @code{tm_gmtoff} and @code{tm_zone} ++members. @xref{Time Zone Functions}. + @end deftypefun + + @comment time.h + @comment ??? + @deftypefun time_t timelocal (struct tm *@var{brokentime}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c Alias to mktime. + + @code{timelocal} is functionally identical to @code{mktime}, but more + mnemonically named. Note that it is the inverse of the @code{localtime} +@@ -776,6 +931,19 @@ + @comment time.h + @comment ??? + @deftypefun time_t timegm (struct tm *@var{brokentime}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c timegm @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c gmtime_offset triggers the same caveats as localtime_offset in mktime. ++@c although gmtime_r, as called by mktime, might save some issues, ++@c tzset calls tzset_internal with always, which forces ++@c reinitialization, so all issues may arise. ++@c tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c mktime_internal(gmtime_r) @asulock @aculock ++@c ..gmtime_r @asulock @aculock ++@c ... dup ok ++@c tz_convert(!use_localtime) @asulock @aculock ++@c ... dup @asulock @aculock ++@c tzfile_compute(!use_localtime) ok + + @code{timegm} is functionally identical to @code{mktime} except it + always takes the input values to be Coordinated Universal Time (UTC) +@@ -837,6 +1005,8 @@ + @comment sys/timex.h + @comment GNU + @deftypefun int ntp_gettime (struct ntptimeval *@var{tptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Wrapper for adjtimex. + The @code{ntp_gettime} function sets the structure pointed to by + @var{tptr} to current values. The elements of the structure afterwards + contain the values the timer implementation in the kernel assumes. They +@@ -954,6 +1124,8 @@ + @comment sys/timex.h + @comment GNU + @deftypefun int ntp_adjtime (struct timex *@var{tptr}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Alias to adjtimex syscall. + The @code{ntp_adjtime} function sets the structure specified by + @var{tptr} to current values. + +@@ -1008,6 +1180,13 @@ + @comment time.h + @comment ISO + @deftypefun {char *} asctime (const struct tm *@var{brokentime}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:asctime} @mtslocale{}}@asunsafe{}@acsafe{}} ++@c asctime @mtasurace:asctime @mtslocale ++@c Uses a static buffer. ++@c asctime_internal @mtslocale ++@c snprintf dup @mtslocale [no @acsuheap @acsmem] ++@c ab_day_name @mtslocale ++@c ab_month_name @mtslocale + The @code{asctime} function converts the broken-down time value that + @var{brokentime} points to into a string in a standard format: + +@@ -1031,6 +1210,9 @@ + @comment time.h + @comment POSIX.1c + @deftypefun {char *} asctime_r (const struct tm *@var{brokentime}, char *@var{buffer}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} ++@c asctime_r @mtslocale ++@c asctime_internal dup @mtslocale + This function is similar to @code{asctime} but instead of placing the + result in a static buffer it writes the string in the buffer pointed to + by the parameter @var{buffer}. This buffer should have room +@@ -1045,6 +1227,10 @@ + @comment time.h + @comment ISO + @deftypefun {char *} ctime (const time_t *@var{time}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:tmbuf} @mtasurace{:asctime} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c ctime @mtasurace:tmbuf @mtasurace:asctime @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c localtime dup @mtasurace:tmbuf @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c asctime dup @mtasurace:asctime @mtslocale + The @code{ctime} function is similar to @code{asctime}, except that you + specify the calendar time argument as a @code{time_t} simple time value + rather than in broken-down local time format. It is equivalent to +@@ -1053,13 +1239,17 @@ + asctime (localtime (@var{time})) + @end smallexample + +-@code{ctime} sets the variable @code{tzname}, because @code{localtime} +-does so. @xref{Time Zone Functions}. ++Calling @code{ctime} also sets the current time zone as if ++@code{tzset} were called. @xref{Time Zone Functions}. + @end deftypefun + + @comment time.h + @comment POSIX.1c + @deftypefun {char *} ctime_r (const time_t *@var{time}, char *@var{buffer}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c ctime_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c asctime_r dup @mtslocale + This function is similar to @code{ctime}, but places the result in the + string pointed to by @var{buffer}. It is equivalent to (written using + gcc extensions, @pxref{Statement Exprs,,,gcc,Porting and Using gcc}): +@@ -1077,17 +1267,75 @@ + @comment time.h + @comment ISO + @deftypefun size_t strftime (char *@var{s}, size_t @var{size}, const char *@var{template}, const struct tm *@var{brokentime}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c strftime @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c strftime_l @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c strftime_internal @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c add ok ++@c memset_zero dup ok ++@c memset_space dup ok ++@c strlen dup ok ++@c mbrlen @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd [no @mtasurace:mbstate/!ps] ++@c mbsinit dup ok ++@c cpy ok ++@c add dup ok ++@c memcpy_lowcase ok ++@c TOLOWER ok ++@c tolower_l ok ++@c memcpy_uppcase ok ++@c TOUPPER ok ++@c toupper_l ok ++@c MEMCPY ok ++@c memcpy dup ok ++@c ISDIGIT ok ++@c STRLEN ok ++@c strlen dup ok ++@c strftime_internal dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c TOUPPER dup ok ++@c nl_get_era_entry @ascuheap @asulock @acsmem @aculock ++@c nl_init_era_entries @ascuheap @asulock @acsmem @aculock ++@c libc_rwlock_wrlock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c memset dup ok ++@c free dup @ascuheap @acsmem ++@c realloc dup @ascuheap @acsmem ++@c memcpy dup ok ++@c strchr dup ok ++@c wcschr dup ok ++@c libc_rwlock_unlock dup @asulock @aculock ++@c ERA_DATE_CMP ok ++@c DO_NUMBER ok ++@c DO_NUMBER_SPACEPAD ok ++@c nl_get_alt_digit @ascuheap @asulock @acsmem @aculock ++@c libc_rwlock_wrlock dup @asulock @aculock ++@c nl_init_alt_digit @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c memset dup ok ++@c strchr dup ok ++@c libc_rwlock_unlock dup @aculock ++@c memset_space ok ++@c memset dup ok ++@c memset_zero ok ++@c memset dup ok ++@c mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c iso_week_days ok ++@c isleap ok ++@c tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c gmtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c tm_diff ok + This function is similar to the @code{sprintf} function (@pxref{Formatted + Input}), but the conversion specifications that can appear in the format + template @var{template} are specialized for printing components of the date + and time @var{brokentime} according to the locale currently specified for +-time conversion (@pxref{Locales}). ++time conversion (@pxref{Locales}) and the current time zone ++(@pxref{Time Zone Functions}). + + Ordinary characters appearing in the @var{template} are copied to the + output string @var{s}; this can include multibyte character sequences. + Conversion specifiers are introduced by a @samp{%} character, followed + by an optional flag which can be one of the following. These flags +-are all GNU extensions. The first three affect only the output of ++are all GNU extensions. The first three affect only the output of + numbers: + + @table @code +@@ -1392,9 +1640,10 @@ + If @var{s} is a null pointer, @code{strftime} does not actually write + anything, but instead returns the number of characters it would have written. + +-According to POSIX.1 every call to @code{strftime} implies a call to +-@code{tzset}. So the contents of the environment variable @code{TZ} +-is examined before any output is produced. ++Calling @code{strftime} also sets the current time zone as if ++@code{tzset} were called; @code{strftime} uses this information ++instead of @var{brokentime}'s @code{tm_gmtoff} and @code{tm_zone} ++members. @xref{Time Zone Functions}. + + For an example of @code{strftime}, see @ref{Time Functions Example}. + @end deftypefun +@@ -1402,6 +1651,53 @@ + @comment time.h + @comment ISO/Amend1 + @deftypefun size_t wcsftime (wchar_t *@var{s}, size_t @var{size}, const wchar_t *@var{template}, const struct tm *@var{brokentime}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} ++@c wcsftime @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c wcsftime_l @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c wcsftime_internal @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c add ok ++@c memset_zero dup ok ++@c memset_space dup ok ++@c wcslen dup ok ++@c cpy ok ++@c add dup ok ++@c memcpy_lowcase ok ++@c TOLOWER ok ++@c towlower_l dup ok ++@c memcpy_uppcase ok ++@c TOUPPER ok ++@c towupper_l dup ok ++@c MEMCPY ok ++@c wmemcpy dup ok ++@c widen @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c memset dup ok ++@c mbsrtowcs_l @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd [no @mtasurace:mbstate/!ps] ++@c ISDIGIT ok ++@c STRLEN ok ++@c wcslen dup ok ++@c wcsftime_internal dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd ++@c TOUPPER dup ok ++@c nl_get_era_entry dup @ascuheap @asulock @acsmem @aculock ++@c DO_NUMBER ok ++@c DO_NUMBER_SPACEPAD ok ++@c nl_get_walt_digit dup @ascuheap @asulock @acsmem @aculock ++@c libc_rwlock_wrlock dup @asulock @aculock ++@c nl_init_alt_digit dup @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c memset dup ok ++@c wcschr dup ok ++@c libc_rwlock_unlock dup @aculock ++@c memset_space ok ++@c wmemset dup ok ++@c memset_zero ok ++@c wmemset dup ok ++@c mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c iso_week_days ok ++@c isleap ok ++@c tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c gmtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c tm_diff ok + The @code{wcsftime} function is equivalent to the @code{strftime} + function with the difference that it operates on wide character + strings. The buffer where the result is stored, pointed to by @var{s}, +@@ -1452,6 +1748,32 @@ + @comment time.h + @comment XPG4 + @deftypefun {char *} strptime (const char *@var{s}, const char *@var{fmt}, struct tm *@var{tp}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c strptime @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c strptime_internal @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c memset dup ok ++@c ISSPACE ok ++@c isspace_l dup ok ++@c match_char ok ++@c match_string ok ++@c strlen dup ok ++@c strncasecmp_l dup ok ++@c strcmp dup ok ++@c recursive @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c strptime_internal dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c get_number ok ++@c ISSPACE dup ok ++@c localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c nl_select_era_entry @ascuheap @asulock @acsmem @aculock ++@c nl_init_era_entries dup @ascuheap @asulock @acsmem @aculock ++@c get_alt_number dup @ascuheap @asulock @acsmem @aculock ++@c nl_parse_alt_digit dup @ascuheap @asulock @acsmem @aculock ++@c libc_rwlock_wrlock dup @asulock @aculock ++@c nl_init_alt_digit dup @ascuheap @acsmem ++@c libc_rwlock_unlock dup @aculock ++@c get_number dup ok ++@c day_of_the_week ok ++@c day_of_the_year ok + The @code{strptime} function parses the input string @var{s} according + to the format string @var{fmt} and stores its results in the + structure @var{tp}. +@@ -1865,6 +2187,9 @@ + @comment time.h + @comment Unix98 + @deftypefun {struct tm *} getdate (const char *@var{string}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:getdate} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c getdate @mtasurace:getdate @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c getdate_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd + The interface to @code{getdate} is the simplest possible for a function + to parse a string and return the value. @var{string} is the input + string and the result is returned in a statically-allocated variable. +@@ -1976,6 +2301,30 @@ + @comment time.h + @comment GNU + @deftypefun int getdate_r (const char *@var{string}, struct tm *@var{tp}) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c getdate_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c getenv dup @mtsenv ++@c stat64 dup ok ++@c access dup ok ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking dup ok [no @mtasurace:stream @asulock, exclusive] ++@c isspace dup @mtslocale ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c memcpy dup ok ++@c getline dup @ascuheap @acsmem [no @asucorrupt @aculock @acucorrupt, exclusive] ++@c strptime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c feof_unlocked dup ok ++@c free dup @ascuheap @acsmem ++@c ferror_unlocked dup dup ok ++@c time dup ok ++@c localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c first_wday @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c memset dup ok ++@c mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c check_mday ok ++@c mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd + The @code{getdate_r} function is the reentrant counterpart of + @code{getdate}. It does not use the global variable @code{getdate_err} + to signal an error, but instead returns an error code. The same error +@@ -2037,7 +2386,7 @@ + [@code{+}|@code{-}]@var{hh}[@code{:}@var{mm}[@code{:}@var{ss}]]. This + is positive if the local time zone is west of the Prime Meridian and + negative if it is east. The hour must be between @code{0} and +-@code{23}, and the minute and seconds between @code{0} and @code{59}. ++@code{24}, and the minute and seconds between @code{0} and @code{59}. + + For example, here is how we would specify Eastern Standard Time, but + without any Daylight Saving Time alternative: +@@ -2082,17 +2431,51 @@ + + The @var{time} fields specify when, in the local time currently in + effect, the change to the other time occurs. If omitted, the default is +-@code{02:00:00}. +- +-For example, here is how you would specify the Eastern time zone in the +-United States, including the appropriate Daylight Saving Time and its dates +-of applicability. The normal offset from UTC is 5 hours; since this is ++@code{02:00:00}. The hours part of the time fields can range from ++@minus{}167 through 167; this is an extension to POSIX.1, which allows ++only the range 0 through 24. ++ ++Here are some example @code{TZ} values, including the appropriate ++Daylight Saving Time and its dates of applicability. In North ++American Eastern Standard Time (EST) and Eastern Daylight Time (EDT), ++the normal offset from UTC is 5 hours; since this is + west of the prime meridian, the sign is positive. Summer time begins on +-the first Sunday in April at 2:00am, and ends on the last Sunday in October ++March's second Sunday at 2:00am, and ends on November's first Sunday + at 2:00am. + + @smallexample +-EST+5EDT,M4.1.0/2,M10.5.0/2 ++EST+5EDT,M3.2.0/2,M11.1.0/2 ++@end smallexample ++ ++Israel Standard Time (IST) and Israel Daylight Time (IDT) are 2 hours ++ahead of the prime meridian in winter, springing forward an hour on ++March's fourth Thursday at 26:00 (i.e., 02:00 on the first Friday on or ++after March 23), and falling back on October's last Sunday at 02:00. ++ ++@smallexample ++IST-2IDT,M3.4.4/26,M10.5.0 ++@end smallexample ++ ++Western Argentina Summer Time (WARST) is 3 hours behind the prime ++meridian all year. There is a dummy fall-back transition on December ++31 at 25:00 daylight saving time (i.e., 24:00 standard time, ++equivalent to January 1 at 00:00 standard time), and a simultaneous ++spring-forward transition on January 1 at 00:00 standard time, so ++daylight saving time is in effect all year and the initial @code{WART} ++is a placeholder. ++ ++@smallexample ++WART4WARST,J1/0,J365/25 ++@end smallexample ++ ++Western Greenland Time (WGT) and Western Greenland Summer Time (WGST) ++are 3 hours behind UTC in the winter. Its clocks follow the European ++Union rules of springing forward by one hour on March's last Sunday at ++01:00 UTC (@minus{}02:00 local time) and falling back on October's ++last Sunday at 01:00 UTC (@minus{}01:00 local time). ++ ++@smallexample ++WGT3WGST,M3.5.0/-2,M10.5.0/-1 + @end smallexample + + The schedule of Daylight Saving Time in any particular jurisdiction has +@@ -2177,6 +2560,11 @@ + @comment time.h + @comment POSIX.1 + @deftypefun void tzset (void) ++@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c tzset @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c tzset_internal dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_lock_unlock dup @aculock + The @code{tzset} function initializes the @code{tzname} variable from + the value of the @code{TZ} environment variable. It is not usually + necessary for your program to call this function, because it is called +@@ -2314,7 +2702,16 @@ + + @comment sys/time.h + @comment BSD +-@deftypefun int setitimer (int @var{which}, struct itimerval *@var{new}, struct itimerval *@var{old}) ++@deftypefun int setitimer (int @var{which}, const struct itimerval *@var{new}, struct itimerval *@var{old}) ++@safety{@prelim{}@mtsafe{@mtstimer{}}@assafe{}@acsafe{}} ++@c This function is marked with @mtstimer because the same set of timers ++@c is shared by all threads of a process, so calling it in one thread ++@c may interfere with timers set by another thread. This interference ++@c is not regarded as destructive, because the interface specification ++@c makes this overriding while returning the previous value the expected ++@c behavior, and the kernel will serialize concurrent calls so that the ++@c last one prevails, with each call getting the timer information from ++@c the timer installed by the previous call in that serialization. + The @code{setitimer} function sets the timer specified by @var{which} + according to @var{new}. The @var{which} argument can have a value of + @code{ITIMER_REAL}, @code{ITIMER_VIRTUAL}, or @code{ITIMER_PROF}. +@@ -2335,6 +2732,7 @@ + @comment sys/time.h + @comment BSD + @deftypefun int getitimer (int @var{which}, struct itimerval *@var{old}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getitimer} function stores information about the timer specified + by @var{which} in the structure pointed at by @var{old}. + +@@ -2367,6 +2765,8 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {unsigned int} alarm (unsigned int @var{seconds}) ++@safety{@prelim{}@mtsafe{@mtstimer{}}@assafe{}@acsafe{}} ++@c Wrapper for setitimer. + The @code{alarm} function sets the real-time timer to expire in + @var{seconds} seconds. If you want to cancel any existing alarm, you + can do this by calling @code{alarm} with a @var{seconds} argument of +@@ -2426,6 +2826,10 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {unsigned int} sleep (unsigned int @var{seconds}) ++@safety{@prelim{}@mtunsafe{@mtascusig{:SIGCHLD/linux}}@asunsafe{}@acunsafe{}} ++@c On Mach, it uses ports and calls time. On generic posix, it calls ++@c nanosleep. On Linux, it temporarily blocks SIGCHLD, which is MT- and ++@c AS-Unsafe, and in a way that makes it AC-Unsafe (C-unsafe, even!). + The @code{sleep} function waits for @var{seconds} or until a signal + is delivered, whichever happens first. + +@@ -2470,6 +2874,9 @@ + @comment time.h + @comment POSIX.1 + @deftypefun int nanosleep (const struct timespec *@var{requested_time}, struct timespec *@var{remaining}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c On Linux, it's a syscall. On Mach, it calls gettimeofday and uses ++@c ports. + If resolution to seconds is not enough the @code{nanosleep} function can + be used. As the name suggests the sleep interval can be specified in + nanoseconds. The actual elapsed time of the sleep interval might be +diff -urN glibc-2.17-c758a686/manual/tsort.awk glibc-2.17-c758a686/manual/tsort.awk +--- glibc-2.17-c758a686/manual/tsort.awk 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/tsort.awk 2014-09-12 16:10:06.043792722 -0400 +@@ -1,6 +1,6 @@ + #! /usr/bin/awk -f + # Generate topologically sorted list of manual chapters. +-# (C) Copyright 1998, 1999 Free Software Foundation, Inc. ++# Copyright (C) 1998-2014 Free Software Foundation, Inc. + # Written by Ulrich Drepper <drepper@cygnus.com>, 1998. + + BEGIN { +diff -urN glibc-2.17-c758a686/manual/users.texi glibc-2.17-c758a686/manual/users.texi +--- glibc-2.17-c758a686/manual/users.texi 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/manual/users.texi 2014-09-12 16:10:06.043792722 -0400 +@@ -71,7 +71,7 @@ + @cindex group ID + Users are classified in @dfn{groups}. Each user name belongs to one + @dfn{default group} and may also belong to any number of +-@dfn{supplementary groups}. Users who are members of the same group can ++@dfn{supplementary groups}. Users who are members of the same group can + share resources (such as files) that are not accessible to users who are + not a member of that group. Each group has a @dfn{group name} and + @dfn{group ID}. @xref{Group Database}, for how to find information +@@ -221,30 +221,37 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun uid_t getuid (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} ++@c Atomic syscall, except on hurd, where it takes a lock within a hurd ++@c critical section. + The @code{getuid} function returns the real user ID of the process. + @end deftypefun + + @comment unistd.h + @comment POSIX.1 + @deftypefun gid_t getgid (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getgid} function returns the real group ID of the process. + @end deftypefun + + @comment unistd.h + @comment POSIX.1 + @deftypefun uid_t geteuid (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{geteuid} function returns the effective user ID of the process. + @end deftypefun + + @comment unistd.h + @comment POSIX.1 + @deftypefun gid_t getegid (void) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getegid} function returns the effective group ID of the process. + @end deftypefun + + @comment unistd.h + @comment POSIX.1 + @deftypefun int getgroups (int @var{count}, gid_t *@var{groups}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + The @code{getgroups} function is used to inquire about the supplementary + group IDs of the process. Up to @var{count} of these group IDs are + stored in the array @var{groups}; the return value from the function is +@@ -291,6 +298,34 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int seteuid (uid_t @var{neweuid}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c seteuid @asulock @aculock ++@c INLINE_SETXID_SYSCALL @asulock @aculock ++@c This may be just a unix syscall, or the ugliness below used by ++@c nptl to propagate the syscall to all cloned processes used to ++@c implement threads. ++@c nptl_setxid @asulock @aculock ++@c while holding the stack_alloc_lock, mark with SETXID_BITMASK all ++@c threads that are not exiting, signal them until no thread remains ++@c marked, clear the marks and run the syscall, then release the lock. ++@c lll_lock @asulock @aculock ++@c list_for_each ok ++@c list_entry ok ++@c setxid_mark_thread ok ++@c if a thread is initializing, wait for it to be cloned. ++@c mark it with SETXID_BITMASK if it's not exiting ++@c setxid_signal_thread ok ++@c if a thread is marked with SETXID_BITMASK, ++@c send it the SIGSETXID signal ++@c setxid_unmark_thread ok ++@c clear SETXID_BITMASK and release the futex if SETXID_BITMASK is ++@c set. ++@c <syscall> ok ++@c lll_unlock @aculock ++@c ++@c sighandler_setxid ok ++@c issue the syscall, clear SETXID_BITMASK, release the futex, and ++@c wake up the signaller loop if the counter reached zero. + This function sets the effective user ID of a process to @var{neweuid}, + provided that the process is allowed to change its effective user ID. A + privileged process (effective user ID zero) can change its effective +@@ -318,6 +353,9 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int setuid (uid_t @var{newuid}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c setuid @asulock @aculock ++@c INLINE_SETXID_SYSCALL dup @asulock @aculock + If the calling process is privileged, this function sets both the real + and effective user ID of the process to @var{newuid}. It also deletes + the file user ID of the process, if any. @var{newuid} may be any +@@ -334,6 +372,9 @@ + @comment unistd.h + @comment BSD + @deftypefun int setreuid (uid_t @var{ruid}, uid_t @var{euid}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c setreuid @asulock @aculock ++@c INLINE_SETXID_SYSCALL dup @asulock @aculock + This function sets the real user ID of the process to @var{ruid} and the + effective user ID to @var{euid}. If @var{ruid} is @code{-1}, it means + not to change the real user ID; likewise if @var{euid} is @code{-1}, it +@@ -369,6 +410,9 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int setegid (gid_t @var{newgid}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c setegid @asulock @aculock ++@c INLINE_SETXID_SYSCALL dup @asulock @aculock + This function sets the effective group ID of the process to + @var{newgid}, provided that the process is allowed to change its group + ID. Just as with @code{seteuid}, if the process is privileged it may +@@ -388,6 +432,9 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun int setgid (gid_t @var{newgid}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c setgid @asulock @aculock ++@c INLINE_SETXID_SYSCALL dup @asulock @aculock + This function sets both the real and effective group ID of the process + to @var{newgid}, provided that the process is privileged. It also + deletes the file group ID, if any. +@@ -402,6 +449,9 @@ + @comment unistd.h + @comment BSD + @deftypefun int setregid (gid_t @var{rgid}, gid_t @var{egid}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c setregid @asulock @aculock ++@c INLINE_SETXID_SYSCALL dup @asulock @aculock + This function sets the real group ID of the process to @var{rgid} and + the effective group ID to @var{egid}. If @var{rgid} is @code{-1}, it + means not to change the real group ID; likewise if @var{egid} is +@@ -437,7 +487,10 @@ + + @comment grp.h + @comment BSD +-@deftypefun int setgroups (size_t @var{count}, gid_t *@var{groups}) ++@deftypefun int setgroups (size_t @var{count}, const gid_t *@var{groups}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} ++@c setgroups @asulock @aculock ++@c INLINE_SETXID_SYSCALL dup @asulock @aculock + This function sets the process's supplementary group IDs. It can only + be called from privileged processes. The @var{count} argument specifies + the number of group IDs in the array @var{groups}. +@@ -455,6 +508,36 @@ + @comment grp.h + @comment BSD + @deftypefun int initgroups (const char *@var{user}, gid_t @var{group}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @acsmem{} @acsfd{} @aculock{}}} ++@c initgroups @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c sysconf(_SC_NGROUPS_MAX) dup @acsfd ++@c MIN dup ok ++@c malloc @ascuheap @acsmem ++@c internal_getgrouplist @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_getgrouplist @ascuheap @acsfd @acsmem ++@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem ++@c nscd_cache_search dup ok ++@c nscd_open_socket dup @acsfd ++@c realloc dup @ascuheap @acsmem ++@c readall dup ok ++@c memcpy dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c nscd_drop_map_ref dup @ascuheap @acsmem ++@c nscd_unmap dup @ascuheap @acsmem ++@c nss_database_lookup dup @mtslocale @ascuheap @asulock @acucorrupt @acsmem @acsfd @aculock ++@c nss_lookup_function dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c compat_call @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c sysconf(_SC_GETGR_R_SIZE_MAX) ok ++@c nss_lookup_function dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *getgrent_fct @ascuplugin ++@c *setgrent_fct @ascuplugin ++@c *endgrent_fct @ascuplugin ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c *initgroups_dyn_fct @ascuplugin ++@c nss_next_action dup ok ++@c setgroups dup @asulock @aculock ++@c free dup @ascuheap @acsmem + The @code{initgroups} function sets the process's supplementary group + IDs to be the normal default for the user name @var{user}. The group + @var{group} is automatically included. +@@ -476,6 +559,13 @@ + @comment grp.h + @comment BSD + @deftypefun int getgrouplist (const char *@var{user}, gid_t @var{group}, gid_t *@var{groups}, int *@var{ngroups}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @acsmem{} @acsfd{} @aculock{}}} ++@c getgrouplist @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c MAX dup ok ++@c malloc dup @ascuheap @acsmem ++@c internal_getgrouplist dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c memcpy dup ok ++@c free dup @ascuheap @acsmem + The @code{getgrouplist} function scans the group database for all the + groups @var{user} belongs to. Up to *@var{ngroups} group IDs + corresponding to these groups are stored in the array @var{groups}; the +@@ -740,7 +830,7 @@ + Be cautious about using the @code{exec} functions in combination with + changing the effective user ID. Don't let users of your program execute + arbitrary programs under a changed user ID. Executing a shell is +-especially bad news. Less obviously, the @code{execlp} and @code{execvp} ++especially bad news. Less obviously, the @code{execlp} and @code{execvp} + functions are a potential risk (since the program they execute depends + on the user's @code{PATH} environment variable). + +@@ -792,6 +882,41 @@ + @comment unistd.h + @comment POSIX.1 + @deftypefun {char *} getlogin (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:getlogin} @mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getlogin (linux) @mtasurace:getlogin @mtasurace:utent @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getlogin_r_loginuid dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getlogin_fd0 (unix) @mtasurace:getlogin @mtasurace:utent @mtascusig:ALRM @mtascutimer @ascuheap @asulock @aculock @acsfd @acsmem ++@c uses static buffer name => @mtasurace:getlogin ++@c ttyname_r dup @ascuheap @acsmem @acsfd ++@c strncpy dup ok ++@c setutent dup @mtasurace:utent @asulock @aculock @acsfd ++@c getutline_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c endutent dup @mtasurace:utent @asulock @aculock ++@c libc_lock_unlock dup ok ++@c strlen dup ok ++@c memcpy dup ok ++@c ++@c getlogin_r (linux) @mtasurace:utent @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getlogin_r_loginuid @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c open_not_cancel_2 dup @acsfd ++@c read_not_cancel dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c strtoul @mtslocale ++@c getpwuid_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @asulock @aculock @acsfd @acsmem ++@c strlen dup ok ++@c memcpy dup ok ++@c free dup @asulock @aculock @acsfd @acsmem ++@c getlogin_r_fd0 (unix) @mtasurace:utent @mtascusig:ALRM @mtascutimer @ascuheap @asulock @aculock @acsmem @acsfd ++@c ttyname_r dup @ascuheap @acsmem @acsfd ++@c strncpy dup ok ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->setutent dup @mtasurace:utent @acsfd ++@c *libc_utmp_jump_table->getutline_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer ++@c *libc_utmp_jump_table->endutent dup @mtasurace:utent @asulock @aculock ++@c libc_lock_unlock dup ok ++@c strlen dup ok ++@c memcpy dup ok + The @code{getlogin} function returns a pointer to a string containing the + name of the user logged in on the controlling terminal of the process, + or a null pointer if this information cannot be determined. The string +@@ -802,6 +927,11 @@ + @comment stdio.h + @comment POSIX.1 + @deftypefun {char *} cuserid (char *@var{string}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c cuserid @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c geteuid dup ok ++@c getpwuid_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c strncpy dup ok + The @code{cuserid} function returns a pointer to a string containing a + user name associated with the effective ID of the process. If + @var{string} is not a null pointer, it should be an array that can hold +@@ -1013,6 +1143,22 @@ + @comment utmp.h + @comment SVID + @deftypefun void setutent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c Besides the static variables in utmp_file.c, there's the jump_table. ++@c They're both modified while holding a lock, but other threads may ++@c cause the variables to be modified between calling this function and ++@c others that rely on the internal state it sets up. ++ ++@c setutent @mtasurace:utent @asulock @aculock @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->setutent @mtasurace:utent @acsfd ++@c setutent_unknown @mtasurace:utent @acsfd ++@c *libc_utmp_file_functions.setutent = setutent_file @mtasurace:utent @acsfd ++@c open_not_cancel_2 dup @acsfd ++@c fcntl_not_cancel dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c lseek64 dup ok ++@c libc_lock_unlock dup ok + This function opens the user accounting database to begin scanning it. + You can then call @code{getutent}, @code{getutid} or @code{getutline} to + read entries and @code{pututline} to write entries. +@@ -1024,6 +1170,14 @@ + @comment utmp.h + @comment SVID + @deftypefun {struct utmp *} getutent (void) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasurace{:utent} @mtasurace{:utentbuf} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c The static buffer that holds results is allocated with malloc at ++@c the first call; the test is not thread-safe, so multiple concurrent ++@c calls could malloc multiple buffers. ++ ++@c getutent @mtuinit @mtasurace:utent @mtasurace:utentbuf @mtascusig:ALRM @mtascutimer @ascuheap @asulock @aculock @acsfd @acsmem ++@c malloc @asulock @aculock @acsfd @acsmem ++@c getutent_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd + The @code{getutent} function reads the next entry from the user + accounting database. It returns a pointer to the entry, which is + statically allocated and may be overwritten by subsequent calls to +@@ -1037,12 +1191,27 @@ + @comment utmp.h + @comment SVID + @deftypefun void endutent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c endutent @mtasurace:utent @asulock @aculock @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->endutent @mtasurace:utent @acsfd ++@c endutent_unknown ok ++@c endutent_file @mtasurace:utent @acsfd ++@c close_not_cancel_no_status dup @acsfd ++@c libc_lock_unlock dup ok + This function closes the user accounting database. + @end deftypefun + + @comment utmp.h + @comment SVID + @deftypefun {struct utmp *} getutid (const struct utmp *@var{id}) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} ++@c Same caveats as getutline. ++@c ++@c getutid @mtuinit @mtasurace:utent @mtascusig:ALRM @mtascutimer @ascuheap @asulock @aculock @acsmem @acsfd ++@c uses a static buffer malloced on the first call ++@c malloc dup @ascuheap @acsmem ++@c getutid_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd + This function searches forward from the current point in the database + for an entry that matches @var{id}. If the @code{ut_type} member of the + @var{id} structure is one of @code{RUN_LVL}, @code{BOOT_TIME}, +@@ -1073,6 +1242,14 @@ + @comment utmp.h + @comment SVID + @deftypefun {struct utmp *} getutline (const struct utmp *@var{line}) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c The static buffer that holds results is allocated with malloc at ++@c the first call; the test is not thread-safe, so multiple concurrent ++@c calls could malloc multiple buffers. ++ ++@c getutline @mtuinit @mtasurace:utent @mtascusig:ALRM @mtascutimer @ascuheap @asulock @aculock @acsfd @acsmem ++@c malloc @asulock @aculock @acsfd @acsmem ++@c getutline_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd + This function searches forward from the current point in the database + until it finds an entry whose @code{ut_type} value is + @code{LOGIN_PROCESS} or @code{USER_PROCESS}, and whose @code{ut_line} +@@ -1095,6 +1272,29 @@ + @comment utmp.h + @comment SVID + @deftypefun {struct utmp *} pututline (const struct utmp *@var{utmp}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c pututline @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->pututline @mtasurace:utent @mtascusig:ALRM @mtascutimer @acsfd ++@c pututline_unknown @mtasurace:utent @acsfd ++@c setutent_unknown dup @mtasurace:utent @acsfd ++@c pututline_file @mtascusig:ALRM @mtascutimer @acsfd ++@c TRANSFORM_UTMP_FILE_NAME ok ++@c strcmp dup ok ++@c acesss dup ok ++@c open_not_cancel_2 dup @acsfd ++@c fcntl_not_cancel dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c llseek dup ok ++@c dup2 dup ok ++@c utmp_equal dup ok ++@c internal_getut_r dup @mtascusig:ALRM @mtascutimer ++@c LOCK_FILE dup @mtascusig:ALRM @mtasctimer ++@c LOCKING_FAILED dup ok ++@c ftruncate64 dup ok ++@c write_not_cancel dup ok ++@c UNLOCK_FILE dup @mtasctimer ++@c libc_lock_unlock dup @aculock + The @code{pututline} function inserts the entry @code{*@var{utmp}} at + the appropriate place in the user accounting database. If it finds that + it is not already at the correct place in the database, it uses +@@ -1125,6 +1325,27 @@ + @comment utmp.h + @comment GNU + @deftypefun int getutent_r (struct utmp *@var{buffer}, struct utmp **@var{result}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c getutent_r @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->getutent_r @mtasurace:utent @mtascusig:ALRM @mtascutimer @acsfd ++@c getutent_r_unknown @mtasurace:utent @acsfd ++@c setutent_unknown dup @mtasurace:utent @acsfd ++@c getutent_r_file @mtasurace:utent @mtascusig:ALRM @mtascutimer ++@c LOCK_FILE @mtascusig:ALRM @mtascutimer ++@c alarm dup @mtascutimer ++@c sigemptyset dup ok ++@c sigaction dup ok ++@c memset dup ok ++@c fcntl_not_cancel dup ok ++@c LOCKING_FAILED ok ++@c read_not_cancel dup ok ++@c UNLOCK_FILE @mtascutimer ++@c fcntl_not_cancel dup ok ++@c alarm dup @mtascutimer ++@c sigaction dup ok ++@c memcpy dup ok ++@c libc_lock_unlock dup ok + The @code{getutent_r} is equivalent to the @code{getutent} function. It + returns the next entry from the database. But instead of storing the + information in a static buffer it stores it in the buffer pointed to by +@@ -1142,6 +1363,22 @@ + @comment utmp.h + @comment GNU + @deftypefun int getutid_r (const struct utmp *@var{id}, struct utmp *@var{buffer}, struct utmp **@var{result}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c getutid_r @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->getutid_r @mtasurace:utent @mtascusig:ALRM @mtascutimer @acsfd ++@c getutid_r_unknown @mtasurace:utent @acsfd ++@c setutent_unknown dup @mtasurace:utent @acsfd ++@c getutid_r_file @mtascusig:ALRM @mtascutimer ++@c internal_getut_r @mtascusig:ALRM @mtascutimer ++@c LOCK_FILE dup @mtascusig:ALRM @mtascutimer ++@c LOCKING_FAILED dup ok ++@c read_not_cancel dup ok ++@c utmp_equal ok ++@c strncmp dup ok ++@c UNLOCK_FILE dup @mtascutimer ++@c memcpy dup ok ++@c libc_lock_unlock dup @aculock + This function retrieves just like @code{getutid} the next entry matching + the information stored in @var{id}. But the result is stored in the + buffer pointed to by the parameter @var{buffer}. +@@ -1157,6 +1394,28 @@ + @comment utmp.h + @comment GNU + @deftypefun int getutline_r (const struct utmp *@var{line}, struct utmp *@var{buffer}, struct utmp **@var{result}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} ++@c getutline_r @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->getutline_r @mtasurace:utent @mtascusig:ALRM @mtascutimer @acsfd ++@c getutline_r_unknown @mtasurace:utent @acsfd ++@c setutent_unknown dup @mtasurace:utent @acsfd ++@c getutline_r_file @mtasurace:utent @mtascusig:ALRM @mtascutimer ++@c LOCK_FILE @mtascusig:ALRM @mtascutimer ++@c alarm dup @mtascutimer ++@c sigemptyset dup ok ++@c sigaction dup ok ++@c memset dup ok ++@c fcntl_not_cancel dup ok ++@c LOCKING_FAILED ok ++@c read_not_cancel dup ok ++@c strncmp dup ok ++@c UNLOCK_FILE @mtascutimer ++@c fcntl_not_cancel dup ok ++@c alarm dup @mtascutimer ++@c sigaction dup ok ++@c memcpy dup ok ++@c libc_lock_unlock dup ok + This function retrieves just like @code{getutline} the next entry + matching the information stored in @var{line}. But the result is stored + in the buffer pointed to by the parameter @var{buffer}. +@@ -1180,6 +1439,14 @@ + @comment utmp.h + @comment SVID + @deftypefun int utmpname (const char *@var{file}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent}}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} ++@c utmpname @mtasurace:utent @asulock @ascuheap @aculock @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c *libc_utmp_jump_table->endutent dup @mtasurace:utent ++@c strcmp dup ok ++@c free dup @ascuheap @acsmem ++@c strdup dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock + The @code{utmpname} function changes the name of the database to be + examined to @var{file}, and closes any previously opened database. By + default @code{getutent}, @code{getutid}, @code{getutline} and +@@ -1208,6 +1475,18 @@ + @comment utmp.h + @comment SVID + @deftypefun void updwtmp (const char *@var{wtmp_file}, const struct utmp *@var{utmp}) ++@safety{@prelim{}@mtunsafe{@mtascusig{:ALRM} @mtascutimer{}}@asunsafe{}@acunsafe{@acsfd{}}} ++@c updwtmp @mtascusig:ALRM @mtascutimer @acsfd ++@c TRANSFORM_UTMP_FILE_NAME dup ok ++@c *libc_utmp_file_functions->updwtmp = updwtmp_file @mtascusig:ALRM @mtascutimer @acsfd ++@c open_not_cancel_2 dup @acsfd ++@c LOCK_FILE dup @mtascusig:ALRM @mtascutimer ++@c LOCKING_FAILED dup ok ++@c lseek64 dup ok ++@c ftruncate64 dup ok ++@c write_not_cancel dup ok ++@c UNLOCK_FILE dup @mtascutimer ++@c close_not_cancel_no_status dup @acsfd + The @code{updwtmp} function appends the entry *@var{utmp} to the + database specified by @var{wtmp_file}. For possible values for the + @var{wtmp_file} argument see the @code{utmpname} function. +@@ -1330,6 +1609,7 @@ + @comment utmpx.h + @comment XPG4.2 + @deftypefun void setutxent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} + This function is similar to @code{setutent}. In @theglibc{} it is + simply an alias for @code{setutent}. + @end deftypefun +@@ -1337,6 +1617,7 @@ + @comment utmpx.h + @comment XPG4.2 + @deftypefun {struct utmpx *} getutxent (void) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} + The @code{getutxent} function is similar to @code{getutent}, but returns + a pointer to a @code{struct utmpx} instead of @code{struct utmp}. In + @theglibc{} it simply is an alias for @code{getutent}. +@@ -1345,6 +1626,7 @@ + @comment utmpx.h + @comment XPG4.2 + @deftypefun void endutxent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent}}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} + This function is similar to @code{endutent}. In @theglibc{} it is + simply an alias for @code{endutent}. + @end deftypefun +@@ -1352,6 +1634,7 @@ + @comment utmpx.h + @comment XPG4.2 + @deftypefun {struct utmpx *} getutxid (const struct utmpx *@var{id}) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} + This function is similar to @code{getutid}, but uses @code{struct utmpx} + instead of @code{struct utmp}. In @theglibc{} it is simply an alias + for @code{getutid}. +@@ -1360,6 +1643,7 @@ + @comment utmpx.h + @comment XPG4.2 + @deftypefun {struct utmpx *} getutxline (const struct utmpx *@var{line}) ++@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} + This function is similar to @code{getutid}, but uses @code{struct utmpx} + instead of @code{struct utmp}. In @theglibc{} it is simply an alias + for @code{getutline}. +@@ -1368,6 +1652,7 @@ + @comment utmpx.h + @comment XPG4.2 + @deftypefun {struct utmpx *} pututxline (const struct utmpx *@var{utmp}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}} + The @code{pututxline} function is functionally identical to + @code{pututline}, but uses @code{struct utmpx} instead of @code{struct + utmp}. In @theglibc{}, @code{pututxline} is simply an alias for +@@ -1377,6 +1662,7 @@ + @comment utmpx.h + @comment XPG4.2 + @deftypefun int utmpxname (const char *@var{file}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent}}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}} + The @code{utmpxname} function is functionally identical to + @code{utmpname}. In @theglibc{}, @code{utmpxname} is simply an + alias for @code{utmpname}. +@@ -1391,6 +1677,7 @@ + @comment utmp.h + @comment GNU + @deftypefun int getutmp (const struct utmpx *@var{utmpx}, struct utmp *@var{utmp}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{getutmp} copies the information, insofar as the structures are + compatible, from @var{utmpx} to @var{utmp}. + @end deftypefun +@@ -1399,6 +1686,7 @@ + @comment utmp.h + @comment GNU + @deftypefun int getutmpx (const struct utmp *@var{utmp}, struct utmpx *@var{utmpx}) ++@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} + @code{getutmpx} copies the information, insofar as the structures are + compatible, from @var{utmp} to @var{utmpx}. + @end deftypefun +@@ -1418,6 +1706,17 @@ + @comment utmp.h + @comment BSD + @deftypefun int login_tty (int @var{filedes}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:ttyname}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c If this function is canceled, it may have succeeded in redirecting ++@c only some of the standard streams to the newly opened terminal. ++@c Should there be a safety annotation for this? ++@c login_tty @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd ++@c setsid dup ok ++@c ioctl dup ok ++@c ttyname dup @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd ++@c close dup @acsfd ++@c open dup @acsfd ++@c dup2 dup ok + This function makes @var{filedes} the controlling terminal of the + current process, redirects standard input, standard output and + standard error output to this terminal, and closes @var{filedes}. +@@ -1429,6 +1728,24 @@ + @comment utmp.h + @comment BSD + @deftypefun void login (const struct utmp *@var{entry}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acucorrupt{} @acsfd{} @acsmem{}}} ++@c login @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @ascuheap @aculock @acucorrupt @acsfd @acsmem ++@c getpid dup ok ++@c tty_name @ascuheap @acucorrupt @acsmem @acsfd ++@c ttyname_r dup @ascuheap @acsmem @acsfd ++@c memchr dup ok ++@c realloc dup @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c strncmp dup ok ++@c basename dup ok ++@c strncpy dup ok ++@c utmpname dup @mtasurace:utent @asulock @ascuheap @aculock @acsmem ++@c setutent dup @mtasurace:utent @asulock @aculock @acsfd ++@c pututline dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c endutent dup @mtasurace:utent @asulock @aculock ++@c free dup @ascuheap @acsmem ++@c updwtmp dup @mtascusig:ALRM @mtascutimer @acsfd + The @code{login} functions inserts an entry into the user accounting + database. The @code{ut_line} member is set to the name of the terminal + on standard input. If standard input is not a terminal @code{login} +@@ -1444,6 +1761,17 @@ + @comment utmp.h + @comment BSD + @deftypefun int logout (const char *@var{ut_line}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtascusig{:ALRM} @mtascutimer{}}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} ++@c logout @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @ascuheap @aculock @acsfd @acsmem ++@c utmpname dup @mtasurace:utent @asulock @ascuheap @aculock @acsmem ++@c setutent dup @mtasurace:utent @asulock @aculock @acsfd ++@c strncpy dup ok ++@c getutline_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c bzero dup ok ++@c gettimeofday dup ok ++@c time dup ok ++@c pututline dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @asulock @aculock @acsfd ++@c endutent dup @mtasurace:utent @asulock @aculock + This function modifies the user accounting database to indicate that the + user on @var{ut_line} has logged out. + +@@ -1454,6 +1782,14 @@ + @comment utmp.h + @comment BSD + @deftypefun void logwtmp (const char *@var{ut_line}, const char *@var{ut_name}, const char *@var{ut_host}) ++@safety{@prelim{}@mtunsafe{@mtascusig{:ALRM} @mtascutimer{}}@asunsafe{}@acunsafe{@acsfd{}}} ++@c logwtmp @mtascusig:ALRM @mtascutimer @acsfd ++@c memset dup ok ++@c getpid dup ok ++@c strncpy dup ok ++@c gettimeofday dup ok ++@c time dup ok ++@c updwtmp dup @mtascusig:ALRM @mtascutimer @acsfd + The @code{logwtmp} function appends an entry to the user accounting log + file, for the current time and the information provided in the + @var{ut_line}, @var{ut_name} and @var{ut_host} arguments. +@@ -1535,6 +1871,14 @@ + @comment pwd.h + @comment POSIX.1 + @deftypefun {struct passwd *} getpwuid (uid_t @var{uid}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:pwuid} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getpwuid @mtasurace:pwuid @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getpwuid_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock + This function returns a pointer to a statically-allocated structure + containing information about the user whose user ID is @var{uid}. This + structure may be overwritten on subsequent calls to @code{getpwuid}. +@@ -1546,6 +1890,208 @@ + @comment pwd.h + @comment POSIX.1c + @deftypefun int getpwuid_r (uid_t @var{uid}, struct passwd *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct passwd **@var{result}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getpwuid_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_getpwuid_r @ascuheap @acsfd @acsmem ++@c itoa_word dup ok ++@c nscd_getpw_r @ascuheap @acsfd @acsmem ++@c nscd_get_map_ref @ascuheap @acsfd @acsmem ++@c nscd_acquire_maplock ok ++@c nscd_get_mapping @ascuheap @acsfd @acsmem ++@c open_socket dup @acsfd ++@c memset dup ok ++@c wait_on_socket dup ok ++@c recvmsg dup ok ++@c strcmp dup ok ++@c fstat64 dup ok ++@c mmap dup @acsmem ++@c munmap dup @acsmem ++@c malloc dup @ascuheap @acsmem ++@c close dup ok ++@c nscd_unmap dup @ascuheap @acsmem ++@c nscd_cache_search ok ++@c nis_hash ok ++@c memcmp dup ok ++@c nscd_open_socket @acsfd ++@c open_socket @acsfd ++@c socket dup @acsfd ++@c fcntl dup ok ++@c strcpy dup ok ++@c connect dup ok ++@c send dup ok ++@c gettimeofday dup ok ++@c poll dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c wait_on_socket dup ok ++@c read dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c readall ok ++@c read dup ok ++@c wait_on_socket ok ++@c poll dup ok ++@c gettimeofday dup ok ++@c memcpy dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c nscd_drop_map_ref @ascuheap @acsmem ++@c nscd_unmap dup @ascuheap @acsmem ++@c nscd_unmap @ascuheap @acsmem ++@c munmap dup ok ++@c free dup @ascuheap @acsmem ++@c nss_passwd_lookup2 @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_database_lookup @mtslocale @ascuheap @asulock @acucorrupt @acsmem @acsfd @aculock ++@c libc_lock_lock @asulock @aculock ++@c libc_lock_unlock @aculock ++@c nss_parse_file @mtslocale @ascuheap @asulock @acucorrupt @acsmem @acsfd @aculock ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking dup ok [no concurrent uses] ++@c malloc dup @asulock @aculock @acsfd @acsmem ++@c fclose dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c getline dup @ascuheap @aculock @acucorrupt @acsmem ++@c strchrnul dup ok ++@c nss_getline @mtslocale @ascuheap @acsmem ++@c isspace @mtslocale^^ ++@c strlen dup ok ++@c malloc dup @asulock @aculock @acsfd @acsmem ++@c memcpy dup ok ++@c nss_parse_service_list dup @mtslocale^, @ascuheap @acsmem ++@c feof_unlocked dup ok ++@c free dup @asulock @aculock @acsfd @acsmem ++@c strcmp dup ok ++@c nss_parse_service_list @mtslocale^, @ascuheap @acsmem ++@c isspace @mtslocale^^ ++@c malloc dup @asulock @aculock @acsfd @acsmem ++@c mempcpy dup ok ++@c strncasecmp dup ok ++@c free dup @asulock @aculock @acsfd @acsmem ++@c malloc dup @asulock @aculock @acsfd @acsmem ++@c nss_lookup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup_function @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock @asulock @aculock ++@c tsearch @ascuheap @acucorrupt @acsmem [no @mtsrace or @asucorrupt due to locking] ++@c known_compare ok ++@c strcmp dup ok ++@c malloc dup @ascuheap @acsmem ++@c tdelete @ascuheap @acucorrupt @acsmem [no @mtsrace or @asucorrupt due to locking] ++@c free dup @ascuheap @acsmem ++@c nss_load_library @ascudlopen @ascuplugin @ascuheap @asulock @aculock @acsfd @acsmem ++@c nss_new_service @ascuheap @acsmem ++@c strcmp dup ok ++@c malloc dup @ascuheap @acsmem ++@c strlen dup ok ++@c stpcpy dup ok ++@c libc_dlopen @ascudlopen @ascuheap @asulock @aculock @acsfd @acsmem ++@c libc_dlsym dup @asulock @aculock @acsfd @acsmem ++@c *ifct(*nscd_init_cb) @ascuplugin ++@c stpcpy dup ok ++@c libc_dlsym dup @asulock @aculock @acsfd @acsmem ++@c libc_lock_unlock dup ok ++@c nss_next_action ok ++@c *fct.l -> _nss_*_getpwuid_r @ascuplugin ++@c nss_next2 @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_next_action dup ok ++@c nss_lookup_function dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++ ++@c _nss_files_getpwuid_r @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c internal_setent @ascuheap @asulock @aculock @acsmem @acsfd ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fileno dup ok ++@c fcntl dup ok ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c rewind dup @aculock [stream guarded by non-recursive pwent lock] ++@c internal_getent @mtslocale^ ++@c fgets_unlocked dup ok [stream guarded by non-recursive pwent lock] ++@c isspace dup @mtslocale^^ ++@c _nss_files_parse_pwent = parse_line ok ++@c strpbrk dup ok ++@c internal_endent @ascuheap @asulock @aculock @acsmem @acsfd ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_lock_unlock dup @aculock ++ ++@c _nss_nis_getpwuid_r ... not fully reviewed (assumed) @asuinit @asulock @acucorrupt @aculock ++@c yp_get_default_domain @asulock @aculock ++@c libc_lock_lock dup @asulock @aculock ++@c getdomainname dup ok ++@c strcmp dup ok ++@c libc_lock_unlock dup @aculock ++@c snprintf dup @ascuheap @acsmem ++@c yp_match ++@c do_ypcall_tr(xdr_ypreq_key,xdr_ypresp_val) ++@c do_ypcall(xdr_ypreq_key,xdr_ypresp_val) ++@c libc_lock_lock @asulock @aculock ++@c strcmp ++@c yp_bind ++@c ypclnt_call ++@c clnt_call ++@c clnt_perror ++@c libc_lock_unlock @aculock ++@c yp_unbind_locked ++@c yp_unbind ++@c strcmp dup ok ++@c calloc dup @asulock @aculock @acsfd @acsmem ++@c yp_bind_file ++@c strlen dup ok ++@c snprintf dup @ascuheap @acsmem ++@c open dup @acsfd [cancelpt] ++@c pread dup [cancelpt] ++@c yp_bind_client_create ++@c close dup @acsfd [cancelpt] ++@c yp_bind_ypbindprog ++@c clnttcp_create ++@c clnt_destroy ++@c clnt_call(xdr_domainname,xdr_ypbind_resp) ++@c memset dup ok ++@c yp_bind_client_create ++@c free dup @asulock @aculock @acsfd @acsmem ++@c calloc dup @asulock @aculock @acsfd @acsmem ++@c free dup @asulock @aculock @acsfd @acsmem ++@c ypprot_err ++@c memcpy dup ok ++@c xdr_free(xdr_ypresp_val) ++@c xdr_ypresp_val ++@c xdr_ypstat ++@c xdr_enum ++@c XDR_PUTLONG ++@c *x_putlong ++@c XDR_GETLONG ++@c *x_getlong ++@c xdr_long ++@c XDR_PUTLONG dup ++@c XDR_GETLONG dup ++@c xdr_short ++@c XDR_PUTLONG dup ++@c XDR_GETLONG dup ++@c xdr_valdat ++@c xdr_bytes ++@c xdr_u_int ++@c XDR_PUTLONG dup ++@c XDR_GETLONG dup ++@c mem_alloc @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c xdr_opaque ++@c XDR_GETBYTES ++@c *x_getbytes ++@c XDR_PUTBYTES ++@c *x_putbytes ++@c mem_free @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c yperr2nss ok ++@c strchr dup ok ++@c _nls_default_nss @asuinit @ascuheap @asulock @acucorrupt @acsmem @acsfd @aculock ++@c init @asuinit^, @ascuheap @asulock @acucorrupt @acsmem @acsfd @aculock ++@c fopen dup @ascuheap @asulock @acsmem @acsfd @aculock ++@c fsetlocking ok [no concurrent uses] ++@c feof_unlocked dup ok ++@c getline dup @ascuheap @aculock @acucorrupt @acsmem ++@c isspace dup @mtslocale^^ ++@c strncmp dup ok ++@c free dup @asulock @acsmem @acsfd @aculock ++@c fclose dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c free dup @asulock @acsmem @acsfd @aculock ++@c mempcpy dup ok ++@c strncpy dup ok ++@c isspace dup @mtslocale^^ ++@c _nss_files_parse_pwent ok + This function is similar to @code{getpwuid} in that it returns + information about the user whose user ID is @var{uid}. However, it + fills the user supplied structure pointed to by @var{result_buf} with +@@ -1568,6 +2114,14 @@ + @comment pwd.h + @comment POSIX.1 + @deftypefun {struct passwd *} getpwnam (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:pwnam} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getpwnam @mtasurace:pwnam @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c getpwnam_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock + This function returns a pointer to a statically-allocated structure + containing information about the user whose user name is @var{name}. + This structure may be overwritten on subsequent calls to +@@ -1579,6 +2133,25 @@ + @comment pwd.h + @comment POSIX.1c + @deftypefun int getpwnam_r (const char *@var{name}, struct passwd *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct passwd **@var{result}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getpwnam_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_getpwnam_r @ascuheap @asulock @aculock @acsfd @acsmem ++@c strlen dup ok ++@c nscd_getpw_r dup @ascuheap @asulock @aculock @acsfd @acsmem ++@c nss_passwd_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c ++@c _nss_files_getpwnam_r @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_lock_lock dup @asulock @aculock ++@c internal_setent dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c internal_getent dup @mtslocale^ ++@c strcmp dup ok ++@c internal_endent dup @ascuheap @asulock @aculock @acsmem @acsfd ++@c libc_lock_unlock dup @aculock ++@c ++@c _nss_*_getpwnam_r (assumed) @asuinit @asulock @acucorrupt @aculock ++ + This function is similar to @code{getpwnam} in that is returns + information about the user whose user name is @var{name}. However, like + @code{getpwuid_r}, it fills the user supplied buffers in +@@ -1603,6 +2176,16 @@ + @comment pwd.h + @comment SVID + @deftypefun {struct passwd *} fgetpwent (FILE *@var{stream}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fpwent}}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{}}} ++@c fgetpwent @mtasurace:fpwent @asucorrupt @asulock @acucorrupt @aculock ++@c fgetpos dup @asucorrupt @aculock @acucorrupt ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c fgetpwent_r dup @asucorrupt @acucorrupt @aculock ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c fsetpos dup @asucorrupt @aculock @acucorrupt ++@c libc_lock_unlock dup @aculock + This function reads the next user entry from @var{stream} and returns a + pointer to the entry. The structure is statically allocated and is + rewritten on subsequent calls to @code{fgetpwent}. You must copy the +@@ -1615,6 +2198,14 @@ + @comment pwd.h + @comment GNU + @deftypefun int fgetpwent_r (FILE *@var{stream}, struct passwd *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct passwd **@var{result}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} ++@c fgetpwent_r @asucorrupt @acucorrupt @aculock ++@c flockfile dup @aculock ++@c fgets_unlocked @asucorrupt @acucorrupt [no @mtsrace due to explicit locking] ++@c feof_unlocked dup ok ++@c funlockfile dup @aculock ++@c isspace dup @mtslocale^^ ++@c parse_line dup ok + This function is similar to @code{fgetpwent} in that it reads the next + user entry from @var{stream}. But the result is returned in the + structure pointed to by @var{result_buf}. The +@@ -1637,6 +2228,17 @@ + @comment pwd.h + @comment SVID, BSD + @deftypefun void setpwent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:pwent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c setpwent @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock @asulock @aculock ++@c nss_setent(nss_passwd_lookup2) @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c ** resolv's res_maybe_init not called here ++@c setup(nss_passwd_lookup2) @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *lookup_fct = nss_passwd_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:pwent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock @aculock + This function initializes a stream which @code{getpwent} and + @code{getpwent_r} use to read the user database. + @end deftypefun +@@ -1644,6 +2246,15 @@ + @comment pwd.h + @comment POSIX.1 + @deftypefun {struct passwd *} getpwent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:pwent} @mtasurace{:pwentbuf} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getpwent @mtasurace:pwent @mtasurace:pwentbuf @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent(getpwent_r) @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c malloc dup @ascuheap @acsmem ++@c *func = getpwent_r dup @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock + The @code{getpwent} function reads the next entry from the stream + initialized by @code{setpwent}. It returns a pointer to the entry. The + structure is statically allocated and is rewritten on subsequent calls +@@ -1655,7 +2266,21 @@ + + @comment pwd.h + @comment GNU +-@deftypefun int getpwent_r (struct passwd *@var{result_buf}, char *@var{buffer}, int @var{buflen}, struct passwd **@var{result}) ++@deftypefun int getpwent_r (struct passwd *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct passwd **@var{result}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:pwent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c The static buffer here is not the result_buf, but rather the ++@c variables that keep track of what nss backend we've last used, and ++@c whatever internal state the nss backend uses to keep track of the ++@c last read entry. ++@c getpwent_r @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nss_getent_r(nss_passwd_lookup2) @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c setup(nss_passwd_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:pwent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *sfct.f @mtasurace:pwent @ascuplugin ++@c libc_lock_unlock dup @aculock + This function is similar to @code{getpwent} in that it returns the next + entry from the stream initialized by @code{setpwent}. Like + @code{fgetpwent_r}, it uses the user-supplied buffers in +@@ -1668,6 +2293,15 @@ + @comment pwd.h + @comment SVID, BSD + @deftypefun void endpwent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:pwent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c endpwent @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock @asulock @aculock ++@c nss_endent(nss_passwd_lookup2) @mtasurace:pwent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c ** resolv's res_maybe_init not called here ++@c setup(nss_passwd_lookup2) dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @mtasurace:pwent @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_unlock @aculock + This function closes the internal stream used by @code{getpwent} or + @code{getpwent_r}. + @end deftypefun +@@ -1678,6 +2312,9 @@ + @comment pwd.h + @comment SVID + @deftypefun int putpwent (const struct passwd *@var{p}, FILE *@var{stream}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} ++@c putpwent @mtslocale @asucorrupt @aculock @acucorrupt ++@c fprintf dup @mtslocale @asucorrupt @aculock @acucorrupt [no @ascuheap @acsmem] + This function writes the user entry @code{*@var{p}} to the stream + @var{stream}, in the format used for the standard user database + file. The return value is zero on success and nonzero on failure. +@@ -1751,6 +2388,9 @@ + @comment grp.h + @comment POSIX.1 + @deftypefun {struct group *} getgrgid (gid_t @var{gid}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:grgid} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getgrgid =~ getpwuid dup @mtasurace:grgid @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getgrgid_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function returns a pointer to a statically-allocated structure + containing information about the group whose group ID is @var{gid}. + This structure may be overwritten by subsequent calls to +@@ -1762,6 +2402,26 @@ + @comment grp.h + @comment POSIX.1c + @deftypefun int getgrgid_r (gid_t @var{gid}, struct group *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct group **@var{result}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getgrgid_r =~ getpwuid_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_getgrgid_r @ascuheap @acsfd @acsmem ++@c itoa_word dup ok ++@c nscd_getgr_r @ascuheap @acsfd @acsmem ++@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem ++@c nscd_cache_search dup ok ++@c nscd_open_socket dup @acsfd ++@c readvall ok ++@c readv dup ok ++@c memcpy dup ok ++@c wait_on_socket dup ok ++@c memcpy dup ok ++@c readall dup ok ++@c close_not_cancel_no_status dup @acsfd ++@c nscd_drop_map_ref dup @ascuheap @acsmem ++@c nscd_unmap dup @ascuheap @acsmem ++@c nss_group_lookup2 =~ nss_passwd_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l -> _nss_*_getgrgid_r @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function is similar to @code{getgrgid} in that it returns + information about the group whose group ID is @var{gid}. However, it + fills the user supplied structure pointed to by @var{result_buf} with +@@ -1783,6 +2443,9 @@ + @comment grp.h + @comment SVID, BSD + @deftypefun {struct group *} getgrnam (const char *@var{name}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:grnam} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getgrnam =~ getpwnam dup @mtasurace:grnam @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c getgrnam_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function returns a pointer to a statically-allocated structure + containing information about the group whose group name is @var{name}. + This structure may be overwritten by subsequent calls to +@@ -1794,6 +2457,14 @@ + @comment grp.h + @comment POSIX.1c + @deftypefun int getgrnam_r (const char *@var{name}, struct group *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct group **@var{result}) ++@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getgrnam_r =~ getpwnam_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_getgrnam_r @ascuheap @asulock @aculock @acsfd @acsmem ++@c strlen dup ok ++@c nscd_getgr_r dup @ascuheap @asulock @aculock @acsfd @acsmem ++@c nss_group_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.l @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function is similar to @code{getgrnam} in that is returns + information about the group whose group name is @var{name}. Like + @code{getgrgid_r}, it uses the user supplied buffers in +@@ -1817,6 +2488,16 @@ + @comment grp.h + @comment SVID + @deftypefun {struct group *} fgetgrent (FILE *@var{stream}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:fgrent}}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{}}} ++@c fgetgrent @mtasurace:fgrent @asucorrupt @asulock @acucorrupt @aculock ++@c fgetpos dup @asucorrupt @aculock @acucorrupt ++@c libc_lock_lock dup @asulock @aculock ++@c malloc dup @ascuheap @acsmem ++@c fgetgrent_r dup @asucorrupt @acucorrupt @aculock ++@c realloc dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c fsetpos dup @asucorrupt @aculock @acucorrupt ++@c libc_lock_unlock dup @aculock + The @code{fgetgrent} function reads the next entry from @var{stream}. + It returns a pointer to the entry. The structure is statically + allocated and is overwritten on subsequent calls to @code{fgetgrent}. You +@@ -1830,6 +2511,14 @@ + @comment grp.h + @comment GNU + @deftypefun int fgetgrent_r (FILE *@var{stream}, struct group *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct group **@var{result}) ++@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} ++@c fgetgrent_r @asucorrupt @acucorrupt @aculock ++@c flockfile dup @aculock ++@c fgets_unlocked @asucorrupt @acucorrupt [no @mtsrace due to explicit locking] ++@c feof_unlocked dup ok ++@c funlockfile dup @aculock ++@c isspace dup @mtslocale^^ ++@c parse_line dup ok + This function is similar to @code{fgetgrent} in that it reads the next + user entry from @var{stream}. But the result is returned in the + structure pointed to by @var{result_buf}. The first @var{buflen} bytes +@@ -1852,6 +2541,9 @@ + @comment grp.h + @comment SVID, BSD + @deftypefun void setgrent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:grent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c setgrent =~ setpwent dup @mtasurace:grent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c ...*lookup_fct = nss_group_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function initializes a stream for reading from the group data base. + You use this stream by calling @code{getgrent} or @code{getgrent_r}. + @end deftypefun +@@ -1859,6 +2551,9 @@ + @comment grp.h + @comment SVID, BSD + @deftypefun {struct group *} getgrent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:grent} @mtasurace{:grentbuf} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getgrent =~ getpwent dup @mtasurace:grent @mtasurace:grentbuf @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *func = getgrent_r dup @mtasurace:grent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + The @code{getgrent} function reads the next entry from the stream + initialized by @code{setgrent}. It returns a pointer to the entry. The + structure is statically allocated and is overwritten on subsequent calls +@@ -1869,6 +2564,8 @@ + @comment grp.h + @comment GNU + @deftypefun int getgrent_r (struct group *@var{result_buf}, char *@var{buffer}, size_t @var{buflen}, struct group **@var{result}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:grent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getgrent_r =~ getpwent_r dup @mtasurace:grent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function is similar to @code{getgrent} in that it returns the next + entry from the stream initialized by @code{setgrent}. Like + @code{fgetgrent_r}, it places the result in user-supplied buffers +@@ -1882,6 +2579,8 @@ + @comment grp.h + @comment SVID, BSD + @deftypefun void endgrent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:grent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c endgrent =~ endpwent dup @mtasurace:grent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function closes the internal stream used by @code{getgrent} or + @code{getgrent_r}. + @end deftypefun +@@ -1966,6 +2665,40 @@ + @comment netdb.h + @comment BSD + @deftypefun int setnetgrent (const char *@var{netgroup}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netgrent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c setnetgrent @mtasurace:netgrent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c nscd_setnetgrent @ascuheap @acsfd @acsmem ++@c __nscd_setnetgrent @ascuheap @acsfd @acsmem ++@c strlen dup ok ++@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem ++@c nscd_cache_search dup ok ++@c nscd_open_socket dup @acsfd ++@c malloc dup @ascuheap @acsmem ++@c readall dup ok ++@c free dup @ascuheap @acsmem ++@c close_not_cancel_no_status dup @acsfd ++@c nscd_drop_map_ref dup @ascuheap @acsmem ++@c nscd_unmap dup @ascuheap @acsmem ++@c internal_setnetgrent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c free_memory dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c internal_setnetgrent_reuse @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c endnetgrent_hook dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup_function dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *endfct @ascuplugin ++@c (netgroup::)setup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_netgroup_lookup dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_netgroup_lookup2 =~ nss_passwd_lookup2 dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct.f @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup_function dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *endfct @ascuplugin ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c memcpy dup ok ++@c libc_lock_unlock dup @aculock + A call to this function initializes the internal state of the library to + allow following calls of the @code{getnetgrent} to iterate over all entries + in the netgroup with name @var{netgroup}. +@@ -1991,6 +2724,12 @@ + @comment netdb.h + @comment BSD + @deftypefun int getnetgrent (char **@var{hostp}, char **@var{userp}, char **@var{domainp}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netgrent} @mtasurace{:netgrentbuf} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getnetgrent @mtasurace:netgrent @mtasurace:netgrentbuf @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c uses unsafely a static buffer allocated within a libc_once call ++@c allocate (libc_once) @ascuheap @acsmem ++@c malloc dup @ascuheap @acsmem ++@c getnetgrent_r dup @mtasurace:netgrent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem + This function returns the next unprocessed entry of the currently + selected netgroup. The string pointers, in which addresses are passed in + the arguments @var{hostp}, @var{userp}, and @var{domainp}, will contain +@@ -2005,7 +2744,20 @@ + + @comment netdb.h + @comment GNU +-@deftypefun int getnetgrent_r (char **@var{hostp}, char **@var{userp}, char **@var{domainp}, char *@var{buffer}, int @var{buflen}) ++@deftypefun int getnetgrent_r (char **@var{hostp}, char **@var{userp}, char **@var{domainp}, char *@var{buffer}, size_t @var{buflen}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netgrent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c getnetgrent_r @mtasurace:netgrent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c internal_getnetgrent_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nss_lookup_function dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *fct @ascuplugin ++@c nscd_getnetgrent ok ++@c rawmemchr dup ok ++@c internal_setnetgrent_reuse dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c strcmp dup ok ++@c malloc dup @ascuheap @acsmem ++@c memcpy dup ok ++@c libc_lock_unlock dup @aculock + This function is similar to @code{getnetgrent} with only one exception: + the strings the three string pointers @var{hostp}, @var{userp}, and + @var{domainp} point to, are placed in the buffer of @var{buflen} bytes +@@ -2024,6 +2776,13 @@ + @comment netdb.h + @comment BSD + @deftypefun void endnetgrent (void) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netgrent}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c endnetgrent @mtasurace:netgrent @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c libc_lock_lock dup @asulock @aculock ++@c internal_endnetgrent @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c endnetgrent_hook dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c free_memory dup @ascuheap @acsmem ++@c libc_lock_unlock dup @aculock + This function frees all buffers which were allocated to process the last + selected netgroup. As a result all string pointers returned by calls + to @code{getnetgrent} are invalid afterwards. +@@ -2039,6 +2798,37 @@ + @comment netdb.h + @comment BSD + @deftypefun int innetgr (const char *@var{netgroup}, const char *@var{host}, const char *@var{user}, const char *@var{domain}) ++@safety{@prelim{}@mtunsafe{@mtasurace{:netgrent} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} ++@c This function does not use the static data structure that the ++@c *netgrent* ones do, but since each nss must maintains internal state ++@c to support iteration and concurrent iteration will interfere ++@c destructively, we regard this internal state as a static buffer. ++@c getnetgrent_r iteration in each nss backend. ++@c innetgr @mtasurace:netgrent @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c nscd_innetgr @ascuheap @acsfd @acsmem ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c stpcpy dup ok ++@c nscd_get_map_ref dup @ascuheap @acsfd @acsmem ++@c nscd_cache_search dup ok ++@c nscd_open_socket dup @acsfd ++@c close_not_cancel_no_status dup @acsfd ++@c nscd_drop_map_ref dup @ascuheap @acsmem ++@c nscd_unmap dup @ascuheap @acsmem ++@c free dup @ascuheap @acsmem ++@c memset dup ok ++@c (netgroup::)setup dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *setfct.f @ascuplugin ++@c nss_lookup_function dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c *getfct @ascuplugin ++@c strcmp dup ok ++@c strlen dup ok ++@c malloc dup @ascuheap @acsmem ++@c memcpy dup ok ++@c strcasecmp dup ++@c *endfct @ascuplugin ++@c nss_next2 dup @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem ++@c free_memory dup @ascuheap @acsmem + This function tests whether the triple specified by the parameters + @var{hostp}, @var{userp}, and @var{domainp} is part of the netgroup + @var{netgroup}. Using this function has the advantage that +@@ -2062,3 +2852,7 @@ + itself is not found, the netgroup does not contain the triple or + internal errors occurred. + @end deftypefun ++ ++@c FIXME these are undocumented: ++@c setresgid ++@c setresuid diff --git a/SOURCES/glibc-powerpc-ldbl_high.patch b/SOURCES/glibc-powerpc-ldbl_high.patch new file mode 100644 index 0000000..68faeee --- /dev/null +++ b/SOURCES/glibc-powerpc-ldbl_high.patch @@ -0,0 +1,13 @@ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-27 19:59:00.000000000 -0500 +@@ -190,6 +190,9 @@ + # define ldbl_unpack default_ldbl_unpack + #endif + ++/* Extract high double. */ ++#define ldbl_high(x) ((double) x) ++ + /* Convert a finite long double to canonical form. + Does not handle +/-Inf properly. */ + static inline void diff --git a/SOURCES/glibc-ppc64le-01.patch b/SOURCES/glibc-ppc64le-01.patch new file mode 100644 index 0000000..e2a86d7 --- /dev/null +++ b/SOURCES/glibc-ppc64le-01.patch @@ -0,0 +1,83 @@ +# commit 1695c7737655241e1773bdddc93e82c22d8d1584 +# Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> +# Date: Tue Feb 4 09:48:47 2014 -0200 +# +# abilist-pattern configurability +# +# This patch creates implicit rules to match the abifiles if +# abilist-pattern is defined in the architecture Makefile. This allows +# machine specific Makefiles to define different abifiles names +# (for instance *-le.abilist for powerpc64le). +# +diff -urN glibc-2.17-c758a686/Makerules glibc-2.17-c758a686/Makerules +--- glibc-2.17-c758a686/Makerules 2014-06-02 15:29:42.000000000 +0000 ++++ glibc-2.17-c758a686/Makerules 2014-06-02 15:25:21.000000000 +0000 +@@ -1152,6 +1152,14 @@ + LC_ALL=C $(OBJDUMP) --dynamic-syms $< > $@T + mv -f $@T $@ + ++# A sysdeps/.../Makefile can set abilist-pattern to something like ++# %-foo.abilist to look for libc-foo.abilist instead of libc.abilist. ++# This makes sense if multiple ABIs can be most cleanly supported by a ++# configuration without using separate sysdeps directories for each. ++ifdef abilist-pattern ++vpath $(abilist-pattern) $(+sysdep_dirs) ++endif ++ + vpath %.abilist $(+sysdep_dirs) + + # The .PRECIOUS rule prevents the files built by an implicit rule whose +@@ -1161,18 +1169,42 @@ + .PRECIOUS: %.symlist + generated += $(extra-libs:=.symlist) + ++ifdef abilist-pattern ++check-abi-%: $(common-objpfx)config.make $(abilist-pattern) $(objpfx)%.symlist ++ $(check-abi-pattern) ++check-abi-%: $(common-objpfx)config.make $(abilist-pattern) \ ++ $(common-objpfx)%.symlist ++ $(check-abi-pattern) ++endif + check-abi-%: $(common-objpfx)config.make %.abilist $(objpfx)%.symlist + $(check-abi) + check-abi-%: $(common-objpfx)config.make %.abilist $(common-objpfx)%.symlist + $(check-abi) ++define check-abi-pattern ++ diff -p -U 0 $(filter $(abilist-pattern),$^) $(filter %.symlist,$^) ++endef + define check-abi + diff -p -U 0 $(filter %.abilist,$^) $(filter %.symlist,$^) + endef + ++ifdef abilist-pattern ++update-abi-%: $(objpfx)%.symlist $(abilist-pattern) ++ $(update-abi-pattern) ++update-abi-%: $(common-objpfx)%.symlist $(abilist-pattern) ++ $(update-abi-pattern) ++endif + update-abi-%: $(objpfx)%.symlist %.abilist + $(update-abi) + update-abi-%: $(common-objpfx)%.symlist %.abilist + $(update-abi) ++define update-abi-pattern ++@if cmp -s $^ 2> /dev/null; \ ++ then \ ++ echo '+++ $(filter $(abilist-pattern),$^) is unchanged'; \ ++ else cp -f $^; \ ++ echo '*** Now check $(filter $(abilist-pattern),$^) changes for correctness ***'; \ ++ fi ++endef + define update-abi + @if cmp -s $^ 2> /dev/null; \ + then \ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/Makefile glibc-2.17-c758a686/sysdeps/powerpc/Makefile +--- glibc-2.17-c758a686/sysdeps/powerpc/Makefile 2014-06-02 15:29:42.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/powerpc/Makefile 2014-06-02 15:25:21.000000000 +0000 +@@ -27,3 +27,7 @@ + sysdep_headers += sys/platform/ppc.h + tests += test-gettimebase + endif ++ ++ifneq (,$(filter %le,$(config-machine))) ++abilist-pattern = %-le.abilist ++endif diff --git a/SOURCES/glibc-ppc64le-02.patch b/SOURCES/glibc-ppc64le-02.patch new file mode 100644 index 0000000..3878826 --- /dev/null +++ b/SOURCES/glibc-ppc64le-02.patch @@ -0,0 +1,3197 @@ +# co`mmit c01603f763003cec55234ac757c7a934652caa55 +# Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> +# Date: Tue Feb 4 09:49:34 2014 -0200 +# +# PowerPC: powerpc64le abilist for 2.17 +# +# This patch is the abifiles for powerpc64le based on GLIBC 2.17. +# +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/ld-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/ld-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/ld-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/ld-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,11 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ __libc_memalign F ++ __libc_stack_end D 0x8 ++ __tls_get_addr F ++ _dl_mcount F ++ _r_debug D 0x28 ++ calloc F ++ free F ++ malloc F ++ realloc F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libBrokenLocale-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libBrokenLocale-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libBrokenLocale-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libBrokenLocale-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,3 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ __ctype_get_mb_cur_max F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libanl-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libanl-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libanl-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libanl-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,6 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ gai_cancel F ++ gai_error F ++ gai_suspend F ++ getaddrinfo_a F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,2168 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ _Exit F ++ _IO_2_1_stderr_ D 0xe0 ++ _IO_2_1_stdin_ D 0xe0 ++ _IO_2_1_stdout_ D 0xe0 ++ _IO_adjust_column F ++ _IO_adjust_wcolumn F ++ _IO_default_doallocate F ++ _IO_default_finish F ++ _IO_default_pbackfail F ++ _IO_default_uflow F ++ _IO_default_xsgetn F ++ _IO_default_xsputn F ++ _IO_do_write F ++ _IO_doallocbuf F ++ _IO_fclose F ++ _IO_fdopen F ++ _IO_feof F ++ _IO_ferror F ++ _IO_fflush F ++ _IO_fgetpos F ++ _IO_fgetpos64 F ++ _IO_fgets F ++ _IO_file_attach F ++ _IO_file_close F ++ _IO_file_close_it F ++ _IO_file_doallocate F ++ _IO_file_finish F ++ _IO_file_fopen F ++ _IO_file_init F ++ _IO_file_jumps D 0xa8 ++ _IO_file_open F ++ _IO_file_overflow F ++ _IO_file_read F ++ _IO_file_seek F ++ _IO_file_seekoff F ++ _IO_file_setbuf F ++ _IO_file_stat F ++ _IO_file_sync F ++ _IO_file_underflow F ++ _IO_file_write F ++ _IO_file_xsputn F ++ _IO_flockfile F ++ _IO_flush_all F ++ _IO_flush_all_linebuffered F ++ _IO_fopen F ++ _IO_fprintf F ++ _IO_fputs F ++ _IO_fread F ++ _IO_free_backup_area F ++ _IO_free_wbackup_area F ++ _IO_fsetpos F ++ _IO_fsetpos64 F ++ _IO_ftell F ++ _IO_ftrylockfile F ++ _IO_funlockfile F ++ _IO_fwrite F ++ _IO_getc F ++ _IO_getline F ++ _IO_getline_info F ++ _IO_gets F ++ _IO_init F ++ _IO_init_marker F ++ _IO_init_wmarker F ++ _IO_iter_begin F ++ _IO_iter_end F ++ _IO_iter_file F ++ _IO_iter_next F ++ _IO_least_wmarker F ++ _IO_link_in F ++ _IO_list_all D 0x8 ++ _IO_list_lock F ++ _IO_list_resetlock F ++ _IO_list_unlock F ++ _IO_marker_delta F ++ _IO_marker_difference F ++ _IO_padn F ++ _IO_peekc_locked F ++ _IO_popen F ++ _IO_printf F ++ _IO_proc_close F ++ _IO_proc_open F ++ _IO_putc F ++ _IO_puts F ++ _IO_remove_marker F ++ _IO_seekmark F ++ _IO_seekoff F ++ _IO_seekpos F ++ _IO_seekwmark F ++ _IO_setb F ++ _IO_setbuffer F ++ _IO_setvbuf F ++ _IO_sgetn F ++ _IO_sprintf F ++ _IO_sputbackc F ++ _IO_sputbackwc F ++ _IO_sscanf F ++ _IO_str_init_readonly F ++ _IO_str_init_static F ++ _IO_str_overflow F ++ _IO_str_pbackfail F ++ _IO_str_seekoff F ++ _IO_str_underflow F ++ _IO_sungetc F ++ _IO_sungetwc F ++ _IO_switch_to_get_mode F ++ _IO_switch_to_main_wget_area F ++ _IO_switch_to_wbackup_area F ++ _IO_switch_to_wget_mode F ++ _IO_un_link F ++ _IO_ungetc F ++ _IO_unsave_markers F ++ _IO_unsave_wmarkers F ++ _IO_vfprintf F ++ _IO_vfscanf F ++ _IO_vsprintf F ++ _IO_wdefault_doallocate F ++ _IO_wdefault_finish F ++ _IO_wdefault_pbackfail F ++ _IO_wdefault_uflow F ++ _IO_wdefault_xsgetn F ++ _IO_wdefault_xsputn F ++ _IO_wdo_write F ++ _IO_wdoallocbuf F ++ _IO_wfile_jumps D 0xa8 ++ _IO_wfile_overflow F ++ _IO_wfile_seekoff F ++ _IO_wfile_sync F ++ _IO_wfile_underflow F ++ _IO_wfile_xsputn F ++ _IO_wmarker_delta F ++ _IO_wsetb F ++ __adjtimex F ++ __after_morecore_hook D 0x8 ++ __argz_count F ++ __argz_next F ++ __argz_stringify F ++ __asprintf F ++ __asprintf_chk F ++ __assert F ++ __assert_fail F ++ __assert_perror_fail F ++ __backtrace F ++ __backtrace_symbols F ++ __backtrace_symbols_fd F ++ __bsd_getpgrp F ++ __bzero F ++ __check_rhosts_file D 0x4 ++ __chk_fail F ++ __clone F ++ __close F ++ __cmsg_nxthdr F ++ __confstr_chk F ++ __connect F ++ __ctype_b_loc F ++ __ctype_get_mb_cur_max F ++ __ctype_tolower_loc F ++ __ctype_toupper_loc F ++ __curbrk D 0x8 ++ __cxa_at_quick_exit F ++ __cxa_atexit F ++ __cxa_finalize F ++ __cyg_profile_func_enter F ++ __cyg_profile_func_exit F ++ __daylight D 0x4 ++ __dcgettext F ++ __default_morecore F ++ __dgettext F ++ __dprintf_chk F ++ __dup2 F ++ __duplocale F ++ __endmntent F ++ __environ D 0x8 ++ __errno_location F ++ __fbufsize F ++ __fcntl F ++ __fdelt_chk F ++ __fdelt_warn F ++ __ffs F ++ __fgets_chk F ++ __fgets_unlocked_chk F ++ __fgetws_chk F ++ __fgetws_unlocked_chk F ++ __finite F ++ __finitef F ++ __finitel F ++ __flbf F ++ __fork F ++ __fpending F ++ __fprintf_chk F ++ __fpu_control D 0x4 ++ __fpurge F ++ __fread_chk F ++ __fread_unlocked_chk F ++ __freadable F ++ __freading F ++ __free_hook D 0x8 ++ __freelocale F ++ __fsetlocking F ++ __fwprintf_chk F ++ __fwritable F ++ __fwriting F ++ __fxstat F ++ __fxstat64 F ++ __fxstatat F ++ __fxstatat64 F ++ __getauxval F ++ __getcwd_chk F ++ __getdelim F ++ __getdomainname_chk F ++ __getgroups_chk F ++ __gethostname_chk F ++ __getlogin_r_chk F ++ __getmntent_r F ++ __getpagesize F ++ __getpgid F ++ __getpid F ++ __gets_chk F ++ __gettimeofday F ++ __getwd_chk F ++ __gmtime_r F ++ __h_errno_location F ++ __isalnum_l F ++ __isalpha_l F ++ __isascii_l F ++ __isblank_l F ++ __iscntrl_l F ++ __isctype F ++ __isdigit_l F ++ __isgraph_l F ++ __isinf F ++ __isinff F ++ __isinfl F ++ __islower_l F ++ __isnan F ++ __isnanf F ++ __isnanl F ++ __isoc99_fscanf F ++ __isoc99_fwscanf F ++ __isoc99_scanf F ++ __isoc99_sscanf F ++ __isoc99_swscanf F ++ __isoc99_vfscanf F ++ __isoc99_vfwscanf F ++ __isoc99_vscanf F ++ __isoc99_vsscanf F ++ __isoc99_vswscanf F ++ __isoc99_vwscanf F ++ __isoc99_wscanf F ++ __isprint_l F ++ __ispunct_l F ++ __isspace_l F ++ __isupper_l F ++ __iswalnum_l F ++ __iswalpha_l F ++ __iswblank_l F ++ __iswcntrl_l F ++ __iswctype F ++ __iswctype_l F ++ __iswdigit_l F ++ __iswgraph_l F ++ __iswlower_l F ++ __iswprint_l F ++ __iswpunct_l F ++ __iswspace_l F ++ __iswupper_l F ++ __iswxdigit_l F ++ __isxdigit_l F ++ __ivaliduser F ++ __key_decryptsession_pk_LOCAL D 0x8 ++ __key_encryptsession_pk_LOCAL D 0x8 ++ __key_gendes_LOCAL D 0x8 ++ __libc_allocate_rtsig F ++ __libc_calloc F ++ __libc_current_sigrtmax F ++ __libc_current_sigrtmin F ++ __libc_free F ++ __libc_freeres F ++ __libc_init_first F ++ __libc_mallinfo F ++ __libc_malloc F ++ __libc_mallopt F ++ __libc_memalign F ++ __libc_pvalloc F ++ __libc_realloc F ++ __libc_sa_len F ++ __libc_start_main F ++ __libc_valloc F ++ __longjmp_chk F ++ __lseek F ++ __lxstat F ++ __lxstat64 F ++ __malloc_hook D 0x8 ++ __malloc_initialize_hook D 0x8 ++ __mbrlen F ++ __mbrtowc F ++ __mbsnrtowcs_chk F ++ __mbsrtowcs_chk F ++ __mbstowcs_chk F ++ __memalign_hook D 0x8 ++ __memcpy_chk F ++ __memmove_chk F ++ __mempcpy F ++ __mempcpy_chk F ++ __mempcpy_small F ++ __memset_chk F ++ __monstartup F ++ __morecore D 0x8 ++ __nanosleep F ++ __newlocale F ++ __nl_langinfo_l F ++ __nldbl__IO_fprintf F ++ __nldbl__IO_printf F ++ __nldbl__IO_sprintf F ++ __nldbl__IO_sscanf F ++ __nldbl__IO_vfprintf F ++ __nldbl__IO_vfscanf F ++ __nldbl__IO_vsprintf F ++ __nldbl___asprintf F ++ __nldbl___asprintf_chk F ++ __nldbl___dprintf_chk F ++ __nldbl___fprintf_chk F ++ __nldbl___fwprintf_chk F ++ __nldbl___isoc99_fscanf F ++ __nldbl___isoc99_fwscanf F ++ __nldbl___isoc99_scanf F ++ __nldbl___isoc99_sscanf F ++ __nldbl___isoc99_swscanf F ++ __nldbl___isoc99_vfscanf F ++ __nldbl___isoc99_vfwscanf F ++ __nldbl___isoc99_vscanf F ++ __nldbl___isoc99_vsscanf F ++ __nldbl___isoc99_vswscanf F ++ __nldbl___isoc99_vwscanf F ++ __nldbl___isoc99_wscanf F ++ __nldbl___obstack_printf_chk F ++ __nldbl___obstack_vprintf_chk F ++ __nldbl___printf_chk F ++ __nldbl___printf_fp F ++ __nldbl___snprintf_chk F ++ __nldbl___sprintf_chk F ++ __nldbl___strfmon_l F ++ __nldbl___swprintf_chk F ++ __nldbl___syslog_chk F ++ __nldbl___vasprintf_chk F ++ __nldbl___vdprintf_chk F ++ __nldbl___vfprintf_chk F ++ __nldbl___vfscanf F ++ __nldbl___vfwprintf_chk F ++ __nldbl___vprintf_chk F ++ __nldbl___vsnprintf F ++ __nldbl___vsnprintf_chk F ++ __nldbl___vsprintf_chk F ++ __nldbl___vsscanf F ++ __nldbl___vstrfmon F ++ __nldbl___vstrfmon_l F ++ __nldbl___vswprintf_chk F ++ __nldbl___vsyslog_chk F ++ __nldbl___vwprintf_chk F ++ __nldbl___wprintf_chk F ++ __nldbl_asprintf F ++ __nldbl_dprintf F ++ __nldbl_fprintf F ++ __nldbl_fscanf F ++ __nldbl_fwprintf F ++ __nldbl_fwscanf F ++ __nldbl_obstack_printf F ++ __nldbl_obstack_vprintf F ++ __nldbl_printf F ++ __nldbl_printf_size F ++ __nldbl_scanf F ++ __nldbl_snprintf F ++ __nldbl_sprintf F ++ __nldbl_sscanf F ++ __nldbl_strfmon F ++ __nldbl_strfmon_l F ++ __nldbl_swprintf F ++ __nldbl_swscanf F ++ __nldbl_syslog F ++ __nldbl_vasprintf F ++ __nldbl_vdprintf F ++ __nldbl_vfprintf F ++ __nldbl_vfscanf F ++ __nldbl_vfwprintf F ++ __nldbl_vfwscanf F ++ __nldbl_vprintf F ++ __nldbl_vscanf F ++ __nldbl_vsnprintf F ++ __nldbl_vsprintf F ++ __nldbl_vsscanf F ++ __nldbl_vswprintf F ++ __nldbl_vswscanf F ++ __nldbl_vsyslog F ++ __nldbl_vwprintf F ++ __nldbl_vwscanf F ++ __nldbl_wprintf F ++ __nldbl_wscanf F ++ __nss_configure_lookup F ++ __nss_database_lookup F ++ __nss_group_lookup F ++ __nss_hostname_digits_dots F ++ __nss_hosts_lookup F ++ __nss_next F ++ __nss_passwd_lookup F ++ __obstack_printf_chk F ++ __obstack_vprintf_chk F ++ __open F ++ __open64 F ++ __open64_2 F ++ __open_2 F ++ __openat64_2 F ++ __openat_2 F ++ __overflow F ++ __pipe F ++ __poll F ++ __poll_chk F ++ __posix_getopt F ++ __ppc_get_timebase_freq F ++ __ppoll_chk F ++ __pread64 F ++ __pread64_chk F ++ __pread_chk F ++ __printf_chk F ++ __printf_fp F ++ __profile_frequency F ++ __progname D 0x8 ++ __progname_full D 0x8 ++ __ptsname_r_chk F ++ __pwrite64 F ++ __rawmemchr F ++ __rcmd_errstr D 0x8 ++ __read F ++ __read_chk F ++ __readlink_chk F ++ __readlinkat_chk F ++ __realloc_hook D 0x8 ++ __realpath_chk F ++ __recv_chk F ++ __recvfrom_chk F ++ __register_atfork F ++ __res_init F ++ __res_nclose F ++ __res_ninit F ++ __res_randomid F ++ __res_state F ++ __rpc_thread_createerr F ++ __rpc_thread_svc_fdset F ++ __rpc_thread_svc_max_pollfd F ++ __rpc_thread_svc_pollfd F ++ __sbrk F ++ __sched_cpualloc F ++ __sched_cpucount F ++ __sched_cpufree F ++ __sched_get_priority_max F ++ __sched_get_priority_min F ++ __sched_getparam F ++ __sched_getscheduler F ++ __sched_setscheduler F ++ __sched_yield F ++ __select F ++ __send F ++ __setmntent F ++ __setpgid F ++ __sigaction F ++ __sigaddset F ++ __sigdelset F ++ __sigismember F ++ __signbit F ++ __signbitf F ++ __signbitl F ++ __sigpause F ++ __sigsetjmp F ++ __sigsuspend F ++ __snprintf_chk F ++ __sprintf_chk F ++ __stack_chk_fail F ++ __statfs F ++ __stpcpy F ++ __stpcpy_chk F ++ __stpcpy_small F ++ __stpncpy F ++ __stpncpy_chk F ++ __strcasecmp F ++ __strcasecmp_l F ++ __strcasestr F ++ __strcat_chk F ++ __strcoll_l F ++ __strcpy_chk F ++ __strcpy_small F ++ __strcspn_c1 F ++ __strcspn_c2 F ++ __strcspn_c3 F ++ __strdup F ++ __strerror_r F ++ __strfmon_l F ++ __strftime_l F ++ __strncasecmp_l F ++ __strncat_chk F ++ __strncpy_chk F ++ __strndup F ++ __strpbrk_c2 F ++ __strpbrk_c3 F ++ __strsep_1c F ++ __strsep_2c F ++ __strsep_3c F ++ __strsep_g F ++ __strspn_c1 F ++ __strspn_c2 F ++ __strspn_c3 F ++ __strtod_internal F ++ __strtod_l F ++ __strtof_internal F ++ __strtof_l F ++ __strtok_r F ++ __strtok_r_1c F ++ __strtol_internal F ++ __strtol_l F ++ __strtold_internal F ++ __strtold_l F ++ __strtoll_internal F ++ __strtoll_l F ++ __strtoul_internal F ++ __strtoul_l F ++ __strtoull_internal F ++ __strtoull_l F ++ __strverscmp F ++ __strxfrm_l F ++ __swprintf_chk F ++ __sysconf F ++ __sysctl F ++ __syslog_chk F ++ __sysv_signal F ++ __timezone D 0x8 ++ __toascii_l F ++ __tolower_l F ++ __toupper_l F ++ __towctrans F ++ __towctrans_l F ++ __towlower_l F ++ __towupper_l F ++ __ttyname_r_chk F ++ __tzname D 0x10 ++ __uflow F ++ __underflow F ++ __uselocale F ++ __vasprintf_chk F ++ __vdprintf_chk F ++ __vfork F ++ __vfprintf_chk F ++ __vfscanf F ++ __vfwprintf_chk F ++ __vprintf_chk F ++ __vsnprintf F ++ __vsnprintf_chk F ++ __vsprintf_chk F ++ __vsscanf F ++ __vswprintf_chk F ++ __vsyslog_chk F ++ __vwprintf_chk F ++ __wait F ++ __waitpid F ++ __wcpcpy_chk F ++ __wcpncpy_chk F ++ __wcrtomb_chk F ++ __wcscasecmp_l F ++ __wcscat_chk F ++ __wcscoll_l F ++ __wcscpy_chk F ++ __wcsftime_l F ++ __wcsncasecmp_l F ++ __wcsncat_chk F ++ __wcsncpy_chk F ++ __wcsnrtombs_chk F ++ __wcsrtombs_chk F ++ __wcstod_internal F ++ __wcstod_l F ++ __wcstof_internal F ++ __wcstof_l F ++ __wcstol_internal F ++ __wcstol_l F ++ __wcstold_internal F ++ __wcstold_l F ++ __wcstoll_internal F ++ __wcstoll_l F ++ __wcstombs_chk F ++ __wcstoul_internal F ++ __wcstoul_l F ++ __wcstoull_internal F ++ __wcstoull_l F ++ __wcsxfrm_l F ++ __wctomb_chk F ++ __wctrans_l F ++ __wctype_l F ++ __wmemcpy_chk F ++ __wmemmove_chk F ++ __wmempcpy_chk F ++ __wmemset_chk F ++ __woverflow F ++ __wprintf_chk F ++ __write F ++ __wuflow F ++ __wunderflow F ++ __xmknod F ++ __xmknodat F ++ __xpg_basename F ++ __xpg_sigpause F ++ __xpg_strerror_r F ++ __xstat F ++ __xstat64 F ++ _authenticate F ++ _dl_mcount_wrapper F ++ _dl_mcount_wrapper_check F ++ _environ D 0x8 ++ _exit F ++ _flushlbf F ++ _libc_intl_domainname D 0x5 ++ _longjmp F ++ _mcleanup F ++ _mcount F ++ _nl_default_dirname D 0x12 ++ _nl_domain_bindings D 0x8 ++ _nl_msg_cat_cntr D 0x4 ++ _null_auth D 0x18 ++ _obstack_allocated_p F ++ _obstack_begin F ++ _obstack_begin_1 F ++ _obstack_free F ++ _obstack_memory_used F ++ _obstack_newchunk F ++ _res D 0x238 ++ _res_hconf D 0x48 ++ _rpc_dtablesize F ++ _seterr_reply F ++ _setjmp F ++ _sys_errlist D 0x438 ++ _sys_nerr D 0x4 ++ _sys_siglist D 0x208 ++ _tolower F ++ _toupper F ++ a64l F ++ abort F ++ abs F ++ accept F ++ accept4 F ++ access F ++ acct F ++ addmntent F ++ addseverity F ++ adjtime F ++ adjtimex F ++ advance F ++ alarm F ++ aligned_alloc F ++ alphasort F ++ alphasort64 F ++ argp_err_exit_status D 0x4 ++ argp_error F ++ argp_failure F ++ argp_help F ++ argp_parse F ++ argp_program_bug_address D 0x8 ++ argp_program_version D 0x8 ++ argp_program_version_hook D 0x8 ++ argp_state_help F ++ argp_usage F ++ argz_add F ++ argz_add_sep F ++ argz_append F ++ argz_count F ++ argz_create F ++ argz_create_sep F ++ argz_delete F ++ argz_extract F ++ argz_insert F ++ argz_next F ++ argz_replace F ++ argz_stringify F ++ asctime F ++ asctime_r F ++ asprintf F ++ atof F ++ atoi F ++ atol F ++ atoll F ++ authdes_create F ++ authdes_getucred F ++ authdes_pk_create F ++ authnone_create F ++ authunix_create F ++ authunix_create_default F ++ backtrace F ++ backtrace_symbols F ++ backtrace_symbols_fd F ++ basename F ++ bcmp F ++ bcopy F ++ bdflush F ++ bind F ++ bind_textdomain_codeset F ++ bindresvport F ++ bindtextdomain F ++ brk F ++ bsd_signal F ++ bsearch F ++ btowc F ++ bzero F ++ c16rtomb F ++ c32rtomb F ++ calloc F ++ callrpc F ++ canonicalize_file_name F ++ capget F ++ capset F ++ catclose F ++ catgets F ++ catopen F ++ cbc_crypt F ++ cfgetispeed F ++ cfgetospeed F ++ cfmakeraw F ++ cfree F ++ cfsetispeed F ++ cfsetospeed F ++ cfsetspeed F ++ chdir F ++ chflags F ++ chmod F ++ chown F ++ chroot F ++ clearenv F ++ clearerr F ++ clearerr_unlocked F ++ clnt_broadcast F ++ clnt_create F ++ clnt_pcreateerror F ++ clnt_perrno F ++ clnt_perror F ++ clnt_spcreateerror F ++ clnt_sperrno F ++ clnt_sperror F ++ clntraw_create F ++ clnttcp_create F ++ clntudp_bufcreate F ++ clntudp_create F ++ clntunix_create F ++ clock F ++ clock_adjtime F ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ clone F ++ close F ++ closedir F ++ closelog F ++ confstr F ++ connect F ++ copysign F ++ copysignf F ++ copysignl F ++ creat F ++ creat64 F ++ create_module F ++ ctermid F ++ ctime F ++ ctime_r F ++ cuserid F ++ daemon F ++ daylight D 0x4 ++ dcgettext F ++ dcngettext F ++ delete_module F ++ des_setparity F ++ dgettext F ++ difftime F ++ dirfd F ++ dirname F ++ div F ++ dl_iterate_phdr F ++ dngettext F ++ dprintf F ++ drand48 F ++ drand48_r F ++ dup F ++ dup2 F ++ dup3 F ++ duplocale F ++ dysize F ++ eaccess F ++ ecb_crypt F ++ ecvt F ++ ecvt_r F ++ endaliasent F ++ endfsent F ++ endgrent F ++ endhostent F ++ endmntent F ++ endnetent F ++ endnetgrent F ++ endprotoent F ++ endpwent F ++ endrpcent F ++ endservent F ++ endsgent F ++ endspent F ++ endttyent F ++ endusershell F ++ endutent F ++ endutxent F ++ environ D 0x8 ++ envz_add F ++ envz_entry F ++ envz_get F ++ envz_merge F ++ envz_remove F ++ envz_strip F ++ epoll_create F ++ epoll_create1 F ++ epoll_ctl F ++ epoll_pwait F ++ epoll_wait F ++ erand48 F ++ erand48_r F ++ err F ++ error F ++ error_at_line F ++ error_message_count D 0x4 ++ error_one_per_line D 0x4 ++ error_print_progname D 0x8 ++ errx F ++ ether_aton F ++ ether_aton_r F ++ ether_hostton F ++ ether_line F ++ ether_ntoa F ++ ether_ntoa_r F ++ ether_ntohost F ++ euidaccess F ++ eventfd F ++ eventfd_read F ++ eventfd_write F ++ execl F ++ execle F ++ execlp F ++ execv F ++ execve F ++ execvp F ++ execvpe F ++ exit F ++ faccessat F ++ fallocate F ++ fallocate64 F ++ fanotify_init F ++ fanotify_mark F ++ fattach F ++ fchdir F ++ fchflags F ++ fchmod F ++ fchmodat F ++ fchown F ++ fchownat F ++ fclose F ++ fcloseall F ++ fcntl F ++ fcvt F ++ fcvt_r F ++ fdatasync F ++ fdetach F ++ fdopen F ++ fdopendir F ++ feof F ++ feof_unlocked F ++ ferror F ++ ferror_unlocked F ++ fexecve F ++ fflush F ++ fflush_unlocked F ++ ffs F ++ ffsl F ++ ffsll F ++ fgetc F ++ fgetc_unlocked F ++ fgetgrent F ++ fgetgrent_r F ++ fgetpos F ++ fgetpos64 F ++ fgetpwent F ++ fgetpwent_r F ++ fgets F ++ fgets_unlocked F ++ fgetsgent F ++ fgetsgent_r F ++ fgetspent F ++ fgetspent_r F ++ fgetwc F ++ fgetwc_unlocked F ++ fgetws F ++ fgetws_unlocked F ++ fgetxattr F ++ fileno F ++ fileno_unlocked F ++ finite F ++ finitef F ++ finitel F ++ flistxattr F ++ flock F ++ flockfile F ++ fmemopen F ++ fmtmsg F ++ fnmatch F ++ fopen F ++ fopen64 F ++ fopencookie F ++ fork F ++ fpathconf F ++ fprintf F ++ fputc F ++ fputc_unlocked F ++ fputs F ++ fputs_unlocked F ++ fputwc F ++ fputwc_unlocked F ++ fputws F ++ fputws_unlocked F ++ fread F ++ fread_unlocked F ++ free F ++ freeaddrinfo F ++ freeifaddrs F ++ freelocale F ++ fremovexattr F ++ freopen F ++ freopen64 F ++ frexp F ++ frexpf F ++ frexpl F ++ fscanf F ++ fseek F ++ fseeko F ++ fseeko64 F ++ fsetpos F ++ fsetpos64 F ++ fsetxattr F ++ fstatfs F ++ fstatfs64 F ++ fstatvfs F ++ fstatvfs64 F ++ fsync F ++ ftell F ++ ftello F ++ ftello64 F ++ ftime F ++ ftok F ++ ftruncate F ++ ftruncate64 F ++ ftrylockfile F ++ fts_children F ++ fts_close F ++ fts_open F ++ fts_read F ++ fts_set F ++ ftw F ++ ftw64 F ++ funlockfile F ++ futimens F ++ futimes F ++ futimesat F ++ fwide F ++ fwprintf F ++ fwrite F ++ fwrite_unlocked F ++ fwscanf F ++ gai_strerror F ++ gcvt F ++ get_avphys_pages F ++ get_current_dir_name F ++ get_kernel_syms F ++ get_myaddress F ++ get_nprocs F ++ get_nprocs_conf F ++ get_phys_pages F ++ getaddrinfo F ++ getaliasbyname F ++ getaliasbyname_r F ++ getaliasent F ++ getaliasent_r F ++ getauxval F ++ getc F ++ getc_unlocked F ++ getchar F ++ getchar_unlocked F ++ getcontext F ++ getcwd F ++ getdate F ++ getdate_err D 0x4 ++ getdate_r F ++ getdelim F ++ getdirentries F ++ getdirentries64 F ++ getdomainname F ++ getdtablesize F ++ getegid F ++ getenv F ++ geteuid F ++ getfsent F ++ getfsfile F ++ getfsspec F ++ getgid F ++ getgrent F ++ getgrent_r F ++ getgrgid F ++ getgrgid_r F ++ getgrnam F ++ getgrnam_r F ++ getgrouplist F ++ getgroups F ++ gethostbyaddr F ++ gethostbyaddr_r F ++ gethostbyname F ++ gethostbyname2 F ++ gethostbyname2_r F ++ gethostbyname_r F ++ gethostent F ++ gethostent_r F ++ gethostid F ++ gethostname F ++ getifaddrs F ++ getipv4sourcefilter F ++ getitimer F ++ getline F ++ getloadavg F ++ getlogin F ++ getlogin_r F ++ getmntent F ++ getmntent_r F ++ getmsg F ++ getnameinfo F ++ getnetbyaddr F ++ getnetbyaddr_r F ++ getnetbyname F ++ getnetbyname_r F ++ getnetent F ++ getnetent_r F ++ getnetgrent F ++ getnetgrent_r F ++ getnetname F ++ getopt F ++ getopt_long F ++ getopt_long_only F ++ getpagesize F ++ getpass F ++ getpeername F ++ getpgid F ++ getpgrp F ++ getpid F ++ getpmsg F ++ getppid F ++ getpriority F ++ getprotobyname F ++ getprotobyname_r F ++ getprotobynumber F ++ getprotobynumber_r F ++ getprotoent F ++ getprotoent_r F ++ getpt F ++ getpublickey F ++ getpw F ++ getpwent F ++ getpwent_r F ++ getpwnam F ++ getpwnam_r F ++ getpwuid F ++ getpwuid_r F ++ getresgid F ++ getresuid F ++ getrlimit F ++ getrlimit64 F ++ getrpcbyname F ++ getrpcbyname_r F ++ getrpcbynumber F ++ getrpcbynumber_r F ++ getrpcent F ++ getrpcent_r F ++ getrpcport F ++ getrusage F ++ gets F ++ getsecretkey F ++ getservbyname F ++ getservbyname_r F ++ getservbyport F ++ getservbyport_r F ++ getservent F ++ getservent_r F ++ getsgent F ++ getsgent_r F ++ getsgnam F ++ getsgnam_r F ++ getsid F ++ getsockname F ++ getsockopt F ++ getsourcefilter F ++ getspent F ++ getspent_r F ++ getspnam F ++ getspnam_r F ++ getsubopt F ++ gettext F ++ gettimeofday F ++ getttyent F ++ getttynam F ++ getuid F ++ getusershell F ++ getutent F ++ getutent_r F ++ getutid F ++ getutid_r F ++ getutline F ++ getutline_r F ++ getutmp F ++ getutmpx F ++ getutxent F ++ getutxid F ++ getutxline F ++ getw F ++ getwc F ++ getwc_unlocked F ++ getwchar F ++ getwchar_unlocked F ++ getwd F ++ getxattr F ++ glob F ++ glob64 F ++ glob_pattern_p F ++ globfree F ++ globfree64 F ++ gmtime F ++ gmtime_r F ++ gnu_dev_major F ++ gnu_dev_makedev F ++ gnu_dev_minor F ++ gnu_get_libc_release F ++ gnu_get_libc_version F ++ grantpt F ++ group_member F ++ gsignal F ++ gtty F ++ h_errlist D 0x28 ++ h_nerr D 0x4 ++ hasmntopt F ++ hcreate F ++ hcreate_r F ++ hdestroy F ++ hdestroy_r F ++ herror F ++ host2netname F ++ hsearch F ++ hsearch_r F ++ hstrerror F ++ htonl F ++ htons F ++ iconv F ++ iconv_close F ++ iconv_open F ++ if_freenameindex F ++ if_indextoname F ++ if_nameindex F ++ if_nametoindex F ++ imaxabs F ++ imaxdiv F ++ in6addr_any D 0x10 ++ in6addr_loopback D 0x10 ++ index F ++ inet6_opt_append F ++ inet6_opt_find F ++ inet6_opt_finish F ++ inet6_opt_get_val F ++ inet6_opt_init F ++ inet6_opt_next F ++ inet6_opt_set_val F ++ inet6_option_alloc F ++ inet6_option_append F ++ inet6_option_find F ++ inet6_option_init F ++ inet6_option_next F ++ inet6_option_space F ++ inet6_rth_add F ++ inet6_rth_getaddr F ++ inet6_rth_init F ++ inet6_rth_reverse F ++ inet6_rth_segments F ++ inet6_rth_space F ++ inet_addr F ++ inet_aton F ++ inet_lnaof F ++ inet_makeaddr F ++ inet_netof F ++ inet_network F ++ inet_nsap_addr F ++ inet_nsap_ntoa F ++ inet_ntoa F ++ inet_ntop F ++ inet_pton F ++ init_module F ++ initgroups F ++ initstate F ++ initstate_r F ++ innetgr F ++ inotify_add_watch F ++ inotify_init F ++ inotify_init1 F ++ inotify_rm_watch F ++ insque F ++ ioctl F ++ iruserok F ++ iruserok_af F ++ isalnum F ++ isalnum_l F ++ isalpha F ++ isalpha_l F ++ isascii F ++ isastream F ++ isatty F ++ isblank F ++ isblank_l F ++ iscntrl F ++ iscntrl_l F ++ isctype F ++ isdigit F ++ isdigit_l F ++ isfdtype F ++ isgraph F ++ isgraph_l F ++ isinf F ++ isinff F ++ isinfl F ++ islower F ++ islower_l F ++ isnan F ++ isnanf F ++ isnanl F ++ isprint F ++ isprint_l F ++ ispunct F ++ ispunct_l F ++ isspace F ++ isspace_l F ++ isupper F ++ isupper_l F ++ iswalnum F ++ iswalnum_l F ++ iswalpha F ++ iswalpha_l F ++ iswblank F ++ iswblank_l F ++ iswcntrl F ++ iswcntrl_l F ++ iswctype F ++ iswctype_l F ++ iswdigit F ++ iswdigit_l F ++ iswgraph F ++ iswgraph_l F ++ iswlower F ++ iswlower_l F ++ iswprint F ++ iswprint_l F ++ iswpunct F ++ iswpunct_l F ++ iswspace F ++ iswspace_l F ++ iswupper F ++ iswupper_l F ++ iswxdigit F ++ iswxdigit_l F ++ isxdigit F ++ isxdigit_l F ++ jrand48 F ++ jrand48_r F ++ key_decryptsession F ++ key_decryptsession_pk F ++ key_encryptsession F ++ key_encryptsession_pk F ++ key_gendes F ++ key_get_conv F ++ key_secretkey_is_set F ++ key_setnet F ++ key_setsecret F ++ kill F ++ killpg F ++ klogctl F ++ l64a F ++ labs F ++ lchmod F ++ lchown F ++ lckpwdf F ++ lcong48 F ++ lcong48_r F ++ ldexp F ++ ldexpf F ++ ldexpl F ++ ldiv F ++ lfind F ++ lgetxattr F ++ link F ++ linkat F ++ listen F ++ listxattr F ++ llabs F ++ lldiv F ++ llistxattr F ++ llseek F ++ loc1 D 0x8 ++ loc2 D 0x8 ++ localeconv F ++ localtime F ++ localtime_r F ++ lockf F ++ lockf64 F ++ locs D 0x8 ++ longjmp F ++ lrand48 F ++ lrand48_r F ++ lremovexattr F ++ lsearch F ++ lseek F ++ lseek64 F ++ lsetxattr F ++ lutimes F ++ madvise F ++ makecontext F ++ mallinfo F ++ malloc F ++ malloc_get_state F ++ malloc_info F ++ malloc_set_state F ++ malloc_stats F ++ malloc_trim F ++ malloc_usable_size F ++ mallopt F ++ mallwatch D 0x8 ++ mblen F ++ mbrlen F ++ mbrtoc16 F ++ mbrtoc32 F ++ mbrtowc F ++ mbsinit F ++ mbsnrtowcs F ++ mbsrtowcs F ++ mbstowcs F ++ mbtowc F ++ mcheck F ++ mcheck_check_all F ++ mcheck_pedantic F ++ memalign F ++ memccpy F ++ memchr F ++ memcmp F ++ memcpy F ++ memfrob F ++ memmem F ++ memmove F ++ mempcpy F ++ memrchr F ++ memset F ++ mincore F ++ mkdir F ++ mkdirat F ++ mkdtemp F ++ mkfifo F ++ mkfifoat F ++ mkostemp F ++ mkostemp64 F ++ mkostemps F ++ mkostemps64 F ++ mkstemp F ++ mkstemp64 F ++ mkstemps F ++ mkstemps64 F ++ mktemp F ++ mktime F ++ mlock F ++ mlockall F ++ mmap F ++ mmap64 F ++ modf F ++ modff F ++ modfl F ++ moncontrol F ++ monstartup F ++ mount F ++ mprobe F ++ mprotect F ++ mrand48 F ++ mrand48_r F ++ mremap F ++ msgctl F ++ msgget F ++ msgrcv F ++ msgsnd F ++ msync F ++ mtrace F ++ munlock F ++ munlockall F ++ munmap F ++ muntrace F ++ name_to_handle_at F ++ nanosleep F ++ netname2host F ++ netname2user F ++ newlocale F ++ nfsservctl F ++ nftw F ++ nftw64 F ++ ngettext F ++ nice F ++ nl_langinfo F ++ nl_langinfo_l F ++ nrand48 F ++ nrand48_r F ++ ntohl F ++ ntohs F ++ ntp_adjtime F ++ ntp_gettime F ++ ntp_gettimex F ++ obstack_alloc_failed_handler D 0x8 ++ obstack_exit_failure D 0x4 ++ obstack_free F ++ obstack_printf F ++ obstack_vprintf F ++ on_exit F ++ open F ++ open64 F ++ open_by_handle_at F ++ open_memstream F ++ open_wmemstream F ++ openat F ++ openat64 F ++ opendir F ++ openlog F ++ optarg D 0x8 ++ opterr D 0x4 ++ optind D 0x4 ++ optopt D 0x4 ++ parse_printf_format F ++ passwd2des F ++ pathconf F ++ pause F ++ pclose F ++ perror F ++ personality F ++ pipe F ++ pipe2 F ++ pivot_root F ++ pmap_getmaps F ++ pmap_getport F ++ pmap_rmtcall F ++ pmap_set F ++ pmap_unset F ++ poll F ++ popen F ++ posix_fadvise F ++ posix_fadvise64 F ++ posix_fallocate F ++ posix_fallocate64 F ++ posix_madvise F ++ posix_memalign F ++ posix_openpt F ++ posix_spawn F ++ posix_spawn_file_actions_addclose F ++ posix_spawn_file_actions_adddup2 F ++ posix_spawn_file_actions_addopen F ++ posix_spawn_file_actions_destroy F ++ posix_spawn_file_actions_init F ++ posix_spawnattr_destroy F ++ posix_spawnattr_getflags F ++ posix_spawnattr_getpgroup F ++ posix_spawnattr_getschedparam F ++ posix_spawnattr_getschedpolicy F ++ posix_spawnattr_getsigdefault F ++ posix_spawnattr_getsigmask F ++ posix_spawnattr_init F ++ posix_spawnattr_setflags F ++ posix_spawnattr_setpgroup F ++ posix_spawnattr_setschedparam F ++ posix_spawnattr_setschedpolicy F ++ posix_spawnattr_setsigdefault F ++ posix_spawnattr_setsigmask F ++ posix_spawnp F ++ ppoll F ++ prctl F ++ pread F ++ pread64 F ++ preadv F ++ preadv64 F ++ printf F ++ printf_size F ++ printf_size_info F ++ prlimit F ++ prlimit64 F ++ process_vm_readv F ++ process_vm_writev F ++ profil F ++ program_invocation_name D 0x8 ++ program_invocation_short_name D 0x8 ++ pselect F ++ psiginfo F ++ psignal F ++ pthread_attr_destroy F ++ pthread_attr_getdetachstate F ++ pthread_attr_getinheritsched F ++ pthread_attr_getschedparam F ++ pthread_attr_getschedpolicy F ++ pthread_attr_getscope F ++ pthread_attr_init F ++ pthread_attr_setdetachstate F ++ pthread_attr_setinheritsched F ++ pthread_attr_setschedparam F ++ pthread_attr_setschedpolicy F ++ pthread_attr_setscope F ++ pthread_cond_broadcast F ++ pthread_cond_destroy F ++ pthread_cond_init F ++ pthread_cond_signal F ++ pthread_cond_timedwait F ++ pthread_cond_wait F ++ pthread_condattr_destroy F ++ pthread_condattr_init F ++ pthread_equal F ++ pthread_exit F ++ pthread_getschedparam F ++ pthread_mutex_destroy F ++ pthread_mutex_init F ++ pthread_mutex_lock F ++ pthread_mutex_unlock F ++ pthread_self F ++ pthread_setcancelstate F ++ pthread_setcanceltype F ++ pthread_setschedparam F ++ ptrace F ++ ptsname F ++ ptsname_r F ++ putc F ++ putc_unlocked F ++ putchar F ++ putchar_unlocked F ++ putenv F ++ putgrent F ++ putmsg F ++ putpmsg F ++ putpwent F ++ puts F ++ putsgent F ++ putspent F ++ pututline F ++ pututxline F ++ putw F ++ putwc F ++ putwc_unlocked F ++ putwchar F ++ putwchar_unlocked F ++ pvalloc F ++ pwrite F ++ pwrite64 F ++ pwritev F ++ pwritev64 F ++ qecvt F ++ qecvt_r F ++ qfcvt F ++ qfcvt_r F ++ qgcvt F ++ qsort F ++ qsort_r F ++ query_module F ++ quick_exit F ++ quotactl F ++ raise F ++ rand F ++ rand_r F ++ random F ++ random_r F ++ rawmemchr F ++ rcmd F ++ rcmd_af F ++ re_comp F ++ re_compile_fastmap F ++ re_compile_pattern F ++ re_exec F ++ re_match F ++ re_match_2 F ++ re_search F ++ re_search_2 F ++ re_set_registers F ++ re_set_syntax F ++ re_syntax_options D 0x8 ++ read F ++ readahead F ++ readdir F ++ readdir64 F ++ readdir64_r F ++ readdir_r F ++ readlink F ++ readlinkat F ++ readv F ++ realloc F ++ realpath F ++ reboot F ++ recv F ++ recvfrom F ++ recvmmsg F ++ recvmsg F ++ regcomp F ++ regerror F ++ regexec F ++ regfree F ++ register_printf_function F ++ register_printf_modifier F ++ register_printf_specifier F ++ register_printf_type F ++ registerrpc F ++ remap_file_pages F ++ remove F ++ removexattr F ++ remque F ++ rename F ++ renameat F ++ revoke F ++ rewind F ++ rewinddir F ++ rexec F ++ rexec_af F ++ rexecoptions D 0x4 ++ rindex F ++ rmdir F ++ rpc_createerr D 0x20 ++ rpmatch F ++ rresvport F ++ rresvport_af F ++ rtime F ++ ruserok F ++ ruserok_af F ++ ruserpass F ++ sbrk F ++ scalbn F ++ scalbnf F ++ scalbnl F ++ scandir F ++ scandir64 F ++ scandirat F ++ scandirat64 F ++ scanf F ++ sched_get_priority_max F ++ sched_get_priority_min F ++ sched_getaffinity F ++ sched_getcpu F ++ sched_getparam F ++ sched_getscheduler F ++ sched_rr_get_interval F ++ sched_setaffinity F ++ sched_setparam F ++ sched_setscheduler F ++ sched_yield F ++ secure_getenv F ++ seed48 F ++ seed48_r F ++ seekdir F ++ select F ++ semctl F ++ semget F ++ semop F ++ semtimedop F ++ send F ++ sendfile F ++ sendfile64 F ++ sendmmsg F ++ sendmsg F ++ sendto F ++ setaliasent F ++ setbuf F ++ setbuffer F ++ setcontext F ++ setdomainname F ++ setegid F ++ setenv F ++ seteuid F ++ setfsent F ++ setfsgid F ++ setfsuid F ++ setgid F ++ setgrent F ++ setgroups F ++ sethostent F ++ sethostid F ++ sethostname F ++ setipv4sourcefilter F ++ setitimer F ++ setjmp F ++ setlinebuf F ++ setlocale F ++ setlogin F ++ setlogmask F ++ setmntent F ++ setnetent F ++ setnetgrent F ++ setns F ++ setpgid F ++ setpgrp F ++ setpriority F ++ setprotoent F ++ setpwent F ++ setregid F ++ setresgid F ++ setresuid F ++ setreuid F ++ setrlimit F ++ setrlimit64 F ++ setrpcent F ++ setservent F ++ setsgent F ++ setsid F ++ setsockopt F ++ setsourcefilter F ++ setspent F ++ setstate F ++ setstate_r F ++ settimeofday F ++ setttyent F ++ setuid F ++ setusershell F ++ setutent F ++ setutxent F ++ setvbuf F ++ setxattr F ++ sgetsgent F ++ sgetsgent_r F ++ sgetspent F ++ sgetspent_r F ++ shmat F ++ shmctl F ++ shmdt F ++ shmget F ++ shutdown F ++ sigaction F ++ sigaddset F ++ sigaltstack F ++ sigandset F ++ sigblock F ++ sigdelset F ++ sigemptyset F ++ sigfillset F ++ siggetmask F ++ sighold F ++ sigignore F ++ siginterrupt F ++ sigisemptyset F ++ sigismember F ++ siglongjmp F ++ signal F ++ signalfd F ++ sigorset F ++ sigpause F ++ sigpending F ++ sigprocmask F ++ sigqueue F ++ sigrelse F ++ sigreturn F ++ sigset F ++ sigsetmask F ++ sigstack F ++ sigsuspend F ++ sigtimedwait F ++ sigvec F ++ sigwait F ++ sigwaitinfo F ++ sleep F ++ snprintf F ++ sockatmark F ++ socket F ++ socketpair F ++ splice F ++ sprintf F ++ sprofil F ++ srand F ++ srand48 F ++ srand48_r F ++ srandom F ++ srandom_r F ++ sscanf F ++ ssignal F ++ sstk F ++ statfs F ++ statfs64 F ++ statvfs F ++ statvfs64 F ++ stderr D 0x8 ++ stdin D 0x8 ++ stdout D 0x8 ++ step F ++ stime F ++ stpcpy F ++ stpncpy F ++ strcasecmp F ++ strcasecmp_l F ++ strcasestr F ++ strcat F ++ strchr F ++ strchrnul F ++ strcmp F ++ strcoll F ++ strcoll_l F ++ strcpy F ++ strcspn F ++ strdup F ++ strerror F ++ strerror_l F ++ strerror_r F ++ strfmon F ++ strfmon_l F ++ strfry F ++ strftime F ++ strftime_l F ++ strlen F ++ strncasecmp F ++ strncasecmp_l F ++ strncat F ++ strncmp F ++ strncpy F ++ strndup F ++ strnlen F ++ strpbrk F ++ strptime F ++ strptime_l F ++ strrchr F ++ strsep F ++ strsignal F ++ strspn F ++ strstr F ++ strtod F ++ strtod_l F ++ strtof F ++ strtof_l F ++ strtoimax F ++ strtok F ++ strtok_r F ++ strtol F ++ strtol_l F ++ strtold F ++ strtold_l F ++ strtoll F ++ strtoll_l F ++ strtoq F ++ strtoul F ++ strtoul_l F ++ strtoull F ++ strtoull_l F ++ strtoumax F ++ strtouq F ++ strverscmp F ++ strxfrm F ++ strxfrm_l F ++ stty F ++ svc_exit F ++ svc_fdset D 0x80 ++ svc_getreq F ++ svc_getreq_common F ++ svc_getreq_poll F ++ svc_getreqset F ++ svc_max_pollfd D 0x4 ++ svc_pollfd D 0x8 ++ svc_register F ++ svc_run F ++ svc_sendreply F ++ svc_unregister F ++ svcauthdes_stats D 0x18 ++ svcerr_auth F ++ svcerr_decode F ++ svcerr_noproc F ++ svcerr_noprog F ++ svcerr_progvers F ++ svcerr_systemerr F ++ svcerr_weakauth F ++ svcfd_create F ++ svcraw_create F ++ svctcp_create F ++ svcudp_bufcreate F ++ svcudp_create F ++ svcudp_enablecache F ++ svcunix_create F ++ svcunixfd_create F ++ swab F ++ swapcontext F ++ swapoff F ++ swapon F ++ swprintf F ++ swscanf F ++ symlink F ++ symlinkat F ++ sync F ++ sync_file_range F ++ syncfs F ++ sys_errlist D 0x438 ++ sys_nerr D 0x4 ++ sys_sigabbrev D 0x208 ++ sys_siglist D 0x208 ++ syscall F ++ sysconf F ++ sysctl F ++ sysinfo F ++ syslog F ++ system F ++ sysv_signal F ++ tcdrain F ++ tcflow F ++ tcflush F ++ tcgetattr F ++ tcgetpgrp F ++ tcgetsid F ++ tcsendbreak F ++ tcsetattr F ++ tcsetpgrp F ++ tdelete F ++ tdestroy F ++ tee F ++ telldir F ++ tempnam F ++ textdomain F ++ tfind F ++ time F ++ timegm F ++ timelocal F ++ timerfd_create F ++ timerfd_gettime F ++ timerfd_settime F ++ times F ++ timespec_get F ++ timezone D 0x8 ++ tmpfile F ++ tmpfile64 F ++ tmpnam F ++ tmpnam_r F ++ toascii F ++ tolower F ++ tolower_l F ++ toupper F ++ toupper_l F ++ towctrans F ++ towctrans_l F ++ towlower F ++ towlower_l F ++ towupper F ++ towupper_l F ++ tr_break F ++ truncate F ++ truncate64 F ++ tsearch F ++ ttyname F ++ ttyname_r F ++ ttyslot F ++ twalk F ++ tzname D 0x10 ++ tzset F ++ ualarm F ++ ulckpwdf F ++ ulimit F ++ umask F ++ umount F ++ umount2 F ++ uname F ++ ungetc F ++ ungetwc F ++ unlink F ++ unlinkat F ++ unlockpt F ++ unsetenv F ++ unshare F ++ updwtmp F ++ updwtmpx F ++ uselib F ++ uselocale F ++ user2netname F ++ usleep F ++ ustat F ++ utime F ++ utimensat F ++ utimes F ++ utmpname F ++ utmpxname F ++ valloc F ++ vasprintf F ++ vdprintf F ++ verr F ++ verrx F ++ versionsort F ++ versionsort64 F ++ vfork F ++ vfprintf F ++ vfscanf F ++ vfwprintf F ++ vfwscanf F ++ vhangup F ++ vlimit F ++ vmsplice F ++ vprintf F ++ vscanf F ++ vsnprintf F ++ vsprintf F ++ vsscanf F ++ vswprintf F ++ vswscanf F ++ vsyslog F ++ vtimes F ++ vwarn F ++ vwarnx F ++ vwprintf F ++ vwscanf F ++ wait F ++ wait3 F ++ wait4 F ++ waitid F ++ waitpid F ++ warn F ++ warnx F ++ wcpcpy F ++ wcpncpy F ++ wcrtomb F ++ wcscasecmp F ++ wcscasecmp_l F ++ wcscat F ++ wcschr F ++ wcschrnul F ++ wcscmp F ++ wcscoll F ++ wcscoll_l F ++ wcscpy F ++ wcscspn F ++ wcsdup F ++ wcsftime F ++ wcsftime_l F ++ wcslen F ++ wcsncasecmp F ++ wcsncasecmp_l F ++ wcsncat F ++ wcsncmp F ++ wcsncpy F ++ wcsnlen F ++ wcsnrtombs F ++ wcspbrk F ++ wcsrchr F ++ wcsrtombs F ++ wcsspn F ++ wcsstr F ++ wcstod F ++ wcstod_l F ++ wcstof F ++ wcstof_l F ++ wcstoimax F ++ wcstok F ++ wcstol F ++ wcstol_l F ++ wcstold F ++ wcstold_l F ++ wcstoll F ++ wcstoll_l F ++ wcstombs F ++ wcstoq F ++ wcstoul F ++ wcstoul_l F ++ wcstoull F ++ wcstoull_l F ++ wcstoumax F ++ wcstouq F ++ wcswcs F ++ wcswidth F ++ wcsxfrm F ++ wcsxfrm_l F ++ wctob F ++ wctomb F ++ wctrans F ++ wctrans_l F ++ wctype F ++ wctype_l F ++ wcwidth F ++ wmemchr F ++ wmemcmp F ++ wmemcpy F ++ wmemmove F ++ wmempcpy F ++ wmemset F ++ wordexp F ++ wordfree F ++ wprintf F ++ write F ++ writev F ++ wscanf F ++ xdecrypt F ++ xdr_accepted_reply F ++ xdr_array F ++ xdr_authdes_cred F ++ xdr_authdes_verf F ++ xdr_authunix_parms F ++ xdr_bool F ++ xdr_bytes F ++ xdr_callhdr F ++ xdr_callmsg F ++ xdr_char F ++ xdr_cryptkeyarg F ++ xdr_cryptkeyarg2 F ++ xdr_cryptkeyres F ++ xdr_des_block F ++ xdr_double F ++ xdr_enum F ++ xdr_float F ++ xdr_free F ++ xdr_getcredres F ++ xdr_hyper F ++ xdr_int F ++ xdr_int16_t F ++ xdr_int32_t F ++ xdr_int64_t F ++ xdr_int8_t F ++ xdr_key_netstarg F ++ xdr_key_netstres F ++ xdr_keybuf F ++ xdr_keystatus F ++ xdr_long F ++ xdr_longlong_t F ++ xdr_netnamestr F ++ xdr_netobj F ++ xdr_opaque F ++ xdr_opaque_auth F ++ xdr_pmap F ++ xdr_pmaplist F ++ xdr_pointer F ++ xdr_quad_t F ++ xdr_reference F ++ xdr_rejected_reply F ++ xdr_replymsg F ++ xdr_rmtcall_args F ++ xdr_rmtcallres F ++ xdr_short F ++ xdr_sizeof F ++ xdr_string F ++ xdr_u_char F ++ xdr_u_hyper F ++ xdr_u_int F ++ xdr_u_long F ++ xdr_u_longlong_t F ++ xdr_u_quad_t F ++ xdr_u_short F ++ xdr_uint16_t F ++ xdr_uint32_t F ++ xdr_uint64_t F ++ xdr_uint8_t F ++ xdr_union F ++ xdr_unixcred F ++ xdr_vector F ++ xdr_void F ++ xdr_wrapstring F ++ xdrmem_create F ++ xdrrec_create F ++ xdrrec_endofrecord F ++ xdrrec_eof F ++ xdrrec_skiprecord F ++ xdrstdio_create F ++ xencrypt F ++ xprt_register F ++ xprt_unregister F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libcrypt-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libcrypt-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libcrypt-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libcrypt-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,9 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ crypt F ++ crypt_r F ++ encrypt F ++ encrypt_r F ++ fcrypt F ++ setkey F ++ setkey_r F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libdl-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libdl-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libdl-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libdl-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,11 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ dladdr F ++ dladdr1 F ++ dlclose F ++ dlerror F ++ dlinfo F ++ dlmopen F ++ dlopen F ++ dlsym F ++ dlvsym F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libm-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libm-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libm-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libm-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,402 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ _LIB_VERSION D 0x4 ++ __acos_finite F ++ __acosf_finite F ++ __acosh_finite F ++ __acoshf_finite F ++ __acoshl_finite F ++ __acosl_finite F ++ __asin_finite F ++ __asinf_finite F ++ __asinl_finite F ++ __atan2_finite F ++ __atan2f_finite F ++ __atan2l_finite F ++ __atanh_finite F ++ __atanhf_finite F ++ __atanhl_finite F ++ __clog10 F ++ __clog10f F ++ __clog10l F ++ __cosh_finite F ++ __coshf_finite F ++ __coshl_finite F ++ __exp10_finite F ++ __exp10f_finite F ++ __exp10l_finite F ++ __exp2_finite F ++ __exp2f_finite F ++ __exp2l_finite F ++ __exp_finite F ++ __expf_finite F ++ __expl_finite F ++ __fe_dfl_env D 0x8 ++ __fe_enabled_env D 0x8 ++ __fe_nomask_env F ++ __fe_nonieee_env D 0x8 ++ __finite F ++ __finitef F ++ __finitel F ++ __fmod_finite F ++ __fmodf_finite F ++ __fmodl_finite F ++ __fpclassify F ++ __fpclassifyf F ++ __fpclassifyl F ++ __gamma_r_finite F ++ __gammaf_r_finite F ++ __gammal_r_finite F ++ __hypot_finite F ++ __hypotf_finite F ++ __hypotl_finite F ++ __j0_finite F ++ __j0f_finite F ++ __j0l_finite F ++ __j1_finite F ++ __j1f_finite F ++ __j1l_finite F ++ __jn_finite F ++ __jnf_finite F ++ __jnl_finite F ++ __lgamma_r_finite F ++ __lgammaf_r_finite F ++ __lgammal_r_finite F ++ __log10_finite F ++ __log10f_finite F ++ __log10l_finite F ++ __log2_finite F ++ __log2f_finite F ++ __log2l_finite F ++ __log_finite F ++ __logf_finite F ++ __logl_finite F ++ __nldbl_nexttowardf F ++ __pow_finite F ++ __powf_finite F ++ __powl_finite F ++ __remainder_finite F ++ __remainderf_finite F ++ __remainderl_finite F ++ __scalb_finite F ++ __scalbf_finite F ++ __scalbl_finite F ++ __signbit F ++ __signbitf F ++ __signbitl F ++ __sinh_finite F ++ __sinhf_finite F ++ __sinhl_finite F ++ __sqrt_finite F ++ __sqrtf_finite F ++ __sqrtl_finite F ++ __y0_finite F ++ __y0f_finite F ++ __y0l_finite F ++ __y1_finite F ++ __y1f_finite F ++ __y1l_finite F ++ __yn_finite F ++ __ynf_finite F ++ __ynl_finite F ++ acos F ++ acosf F ++ acosh F ++ acoshf F ++ acoshl F ++ acosl F ++ asin F ++ asinf F ++ asinh F ++ asinhf F ++ asinhl F ++ asinl F ++ atan F ++ atan2 F ++ atan2f F ++ atan2l F ++ atanf F ++ atanh F ++ atanhf F ++ atanhl F ++ atanl F ++ cabs F ++ cabsf F ++ cabsl F ++ cacos F ++ cacosf F ++ cacosh F ++ cacoshf F ++ cacoshl F ++ cacosl F ++ carg F ++ cargf F ++ cargl F ++ casin F ++ casinf F ++ casinh F ++ casinhf F ++ casinhl F ++ casinl F ++ catan F ++ catanf F ++ catanh F ++ catanhf F ++ catanhl F ++ catanl F ++ cbrt F ++ cbrtf F ++ cbrtl F ++ ccos F ++ ccosf F ++ ccosh F ++ ccoshf F ++ ccoshl F ++ ccosl F ++ ceil F ++ ceilf F ++ ceill F ++ cexp F ++ cexpf F ++ cexpl F ++ cimag F ++ cimagf F ++ cimagl F ++ clog F ++ clog10 F ++ clog10f F ++ clog10l F ++ clogf F ++ clogl F ++ conj F ++ conjf F ++ conjl F ++ copysign F ++ copysignf F ++ copysignl F ++ cos F ++ cosf F ++ cosh F ++ coshf F ++ coshl F ++ cosl F ++ cpow F ++ cpowf F ++ cpowl F ++ cproj F ++ cprojf F ++ cprojl F ++ creal F ++ crealf F ++ creall F ++ csin F ++ csinf F ++ csinh F ++ csinhf F ++ csinhl F ++ csinl F ++ csqrt F ++ csqrtf F ++ csqrtl F ++ ctan F ++ ctanf F ++ ctanh F ++ ctanhf F ++ ctanhl F ++ ctanl F ++ drem F ++ dremf F ++ dreml F ++ erf F ++ erfc F ++ erfcf F ++ erfcl F ++ erff F ++ erfl F ++ exp F ++ exp10 F ++ exp10f F ++ exp10l F ++ exp2 F ++ exp2f F ++ exp2l F ++ expf F ++ expl F ++ expm1 F ++ expm1f F ++ expm1l F ++ fabs F ++ fabsf F ++ fabsl F ++ fdim F ++ fdimf F ++ fdiml F ++ feclearexcept F ++ fedisableexcept F ++ feenableexcept F ++ fegetenv F ++ fegetexcept F ++ fegetexceptflag F ++ fegetround F ++ feholdexcept F ++ feraiseexcept F ++ fesetenv F ++ fesetexceptflag F ++ fesetround F ++ fetestexcept F ++ feupdateenv F ++ finite F ++ finitef F ++ finitel F ++ floor F ++ floorf F ++ floorl F ++ fma F ++ fmaf F ++ fmal F ++ fmax F ++ fmaxf F ++ fmaxl F ++ fmin F ++ fminf F ++ fminl F ++ fmod F ++ fmodf F ++ fmodl F ++ frexp F ++ frexpf F ++ frexpl F ++ gamma F ++ gammaf F ++ gammal F ++ hypot F ++ hypotf F ++ hypotl F ++ ilogb F ++ ilogbf F ++ ilogbl F ++ j0 F ++ j0f F ++ j0l F ++ j1 F ++ j1f F ++ j1l F ++ jn F ++ jnf F ++ jnl F ++ ldexp F ++ ldexpf F ++ ldexpl F ++ lgamma F ++ lgamma_r F ++ lgammaf F ++ lgammaf_r F ++ lgammal F ++ lgammal_r F ++ llrint F ++ llrintf F ++ llrintl F ++ llround F ++ llroundf F ++ llroundl F ++ log F ++ log10 F ++ log10f F ++ log10l F ++ log1p F ++ log1pf F ++ log1pl F ++ log2 F ++ log2f F ++ log2l F ++ logb F ++ logbf F ++ logbl F ++ logf F ++ logl F ++ lrint F ++ lrintf F ++ lrintl F ++ lround F ++ lroundf F ++ lroundl F ++ matherr F ++ modf F ++ modff F ++ modfl F ++ nan F ++ nanf F ++ nanl F ++ nearbyint F ++ nearbyintf F ++ nearbyintl F ++ nextafter F ++ nextafterf F ++ nextafterl F ++ nexttoward F ++ nexttowardf F ++ nexttowardl F ++ pow F ++ pow10 F ++ pow10f F ++ pow10l F ++ powf F ++ powl F ++ remainder F ++ remainderf F ++ remainderl F ++ remquo F ++ remquof F ++ remquol F ++ rint F ++ rintf F ++ rintl F ++ round F ++ roundf F ++ roundl F ++ scalb F ++ scalbf F ++ scalbl F ++ scalbln F ++ scalblnf F ++ scalblnl F ++ scalbn F ++ scalbnf F ++ scalbnl F ++ signgam D 0x4 ++ significand F ++ significandf F ++ significandl F ++ sin F ++ sincos F ++ sincosf F ++ sincosl F ++ sinf F ++ sinh F ++ sinhf F ++ sinhl F ++ sinl F ++ sqrt F ++ sqrtf F ++ sqrtl F ++ tan F ++ tanf F ++ tanh F ++ tanhf F ++ tanhl F ++ tanl F ++ tgamma F ++ tgammaf F ++ tgammal F ++ trunc F ++ truncf F ++ truncl F ++ y0 F ++ y0f F ++ y0l F ++ y1 F ++ y1f F ++ y1l F ++ yn F ++ ynf F ++ ynl F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libnsl-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libnsl-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libnsl-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libnsl-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,123 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ __free_fdresult F ++ __nis_default_access F ++ __nis_default_group F ++ __nis_default_owner F ++ __nis_default_ttl F ++ __nis_finddirectory F ++ __nis_hash F ++ __nisbind_connect F ++ __nisbind_create F ++ __nisbind_destroy F ++ __nisbind_next F ++ __yp_check F ++ nis_add F ++ nis_add_entry F ++ nis_addmember F ++ nis_checkpoint F ++ nis_clone_directory F ++ nis_clone_object F ++ nis_clone_result F ++ nis_creategroup F ++ nis_destroy_object F ++ nis_destroygroup F ++ nis_dir_cmp F ++ nis_domain_of F ++ nis_domain_of_r F ++ nis_first_entry F ++ nis_free_directory F ++ nis_free_object F ++ nis_free_request F ++ nis_freenames F ++ nis_freeresult F ++ nis_freeservlist F ++ nis_freetags F ++ nis_getnames F ++ nis_getservlist F ++ nis_ismember F ++ nis_leaf_of F ++ nis_leaf_of_r F ++ nis_lerror F ++ nis_list F ++ nis_local_directory F ++ nis_local_group F ++ nis_local_host F ++ nis_local_principal F ++ nis_lookup F ++ nis_mkdir F ++ nis_modify F ++ nis_modify_entry F ++ nis_name_of F ++ nis_name_of_r F ++ nis_next_entry F ++ nis_perror F ++ nis_ping F ++ nis_print_directory F ++ nis_print_entry F ++ nis_print_group F ++ nis_print_group_entry F ++ nis_print_link F ++ nis_print_object F ++ nis_print_result F ++ nis_print_rights F ++ nis_print_table F ++ nis_read_obj F ++ nis_remove F ++ nis_remove_entry F ++ nis_removemember F ++ nis_rmdir F ++ nis_servstate F ++ nis_sperrno F ++ nis_sperror F ++ nis_sperror_r F ++ nis_stats F ++ nis_verifygroup F ++ nis_write_obj F ++ readColdStartFile F ++ writeColdStartFile F ++ xdr_cback_data F ++ xdr_domainname F ++ xdr_keydat F ++ xdr_mapname F ++ xdr_obj_p F ++ xdr_peername F ++ xdr_valdat F ++ xdr_yp_buf F ++ xdr_ypall F ++ xdr_ypbind_binding F ++ xdr_ypbind_resp F ++ xdr_ypbind_resptype F ++ xdr_ypbind_setdom F ++ xdr_ypdelete_args F ++ xdr_ypmap_parms F ++ xdr_ypmaplist F ++ xdr_yppush_status F ++ xdr_yppushresp_xfr F ++ xdr_ypreq_key F ++ xdr_ypreq_nokey F ++ xdr_ypreq_xfr F ++ xdr_ypresp_all F ++ xdr_ypresp_key_val F ++ xdr_ypresp_maplist F ++ xdr_ypresp_master F ++ xdr_ypresp_order F ++ xdr_ypresp_val F ++ xdr_ypresp_xfr F ++ xdr_ypstat F ++ xdr_ypupdate_args F ++ xdr_ypxfrstat F ++ yp_all F ++ yp_bind F ++ yp_first F ++ yp_get_default_domain F ++ yp_maplist F ++ yp_master F ++ yp_match F ++ yp_next F ++ yp_order F ++ yp_unbind F ++ yp_update F ++ ypbinderr_string F ++ yperr_string F ++ ypprot_err F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libpthread-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libpthread-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libpthread-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libpthread-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,224 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ _IO_flockfile F ++ _IO_ftrylockfile F ++ _IO_funlockfile F ++ __close F ++ __connect F ++ __errno_location F ++ __fcntl F ++ __fork F ++ __h_errno_location F ++ __libc_allocate_rtsig F ++ __libc_current_sigrtmax F ++ __libc_current_sigrtmin F ++ __lseek F ++ __nanosleep F ++ __open F ++ __open64 F ++ __pread64 F ++ __pthread_cleanup_routine F ++ __pthread_getspecific F ++ __pthread_key_create F ++ __pthread_mutex_destroy F ++ __pthread_mutex_init F ++ __pthread_mutex_lock F ++ __pthread_mutex_trylock F ++ __pthread_mutex_unlock F ++ __pthread_mutexattr_destroy F ++ __pthread_mutexattr_init F ++ __pthread_mutexattr_settype F ++ __pthread_once F ++ __pthread_register_cancel F ++ __pthread_register_cancel_defer F ++ __pthread_rwlock_destroy F ++ __pthread_rwlock_init F ++ __pthread_rwlock_rdlock F ++ __pthread_rwlock_tryrdlock F ++ __pthread_rwlock_trywrlock F ++ __pthread_rwlock_unlock F ++ __pthread_rwlock_wrlock F ++ __pthread_setspecific F ++ __pthread_unregister_cancel F ++ __pthread_unregister_cancel_restore F ++ __pthread_unwind_next F ++ __pwrite64 F ++ __read F ++ __res_state F ++ __send F ++ __sigaction F ++ __vfork F ++ __wait F ++ __write F ++ _pthread_cleanup_pop F ++ _pthread_cleanup_pop_restore F ++ _pthread_cleanup_push F ++ _pthread_cleanup_push_defer F ++ accept F ++ close F ++ connect F ++ fcntl F ++ flockfile F ++ fork F ++ fsync F ++ ftrylockfile F ++ funlockfile F ++ longjmp F ++ lseek F ++ lseek64 F ++ msync F ++ nanosleep F ++ open F ++ open64 F ++ pause F ++ pread F ++ pread64 F ++ pthread_attr_destroy F ++ pthread_attr_getaffinity_np F ++ pthread_attr_getdetachstate F ++ pthread_attr_getguardsize F ++ pthread_attr_getinheritsched F ++ pthread_attr_getschedparam F ++ pthread_attr_getschedpolicy F ++ pthread_attr_getscope F ++ pthread_attr_getstack F ++ pthread_attr_getstackaddr F ++ pthread_attr_getstacksize F ++ pthread_attr_init F ++ pthread_attr_setaffinity_np F ++ pthread_attr_setdetachstate F ++ pthread_attr_setguardsize F ++ pthread_attr_setinheritsched F ++ pthread_attr_setschedparam F ++ pthread_attr_setschedpolicy F ++ pthread_attr_setscope F ++ pthread_attr_setstack F ++ pthread_attr_setstackaddr F ++ pthread_attr_setstacksize F ++ pthread_barrier_destroy F ++ pthread_barrier_init F ++ pthread_barrier_wait F ++ pthread_barrierattr_destroy F ++ pthread_barrierattr_getpshared F ++ pthread_barrierattr_init F ++ pthread_barrierattr_setpshared F ++ pthread_cancel F ++ pthread_cond_broadcast F ++ pthread_cond_destroy F ++ pthread_cond_init F ++ pthread_cond_signal F ++ pthread_cond_timedwait F ++ pthread_cond_wait F ++ pthread_condattr_destroy F ++ pthread_condattr_getclock F ++ pthread_condattr_getpshared F ++ pthread_condattr_init F ++ pthread_condattr_setclock F ++ pthread_condattr_setpshared F ++ pthread_create F ++ pthread_detach F ++ pthread_equal F ++ pthread_exit F ++ pthread_getaffinity_np F ++ pthread_getattr_np F ++ pthread_getconcurrency F ++ pthread_getcpuclockid F ++ pthread_getname_np F ++ pthread_getschedparam F ++ pthread_getspecific F ++ pthread_join F ++ pthread_key_create F ++ pthread_key_delete F ++ pthread_kill F ++ pthread_kill_other_threads_np F ++ pthread_mutex_consistent F ++ pthread_mutex_consistent_np F ++ pthread_mutex_destroy F ++ pthread_mutex_getprioceiling F ++ pthread_mutex_init F ++ pthread_mutex_lock F ++ pthread_mutex_setprioceiling F ++ pthread_mutex_timedlock F ++ pthread_mutex_trylock F ++ pthread_mutex_unlock F ++ pthread_mutexattr_destroy F ++ pthread_mutexattr_getkind_np F ++ pthread_mutexattr_getprioceiling F ++ pthread_mutexattr_getprotocol F ++ pthread_mutexattr_getpshared F ++ pthread_mutexattr_getrobust F ++ pthread_mutexattr_getrobust_np F ++ pthread_mutexattr_gettype F ++ pthread_mutexattr_init F ++ pthread_mutexattr_setkind_np F ++ pthread_mutexattr_setprioceiling F ++ pthread_mutexattr_setprotocol F ++ pthread_mutexattr_setpshared F ++ pthread_mutexattr_setrobust F ++ pthread_mutexattr_setrobust_np F ++ pthread_mutexattr_settype F ++ pthread_once F ++ pthread_rwlock_destroy F ++ pthread_rwlock_init F ++ pthread_rwlock_rdlock F ++ pthread_rwlock_timedrdlock F ++ pthread_rwlock_timedwrlock F ++ pthread_rwlock_tryrdlock F ++ pthread_rwlock_trywrlock F ++ pthread_rwlock_unlock F ++ pthread_rwlock_wrlock F ++ pthread_rwlockattr_destroy F ++ pthread_rwlockattr_getkind_np F ++ pthread_rwlockattr_getpshared F ++ pthread_rwlockattr_init F ++ pthread_rwlockattr_setkind_np F ++ pthread_rwlockattr_setpshared F ++ pthread_self F ++ pthread_setaffinity_np F ++ pthread_setcancelstate F ++ pthread_setcanceltype F ++ pthread_setconcurrency F ++ pthread_setname_np F ++ pthread_setschedparam F ++ pthread_setschedprio F ++ pthread_setspecific F ++ pthread_sigmask F ++ pthread_sigqueue F ++ pthread_spin_destroy F ++ pthread_spin_init F ++ pthread_spin_lock F ++ pthread_spin_trylock F ++ pthread_spin_unlock F ++ pthread_testcancel F ++ pthread_timedjoin_np F ++ pthread_tryjoin_np F ++ pthread_yield F ++ pwrite F ++ pwrite64 F ++ raise F ++ read F ++ recv F ++ recvfrom F ++ recvmsg F ++ sem_close F ++ sem_destroy F ++ sem_getvalue F ++ sem_init F ++ sem_open F ++ sem_post F ++ sem_timedwait F ++ sem_trywait F ++ sem_unlink F ++ sem_wait F ++ send F ++ sendmsg F ++ sendto F ++ sigaction F ++ siglongjmp F ++ sigwait F ++ system F ++ tcdrain F ++ vfork F ++ wait F ++ waitpid F ++ write F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libresolv-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libresolv-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libresolv-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libresolv-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,93 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ __b64_ntop F ++ __b64_pton F ++ __dn_comp F ++ __dn_count_labels F ++ __dn_expand F ++ __dn_skipname F ++ __fp_nquery F ++ __fp_query F ++ __fp_resstat F ++ __hostalias F ++ __loc_aton F ++ __loc_ntoa F ++ __p_cdname F ++ __p_cdnname F ++ __p_class F ++ __p_class_syms D 0xa8 ++ __p_fqname F ++ __p_fqnname F ++ __p_option F ++ __p_query F ++ __p_rcode F ++ __p_secstodate F ++ __p_time F ++ __p_type F ++ __p_type_syms D 0x450 ++ __putlong F ++ __putshort F ++ __res_close F ++ __res_dnok F ++ __res_hnok F ++ __res_hostalias F ++ __res_isourserver F ++ __res_mailok F ++ __res_mkquery F ++ __res_nameinquery F ++ __res_nmkquery F ++ __res_nquery F ++ __res_nquerydomain F ++ __res_nsearch F ++ __res_nsend F ++ __res_ownok F ++ __res_queriesmatch F ++ __res_query F ++ __res_querydomain F ++ __res_search F ++ __res_send F ++ __sym_ntop F ++ __sym_ntos F ++ __sym_ston F ++ _gethtbyaddr F ++ _gethtbyname F ++ _gethtbyname2 F ++ _gethtent F ++ _getlong F ++ _getshort F ++ _res_opcodes D 0x80 ++ _sethtent F ++ inet_net_ntop F ++ inet_net_pton F ++ inet_neta F ++ ns_datetosecs F ++ ns_format_ttl F ++ ns_get16 F ++ ns_get32 F ++ ns_initparse F ++ ns_makecanon F ++ ns_msg_getflag F ++ ns_name_compress F ++ ns_name_ntol F ++ ns_name_ntop F ++ ns_name_pack F ++ ns_name_pton F ++ ns_name_rollback F ++ ns_name_skip F ++ ns_name_uncompress F ++ ns_name_unpack F ++ ns_parse_ttl F ++ ns_parserr F ++ ns_put16 F ++ ns_put32 F ++ ns_samedomain F ++ ns_samename F ++ ns_skiprr F ++ ns_sprintrr F ++ ns_sprintrrf F ++ ns_subdomain F ++ res_gethostbyaddr F ++ res_gethostbyname F ++ res_gethostbyname2 F ++ res_send_setqhook F ++ res_send_setrhook F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librt-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librt-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librt-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librt-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,37 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ __mq_open_2 F ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ lio_listio F ++ lio_listio64 F ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libthread_db-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libthread_db-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libthread_db-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libthread_db-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,42 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ td_init F ++ td_log F ++ td_symbol_list F ++ td_ta_clear_event F ++ td_ta_delete F ++ td_ta_enable_stats F ++ td_ta_event_addr F ++ td_ta_event_getmsg F ++ td_ta_get_nthreads F ++ td_ta_get_ph F ++ td_ta_get_stats F ++ td_ta_map_id2thr F ++ td_ta_map_lwp2thr F ++ td_ta_new F ++ td_ta_reset_stats F ++ td_ta_set_event F ++ td_ta_setconcurrency F ++ td_ta_thr_iter F ++ td_ta_tsd_iter F ++ td_thr_clear_event F ++ td_thr_dbresume F ++ td_thr_dbsuspend F ++ td_thr_event_enable F ++ td_thr_event_getmsg F ++ td_thr_get_info F ++ td_thr_getfpregs F ++ td_thr_getgregs F ++ td_thr_getxregs F ++ td_thr_getxregsize F ++ td_thr_set_event F ++ td_thr_setfpregs F ++ td_thr_setgregs F ++ td_thr_setprio F ++ td_thr_setsigpending F ++ td_thr_setxregs F ++ td_thr_sigsetmask F ++ td_thr_tls_get_addr F ++ td_thr_tlsbase F ++ td_thr_tsd F ++ td_thr_validate F +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libutil-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libutil-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libutil-le.abilist 1970-01-01 00:00:00.000000000 +0000 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libutil-le.abilist 2014-06-02 15:22:40.000000000 +0000 +@@ -0,0 +1,8 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ forkpty F ++ login F ++ login_tty F ++ logout F ++ logwtmp F ++ openpty F diff --git a/SOURCES/glibc-ppc64le-03.patch b/SOURCES/glibc-ppc64le-03.patch new file mode 100644 index 0000000..40b6e71 --- /dev/null +++ b/SOURCES/glibc-ppc64le-03.patch @@ -0,0 +1,1617 @@ +# commit 9e54314bb06aace405553552f7e7b7d8c172968c +# Author: Joseph Myers <joseph@codesourcery.com> +# Date: Thu Jun 6 19:02:09 2013 +0000 +# +# Update miscellaneous scripts from upstream. +# +diff -urN glibc-2.17-c758a686/scripts/config.guess glibc-2.17-c758a686/scripts/config.guess +--- glibc-2.17-c758a686/scripts/config.guess 2014-05-26 15:59:45.000000000 -0500 ++++ glibc-2.17-c758a686/scripts/config.guess 2014-05-26 16:01:00.000000000 -0500 +@@ -1,14 +1,12 @@ + #! /bin/sh + # Attempt to guess a canonical system name. +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +-# 2011, 2012 Free Software Foundation, Inc. ++# Copyright 1992-2013 Free Software Foundation, Inc. + +-timestamp='2012-09-25' ++timestamp='2013-11-29' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but +@@ -22,19 +20,17 @@ + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. +- +- +-# Originally written by Per Bothner. Please send patches (context +-# diff format) to <config-patches@gnu.org> and include a ChangeLog +-# entry. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). + # +-# This script attempts to guess a canonical system name similar to +-# config.sub. If it succeeds, it prints the system name on stdout, and +-# exits with 0. Otherwise, it exits with 1. ++# Originally written by Per Bothner. + # + # You can get the latest version of this script from: + # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD ++# ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. ++ + + me=`echo "$0" | sed -e 's,.*/,,'` + +@@ -54,9 +50,7 @@ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +-Free Software Foundation, Inc. ++Copyright 1992-2013 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." +@@ -138,6 +132,27 @@ + UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + ++case "${UNAME_SYSTEM}" in ++Linux|GNU|GNU/*) ++ # If the system lacks a compiler, then just pick glibc. ++ # We could probably try harder. ++ LIBC=gnu ++ ++ eval $set_cc_for_build ++ cat <<-EOF > $dummy.c ++ #include <features.h> ++ #if defined(__UCLIBC__) ++ LIBC=uclibc ++ #elif defined(__dietlibc__) ++ LIBC=dietlibc ++ #else ++ LIBC=gnu ++ #endif ++ EOF ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ++ ;; ++esac ++ + # Note: order is significant - the case branches are not exclusive. + + case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +@@ -859,21 +874,21 @@ + exit ;; + *:GNU:*:*) + # the GNU system +- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` ++ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland +- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu ++ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in +@@ -886,59 +901,54 @@ + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 +- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi +- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ++ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ arc:Linux:*:* | arceb:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then +- echo ${UNAME_MACHINE}-unknown-linux-gnueabi ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else +- echo ${UNAME_MACHINE}-unknown-linux-gnueabihf ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) +- echo ${UNAME_MACHINE}-axis-linux-gnu ++ echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) +- echo ${UNAME_MACHINE}-axis-linux-gnu ++ echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) +- LIBC=gnu +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c +- #ifdef __dietlibc__ +- LIBC=dietlibc +- #endif +-EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` +- echo "${UNAME_MACHINE}-pc-linux-${LIBC}" ++ echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build +@@ -957,54 +967,63 @@ + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` +- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; ++ or1k:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + or32:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) +- echo sparc-unknown-linux-gnu ++ echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) +- echo hppa64-unknown-linux-gnu ++ echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in +- PA7*) echo hppa1.1-unknown-linux-gnu ;; +- PA8*) echo hppa2.0-unknown-linux-gnu ;; +- *) echo hppa-unknown-linux-gnu ;; ++ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; ++ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; ++ *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) +- echo powerpc64-unknown-linux-gnu ++ echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) +- echo powerpc-unknown-linux-gnu ++ echo powerpc-unknown-linux-${LIBC} ++ exit ;; ++ ppc64le:Linux:*:*) ++ echo powerpc64le-unknown-linux-${LIBC} ++ exit ;; ++ ppcle:Linux:*:*) ++ echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) +- echo ${UNAME_MACHINE}-ibm-linux ++ echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) +- echo ${UNAME_MACHINE}-dec-linux-gnu ++ echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. +@@ -1237,19 +1256,31 @@ + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown +- case $UNAME_PROCESSOR in +- i386) +- eval $set_cc_for_build +- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then +- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ +- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ +- grep IS_64BIT_ARCH >/dev/null +- then +- UNAME_PROCESSOR="x86_64" +- fi +- fi ;; +- unknown) UNAME_PROCESSOR=powerpc ;; +- esac ++ eval $set_cc_for_build ++ if test "$UNAME_PROCESSOR" = unknown ; then ++ UNAME_PROCESSOR=powerpc ++ fi ++ if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then ++ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then ++ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ ++ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_64BIT_ARCH >/dev/null ++ then ++ case $UNAME_PROCESSOR in ++ i386) UNAME_PROCESSOR=x86_64 ;; ++ powerpc) UNAME_PROCESSOR=powerpc64 ;; ++ esac ++ fi ++ fi ++ elif test "$UNAME_PROCESSOR" = i386 ; then ++ # Avoid executing cc on OS X 10.9, as it ships with a stub ++ # that puts up a graphical alert prompting to install ++ # developer tools. Any system running Mac OS X 10.7 or ++ # later (Darwin 11 and later) is required to have a 64-bit ++ # processor. This is not true of the ARM version of Darwin ++ # that Apple uses in portable devices. ++ UNAME_PROCESSOR=x86_64 ++ fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) +diff -urN glibc-2.17-c758a686/scripts/config.sub glibc-2.17-c758a686/scripts/config.sub +--- glibc-2.17-c758a686/scripts/config.sub 2014-05-26 15:59:45.000000000 -0500 ++++ glibc-2.17-c758a686/scripts/config.sub 2014-05-26 16:00:52.000000000 -0500 +@@ -1,24 +1,18 @@ + #! /bin/sh + # Configuration validation subroutine script. +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +-# 2011, 2012 Free Software Foundation, Inc. +- +-timestamp='2012-08-18' +- +-# This file is (in principle) common to ALL GNU software. +-# The presence of a machine in this file suggests that SOME GNU software +-# can handle that machine. It does not imply ALL GNU software can. +-# +-# This file is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# Copyright 1992-2013 Free Software Foundation, Inc. ++ ++timestamp='2013-10-01' ++ ++# This file is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, see <http://www.gnu.org/licenses/>. +@@ -26,11 +20,12 @@ + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). + + +-# Please send patches to <config-patches@gnu.org>. Submit a context +-# diff and a properly formatted GNU ChangeLog entry. ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. +@@ -73,9 +68,7 @@ + version="\ + GNU config.sub ($timestamp) + +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +-Free Software Foundation, Inc. ++Copyright 1992-2013 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." +@@ -156,7 +149,7 @@ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple | -axis | -knuth | -cray | -microblaze) ++ -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; +@@ -259,10 +252,12 @@ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ +- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ +- | be32 | be64 \ ++ | arc | arceb \ ++ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ ++ | avr | avr32 \ ++ | be32 | be64 \ + | bfin \ +- | c4x | clipper \ ++ | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ +@@ -270,10 +265,11 @@ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ ++ | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ +- | maxq | mb | microblaze | mcore | mep | metag \ ++ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ +@@ -291,16 +287,17 @@ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ ++ | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ +- | nios | nios2 \ ++ | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 \ +- | or32 \ ++ | or1k | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ +@@ -328,7 +325,7 @@ + c6x) + basic_machine=tic6x-unknown + ;; +- m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) ++ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; +@@ -370,13 +367,13 @@ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ +- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ ++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ +- | clipper-* | craynv-* | cydra-* \ ++ | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ +@@ -385,11 +382,13 @@ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ ++ | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ +- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ ++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ ++ | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ +@@ -407,12 +406,13 @@ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ ++ | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ +- | nios-* | nios2-* \ ++ | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ +@@ -788,7 +788,7 @@ + basic_machine=ns32k-utek + os=-sysv + ;; +- microblaze) ++ microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) +@@ -796,7 +796,7 @@ + os=-mingw64 + ;; + mingw32) +- basic_machine=i386-pc ++ basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) +@@ -832,7 +832,7 @@ + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) +- basic_machine=i386-pc ++ basic_machine=i686-pc + os=-msys + ;; + mvs) +@@ -1023,7 +1023,11 @@ + basic_machine=i586-unknown + os=-pw32 + ;; +- rdos) ++ rdos | rdos64) ++ basic_machine=x86_64-pc ++ os=-rdos ++ ;; ++ rdos32) + basic_machine=i386-pc + os=-rdos + ;; +@@ -1350,7 +1354,7 @@ + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ +- | -sym* | -kopensolaris* \ ++ | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ +@@ -1496,9 +1500,6 @@ + -aros*) + os=-aros + ;; +- -kaos*) +- os=-kaos +- ;; + -zvmoe) + os=-zvmoe + ;; +@@ -1547,6 +1548,9 @@ + c4x-* | tic4x-*) + os=-coff + ;; ++ c8051-*) ++ os=-elf ++ ;; + hexagon-*) + os=-elf + ;; +@@ -1590,6 +1594,9 @@ + mips*-*) + os=-elf + ;; ++ or1k-*) ++ os=-elf ++ ;; + or32-*) + os=-coff + ;; +diff -urN glibc-2.17-c758a686/scripts/install-sh glibc-2.17-c758a686/scripts/install-sh +--- glibc-2.17-c758a686/scripts/install-sh 2014-05-26 15:59:45.000000000 -0500 ++++ glibc-2.17-c758a686/scripts/install-sh 2014-05-26 16:00:34.000000000 -0500 +@@ -1,250 +1,527 @@ +-#! /bin/sh +-# ++#!/bin/sh + # install - install a program, script, or datafile +-# This comes from X11R5 (mit/util/scripts/install.sh). ++ ++scriptversion=2011-11-20.07; # UTC ++ ++# This originates from X11R5 (mit/util/scripts/install.sh), which was ++# later released in X11R6 (xc/config/util/install.sh) with the ++# following copyright and license. ++# ++# Copyright (C) 1994 X Consortium ++# ++# Permission is hereby granted, free of charge, to any person obtaining a copy ++# of this software and associated documentation files (the "Software"), to ++# deal in the Software without restriction, including without limitation the ++# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++# sell copies of the Software, and to permit persons to whom the Software is ++# furnished to do so, subject to the following conditions: ++# ++# The above copyright notice and this permission notice shall be included in ++# all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- ++# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++# ++# Except as contained in this notice, the name of the X Consortium shall not ++# be used in advertising or otherwise to promote the sale, use or other deal- ++# ings in this Software without prior written authorization from the X Consor- ++# tium. + # +-# Copyright 1991 by the Massachusetts Institute of Technology + # +-# Permission to use, copy, modify, distribute, and sell this software and its +-# documentation for any purpose is hereby granted without fee, provided that +-# the above copyright notice appear in all copies and that both that +-# copyright notice and this permission notice appear in supporting +-# documentation, and that the name of M.I.T. not be used in advertising or +-# publicity pertaining to distribution of the software without specific, +-# written prior permission. M.I.T. makes no representations about the +-# suitability of this software for any purpose. It is provided "as is" +-# without express or implied warranty. ++# FSF changes to this file are in the public domain. + # + # Calling this script install-sh is preferred over install.sh, to prevent +-# `make' implicit rules from creating a file called install from it ++# 'make' implicit rules from creating a file called install from it + # when there is no Makefile. + # + # This script is compatible with the BSD install script, but was written +-# from scratch. It can only install one file at a time, a restriction +-# shared with many OS's install programs. ++# from scratch. + ++nl=' ++' ++IFS=" "" $nl" + + # set DOITPROG to echo to test this script + + # Don't use :- since 4.3BSD and earlier shells don't like it. +-doit="${DOITPROG-}" +- +- +-# put in absolute paths if you don't have them in your path; or use env. vars. +- +-mvprog="${MVPROG-mv}" +-cpprog="${CPPROG-cp}" +-chmodprog="${CHMODPROG-chmod}" +-chownprog="${CHOWNPROG-chown}" +-chgrpprog="${CHGRPPROG-chgrp}" +-stripprog="${STRIPPROG-strip}" +-rmprog="${RMPROG-rm}" +-mkdirprog="${MKDIRPROG-mkdir}" +- +-transformbasename="" +-transform_arg="" +-instcmd="$mvprog" +-chmodcmd="$chmodprog 0755" +-chowncmd="" +-chgrpcmd="" +-stripcmd="" +-rmcmd="$rmprog -f" +-mvcmd="$mvprog" +-src="" +-dst="" +-dir_arg="" +- +-while [ x"$1" != x ]; do +- case $1 in +- -c) instcmd="$cpprog" +- shift +- continue;; +- +- -d) dir_arg=true +- shift +- continue;; +- +- -m) chmodcmd="$chmodprog $2" +- shift +- shift +- continue;; +- +- -o) chowncmd="$chownprog $2" +- shift +- shift +- continue;; +- +- -g) chgrpcmd="$chgrpprog $2" +- shift +- shift +- continue;; +- +- -s) stripcmd="$stripprog" +- shift +- continue;; +- +- -t=*) transformarg=`echo $1 | sed 's/-t=//'` +- shift +- continue;; +- +- -b=*) transformbasename=`echo $1 | sed 's/-b=//'` +- shift +- continue;; +- +- *) if [ x"$src" = x ] +- then +- src=$1 +- else +- # this colon is to work around a 386BSD /bin/sh bug +- : +- dst=$1 +- fi +- shift +- continue;; +- esac +-done +- +-if [ x"$src" = x ] +-then +- echo "install: no input file specified" +- exit 1 ++doit=${DOITPROG-} ++if test -z "$doit"; then ++ doit_exec=exec + else +- true ++ doit_exec=$doit + fi + +-if [ x"$dir_arg" != x ]; then +- dst=$src +- src="" +- +- if [ -d $dst ]; then +- instcmd=: +- else +- instcmd=mkdir +- fi +-else ++# Put in absolute file names if you don't have them in your path; ++# or use environment vars. + +-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +-# might cause directories to be created, which would be especially bad +-# if $src (and thus $dsttmp) contains '*'. +- +- if [ -f $src -o -d $src ] +- then +- true +- else +- echo "install: $src does not exist" +- exit 1 +- fi +- +- if [ x"$dst" = x ] +- then +- echo "install: no destination specified" +- exit 1 +- else +- true +- fi +- +-# If destination is a directory, append the input filename; if your system +-# does not like double slashes in filenames, you may need to add some logic +- +- if [ -d $dst ] +- then +- dst="$dst"/`basename $src` +- else +- true +- fi +-fi +- +-## this sed command emulates the dirname command +-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` ++chgrpprog=${CHGRPPROG-chgrp} ++chmodprog=${CHMODPROG-chmod} ++chownprog=${CHOWNPROG-chown} ++cmpprog=${CMPPROG-cmp} ++cpprog=${CPPROG-cp} ++mkdirprog=${MKDIRPROG-mkdir} ++mvprog=${MVPROG-mv} ++rmprog=${RMPROG-rm} ++stripprog=${STRIPPROG-strip} ++ ++posix_glob='?' ++initialize_posix_glob=' ++ test "$posix_glob" != "?" || { ++ if (set -f) 2>/dev/null; then ++ posix_glob= ++ else ++ posix_glob=: ++ fi ++ } ++' + +-# Make sure that the destination directory exists. +-# this part is taken from Noah Friedman's mkinstalldirs script ++posix_mkdir= + +-# Skip lots of stat calls in the usual case. +-if [ ! -d "$dstdir" ]; then +-defaultIFS=' +-' +-IFS="${IFS-${defaultIFS}}" ++# Desired mode of installed file. ++mode=0755 + +-oIFS="${IFS}" +-# Some sh's can't handle IFS=/ for some reason. +-IFS='%' +-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +-IFS="${oIFS}" +- +-pathcomp='' +- +-while [ $# -ne 0 ] ; do +- pathcomp="${pathcomp}${1}" +- shift +- +- if [ ! -d "${pathcomp}" ] ; +- then +- $mkdirprog "${pathcomp}" +- else +- true +- fi ++chgrpcmd= ++chmodcmd=$chmodprog ++chowncmd= ++mvcmd=$mvprog ++rmcmd="$rmprog -f" ++stripcmd= + +- pathcomp="${pathcomp}/" ++src= ++dst= ++dir_arg= ++dst_arg= ++ ++copy_on_change=false ++no_target_directory= ++ ++usage="\ ++Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE ++ or: $0 [OPTION]... SRCFILES... DIRECTORY ++ or: $0 [OPTION]... -t DIRECTORY SRCFILES... ++ or: $0 [OPTION]... -d DIRECTORIES... ++ ++In the 1st form, copy SRCFILE to DSTFILE. ++In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. ++In the 4th, create DIRECTORIES. ++ ++Options: ++ --help display this help and exit. ++ --version display version info and exit. ++ ++ -c (ignored) ++ -C install only if different (preserve the last data modification time) ++ -d create directories instead of installing files. ++ -g GROUP $chgrpprog installed files to GROUP. ++ -m MODE $chmodprog installed files to MODE. ++ -o USER $chownprog installed files to USER. ++ -s $stripprog installed files. ++ -t DIRECTORY install into DIRECTORY. ++ -T report an error if DSTFILE is a directory. ++ ++Environment variables override the default commands: ++ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG ++ RMPROG STRIPPROG ++" ++ ++while test $# -ne 0; do ++ case $1 in ++ -c) ;; ++ ++ -C) copy_on_change=true;; ++ ++ -d) dir_arg=true;; ++ ++ -g) chgrpcmd="$chgrpprog $2" ++ shift;; ++ ++ --help) echo "$usage"; exit $?;; ++ ++ -m) mode=$2 ++ case $mode in ++ *' '* | *' '* | *' ++'* | *'*'* | *'?'* | *'['*) ++ echo "$0: invalid mode: $mode" >&2 ++ exit 1;; ++ esac ++ shift;; ++ ++ -o) chowncmd="$chownprog $2" ++ shift;; ++ ++ -s) stripcmd=$stripprog;; ++ ++ -t) dst_arg=$2 ++ # Protect names problematic for 'test' and other utilities. ++ case $dst_arg in ++ -* | [=\(\)!]) dst_arg=./$dst_arg;; ++ esac ++ shift;; ++ ++ -T) no_target_directory=true;; ++ ++ --version) echo "$0 $scriptversion"; exit $?;; ++ ++ --) shift ++ break;; ++ ++ -*) echo "$0: invalid option: $1" >&2 ++ exit 1;; ++ ++ *) break;; ++ esac ++ shift + done ++ ++if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then ++ # When -d is used, all remaining arguments are directories to create. ++ # When -t is used, the destination is already specified. ++ # Otherwise, the last argument is the destination. Remove it from $@. ++ for arg ++ do ++ if test -n "$dst_arg"; then ++ # $@ is not empty: it contains at least $arg. ++ set fnord "$@" "$dst_arg" ++ shift # fnord ++ fi ++ shift # arg ++ dst_arg=$arg ++ # Protect names problematic for 'test' and other utilities. ++ case $dst_arg in ++ -* | [=\(\)!]) dst_arg=./$dst_arg;; ++ esac ++ done + fi + +-if [ x"$dir_arg" != x ] +-then +- $doit $instcmd $dst && +- +- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && +- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && +- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && +- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +-else ++if test $# -eq 0; then ++ if test -z "$dir_arg"; then ++ echo "$0: no input file specified." >&2 ++ exit 1 ++ fi ++ # It's OK to call 'install-sh -d' without argument. ++ # This can happen when creating conditional directories. ++ exit 0 ++fi + +-# If we're going to rename the final executable, determine the name now. ++if test -z "$dir_arg"; then ++ do_exit='(exit $ret); exit $ret' ++ trap "ret=129; $do_exit" 1 ++ trap "ret=130; $do_exit" 2 ++ trap "ret=141; $do_exit" 13 ++ trap "ret=143; $do_exit" 15 ++ ++ # Set umask so as not to create temps with too-generous modes. ++ # However, 'strip' requires both read and write access to temps. ++ case $mode in ++ # Optimize common cases. ++ *644) cp_umask=133;; ++ *755) cp_umask=22;; ++ ++ *[0-7]) ++ if test -z "$stripcmd"; then ++ u_plus_rw= ++ else ++ u_plus_rw='% 200' ++ fi ++ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; ++ *) ++ if test -z "$stripcmd"; then ++ u_plus_rw= ++ else ++ u_plus_rw=,u+rw ++ fi ++ cp_umask=$mode$u_plus_rw;; ++ esac ++fi + +- if [ x"$transformarg" = x ] +- then +- dstfile=`basename $dst` ++for src ++do ++ # Protect names problematic for 'test' and other utilities. ++ case $src in ++ -* | [=\(\)!]) src=./$src;; ++ esac ++ ++ if test -n "$dir_arg"; then ++ dst=$src ++ dstdir=$dst ++ test -d "$dstdir" ++ dstdir_status=$? ++ else ++ ++ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command ++ # might cause directories to be created, which would be especially bad ++ # if $src (and thus $dsttmp) contains '*'. ++ if test ! -f "$src" && test ! -d "$src"; then ++ echo "$0: $src does not exist." >&2 ++ exit 1 ++ fi ++ ++ if test -z "$dst_arg"; then ++ echo "$0: no destination specified." >&2 ++ exit 1 ++ fi ++ dst=$dst_arg ++ ++ # If destination is a directory, append the input filename; won't work ++ # if double slashes aren't ignored. ++ if test -d "$dst"; then ++ if test -n "$no_target_directory"; then ++ echo "$0: $dst_arg: Is a directory" >&2 ++ exit 1 ++ fi ++ dstdir=$dst ++ dst=$dstdir/`basename "$src"` ++ dstdir_status=0 ++ else ++ # Prefer dirname, but fall back on a substitute if dirname fails. ++ dstdir=` ++ (dirname "$dst") 2>/dev/null || ++ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$dst" : 'X\(//\)[^/]' \| \ ++ X"$dst" : 'X\(//\)$' \| \ ++ X"$dst" : 'X\(/\)' \| . 2>/dev/null || ++ echo X"$dst" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q' ++ ` ++ ++ test -d "$dstdir" ++ dstdir_status=$? ++ fi ++ fi ++ ++ obsolete_mkdir_used=false ++ ++ if test $dstdir_status != 0; then ++ case $posix_mkdir in ++ '') ++ # Create intermediate dirs using mode 755 as modified by the umask. ++ # This is like FreeBSD 'install' as of 1997-10-28. ++ umask=`umask` ++ case $stripcmd.$umask in ++ # Optimize common cases. ++ *[2367][2367]) mkdir_umask=$umask;; ++ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; ++ ++ *[0-7]) ++ mkdir_umask=`expr $umask + 22 \ ++ - $umask % 100 % 40 + $umask % 20 \ ++ - $umask % 10 % 4 + $umask % 2 ++ `;; ++ *) mkdir_umask=$umask,go-w;; ++ esac ++ ++ # With -d, create the new directory with the user-specified mode. ++ # Otherwise, rely on $mkdir_umask. ++ if test -n "$dir_arg"; then ++ mkdir_mode=-m$mode + else +- dstfile=`basename $dst $transformbasename | +- sed $transformarg`$transformbasename ++ mkdir_mode= + fi + +-# don't allow the sed command to completely eliminate the filename ++ posix_mkdir=false ++ case $umask in ++ *[123567][0-7][0-7]) ++ # POSIX mkdir -p sets u+wx bits regardless of umask, which ++ # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ++ ;; ++ *) ++ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ ++ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 ++ ++ if (umask $mkdir_umask && ++ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 ++ then ++ if test -z "$dir_arg" || { ++ # Check for POSIX incompatibilities with -m. ++ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or ++ # other-writable bit of parent directory when it shouldn't. ++ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ++ ls_ld_tmpdir=`ls -ld "$tmpdir"` ++ case $ls_ld_tmpdir in ++ d????-?r-*) different_mode=700;; ++ d????-?--*) different_mode=755;; ++ *) false;; ++ esac && ++ $mkdirprog -m$different_mode -p -- "$tmpdir" && { ++ ls_ld_tmpdir_1=`ls -ld "$tmpdir"` ++ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" ++ } ++ } ++ then posix_mkdir=: ++ fi ++ rmdir "$tmpdir/d" "$tmpdir" ++ else ++ # Remove any dirs left behind by ancient mkdir implementations. ++ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null ++ fi ++ trap '' 0;; ++ esac;; ++ esac + +- if [ x"$dstfile" = x ] +- then +- dstfile=`basename $dst` ++ if ++ $posix_mkdir && ( ++ umask $mkdir_umask && ++ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ++ ) ++ then : ++ else ++ ++ # The umask is ridiculous, or mkdir does not conform to POSIX, ++ # or it failed possibly due to a race condition. Create the ++ # directory the slow way, step by step, checking for races as we go. ++ ++ case $dstdir in ++ /*) prefix='/';; ++ [-=\(\)!]*) prefix='./';; ++ *) prefix='';; ++ esac ++ ++ eval "$initialize_posix_glob" ++ ++ oIFS=$IFS ++ IFS=/ ++ $posix_glob set -f ++ set fnord $dstdir ++ shift ++ $posix_glob set +f ++ IFS=$oIFS ++ ++ prefixes= ++ ++ for d ++ do ++ test X"$d" = X && continue ++ ++ prefix=$prefix$d ++ if test -d "$prefix"; then ++ prefixes= + else +- true ++ if $posix_mkdir; then ++ (umask=$mkdir_umask && ++ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break ++ # Don't fail if two instances are running concurrently. ++ test -d "$prefix" || exit 1 ++ else ++ case $prefix in ++ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; ++ *) qprefix=$prefix;; ++ esac ++ prefixes="$prefixes '$qprefix'" ++ fi + fi ++ prefix=$prefix/ ++ done + +-# Make a temp file name in the proper directory. +- +- dsttmp=$dstdir/#inst.$$# +- +-# Move or copy the file name to the temp name +- +- $doit $instcmd $src $dsttmp && +- +- trap "rm -f ${dsttmp}" 0 && +- +-# and set any options; do chmod last to preserve setuid bits +- +-# If any of these fail, we abort the whole thing. If we want to +-# ignore errors from any of these, just make sure not to ignore +-# errors from the above "$doit $instcmd $src $dsttmp" command. +- +- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && +- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && +- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && +- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && +- +-# Now rename the file to the real destination. +- +- $doit $rmcmd -f $dstdir/$dstfile && +- $doit $mvcmd $dsttmp $dstdir/$dstfile +- +-fi && ++ if test -n "$prefixes"; then ++ # Don't fail if two instances are running concurrently. ++ (umask $mkdir_umask && ++ eval "\$doit_exec \$mkdirprog $prefixes") || ++ test -d "$dstdir" || exit 1 ++ obsolete_mkdir_used=true ++ fi ++ fi ++ fi ++ ++ if test -n "$dir_arg"; then ++ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && ++ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && ++ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || ++ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 ++ else ++ ++ # Make a couple of temp file names in the proper directory. ++ dsttmp=$dstdir/_inst.$$_ ++ rmtmp=$dstdir/_rm.$$_ ++ ++ # Trap to clean up those temp files at exit. ++ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 ++ ++ # Copy the file name to the temp name. ++ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && ++ ++ # and set any options; do chmod last to preserve setuid bits. ++ # ++ # If any of these fail, we abort the whole thing. If we want to ++ # ignore errors from any of these, just make sure not to ignore ++ # errors from the above "$doit $cpprog $src $dsttmp" command. ++ # ++ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && ++ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && ++ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && ++ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && ++ ++ # If -C, don't bother to copy if it wouldn't change the file. ++ if $copy_on_change && ++ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && ++ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && ++ ++ eval "$initialize_posix_glob" && ++ $posix_glob set -f && ++ set X $old && old=:$2:$4:$5:$6 && ++ set X $new && new=:$2:$4:$5:$6 && ++ $posix_glob set +f && ++ ++ test "$old" = "$new" && ++ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 ++ then ++ rm -f "$dsttmp" ++ else ++ # Rename the file to the real destination. ++ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || ++ ++ # The rename failed, perhaps because mv can't rename something else ++ # to itself, or perhaps because mv is so ancient that it does not ++ # support -f. ++ { ++ # Now remove or move aside any old file at destination location. ++ # We try this two ways since rm can't unlink itself on some ++ # systems and the destination file might be busy for other ++ # reasons. In this case, the final cleanup might fail but the new ++ # file should still install successfully. ++ { ++ test ! -f "$dst" || ++ $doit $rmcmd -f "$dst" 2>/dev/null || ++ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && ++ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } ++ } || ++ { echo "$0: cannot unlink or rename $dst" >&2 ++ (exit 1); exit 1 ++ } ++ } && ++ ++ # Now rename the file to the real destination. ++ $doit $mvcmd "$dsttmp" "$dst" ++ } ++ fi || exit 1 + ++ trap '' 0 ++ fi ++done + +-exit 0 ++# Local variables: ++# eval: (add-hook 'write-file-hooks 'time-stamp) ++# time-stamp-start: "scriptversion=" ++# time-stamp-format: "%:y-%02m-%02d.%02H" ++# time-stamp-time-zone: "UTC" ++# time-stamp-end: "; # UTC" ++# End: +diff -urN glibc-2.17-c758a686/scripts/mkinstalldirs glibc-2.17-c758a686/scripts/mkinstalldirs +--- glibc-2.17-c758a686/scripts/mkinstalldirs 2014-05-26 15:59:45.000000000 -0500 ++++ glibc-2.17-c758a686/scripts/mkinstalldirs 2014-05-26 16:00:34.000000000 -0500 +@@ -1,38 +1,162 @@ + #! /bin/sh + # mkinstalldirs --- make directory hierarchy +-# Author: Noah Friedman <friedman@prep.ai.mit.edu> +-# Created: 1993-05-16 +-# Public domain + ++scriptversion=2009-04-28.21; # UTC ++ ++# Original author: Noah Friedman <friedman@prep.ai.mit.edu> ++# Created: 1993-05-16 ++# Public domain. ++# ++# This file is maintained in Automake, please report ++# bugs to <bug-automake@gnu.org> or send patches to ++# <automake-patches@gnu.org>. ++ ++nl=' ++' ++IFS=" "" $nl" + errstatus=0 ++dirmode= ++ ++usage="\ ++Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... ++ ++Create each directory DIR (with mode MODE, if specified), including all ++leading file name components. ++ ++Report bugs to <bug-automake@gnu.org>." ++ ++# process command line arguments ++while test $# -gt 0 ; do ++ case $1 in ++ -h | --help | --h*) # -h for help ++ echo "$usage" ++ exit $? ++ ;; ++ -m) # -m PERM arg ++ shift ++ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } ++ dirmode=$1 ++ shift ++ ;; ++ --version) ++ echo "$0 $scriptversion" ++ exit $? ++ ;; ++ --) # stop option processing ++ shift ++ break ++ ;; ++ -*) # unknown option ++ echo "$usage" 1>&2 ++ exit 1 ++ ;; ++ *) # first non-opt arg ++ break ++ ;; ++ esac ++done + + for file + do +- set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` +- shift ++ if test -d "$file"; then ++ shift ++ else ++ break ++ fi ++done ++ ++case $# in ++ 0) exit 0 ;; ++esac ++ ++# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and ++# mkdir -p a/c at the same time, both will detect that a is missing, ++# one will create a, then the other will try to create a and die with ++# a "File exists" error. This is a problem when calling mkinstalldirs ++# from a parallel make. We use --version in the probe to restrict ++# ourselves to GNU mkdir, which is thread-safe. ++case $dirmode in ++ '') ++ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then ++ echo "mkdir -p -- $*" ++ exec mkdir -p -- "$@" ++ else ++ # On NextStep and OpenStep, the 'mkdir' command does not ++ # recognize any option. It will interpret all options as ++ # directories to create, and then abort because '.' already ++ # exists. ++ test -d ./-p && rmdir ./-p ++ test -d ./--version && rmdir ./--version ++ fi ++ ;; ++ *) ++ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && ++ test ! -d ./--version; then ++ echo "mkdir -m $dirmode -p -- $*" ++ exec mkdir -m "$dirmode" -p -- "$@" ++ else ++ # Clean up after NextStep and OpenStep mkdir. ++ for d in ./-m ./-p ./--version "./$dirmode"; ++ do ++ test -d $d && rmdir $d ++ done ++ fi ++ ;; ++esac + +- pathcomp= +- for d +- do +- pathcomp="$pathcomp$d" +- case "$pathcomp" in +- -* ) pathcomp=./$pathcomp ;; +- esac +- +- if test ! -d "$pathcomp"; then +- echo "mkdir $pathcomp" 1>&2 +- +- mkdir "$pathcomp" || lasterr=$? +- +- if test ! -d "$pathcomp"; then +- errstatus=$lasterr +- fi +- fi ++for file ++do ++ case $file in ++ /*) pathcomp=/ ;; ++ *) pathcomp= ;; ++ esac ++ oIFS=$IFS ++ IFS=/ ++ set fnord $file ++ shift ++ IFS=$oIFS ++ ++ for d ++ do ++ test "x$d" = x && continue ++ ++ pathcomp=$pathcomp$d ++ case $pathcomp in ++ -*) pathcomp=./$pathcomp ;; ++ esac ++ ++ if test ! -d "$pathcomp"; then ++ echo "mkdir $pathcomp" ++ ++ mkdir "$pathcomp" || lasterr=$? ++ ++ if test ! -d "$pathcomp"; then ++ errstatus=$lasterr ++ else ++ if test ! -z "$dirmode"; then ++ echo "chmod $dirmode $pathcomp" ++ lasterr= ++ chmod "$dirmode" "$pathcomp" || lasterr=$? ++ ++ if test ! -z "$lasterr"; then ++ errstatus=$lasterr ++ fi ++ fi ++ fi ++ fi + +- pathcomp="$pathcomp/" +- done ++ pathcomp=$pathcomp/ ++ done + done + + exit $errstatus + +-# mkinstalldirs ends here ++# Local Variables: ++# mode: shell-script ++# sh-indentation: 2 ++# eval: (add-hook 'write-file-hooks 'time-stamp) ++# time-stamp-start: "scriptversion=" ++# time-stamp-format: "%:y-%02m-%02d.%02H" ++# time-stamp-time-zone: "UTC" ++# time-stamp-end: "; # UTC" ++# End: +diff -urN glibc-2.17-c758a686/scripts/move-if-change glibc-2.17-c758a686/scripts/move-if-change +--- glibc-2.17-c758a686/scripts/move-if-change 2014-05-26 15:59:45.000000000 -0500 ++++ glibc-2.17-c758a686/scripts/move-if-change 2014-05-26 16:00:34.000000000 -0500 +@@ -1,17 +1,83 @@ + #!/bin/sh + # Like mv $1 $2, but if the files are the same, just delete $1. +-# Status is 0 if $2 is changed, 1 otherwise. +-if +-test -r $2 +-then +-if +-cmp -s $1 $2 +-then +-echo $2 is unchanged +-rm -f $1 ++# Status is zero if successful, nonzero otherwise. ++ ++VERSION='2012-01-06 07:23'; # UTC ++# The definition above must lie within the first 8 lines in order ++# for the Emacs time-stamp write hook (at end) to update it. ++# If you change this file with Emacs, please let the write hook ++# do its job. Otherwise, update this string manually. ++ ++# Copyright (C) 2002-2013 Free Software Foundation, Inc. ++ ++# This program is free software: you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation, either version 3 of the License, or ++# (at your option) any later version. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++ ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see <http://www.gnu.org/licenses/>. ++ ++usage="usage: $0 SOURCE DEST" ++ ++help="$usage ++ or: $0 OPTION ++If SOURCE is different than DEST, then move it to DEST; else remove SOURCE. ++ ++ --help display this help and exit ++ --version output version information and exit ++ ++The variable CMPPROG can be used to specify an alternative to 'cmp'. ++ ++Report bugs to <bug-gnulib@gnu.org>." ++ ++version=`expr "$VERSION" : '\([^ ]*\)'` ++version="move-if-change (gnulib) $version ++Copyright (C) 2011 Free Software Foundation, Inc. ++License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> ++This is free software: you are free to change and redistribute it. ++There is NO WARRANTY, to the extent permitted by law." ++ ++cmpprog=${CMPPROG-cmp} ++ ++for arg ++do ++ case $arg in ++ --help | --hel | --he | --h) ++ exec echo "$help" ;; ++ --version | --versio | --versi | --vers | --ver | --ve | --v) ++ exec echo "$version" ;; ++ --) ++ shift ++ break ;; ++ -*) ++ echo "$0: invalid option: $arg" >&2 ++ exit 1 ;; ++ *) ++ break ;; ++ esac ++done ++ ++test $# -eq 2 || { echo "$0: $usage" >&2; exit 1; } ++ ++if test -r "$2" && $cmpprog -- "$1" "$2" >/dev/null; then ++ rm -f -- "$1" + else +-mv -f $1 $2 +-fi +-else +-mv -f $1 $2 ++ if mv -f -- "$1" "$2"; then :; else ++ # Ignore failure due to a concurrent move-if-change. ++ test -r "$2" && $cmpprog -- "$1" "$2" >/dev/null && rm -f -- "$1" ++ fi + fi ++ ++## Local Variables: ++## eval: (add-hook 'write-file-hooks 'time-stamp) ++## time-stamp-start: "VERSION='" ++## time-stamp-format: "%:y-%02m-%02d %02H:%02M" ++## time-stamp-time-zone: "UTC" ++## time-stamp-end: "'; # UTC" ++## End: diff --git a/SOURCES/glibc-ppc64le-04.patch b/SOURCES/glibc-ppc64le-04.patch new file mode 100644 index 0000000..8f6840b --- /dev/null +++ b/SOURCES/glibc-ppc64le-04.patch @@ -0,0 +1,676 @@ +# commit 9605ca6c085a749f29b6866a3e00bce1ba1a2698 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:12:56 2013 +0930 +# +# IBM long double mechanical changes to support little-endian +# http://sourceware.org/ml/libc-alpha/2013-07/msg00001.html +# +# This patch starts the process of supporting powerpc64 little-endian +# long double in glibc. IBM long double is an array of two ieee +# doubles, so making union ibm_extended_long_double reflect this fact is +# the correct way to access fields of the doubles. +# +# * sysdeps/ieee754/ldbl-128ibm/ieee754.h +# (union ibm_extended_long_double): Define as an array of ieee754_double. +# (IBM_EXTENDED_LONG_DOUBLE_BIAS): Delete. +# * sysdeps/ieee754/ldbl-128ibm/printf_fphex.c: Update all references +# to ibm_extended_long_double and IBM_EXTENDED_LONG_DOUBLE_BIAS. +# * sysdeps/ieee754/ldbl-128ibm/e_exp10l.c: Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_expl.c: Likewise. +# * sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c: Likewise. +# * sysdeps/ieee754/ldbl-128ibm/math_ldbl.h: Likewise. +# * sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c: Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c: Likewise. +# * sysdeps/ieee754/ldbl-128ibm/strtold_l.c: Likewise. +# * sysdeps/ieee754/ldbl-128ibm/x2y2m1l.c: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_exp10l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_exp10l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_exp10l.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_exp10l.c 2014-05-26 21:08:10.000000000 -0500 +@@ -36,9 +36,9 @@ + else if (arg > LDBL_MAX_10_EXP + 1) + return LDBL_MAX * LDBL_MAX; + +- u.d = arg; +- arg_high = u.dd[0]; +- arg_low = u.dd[1]; ++ u.ld = arg; ++ arg_high = u.d[0].d; ++ arg_low = u.d[1].d; + exp_high = arg_high * log10_high; + exp_low = arg_high * log10_low + arg_low * M_LN10l; + return __ieee754_expl (exp_high) * __ieee754_expl (exp_low); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_expl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_expl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_expl.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_expl.c 2014-05-26 21:08:10.000000000 -0500 +@@ -162,39 +162,39 @@ + x = x + xl; + + /* Compute ex2 = 2^n_0 e^(argtable[tval1]) e^(argtable[tval2]). */ +- ex2_u.d = __expl_table[T_EXPL_RES1 + tval1] +- * __expl_table[T_EXPL_RES2 + tval2]; ++ ex2_u.ld = (__expl_table[T_EXPL_RES1 + tval1] ++ * __expl_table[T_EXPL_RES2 + tval2]); + n_i = (int)n; + /* 'unsafe' is 1 iff n_1 != 0. */ + unsafe = fabsl(n_i) >= -LDBL_MIN_EXP - 1; +- ex2_u.ieee.exponent += n_i >> unsafe; ++ ex2_u.d[0].ieee.exponent += n_i >> unsafe; + /* Fortunately, there are no subnormal lowpart doubles in + __expl_table, only normal values and zeros. + But after scaling it can be subnormal. */ +- exponent2 = ex2_u.ieee.exponent2 + (n_i >> unsafe); +- if (ex2_u.ieee.exponent2 == 0) +- /* assert ((ex2_u.ieee.mantissa2|ex2_u.ieee.mantissa3) == 0) */; ++ exponent2 = ex2_u.d[1].ieee.exponent + (n_i >> unsafe); ++ if (ex2_u.d[1].ieee.exponent == 0) ++ /* assert ((ex2_u.d[1].ieee.mantissa0|ex2_u.d[1].ieee.mantissa1) == 0) */; + else if (exponent2 > 0) +- ex2_u.ieee.exponent2 = exponent2; ++ ex2_u.d[1].ieee.exponent = exponent2; + else if (exponent2 <= -54) + { +- ex2_u.ieee.exponent2 = 0; +- ex2_u.ieee.mantissa2 = 0; +- ex2_u.ieee.mantissa3 = 0; ++ ex2_u.d[1].ieee.exponent = 0; ++ ex2_u.d[1].ieee.mantissa0 = 0; ++ ex2_u.d[1].ieee.mantissa1 = 0; + } + else + { + static const double + two54 = 1.80143985094819840000e+16, /* 4350000000000000 */ + twom54 = 5.55111512312578270212e-17; /* 3C90000000000000 */ +- ex2_u.dd[1] *= two54; +- ex2_u.ieee.exponent2 += n_i >> unsafe; +- ex2_u.dd[1] *= twom54; ++ ex2_u.d[1].d *= two54; ++ ex2_u.d[1].ieee.exponent += n_i >> unsafe; ++ ex2_u.d[1].d *= twom54; + } + + /* Compute scale = 2^n_1. */ +- scale_u.d = 1.0L; +- scale_u.ieee.exponent += n_i - (n_i >> unsafe); ++ scale_u.ld = 1.0L; ++ scale_u.d[0].ieee.exponent += n_i - (n_i >> unsafe); + + /* Approximate e^x2 - 1, using a seventh-degree polynomial, + with maximum error in [-2^-16-2^-53,2^-16+2^-53] +@@ -204,7 +204,7 @@ + /* Return result. */ + fesetenv (&oldenv); + +- result = x22 * ex2_u.d + ex2_u.d; ++ result = x22 * ex2_u.ld + ex2_u.ld; + + /* Now we can test whether the result is ultimate or if we are unsure. + In the later case we should probably call a mpn based routine to give +@@ -238,7 +238,7 @@ + if (!unsafe) + return result; + else +- return result * scale_u.d; ++ return result * scale_u.ld; + } + /* Exceptional cases: */ + else if (isless (x, himark)) +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h 2014-05-26 21:08:10.000000000 -0500 +@@ -180,29 +180,9 @@ + + union ibm_extended_long_double + { +- long double d; +- double dd[2]; +- +- /* This is the IBM extended format long double. */ +- struct +- { /* Big endian. There is no other. */ +- +- unsigned int negative:1; +- unsigned int exponent:11; +- /* Together Mantissa0-3 comprise the mantissa. */ +- unsigned int mantissa0:20; +- unsigned int mantissa1:32; +- +- unsigned int negative2:1; +- unsigned int exponent2:11; +- /* There is an implied 1 here? */ +- /* Together these comprise the mantissa. */ +- unsigned int mantissa2:20; +- unsigned int mantissa3:32; +- } ieee; +- }; +- +-#define IBM_EXTENDED_LONG_DOUBLE_BIAS 0x3ff /* Added to exponent. */ ++ long double ld; ++ union ieee754_double d[2]; ++ }; + + __END_DECLS + +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c 2014-05-26 21:08:10.000000000 -0500 +@@ -36,22 +36,22 @@ + union ibm_extended_long_double u; + unsigned long long hi, lo; + int ediff; +- u.d = value; ++ u.ld = value; + +- *is_neg = u.ieee.negative; +- *expt = (int) u.ieee.exponent - IBM_EXTENDED_LONG_DOUBLE_BIAS; ++ *is_neg = u.d[0].ieee.negative; ++ *expt = (int) u.d[0].ieee.exponent - IEEE754_DOUBLE_BIAS; + +- lo = ((long long) u.ieee.mantissa2 << 32) | u.ieee.mantissa3; +- hi = ((long long) u.ieee.mantissa0 << 32) | u.ieee.mantissa1; ++ lo = ((long long) u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1; ++ hi = ((long long) u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1; + /* If the lower double is not a denomal or zero then set the hidden + 53rd bit. */ +- if (u.ieee.exponent2 > 0) ++ if (u.d[1].ieee.exponent > 0) + { + lo |= 1LL << 52; + + /* The lower double is normalized separately from the upper. We may + need to adjust the lower manitissa to reflect this. */ +- ediff = u.ieee.exponent - u.ieee.exponent2; ++ ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent; + if (ediff > 53) + lo = lo >> (ediff-53); + } +@@ -59,8 +59,8 @@ + difference between the long double and the rounded high double + value. This is indicated by a differnce between the signs of the + high and low doubles. */ +- if ((u.ieee.negative != u.ieee.negative2) +- && ((u.ieee.exponent2 != 0) && (lo != 0L))) ++ if ((u.d[0].ieee.negative != u.d[1].ieee.negative) ++ && ((u.d[1].ieee.exponent != 0) && (lo != 0L))) + { + lo = (1ULL << 53) - lo; + if (hi == 0LL) +@@ -92,7 +92,7 @@ + #define NUM_LEADING_ZEROS (BITS_PER_MP_LIMB \ + - (LDBL_MANT_DIG - ((N - 1) * BITS_PER_MP_LIMB))) + +- if (u.ieee.exponent == 0) ++ if (u.d[0].ieee.exponent == 0) + { + /* A biased exponent of zero is a special case. + Either it is a zero or it is a denormal number. */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-26 21:08:10.000000000 -0500 +@@ -14,28 +14,28 @@ + as bit 53 of the mantissa. */ + uint64_t hi, lo; + int ediff; +- union ibm_extended_long_double eldbl; +- eldbl.d = x; +- *exp = eldbl.ieee.exponent - IBM_EXTENDED_LONG_DOUBLE_BIAS; ++ union ibm_extended_long_double u; ++ u.ld = x; ++ *exp = u.d[0].ieee.exponent - IEEE754_DOUBLE_BIAS; + +- lo = ((int64_t)eldbl.ieee.mantissa2 << 32) | eldbl.ieee.mantissa3; +- hi = ((int64_t)eldbl.ieee.mantissa0 << 32) | eldbl.ieee.mantissa1; ++ lo = ((uint64_t)u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1; ++ hi = ((uint64_t)u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1; + /* If the lower double is not a denomal or zero then set the hidden + 53rd bit. */ +- if (eldbl.ieee.exponent2 > 0x001) ++ if (u.d[1].ieee.exponent > 0x001) + { + lo |= (1ULL << 52); + lo = lo << 7; /* pre-shift lo to match ieee854. */ + /* The lower double is normalized separately from the upper. We + may need to adjust the lower manitissa to reflect this. */ +- ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2; ++ ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent; + if (ediff > 53) + lo = lo >> (ediff-53); + hi |= (1ULL << 52); + } + +- if ((eldbl.ieee.negative != eldbl.ieee.negative2) +- && ((eldbl.ieee.exponent2 != 0) && (lo != 0LL))) ++ if ((u.d[0].ieee.negative != u.d[1].ieee.negative) ++ && ((u.d[1].ieee.exponent != 0) && (lo != 0LL))) + { + hi--; + lo = (1ULL << 60) - lo; +@@ -58,10 +58,10 @@ + unsigned long hidden2, lzcount; + unsigned long long hi, lo; + +- u.ieee.negative = sign; +- u.ieee.negative2 = sign; +- u.ieee.exponent = exp + IBM_EXTENDED_LONG_DOUBLE_BIAS; +- u.ieee.exponent2 = exp-53 + IBM_EXTENDED_LONG_DOUBLE_BIAS; ++ u.d[0].ieee.negative = sign; ++ u.d[1].ieee.negative = sign; ++ u.d[0].ieee.exponent = exp + IEEE754_DOUBLE_BIAS; ++ u.d[1].ieee.exponent = exp-53 + IEEE754_DOUBLE_BIAS; + /* Expect 113 bits (112 bits + hidden) right justified in two longs. + The low order 53 bits (52 + hidden) go into the lower double */ + lo = (lo64 >> 7)& ((1ULL << 53) - 1); +@@ -78,7 +78,7 @@ + if (hidden2) + { + hi++; +- u.ieee.negative2 = !sign; ++ u.d[1].ieee.negative = !sign; + lo = (1ULL << 53) - lo; + } + /* The hidden bit of the lo mantissa is zero so we need to +@@ -94,32 +94,32 @@ + lzcount = lzcount - 11; + if (lzcount > 0) + { +- int expnt2 = u.ieee.exponent2 - lzcount; ++ int expnt2 = u.d[1].ieee.exponent - lzcount; + if (expnt2 >= 1) + { + /* Not denormal. Normalize and set low exponent. */ + lo = lo << lzcount; +- u.ieee.exponent2 = expnt2; ++ u.d[1].ieee.exponent = expnt2; + } + else + { + /* Is denormal. */ + lo = lo << (lzcount + expnt2); +- u.ieee.exponent2 = 0; ++ u.d[1].ieee.exponent = 0; + } + } + } + else + { +- u.ieee.negative2 = 0; +- u.ieee.exponent2 = 0; ++ u.d[1].ieee.negative = 0; ++ u.d[1].ieee.exponent = 0; + } + +- u.ieee.mantissa3 = lo & ((1ULL << 32) - 1); +- u.ieee.mantissa2 = (lo >> 32) & ((1ULL << 20) - 1); +- u.ieee.mantissa1 = hi & ((1ULL << 32) - 1); +- u.ieee.mantissa0 = (hi >> 32) & ((1ULL << 20) - 1); +- return u.d; ++ u.d[1].ieee.mantissa1 = lo & ((1ULL << 32) - 1); ++ u.d[1].ieee.mantissa0 = (lo >> 32) & ((1ULL << 20) - 1); ++ u.d[0].ieee.mantissa1 = hi & ((1ULL << 32) - 1); ++ u.d[0].ieee.mantissa0 = (hi >> 32) & ((1ULL << 20) - 1); ++ return u.ld; + } + + /* Handy utility functions to pack/unpack/cononicalize and find the nearbyint +@@ -128,18 +128,18 @@ + default_ldbl_pack (double a, double aa) + { + union ibm_extended_long_double u; +- u.dd[0] = a; +- u.dd[1] = aa; +- return u.d; ++ u.d[0].d = a; ++ u.d[1].d = aa; ++ return u.ld; + } + + static inline void + default_ldbl_unpack (long double l, double *a, double *aa) + { + union ibm_extended_long_double u; +- u.d = l; +- *a = u.dd[0]; +- *aa = u.dd[1]; ++ u.ld = l; ++ *a = u.d[0].d; ++ *aa = u.d[1].d; + } + + #ifndef ldbl_pack +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c 2014-05-26 21:08:10.000000000 -0500 +@@ -34,11 +34,11 @@ + unsigned long long hi, lo; + int exponent2; + +- u.ieee.negative = sign; +- u.ieee.negative2 = sign; +- u.ieee.exponent = expt + IBM_EXTENDED_LONG_DOUBLE_BIAS; +- u.ieee.exponent2 = 0; +- exponent2 = expt - 53 + IBM_EXTENDED_LONG_DOUBLE_BIAS; ++ u.d[0].ieee.negative = sign; ++ u.d[1].ieee.negative = sign; ++ u.d[0].ieee.exponent = expt + IEEE754_DOUBLE_BIAS; ++ u.d[1].ieee.exponent = 0; ++ exponent2 = expt - 53 + IEEE754_DOUBLE_BIAS; + + #if BITS_PER_MP_LIMB == 32 + /* The low order 53 bits (52 + hidden) go into the lower double */ +@@ -74,15 +74,15 @@ + else + lzcount = lzcount + 42; + +- if (lzcount > u.ieee.exponent) ++ if (lzcount > u.d[0].ieee.exponent) + { +- lzcount = u.ieee.exponent; +- u.ieee.exponent = 0; ++ lzcount = u.d[0].ieee.exponent; ++ u.d[0].ieee.exponent = 0; + exponent2 -= lzcount; + } + else + { +- u.ieee.exponent -= (lzcount - 1); ++ u.d[0].ieee.exponent -= (lzcount - 1); + exponent2 -= (lzcount - 1); + } + +@@ -112,9 +112,9 @@ + { + if ((hi & (1LL << 53)) != 0) + hi -= 1LL << 52; +- u.ieee.exponent++; ++ u.d[0].ieee.exponent++; + } +- u.ieee.negative2 = !sign; ++ u.d[1].ieee.negative = !sign; + lo = (1LL << 53) - lo; + } + +@@ -135,17 +135,17 @@ + exponent2 = exponent2 - lzcount; + } + if (exponent2 > 0) +- u.ieee.exponent2 = exponent2; ++ u.d[1].ieee.exponent = exponent2; + else + lo >>= 1 - exponent2; + } + else +- u.ieee.negative2 = 0; ++ u.d[1].ieee.negative = 0; + +- u.ieee.mantissa3 = lo & 0xffffffffLL; +- u.ieee.mantissa2 = (lo >> 32) & 0xfffff; +- u.ieee.mantissa1 = hi & 0xffffffffLL; +- u.ieee.mantissa0 = (hi >> 32) & ((1LL << (LDBL_MANT_DIG - 86)) - 1); ++ u.d[1].ieee.mantissa1 = lo & 0xffffffffLL; ++ u.d[1].ieee.mantissa0 = (lo >> 32) & 0xfffff; ++ u.d[0].ieee.mantissa1 = hi & 0xffffffffLL; ++ u.d[0].ieee.mantissa0 = (hi >> 32) & ((1LL << (LDBL_MANT_DIG - 86)) - 1); + +- return u.d; ++ return u.ld; + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c 2014-05-26 21:08:10.000000000 -0500 +@@ -27,31 +27,31 @@ + unsigned long long int num0, num1; \ + unsigned long long hi, lo; \ + int ediff; \ +- union ibm_extended_long_double eldbl; \ +- eldbl.d = fpnum.ldbl.d; \ ++ union ibm_extended_long_double u; \ ++ u.ld = fpnum.ldbl.d; \ + \ + assert (sizeof (long double) == 16); \ + \ +- lo = ((long long)eldbl.ieee.mantissa2 << 32) | eldbl.ieee.mantissa3; \ +- hi = ((long long)eldbl.ieee.mantissa0 << 32) | eldbl.ieee.mantissa1; \ ++ lo = ((long long)u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1; \ ++ hi = ((long long)u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1; \ + lo <<= 7; /* pre-shift lo to match ieee854. */ \ + /* If the lower double is not a denomal or zero then set the hidden \ + 53rd bit. */ \ +- if (eldbl.ieee.exponent2 != 0) \ ++ if (u.d[1].ieee.exponent != 0) \ + lo |= (1ULL << (52 + 7)); \ + else \ + lo <<= 1; \ + /* The lower double is normalized separately from the upper. We \ + may need to adjust the lower manitissa to reflect this. */ \ +- ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2; \ ++ ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent; \ + if (ediff > 53 + 63) \ + lo = 0; \ + else if (ediff > 53) \ + lo = lo >> (ediff - 53); \ +- else if (eldbl.ieee.exponent2 == 0 && ediff < 53) \ ++ else if (u.d[1].ieee.exponent == 0 && ediff < 53) \ + lo = lo << (53 - ediff); \ +- if (eldbl.ieee.negative != eldbl.ieee.negative2 \ +- && (eldbl.ieee.exponent2 != 0 || lo != 0L)) \ ++ if (u.d[0].ieee.negative != u.d[1].ieee.negative \ ++ && (u.d[1].ieee.exponent != 0 || lo != 0L)) \ + { \ + lo = (1ULL << 60) - lo; \ + if (hi == 0L) \ +@@ -59,7 +59,7 @@ + /* we have a borrow from the hidden bit, so shift left 1. */ \ + hi = 0xffffffffffffeLL | (lo >> 59); \ + lo = 0xfffffffffffffffLL & (lo << 1); \ +- eldbl.ieee.exponent--; \ ++ u.d[0].ieee.exponent--; \ + } \ + else \ + hi--; \ +@@ -110,9 +110,9 @@ + *--wnumstr = L'0'; \ + } \ + \ +- leading = eldbl.ieee.exponent == 0 ? '0' : '1'; \ ++ leading = u.d[0].ieee.exponent == 0 ? '0' : '1'; \ + \ +- exponent = eldbl.ieee.exponent; \ ++ exponent = u.d[0].ieee.exponent; \ + \ + if (exponent == 0) \ + { \ +@@ -122,18 +122,18 @@ + { \ + /* This is a denormalized number. */ \ + expnegative = 1; \ +- exponent = IBM_EXTENDED_LONG_DOUBLE_BIAS - 1; \ ++ exponent = IEEE754_DOUBLE_BIAS - 1; \ + } \ + } \ +- else if (exponent >= IBM_EXTENDED_LONG_DOUBLE_BIAS) \ ++ else if (exponent >= IEEE754_DOUBLE_BIAS) \ + { \ + expnegative = 0; \ +- exponent -= IBM_EXTENDED_LONG_DOUBLE_BIAS; \ ++ exponent -= IEEE754_DOUBLE_BIAS; \ + } \ + else \ + { \ + expnegative = 1; \ +- exponent = -(exponent - IBM_EXTENDED_LONG_DOUBLE_BIAS); \ ++ exponent = -(exponent - IEEE754_DOUBLE_BIAS); \ + } \ + } while (0) + +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c 2014-05-26 21:08:10.000000000 -0500 +@@ -33,11 +33,11 @@ + fenv_t env; + static const long double TWO52 = 4503599627370496.0L; + union ibm_extended_long_double u; +- u.d = x; ++ u.ld = x; + +- if (fabs (u.dd[0]) < TWO52) ++ if (fabs (u.d[0].d) < TWO52) + { +- double high = u.dd[0]; ++ double high = u.d[0].d; + feholdexcept (&env); + if (high > 0.0) + { +@@ -51,11 +51,11 @@ + high += TWO52; + if (high == 0.0) high = -0.0; + } +- u.dd[0] = high; +- u.dd[1] = 0.0; ++ u.d[0].d = high; ++ u.d[1].d = 0.0; + fesetenv (&env); + } +- else if (fabs (u.dd[1]) < TWO52 && u.dd[1] != 0.0) ++ else if (fabs (u.d[1].d) < TWO52 && u.d[1].d != 0.0) + { + double high, low, tau; + /* In this case we have to round the low double and handle any +@@ -64,55 +64,55 @@ + may already be rounded and the low double may have the + opposite sign to compensate. */ + feholdexcept (&env); +- if (u.dd[0] > 0.0) ++ if (u.d[0].d > 0.0) + { +- if (u.dd[1] > 0.0) ++ if (u.d[1].d > 0.0) + { + /* If the high/low doubles are the same sign then simply + round the low double. */ +- high = u.dd[0]; +- low = u.dd[1]; ++ high = u.d[0].d; ++ low = u.d[1].d; + } +- else if (u.dd[1] < 0.0) ++ else if (u.d[1].d < 0.0) + { + /* Else the high double is pre rounded and we need to + adjust for that. */ + +- tau = __nextafter (u.dd[0], 0.0); +- tau = (u.dd[0] - tau) * 2.0; +- high = u.dd[0] - tau; +- low = u.dd[1] + tau; ++ tau = __nextafter (u.d[0].d, 0.0); ++ tau = (u.d[0].d - tau) * 2.0; ++ high = u.d[0].d - tau; ++ low = u.d[1].d + tau; + } + low += TWO52; + low -= TWO52; + } +- else if (u.dd[0] < 0.0) ++ else if (u.d[0].d < 0.0) + { +- if (u.dd[1] < 0.0) ++ if (u.d[1].d < 0.0) + { + /* If the high/low doubles are the same sign then simply + round the low double. */ +- high = u.dd[0]; +- low = u.dd[1]; ++ high = u.d[0].d; ++ low = u.d[1].d; + } +- else if (u.dd[1] > 0.0) ++ else if (u.d[1].d > 0.0) + { + /* Else the high double is pre rounded and we need to + adjust for that. */ +- tau = __nextafter (u.dd[0], 0.0); +- tau = (u.dd[0] - tau) * 2.0; +- high = u.dd[0] - tau; +- low = u.dd[1] + tau; ++ tau = __nextafter (u.d[0].d, 0.0); ++ tau = (u.d[0].d - tau) * 2.0; ++ high = u.d[0].d - tau; ++ low = u.d[1].d + tau; + } + low = TWO52 - low; + low = -(low - TWO52); + } +- u.dd[0] = high + low; +- u.dd[1] = high - u.dd[0] + low; ++ u.d[0].d = high + low; ++ u.d[1].d = high - u.d[0].d + low; + fesetenv (&env); + } + +- return u.d; ++ return u.ld; + } + + long_double_symbol (libm, __nearbyintl, nearbyintl); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/strtold_l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/strtold_l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/strtold_l.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/strtold_l.c 2014-05-26 21:12:01.000000000 -0500 +@@ -43,12 +43,11 @@ + #define FLOAT_HUGE_VAL HUGE_VALL + # define SET_MANTISSA(flt, mant) \ + do { union ibm_extended_long_double u; \ +- u.d = (flt); \ +- if ((mant & 0xfffffffffffffULL) == 0) \ +- mant = 0x8000000000000ULL; \ +- u.ieee.mantissa0 = ((mant) >> 32) & 0xfffff; \ +- u.ieee.mantissa1 = (mant) & 0xffffffff; \ +- (flt) = u.d; \ ++ u.ld = (flt); \ ++ u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \ ++ u.d[0].ieee_nan.mantissa1 = (mant); \ ++ if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \ ++ (flt) = u.ld; \ + } while (0) + + #include <strtod_l.c> +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/x2y2m1l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/x2y2m1l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/x2y2m1l.c 2014-05-26 21:08:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/x2y2m1l.c 2014-05-26 21:08:10.000000000 -0500 +@@ -89,23 +89,23 @@ + double vals[12]; + SET_RESTORE_ROUND (FE_TONEAREST); + union ibm_extended_long_double xu, yu; +- xu.d = x; +- yu.d = y; +- if (fabs (xu.dd[1]) < 0x1p-500) +- xu.dd[1] = 0.0; +- if (fabs (yu.dd[1]) < 0x1p-500) +- yu.dd[1] = 0.0; +- mul_split (&vals[1], &vals[0], xu.dd[0], xu.dd[0]); +- mul_split (&vals[3], &vals[2], xu.dd[0], xu.dd[1]); ++ xu.ld = x; ++ yu.ld = y; ++ if (fabs (xu.d[1].d) < 0x1p-500) ++ xu.d[1].d = 0.0; ++ if (fabs (yu.d[1].d) < 0x1p-500) ++ yu.d[1].d = 0.0; ++ mul_split (&vals[1], &vals[0], xu.d[0].d, xu.d[0].d); ++ mul_split (&vals[3], &vals[2], xu.d[0].d, xu.d[1].d); + vals[2] *= 2.0; + vals[3] *= 2.0; +- mul_split (&vals[5], &vals[4], xu.dd[1], xu.dd[1]); +- mul_split (&vals[7], &vals[6], yu.dd[0], yu.dd[0]); +- mul_split (&vals[9], &vals[8], yu.dd[0], yu.dd[1]); ++ mul_split (&vals[5], &vals[4], xu.d[1].d, xu.d[1].d); ++ mul_split (&vals[7], &vals[6], yu.d[0].d, yu.d[0].d); ++ mul_split (&vals[9], &vals[8], yu.d[0].d, yu.d[1].d); + vals[8] *= 2.0; + vals[9] *= 2.0; +- mul_split (&vals[11], &vals[10], yu.dd[1], yu.dd[1]); +- if (xu.dd[0] >= 0.75) ++ mul_split (&vals[11], &vals[10], yu.d[1].d, yu.d[1].d); ++ if (xu.d[0].d >= 0.75) + vals[1] -= 1.0; + else + { diff --git a/SOURCES/glibc-ppc64le-05.patch b/SOURCES/glibc-ppc64le-05.patch new file mode 100644 index 0000000..d089fda --- /dev/null +++ b/SOURCES/glibc-ppc64le-05.patch @@ -0,0 +1,486 @@ +# commit 4cf69995e26e16005d4e3843ad4d18c75cf21a04 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:19:44 2013 +0930 +# +# Fix for [BZ #15680] IBM long double inaccuracy +# http://sourceware.org/ml/libc-alpha/2013-06/msg00919.html +# +# I discovered a number of places where denormals and other corner cases +# were being handled wrongly. +# +# - printf_fphex.c: Testing for the low double exponent being zero is +# unnecessary. If the difference in exponents is less than 53 then the +# high double exponent must be nearing the low end of its range, and the +# low double exponent hit rock bottom. +# +# - ldbl2mpn.c: A denormal (ie. exponent of zero) value is treated as +# if the exponent was one, so shift mantissa left by one. Code handling +# normalisation of the low double mantissa lacked a test for shift count +# greater than bits in type being shifted, and lacked anything to handle +# the case where the difference in exponents is less than 53 as in +# printf_fphex.c. +# +# - math_ldbl.h (ldbl_extract_mantissa): Same as above, but worse, with +# code testing for exponent > 1 for some reason, probably a typo for >= 1. +# +# - math_ldbl.h (ldbl_insert_mantissa): Round the high double as per +# mpn2ldbl.c (hi is odd or explicit mantissas non-zero) so that the +# number we return won't change when applying ldbl_canonicalize(). +# Add missing overflow checks and normalisation of high mantissa. +# Correct misleading comment: "The hidden bit of the lo mantissa is +# zero" is not always true as can be seen from the code rounding the hi +# mantissa. Also by inspection, lzcount can never be less than zero so +# remove that test. Lastly, masking bitfields to their widths can be +# left to the compiler. +# +# - mpn2ldbl.c: The overflow checks here on rounding of high double were +# just plain wrong. Incrementing the exponent must be accompanied by a +# shift right of the mantissa to keep the value unchanged. Above notes +# for ldbl_insert_mantissa are also relevant. +# +# [BZ #15680] +# * sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c: Comment fix. +# * sysdeps/ieee754/ldbl-128ibm/printf_fphex.c +# (PRINT_FPHEX_LONG_DOUBLE): Tidy code by moving -53 into ediff +# calculation. Remove unnecessary test for denormal exponent. +# * sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c (__mpn_extract_long_double): +# Correct handling of denormals. Avoid undefined shift behaviour. +# Correct normalisation of low mantissa when low double is denormal. +# * sysdeps/ieee754/ldbl-128ibm/math_ldbl.h +# (ldbl_extract_mantissa): Likewise. Comment. Use uint64_t* for hi64. +# (ldbl_insert_mantissa): Make both hi64 and lo64 parms uint64_t. +# Correct normalisation of low mantissa. Test for overflow of high +# mantissa and normalise. +# (ldbl_nearbyint): Use more readable constant for two52. +# * sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c +# (__mpn_construct_long_double): Fix test for overflow of high +# mantissa and correct normalisation. Avoid undefined shift. +# +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c 2014-05-27 19:13:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c 2014-05-27 19:14:45.000000000 -0500 +@@ -243,7 +243,7 @@ + We split the 113 bits of the mantissa into 5 24bit integers + stored in a double array. */ + /* Make the IBM extended format 105 bit mantissa look like the ieee854 112 +- bit mantissa so the next operatation will give the correct result. */ ++ bit mantissa so the next operation will give the correct result. */ + ldbl_extract_mantissa (&ixd, &lxd, &exp, x); + exp = exp - 23; + /* This is faster than doing this in floating point, because we +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c 2014-05-27 19:13:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c 2014-05-27 19:14:45.000000000 -0500 +@@ -36,6 +36,7 @@ + union ibm_extended_long_double u; + unsigned long long hi, lo; + int ediff; ++ + u.ld = value; + + *is_neg = u.d[0].ieee.negative; +@@ -43,27 +44,36 @@ + + lo = ((long long) u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1; + hi = ((long long) u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1; +- /* If the lower double is not a denomal or zero then set the hidden ++ ++ /* If the lower double is not a denormal or zero then set the hidden + 53rd bit. */ +- if (u.d[1].ieee.exponent > 0) +- { +- lo |= 1LL << 52; ++ if (u.d[1].ieee.exponent != 0) ++ lo |= 1ULL << 52; ++ else ++ lo = lo << 1; + +- /* The lower double is normalized separately from the upper. We may +- need to adjust the lower manitissa to reflect this. */ +- ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent; +- if (ediff > 53) +- lo = lo >> (ediff-53); ++ /* The lower double is normalized separately from the upper. We may ++ need to adjust the lower manitissa to reflect this. */ ++ ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent - 53; ++ if (ediff > 0) ++ { ++ if (ediff < 64) ++ lo = lo >> ediff; ++ else ++ lo = 0; + } ++ else if (ediff < 0) ++ lo = lo << -ediff; ++ + /* The high double may be rounded and the low double reflects the + difference between the long double and the rounded high double + value. This is indicated by a differnce between the signs of the + high and low doubles. */ +- if ((u.d[0].ieee.negative != u.d[1].ieee.negative) +- && ((u.d[1].ieee.exponent != 0) && (lo != 0L))) ++ if (u.d[0].ieee.negative != u.d[1].ieee.negative ++ && lo != 0) + { + lo = (1ULL << 53) - lo; +- if (hi == 0LL) ++ if (hi == 0) + { + /* we have a borrow from the hidden bit, so shift left 1. */ + hi = 0x0ffffffffffffeLL | (lo >> 51); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-27 19:13:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-27 19:51:13.000000000 -0500 +@@ -13,77 +13,118 @@ + the number before the decimal point and the second implicit bit + as bit 53 of the mantissa. */ + uint64_t hi, lo; +- int ediff; + union ibm_extended_long_double u; ++ + u.ld = x; + *exp = u.d[0].ieee.exponent - IEEE754_DOUBLE_BIAS; + + lo = ((uint64_t)u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1; + hi = ((uint64_t)u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1; +- /* If the lower double is not a denomal or zero then set the hidden +- 53rd bit. */ +- if (u.d[1].ieee.exponent > 0x001) +- { +- lo |= (1ULL << 52); +- lo = lo << 7; /* pre-shift lo to match ieee854. */ +- /* The lower double is normalized separately from the upper. We +- may need to adjust the lower manitissa to reflect this. */ +- ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent; +- if (ediff > 53) +- lo = lo >> (ediff-53); +- hi |= (1ULL << 52); +- } + +- if ((u.d[0].ieee.negative != u.d[1].ieee.negative) +- && ((u.d[1].ieee.exponent != 0) && (lo != 0LL))) ++ if (u.d[0].ieee.exponent != 0) + { +- hi--; +- lo = (1ULL << 60) - lo; +- if (hi < (1ULL << 52)) ++ int ediff; ++ ++ /* If not a denormal or zero then we have an implicit 53rd bit. */ ++ hi |= (uint64_t) 1 << 52; ++ ++ if (u.d[1].ieee.exponent != 0) ++ lo |= (uint64_t) 1 << 52; ++ else ++ /* A denormal is to be interpreted as having a biased exponent ++ of 1. */ ++ lo = lo << 1; ++ ++ /* We are going to shift 4 bits out of hi later, because we only ++ want 48 bits in *hi64. That means we want 60 bits in lo, but ++ we currently only have 53. Shift the value up. */ ++ lo = lo << 7; ++ ++ /* The lower double is normalized separately from the upper. ++ We may need to adjust the lower mantissa to reflect this. ++ The difference between the exponents can be larger than 53 ++ when the low double is much less than 1ULP of the upper ++ (in which case there are significant bits, all 0's or all ++ 1's, between the two significands). The difference between ++ the exponents can be less than 53 when the upper double ++ exponent is nearing its minimum value (in which case the low ++ double is denormal ie. has an exponent of zero). */ ++ ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent - 53; ++ if (ediff > 0) + { +- /* we have a borrow from the hidden bit, so shift left 1. */ +- hi = (hi << 1) | (lo >> 59); +- lo = 0xfffffffffffffffLL & (lo << 1); +- *exp = *exp - 1; ++ if (ediff < 64) ++ lo = lo >> ediff; ++ else ++ lo = 0; ++ } ++ else if (ediff < 0) ++ lo = lo << -ediff; ++ ++ if (u.d[0].ieee.negative != u.d[1].ieee.negative ++ && lo != 0) ++ { ++ hi--; ++ lo = ((uint64_t) 1 << 60) - lo; ++ if (hi < (uint64_t) 1 << 52) ++ { ++ /* We have a borrow from the hidden bit, so shift left 1. */ ++ hi = (hi << 1) | (lo >> 59); ++ lo = (((uint64_t) 1 << 60) - 1) & (lo << 1); ++ *exp = *exp - 1; ++ } + } + } ++ else ++ /* If the larger magnitude double is denormal then the smaller ++ one must be zero. */ ++ hi = hi << 1; ++ + *lo64 = (hi << 60) | lo; + *hi64 = hi >> 4; + } + + static inline long double +-ldbl_insert_mantissa (int sign, int exp, int64_t hi64, u_int64_t lo64) ++ldbl_insert_mantissa (int sign, int exp, int64_t hi64, uint64_t lo64) + { + union ibm_extended_long_double u; +- unsigned long hidden2, lzcount; +- unsigned long long hi, lo; ++ int expnt2; ++ uint64_t hi, lo; + + u.d[0].ieee.negative = sign; + u.d[1].ieee.negative = sign; + u.d[0].ieee.exponent = exp + IEEE754_DOUBLE_BIAS; +- u.d[1].ieee.exponent = exp-53 + IEEE754_DOUBLE_BIAS; ++ u.d[1].ieee.exponent = 0; ++ expnt2 = exp - 53 + IEEE754_DOUBLE_BIAS; ++ + /* Expect 113 bits (112 bits + hidden) right justified in two longs. + The low order 53 bits (52 + hidden) go into the lower double */ +- lo = (lo64 >> 7)& ((1ULL << 53) - 1); +- hidden2 = (lo64 >> 59) & 1ULL; ++ lo = (lo64 >> 7) & (((uint64_t) 1 << 53) - 1); + /* The high order 53 bits (52 + hidden) go into the upper double */ +- hi = (lo64 >> 60) & ((1ULL << 11) - 1); +- hi |= (hi64 << 4); ++ hi = lo64 >> 60; ++ hi |= hi64 << 4; + +- if (lo != 0LL) ++ if (lo != 0) + { +- /* hidden2 bit of low double controls rounding of the high double. +- If hidden2 is '1' then round up hi and adjust lo (2nd mantissa) ++ int lzcount; ++ ++ /* hidden bit of low double controls rounding of the high double. ++ If hidden is '1' and either the explicit mantissa is non-zero ++ or hi is odd, then round up hi and adjust lo (2nd mantissa) + plus change the sign of the low double to compensate. */ +- if (hidden2) ++ if ((lo & ((uint64_t) 1 << 52)) != 0 ++ && ((hi & 1) != 0 || (lo & (((uint64_t) 1 << 52) - 1)) != 0)) + { + hi++; ++ if ((hi & ((uint64_t) 1 << 53)) != 0) ++ { ++ hi = hi >> 1; ++ u.d[0].ieee.exponent++; ++ } + u.d[1].ieee.negative = !sign; +- lo = (1ULL << 53) - lo; ++ lo = ((uint64_t) 1 << 53) - lo; + } +- /* The hidden bit of the lo mantissa is zero so we need to +- normalize the it for the low double. Shift it left until the +- hidden bit is '1' then adjust the 2nd exponent accordingly. */ ++ /* Normalize the low double. Shift the mantissa left until ++ the hidden bit is '1' and adjust the exponent accordingly. */ + + if (sizeof (lo) == sizeof (long)) + lzcount = __builtin_clzl (lo); +@@ -91,34 +132,30 @@ + lzcount = __builtin_clzl ((long) (lo >> 32)); + else + lzcount = __builtin_clzl ((long) lo) + 32; +- lzcount = lzcount - 11; +- if (lzcount > 0) ++ lzcount = lzcount - (64 - 53); ++ lo <<= lzcount; ++ expnt2 -= lzcount; ++ ++ if (expnt2 >= 1) ++ /* Not denormal. */ ++ u.d[1].ieee.exponent = expnt2; ++ else + { +- int expnt2 = u.d[1].ieee.exponent - lzcount; +- if (expnt2 >= 1) +- { +- /* Not denormal. Normalize and set low exponent. */ +- lo = lo << lzcount; +- u.d[1].ieee.exponent = expnt2; +- } ++ /* Is denormal. Note that biased exponent of 0 is treated ++ as if it was 1, hence the extra shift. */ ++ if (expnt2 > -53) ++ lo >>= 1 - expnt2; + else +- { +- /* Is denormal. */ +- lo = lo << (lzcount + expnt2); +- u.d[1].ieee.exponent = 0; +- } ++ lo = 0; + } + } + else +- { +- u.d[1].ieee.negative = 0; +- u.d[1].ieee.exponent = 0; +- } ++ u.d[1].ieee.negative = 0; + +- u.d[1].ieee.mantissa1 = lo & ((1ULL << 32) - 1); +- u.d[1].ieee.mantissa0 = (lo >> 32) & ((1ULL << 20) - 1); +- u.d[0].ieee.mantissa1 = hi & ((1ULL << 32) - 1); +- u.d[0].ieee.mantissa0 = (hi >> 32) & ((1ULL << 20) - 1); ++ u.d[1].ieee.mantissa1 = lo; ++ u.d[1].ieee.mantissa0 = lo >> 32; ++ u.d[0].ieee.mantissa1 = hi; ++ u.d[0].ieee.mantissa0 = hi >> 32; + return u.ld; + } + +@@ -133,6 +170,10 @@ + return u.ld; + } + ++/* To suit our callers we return *hi64 and *lo64 as if they came from ++ an ieee854 112 bit mantissa, that is, 48 bits in *hi64 (plus one ++ implicit bit) and 64 bits in *lo64. */ ++ + static inline void + default_ldbl_unpack (long double l, double *a, double *aa) + { +@@ -162,13 +203,13 @@ + *aa = xl; + } + +-/* Simple inline nearbyint (double) function . ++/* Simple inline nearbyint (double) function. + Only works in the default rounding mode + but is useful in long double rounding functions. */ + static inline double + ldbl_nearbyint (double a) + { +- double two52 = 0x10000000000000LL; ++ double two52 = 0x1p52; + + if (__builtin_expect ((__builtin_fabs (a) < two52), 1)) + { +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c 2014-05-27 19:13:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c 2014-05-27 19:14:45.000000000 -0500 +@@ -70,9 +70,9 @@ + else + lzcount = __builtin_clzl ((long) val) + 32; + if (hi) +- lzcount = lzcount - 11; ++ lzcount = lzcount - (64 - 53); + else +- lzcount = lzcount + 42; ++ lzcount = lzcount + 53 - (64 - 53); + + if (lzcount > u.d[0].ieee.exponent) + { +@@ -98,29 +98,27 @@ + } + } + +- if (lo != 0L) ++ if (lo != 0) + { +- /* hidden2 bit of low double controls rounding of the high double. +- If hidden2 is '1' and either the explicit mantissa is non-zero ++ /* hidden bit of low double controls rounding of the high double. ++ If hidden is '1' and either the explicit mantissa is non-zero + or hi is odd, then round up hi and adjust lo (2nd mantissa) + plus change the sign of the low double to compensate. */ + if ((lo & (1LL << 52)) != 0 +- && ((hi & 1) != 0 || (lo & ((1LL << 52) - 1)))) ++ && ((hi & 1) != 0 || (lo & ((1LL << 52) - 1)) != 0)) + { + hi++; +- if ((hi & ((1LL << 52) - 1)) == 0) ++ if ((hi & (1LL << 53)) != 0) + { +- if ((hi & (1LL << 53)) != 0) +- hi -= 1LL << 52; ++ hi >>= 1; + u.d[0].ieee.exponent++; + } + u.d[1].ieee.negative = !sign; + lo = (1LL << 53) - lo; + } + +- /* The hidden bit of the lo mantissa is zero so we need to normalize +- it for the low double. Shift it left until the hidden bit is '1' +- then adjust the 2nd exponent accordingly. */ ++ /* Normalize the low double. Shift the mantissa left until ++ the hidden bit is '1' and adjust the exponent accordingly. */ + + if (sizeof (lo) == sizeof (long)) + lzcount = __builtin_clzl (lo); +@@ -128,24 +126,24 @@ + lzcount = __builtin_clzl ((long) (lo >> 32)); + else + lzcount = __builtin_clzl ((long) lo) + 32; +- lzcount = lzcount - 11; +- if (lzcount > 0) +- { +- lo = lo << lzcount; +- exponent2 = exponent2 - lzcount; +- } ++ lzcount = lzcount - (64 - 53); ++ lo <<= lzcount; ++ exponent2 -= lzcount; ++ + if (exponent2 > 0) + u.d[1].ieee.exponent = exponent2; +- else ++ else if (exponent2 > -53) + lo >>= 1 - exponent2; ++ else ++ lo = 0; + } + else + u.d[1].ieee.negative = 0; + +- u.d[1].ieee.mantissa1 = lo & 0xffffffffLL; +- u.d[1].ieee.mantissa0 = (lo >> 32) & 0xfffff; +- u.d[0].ieee.mantissa1 = hi & 0xffffffffLL; +- u.d[0].ieee.mantissa0 = (hi >> 32) & ((1LL << (LDBL_MANT_DIG - 86)) - 1); ++ u.d[1].ieee.mantissa1 = lo; ++ u.d[1].ieee.mantissa0 = lo >> 32; ++ u.d[0].ieee.mantissa1 = hi; ++ u.d[0].ieee.mantissa0 = hi >> 32; + + return u.ld; + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c 2014-05-27 19:13:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c 2014-05-27 19:14:45.000000000 -0500 +@@ -43,15 +43,15 @@ + lo <<= 1; \ + /* The lower double is normalized separately from the upper. We \ + may need to adjust the lower manitissa to reflect this. */ \ +- ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent; \ +- if (ediff > 53 + 63) \ ++ ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent - 53; \ ++ if (ediff > 63) \ + lo = 0; \ +- else if (ediff > 53) \ +- lo = lo >> (ediff - 53); \ +- else if (u.d[1].ieee.exponent == 0 && ediff < 53) \ +- lo = lo << (53 - ediff); \ ++ else if (ediff > 0) \ ++ lo = lo >> ediff; \ ++ else if (ediff < 0) \ ++ lo = lo << -ediff; \ + if (u.d[0].ieee.negative != u.d[1].ieee.negative \ +- && (u.d[1].ieee.exponent != 0 || lo != 0L)) \ ++ && lo != 0) \ + { \ + lo = (1ULL << 60) - lo; \ + if (hi == 0L) \ diff --git a/SOURCES/glibc-ppc64le-06.patch b/SOURCES/glibc-ppc64le-06.patch new file mode 100644 index 0000000..fe7cf61 --- /dev/null +++ b/SOURCES/glibc-ppc64le-06.patch @@ -0,0 +1,652 @@ +# commit 1b6adf888de14675bc3207578dcb7132ed5f8ecc +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:21:58 2013 +0930 +# +# PowerPC floating point little-endian [1 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00081.html +# +# This is the first of a series of patches to ban ieee854_long_double +# and the ieee854_long_double macros when using IBM long double. union +# ieee854_long_double just isn't correct for IBM long double, especially +# when little-endian, and pretending it is OK has allowed a number of +# bugs to remain undetected in sysdeps/ieee754/ldbl-128ibm/. +# +# This changes the few places in generic code that use it. +# +# * stdio-common/printf_size.c (__printf_size): Don't use +# union ieee854_long_double in fpnum union. +# * stdio-common/printf_fphex.c (__printf_fphex): Likewise. Use +# signbit macro to retrieve sign from long double. +# * stdio-common/printf_fp.c (___printf_fp): Use signbit macro to +# retrieve sign from long double. +# * sysdeps/ieee754/ldbl-128ibm/printf_fphex.c: Adjust for fpnum change. +# * sysdeps/ieee754/ldbl-128/printf_fphex.c: Likewise. +# * sysdeps/ieee754/ldbl-96/printf_fphex.c: Likewise. +# * sysdeps/x86_64/fpu/printf_fphex.c: Likewise. +# * math/test-misc.c (main): Don't use union ieee854_long_double. +# ports/ +# * sysdeps/ia64/fpu/printf_fphex.c: Adjust for fpnum change. +# +diff -urN glibc-2.17-c758a686/math/test-misc.c glibc-2.17-c758a686/math/test-misc.c +--- glibc-2.17-c758a686/math/test-misc.c 2014-05-27 19:53:22.000000000 -0500 ++++ glibc-2.17-c758a686/math/test-misc.c 2014-05-27 19:53:45.000000000 -0500 +@@ -721,300 +721,161 @@ + + #ifndef NO_LONG_DOUBLE + { +- union ieee854_long_double v1; +- union ieee854_long_double v2; +- long double ld; ++ long double v1, v2; + +- v1.d = ld = LDBL_MIN; +- if (fpclassify (ld) != FP_NORMAL) ++ v1 = LDBL_MIN; ++ if (fpclassify (v1) != FP_NORMAL) + { +- printf ("fpclassify (LDBL_MIN) failed: %d\n", fpclassify (ld)); ++ printf ("fpclassify (LDBL_MIN) failed: %d (%La)\n", ++ fpclassify (v1), v1); + result = 1; + } +- ld = nextafterl (ld, LDBL_MIN / 2.0); +- if (fpclassify (ld) != FP_SUBNORMAL) ++ v2 = nextafterl (v1, LDBL_MIN / 2.0); ++ if (fpclassify (v2) != FP_SUBNORMAL) + { + printf ("fpclassify (LDBL_MIN-epsilon) failed: %d (%La)\n", +- fpclassify (ld), ld); ++ fpclassify (v2), v2); + result = 1; + } +- v2.d = ld = nextafterl (ld, LDBL_MIN); +- if (fpclassify (ld) != FP_NORMAL) ++ v2 = nextafterl (v2, LDBL_MIN); ++ if (fpclassify (v2) != FP_NORMAL) + { + printf ("fpclassify (LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n", +- fpclassify (ld), ld); ++ fpclassify (v2), v2); + result = 1; + } + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) ++ if (v1 != v2) + { +- printf ("LDBL_MIN: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) +- { +- printf ("LDBL_MIN: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) +- { +- printf ("LDBL_MIN: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); +- result = 1; +- } +- if (v1.ieee.negative != v2.ieee.negative) +- { +- printf ("LDBL_MIN: negative differs: %d vs %d\n", +- v1.ieee.negative, v2.ieee.negative); ++ printf ("LDBL_MIN-epsilon+epsilon != LDBL_MIN: %La vs %La\n", v2, v1); + result = 1; + } + +- v1.d = ld = -LDBL_MIN; +- if (fpclassify (ld) != FP_NORMAL) ++ v1 = -LDBL_MIN; ++ if (fpclassify (v1) != FP_NORMAL) + { +- printf ("fpclassify (-LDBL_MIN) failed: %d\n", fpclassify (ld)); ++ printf ("fpclassify (-LDBL_MIN) failed: %d (%La)\n", ++ fpclassify (v1), v1); + result = 1; + } +- ld = nextafterl (ld, -LDBL_MIN / 2.0); +- if (fpclassify (ld) != FP_SUBNORMAL) ++ v2 = nextafterl (v1, -LDBL_MIN / 2.0); ++ if (fpclassify (v2) != FP_SUBNORMAL) + { + printf ("fpclassify (-LDBL_MIN-epsilon) failed: %d (%La)\n", +- fpclassify (ld), ld); ++ fpclassify (v2), v2); + result = 1; + } +- v2.d = ld = nextafterl (ld, -LDBL_MIN); +- if (fpclassify (ld) != FP_NORMAL) ++ v2 = nextafterl (v2, -LDBL_MIN); ++ if (fpclassify (v2) != FP_NORMAL) + { + printf ("fpclassify (-LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n", +- fpclassify (ld), ld); ++ fpclassify (v2), v2); + result = 1; + } + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) ++ if (v1 != v2) + { +- printf ("-LDBL_MIN: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) +- { +- printf ("-LDBL_MIN: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) +- { +- printf ("-LDBL_MIN: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); +- result = 1; +- } +- if (v1.ieee.negative != v2.ieee.negative) +- { +- printf ("-LDBL_MIN: negative differs: %d vs %d\n", +- v1.ieee.negative, v2.ieee.negative); ++ printf ("-LDBL_MIN-epsilon+epsilon != -LDBL_MIN: %La vs %La\n", v2, v1); + result = 1; + } + +- ld = LDBL_MAX; +- if (fpclassify (ld) != FP_NORMAL) ++ v1 = LDBL_MAX; ++ if (fpclassify (v1) != FP_NORMAL) + { +- printf ("fpclassify (LDBL_MAX) failed: %d\n", fpclassify (ld)); ++ printf ("fpclassify (LDBL_MAX) failed: %d (%La)\n", ++ fpclassify (v1), v1); + result = 1; + } +- ld = nextafterl (ld, INFINITY); +- if (fpclassify (ld) != FP_INFINITE) ++ v2 = nextafterl (v1, INFINITY); ++ if (fpclassify (v2) != FP_INFINITE) + { +- printf ("fpclassify (LDBL_MAX+epsilon) failed: %d\n", fpclassify (ld)); ++ printf ("fpclassify (LDBL_MAX+epsilon) failed: %d (%La)\n", ++ fpclassify (v2), v2); + result = 1; + } + +- ld = -LDBL_MAX; +- if (fpclassify (ld) != FP_NORMAL) ++ v1 = -LDBL_MAX; ++ if (fpclassify (v1) != FP_NORMAL) + { +- printf ("fpclassify (-LDBL_MAX) failed: %d\n", fpclassify (ld)); ++ printf ("fpclassify (-LDBL_MAX) failed: %d (%La)\n", ++ fpclassify (v1), v1); + result = 1; + } +- ld = nextafterl (ld, -INFINITY); +- if (fpclassify (ld) != FP_INFINITE) ++ v2 = nextafterl (v1, -INFINITY); ++ if (fpclassify (v2) != FP_INFINITE) + { +- printf ("fpclassify (-LDBL_MAX-epsilon) failed: %d\n", +- fpclassify (ld)); ++ printf ("fpclassify (-LDBL_MAX-epsilon) failed: %d (%La)\n", ++ fpclassify (v2), v2); + result = 1; + } + +- v1.d = ld = 0.0625; +- ld = nextafterl (ld, 0.0); +- v2.d = ld = nextafterl (ld, 1.0); ++ v1 = 0.0625; ++ v2 = nextafterl (v1, 0.0); ++ v2 = nextafterl (v2, 1.0); + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) +- { +- printf ("0.0625L down: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) +- { +- printf ("0.0625L down: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) +- { +- printf ("0.0625L down: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); +- result = 1; +- } +- if (v1.ieee.negative != v2.ieee.negative) ++ if (v1 != v2) + { +- printf ("0.0625L down: negative differs: %d vs %d\n", +- v1.ieee.negative, v2.ieee.negative); ++ printf ("0.0625L-epsilon+epsilon != 0.0625L: %La vs %La\n", v2, v1); + result = 1; + } + +- v1.d = ld = 0.0625; +- ld = nextafterl (ld, 1.0); +- v2.d = ld = nextafterl (ld, 0.0); ++ v1 = 0.0625; ++ v2 = nextafterl (v1, 1.0); ++ v2 = nextafterl (v2, 0.0); + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) +- { +- printf ("0.0625L up: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) +- { +- printf ("0.0625L up: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) ++ if (v1 != v2) + { +- printf ("0.0625L up: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); +- result = 1; +- } +- if (v1.ieee.negative != v2.ieee.negative) +- { +- printf ("0.0625L up: negative differs: %d vs %d\n", +- v1.ieee.negative, v2.ieee.negative); ++ printf ("0.0625L+epsilon-epsilon != 0.0625L: %La vs %La\n", v2, v1); + result = 1; + } + +- v1.d = ld = -0.0625; +- ld = nextafterl (ld, 0.0); +- v2.d = ld = nextafterl (ld, -1.0); ++ v1 = -0.0625; ++ v2 = nextafterl (v1, 0.0); ++ v2 = nextafterl (v2, -1.0); + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) +- { +- printf ("-0.0625L up: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) +- { +- printf ("-0.0625L up: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) ++ if (v1 != v2) + { +- printf ("-0.0625L up: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); +- result = 1; +- } +- if (v1.ieee.negative != v2.ieee.negative) +- { +- printf ("-0.0625L up: negative differs: %d vs %d\n", +- v1.ieee.negative, v2.ieee.negative); ++ printf ("-0.0625L+epsilon-epsilon != -0.0625L: %La vs %La\n", v2, v1); + result = 1; + } + +- v1.d = ld = -0.0625; +- ld = nextafterl (ld, -1.0); +- v2.d = ld = nextafterl (ld, 0.0); ++ v1 = -0.0625; ++ v2 = nextafterl (v1, -1.0); ++ v2 = nextafterl (v2, 0.0); + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) +- { +- printf ("-0.0625L down: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) ++ if (v1 != v2) + { +- printf ("-0.0625L down: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) +- { +- printf ("-0.0625L down: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); +- result = 1; +- } +- if (v1.ieee.negative != v2.ieee.negative) +- { +- printf ("-0.0625L down: negative differs: %d vs %d\n", +- v1.ieee.negative, v2.ieee.negative); ++ printf ("-0.0625L-epsilon+epsilon != -0.0625L: %La vs %La\n", v2, v1); + result = 1; + } + +- v1.d = ld = 0.0; +- ld = nextafterl (ld, 1.0); +- v2.d = nextafterl (ld, -1.0); ++ v1 = 0.0; ++ v2 = nextafterl (v1, 1.0); ++ v2 = nextafterl (v2, -1.0); + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) +- { +- printf ("0.0L up: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) +- { +- printf ("0.0L up: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) ++ if (v1 != v2) + { +- printf ("0.0L up: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); ++ printf ("0.0+epsilon-epsilon != 0.0L: %La vs %La\n", v2, v1); + result = 1; + } +- if (0 != v2.ieee.negative) ++ if (signbit (v2)) + { +- printf ("0.0L up: negative differs: 0 vs %d\n", +- v2.ieee.negative); ++ printf ("0.0+epsilon-epsilon is negative\n"); + result = 1; + } + +- v1.d = ld = 0.0; +- ld = nextafterl (ld, -1.0); +- v2.d = nextafterl (ld, 1.0); ++ v1 = 0.0; ++ v2 = nextafterl (v1, -1.0); ++ v2 = nextafterl (v2, 1.0); + +- if (v1.ieee.mantissa0 != v2.ieee.mantissa0) +- { +- printf ("0.0L down: mantissa0 differs: %8x vs %8x\n", +- v1.ieee.mantissa0, v2.ieee.mantissa0); +- result = 1; +- } +- if (v1.ieee.mantissa1 != v2.ieee.mantissa1) +- { +- printf ("0.0L down: mantissa1 differs: %8x vs %8x\n", +- v1.ieee.mantissa1, v2.ieee.mantissa1); +- result = 1; +- } +- if (v1.ieee.exponent != v2.ieee.exponent) ++ if (v1 != v2) + { +- printf ("0.0L down: exponent differs: %4x vs %4x\n", +- v1.ieee.exponent, v2.ieee.exponent); ++ printf ("0.0-epsilon+epsilon != 0.0L: %La vs %La\n", v2, v1); + result = 1; + } +- if (1 != v2.ieee.negative) ++ if (!signbit (v2)) + { +- printf ("0.0L down: negative differs: 1 vs %d\n", +- v2.ieee.negative); ++ printf ("0.0-epsilon+epsilon is positive\n"); + result = 1; + } + +diff -urN glibc-2.17-c758a686/ports/sysdeps/ia64/fpu/printf_fphex.c glibc-2.17-c758a686/ports/sysdeps/ia64/fpu/printf_fphex.c +--- glibc-2.17-c758a686/ports/sysdeps/ia64/fpu/printf_fphex.c 2014-05-27 19:53:21.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/ia64/fpu/printf_fphex.c 2014-05-27 19:53:45.000000000 -0500 +@@ -25,9 +25,11 @@ + /* The "strange" 80 bit format on ia64 has an explicit \ + leading digit in the 64 bit mantissa. */ \ + unsigned long long int num; \ ++ union ieee854_long_double u; \ ++ u.d = fpnum.ldbl; \ + \ +- num = (((unsigned long long int) fpnum.ldbl.ieee.mantissa0) << 32 \ +- | fpnum.ldbl.ieee.mantissa1); \ ++ num = (((unsigned long long int) u.ieee.mantissa0) << 32 \ ++ | u.ieee.mantissa1); \ + \ + zero_mantissa = num == 0; \ + \ +@@ -49,8 +51,8 @@ + \ + /* We have 3 bits from the mantissa in the leading nibble. \ + Therefore we are here using `IEEE854_LONG_DOUBLE_BIAS + 3'. */ \ +- exponent = fpnum.ldbl.ieee.exponent; \ +- \ ++ exponent = u.ieee.exponent; \ ++ \ + if (exponent == 0) \ + { \ + if (zero_mantissa) \ +diff -urN glibc-2.17-c758a686/stdio-common/printf_fp.c glibc-2.17-c758a686/stdio-common/printf_fp.c +--- glibc-2.17-c758a686/stdio-common/printf_fp.c 2014-05-27 19:53:22.000000000 -0500 ++++ glibc-2.17-c758a686/stdio-common/printf_fp.c 2014-05-27 19:53:45.000000000 -0500 +@@ -335,8 +335,7 @@ + int res; + if (__isnanl (fpnum.ldbl)) + { +- union ieee854_long_double u = { .d = fpnum.ldbl }; +- is_neg = u.ieee.negative != 0; ++ is_neg = signbit (fpnum.ldbl); + if (isupper (info->spec)) + { + special = "NAN"; +diff -urN glibc-2.17-c758a686/stdio-common/printf_fphex.c glibc-2.17-c758a686/stdio-common/printf_fphex.c +--- glibc-2.17-c758a686/stdio-common/printf_fphex.c 2014-05-27 19:53:22.000000000 -0500 ++++ glibc-2.17-c758a686/stdio-common/printf_fphex.c 2014-05-27 19:53:45.000000000 -0500 +@@ -93,7 +93,7 @@ + union + { + union ieee754_double dbl; +- union ieee854_long_double ldbl; ++ long double ldbl; + } + fpnum; + +@@ -162,12 +162,11 @@ + #ifndef __NO_LONG_DOUBLE_MATH + if (info->is_long_double && sizeof (long double) > sizeof (double)) + { +- fpnum.ldbl.d = *(const long double *) args[0]; ++ fpnum.ldbl = *(const long double *) args[0]; + + /* Check for special values: not a number or infinity. */ +- if (__isnanl (fpnum.ldbl.d)) ++ if (__isnanl (fpnum.ldbl)) + { +- negative = fpnum.ldbl.ieee.negative != 0; + if (isupper (info->spec)) + { + special = "NAN"; +@@ -181,8 +180,7 @@ + } + else + { +- int res = __isinfl (fpnum.ldbl.d); +- if (res) ++ if (__isinfl (fpnum.ldbl)) + { + if (isupper (info->spec)) + { +@@ -194,11 +192,9 @@ + special = "inf"; + wspecial = L"inf"; + } +- negative = res < 0; + } +- else +- negative = signbit (fpnum.ldbl.d); + } ++ negative = signbit (fpnum.ldbl); + } + else + #endif /* no long double */ +diff -urN glibc-2.17-c758a686/stdio-common/printf_size.c glibc-2.17-c758a686/stdio-common/printf_size.c +--- glibc-2.17-c758a686/stdio-common/printf_size.c 2014-05-27 19:53:22.000000000 -0500 ++++ glibc-2.17-c758a686/stdio-common/printf_size.c 2014-05-27 19:53:45.000000000 -0500 +@@ -103,7 +103,7 @@ + union + { + union ieee754_double dbl; +- union ieee854_long_double ldbl; ++ long double ldbl; + } + fpnum; + const void *ptr = &fpnum; +@@ -123,25 +123,25 @@ + #ifndef __NO_LONG_DOUBLE_MATH + if (info->is_long_double && sizeof (long double) > sizeof (double)) + { +- fpnum.ldbl.d = *(const long double *) args[0]; ++ fpnum.ldbl = *(const long double *) args[0]; + + /* Check for special values: not a number or infinity. */ +- if (__isnanl (fpnum.ldbl.d)) ++ if (__isnanl (fpnum.ldbl)) + { + special = "nan"; + wspecial = L"nan"; + // fpnum_sign = 0; Already zero + } +- else if ((res = __isinfl (fpnum.ldbl.d))) ++ else if ((res = __isinfl (fpnum.ldbl))) + { + fpnum_sign = res; + special = "inf"; + wspecial = L"inf"; + } + else +- while (fpnum.ldbl.d >= divisor && tag[1] != '\0') ++ while (fpnum.ldbl >= divisor && tag[1] != '\0') + { +- fpnum.ldbl.d /= divisor; ++ fpnum.ldbl /= divisor; + ++tag; + } + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128/printf_fphex.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128/printf_fphex.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128/printf_fphex.c 2014-05-27 19:53:20.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128/printf_fphex.c 2014-05-27 19:53:45.000000000 -0500 +@@ -24,13 +24,15 @@ + digits we use only the implicit digits for the number before \ + the decimal point. */ \ + unsigned long long int num0, num1; \ ++ union ieee854_long_double u; \ ++ u.d = fpnum.ldbl; \ + \ + assert (sizeof (long double) == 16); \ + \ +- num0 = (((unsigned long long int) fpnum.ldbl.ieee.mantissa0) << 32 \ +- | fpnum.ldbl.ieee.mantissa1); \ +- num1 = (((unsigned long long int) fpnum.ldbl.ieee.mantissa2) << 32 \ +- | fpnum.ldbl.ieee.mantissa3); \ ++ num0 = (((unsigned long long int) u.ieee.mantissa0) << 32 \ ++ | u.ieee.mantissa1); \ ++ num1 = (((unsigned long long int) u.ieee.mantissa2) << 32 \ ++ | u.ieee.mantissa3); \ + \ + zero_mantissa = (num0|num1) == 0; \ + \ +@@ -75,9 +77,9 @@ + *--wnumstr = L'0'; \ + } \ + \ +- leading = fpnum.ldbl.ieee.exponent == 0 ? '0' : '1'; \ ++ leading = u.ieee.exponent == 0 ? '0' : '1'; \ + \ +- exponent = fpnum.ldbl.ieee.exponent; \ ++ exponent = u.ieee.exponent; \ + \ + if (exponent == 0) \ + { \ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c 2014-05-27 19:53:20.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c 2014-05-27 19:53:45.000000000 -0500 +@@ -28,14 +28,14 @@ + unsigned long long hi, lo; \ + int ediff; \ + union ibm_extended_long_double u; \ +- u.ld = fpnum.ldbl.d; \ ++ u.ld = fpnum.ldbl; \ + \ + assert (sizeof (long double) == 16); \ + \ + lo = ((long long)u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1; \ + hi = ((long long)u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1; \ + lo <<= 7; /* pre-shift lo to match ieee854. */ \ +- /* If the lower double is not a denomal or zero then set the hidden \ ++ /* If the lower double is not a denormal or zero then set the hidden \ + 53rd bit. */ \ + if (u.d[1].ieee.exponent != 0) \ + lo |= (1ULL << (52 + 7)); \ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-96/printf_fphex.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-96/printf_fphex.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-96/printf_fphex.c 2014-05-27 19:53:20.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-96/printf_fphex.c 2014-05-27 19:53:45.000000000 -0500 +@@ -25,11 +25,13 @@ + /* The "strange" 80 bit format on ix86 and m68k has an explicit \ + leading digit in the 64 bit mantissa. */ \ + unsigned long long int num; \ ++ union ieee854_long_double u; \ ++ u.d = fpnum.ldbl; \ + \ + assert (sizeof (long double) == 12); \ + \ +- num = (((unsigned long long int) fpnum.ldbl.ieee.mantissa0) << 32 \ +- | fpnum.ldbl.ieee.mantissa1); \ ++ num = (((unsigned long long int) u.ieee.mantissa0) << 32 \ ++ | u.ieee.mantissa1); \ + \ + zero_mantissa = num == 0; \ + \ +@@ -62,7 +64,7 @@ + \ + /* We have 3 bits from the mantissa in the leading nibble. \ + Therefore we are here using `IEEE854_LONG_DOUBLE_BIAS + 3'. */ \ +- exponent = fpnum.ldbl.ieee.exponent; \ ++ exponent = u.ieee.exponent; \ + \ + if (exponent == 0) \ + { \ +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/fpu/printf_fphex.c glibc-2.17-c758a686/sysdeps/x86_64/fpu/printf_fphex.c +--- glibc-2.17-c758a686/sysdeps/x86_64/fpu/printf_fphex.c 2014-05-27 19:53:20.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/fpu/printf_fphex.c 2014-05-27 19:53:45.000000000 -0500 +@@ -25,10 +25,11 @@ + /* The "strange" 80 bit format on ix86 and m68k has an explicit \ + leading digit in the 64 bit mantissa. */ \ + unsigned long long int num; \ ++ union ieee854_long_double u; \ ++ u.d = fpnum.ldbl; \ + \ +- \ +- num = (((unsigned long long int) fpnum.ldbl.ieee.mantissa0) << 32 \ +- | fpnum.ldbl.ieee.mantissa1); \ ++ num = (((unsigned long long int) u.ieee.mantissa0) << 32 \ ++ | u.ieee.mantissa1); \ + \ + zero_mantissa = num == 0; \ + \ +@@ -61,7 +62,7 @@ + \ + /* We have 3 bits from the mantissa in the leading nibble. \ + Therefore we are here using `IEEE854_LONG_DOUBLE_BIAS + 3'. */ \ +- exponent = fpnum.ldbl.ieee.exponent; \ ++ exponent = u.ieee.exponent; \ + \ + if (exponent == 0) \ + { \ diff --git a/SOURCES/glibc-ppc64le-07.patch b/SOURCES/glibc-ppc64le-07.patch new file mode 100644 index 0000000..120576e --- /dev/null +++ b/SOURCES/glibc-ppc64le-07.patch @@ -0,0 +1,651 @@ +# commit 4ebd120cd983c8d2ac7a234884b3ac6805d82973 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:24:05 2013 +0930 +# +# PowerPC floating point little-endian [2 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00082.html +# +# This patch replaces occurrences of GET_LDOUBLE_* and SET_LDOUBLE_* +# macros, and union ieee854_long_double_shape_type in ldbl-128ibm/, +# and a stray one in the 32-bit fpu support. These files have no +# significant changes apart from rewriting the long double bit access. +# +# * sysdeps/ieee754/ldbl-128ibm/math_ldbl.h (ldbl_high): Define. +# * sysdeps/ieee754/ldbl-128ibm/e_acoshl.c (__ieee754_acoshl): Rewrite +# all uses of ieee854 long double macros and unions. +# * sysdeps/ieee754/ldbl-128ibm/e_acosl.c (__ieee754_acosl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_asinl.c (__ieee754_asinl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_atanhl.c (__ieee754_atanhl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_coshl.c (__ieee754_coshl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_log2l.c (__ieee754_log2l): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c (__ieee754_rem_pio2l): +# Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_sinhl.c (__ieee754_sinhl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/k_cosl.c (__kernel_cosl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/k_sincosl.c (__kernel_sincosl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/k_sinl.c (__kernel_sinl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_asinhl.c (__asinhl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_atanl.c (__atanl): Likewise. +# Simplify sign and nan test too. +# * sysdeps/ieee754/ldbl-128ibm/s_cosl.c (__cosl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_fabsl.c (__fabsl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_finitel.c (___finitel): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c (___fpclassifyl): +# Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_isnanl.c (___isnanl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c (__issignalingl): +# Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_logbl.c (__logbl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_signbitl.c (___signbitl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_sincosl.c (__sincosl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_sinl.c (__sinl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_tanl.c (__tanl): Likewise. +# * sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c (__logbl): Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -36,8 +36,12 @@ + { + long double t; + int64_t hx; +- u_int64_t lx; +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ uint64_t lx; ++ double xhi, xlo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); + if(hx<0x3ff0000000000000LL) { /* x < 1 */ + return (x-x)/(x-x); + } else if(hx >=0x41b0000000000000LL) { /* x > 2**28 */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acosl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acosl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acosl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_acosl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -151,26 +151,25 @@ + long double + __ieee754_acosl (long double x) + { +- long double z, r, w, p, q, s, t, f2; +- ieee854_long_double_shape_type u; ++ long double a, z, r, w, p, q, s, t, f2; + +- u.value = __builtin_fabsl (x); +- if (u.value == 1.0L) ++ a = __builtin_fabsl (x); ++ if (a == 1.0L) + { + if (x > 0.0L) + return 0.0; /* acos(1) = 0 */ + else + return (2.0 * pio2_hi) + (2.0 * pio2_lo); /* acos(-1)= pi */ + } +- else if (u.value > 1.0L) ++ else if (a > 1.0L) + { + return (x - x) / (x - x); /* acos(|x| > 1) is NaN */ + } +- if (u.value < 0.5L) ++ if (a < 0.5L) + { +- if (u.value < 6.938893903907228e-18L) /* |x| < 2**-57 */ ++ if (a < 6.938893903907228e-18L) /* |x| < 2**-57 */ + return pio2_hi + pio2_lo; +- if (u.value < 0.4375L) ++ if (a < 0.4375L) + { + /* Arcsine of x. */ + z = x * x; +@@ -199,7 +198,7 @@ + return z; + } + /* .4375 <= |x| < .5 */ +- t = u.value - 0.4375L; ++ t = a - 0.4375L; + p = ((((((((((P10 * t + + P9) * t + + P8) * t +@@ -230,9 +229,9 @@ + r = acosr4375 + r; + return r; + } +- else if (u.value < 0.625L) ++ else if (a < 0.625L) + { +- t = u.value - 0.5625L; ++ t = a - 0.5625L; + p = ((((((((((rS10 * t + + rS9) * t + + rS8) * t +@@ -264,7 +263,9 @@ + } + else + { /* |x| >= .625 */ +- z = (one - u.value) * 0.5; ++ double shi, slo; ++ ++ z = (one - a) * 0.5; + s = __ieee754_sqrtl (z); + /* Compute an extended precision square root from + the Newton iteration s -> 0.5 * (s + z / s). +@@ -273,12 +274,11 @@ + Express s = f1 + f2 where f1 * f1 is exactly representable. + w = (z - s^2)/2s = (z - f1^2 - 2 f1 f2 - f2^2)/2s . + s + w has extended precision. */ +- u.value = s; +- u.parts32.w2 = 0; +- u.parts32.w3 = 0; +- f2 = s - u.value; +- w = z - u.value * u.value; +- w = w - 2.0 * u.value * f2; ++ ldbl_unpack (s, &shi, &slo); ++ a = shi; ++ f2 = slo; ++ w = z - a * a; ++ w = w - 2.0 * a * f2; + w = w - f2 * f2; + w = w / (2.0 * s); + /* Arcsine of s. */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_asinl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_asinl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_asinl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_asinl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -131,19 +131,18 @@ + long double + __ieee754_asinl (long double x) + { +- long double t, w, p, q, c, r, s; ++ long double a, t, w, p, q, c, r, s; + int flag; +- ieee854_long_double_shape_type u; + + flag = 0; +- u.value = __builtin_fabsl (x); +- if (u.value == 1.0L) /* |x|>= 1 */ ++ a = __builtin_fabsl (x); ++ if (a == 1.0L) /* |x|>= 1 */ + return x * pio2_hi + x * pio2_lo; /* asin(1)=+-pi/2 with inexact */ +- else if (u.value >= 1.0L) ++ else if (a >= 1.0L) + return (x - x) / (x - x); /* asin(|x|>1) is NaN */ +- else if (u.value < 0.5L) ++ else if (a < 0.5L) + { +- if (u.value < 6.938893903907228e-18L) /* |x| < 2**-57 */ ++ if (a < 6.938893903907228e-18L) /* |x| < 2**-57 */ + { + if (huge + x > one) + return x; /* return x with inexact if x!=0 */ +@@ -155,9 +154,9 @@ + flag = 1; + } + } +- else if (u.value < 0.625L) ++ else if (a < 0.625L) + { +- t = u.value - 0.5625; ++ t = a - 0.5625; + p = ((((((((((rS10 * t + + rS9) * t + + rS8) * t +@@ -190,7 +189,7 @@ + else + { + /* 1 > |x| >= 0.625 */ +- w = one - u.value; ++ w = one - a; + t = w * 0.5; + } + +@@ -223,17 +222,14 @@ + } + + s = __ieee754_sqrtl (t); +- if (u.value > 0.975L) ++ if (a > 0.975L) + { + w = p / q; + t = pio2_hi - (2.0 * (s + s * w) - pio2_lo); + } + else + { +- u.value = s; +- u.parts32.w3 = 0; +- u.parts32.w2 = 0; +- w = u.value; ++ w = ldbl_high (s); + c = (t - w * w) / (s + w); + r = p / q; + p = 2.0 * s * r - (pio2_lo - 2.0 * c); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -40,8 +40,10 @@ + { + long double t; + int64_t hx,ix; +- u_int64_t lx __attribute__ ((unused)); +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ double xhi; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); + ix = hx&0x7fffffffffffffffLL; + if (ix >= 0x3ff0000000000000LL) { /* |x|>=1 */ + if (ix > 0x3ff0000000000000LL) +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_coshl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_coshl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_coshl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_coshl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -41,9 +41,11 @@ + { + long double t,w; + int64_t ix; ++ double xhi; + + /* High word of |x|. */ +- GET_LDOUBLE_MSW64(ix,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); + ix &= 0x7fffffffffffffffLL; + + /* x is INF or NaN */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log2l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log2l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log2l.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log2l.c 2014-05-27 19:59:00.000000000 -0500 +@@ -177,11 +177,13 @@ + long double z; + long double y; + int e; +- int64_t hx, lx; ++ int64_t hx; ++ double xhi; + + /* Test for domain */ +- GET_LDOUBLE_WORDS64 (hx, lx, x); +- if (((hx & 0x7fffffffffffffffLL) | (lx & 0x7fffffffffffffffLL)) == 0) ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); ++ if ((hx & 0x7fffffffffffffffLL) == 0) + return (-1.0L / (x - x)); + if (hx < 0) + return (x - x) / (x - x); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c 2014-05-27 19:59:00.000000000 -0500 +@@ -200,10 +200,11 @@ + double tx[8]; + int exp; + int64_t n, ix, hx, ixd; +- u_int64_t lx __attribute__ ((unused)); + u_int64_t lxd; ++ double xhi; + +- GET_LDOUBLE_WORDS64 (hx, lx, x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); + ix = hx & 0x7fffffffffffffffLL; + if (ix <= 0x3fe921fb54442d10LL) /* x in <-pi/4, pi/4> */ + { +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -38,9 +38,11 @@ + { + long double t,w,h; + int64_t ix,jx; ++ double xhi; + + /* High word of |x|. */ +- GET_LDOUBLE_MSW64(jx,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (jx, xhi); + ix = jx&0x7fffffffffffffffLL; + + /* x is INF or NaN */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_cosl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_cosl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_cosl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_cosl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -81,8 +81,11 @@ + { + long double h, l, z, sin_l, cos_l_m1; + int64_t ix; +- u_int32_t tix, hix, index; +- GET_LDOUBLE_MSW64 (ix, x); ++ uint32_t tix, hix, index; ++ double xhi, hhi; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); + tix = ((u_int64_t)ix) >> 32; + tix &= ~0x80000000; /* tix = |x|'s high 32 bits */ + if (tix < 0x3fc30000) /* |x| < 0.1484375 */ +@@ -136,7 +139,8 @@ + case 2: index = (hix - 0x3fc30000) >> 14; break; + } + */ +- SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0); ++ INSERT_WORDS64 (hhi, ((uint64_t)hix) << 32); ++ h = hhi; + l = y - (h - x); + z = l * l; + sin_l = l*(ONE+z*(SSIN1+z*(SSIN2+z*(SSIN3+z*(SSIN4+z*SSIN5))))); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -100,9 +100,12 @@ + { + long double h, l, z, sin_l, cos_l_m1; + int64_t ix; +- u_int32_t tix, hix, index; +- GET_LDOUBLE_MSW64 (ix, x); +- tix = ((u_int64_t)ix) >> 32; ++ uint32_t tix, hix, index; ++ double xhi, hhi; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); ++ tix = ((uint64_t)ix) >> 32; + tix &= ~0x80000000; /* tix = |x|'s high 32 bits */ + if (tix < 0x3fc30000) /* |x| < 0.1484375 */ + { +@@ -164,7 +167,8 @@ + case 2: index = (hix - 0x3fc30000) >> 14; break; + } + */ +- SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0); ++ INSERT_WORDS64 (hhi, ((uint64_t)hix) << 32); ++ h = hhi; + if (iy) + l = y - (h - x); + else +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sinl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sinl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sinl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_sinl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -82,7 +82,10 @@ + long double h, l, z, sin_l, cos_l_m1; + int64_t ix; + u_int32_t tix, hix, index; +- GET_LDOUBLE_MSW64 (ix, x); ++ double xhi, hhi; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); + tix = ((u_int64_t)ix) >> 32; + tix &= ~0x80000000; /* tix = |x|'s high 32 bits */ + if (tix < 0x3fc30000) /* |x| < 0.1484375 */ +@@ -132,7 +135,8 @@ + case 2: index = (hix - 0x3fc30000) >> 14; break; + } + */ +- SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0); ++ INSERT_WORDS64 (hhi, ((uint64_t)hix) << 32); ++ h = hhi; + if (iy) + l = (ix < 0 ? -y : y) - (h - x); + else +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -38,7 +38,10 @@ + { + long double t,w; + int64_t hx,ix; +- GET_LDOUBLE_MSW64(hx,x); ++ double xhi; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); + ix = hx&0x7fffffffffffffffLL; + if(ix>=0x7ff0000000000000LL) return x+x; /* x is inf or NaN */ + if(ix< 0x3e20000000000000LL) { /* |x|<2**-29 */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_atanl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_atanl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_atanl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_atanl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -173,23 +173,20 @@ + long double + __atanl (long double x) + { +- int k, sign; ++ int32_t k, sign, lx; + long double t, u, p, q; +- ieee854_long_double_shape_type s; ++ double xhi; + +- s.value = x; +- k = s.parts32.w0; +- if (k & 0x80000000) +- sign = 1; +- else +- sign = 0; ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS (k, lx, xhi); ++ sign = k & 0x80000000; + + /* Check for IEEE special cases. */ + k &= 0x7fffffff; + if (k >= 0x7ff00000) + { + /* NaN. */ +- if ((k & 0xfffff) | s.parts32.w1 ) ++ if (((k - 0x7ff00000) | lx) != 0) + return (x + x); + + /* Infinity. */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_cosl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_cosl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_cosl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_cosl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -53,9 +53,11 @@ + { + long double y[2],z=0.0L; + int64_t n, ix; ++ double xhi; + + /* High word of x. */ +- GET_LDOUBLE_MSW64(ix,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffffffffffffLL; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -29,10 +29,16 @@ + long double __fabsl(long double x) + { + u_int64_t hx, lx; +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ double xhi, xlo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); + lx = lx ^ ( hx & 0x8000000000000000LL ); + hx = hx & 0x7fffffffffffffffLL; +- SET_LDOUBLE_WORDS64(x,hx,lx); ++ INSERT_WORDS64 (xhi, hx); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x; + } + long_double_symbol (libm, __fabsl, fabsl); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_finitel.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_finitel.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_finitel.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_finitel.c 2014-05-27 19:59:00.000000000 -0500 +@@ -29,10 +29,14 @@ + int + ___finitel (long double x) + { +- int64_t hx; +- GET_LDOUBLE_MSW64(hx,x); +- return (int)((u_int64_t)((hx&0x7fffffffffffffffLL) +- -0x7ff0000000000000LL)>>63); ++ uint64_t hx; ++ double xhi; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); ++ hx &= 0x7fffffffffffffffLL; ++ hx -= 0x7ff0000000000000LL; ++ return hx >> 63; + } + hidden_ver (___finitel, __finitel) + weak_alias (___finitel, ____finitel) +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -46,8 +46,10 @@ + { + u_int64_t hx, lx; + int retval = FP_NORMAL; ++ double xhi, xlo; + +- GET_LDOUBLE_WORDS64 (hx, lx, x); ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); + if ((hx & 0x7ff0000000000000ULL) == 0x7ff0000000000000ULL) { + /* +/-NaN or +/-Inf */ + if (hx & 0x000fffffffffffffULL) { +@@ -65,6 +67,7 @@ + retval = FP_NORMAL; + } else { + if ((hx & 0x7ff0000000000000ULL) == 0x0360000000000000ULL) { ++ EXTRACT_WORDS64 (lx, xlo); + if ((lx & 0x7fffffffffffffff) /* lower is non-zero */ + && ((lx^hx) & 0x8000000000000000ULL)) { /* and sign differs */ + /* +/- denormal */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isnanl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isnanl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isnanl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isnanl.c 2014-05-27 19:59:00.000000000 -0500 +@@ -29,12 +29,14 @@ + int + ___isnanl (long double x) + { +- int64_t hx; +- int64_t lx __attribute__ ((unused)); +- GET_LDOUBLE_WORDS64(hx,lx,x); +- hx &= 0x7fffffffffffffffLL; +- hx = 0x7ff0000000000000LL - hx; +- return (int)((u_int64_t)hx>>63); ++ uint64_t hx; ++ double xhi; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); ++ hx &= 0x7fffffffffffffffLL; ++ hx = 0x7ff0000000000000LL - hx; ++ return (int) (hx >> 63); + } + hidden_ver (___isnanl, __isnanl) + #ifndef IS_IN_libm +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_logbl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_logbl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_logbl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_logbl.c 2014-05-27 19:59:19.000000000 -0500 +@@ -27,9 +27,10 @@ + __logbl (long double x) + { + int64_t hx, rhx; +- int64_t lx __attribute__ ((unused)); ++ double xhi; + +- GET_LDOUBLE_WORDS64 (hx, lx, x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); + hx &= 0x7fffffffffffffffLL; /* high |x| */ + if (hx == 0) + return -1.0 / fabs (x); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_signbitl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_signbitl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_signbitl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_signbitl.c 2014-05-27 19:59:19.000000000 -0500 +@@ -25,8 +25,10 @@ + ___signbitl (long double x) + { + int64_t e; ++ double xhi; + +- GET_LDOUBLE_MSW64 (e, x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (e, xhi); + return e < 0; + } + #ifdef IS_IN_libm +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c 2014-05-27 19:59:19.000000000 -0500 +@@ -27,9 +27,11 @@ + __sincosl (long double x, long double *sinx, long double *cosx) + { + int64_t ix; ++ double xhi; + + /* High word of x. */ +- GET_LDOUBLE_MSW64 (ix, x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffffffffffffLL; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sinl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sinl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sinl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_sinl.c 2014-05-27 19:59:19.000000000 -0500 +@@ -53,9 +53,11 @@ + { + long double y[2],z=0.0L; + int64_t n, ix; ++ double xhi; + + /* High word of x. */ +- GET_LDOUBLE_MSW64(ix,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffffffffffffLL; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanl.c 2014-05-27 19:59:19.000000000 -0500 +@@ -53,9 +53,11 @@ + { + long double y[2],z=0.0L; + int64_t n, ix; ++ double xhi; + + /* High word of x. */ +- GET_LDOUBLE_MSW64(ix,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ix, xhi); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffffffffffffLL; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c 2014-05-27 19:58:07.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c 2014-05-27 19:59:19.000000000 -0500 +@@ -35,14 +35,14 @@ + long double + __logbl (long double x) + { +- double xh, xl; ++ double xh; + double ret; + + if (__builtin_expect (x == 0.0L, 0)) + /* Raise FE_DIVBYZERO and return -HUGE_VAL[LF]. */ + return -1.0L / __builtin_fabsl (x); + +- ldbl_unpack (x, &xh, &xl); ++ xh = ldbl_high (x); + /* ret = x & 0x7ff0000000000000; */ + asm ( + "xxland %x0,%x1,%x2\n" +@@ -58,9 +58,9 @@ + { + /* POSIX specifies that denormal number is treated as + though it were normalized. */ +- int64_t lx, hx; ++ int64_t hx; + +- GET_LDOUBLE_WORDS64 (hx, lx, x); ++ EXTRACT_WORDS64 (hx, xh); + return (long double) (-1023 - (__builtin_clzll (hx) - 12)); + } + /* Test to avoid logb_downward (0.0) == -0.0. */ diff --git a/SOURCES/glibc-ppc64le-08.patch b/SOURCES/glibc-ppc64le-08.patch new file mode 100644 index 0000000..5f79844 --- /dev/null +++ b/SOURCES/glibc-ppc64le-08.patch @@ -0,0 +1,1235 @@ +# commit 765714cafcad7e6168518c61111f07bd955a9fee +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:24:58 2013 +0930 +# +# PowerPC floating point little-endian [3 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00083.html +# +# Further replacement of ieee854 macros and unions. These files also +# have some optimisations for comparison against 0.0L, infinity and nan. +# Since the ABI specifies that the high double of an IBM long double +# pair is the value rounded to double, a high double of 0.0 means the +# low double must also be 0.0. The ABI also says that infinity and +# nan are encoded in the high double, with the low double unspecified. +# This means that tests for 0.0L, +/-Infinity and +/-NaN need only check +# the high double. +# +# * sysdeps/ieee754/ldbl-128ibm/e_atan2l.c (__ieee754_atan2l): Rewrite +# all uses of ieee854 long double macros and unions. Simplify tests +# for long doubles that are fully specified by the high double. +# * sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c (__ieee754_gammal_r): +# Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_ilogbl.c (__ieee754_ilogbl): Likewise. +# Remove dead code too. +# * sysdeps/ieee754/ldbl-128ibm/e_jnl.c (__ieee754_jnl): Likewise. +# (__ieee754_ynl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_log10l.c (__ieee754_log10l): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_logl.c (__ieee754_logl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Likewise. +# Remove dead code too. +# * sysdeps/ieee754/ldbl-128ibm/k_tanl.c (__kernel_tanl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_expm1l.c (__expm1l): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_frexpl.c (__frexpl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c (__isinf_nsl): Likewise. +# Simplify. +# * sysdeps/ieee754/ldbl-128ibm/s_isinfl.c (___isinfl): Likewise. +# Simplify. +# * sysdeps/ieee754/ldbl-128ibm/s_log1pl.c (__log1pl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_modfl.c (__modfl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (__nextafterl): Likewise. +# Comment on variable precision. +# * sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c (__nexttoward): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c (__nexttowardf): +# Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_remquol.c (__remquol): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c (__scalblnl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c (__scalbnl): Likewise. +# * sysdeps/ieee754/ldbl-128ibm/s_tanhl.c (__tanhl): Likewise. +# * sysdeps/powerpc/fpu/libm-test-ulps: Adjust tan_towardzero ulps. +# +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c 2014-05-27 23:05:55.000000000 -0500 +@@ -56,11 +56,15 @@ + { + long double z; + int64_t k,m,hx,hy,ix,iy; +- u_int64_t lx,ly; ++ uint64_t lx; ++ double xhi, xlo, yhi; + +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); + ix = hx&0x7fffffffffffffffLL; +- GET_LDOUBLE_WORDS64(hy,ly,y); ++ yhi = ldbl_high (y); ++ EXTRACT_WORDS64 (hy, yhi); + iy = hy&0x7fffffffffffffffLL; + if(((ix)>0x7ff0000000000000LL)|| + ((iy)>0x7ff0000000000000LL)) /* x or y is NaN */ +@@ -70,7 +74,7 @@ + m = ((hy>>63)&1)|((hx>>62)&2); /* 2*sign(x)+sign(y) */ + + /* when y = 0 */ +- if((iy|(ly&0x7fffffffffffffffLL))==0) { ++ if(iy==0) { + switch(m) { + case 0: + case 1: return y; /* atan(+-0,+anything)=+-0 */ +@@ -79,7 +83,7 @@ + } + } + /* when x = 0 */ +- if((ix|(lx&0x7fffffffffffffff))==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; ++ if(ix==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; + + /* when x is INF */ + if(ix==0x7ff0000000000000LL) { +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c 2014-05-27 23:05:55.000000000 -0500 +@@ -29,11 +29,12 @@ + and the exp function. But due to the required boundary + conditions we must check some values separately. */ + int64_t hx; +- u_int64_t lx; ++ double xhi; + +- GET_LDOUBLE_WORDS64 (hx, lx, x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); + +- if (((hx | lx) & 0x7fffffffffffffffLL) == 0) ++ if ((hx & 0x7fffffffffffffffLL) == 0) + { + /* Return value for x == 0 is Inf with divide by zero exception. */ + *signgamp = 0; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_ilogbl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_ilogbl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_ilogbl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_ilogbl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -31,26 +31,24 @@ + + int __ieee754_ilogbl(long double x) + { +- int64_t hx,lx; ++ int64_t hx; + int ix; ++ double xhi; + +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); + hx &= 0x7fffffffffffffffLL; + if(hx <= 0x0010000000000000LL) { +- if((hx|(lx&0x7fffffffffffffffLL))==0) ++ if(hx==0) + return FP_ILOGB0; /* ilogbl(0) = FP_ILOGB0 */ + else /* subnormal x */ +- if(hx==0) { +- for (ix = -1043; lx>0; lx<<=1) ix -=1; +- } else { +- for (ix = -1022, hx<<=11; hx>0; hx<<=1) ix -=1; +- } ++ for (ix = -1022, hx<<=11; hx>0; hx<<=1) ix -=1; + return ix; + } + else if (hx<0x7ff0000000000000LL) return (hx>>52)-0x3ff; + else if (FP_ILOGBNAN != INT_MAX) { + /* ISO C99 requires ilogbl(+-Inf) == INT_MAX. */ +- if (((hx^0x7ff0000000000000LL)|lx) == 0) ++ if (hx==0x7ff0000000000000LL) + return INT_MAX; + } + return FP_ILOGBNAN; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -70,26 +70,25 @@ + long double + __ieee754_jnl (int n, long double x) + { +- u_int32_t se; ++ uint32_t se, lx; + int32_t i, ix, sgn; + long double a, b, temp, di; + long double z, w; +- ieee854_long_double_shape_type u; ++ double xhi; + + + /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x) + * Thus, J(-n,x) = J(n,-x) + */ + +- u.value = x; +- se = u.parts32.w0; ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS (se, lx, xhi); + ix = se & 0x7fffffff; + + /* if J(n,NaN) is NaN */ + if (ix >= 0x7ff00000) + { +- if ((u.parts32.w0 & 0xfffff) | u.parts32.w1 +- | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) ++ if (((ix - 0x7ff00000) | lx) != 0) + return x + x; + } + +@@ -298,21 +297,20 @@ + long double + __ieee754_ynl (int n, long double x) + { +- u_int32_t se; ++ uint32_t se, lx; + int32_t i, ix; + int32_t sign; + long double a, b, temp; +- ieee854_long_double_shape_type u; ++ double xhi; + +- u.value = x; +- se = u.parts32.w0; ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS (se, lx, xhi); + ix = se & 0x7fffffff; + + /* if Y(n,NaN) is NaN */ + if (ix >= 0x7ff00000) + { +- if ((u.parts32.w0 & 0xfffff) | u.parts32.w1 +- | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) ++ if (((ix - 0x7ff00000) | lx) != 0) + return x + x; + } + if (x <= 0.0L) +@@ -377,14 +375,16 @@ + a = __ieee754_y0l (x); + b = __ieee754_y1l (x); + /* quit if b is -inf */ +- u.value = b; +- se = u.parts32.w0 & 0xfff00000; ++ xhi = ldbl_high (b); ++ GET_HIGH_WORD (se, xhi); ++ se &= 0xfff00000; + for (i = 1; i < n && se != 0xfff00000; i++) + { + temp = b; + b = ((long double) (i + i) / x) * b - a; +- u.value = b; +- se = u.parts32.w0 & 0xfff00000; ++ xhi = ldbl_high (b); ++ GET_HIGH_WORD (se, xhi); ++ se &= 0xfff00000; + a = temp; + } + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c 2014-05-27 23:05:55.000000000 -0500 +@@ -182,11 +182,13 @@ + long double z; + long double y; + int e; +- int64_t hx, lx; ++ int64_t hx; ++ double xhi; + + /* Test for domain */ +- GET_LDOUBLE_WORDS64 (hx, lx, x); +- if (((hx & 0x7fffffffffffffffLL) | (lx & 0x7fffffffffffffffLL)) == 0) ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); ++ if ((hx & 0x7fffffffffffffffLL) == 0) + return (-1.0L / (x - x)); + if (hx < 0) + return (x - x) / (x - x); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_logl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_logl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_logl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_logl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -185,18 +185,20 @@ + long double + __ieee754_logl(long double x) + { +- long double z, y, w; +- ieee854_long_double_shape_type u, t; ++ long double z, y, w, t; + unsigned int m; + int k, e; ++ double xhi; ++ uint32_t hx, lx; + +- u.value = x; +- m = u.parts32.w0; ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS (hx, lx, xhi); ++ m = hx; + + /* Check for IEEE special cases. */ + k = m & 0x7fffffff; + /* log(0) = -infinity. */ +- if ((k | u.parts32.w1 | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) == 0) ++ if ((k | lx) == 0) + { + return -0.5L / ZERO; + } +@@ -216,7 +218,7 @@ + { + z = x - 1.0L; + k = 64; +- t.value = 1.0L; ++ t = 1.0L; + e = 0; + } + else +@@ -233,10 +235,8 @@ + k = (m - 0xff000) >> 13; + /* t is the argument 0.5 + (k+26)/128 + of the nearest item to u in the lookup table. */ +- t.parts32.w0 = 0x3ff00000 + (k << 13); +- t.parts32.w1 = 0; +- t.parts32.w2 = 0; +- t.parts32.w3 = 0; ++ INSERT_WORDS (xhi, 0x3ff00000 + (k << 13), 0); ++ t = xhi; + w0 += 0x100000; + e -= 1; + k += 64; +@@ -244,17 +244,15 @@ + else + { + k = (m - 0xfe000) >> 14; +- t.parts32.w0 = 0x3fe00000 + (k << 14); +- t.parts32.w1 = 0; +- t.parts32.w2 = 0; +- t.parts32.w3 = 0; ++ INSERT_WORDS (xhi, 0x3fe00000 + (k << 14), 0); ++ t = xhi; + } +- u.value = __scalbnl (u.value, ((int) ((w0 - u.parts32.w0) * 2)) >> 21); ++ x = __scalbnl (x, ((int) ((w0 - hx) * 2)) >> 21); + /* log(u) = log( t u/t ) = log(t) + log(u/t) + log(t) is tabulated in the lookup table. + Express log(u/t) = log(1+z), where z = u/t - 1 = (u-t)/t. + cf. Cody & Waite. */ +- z = (u.value - t.value) / t.value; ++ z = (x - t) / t; + } + /* Series expansion of log(1+z). */ + w = z * z; +@@ -275,7 +273,7 @@ + y += e * ln2b; /* Base 2 exponent offset times ln(2). */ + y += z; + y += logtbl[k-26]; /* log(t) - (t-1) */ +- y += (t.value - 1.0L); ++ y += (t - 1.0L); + y += e * ln2a; + return y; + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -151,37 +151,32 @@ + long double y1, t1, t2, r, s, t, u, v, w; + long double s2, s_h, s_l, t_h, t_l, ay; + int32_t i, j, k, yisint, n; +- u_int32_t ix, iy; +- int32_t hx, hy; +- ieee854_long_double_shape_type o, p, q; ++ uint32_t ix, iy; ++ int32_t hx, hy, hax; ++ double ohi, xhi, xlo, yhi, ylo; ++ uint32_t lx, ly, lj; + +- p.value = x; +- hx = p.parts32.w0; ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS (hx, lx, xhi); + ix = hx & 0x7fffffff; + +- q.value = y; +- hy = q.parts32.w0; ++ ldbl_unpack (y, &yhi, &ylo); ++ EXTRACT_WORDS (hy, ly, yhi); + iy = hy & 0x7fffffff; + +- + /* y==zero: x**0 = 1 */ +- if ((iy | q.parts32.w1 | (q.parts32.w2 & 0x7fffffff) | q.parts32.w3) == 0) ++ if ((iy | ly) == 0) + return one; + + /* 1.0**y = 1; -1.0**+-Inf = 1 */ + if (x == one) + return one; +- if (x == -1.0L && iy == 0x7ff00000 +- && (q.parts32.w1 | (q.parts32.w2 & 0x7fffffff) | q.parts32.w3) == 0) ++ if (x == -1.0L && ((iy - 0x7ff00000) | ly) == 0) + return one; + + /* +-NaN return x+y */ +- if ((ix > 0x7ff00000) +- || ((ix == 0x7ff00000) +- && ((p.parts32.w1 | (p.parts32.w2 & 0x7fffffff) | p.parts32.w3) != 0)) +- || (iy > 0x7ff00000) +- || ((iy == 0x7ff00000) +- && ((q.parts32.w1 | (q.parts32.w2 & 0x7fffffff) | q.parts32.w3) != 0))) ++ if ((ix >= 0x7ff00000 && ((ix - 0x7ff00000) | lx) != 0) ++ || (iy >= 0x7ff00000 && ((iy - 0x7ff00000) | ly) != 0)) + return x + y; + + /* determine if y is an odd int when x < 0 +@@ -192,7 +187,10 @@ + yisint = 0; + if (hx < 0) + { +- if ((q.parts32.w2 & 0x7fffffff) >= 0x43400000) /* Low part >= 2^53 */ ++ uint32_t low_ye; ++ ++ GET_HIGH_WORD (low_ye, ylo); ++ if ((low_ye & 0x7fffffff) >= 0x43400000) /* Low part >= 2^53 */ + yisint = 2; /* even integer y */ + else if (iy >= 0x3ff00000) /* 1.0 */ + { +@@ -207,42 +205,43 @@ + } + } + ++ ax = fabsl (x); ++ + /* special value of y */ +- if ((q.parts32.w1 | (q.parts32.w2 & 0x7fffffff) | q.parts32.w3) == 0) ++ if (ly == 0) + { +- if (iy == 0x7ff00000 && q.parts32.w1 == 0) /* y is +-inf */ ++ if (iy == 0x7ff00000) /* y is +-inf */ + { +- if (((ix - 0x3ff00000) | p.parts32.w1 +- | (p.parts32.w2 & 0x7fffffff) | p.parts32.w3) == 0) +- return y - y; /* inf**+-1 is NaN */ +- else if (ix > 0x3ff00000 || fabsl (x) > 1.0L) ++ if (ax > one) + /* (|x|>1)**+-inf = inf,0 */ + return (hy >= 0) ? y : zero; + else + /* (|x|<1)**-,+inf = inf,0 */ + return (hy < 0) ? -y : zero; + } +- if (iy == 0x3ff00000) +- { /* y is +-1 */ +- if (hy < 0) +- return one / x; +- else +- return x; +- } +- if (hy == 0x40000000) +- return x * x; /* y is 2 */ +- if (hy == 0x3fe00000) +- { /* y is 0.5 */ +- if (hx >= 0) /* x >= +0 */ +- return __ieee754_sqrtl (x); ++ if (ylo == 0.0) ++ { ++ if (iy == 0x3ff00000) ++ { /* y is +-1 */ ++ if (hy < 0) ++ return one / x; ++ else ++ return x; ++ } ++ if (hy == 0x40000000) ++ return x * x; /* y is 2 */ ++ if (hy == 0x3fe00000) ++ { /* y is 0.5 */ ++ if (hx >= 0) /* x >= +0 */ ++ return __ieee754_sqrtl (x); ++ } + } + } + +- ax = fabsl (x); + /* special value of x */ +- if ((p.parts32.w1 | (p.parts32.w2 & 0x7fffffff) | p.parts32.w3) == 0) ++ if (lx == 0) + { +- if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) ++ if (ix == 0x7ff00000 || ix == 0 || (ix == 0x3ff00000 && xlo == 0.0)) + { + z = ax; /*x is +-0,+-inf,+-1 */ + if (hy < 0) +@@ -294,8 +293,8 @@ + { + ax *= two113; + n -= 113; +- o.value = ax; +- ix = o.parts32.w0; ++ ohi = ldbl_high (ax); ++ GET_HIGH_WORD (ix, ohi); + } + n += ((ix) >> 20) - 0x3ff; + j = ix & 0x000fffff; +@@ -312,26 +311,19 @@ + ix -= 0x00100000; + } + +- o.value = ax; +- o.value = __scalbnl (o.value, ((int) ((ix - o.parts32.w0) * 2)) >> 21); +- ax = o.value; ++ ohi = ldbl_high (ax); ++ GET_HIGH_WORD (hax, ohi); ++ ax = __scalbnl (ax, ((int) ((ix - hax) * 2)) >> 21); + + /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */ + u = ax - bp[k]; /* bp[0]=1.0, bp[1]=1.5 */ + v = one / (ax + bp[k]); + s = u * v; +- s_h = s; ++ s_h = ldbl_high (s); + +- o.value = s_h; +- o.parts32.w3 = 0; +- o.parts32.w2 = 0; +- s_h = o.value; + /* t_h=ax+bp[k] High */ + t_h = ax + bp[k]; +- o.value = t_h; +- o.parts32.w3 = 0; +- o.parts32.w2 = 0; +- t_h = o.value; ++ t_h = ldbl_high (t_h); + t_l = ax - (t_h - bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ +@@ -342,30 +334,21 @@ + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = 3.0 + s2 + r; +- o.value = t_h; +- o.parts32.w3 = 0; +- o.parts32.w2 = 0; +- t_h = o.value; ++ t_h = ldbl_high (t_h); + t_l = r - ((t_h - 3.0) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; +- o.value = p_h; +- o.parts32.w3 = 0; +- o.parts32.w2 = 0; +- p_h = o.value; ++ p_h = ldbl_high (p_h); + p_l = v - (p_h - u); + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l * p_h + p_l * cp + dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (long double) n; + t1 = (((z_h + z_l) + dp_h[k]) + t); +- o.value = t1; +- o.parts32.w3 = 0; +- o.parts32.w2 = 0; +- t1 = o.value; ++ t1 = ldbl_high (t1); + t2 = z_l - (((t1 - t) - dp_h[k]) - z_h); + + /* s (sign of result -ve**odd) = -1 else = 1 */ +@@ -374,21 +357,16 @@ + s = -one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ +- y1 = y; +- o.value = y1; +- o.parts32.w3 = 0; +- o.parts32.w2 = 0; +- y1 = o.value; ++ y1 = ldbl_high (y); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; +- o.value = z; +- j = o.parts32.w0; ++ ohi = ldbl_high (z); ++ EXTRACT_WORDS (j, lj, ohi); + if (j >= 0x40d00000) /* z >= 16384 */ + { + /* if z > 16384 */ +- if (((j - 0x40d00000) | o.parts32.w1 +- | (o.parts32.w2 & 0x7fffffff) | o.parts32.w3) != 0) ++ if (((j - 0x40d00000) | lj) != 0) + return s * huge * huge; /* overflow */ + else + { +@@ -399,8 +377,7 @@ + else if ((j & 0x7fffffff) >= 0x40d01b90) /* z <= -16495 */ + { + /* z < -16495 */ +- if (((j - 0xc0d01bc0) | o.parts32.w1 +- | (o.parts32.w2 & 0x7fffffff) | o.parts32.w3) != 0) ++ if (((j - 0xc0d01bc0) | lj) != 0) + return s * tiny * tiny; /* underflow */ + else + { +@@ -419,10 +396,7 @@ + p_h -= t; + } + t = p_l + p_h; +- o.value = t; +- o.parts32.w3 = 0; +- o.parts32.w2 = 0; +- t = o.value; ++ t = ldbl_high (t); + u = t * lg2_h; + v = (p_l - (t - p_h)) * lg2 + t * lg2_l; + z = u + v; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_tanl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_tanl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_tanl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_tanl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -85,17 +85,17 @@ + __kernel_tanl (long double x, long double y, int iy) + { + long double z, r, v, w, s; +- int32_t ix, sign; +- ieee854_long_double_shape_type u, u1; ++ int32_t ix, sign, hx, lx; ++ double xhi; + +- u.value = x; +- ix = u.parts32.w0 & 0x7fffffff; ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS (hx, lx, xhi); ++ ix = hx & 0x7fffffff; + if (ix < 0x3c600000) /* x < 2**-57 */ + { +- if ((int) x == 0) +- { /* generate inexact */ +- if ((ix | u.parts32.w1 | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3 +- | (iy + 1)) == 0) ++ if ((int) x == 0) /* generate inexact */ ++ { ++ if ((ix | lx | (iy + 1)) == 0) + return one / fabs (x); + else + return (iy == 1) ? x : -one / x; +@@ -103,7 +103,7 @@ + } + if (ix >= 0x3fe59420) /* |x| >= 0.6743316650390625 */ + { +- if ((u.parts32.w0 & 0x80000000) != 0) ++ if ((hx & 0x80000000) != 0) + { + x = -x; + y = -y; +@@ -139,15 +139,13 @@ + { /* if allow error up to 2 ulp, + simply return -1.0/(x+r) here */ + /* compute -1.0/(x+r) accurately */ +- u1.value = w; +- u1.parts32.w2 = 0; +- u1.parts32.w3 = 0; +- v = r - (u1.value - x); /* u1+v = r+x */ ++ long double u1, z1; ++ ++ u1 = ldbl_high (w); ++ v = r - (u1 - x); /* u1+v = r+x */ + z = -1.0 / w; +- u.value = z; +- u.parts32.w2 = 0; +- u.parts32.w3 = 0; +- s = 1.0 + u.value * u1.value; +- return u.value + z * (s + u.value * v); ++ z1 = ldbl_high (z); ++ s = 1.0 + z1 * u1; ++ return z1 + z * (s + z1 * v); + } + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_expm1l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_expm1l.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_expm1l.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_expm1l.c 2014-05-27 23:05:55.000000000 -0500 +@@ -92,19 +92,19 @@ + __expm1l (long double x) + { + long double px, qx, xx; +- int32_t ix, sign; +- ieee854_long_double_shape_type u; ++ int32_t ix, lx, sign; + int k; ++ double xhi; + + /* Detect infinity and NaN. */ +- u.value = x; +- ix = u.parts32.w0; ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS (ix, lx, xhi); + sign = ix & 0x80000000; + ix &= 0x7fffffff; + if (ix >= 0x7ff00000) + { + /* Infinity. */ +- if (((ix & 0xfffff) | u.parts32.w1 | (u.parts32.w2&0x7fffffff) | u.parts32.w3) == 0) ++ if (((ix - 0x7ff00000) | lx) == 0) + { + if (sign) + return -1.0L; +@@ -116,7 +116,7 @@ + } + + /* expm1(+- 0) = +- 0. */ +- if ((ix == 0) && (u.parts32.w1 | (u.parts32.w2&0x7fffffff) | u.parts32.w3) == 0) ++ if ((ix | lx) == 0) + return x; + + /* Overflow. */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -36,16 +36,21 @@ + + long double __frexpl(long double x, int *eptr) + { +- u_int64_t hx, lx, ix, ixl; ++ uint64_t hx, lx, ix, ixl; + int64_t explo; +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ double xhi, xlo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); + ixl = 0x7fffffffffffffffULL&lx; + ix = 0x7fffffffffffffffULL&hx; + *eptr = 0; +- if(ix>=0x7ff0000000000000ULL||((ix|ixl)==0)) return x; /* 0,inf,nan */ ++ if(ix>=0x7ff0000000000000ULL||ix==0) return x; /* 0,inf,nan */ + if (ix<0x0010000000000000ULL) { /* subnormal */ + x *= two107; +- GET_LDOUBLE_MSW64(hx,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); + ix = hx&0x7fffffffffffffffULL; + *eptr = -107; + } +@@ -54,7 +59,7 @@ + if (ixl != 0ULL) { + explo = (ixl>>52) - (ix>>52) + 0x3fe; + if ((ixl&0x7ff0000000000000ULL) == 0LL) { +- /* the lower double is a denomal so we need to correct its ++ /* the lower double is a denormal so we need to correct its + mantissa and perhaps its exponent. */ + int cnt; + +@@ -73,7 +78,9 @@ + lx = 0ULL; + + hx = (hx&0x800fffffffffffffULL) | 0x3fe0000000000000ULL; +- SET_LDOUBLE_WORDS64(x,hx,lx); ++ INSERT_WORDS64 (xhi, hx); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x; + } + #ifdef IS_IN_libm +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -1,6 +1,7 @@ + /* + * __isinf_nsl(x) returns != 0 if x is ±inf, else 0; + * no branching! ++ * slightly dodgy in relying on signed shift right copying sign bit + */ + + #include <math.h> +@@ -9,8 +10,14 @@ + int + __isinf_nsl (long double x) + { +- int64_t hx,lx; +- GET_LDOUBLE_WORDS64(hx,lx,x); +- return !((lx & 0x7fffffffffffffffLL) +- | ((hx & 0x7fffffffffffffffLL) ^ 0x7ff0000000000000LL)); ++ double xhi; ++ int64_t hx, mask; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); ++ ++ mask = (hx & 0x7fffffffffffffffLL) ^ 0x7ff0000000000000LL; ++ mask |= -mask; ++ mask >>= 63; ++ return ~mask; + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinfl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinfl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinfl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinfl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -11,6 +11,7 @@ + /* + * isinfl(x) returns 1 if x is inf, -1 if x is -inf, else 0; + * no branching! ++ * slightly dodgy in relying on signed shift right copying sign bit + */ + + #include <math.h> +@@ -20,12 +21,16 @@ + int + ___isinfl (long double x) + { +- int64_t hx,lx; +- GET_LDOUBLE_WORDS64(hx,lx,x); +- lx = (lx & 0x7fffffffffffffffLL); +- lx |= (hx & 0x7fffffffffffffffLL) ^ 0x7ff0000000000000LL; +- lx |= -lx; +- return ~(lx >> 63) & (hx >> 62); ++ double xhi; ++ int64_t hx, mask; ++ ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (hx, xhi); ++ ++ mask = (hx & 0x7fffffffffffffffLL) ^ 0x7ff0000000000000LL; ++ mask |= -mask; ++ mask >>= 63; ++ return ~mask & (hx >> 62); + } + hidden_ver (___isinfl, __isinfl) + #ifndef IS_IN_libm +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -126,19 +126,18 @@ + __log1pl (long double xm1) + { + long double x, y, z, r, s; +- ieee854_long_double_shape_type u; +- int32_t hx; ++ double xhi; ++ int32_t hx, lx; + int e; + + /* Test for NaN or infinity input. */ +- u.value = xm1; +- hx = u.parts32.w0; ++ xhi = ldbl_high (xm1); ++ EXTRACT_WORDS (hx, lx, xhi); + if (hx >= 0x7ff00000) + return xm1; + + /* log1p(+- 0) = +- 0. */ +- if (((hx & 0x7fffffff) == 0) +- && (u.parts32.w1 | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) == 0) ++ if (((hx & 0x7fffffff) | lx) == 0) + return xm1; + + x = xm1 + 1.0L; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -37,43 +37,54 @@ + { + int64_t i0,i1,j0; + u_int64_t i; +- GET_LDOUBLE_WORDS64(i0,i1,x); ++ double xhi, xlo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (i0, xhi); ++ EXTRACT_WORDS64 (i1, xlo); + i1 &= 0x000fffffffffffffLL; + j0 = ((i0>>52)&0x7ff)-0x3ff; /* exponent of x */ + if(j0<52) { /* integer part in high x */ + if(j0<0) { /* |x|<1 */ + /* *iptr = +-0 */ +- SET_LDOUBLE_WORDS64(*iptr,i0&0x8000000000000000ULL,0); ++ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); ++ *iptr = xhi; + return x; + } else { + i = (0x000fffffffffffffLL)>>j0; + if(((i0&i)|(i1&0x7fffffffffffffffLL))==0) { /* x is integral */ + *iptr = x; + /* return +-0 */ +- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); ++ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); ++ x = xhi; + return x; + } else { +- SET_LDOUBLE_WORDS64(*iptr,i0&(~i),0); ++ INSERT_WORDS64 (xhi, i0&(~i)); ++ *iptr = xhi; + return x - *iptr; + } + } + } else if (j0>103) { /* no fraction part */ + *iptr = x*one; + /* We must handle NaNs separately. */ +- if (j0 == 0x400 && ((i0 & 0x000fffffffffffffLL) | i1)) ++ if ((i0 & 0x7fffffffffffffffLL) > 0x7ff0000000000000LL) + return x*one; + /* return +-0 */ +- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); ++ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); ++ x = xhi; + return x; + } else { /* fraction part in low x */ + i = -1ULL>>(j0-52); + if((i1&i)==0) { /* x is integral */ + *iptr = x; + /* return +-0 */ +- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); ++ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); ++ x = xhi; + return x; + } else { +- SET_LDOUBLE_WORDS64(*iptr,i0,i1&(~i)); ++ INSERT_WORDS64 (xhi, i0); ++ INSERT_WORDS64 (xlo, i1&(~i)); ++ *iptr = ldbl_pack (xhi, xlo); + return x - *iptr; + } + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -30,27 +30,28 @@ + + long double __nextafterl(long double x, long double y) + { +- int64_t hx,hy,ihx,ihy,ilx; +- u_int64_t lx; +- u_int64_t ly __attribute__ ((unused)); ++ int64_t hx,hy,ihx,ihy; ++ uint64_t lx; ++ double xhi, xlo, yhi; + +- GET_LDOUBLE_WORDS64(hx,lx,x); +- GET_LDOUBLE_WORDS64(hy,ly,y); ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); ++ yhi = ldbl_high (y); ++ EXTRACT_WORDS64 (hy, yhi); + ihx = hx&0x7fffffffffffffffLL; /* |hx| */ +- ilx = lx&0x7fffffffffffffffLL; /* |lx| */ + ihy = hy&0x7fffffffffffffffLL; /* |hy| */ + +- if((((ihx&0x7ff0000000000000LL)==0x7ff0000000000000LL)&& +- ((ihx&0x000fffffffffffffLL)!=0)) || /* x is nan */ +- (((ihy&0x7ff0000000000000LL)==0x7ff0000000000000LL)&& +- ((ihy&0x000fffffffffffffLL)!=0))) /* y is nan */ ++ if((ihx>0x7ff0000000000000LL) || /* x is nan */ ++ (ihy>0x7ff0000000000000LL)) /* y is nan */ + return x+y; /* signal the nan */ + if(x==y) + return y; /* x=y, return y */ +- if(ihx == 0 && ilx == 0) { /* x == 0 */ +- long double u; ++ if(ihx == 0) { /* x == 0 */ ++ long double u; /* return +-minsubnormal */ + hy = (hy & 0x8000000000000000ULL) | 1; +- SET_LDOUBLE_WORDS64(x,hy,0ULL);/* return +-minsubnormal */ ++ INSERT_WORDS64 (yhi, hy); ++ x = yhi; + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ +@@ -59,10 +60,16 @@ + + long double u; + if(x > y) { /* x > y, x -= ulp */ ++ /* This isn't the largest magnitude correctly rounded ++ long double as you can see from the lowest mantissa ++ bit being zero. It is however the largest magnitude ++ long double with a 106 bit mantissa, and nextafterl ++ is insane with variable precision. So to make ++ nextafterl sane we assume 106 bit precision. */ + if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) + return x+x; /* overflow, return -inf */ + if (hx >= 0x7ff0000000000000LL) { +- SET_LDOUBLE_WORDS64(u,0x7fefffffffffffffLL,0x7c8ffffffffffffeLL); ++ u = 0x1.fffffffffffff7ffffffffffff8p+1023L; + return u; + } + if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ +@@ -77,16 +84,19 @@ + return x; + } + if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ +- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); ++ INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); ++ u = yhi; + u *= 0x1.0000000000000p-105L; +- } else +- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); ++ } else { ++ INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); ++ u = yhi; ++ } + return x - u; + } else { /* x < y, x += ulp */ + if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) + return x+x; /* overflow, return +inf */ +- if ((u_int64_t) hx >= 0xfff0000000000000ULL) { +- SET_LDOUBLE_WORDS64(u,0xffefffffffffffffLL,0xfc8ffffffffffffeLL); ++ if ((uint64_t) hx >= 0xfff0000000000000ULL) { ++ u = -0x1.fffffffffffff7ffffffffffff8p+1023L; + return u; + } + if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ +@@ -103,10 +113,13 @@ + return x; + } + if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ +- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); ++ INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); ++ u = yhi; + u *= 0x1.0000000000000p-105L; +- } else +- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); ++ } else { ++ INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); ++ u = yhi; ++ } + return x + u; + } + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c 2014-05-27 23:10:26.000000000 -0500 +@@ -34,23 +34,23 @@ + { + int32_t hx,ix; + int64_t hy,iy; +- u_int32_t lx; +- u_int64_t ly,uly; ++ uint32_t lx; ++ double yhi; ++ + + EXTRACT_WORDS(hx,lx,x); +- GET_LDOUBLE_WORDS64(hy,ly,y); ++ yhi = ldbl_high (y); ++ EXTRACT_WORDS64(hy,yhi); + ix = hx&0x7fffffff; /* |x| */ + iy = hy&0x7fffffffffffffffLL; /* |y| */ +- uly = ly&0x7fffffffffffffffLL; /* |y| */ + + if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */ +- ((iy>=0x7ff0000000000000LL)&&((iy-0x7ff0000000000000LL)|uly)!=0)) +- /* y is nan */ ++ iy>0x7ff0000000000000LL) /* y is nan */ + return x+y; + if((long double) x==y) return y; /* x=y, return y */ + if((ix|lx)==0) { /* x == 0 */ + double u; +- INSERT_WORDS(x,(u_int32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ ++ INSERT_WORDS(x,(uint32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c 2014-05-27 23:05:55.000000000 -0500 +@@ -27,16 +27,16 @@ + { + int32_t hx,ix; + int64_t hy,iy; +- u_int64_t ly, uly; ++ double yhi; + + GET_FLOAT_WORD(hx,x); +- GET_LDOUBLE_WORDS64(hy,ly,y); ++ yhi = ldbl_high (y); ++ EXTRACT_WORDS64 (hy, yhi); + ix = hx&0x7fffffff; /* |x| */ + iy = hy&0x7fffffffffffffffLL; /* |y| */ +- uly = ly&0x7fffffffffffffffLL; /* |y| */ + + if((ix>0x7f800000) || /* x is nan */ +- ((iy>=0x7ff0000000000000LL)&&((iy-0x7ff0000000000000LL)|uly)!=0)) ++ (iy>0x7ff0000000000000LL)) + /* y is nan */ + return x+y; + if((long double) x==y) return y; /* x=y, return y */ +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c 2014-05-27 23:05:55.000000000 -0500 +@@ -33,20 +33,24 @@ + int64_t hx,hy; + u_int64_t sx,lx,ly,qs; + int cquo; ++ double xhi, xlo, yhi, ylo; + +- GET_LDOUBLE_WORDS64 (hx, lx, x); +- GET_LDOUBLE_WORDS64 (hy, ly, y); ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); ++ ldbl_unpack (y, &yhi, &ylo); ++ EXTRACT_WORDS64 (hy, yhi); ++ EXTRACT_WORDS64 (ly, ylo); + sx = hx & 0x8000000000000000ULL; + qs = sx ^ (hy & 0x8000000000000000ULL); + hy &= 0x7fffffffffffffffLL; + hx &= 0x7fffffffffffffffLL; + + /* Purge off exception values. */ +- if ((hy | (ly & 0x7fffffffffffffff)) == 0) ++ if (hy == 0) + return (x * y) / (x * y); /* y = 0 */ + if ((hx >= 0x7ff0000000000000LL) /* x not finite */ +- || ((hy >= 0x7ff0000000000000LL) /* y is NaN */ +- && (((hy - 0x7ff0000000000000LL) | ly) != 0))) ++ || (hy > 0x7ff0000000000000LL)) /* y is NaN */ + return (x * y) / (x * y); + + if (hy <= 0x7fbfffffffffffffLL) +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c 2014-05-27 23:15:30.000000000 -0500 +@@ -41,11 +41,15 @@ + { + int64_t k,l,hx,lx; + union { int64_t i; double d; } u; +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ double xhi, xlo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); + k = (hx>>52)&0x7ff; /* extract exponent */ + l = (lx>>52)&0x7ff; + if (k==0) { /* 0 or subnormal x */ +- if (((hx|lx)&0x7fffffffffffffffULL)==0) return x; /* +-0 */ ++ if ((hx&0x7fffffffffffffffULL)==0) return x; /* +-0 */ + u.i = hx; + u.d *= two54; + hx = u.i; +@@ -61,7 +65,9 @@ + if (k > 0) { /* normal result */ + hx = (hx&0x800fffffffffffffULL)|(k<<52); + if ((lx & 0x7fffffffffffffffULL) == 0) { /* low part +-0 */ +- SET_LDOUBLE_WORDS64(x,hx,lx); ++ INSERT_WORDS64 (xhi, hx); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x; + } + if (l == 0) { /* low part subnormal */ +@@ -81,14 +87,19 @@ + u.d *= twom54; + lx = u.i; + } +- SET_LDOUBLE_WORDS64(x,hx,lx); ++ INSERT_WORDS64 (xhi, hx); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x; + } + if (k <= -54) + return tiny*__copysignl(tiny,x); /*underflow*/ + k += 54; /* subnormal result */ + lx &= 0x8000000000000000ULL; +- SET_LDOUBLE_WORDS64(x,(hx&0x800fffffffffffffULL)|(k<<52),lx); ++ hx &= 0x800fffffffffffffULL; ++ INSERT_WORDS64 (xhi, hx|(k<<52)); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x*twolm54; + } + long_double_symbol (libm, __scalblnl, scalblnl); +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c 2014-05-27 23:16:25.000000000 -0500 +@@ -41,11 +41,15 @@ + { + int64_t k,l,hx,lx; + union { int64_t i; double d; } u; +- GET_LDOUBLE_WORDS64(hx,lx,x); ++ double xhi, xlo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); + k = (hx>>52)&0x7ff; /* extract exponent */ + l = (lx>>52)&0x7ff; + if (k==0) { /* 0 or subnormal x */ +- if (((hx|lx)&0x7fffffffffffffffULL)==0) return x; /* +-0 */ ++ if ((hx&0x7fffffffffffffffULL)==0) return x; /* +-0 */ + u.i = hx; + u.d *= two54; + hx = u.i; +@@ -61,7 +65,9 @@ + if (k > 0) { /* normal result */ + hx = (hx&0x800fffffffffffffULL)|(k<<52); + if ((lx & 0x7fffffffffffffffULL) == 0) { /* low part +-0 */ +- SET_LDOUBLE_WORDS64(x,hx,lx); ++ INSERT_WORDS64 (xhi, hx); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x; + } + if (l == 0) { /* low part subnormal */ +@@ -81,14 +87,19 @@ + u.d *= twom54; + lx = u.i; + } +- SET_LDOUBLE_WORDS64(x,hx,lx); ++ INSERT_WORDS64 (xhi, hx); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x; + } + if (k <= -54) + return tiny*__copysignl(tiny,x); /*underflow*/ + k += 54; /* subnormal result */ + lx &= 0x8000000000000000ULL; +- SET_LDOUBLE_WORDS64(x,(hx&0x800fffffffffffffULL)|(k<<52),lx); ++ hx &= 0x800fffffffffffffULL; ++ INSERT_WORDS64 (xhi, hx|(k<<52)); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); + return x*twolm54; + } + #ifdef IS_IN_libm +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c 2014-05-27 23:05:55.000000000 -0500 +@@ -47,10 +47,12 @@ + long double __tanhl(long double x) + { + long double t,z; +- int64_t jx,ix,lx; ++ int64_t jx,ix; ++ double xhi; + + /* High word of |x|. */ +- GET_LDOUBLE_WORDS64(jx,lx,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (jx, xhi); + ix = jx&0x7fffffffffffffffLL; + + /* x is INF or NaN */ +@@ -61,7 +63,7 @@ + + /* |x| < 22 */ + if (ix < 0x4036000000000000LL) { /* |x|<22 */ +- if ((ix | (lx&0x7fffffffffffffffLL)) == 0) ++ if (ix == 0) + return x; /* x == +-0 */ + if (ix<0x3c60000000000000LL) /* |x|<2**-57 */ + return x*(one+x); /* tanh(small) = small */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-05-27 23:05:51.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-05-27 23:08:26.000000000 -0500 +@@ -2641,6 +2641,9 @@ + ifloat: 1 + ildouble: 2 + ldouble: 2 ++Test "tan_towardzero (2)": ++ildouble: 1 ++ldouble: 1 + Test "tan_towardzero (3) == -0.1425465430742778052956354105339134932261": + float: 1 + ifloat: 1 diff --git a/SOURCES/glibc-ppc64le-09.patch b/SOURCES/glibc-ppc64le-09.patch new file mode 100644 index 0000000..969d3a1 --- /dev/null +++ b/SOURCES/glibc-ppc64le-09.patch @@ -0,0 +1,567 @@ +# commit 650ef4bd7976e36831cba22d838b567d3b5f6e8f +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:25:51 2013 +0930 +# +# PowerPC floating point little-endian [4 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00084.html +# +# Another batch of ieee854 macros and union replacement. These four +# files also have bugs fixed with this patch. The fact that the two +# doubles in an IBM long double may have different signs means that +# negation and absolute value operations can't just twiddle one sign bit +# as you can with ieee864 style extended double. fmodl, remainderl, +# erfl and erfcl all had errors of this type. erfl also returned +1 for +# large magnitude negative input where it should return -1. The hypotl +# error is innocuous since the value adjusted twice is only used as a +# flag. The e_hypotl.c tests for large "a" and small "b" are mutually +# exclusive because we've already exited when x/y > 2**120. That allows +# some further small simplifications. +# +# [BZ #15734], [BZ #15735] +# * sysdeps/ieee754/ldbl-128ibm/e_fmodl.c (__ieee754_fmodl): Rewrite +# all uses of ieee875 long double macros and unions. Simplify test +# for 0.0L. Correct |x|<|y| and |x|=|y| test. Use +# ldbl_extract_mantissa value for ix,iy exponents. Properly +# normalize after ldbl_extract_mantissa, and don't add hidden bit +# already handled. Don't treat low word of ieee854 mantissa like +# low word of IBM long double and mask off bit when testing for +# zero. +# * sysdeps/ieee754/ldbl-128ibm/e_hypotl.c (__ieee754_hypotl): Rewrite +# all uses of ieee875 long double macros and unions. Simplify tests +# for 0.0L and inf. Correct double adjustment of k. Delete dead code +# adjusting ha,hb. Simplify code setting kld. Delete two600 and +# two1022, instead use their values. Recognise that tests for large +# "a" and small "b" are mutually exclusive. Rename vars. Comment. +# * sysdeps/ieee754/ldbl-128ibm/e_remainderl.c (__ieee754_remainderl): +# Rewrite all uses of ieee875 long double macros and unions. Simplify +# test for 0.0L and nan. Correct negation. +# * sysdeps/ieee754/ldbl-128ibm/s_erfl.c (__erfl): Rewrite all uses of +# ieee875 long double macros and unions. Correct output for large +# magnitude x. Correct absolute value calculation. +# (__erfcl): Likewise. +# * math/libm-test.inc: Add tests for errors discovered in IBM long +# double versions of fmodl, remainderl, erfl and erfcl. +# +diff -urN glibc-2.17-c758a686/math/libm-test.inc glibc-2.17-c758a686/math/libm-test.inc +--- glibc-2.17-c758a686/math/libm-test.inc 2014-05-27 20:02:29.000000000 -0500 ++++ glibc-2.17-c758a686/math/libm-test.inc 2014-05-27 20:09:59.000000000 -0500 +@@ -4040,6 +4040,10 @@ + TEST_f_f (erf, 2.0L, 0.995322265018952734162069256367252929L); + TEST_f_f (erf, 4.125L, 0.999999994576599200434933994687765914L); + TEST_f_f (erf, 27.0L, 1.0L); ++#if defined TEST_LDOUBLE && LDBL_MANT_DIG >= 54 ++ /* The input is not exactly representable as a double. */ ++ TEST_f_f (erf, -0x1.fffffffffffff8p-2L, -0.5204998778130465132916303345518417673509L); ++#endif + + END (erf); + } +@@ -4071,6 +4075,10 @@ + TEST_f_f (erfc, 0x1.ffa002p+2L, 1.233585992097580296336099501489175967033e-29L); + TEST_f_f (erfc, 0x1.ffffc8p+2L, 1.122671365033056305522366683719541099329e-29L); + #ifdef TEST_LDOUBLE ++# if LDBL_MANT_DIG >= 54 ++ /* The input is not exactly representable as a double. */ ++ TEST_f_f (erfc, -0x1.fffffffffffff8p-2L, 1.52049987781304651329163033455184176735L); ++# endif + /* The result can only be represented in long double. */ + # if LDBL_MIN_10_EXP < -319 + TEST_f_f (erfc, 27.0L, 0.523704892378925568501606768284954709e-318L); +@@ -5634,6 +5642,13 @@ + #if defined TEST_LDOUBLE && LDBL_MIN_EXP <= -16381 + TEST_ff_f (fmod, 0x0.fffffffffffffffep-16382L, 0x1p-16445L, plus_zero); + #endif ++#if defined TEST_LDOUBLE && LDBL_MANT_DIG >= 56 ++ TEST_ff_f (fmod, -0x1.00000000000004p+0L, 0x1.fffffffffffff8p-1L, -0x1p-53L); ++ TEST_ff_f (fmod, 0x1.fffffffffffffap-1L, 0x1.fffffffffffff8p-1L, 0x1p-56L); ++ TEST_ff_f (fmod, -0x1.fffffffffffffap-1L, 0x1.fffffffffffff8p-1L, -0x1p-56L); ++ TEST_ff_f (fmod, 0x1.fffffffffffffap-1L, -0x1.fffffffffffff8p-1L, 0x1p-56L); ++ TEST_ff_f (fmod, -0x1.fffffffffffffap-1L, -0x1.fffffffffffff8p-1L, -0x1p-56L); ++#endif + + END (fmod); + } +@@ -8642,6 +8657,9 @@ + TEST_ff_f (remainder, -1.625, -1.0, 0.375); + TEST_ff_f (remainder, 5.0, 2.0, 1.0); + TEST_ff_f (remainder, 3.0, 2.0, -1.0); ++#if defined TEST_LDOUBLE && LDBL_MANT_DIG >= 56 ++ TEST_ff_f (remainder, -0x1.80000000000002p1L, 2.0, 0x1.fffffffffffff8p-1L); ++#endif + + END (remainder); + } +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c 2014-05-27 20:02:27.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c 2014-05-27 20:04:08.000000000 -0500 +@@ -27,76 +27,83 @@ + long double + __ieee754_fmodl (long double x, long double y) + { +- int64_t n,hx,hy,hz,ix,iy,sx, i; +- u_int64_t lx,ly,lz; +- int temp; +- +- GET_LDOUBLE_WORDS64(hx,lx,x); +- GET_LDOUBLE_WORDS64(hy,ly,y); ++ int64_t hx, hy, hz, sx, sy; ++ uint64_t lx, ly, lz; ++ int n, ix, iy; ++ double xhi, xlo, yhi, ylo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); ++ ldbl_unpack (y, &yhi, &ylo); ++ EXTRACT_WORDS64 (hy, yhi); ++ EXTRACT_WORDS64 (ly, ylo); + sx = hx&0x8000000000000000ULL; /* sign of x */ +- hx ^=sx; /* |x| */ +- hy &= 0x7fffffffffffffffLL; /* |y| */ ++ hx ^= sx; /* |x| */ ++ sy = hy&0x8000000000000000ULL; /* sign of y */ ++ hy ^= sy; /* |y| */ + + /* purge off exception values */ +- if(__builtin_expect((hy|(ly&0x7fffffffffffffff))==0 || ++ if(__builtin_expect(hy==0 || + (hx>=0x7ff0000000000000LL)|| /* y=0,or x not finite */ + (hy>0x7ff0000000000000LL),0)) /* or y is NaN */ + return (x*y)/(x*y); +- if(__builtin_expect(hx<=hy,0)) { +- if((hx<hy)||(lx<ly)) return x; /* |x|<|y| return x */ +- if(lx==ly) +- return Zero[(u_int64_t)sx>>63]; /* |x|=|y| return x*0*/ ++ if (__builtin_expect (hx <= hy, 0)) ++ { ++ /* If |x| < |y| return x. */ ++ if (hx < hy) ++ return x; ++ /* At this point the absolute value of the high doubles of ++ x and y must be equal. */ ++ /* If the low double of y is the same sign as the high ++ double of y (ie. the low double increases |y|)... */ ++ if (((ly ^ sy) & 0x8000000000000000LL) == 0 ++ /* ... then a different sign low double to high double ++ for x or same sign but lower magnitude... */ ++ && (int64_t) (lx ^ sx) < (int64_t) (ly ^ sy)) ++ /* ... means |x| < |y|. */ ++ return x; ++ /* If the low double of x differs in sign to the high ++ double of x (ie. the low double decreases |x|)... */ ++ if (((lx ^ sx) & 0x8000000000000000LL) != 0 ++ /* ... then a different sign low double to high double ++ for y with lower magnitude (we've already caught ++ the same sign for y case above)... */ ++ && (int64_t) (lx ^ sx) > (int64_t) (ly ^ sy)) ++ /* ... means |x| < |y|. */ ++ return x; ++ /* If |x| == |y| return x*0. */ ++ if ((lx ^ sx) == (ly ^ sy)) ++ return Zero[(uint64_t) sx >> 63]; + } + +- /* determine ix = ilogb(x) */ +- if(__builtin_expect(hx<0x0010000000000000LL,0)) { /* subnormal x */ +- if(hx==0) { +- for (ix = -1043, i=lx; i>0; i<<=1) ix -=1; +- } else { +- for (ix = -1022, i=(hx<<11); i>0; i<<=1) ix -=1; +- } +- } else ix = (hx>>52)-0x3ff; +- +- /* determine iy = ilogb(y) */ +- if(__builtin_expect(hy<0x0010000000000000LL,0)) { /* subnormal y */ +- if(hy==0) { +- for (iy = -1043, i=ly; i>0; i<<=1) iy -=1; +- } else { +- for (iy = -1022, i=(hy<<11); i>0; i<<=1) iy -=1; +- } +- } else iy = (hy>>52)-0x3ff; +- + /* Make the IBM extended format 105 bit mantissa look like the ieee854 112 + bit mantissa so the following operations will give the correct + result. */ +- ldbl_extract_mantissa(&hx, &lx, &temp, x); +- ldbl_extract_mantissa(&hy, &ly, &temp, y); ++ ldbl_extract_mantissa(&hx, &lx, &ix, x); ++ ldbl_extract_mantissa(&hy, &ly, &iy, y); + +- /* set up {hx,lx}, {hy,ly} and align y to x */ +- if(__builtin_expect(ix >= -1022, 1)) +- hx = 0x0001000000000000LL|(0x0000ffffffffffffLL&hx); +- else { /* subnormal x, shift x to normal */ +- n = -1022-ix; +- if(n<=63) { +- hx = (hx<<n)|(lx>>(64-n)); +- lx <<= n; +- } else { +- hx = lx<<(n-64); +- lx = 0; +- } +- } +- if(__builtin_expect(iy >= -1022, 1)) +- hy = 0x0001000000000000LL|(0x0000ffffffffffffLL&hy); +- else { /* subnormal y, shift y to normal */ +- n = -1022-iy; +- if(n<=63) { +- hy = (hy<<n)|(ly>>(64-n)); +- ly <<= n; +- } else { +- hy = ly<<(n-64); +- ly = 0; +- } +- } ++ if (__builtin_expect (ix == -IEEE754_DOUBLE_BIAS, 0)) ++ { ++ /* subnormal x, shift x to normal. */ ++ while ((hx & (1LL << 48)) == 0) ++ { ++ hx = (hx << 1) | (lx >> 63); ++ lx = lx << 1; ++ ix -= 1; ++ } ++ } ++ ++ if (__builtin_expect (iy == -IEEE754_DOUBLE_BIAS, 0)) ++ { ++ /* subnormal y, shift y to normal. */ ++ while ((hy & (1LL << 48)) == 0) ++ { ++ hy = (hy << 1) | (ly >> 63); ++ ly = ly << 1; ++ iy -= 1; ++ } ++ } + + /* fix point fmod */ + n = ix - iy; +@@ -104,7 +111,7 @@ + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1; + if(hz<0){hx = hx+hx+(lx>>63); lx = lx+lx;} + else { +- if((hz|(lz&0x7fffffffffffffff))==0) /* return sign(x)*0 */ ++ if((hz|lz)==0) /* return sign(x)*0 */ + return Zero[(u_int64_t)sx>>63]; + hx = hz+hz+(lz>>63); lx = lz+lz; + } +@@ -113,7 +120,7 @@ + if(hz>=0) {hx=hz;lx=lz;} + + /* convert back to floating value and restore the sign */ +- if((hx|(lx&0x7fffffffffffffff))==0) /* return sign(x)*0 */ ++ if((hx|lx)==0) /* return sign(x)*0 */ + return Zero[(u_int64_t)sx>>63]; + while(hx<0x0001000000000000LL) { /* normalize x */ + hx = hx+hx+(lx>>63); lx = lx+lx; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c 2014-05-27 20:02:27.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c 2014-05-27 20:04:08.000000000 -0500 +@@ -45,76 +45,84 @@ + #include <math.h> + #include <math_private.h> + +-static const long double two600 = 0x1.0p+600L; +-static const long double two1022 = 0x1.0p+1022L; +- + long double + __ieee754_hypotl(long double x, long double y) + { +- long double a,b,t1,t2,y1,y2,w,kld; ++ long double a,b,a1,a2,b1,b2,w,kld; + int64_t j,k,ha,hb; ++ double xhi, yhi, hi, lo; + +- GET_LDOUBLE_MSW64(ha,x); ++ xhi = ldbl_high (x); ++ EXTRACT_WORDS64 (ha, xhi); ++ yhi = ldbl_high (y); ++ EXTRACT_WORDS64 (hb, yhi); + ha &= 0x7fffffffffffffffLL; +- GET_LDOUBLE_MSW64(hb,y); + hb &= 0x7fffffffffffffffLL; + if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;} + a = fabsl(a); /* a <- |a| */ + b = fabsl(b); /* b <- |b| */ +- if((ha-hb)>0x780000000000000LL) {return a+b;} /* x/y > 2**120 */ ++ if((ha-hb)>0x0780000000000000LL) {return a+b;} /* x/y > 2**120 */ + k=0; + kld = 1.0L; + if(ha > 0x5f30000000000000LL) { /* a>2**500 */ + if(ha >= 0x7ff0000000000000LL) { /* Inf or NaN */ +- u_int64_t low; + w = a+b; /* for sNaN */ +- GET_LDOUBLE_LSW64(low,a); +- if(((ha&0xfffffffffffffLL)|(low&0x7fffffffffffffffLL))==0) ++ if(ha == 0x7ff0000000000000LL) + w = a; +- GET_LDOUBLE_LSW64(low,b); +- if(((hb^0x7ff0000000000000LL)|(low&0x7fffffffffffffffLL))==0) ++ if(hb == 0x7ff0000000000000LL) + w = b; + return w; + } + /* scale a and b by 2**-600 */ +- ha -= 0x2580000000000000LL; hb -= 0x2580000000000000LL; k += 600; +- a /= two600; +- b /= two600; +- k += 600; +- kld = two600; ++ a *= 0x1p-600L; ++ b *= 0x1p-600L; ++ k = 600; ++ kld = 0x1p+600L; + } +- if(hb < 0x23d0000000000000LL) { /* b < 2**-450 */ ++ else if(hb < 0x23d0000000000000LL) { /* b < 2**-450 */ + if(hb <= 0x000fffffffffffffLL) { /* subnormal b or 0 */ +- u_int64_t low; +- GET_LDOUBLE_LSW64(low,b); +- if((hb|(low&0x7fffffffffffffffLL))==0) return a; +- t1=two1022; /* t1=2^1022 */ +- b *= t1; +- a *= t1; +- k -= 1022; +- kld = kld / two1022; ++ if(hb==0) return a; ++ a *= 0x1p+1022L; ++ b *= 0x1p+1022L; ++ k = -1022; ++ kld = 0x1p-1022L; + } else { /* scale a and b by 2^600 */ +- ha += 0x2580000000000000LL; /* a *= 2^600 */ +- hb += 0x2580000000000000LL; /* b *= 2^600 */ +- k -= 600; +- a *= two600; +- b *= two600; +- kld = kld / two600; ++ a *= 0x1p+600L; ++ b *= 0x1p+600L; ++ k = -600; ++ kld = 0x1p-600L; + } + } + /* medium size a and b */ + w = a-b; + if (w>b) { +- SET_LDOUBLE_WORDS64(t1,ha,0); +- t2 = a-t1; +- w = __ieee754_sqrtl(t1*t1-(b*(-b)-t2*(a+t1))); ++ ldbl_unpack (a, &hi, &lo); ++ a1 = hi; ++ a2 = lo; ++ /* a*a + b*b ++ = (a1+a2)*a + b*b ++ = a1*a + a2*a + b*b ++ = a1*(a1+a2) + a2*a + b*b ++ = a1*a1 + a1*a2 + a2*a + b*b ++ = a1*a1 + a2*(a+a1) + b*b */ ++ w = __ieee754_sqrtl(a1*a1-(b*(-b)-a2*(a+a1))); + } else { + a = a+a; +- SET_LDOUBLE_WORDS64(y1,hb,0); +- y2 = b - y1; +- SET_LDOUBLE_WORDS64(t1,ha+0x0010000000000000LL,0); +- t2 = a - t1; +- w = __ieee754_sqrtl(t1*y1-(w*(-w)-(t1*y2+t2*b))); ++ ldbl_unpack (b, &hi, &lo); ++ b1 = hi; ++ b2 = lo; ++ ldbl_unpack (a, &hi, &lo); ++ a1 = hi; ++ a2 = lo; ++ /* a*a + b*b ++ = a*a + (a-b)*(a-b) - (a-b)*(a-b) + b*b ++ = a*a + w*w - (a*a - 2*a*b + b*b) + b*b ++ = w*w + 2*a*b ++ = w*w + (a1+a2)*b ++ = w*w + a1*b + a2*b ++ = w*w + a1*(b1+b2) + a2*b ++ = w*w + a1*b1 + a1*b2 + a2*b */ ++ w = __ieee754_sqrtl(a1*b1-(w*(-w)-(a1*b2+a2*b))); + } + if(k!=0) + return w*kld; +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c 2014-05-27 20:02:27.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c 2014-05-27 20:04:08.000000000 -0500 +@@ -33,18 +33,22 @@ + int64_t hx,hp; + u_int64_t sx,lx,lp; + long double p_half; ++ double xhi, xlo, phi, plo; + +- GET_LDOUBLE_WORDS64(hx,lx,x); +- GET_LDOUBLE_WORDS64(hp,lp,p); ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); ++ ldbl_unpack (p, &phi, &plo); ++ EXTRACT_WORDS64 (hp, phi); ++ EXTRACT_WORDS64 (lp, plo); + sx = hx&0x8000000000000000ULL; + hp &= 0x7fffffffffffffffLL; + hx &= 0x7fffffffffffffffLL; + + /* purge off exception values */ +- if((hp|(lp&0x7fffffffffffffff))==0) return (x*p)/(x*p); /* p = 0 */ ++ if(hp==0) return (x*p)/(x*p); /* p = 0 */ + if((hx>=0x7ff0000000000000LL)|| /* x not finite */ +- ((hp>=0x7ff0000000000000LL)&& /* p is NaN */ +- (((hp-0x7ff0000000000000LL)|lp)!=0))) ++ (hp>0x7ff0000000000000LL)) /* p is NaN */ + return (x*p)/(x*p); + + +@@ -64,8 +68,8 @@ + if(x>=p_half) x -= p; + } + } +- GET_LDOUBLE_MSW64(hx,x); +- SET_LDOUBLE_MSW64(x,hx^sx); ++ if (sx) ++ x = -x; + return x; + } + strong_alias (__ieee754_remainderl, __remainderl_finite) +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_erfl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_erfl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_erfl.c 2014-05-27 20:02:27.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_erfl.c 2014-05-27 20:04:08.000000000 -0500 +@@ -760,16 +760,16 @@ + __erfl (long double x) + { + long double a, y, z; +- int32_t i, ix, sign; +- ieee854_long_double_shape_type u; ++ int32_t i, ix, hx; ++ double xhi; + +- u.value = x; +- sign = u.parts32.w0; +- ix = sign & 0x7fffffff; ++ xhi = ldbl_high (x); ++ GET_HIGH_WORD (hx, xhi); ++ ix = hx & 0x7fffffff; + + if (ix >= 0x7ff00000) + { /* erf(nan)=nan */ +- i = ((sign & 0xfff00000) >> 31) << 1; ++ i = ((uint32_t) hx >> 31) << 1; + return (long double) (1 - i) + one / x; /* erf(+-inf)=+-1 */ + } + +@@ -778,7 +778,7 @@ + if (ix >= 0x4039A0DE) + { + /* __erfcl (x) underflows if x > 25.6283 */ +- if (sign) ++ if ((hx & 0x80000000) == 0) + return one-tiny; + else + return tiny-one; +@@ -789,8 +789,9 @@ + return (one - y); + } + } +- u.parts32.w0 = ix; +- a = u.value; ++ a = x; ++ if ((hx & 0x80000000) != 0) ++ a = -a; + z = x * x; + if (ix < 0x3fec0000) /* a < 0.875 */ + { +@@ -814,7 +815,7 @@ + y = erf_const + neval (a, TN2, NTN2) / deval (a, TD2, NTD2); + } + +- if (sign & 0x80000000) /* x < 0 */ ++ if (hx & 0x80000000) /* x < 0 */ + y = -y; + return( y ); + } +@@ -824,18 +825,18 @@ + __erfcl (long double x) + { + long double y, z, p, r; +- int32_t i, ix, sign; +- ieee854_long_double_shape_type u; +- +- u.value = x; +- sign = u.parts32.w0; +- ix = sign & 0x7fffffff; +- u.parts32.w0 = ix; ++ int32_t i, ix; ++ uint32_t hx; ++ double xhi; ++ ++ xhi = ldbl_high (x); ++ GET_HIGH_WORD (hx, xhi); ++ ix = hx & 0x7fffffff; + + if (ix >= 0x7ff00000) + { /* erfc(nan)=nan */ + /* erfc(+-inf)=0,2 */ +- return (long double) (((u_int32_t) sign >> 31) << 1) + one / x; ++ return (long double) ((hx >> 31) << 1) + one / x; + } + + if (ix < 0x3fd00000) /* |x| <1/4 */ +@@ -846,7 +847,8 @@ + } + if (ix < 0x3ff40000) /* 1.25 */ + { +- x = u.value; ++ if ((hx & 0x80000000) != 0) ++ x = -x; + i = 8.0 * x; + switch (i) + { +@@ -891,7 +893,7 @@ + y += C20a; + break; + } +- if (sign & 0x80000000) ++ if (hx & 0x80000000) + y = 2.0L - y; + return y; + } +@@ -899,10 +901,11 @@ + if (ix < 0x405ac000) + { + /* x < -9 */ +- if ((ix >= 0x40220000) && (sign & 0x80000000)) ++ if (hx >= 0xc0220000) + return two - tiny; + +- x = fabsl (x); ++ if ((hx & 0x80000000) != 0) ++ x = -x; + z = one / (x * x); + i = 8.0 / x; + switch (i) +@@ -933,21 +936,17 @@ + p = neval (z, RNr8, NRNr8) / deval (z, RDr8, NRDr8); + break; + } +- u.value = x; +- u.parts32.w3 = 0; +- u.parts32.w2 = 0; +- u.parts32.w1 &= 0xf8000000; +- z = u.value; ++ z = (float) x; + r = __ieee754_expl (-z * z - 0.5625) * + __ieee754_expl ((z - x) * (z + x) + p); +- if ((sign & 0x80000000) == 0) ++ if ((hx & 0x80000000) == 0) + return r / x; + else + return two - r / x; + } + else + { +- if ((sign & 0x80000000) == 0) ++ if ((hx & 0x80000000) == 0) + return tiny * tiny; + else + return two - tiny; diff --git a/SOURCES/glibc-ppc64le-10.patch b/SOURCES/glibc-ppc64le-10.patch new file mode 100644 index 0000000..ae80fe6 --- /dev/null +++ b/SOURCES/glibc-ppc64le-10.patch @@ -0,0 +1,91 @@ +# commit 32c301dfc9b786453e59b61fe4a821a89e1a206b +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:26:39 2013 +0930 +# +# PowerPC floating point little-endian [5 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00085.html +# +# Rid ourselves of ieee854. +# +# * sysdeps/ieee754/ldbl-128ibm/ieee754.h (union ieee854_long_double): +# Delete. +# (IEEE854_LONG_DOUBLE_BIAS): Delete. +# * sysdeps/ieee754/ldbl-128ibm/math_ldbl.h: Don't include ieee854 +# version of math_ldbl.h. +# +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h 2014-05-27 22:10:43.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ieee754.h 2014-05-27 22:11:10.000000000 -0500 +@@ -112,61 +112,6 @@ + #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ + + +-union ieee854_long_double +- { +- long double d; +- +- /* This is the IEEE 854 quad-precision format. */ +- struct +- { +-#if __BYTE_ORDER == __BIG_ENDIAN +- unsigned int negative:1; +- unsigned int exponent:15; +- /* Together these comprise the mantissa. */ +- unsigned int mantissa0:16; +- unsigned int mantissa1:32; +- unsigned int mantissa2:32; +- unsigned int mantissa3:32; +-#endif /* Big endian. */ +-#if __BYTE_ORDER == __LITTLE_ENDIAN +- /* Together these comprise the mantissa. */ +- unsigned int mantissa3:32; +- unsigned int mantissa2:32; +- unsigned int mantissa1:32; +- unsigned int mantissa0:16; +- unsigned int exponent:15; +- unsigned int negative:1; +-#endif /* Little endian. */ +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +-#if __BYTE_ORDER == __BIG_ENDIAN +- unsigned int negative:1; +- unsigned int exponent:15; +- unsigned int quiet_nan:1; +- /* Together these comprise the mantissa. */ +- unsigned int mantissa0:15; +- unsigned int mantissa1:32; +- unsigned int mantissa2:32; +- unsigned int mantissa3:32; +-#else +- /* Together these comprise the mantissa. */ +- unsigned int mantissa3:32; +- unsigned int mantissa2:32; +- unsigned int mantissa1:32; +- unsigned int mantissa0:15; +- unsigned int quiet_nan:1; +- unsigned int exponent:15; +- unsigned int negative:1; +-#endif +- } ieee_nan; +- }; +- +-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent. */ +- +- + /* IBM extended format for long double. + + Each long double is made up of two IEEE doubles. The value of the +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-27 22:10:43.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h 2014-05-27 22:11:10.000000000 -0500 +@@ -2,7 +2,6 @@ + #error "Never use <math_ldbl.h> directly; include <math_private.h> instead." + #endif + +-#include <sysdeps/ieee754/ldbl-128/math_ldbl.h> + #include <ieee754.h> + + static inline void diff --git a/SOURCES/glibc-ppc64le-11.patch b/SOURCES/glibc-ppc64le-11.patch new file mode 100644 index 0000000..ec12797 --- /dev/null +++ b/SOURCES/glibc-ppc64le-11.patch @@ -0,0 +1,113 @@ +# commit 62a728aeff93507ce5975f245a5f1d2046fb4503 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:27:19 2013 +0930 +# +# PowerPC floating point little-endian [6 of 15] +# http://sourceware.org/ml/libc-alpha/2013-07/msg00197.html +# +# A rewrite to make this code correct for little-endian. +# +# * sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c (mynumber): Replace +# union 32-bit int array member with 64-bit int array. +# (t515, tm256): Double rather than long double. +# (__ieee754_sqrtl): Rewrite using 64-bit arithmetic. +# +diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c 2014-05-27 22:20:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c 2014-05-27 22:21:39.000000000 -0500 +@@ -34,15 +34,13 @@ + + #include <math_private.h> + +-typedef unsigned int int4; +-typedef union {int4 i[4]; long double x; double d[2]; } mynumber; ++typedef union {int64_t i[2]; long double x; double d[2]; } mynumber; + +-static const mynumber +- t512 = {{0x5ff00000, 0x00000000, 0x00000000, 0x00000000 }}, /* 2^512 */ +- tm256 = {{0x2ff00000, 0x00000000, 0x00000000, 0x00000000 }}; /* 2^-256 */ + static const double +-two54 = 1.80143985094819840000e+16, /* 0x4350000000000000 */ +-twom54 = 5.55111512312578270212e-17; /* 0x3C90000000000000 */ ++ t512 = 0x1p512, ++ tm256 = 0x1p-256, ++ two54 = 0x1p54, /* 0x4350000000000000 */ ++ twom54 = 0x1p-54; /* 0x3C90000000000000 */ + + /*********************************************************************/ + /* An ultimate sqrt routine. Given an IEEE double machine number x */ +@@ -54,56 +52,53 @@ + static const long double big = 134217728.0, big1 = 134217729.0; + long double t,s,i; + mynumber a,c; +- int4 k, l, m; +- int n; ++ uint64_t k, l; ++ int64_t m, n; + double d; + + a.x=x; +- k=a.i[0] & 0x7fffffff; ++ k=a.i[0] & INT64_C(0x7fffffffffffffff); + /*----------------- 2^-1022 <= | x |< 2^1024 -----------------*/ +- if (k>0x000fffff && k<0x7ff00000) { ++ if (k>INT64_C(0x000fffff00000000) && k<INT64_C(0x7ff0000000000000)) { + if (x < 0) return (big1-big1)/(big-big); +- l = (k&0x001fffff)|0x3fe00000; +- if (((a.i[2] & 0x7fffffff) | a.i[3]) != 0) { +- n = (int) ((l - k) * 2) >> 21; +- m = (a.i[2] >> 20) & 0x7ff; ++ l = (k&INT64_C(0x001fffffffffffff))|INT64_C(0x3fe0000000000000); ++ if ((a.i[1] & INT64_C(0x7fffffffffffffff)) != 0) { ++ n = (int64_t) ((l - k) * 2) >> 53; ++ m = (a.i[1] >> 52) & 0x7ff; + if (m == 0) { + a.d[1] *= two54; +- m = ((a.i[2] >> 20) & 0x7ff) - 54; ++ m = ((a.i[1] >> 52) & 0x7ff) - 54; + } + m += n; +- if ((int) m > 0) +- a.i[2] = (a.i[2] & 0x800fffff) | (m << 20); +- else if ((int) m <= -54) { +- a.i[2] &= 0x80000000; +- a.i[3] = 0; ++ if (m > 0) ++ a.i[1] = (a.i[1] & INT64_C(0x800fffffffffffff)) | (m << 52); ++ else if (m <= -54) { ++ a.i[1] &= INT64_C(0x8000000000000000); + } else { + m += 54; +- a.i[2] = (a.i[2] & 0x800fffff) | (m << 20); ++ a.i[1] = (a.i[1] & INT64_C(0x800fffffffffffff)) | (m << 52); + a.d[1] *= twom54; + } + } + a.i[0] = l; + s = a.x; + d = __ieee754_sqrt (a.d[0]); +- c.i[0] = 0x20000000+((k&0x7fe00000)>>1); ++ c.i[0] = INT64_C(0x2000000000000000)+((k&INT64_C(0x7fe0000000000000))>>1); + c.i[1] = 0; +- c.i[2] = 0; +- c.i[3] = 0; + i = d; + t = 0.5L * (i + s / i); + i = 0.5L * (t + s / t); + return c.x * i; + } + else { +- if (k>=0x7ff00000) { +- if (a.i[0] == 0xfff00000 && a.i[1] == 0) ++ if (k>=INT64_C(0x7ff0000000000000)) { ++ if (a.i[0] == INT64_C(0xfff0000000000000)) + return (big1-big1)/(big-big); /* sqrt (-Inf) = NaN. */ + return x; /* sqrt (NaN) = NaN, sqrt (+Inf) = +Inf. */ + } + if (x == 0) return x; + if (x < 0) return (big1-big1)/(big-big); +- return tm256.x*__ieee754_sqrtl(x*t512.x); ++ return tm256*__ieee754_sqrtl(x*t512); + } + } + strong_alias (__ieee754_sqrtl, __sqrtl_finite) diff --git a/SOURCES/glibc-ppc64le-12.patch b/SOURCES/glibc-ppc64le-12.patch new file mode 100644 index 0000000..5e2d378 --- /dev/null +++ b/SOURCES/glibc-ppc64le-12.patch @@ -0,0 +1,75 @@ +# commit 2ca85d2bbbaa60b9c83bf1f57a2801c84e0a3625 +# Author: Anton Blanchard <anton@au1.ibm.com> +# Date: Sat Aug 17 18:28:06 2013 +0930 +# +# PowerPC floating point little-endian [7 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00086.html +# +# * sysdeps/powerpc/bits/mathinline.h (__signbitf): Use builtin. +# (__signbit): Likewise. Correct for little-endian. +# (__signbitl): Call __signbit. +# (lrint): Correct for little-endian. +# (lrintf): Call lrint. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/bits/mathinline.h glibc-2.17-c758a686/sysdeps/powerpc/fpu/bits/mathinline.h +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/bits/mathinline.h 2014-05-27 22:28:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/bits/mathinline.h 2014-05-27 22:28:37.000000000 -0500 +@@ -62,21 +62,28 @@ + __MATH_INLINE int + __NTH (__signbitf (float __x)) + { ++#if __GNUC_PREREQ (4, 0) ++ return __builtin_signbitf (__x); ++#else + __extension__ union { float __f; int __i; } __u = { __f: __x }; + return __u.__i < 0; ++#endif + } + __MATH_INLINE int + __NTH (__signbit (double __x)) + { +- __extension__ union { double __d; int __i[2]; } __u = { __d: __x }; +- return __u.__i[0] < 0; ++#if __GNUC_PREREQ (4, 0) ++ return __builtin_signbit (__x); ++#else ++ __extension__ union { double __d; long long __i; } __u = { __d: __x }; ++ return __u.__i < 0; ++#endif + } + # ifdef __LONG_DOUBLE_128__ + __MATH_INLINE int + __NTH (__signbitl (long double __x)) + { +- __extension__ union { long double __d; int __i[4]; } __u = { __d: __x }; +- return __u.__i[0] < 0; ++ return __signbit ((double) __x); + } + # endif + # endif +@@ -93,22 +100,17 @@ + { + union { + double __d; +- int __ll[2]; ++ long long __ll; + } __u; + __asm__ ("fctiw %0,%1" : "=f"(__u.__d) : "f"(__x)); +- return __u.__ll[1]; ++ return __u.__ll; + } + + __MATH_INLINE long int lrintf (float __x) __THROW; + __MATH_INLINE long int + __NTH (lrintf (float __x)) + { +- union { +- double __d; +- int __ll[2]; +- } __u; +- __asm__ ("fctiw %0,%1" : "=f"(__u.__d) : "f"(__x)); +- return __u.__ll[1]; ++ return lrint ((double) __x); + } + # endif + diff --git a/SOURCES/glibc-ppc64le-13.patch b/SOURCES/glibc-ppc64le-13.patch new file mode 100644 index 0000000..52830a1 --- /dev/null +++ b/SOURCES/glibc-ppc64le-13.patch @@ -0,0 +1,283 @@ +# commit 4a28b3ca4bc52d9a3ac0d9edb53d3de510e1b77c +# Author: Anton Blanchard <anton@au1.ibm.com> +# Date: Sat Aug 17 18:28:55 2013 +0930 +# +# PowerPC floating point little-endian [8 of 15] +# http://sourceware.org/ml/libc-alpha/2013-07/msg00199.html +# +# Corrects floating-point environment code for little-endian. +# +# * sysdeps/powerpc/fpu/fenv_libc.h (fenv_union_t): Replace int +# array with long long. +# * sysdeps/powerpc/fpu/e_sqrt.c (__slow_ieee754_sqrt): Adjust. +# * sysdeps/powerpc/fpu/e_sqrtf.c (__slow_ieee754_sqrtf): Adjust. +# * sysdeps/powerpc/fpu/fclrexcpt.c (__feclearexcept): Adjust. +# * sysdeps/powerpc/fpu/fedisblxcpt.c (fedisableexcept): Adjust. +# * sysdeps/powerpc/fpu/feenablxcpt.c (feenableexcept): Adjust. +# * sysdeps/powerpc/fpu/fegetexcept.c (__fegetexcept): Adjust. +# * sysdeps/powerpc/fpu/feholdexcpt.c (feholdexcept): Adjust. +# * sysdeps/powerpc/fpu/fesetenv.c (__fesetenv): Adjust. +# * sysdeps/powerpc/fpu/feupdateenv.c (__feupdateenv): Adjust. +# * sysdeps/powerpc/fpu/fgetexcptflg.c (__fegetexceptflag): Adjust. +# * sysdeps/powerpc/fpu/fraiseexcpt.c (__feraiseexcept): Adjust. +# * sysdeps/powerpc/fpu/fsetexcptflg.c (__fesetexceptflag): Adjust. +# * sysdeps/powerpc/fpu/ftestexcept.c (fetestexcept): Adjust. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrt.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrt.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrt.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrt.c 2014-05-27 22:31:43.000000000 -0500 +@@ -145,7 +145,7 @@ + feraiseexcept (FE_INVALID_SQRT); + + fenv_union_t u = { .fenv = fegetenv_register () }; +- if ((u.l[1] & FE_INVALID) == 0) ++ if ((u.l & FE_INVALID) == 0) + #endif + feraiseexcept (FE_INVALID); + x = a_nan.value; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrtf.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrtf.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrtf.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/e_sqrtf.c 2014-05-27 22:31:43.000000000 -0500 +@@ -121,7 +121,7 @@ + feraiseexcept (FE_INVALID_SQRT); + + fenv_union_t u = { .fenv = fegetenv_register () }; +- if ((u.l[1] & FE_INVALID) == 0) ++ if ((u.l & FE_INVALID) == 0) + #endif + feraiseexcept (FE_INVALID); + x = a_nan.value; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fclrexcpt.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/fclrexcpt.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fclrexcpt.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fclrexcpt.c 2014-05-27 22:31:43.000000000 -0500 +@@ -28,8 +28,8 @@ + u.fenv = fegetenv_register (); + + /* Clear the relevant bits. */ +- u.l[1] = u.l[1] & ~((-(excepts >> (31 - FPSCR_VX) & 1) & FE_ALL_INVALID) +- | (excepts & FPSCR_STICKY_BITS)); ++ u.l = u.l & ~((-(excepts >> (31 - FPSCR_VX) & 1) & FE_ALL_INVALID) ++ | (excepts & FPSCR_STICKY_BITS)); + + /* Put the new state in effect. */ + fesetenv_register (u.fenv); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fedisblxcpt.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/fedisblxcpt.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fedisblxcpt.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fedisblxcpt.c 2014-05-27 22:31:43.000000000 -0500 +@@ -32,15 +32,15 @@ + + fe.fenv = fegetenv_register (); + if (excepts & FE_INEXACT) +- fe.l[1] &= ~(1 << (31 - FPSCR_XE)); ++ fe.l &= ~(1 << (31 - FPSCR_XE)); + if (excepts & FE_DIVBYZERO) +- fe.l[1] &= ~(1 << (31 - FPSCR_ZE)); ++ fe.l &= ~(1 << (31 - FPSCR_ZE)); + if (excepts & FE_UNDERFLOW) +- fe.l[1] &= ~(1 << (31 - FPSCR_UE)); ++ fe.l &= ~(1 << (31 - FPSCR_UE)); + if (excepts & FE_OVERFLOW) +- fe.l[1] &= ~(1 << (31 - FPSCR_OE)); ++ fe.l &= ~(1 << (31 - FPSCR_OE)); + if (excepts & FE_INVALID) +- fe.l[1] &= ~(1 << (31 - FPSCR_VE)); ++ fe.l &= ~(1 << (31 - FPSCR_VE)); + fesetenv_register (fe.fenv); + + new = __fegetexcept (); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/feenablxcpt.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/feenablxcpt.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/feenablxcpt.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/feenablxcpt.c 2014-05-27 22:31:43.000000000 -0500 +@@ -32,15 +32,15 @@ + + fe.fenv = fegetenv_register (); + if (excepts & FE_INEXACT) +- fe.l[1] |= (1 << (31 - FPSCR_XE)); ++ fe.l |= (1 << (31 - FPSCR_XE)); + if (excepts & FE_DIVBYZERO) +- fe.l[1] |= (1 << (31 - FPSCR_ZE)); ++ fe.l |= (1 << (31 - FPSCR_ZE)); + if (excepts & FE_UNDERFLOW) +- fe.l[1] |= (1 << (31 - FPSCR_UE)); ++ fe.l |= (1 << (31 - FPSCR_UE)); + if (excepts & FE_OVERFLOW) +- fe.l[1] |= (1 << (31 - FPSCR_OE)); ++ fe.l |= (1 << (31 - FPSCR_OE)); + if (excepts & FE_INVALID) +- fe.l[1] |= (1 << (31 - FPSCR_VE)); ++ fe.l |= (1 << (31 - FPSCR_VE)); + fesetenv_register (fe.fenv); + + new = __fegetexcept (); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fegetexcept.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/fegetexcept.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fegetexcept.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fegetexcept.c 2014-05-27 22:31:43.000000000 -0500 +@@ -27,15 +27,15 @@ + + fe.fenv = fegetenv_register (); + +- if (fe.l[1] & (1 << (31 - FPSCR_XE))) ++ if (fe.l & (1 << (31 - FPSCR_XE))) + result |= FE_INEXACT; +- if (fe.l[1] & (1 << (31 - FPSCR_ZE))) ++ if (fe.l & (1 << (31 - FPSCR_ZE))) + result |= FE_DIVBYZERO; +- if (fe.l[1] & (1 << (31 - FPSCR_UE))) ++ if (fe.l & (1 << (31 - FPSCR_UE))) + result |= FE_UNDERFLOW; +- if (fe.l[1] & (1 << (31 - FPSCR_OE))) ++ if (fe.l & (1 << (31 - FPSCR_OE))) + result |= FE_OVERFLOW; +- if (fe.l[1] & (1 << (31 - FPSCR_VE))) ++ if (fe.l & (1 << (31 - FPSCR_VE))) + result |= FE_INVALID; + + return result; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/feholdexcpt.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/feholdexcpt.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/feholdexcpt.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/feholdexcpt.c 2014-05-27 22:33:09.000000000 -0500 +@@ -30,13 +30,12 @@ + + /* Clear everything except for the rounding modes and non-IEEE arithmetic + flag. */ +- new.l[1] = old.l[1] & 7; +- new.l[0] = old.l[0]; ++ new.l = old.l & 0xffffffff00000007LL; + + /* If the old env had any eabled exceptions, then mask SIGFPE in the + MSR FE0/FE1 bits. This may allow the FPU to run faster because it + always takes the default action and can not generate SIGFPE. */ +- if ((old.l[1] & _FPU_MASK_ALL) != 0) ++ if ((old.l & _FPU_MASK_ALL) != 0) + (void)__fe_mask_env (); + + /* Put the new state in effect. */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fenv_libc.h glibc-2.17-c758a686/sysdeps/powerpc/fpu/fenv_libc.h +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fenv_libc.h 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fenv_libc.h 2014-05-27 22:31:43.000000000 -0500 +@@ -69,7 +69,7 @@ + typedef union + { + fenv_t fenv; +- unsigned int l[2]; ++ unsigned long long l; + } fenv_union_t; + + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fesetenv.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/fesetenv.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fesetenv.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fesetenv.c 2014-05-27 22:35:18.000000000 -0500 +@@ -36,14 +36,14 @@ + exceptions, then unmask SIGFPE in the MSR FE0/FE1 bits. This will put the + hardware into "precise mode" and may cause the FPU to run slower on some + hardware. */ +- if ((old.l[1] & _FPU_MASK_ALL) == 0 && (new.l[1] & _FPU_MASK_ALL) != 0) ++ if ((old.l & _FPU_MASK_ALL) == 0 && (new.l & _FPU_MASK_ALL) != 0) + (void)__fe_nomask_env (); + + /* If the old env had any enabled exceptions and the new env has no enabled + exceptions, then mask SIGFPE in the MSR FE0/FE1 bits. This may allow the + FPU to run faster because it always takes the default action and can not + generate SIGFPE. */ +- if ((old.l[1] & _FPU_MASK_ALL) != 0 && (new.l[1] & _FPU_MASK_ALL) == 0) ++ if ((old.l & _FPU_MASK_ALL) != 0 && (new.l & _FPU_MASK_ALL) == 0) + (void)__fe_mask_env (); + + fesetenv_register (*envp); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/feupdateenv.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/feupdateenv.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/feupdateenv.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/feupdateenv.c 2014-05-27 22:34:23.000000000 -0500 +@@ -36,20 +36,20 @@ + /* Restore rounding mode and exception enable from *envp and merge + exceptions. Leave fraction rounded/inexact and FP result/CC bits + unchanged. */ +- new.l[1] = (old.l[1] & 0x1FFFFF00) | (new.l[1] & 0x1FF80FFF); ++ new.l = (old.l & 0xffffffff1fffff00LL) | (new.l & 0x1ff80fff); + + /* If the old env has no eabled exceptions and the new env has any enabled + exceptions, then unmask SIGFPE in the MSR FE0/FE1 bits. This will put + the hardware into "precise mode" and may cause the FPU to run slower on + some hardware. */ +- if ((old.l[1] & _FPU_MASK_ALL) == 0 && (new.l[1] & _FPU_MASK_ALL) != 0) ++ if ((old.l & _FPU_MASK_ALL) == 0 && (new.l & _FPU_MASK_ALL) != 0) + (void)__fe_nomask_env (); + + /* If the old env had any eabled exceptions and the new env has no enabled + exceptions, then mask SIGFPE in the MSR FE0/FE1 bits. This may allow the + FPU to run faster because it always takes the default action and can not + generate SIGFPE. */ +- if ((old.l[1] & _FPU_MASK_ALL) != 0 && (new.l[1] & _FPU_MASK_ALL) == 0) ++ if ((old.l & _FPU_MASK_ALL) != 0 && (new.l & _FPU_MASK_ALL) == 0) + (void)__fe_mask_env (); + + /* Atomically enable and raise (if appropriate) exceptions set in `new'. */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fgetexcptflg.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/fgetexcptflg.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fgetexcptflg.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fgetexcptflg.c 2014-05-27 22:31:43.000000000 -0500 +@@ -28,7 +28,7 @@ + u.fenv = fegetenv_register (); + + /* Return (all of) it. */ +- *flagp = u.l[1] & excepts & FE_ALL_EXCEPT; ++ *flagp = u.l & excepts & FE_ALL_EXCEPT; + + /* Success. */ + return 0; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fraiseexcpt.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/fraiseexcpt.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fraiseexcpt.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fraiseexcpt.c 2014-05-27 22:31:43.000000000 -0500 +@@ -34,11 +34,11 @@ + u.fenv = fegetenv_register (); + + /* Add the exceptions */ +- u.l[1] = (u.l[1] +- | (excepts & FPSCR_STICKY_BITS) +- /* Turn FE_INVALID into FE_INVALID_SOFTWARE. */ +- | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)) +- & FE_INVALID_SOFTWARE)); ++ u.l = (u.l ++ | (excepts & FPSCR_STICKY_BITS) ++ /* Turn FE_INVALID into FE_INVALID_SOFTWARE. */ ++ | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)) ++ & FE_INVALID_SOFTWARE)); + + /* Store the new status word (along with the rest of the environment), + triggering any appropriate exceptions. */ +@@ -50,7 +50,7 @@ + don't have FE_INVALID_SOFTWARE implemented. Detect this + case and raise FE_INVALID_SNAN instead. */ + u.fenv = fegetenv_register (); +- if ((u.l[1] & FE_INVALID) == 0) ++ if ((u.l & FE_INVALID) == 0) + set_fpscr_bit (FPSCR_VXSNAN); + } + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fsetexcptflg.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/fsetexcptflg.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fsetexcptflg.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fsetexcptflg.c 2014-05-27 22:31:43.000000000 -0500 +@@ -32,10 +32,10 @@ + flag = *flagp & excepts; + + /* Replace the exception status */ +- u.l[1] = ((u.l[1] & ~(FPSCR_STICKY_BITS & excepts)) +- | (flag & FPSCR_STICKY_BITS) +- | (flag >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)) +- & FE_INVALID_SOFTWARE)); ++ u.l = ((u.l & ~(FPSCR_STICKY_BITS & excepts)) ++ | (flag & FPSCR_STICKY_BITS) ++ | (flag >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)) ++ & FE_INVALID_SOFTWARE)); + + /* Store the new status word (along with the rest of the environment). + This may cause floating-point exceptions if the restored state +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/ftestexcept.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/ftestexcept.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/ftestexcept.c 2014-05-27 22:31:42.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/ftestexcept.c 2014-05-27 22:31:43.000000000 -0500 +@@ -28,6 +28,6 @@ + + /* The FE_INVALID bit is dealt with correctly by the hardware, so we can + just: */ +- return u.l[1] & excepts; ++ return u.l & excepts; + } + libm_hidden_def (fetestexcept) diff --git a/SOURCES/glibc-ppc64le-14.patch b/SOURCES/glibc-ppc64le-14.patch new file mode 100644 index 0000000..9025fd7 --- /dev/null +++ b/SOURCES/glibc-ppc64le-14.patch @@ -0,0 +1,120 @@ +# commit 603e84104cdc709c8e7dcbac54b9a585bf8dff78 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:29:43 2013 +0930 +# +# PowerPC floating point little-endian [9 of 15] +# http://sourceware.org/ml/libc-alpha/2013-07/msg00200.html +# +# This works around the fact that vsx is disabled in current +# little-endian gcc. Also, float constants take 4 bytes in memory +# vs. 16 bytes for vector constants, and we don't need to write one lot +# of masks for double (register format) and another for float (mem +# format). +# +# * sysdeps/powerpc/fpu/s_float_bitwise.h (__float_and_test28): Don't +# use vector int constants. +# (__float_and_test24, __float_and8, __float_get_exp): Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_float_bitwise.h glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_float_bitwise.h +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_float_bitwise.h 2014-05-27 22:37:18.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_float_bitwise.h 2014-05-27 22:37:20.000000000 -0500 +@@ -23,18 +23,19 @@ + #include <math_private.h> + + /* Returns (int)(num & 0x7FFFFFF0 == value) */ +-static inline +-int __float_and_test28 (float num, float value) ++static inline int ++__float_and_test28 (float num, float value) + { + float ret; + #ifdef _ARCH_PWR7 +- vector int mask = (vector int) { +- 0x7ffffffe, 0x00000000, 0x00000000, 0x0000000 +- }; ++ union { ++ int i; ++ float f; ++ } mask = { .i = 0x7ffffff0 }; + __asm__ ( +- /* the 'f' constrain is use on mask because we just need ++ /* the 'f' constraint is used on mask because we just need + * to compare floats, not full vector */ +- "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask) ++ "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) + ); + #else + int32_t inum; +@@ -46,16 +47,17 @@ + } + + /* Returns (int)(num & 0x7FFFFF00 == value) */ +-static inline +-int __float_and_test24 (float num, float value) ++static inline int ++__float_and_test24 (float num, float value) + { + float ret; + #ifdef _ARCH_PWR7 +- vector int mask = (vector int) { +- 0x7fffffe0, 0x00000000, 0x00000000, 0x0000000 +- }; ++ union { ++ int i; ++ float f; ++ } mask = { .i = 0x7fffff00 }; + __asm__ ( +- "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask) ++ "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) + ); + #else + int32_t inum; +@@ -67,16 +69,17 @@ + } + + /* Returns (float)(num & 0x7F800000) */ +-static inline +-float __float_and8 (float num) ++static inline float ++__float_and8 (float num) + { + float ret; + #ifdef _ARCH_PWR7 +- vector int mask = (vector int) { +- 0x7ff00000, 0x00000000, 0x00000000, 0x00000000 +- }; ++ union { ++ int i; ++ float f; ++ } mask = { .i = 0x7f800000 }; + __asm__ ( +- "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask) ++ "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) + ); + #else + int32_t inum; +@@ -88,17 +91,18 @@ + } + + /* Returns ((int32_t)(num & 0x7F800000) >> 23) */ +-static inline +-int32_t __float_get_exp (float num) ++static inline int32_t ++__float_get_exp (float num) + { + int32_t inum; + #ifdef _ARCH_PWR7 + float ret; +- vector int mask = (vector int) { +- 0x7ff00000, 0x00000000, 0x00000000, 0x00000000 +- }; ++ union { ++ int i; ++ float f; ++ } mask = { .i = 0x7f800000 }; + __asm__ ( +- "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask) ++ "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) + ); + GET_FLOAT_WORD(inum, ret); + #else diff --git a/SOURCES/glibc-ppc64le-15.patch b/SOURCES/glibc-ppc64le-15.patch new file mode 100644 index 0000000..29b3b54 --- /dev/null +++ b/SOURCES/glibc-ppc64le-15.patch @@ -0,0 +1,119 @@ +# commit da13146da10360436941e843834c90a9aef5fd7a +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:30:23 2013 +0930 +# +# PowerPC floating point little-endian [10 of 15] +# http://sourceware.org/ml/libc-alpha/2013-07/msg00201.html +# +# These two functions oddly test x+1>0 when a double x is >= 0.0, and +# similarly when x is negative. I don't see the point of that since the +# test should always be true. I also don't see any need to convert x+1 +# to integer rather than simply using xr+1. Note that the standard +# allows these functions to return any value when the input is outside +# the range of long long, but it's not too hard to prevent xr+1 +# overflowing so that's what I've done. +# +# (With rounding mode FE_UPWARD, x+1 can be a lot more than what you +# might naively expect, but perhaps that situation was covered by the +# x - xrf < 1.0 test.) +# +# * sysdeps/powerpc/fpu/s_llround.c (__llround): Rewrite. +# * sysdeps/powerpc/fpu/s_llroundf.c (__llroundf): Rewrite. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llround.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llround.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llround.c 2014-05-27 22:38:55.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llround.c 2014-05-27 22:38:58.000000000 -0500 +@@ -19,29 +19,28 @@ + #include <math.h> + #include <math_ldbl_opt.h> + +-/* I think that what this routine is supposed to do is round a value +- to the nearest integer, with values exactly on the boundary rounded +- away from zero. */ +-/* This routine relies on (long long)x, when x is out of range of a long long, +- clipping to MAX_LLONG or MIN_LLONG. */ ++/* Round to the nearest integer, with values exactly on a 0.5 boundary ++ rounded away from zero, regardless of the current rounding mode. ++ If (long long)x, when x is out of range of a long long, clips at ++ LLONG_MAX or LLONG_MIN, then this implementation also clips. */ + + long long int + __llround (double x) + { +- double xrf; +- long long int xr; +- xr = (long long int) x; +- xrf = (double) xr; ++ long long xr = (long long) x; ++ double xrf = (double) xr; ++ + if (x >= 0.0) +- if (x - xrf >= 0.5 && x - xrf < 1.0 && x+1 > 0) +- return x+1; +- else +- return x; ++ { ++ if (x - xrf >= 0.5) ++ xr += (long long) ((unsigned long long) xr + 1) > 0; ++ } + else +- if (xrf - x >= 0.5 && xrf - x < 1.0 && x-1 < 0) +- return x-1; +- else +- return x; ++ { ++ if (xrf - x >= 0.5) ++ xr -= (long long) ((unsigned long long) xr - 1) < 0; ++ } ++ return xr; + } + weak_alias (__llround, llround) + #ifdef NO_LONG_DOUBLE +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llroundf.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llroundf.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llroundf.c 2014-05-27 22:38:55.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/s_llroundf.c 2014-05-27 22:38:58.000000000 -0500 +@@ -18,28 +18,27 @@ + + #include <math.h> + +-/* I think that what this routine is supposed to do is round a value +- to the nearest integer, with values exactly on the boundary rounded +- away from zero. */ +-/* This routine relies on (long long)x, when x is out of range of a long long, +- clipping to MAX_LLONG or MIN_LLONG. */ ++/* Round to the nearest integer, with values exactly on a 0.5 boundary ++ rounded away from zero, regardless of the current rounding mode. ++ If (long long)x, when x is out of range of a long long, clips at ++ LLONG_MAX or LLONG_MIN, then this implementation also clips. */ + + long long int + __llroundf (float x) + { +- float xrf; +- long long int xr; +- xr = (long long int) x; +- xrf = (float) xr; ++ long long xr = (long long) x; ++ float xrf = (float) xr; ++ + if (x >= 0.0) +- if (x - xrf >= 0.5 && x - xrf < 1.0 && x+1 > 0) +- return x+1; +- else +- return x; ++ { ++ if (x - xrf >= 0.5) ++ xr += (long long) ((unsigned long long) xr + 1) > 0; ++ } + else +- if (xrf - x >= 0.5 && xrf - x < 1.0 && x-1 < 0) +- return x-1; +- else +- return x; ++ { ++ if (xrf - x >= 0.5) ++ xr -= (long long) ((unsigned long long) xr - 1) < 0; ++ } ++ return xr; + } + weak_alias (__llroundf, llroundf) diff --git a/SOURCES/glibc-ppc64le-16.patch b/SOURCES/glibc-ppc64le-16.patch new file mode 100644 index 0000000..0da0865 --- /dev/null +++ b/SOURCES/glibc-ppc64le-16.patch @@ -0,0 +1,163 @@ +# commit 9c008155b7d5d1bd81d909497850a2ece28aec50 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:31:05 2013 +0930 +# +# PowerPC floating point little-endian [11 of 15] +# http://sourceware.org/ml/libc-alpha/2013-07/msg00202.html +# +# Another little-endian fix. +# +# * sysdeps/powerpc/fpu_control.h (_FPU_GETCW): Rewrite using +# 64-bit int/double union. +# (_FPU_SETCW): Likewise. +# * sysdeps/powerpc/fpu/tst-setcontext-fpscr.c (_GET_DI_FPSCR): Likewise. +# (_SET_DI_FPSCR, _GET_SI_FPSCR, _SET_SI_FPSCR): Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/fpu_control.h glibc-2.17-c758a686/sysdeps/powerpc/fpu/fpu_control.h +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/fpu_control.h 2014-05-27 22:40:18.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/fpu_control.h 2014-05-27 22:43:40.000000000 -0500 +@@ -45,22 +45,26 @@ + #define _FPU_IEEE 0x000000f0 + + /* Type of the control word. */ +-typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); ++typedef unsigned int fpu_control_t; + + /* Macros for accessing the hardware control word. */ +-#define _FPU_GETCW(__cw) ( { \ +- union { double d; fpu_control_t cw[2]; } \ +- tmp __attribute__ ((__aligned__(8))); \ +- __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \ +- (__cw)=tmp.cw[1]; \ +- tmp.cw[1]; } ) +-#define _FPU_SETCW(__cw) { \ +- union { double d; fpu_control_t cw[2]; } \ +- tmp __attribute__ ((__aligned__(8))); \ +- tmp.cw[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \ +- tmp.cw[1] = __cw; \ +- __asm__ ("lfd%U0 0,%0; mtfsf 255,0" : : "m" (tmp.d) : "fr0"); \ +-} ++#define _FPU_GETCW(cw) \ ++ ({union { double __d; unsigned long long __ll; } __u; \ ++ register double __fr; \ ++ __asm__ ("mffs %0" : "=f" (__fr)); \ ++ __u.__d = __fr; \ ++ (cw) = (fpu_control_t) __u.__ll; \ ++ (fpu_control_t) __u.__ll; \ ++ }) ++ ++#define _FPU_SETCW(cw) \ ++ { union { double __d; unsigned long long __ll; } __u; \ ++ register double __fr; \ ++ __u.__ll = 0xfff80000LL << 32; /* This is a QNaN. */ \ ++ __u.__ll |= (cw) & 0xffffffffLL; \ ++ __fr = __u.__d; \ ++ __asm__ ("mtfsf 255,%0" : : "f" (__fr)); \ ++ } + + /* Default control word set at startup. */ + extern fpu_control_t __fpu_control; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c glibc-2.17-c758a686/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c 2014-05-27 22:40:18.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c 2014-05-27 22:40:21.000000000 -0500 +@@ -83,7 +83,7 @@ + return 0; + } + +-typedef unsigned long long di_fpscr_t __attribute__ ((__mode__ (__DI__))); ++typedef unsigned int di_fpscr_t __attribute__ ((__mode__ (__DI__))); + typedef unsigned int si_fpscr_t __attribute__ ((__mode__ (__SI__))); + + #define _FPSCR_RESERVED 0xfffffff8ffffff04ULL +@@ -95,50 +95,51 @@ + #define _FPSCR_TEST1_RN 0x0000000000000002ULL + + /* Macros for accessing the hardware control word on Power6[x]. */ +-# define _GET_DI_FPSCR(__fpscr) ({ \ +- union { double d; \ +- di_fpscr_t fpscr; } \ +- tmp __attribute__ ((__aligned__(8))); \ +- __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \ +- (__fpscr)=tmp.fpscr; \ +- tmp.fpscr; }) ++#define _GET_DI_FPSCR(__fpscr) \ ++ ({union { double d; di_fpscr_t fpscr; } u; \ ++ register double fr; \ ++ __asm__ ("mffs %0" : "=f" (fr)); \ ++ u.d = fr; \ ++ (__fpscr) = u.fpscr; \ ++ u.fpscr; \ ++ }) + +-/* We make sure to zero fp0 after we use it in order to prevent stale data ++/* We make sure to zero fp after we use it in order to prevent stale data + in an fp register from making a test-case pass erroneously. */ +-# define _SET_DI_FPSCR(__fpscr) { \ +- union { double d; di_fpscr_t fpscr; } \ +- tmp __attribute__ ((__aligned__(8))); \ +- tmp.fpscr = __fpscr; \ +- /* Set the entire 64-bit FPSCR. */ \ +- __asm__ ("lfd%U0 0,%0; " \ +- ".machine push; " \ +- ".machine \"power6\"; " \ +- "mtfsf 255,0,1,0; " \ +- ".machine pop" : : "m" (tmp.d) : "fr0"); \ +- tmp.d = 0; \ +- __asm__("lfd%U0 0,%0" : : "m" (tmp.d) : "fr0"); \ +-} +- +-# define _GET_SI_FPSCR(__fpscr) ({ \ +- union { double d; \ +- si_fpscr_t cw[2]; } \ +- tmp __attribute__ ((__aligned__(8))); \ +- __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \ +- (__fpscr)=tmp.cw[1]; \ +- tmp.cw[0]; }) ++# define _SET_DI_FPSCR(__fpscr) \ ++ { union { double d; di_fpscr_t fpscr; } u; \ ++ register double fr; \ ++ u.fpscr = __fpscr; \ ++ fr = u.d; \ ++ /* Set the entire 64-bit FPSCR. */ \ ++ __asm__ (".machine push; " \ ++ ".machine \"power6\"; " \ ++ "mtfsf 255,%0,1,0; " \ ++ ".machine pop" : : "f" (fr)); \ ++ fr = 0.0; \ ++ } ++ ++# define _GET_SI_FPSCR(__fpscr) \ ++ ({union { double d; di_fpscr_t fpscr; } u; \ ++ register double fr; \ ++ __asm__ ("mffs %0" : "=f" (fr)); \ ++ u.d = fr; \ ++ (__fpscr) = (si_fpscr_t) u.fpscr; \ ++ (si_fpscr_t) u.fpscr; \ ++ }) + +-/* We make sure to zero fp0 after we use it in order to prevent stale data ++/* We make sure to zero fp after we use it in order to prevent stale data + in an fp register from making a test-case pass erroneously. */ +-# define _SET_SI_FPSCR(__fpscr) { \ +- union { double d; si_fpscr_t fpscr[2]; } \ +- tmp __attribute__ ((__aligned__(8))); \ +- /* More-or-less arbitrary; this is a QNaN. */ \ +- tmp.fpscr[0] = 0xFFF80000; \ +- tmp.fpscr[1] = __fpscr; \ +- __asm__ ("lfd%U0 0,%0; mtfsf 255,0" : : "m" (tmp.d) : "fr0"); \ +- tmp.d = 0; \ +- __asm__("lfd%U0 0,%0" : : "m" (tmp.d) : "fr0"); \ +-} ++# define _SET_SI_FPSCR(__fpscr) \ ++ { union { double d; di_fpscr_t fpscr; } u; \ ++ register double fr; \ ++ /* More-or-less arbitrary; this is a QNaN. */ \ ++ u.fpscr = 0xfff80000ULL << 32; \ ++ u.fpscr |= __fpscr & 0xffffffffULL; \ ++ fr = u.d; \ ++ __asm__ ("mtfsf 255,%0" : : "f" (fr)); \ ++ fr = 0.0; \ ++ } + + void prime_special_regs(int which) + { diff --git a/SOURCES/glibc-ppc64le-17.patch b/SOURCES/glibc-ppc64le-17.patch new file mode 100644 index 0000000..5ed69a9 --- /dev/null +++ b/SOURCES/glibc-ppc64le-17.patch @@ -0,0 +1,312 @@ +# commit 7b88401f3b25325b1381798a0eccb3efe7751fec +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:31:45 2013 +0930 +# +# PowerPC floating point little-endian [12 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00087.html +# +# Fixes for little-endian in 32-bit assembly. +# +# * sysdeps/powerpc/sysdep.h (LOWORD, HIWORD, HISHORT): Define. +# * sysdeps/powerpc/powerpc32/fpu/s_copysign.S: Load little-endian +# words of double from correct stack offsets. +# * sysdeps/powerpc/powerpc32/fpu/s_copysignl.S: Likewise. +# * sysdeps/powerpc/powerpc32/fpu/s_lrint.S: Likewise. +# * sysdeps/powerpc/powerpc32/fpu/s_lround.S: Likewise. +# * sysdeps/powerpc/powerpc32/power4/fpu/s_llrint.S: Likewise. +# * sysdeps/powerpc/powerpc32/power4/fpu/s_llrintf.S: Likewise. +# * sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S: Likewise. +# * sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S: Likewise. +# * sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S: Likewise. +# * sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S: Likewise. +# * sysdeps/powerpc/powerpc32/power6/fpu/s_llrint.S: Likewise. +# * sysdeps/powerpc/powerpc32/power6/fpu/s_llrintf.S: Likewise. +# * sysdeps/powerpc/powerpc32/power6/fpu/s_llround.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/power7/fpu/s_finite.S: Use HISHORT. +# * sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysign.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysign.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysign.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysign.S 2014-05-27 22:45:46.000000000 -0500 +@@ -29,7 +29,7 @@ + stwu r1,-16(r1) + cfi_adjust_cfa_offset (16) + stfd fp2,8(r1) +- lwz r3,8(r1) ++ lwz r3,8+HIWORD(r1) + cmpwi r3,0 + addi r1,r1,16 + cfi_adjust_cfa_offset (-16) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysignl.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysignl.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysignl.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_copysignl.S 2014-05-27 22:45:46.000000000 -0500 +@@ -30,7 +30,7 @@ + fmr fp0,fp1 + fabs fp1,fp1 + fcmpu cr7,fp0,fp1 +- lwz r3,8(r1) ++ lwz r3,8+HIWORD(r1) + cmpwi cr6,r3,0 + addi r1,r1,16 + cfi_adjust_cfa_offset (-16) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lrint.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lrint.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lrint.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lrint.S 2014-05-27 22:45:46.000000000 -0500 +@@ -24,10 +24,10 @@ + stwu r1,-16(r1) + fctiw fp13,fp1 + stfd fp13,8(r1) +- nop /* Insure the following load is in a different dispatch group */ ++ nop /* Ensure the following load is in a different dispatch group */ + nop /* to avoid pipe stall on POWER4&5. */ + nop +- lwz r3,12(r1) ++ lwz r3,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__lrint) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lround.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lround.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lround.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_lround.S 2014-05-27 22:45:46.000000000 -0500 +@@ -67,7 +67,7 @@ + nop /* Ensure the following load is in a different dispatch */ + nop /* group to avoid pipe stall on POWER4&5. */ + nop +- lwz r3,12(r1) /* Load return as integer. */ ++ lwz r3,8+LOWORD(r1) /* Load return as integer. */ + .Lout: + addi r1,r1,16 + blr +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrint.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrint.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrint.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrint.S 2014-05-27 22:48:09.000000000 -0500 +@@ -29,8 +29,8 @@ + nop /* Insure the following load is in a different dispatch group */ + nop /* to avoid pipe stall on POWER4&5. */ + nop +- lwz r3,8(r1) +- lwz r4,12(r1) ++ lwz r3,8+HIWORD(r1) ++ lwz r4,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__llrint) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrintf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrintf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrintf.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llrintf.S 2014-05-27 22:48:44.000000000 -0500 +@@ -28,8 +28,8 @@ + nop /* Insure the following load is in a different dispatch group */ + nop /* to avoid pipe stall on POWER4&5. */ + nop +- lwz r3,8(r1) +- lwz r4,12(r1) ++ lwz r3,8+HIWORD(r1) ++ lwz r4,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__llrintf) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5/fpu/s_isnan.S 2014-05-27 22:45:46.000000000 -0500 +@@ -27,8 +27,8 @@ + ori r1,r1,0 + stfd fp1,24(r1) /* copy FPR to GPR */ + ori r1,r1,0 +- lwz r4,24(r1) +- lwz r5,28(r1) ++ lwz r4,24+HIWORD(r1) ++ lwz r5,24+LOWORD(r1) + lis r0,0x7ff0 /* const long r0 0x7ff00000 00000000 */ + clrlwi r4,r4,1 /* x = fabs(x) */ + cmpw cr7,r4,r0 /* if (fabs(x) =< inf) */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S 2014-05-27 22:45:46.000000000 -0500 +@@ -39,8 +39,8 @@ + nop /* Ensure the following load is in a different dispatch */ + nop /* group to avoid pipe stall on POWER4&5. */ + nop +- lwz r4,12(r1) +- lwz r3,8(r1) ++ lwz r3,8+HIWORD(r1) ++ lwz r4,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__llround) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S 2014-05-27 22:45:46.000000000 -0500 +@@ -38,7 +38,7 @@ + nop /* Ensure the following load is in a different dispatch */ + nop /* group to avoid pipe stall on POWER4&5. */ + nop +- lwz r3,12(r1) ++ lwz r3,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__lround) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_isnan.S 2014-05-27 22:45:46.000000000 -0500 +@@ -27,8 +27,8 @@ + ori r1,r1,0 + stfd fp1,24(r1) /* copy FPR to GPR */ + ori r1,r1,0 +- lwz r4,24(r1) +- lwz r5,28(r1) ++ lwz r4,24+HIWORD(r1) ++ lwz r5,24+LOWORD(r1) + lis r0,0x7ff0 /* const long r0 0x7ff00000 00000000 */ + clrlwi r4,r4,1 /* x = fabs(x) */ + cmpw cr7,r4,r0 /* if (fabs(x) =< inf) */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrint.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrint.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrint.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrint.S 2014-05-27 22:46:52.000000000 -0500 +@@ -29,8 +29,8 @@ + /* Insure the following load is in a different dispatch group by + inserting "group ending nop". */ + ori r1,r1,0 +- lwz r3,8(r1) +- lwz r4,12(r1) ++ lwz r3,8+HIWORD(r1) ++ lwz r4,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__llrint) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrintf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrintf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrintf.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llrintf.S 2014-05-27 22:47:29.000000000 -0500 +@@ -28,8 +28,8 @@ + /* Insure the following load is in a different dispatch group by + inserting "group ending nop". */ + ori r1,r1,0 +- lwz r3,8(r1) +- lwz r4,12(r1) ++ lwz r3,8+HIWORD(r1) ++ lwz r4,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__llrintf) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S 2014-05-27 22:45:46.000000000 -0500 +@@ -39,8 +39,8 @@ + /* Insure the following load is in a different dispatch group by + inserting "group ending nop". */ + ori r1,r1,0 +- lwz r4,12(r1) +- lwz r3,8(r1) ++ lwz r3,8+HIWORD(r1) ++ lwz r4,8+LOWORD(r1) + addi r1,r1,16 + blr + END (__llround) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_finite.S 2014-05-27 22:45:46.000000000 -0500 +@@ -54,9 +54,8 @@ + stfd fp1,8(r1) /* Transfer FP to GPR's. */ + + ori 2,2,0 /* Force a new dispatch group. */ +- lhz r0,8(r1) /* Fetch the upper portion of the high word of +- the FP value (where the exponent and sign bits +- are). */ ++ lhz r0,8+HISHORT(r1) /* Fetch the upper 16 bits of the FP value ++ (biased exponent and sign bit). */ + clrlwi r0,r0,17 /* r0 = abs(r0). */ + addi r1,r1,16 /* Reset the stack pointer. */ + cmpwi cr7,r0,0x7ff0 /* r4 == 0x7ff0?. */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isinf.S 2014-05-27 22:45:46.000000000 -0500 +@@ -48,14 +48,13 @@ + li r3,0 + bflr 29 /* If not INF, return. */ + +- /* Either we have -INF/+INF or a denormal. */ ++ /* Either we have +INF or -INF. */ + + stwu r1,-16(r1) /* Allocate stack space. */ + stfd fp1,8(r1) /* Transfer FP to GPR's. */ + ori 2,2,0 /* Force a new dispatch group. */ +- lhz r4,8(r1) /* Fetch the upper portion of the high word of +- the FP value (where the exponent and sign bits +- are). */ ++ lhz r4,8+HISHORT(r1) /* Fetch the upper 16 bits of the FP value ++ (biased exponent and sign bit). */ + addi r1,r1,16 /* Reset the stack pointer. */ + cmpwi cr7,r4,0x7ff0 /* r4 == 0x7ff0? */ + li r3,1 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/fpu/s_isnan.S 2014-05-27 22:45:46.000000000 -0500 +@@ -53,8 +53,8 @@ + stwu r1,-16(r1) /* Allocate stack space. */ + stfd fp1,8(r1) /* Transfer FP to GPR's. */ + ori 2,2,0 /* Force a new dispatch group. */ +- lwz r4,8(r1) /* Load the upper half of the FP value. */ +- lwz r5,12(r1) /* Load the lower half of the FP value. */ ++ lwz r4,8+HIWORD(r1) /* Load the upper half of the FP value. */ ++ lwz r5,8+LOWORD(r1) /* Load the lower half of the FP value. */ + addi r1,r1,16 /* Reset the stack pointer. */ + lis r0,0x7ff0 /* Load the upper portion for an INF/NaN. */ + clrlwi r4,r4,1 /* r4 = abs(r4). */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_finite.S 2014-05-27 22:45:46.000000000 -0500 +@@ -39,10 +39,8 @@ + + stfd fp1,-16(r1) /* Transfer FP to GPR's. */ + ori 2,2,0 /* Force a new dispatch group. */ +- +- lhz r4,-16(r1) /* Fetch the upper portion of the high word of +- the FP value (where the exponent and sign bits +- are). */ ++ lhz r4,-16+HISHORT(r1) /* Fetch the upper 16 bits of the FP value ++ (biased exponent and sign bit). */ + clrlwi r4,r4,17 /* r4 = abs(r4). */ + cmpwi cr7,r4,0x7ff0 /* r4 == 0x7ff0? */ + bltlr cr7 /* LT means finite, other non-finite. */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/fpu/s_isinf.S 2014-05-27 22:45:46.000000000 -0500 +@@ -38,9 +38,8 @@ + + stfd fp1,-16(r1) /* Transfer FP to GPR's. */ + ori 2,2,0 /* Force a new dispatch group. */ +- lhz r4,-16(r1) /* Fetch the upper portion of the high word of +- the FP value (where the exponent and sign bits +- are). */ ++ lhz r4,-16+HISHORT(r1) /* Fetch the upper 16 bits of the FP value ++ (biased exponent and sign bit). */ + cmpwi cr7,r4,0x7ff0 /* r4 == 0x7ff0? */ + li r3,1 + beqlr cr7 /* EQ means INF, otherwise -INF. */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/sysdep.h glibc-2.17-c758a686/sysdeps/powerpc/sysdep.h +--- glibc-2.17-c758a686/sysdeps/powerpc/sysdep.h 2014-05-27 22:45:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/sysdep.h 2014-05-27 22:45:46.000000000 -0500 +@@ -144,6 +144,21 @@ + + #define VRSAVE 256 + ++/* The 32-bit words of a 64-bit dword are at these offsets in memory. */ ++#if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN ++# define LOWORD 0 ++# define HIWORD 4 ++#else ++# define LOWORD 4 ++# define HIWORD 0 ++#endif ++ ++/* The high 16-bit word of a 64-bit dword is at this offset in memory. */ ++#if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN ++# define HISHORT 6 ++#else ++# define HISHORT 0 ++#endif + + /* This seems to always be the case on PPC. */ + #define ALIGNARG(log2) log2 diff --git a/SOURCES/glibc-ppc64le-18.patch b/SOURCES/glibc-ppc64le-18.patch new file mode 100644 index 0000000..f5e327e --- /dev/null +++ b/SOURCES/glibc-ppc64le-18.patch @@ -0,0 +1,81 @@ +# commit 6a31fe7f9cce72b69fce8fe499a2c6ad492c2311 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:32:18 2013 +0930 +# +# PowerPC floating point little-endian [13 of 15] +# http://sourceware.org/ml/libc-alpha/2013-08/msg00088.html +# +# * sysdeps/powerpc/powerpc32/fpu/s_roundf.S: Increase alignment of +# constants to usual value for .cst8 section, and remove redundant +# high address load. +# * sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S: Use float +# constant for 0x1p52. Load little-endian words of double from +# correct stack offsets. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_roundf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_roundf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_roundf.S 2014-05-27 22:50:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/s_roundf.S 2014-05-27 22:50:13.000000000 -0500 +@@ -19,7 +19,7 @@ + #include <sysdep.h> + + .section .rodata.cst8,"aM",@progbits,8 +- .align 2 ++ .align 3 + .LC0: /* 2**23 */ + .long 0x4b000000 + .LC1: /* 0.5 */ +@@ -60,7 +60,6 @@ + #ifdef SHARED + lfs fp10,.LC1-.LC0(r9) + #else +- lis r9,.LC1@ha + lfs fp10,.LC1@l(r9) + #endif + ble- cr6,.L4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S 2014-05-27 22:50:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S 2014-05-27 22:50:13.000000000 -0500 +@@ -19,12 +19,10 @@ + #include <sysdep.h> + #include <math_ldbl_opt.h> + +- .section .rodata.cst12,"aM",@progbits,12 ++ .section .rodata.cst8,"aM",@progbits,8 + .align 3 +- .LC0: /* 0x1.0000000000000p+52 == 2^52 */ +- .long 0x43300000 +- .long 0x00000000 +- .long 0x3f000000 /* Use this for 0.5 */ ++ .LC0: .long (52+127)<<23 /* 0x1p+52 */ ++ .long (-1+127)<<23 /* 0.5 */ + + .section ".text" + +@@ -57,12 +55,12 @@ + addi r9,r9,.LC0-got_label@l + mtlr r11 + cfi_same_value (lr) +- lfd fp9,0(r9) +- lfs fp10,8(r9) ++ lfs fp9,0(r9) ++ lfs fp10,4(r9) + #else + lis r9,.LC0@ha +- lfd fp9,.LC0@l(r9) /* Load 2^52 into fpr9. */ +- lfs fp10,.LC0@l+8(r9) /* Load 0.5 into fpr10. */ ++ lfs fp9,.LC0@l(r9) /* Load 2^52 into fpr9. */ ++ lfs fp10,.LC0@l+4(r9) /* Load 0.5 into fpr10. */ + #endif + fabs fp2,fp1 /* Get the absolute value of x. */ + fsub fp12,fp10,fp10 /* Compute 0.0 into fpr12. */ +@@ -80,8 +78,8 @@ + nop + nop + nop +- lwz r4,12(r1) /* Load return as integer. */ +- lwz r3,8(r1) ++ lwz r3,8+HIWORD(r1) /* Load return as integer. */ ++ lwz r4,8+LOWORD(r1) + .Lout: + addi r1,r1,16 + blr diff --git a/SOURCES/glibc-ppc64le-19.patch b/SOURCES/glibc-ppc64le-19.patch new file mode 100644 index 0000000..bbf7228 --- /dev/null +++ b/SOURCES/glibc-ppc64le-19.patch @@ -0,0 +1,110 @@ +# commit 76a66d510a3737674563133a420f4fd22da42c1b +# Author: Anton Blanchard <anton@au1.ibm.com> +# Date: Sat Aug 17 18:33:02 2013 +0930 +# +# PowerPC floating point little-endian [14 of 15] +# http://sourceware.org/ml/libc-alpha/2013-07/msg00205.html +# +# These all wrongly specified float constants in a 64-bit word. +# +# * sysdeps/powerpc/powerpc64/fpu/s_ceilf.S: Correct float constants +# for little-endian. +# * sysdeps/powerpc/powerpc64/fpu/s_floorf.S: Likewise. +# * sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S: Likewise. +# * sysdeps/powerpc/powerpc64/fpu/s_rintf.S: Likewise. +# * sysdeps/powerpc/powerpc64/fpu/s_roundf.S: Likewise. +# * sysdeps/powerpc/powerpc64/fpu/s_truncf.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S 2014-05-27 22:52:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_ceilf.S 2014-05-27 22:52:18.000000000 -0500 +@@ -19,8 +19,10 @@ + #include <sysdep.h> + + .section ".toc","aw" ++ .p2align 3 + .LC0: /* 2**23 */ +- .tc FD_4b000000_0[TC],0x4b00000000000000 ++ .long 0x4b000000 ++ .long 0x0 + .section ".text" + + EALIGN (__ceilf, 4, 0) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_floorf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_floorf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_floorf.S 2014-05-27 22:52:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_floorf.S 2014-05-27 22:52:18.000000000 -0500 +@@ -19,8 +19,10 @@ + #include <sysdep.h> + + .section ".toc","aw" ++ .p2align 3 + .LC0: /* 2**23 */ +- .tc FD_4b000000_0[TC],0x4b00000000000000 ++ .long 0x4b000000 ++ .long 0x0 + .section ".text" + + EALIGN (__floorf, 4, 0) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S 2014-05-27 22:52:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S 2014-05-27 22:52:18.000000000 -0500 +@@ -26,8 +26,10 @@ + /* float [fp1] nearbyintf(float [fp1]) */ + + .section ".toc","aw" ++ .p2align 3 + .LC0: /* 2**23 */ +- .tc FD_4b000000_0[TC],0x4b00000000000000 ++ .long 0x4b000000 ++ .long 0x0 + .section ".text" + + EALIGN (__nearbyintf, 4, 0) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_rintf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_rintf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_rintf.S 2014-05-27 22:52:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_rintf.S 2014-05-27 22:52:18.000000000 -0500 +@@ -19,8 +19,10 @@ + #include <sysdep.h> + + .section ".toc","aw" ++ .p2align 3 + .LC0: /* 2**23 */ +- .tc FD_4b000000_0[TC],0x4b00000000000000 ++ .long 0x4b000000 ++ .long 0x0 + .section ".text" + + EALIGN (__rintf, 4, 0) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_roundf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_roundf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_roundf.S 2014-05-27 22:52:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_roundf.S 2014-05-27 22:52:18.000000000 -0500 +@@ -19,10 +19,12 @@ + #include <sysdep.h> + + .section ".toc","aw" ++ .p2align 3 + .LC0: /* 2**23 */ +- .tc FD_4b000000_0[TC],0x4b00000000000000 ++ .long 0x4b000000 + .LC1: /* 0.5 */ +- .tc FD_3f000000_0[TC],0x3f00000000000000 ++ .long 0x3f000000 ++ + .section ".text" + + /* float [fp1] roundf (float x [fp1]) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_truncf.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_truncf.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_truncf.S 2014-05-27 22:52:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_truncf.S 2014-05-27 22:52:18.000000000 -0500 +@@ -19,8 +19,10 @@ + #include <sysdep.h> + + .section ".toc","aw" ++ .p2align 3 + .LC0: /* 2**23 */ +- .tc FD_4b000000_0[TC],0x4b00000000000000 ++ .long 0x4b000000 ++ .long 0x0 + .section ".text" + + /* float [fp1] truncf (float x [fp1]) diff --git a/SOURCES/glibc-ppc64le-20.patch b/SOURCES/glibc-ppc64le-20.patch new file mode 100644 index 0000000..1342f97 --- /dev/null +++ b/SOURCES/glibc-ppc64le-20.patch @@ -0,0 +1,43 @@ +# commit fef13a78ea30d4c26d6bab48d731ebe864ee31b0 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:33:45 2013 +0930 +# +# PowerPC floating point little-endian [15 of 15] +# http://sourceware.org/ml/libc-alpha/2013-07/msg00206.html +# +# The union loses when little-endian. +# +# * sysdeps/powerpc/powerpc32/power4/hp-timing.h (HP_TIMING_NOW): +# Don't use a union to pack hi/low value. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h 2014-05-27 22:53:37.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h 2014-05-27 22:53:39.000000000 -0500 +@@ -87,18 +87,15 @@ + + #define HP_TIMING_NOW(Var) \ + do { \ +- union { long long ll; long ii[2]; } _var; \ +- long tmp; \ +- __asm__ __volatile__ ( \ +- "1: mfspr %0,269;" \ +- " mfspr %1,268;" \ +- " mfspr %2,269;" \ +- " cmpw %0,%2;" \ +- " bne 1b;" \ +- : "=r" (_var.ii[0]), "=r" (_var.ii[1]) , "=r" (tmp) \ +- : : "cr0" \ +- ); \ +- Var = _var.ll; \ ++ unsigned int hi, lo, tmp; \ ++ __asm__ __volatile__ ("1: mfspr %0,269;" \ ++ " mfspr %1,268;" \ ++ " mfspr %2,269;" \ ++ " cmpw %0,%2;" \ ++ " bne 1b;" \ ++ : "=&r" (hi), "=&r" (lo), "=&r" (tmp) \ ++ : : "cr0"); \ ++ Var = ((hp_timing_t) hi << 32) | lo; \ + } while (0) + + diff --git a/SOURCES/glibc-ppc64le-21.patch b/SOURCES/glibc-ppc64le-21.patch new file mode 100644 index 0000000..a945404 --- /dev/null +++ b/SOURCES/glibc-ppc64le-21.patch @@ -0,0 +1,294 @@ +# commit be1e5d311342e08ae1f8013342df27b7ded2c156 +# Author: Anton Blanchard <anton@au1.ibm.com> +# Date: Sat Aug 17 18:34:40 2013 +0930 +# +# PowerPC LE setjmp/longjmp +# http://sourceware.org/ml/libc-alpha/2013-08/msg00089.html +# +# Little-endian fixes for setjmp/longjmp. When writing these I noticed +# the setjmp code corrupts the non volatile VMX registers when using an +# unaligned buffer. Anton fixed this, and also simplified it quite a +# bit. +# +# The current code uses boilerplate for the case where we want to store +# 16 bytes to an unaligned address. For that we have to do a +# read/modify/write of two aligned 16 byte quantities. In our case we +# are storing a bunch of back to back data (consective VMX registers), +# and only the start and end of the region need the read/modify/write. +# +# [BZ #15723] +# * sysdeps/powerpc/jmpbuf-offsets.h: Comment fix. +# * sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S: Correct +# _dl_hwcap access for little-endian. +# * sysdeps/powerpc/powerpc32/fpu/setjmp-common.S: Likewise. Don't +# destroy vmx regs when saving unaligned. +# * sysdeps/powerpc/powerpc64/__longjmp-common.S: Correct CR load. +# * sysdeps/powerpc/powerpc64/setjmp-common.S: Likewise CR save. Don't +# destroy vmx regs when saving unaligned. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/jmpbuf-offsets.h glibc-2.17-c758a686/sysdeps/powerpc/jmpbuf-offsets.h +--- glibc-2.17-c758a686/sysdeps/powerpc/jmpbuf-offsets.h 2014-05-27 22:55:23.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/jmpbuf-offsets.h 2014-05-27 22:55:27.000000000 -0500 +@@ -21,12 +21,10 @@ + #define JB_LR 2 /* The address we will return to */ + #if __WORDSIZE == 64 + # define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18*2 words total. */ +-# define JB_CR 21 /* Condition code registers with the VRSAVE at */ +- /* offset 172 (low half of the double word. */ ++# define JB_CR 21 /* Shared dword with VRSAVE. CR word at offset 172. */ + # define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total. */ + # define JB_SIZE (64 * 8) /* As per PPC64-VMX ABI. */ +-# define JB_VRSAVE 21 /* VRSAVE shares a double word with the CR at offset */ +- /* 168 (high half of the double word). */ ++# define JB_VRSAVE 21 /* Shared dword with CR. VRSAVE word at offset 168. */ + # define JB_VRS 40 /* VRs 20 through 31 are saved, 12*4 words total. */ + #else + # define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total. */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S 2014-05-27 22:55:23.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S 2014-05-27 22:55:27.000000000 -0500 +@@ -46,16 +46,16 @@ + # endif + mtlr r6 + cfi_same_value (lr) +- lwz r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r5) ++ lwz r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r5) + # else + lwz r5,_dl_hwcap@got(r5) + mtlr r6 + cfi_same_value (lr) +- lwz r5,4(r5) ++ lwz r5,LOWORD(r5) + # endif + # else +- lis r5,(_dl_hwcap+4)@ha +- lwz r5,(_dl_hwcap+4)@l(r5) ++ lis r5,(_dl_hwcap+LOWORD)@ha ++ lwz r5,(_dl_hwcap+LOWORD)@l(r5) + # endif + andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16) + beq L(no_vmx) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S 2014-05-27 22:55:23.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S 2014-05-27 22:55:27.000000000 -0500 +@@ -97,14 +97,14 @@ + # else + lwz r5,_rtld_global_ro@got(r5) + # endif +- lwz r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r5) ++ lwz r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r5) + # else + lwz r5,_dl_hwcap@got(r5) +- lwz r5,4(r5) ++ lwz r5,LOWORD(r5) + # endif + # else +- lis r6,(_dl_hwcap+4)@ha +- lwz r5,(_dl_hwcap+4)@l(r6) ++ lis r6,(_dl_hwcap+LOWORD)@ha ++ lwz r5,(_dl_hwcap+LOWORD)@l(r6) + # endif + andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16) + beq L(no_vmx) +@@ -114,44 +114,43 @@ + stw r0,((JB_VRSAVE)*4)(3) + addi r6,r5,16 + beq+ L(aligned_save_vmx) ++ + lvsr v0,0,r5 +- vspltisb v1,-1 /* set v1 to all 1's */ +- vspltisb v2,0 /* set v2 to all 0's */ +- vperm v3,v2,v1,v0 /* v3 contains shift mask with num all 1 bytes on left = misalignment */ +- +- +- /* Special case for v20 we need to preserve what is in save area below v20 before obliterating it */ +- lvx v5,0,r5 +- vperm v20,v20,v20,v0 +- vsel v5,v5,v20,v3 +- vsel v20,v20,v2,v3 +- stvx v5,0,r5 +- +-#define save_2vmx_partial(savevr,prev_savevr,hivr,shiftvr,maskvr,savegpr,addgpr) \ +- addi addgpr,addgpr,32; \ +- vperm savevr,savevr,savevr,shiftvr; \ +- vsel hivr,prev_savevr,savevr,maskvr; \ +- stvx hivr,0,savegpr; +- +- save_2vmx_partial(v21,v20,v5,v0,v3,r6,r5) +- save_2vmx_partial(v22,v21,v5,v0,v3,r5,r6) +- save_2vmx_partial(v23,v22,v5,v0,v3,r6,r5) +- save_2vmx_partial(v24,v23,v5,v0,v3,r5,r6) +- save_2vmx_partial(v25,v24,v5,v0,v3,r6,r5) +- save_2vmx_partial(v26,v25,v5,v0,v3,r5,r6) +- save_2vmx_partial(v27,v26,v5,v0,v3,r6,r5) +- save_2vmx_partial(v28,v27,v5,v0,v3,r5,r6) +- save_2vmx_partial(v29,v28,v5,v0,v3,r6,r5) +- save_2vmx_partial(v30,v29,v5,v0,v3,r5,r6) +- +- /* Special case for r31 we need to preserve what is in save area above v31 before obliterating it */ +- addi r5,r5,32 +- vperm v31,v31,v31,v0 +- lvx v4,0,r5 +- vsel v5,v30,v31,v3 +- stvx v5,0,r6 +- vsel v4,v31,v4,v3 +- stvx v4,0,r5 ++ lvsl v1,0,r5 ++ addi r6,r5,-16 ++ ++# define save_misaligned_vmx(savevr,prevvr,shiftvr,tmpvr,savegpr,addgpr) \ ++ addi addgpr,addgpr,32; \ ++ vperm tmpvr,prevvr,savevr,shiftvr; \ ++ stvx tmpvr,0,savegpr ++ ++ /* ++ * We have to be careful not to corrupt the data below v20 and ++ * above v31. To keep things simple we just rotate both ends in ++ * the opposite direction to our main permute so we can use ++ * the common macro. ++ */ ++ ++ /* load and rotate data below v20 */ ++ lvx v2,0,r5 ++ vperm v2,v2,v2,v1 ++ save_misaligned_vmx(v20,v2,v0,v3,r5,r6) ++ save_misaligned_vmx(v21,v20,v0,v3,r6,r5) ++ save_misaligned_vmx(v22,v21,v0,v3,r5,r6) ++ save_misaligned_vmx(v23,v22,v0,v3,r6,r5) ++ save_misaligned_vmx(v24,v23,v0,v3,r5,r6) ++ save_misaligned_vmx(v25,v24,v0,v3,r6,r5) ++ save_misaligned_vmx(v26,v25,v0,v3,r5,r6) ++ save_misaligned_vmx(v27,v26,v0,v3,r6,r5) ++ save_misaligned_vmx(v28,v27,v0,v3,r5,r6) ++ save_misaligned_vmx(v29,v28,v0,v3,r6,r5) ++ save_misaligned_vmx(v30,v29,v0,v3,r5,r6) ++ save_misaligned_vmx(v31,v30,v0,v3,r6,r5) ++ /* load and rotate data above v31 */ ++ lvx v2,0,r6 ++ vperm v2,v2,v2,v1 ++ save_misaligned_vmx(v2,v31,v0,v3,r5,r6) ++ + b L(no_vmx) + + L(aligned_save_vmx): +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S 2014-05-27 22:55:23.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S 2014-05-27 22:55:27.000000000 -0500 +@@ -60,7 +60,7 @@ + beq L(no_vmx) + la r5,((JB_VRS)*8)(3) + andi. r6,r5,0xf +- lwz r0,((JB_VRSAVE)*8)(3) ++ lwz r0,((JB_VRSAVE)*8)(3) /* 32-bit VRSAVE. */ + mtspr VRSAVE,r0 + beq+ L(aligned_restore_vmx) + addi r6,r5,16 +@@ -156,7 +156,7 @@ + lfd fp21,((JB_FPRS+7)*8)(r3) + ld r22,((JB_GPRS+8)*8)(r3) + lfd fp22,((JB_FPRS+8)*8)(r3) +- ld r0,(JB_CR*8)(r3) ++ lwz r0,((JB_CR*8)+4)(r3) /* 32-bit CR. */ + ld r23,((JB_GPRS+9)*8)(r3) + lfd fp23,((JB_FPRS+9)*8)(r3) + ld r24,((JB_GPRS+10)*8)(r3) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S 2014-05-27 22:55:23.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S 2014-05-27 22:55:27.000000000 -0500 +@@ -98,7 +98,7 @@ + mfcr r0 + std r16,((JB_GPRS+2)*8)(3) + stfd fp16,((JB_FPRS+2)*8)(3) +- std r0,(JB_CR*8)(3) ++ stw r0,((JB_CR*8)+4)(3) /* 32-bit CR. */ + std r17,((JB_GPRS+3)*8)(3) + stfd fp17,((JB_FPRS+3)*8)(3) + std r18,((JB_GPRS+4)*8)(3) +@@ -142,50 +142,46 @@ + la r5,((JB_VRS)*8)(3) + andi. r6,r5,0xf + mfspr r0,VRSAVE +- stw r0,((JB_VRSAVE)*8)(3) ++ stw r0,((JB_VRSAVE)*8)(3) /* 32-bit VRSAVE. */ + addi r6,r5,16 + beq+ L(aligned_save_vmx) ++ + lvsr v0,0,r5 +- vspltisb v1,-1 /* set v1 to all 1's */ +- vspltisb v2,0 /* set v2 to all 0's */ +- vperm v3,v2,v1,v0 /* v3 contains shift mask with num all 1 bytes +- on left = misalignment */ +- +- +- /* Special case for v20 we need to preserve what is in save area +- below v20 before obliterating it */ +- lvx v5,0,r5 +- vperm v20,v20,v20,v0 +- vsel v5,v5,v20,v3 +- vsel v20,v20,v2,v3 +- stvx v5,0,r5 +- +-# define save_2vmx_partial(savevr,prev_savevr,hivr,shiftvr,maskvr,savegpr,addgpr) \ +- addi addgpr,addgpr,32; \ +- vperm savevr,savevr,savevr,shiftvr; \ +- vsel hivr,prev_savevr,savevr,maskvr; \ +- stvx hivr,0,savegpr; +- +- save_2vmx_partial(v21,v20,v5,v0,v3,r6,r5) +- save_2vmx_partial(v22,v21,v5,v0,v3,r5,r6) +- save_2vmx_partial(v23,v22,v5,v0,v3,r6,r5) +- save_2vmx_partial(v24,v23,v5,v0,v3,r5,r6) +- save_2vmx_partial(v25,v24,v5,v0,v3,r6,r5) +- save_2vmx_partial(v26,v25,v5,v0,v3,r5,r6) +- save_2vmx_partial(v27,v26,v5,v0,v3,r6,r5) +- save_2vmx_partial(v28,v27,v5,v0,v3,r5,r6) +- save_2vmx_partial(v29,v28,v5,v0,v3,r6,r5) +- save_2vmx_partial(v30,v29,v5,v0,v3,r5,r6) +- +- /* Special case for r31 we need to preserve what is in save area +- above v31 before obliterating it */ +- addi r5,r5,32 +- vperm v31,v31,v31,v0 +- lvx v4,0,r5 +- vsel v5,v30,v31,v3 +- stvx v5,0,r6 +- vsel v4,v31,v4,v3 +- stvx v4,0,r5 ++ lvsl v1,0,r5 ++ addi r6,r5,-16 ++ ++# define save_misaligned_vmx(savevr,prevvr,shiftvr,tmpvr,savegpr,addgpr) \ ++ addi addgpr,addgpr,32; \ ++ vperm tmpvr,prevvr,savevr,shiftvr; \ ++ stvx tmpvr,0,savegpr ++ ++ /* ++ * We have to be careful not to corrupt the data below v20 and ++ * above v31. To keep things simple we just rotate both ends in ++ * the opposite direction to our main permute so we can use ++ * the common macro. ++ */ ++ ++ /* load and rotate data below v20 */ ++ lvx v2,0,r5 ++ vperm v2,v2,v2,v1 ++ save_misaligned_vmx(v20,v2,v0,v3,r5,r6) ++ save_misaligned_vmx(v21,v20,v0,v3,r6,r5) ++ save_misaligned_vmx(v22,v21,v0,v3,r5,r6) ++ save_misaligned_vmx(v23,v22,v0,v3,r6,r5) ++ save_misaligned_vmx(v24,v23,v0,v3,r5,r6) ++ save_misaligned_vmx(v25,v24,v0,v3,r6,r5) ++ save_misaligned_vmx(v26,v25,v0,v3,r5,r6) ++ save_misaligned_vmx(v27,v26,v0,v3,r6,r5) ++ save_misaligned_vmx(v28,v27,v0,v3,r5,r6) ++ save_misaligned_vmx(v29,v28,v0,v3,r6,r5) ++ save_misaligned_vmx(v30,v29,v0,v3,r5,r6) ++ save_misaligned_vmx(v31,v30,v0,v3,r6,r5) ++ /* load and rotate data above v31 */ ++ lvx v2,0,r6 ++ vperm v2,v2,v2,v1 ++ save_misaligned_vmx(v2,v31,v0,v3,r5,r6) ++ + b L(no_vmx) + + L(aligned_save_vmx): diff --git a/SOURCES/glibc-ppc64le-22.patch b/SOURCES/glibc-ppc64le-22.patch new file mode 100644 index 0000000..12a0ff0 --- /dev/null +++ b/SOURCES/glibc-ppc64le-22.patch @@ -0,0 +1,228 @@ +# commit 9b874b2f1eb2550e39d3e9c38772e64a767e9de2 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:35:40 2013 +0930 +# +# PowerPC ugly symbol versioning +# http://sourceware.org/ml/libc-alpha/2013-08/msg00090.html +# +# This patch fixes symbol versioning in setjmp/longjmp. The existing +# code uses raw versions, which results in wrong symbol versioning when +# you want to build glibc with a base version of 2.19 for LE. +# +# Note that the merging the 64-bit and 32-bit versions in novmx-lonjmp.c +# and pt-longjmp.c doesn't result in GLIBC_2.0 versions for 64-bit, due +# to the base in shlib_versions. +# +# * sysdeps/powerpc/longjmp.c: Use proper symbol versioning macros. +# * sysdeps/powerpc/novmx-longjmp.c: Likewise. +# * sysdeps/powerpc/powerpc32/bsd-_setjmp.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/mcount.c: Likewise. +# * sysdeps/powerpc/powerpc32/setjmp.S: Likewise. +# * sysdeps/powerpc/powerpc64/setjmp.S: Likewise. +# * nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c: Likewise. +# +diff -urN glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c 2014-05-27 23:22:12.000000000 -0500 ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c 2014-05-27 23:23:44.000000000 -0500 +@@ -41,13 +41,8 @@ + __novmx__libc_longjmp (env, val); + } + +-# if __WORDSIZE == 64 +-symbol_version (__novmx_longjmp,longjmp,GLIBC_2.3); +-symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.3); +-# else +-symbol_version (__novmx_longjmp,longjmp,GLIBC_2.0); +-symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.0); +-# endif ++compat_symbol (libpthread, __novmx_longjmp, longjmp, GLIBC_2_0); ++compat_symbol (libpthread, __novmx_siglongjmp, siglongjmp, GLIBC_2_0); + #endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)) */ + + void +@@ -62,5 +57,5 @@ + __libc_siglongjmp (env, val); + } + +-versioned_symbol (libc, __vmx_longjmp, longjmp, GLIBC_2_3_4); +-versioned_symbol (libc, __vmx_siglongjmp, siglongjmp, GLIBC_2_3_4); ++versioned_symbol (libpthread, __vmx_longjmp, longjmp, GLIBC_2_3_4); ++versioned_symbol (libpthread, __vmx_siglongjmp, siglongjmp, GLIBC_2_3_4); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/longjmp.c glibc-2.17-c758a686/sysdeps/powerpc/longjmp.c +--- glibc-2.17-c758a686/sysdeps/powerpc/longjmp.c 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/longjmp.c 2014-05-27 23:22:12.000000000 -0500 +@@ -56,6 +56,6 @@ + + default_symbol_version (__vmx__libc_longjmp, __libc_longjmp, GLIBC_PRIVATE); + default_symbol_version (__vmx__libc_siglongjmp, __libc_siglongjmp, GLIBC_PRIVATE); +-default_symbol_version (__vmx_longjmp, _longjmp, GLIBC_2.3.4); +-default_symbol_version (__vmxlongjmp, longjmp, GLIBC_2.3.4); +-default_symbol_version (__vmxsiglongjmp, siglongjmp, GLIBC_2.3.4); ++versioned_symbol (libc, __vmx_longjmp, _longjmp, GLIBC_2_3_4); ++versioned_symbol (libc, __vmxlongjmp, longjmp, GLIBC_2_3_4); ++versioned_symbol (libc, __vmxsiglongjmp, siglongjmp, GLIBC_2_3_4); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/novmx-longjmp.c glibc-2.17-c758a686/sysdeps/powerpc/novmx-longjmp.c +--- glibc-2.17-c758a686/sysdeps/powerpc/novmx-longjmp.c 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/novmx-longjmp.c 2014-05-27 23:22:12.000000000 -0500 +@@ -51,13 +51,7 @@ + weak_alias (__novmx__libc_siglongjmp, __novmxlongjmp) + weak_alias (__novmx__libc_siglongjmp, __novmxsiglongjmp) + +-# if __WORDSIZE == 64 +-symbol_version (__novmx_longjmp,_longjmp,GLIBC_2.3); +-symbol_version (__novmxlongjmp,longjmp,GLIBC_2.3); +-symbol_version (__novmxsiglongjmp,siglongjmp,GLIBC_2.3); +-# else +-symbol_version (__novmx_longjmp,_longjmp,GLIBC_2.0); +-symbol_version (__novmxlongjmp,longjmp,GLIBC_2.0); +-symbol_version (__novmxsiglongjmp,siglongjmp,GLIBC_2.0); +-# endif ++compat_symbol (libc, __novmx_longjmp, _longjmp, GLIBC_2_0); ++compat_symbol (libc, __novmxlongjmp, longjmp, GLIBC_2_0); ++compat_symbol (libc, __novmxsiglongjmp, siglongjmp, GLIBC_2_0); + #endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)) */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-_setjmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-_setjmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-_setjmp.S 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-_setjmp.S 2014-05-27 23:22:12.000000000 -0500 +@@ -32,7 +32,7 @@ + /* Build a versioned object for libc. */ + + # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) +-symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.0); ++compat_symbol (libc, __novmx_setjmp, _setjmp, GLIBC_2_0); + + ENTRY (BP_SYM (__novmx_setjmp)) + li r4,0 /* Set second argument to 0. */ +@@ -41,7 +41,7 @@ + libc_hidden_def (__novmx_setjmp) + # endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) */ + +-default_symbol_version (__vmx_setjmp,_setjmp,GLIBC_2.3.4) ++versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4) + /* __GI__setjmp prototype is needed for ntpl i.e. _setjmp is defined + as a libc_hidden_proto & is used in sysdeps/generic/libc-start.c + if HAVE_CLEANUP_JMP_BUF is defined */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-setjmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-setjmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-setjmp.S 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/bsd-setjmp.S 2014-05-27 23:22:12.000000000 -0500 +@@ -27,7 +27,7 @@ + b __novmx__sigsetjmp@local + END (__novmxsetjmp) + strong_alias (__novmxsetjmp, __novmx__setjmp) +-symbol_version (__novmxsetjmp, setjmp, GLIBC_2.0) ++compat_symbol (libc, __novmxsetjmp, setjmp, GLIBC_2_0) + + #endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) ) */ + +@@ -37,4 +37,4 @@ + END (__vmxsetjmp) + strong_alias (__vmxsetjmp, __vmx__setjmp) + strong_alias (__vmx__setjmp, __setjmp) +-default_symbol_version (__vmxsetjmp,setjmp,GLIBC_2.3.4) ++versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp.S 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/__longjmp.S 2014-05-27 23:22:12.000000000 -0500 +@@ -26,14 +26,14 @@ + + #else /* !NOT_IN_libc */ + /* Build a versioned object for libc. */ +-default_symbol_version (__vmx__longjmp,__longjmp,GLIBC_2.3.4); ++versioned_symbol (libc, __vmx__longjmp, __longjmp, GLIBC_2_3_4); + # define __longjmp __vmx__longjmp + # include "__longjmp-common.S" + + # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) + # define __NO_VMX__ + # undef JB_SIZE +-symbol_version (__novmx__longjmp,__longjmp,GLIBC_2.0); ++compat_symbol (libc, __novmx__longjmp, __longjmp, GLIBC_2_0); + # undef __longjmp + # define __longjmp __novmx__longjmp + # include "__longjmp-common.S" +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp.S 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/fpu/setjmp.S 2014-05-27 23:22:12.000000000 -0500 +@@ -26,7 +26,7 @@ + + #else /* !NOT_IN_libc */ + /* Build a versioned object for libc. */ +-default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) ++versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) + # define __sigsetjmp __vmx__sigsetjmp + # define __sigjmp_save __vmx__sigjmp_save + # include "setjmp-common.S" +@@ -36,7 +36,7 @@ + # undef __sigsetjmp + # undef __sigjmp_save + # undef JB_SIZE +-symbol_version (__novmx__sigsetjmp,__sigsetjmp,GLIBC_2.0) ++compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0) + # define __sigsetjmp __novmx__sigsetjmp + # define __sigjmp_save __novmx__sigjmp_save + # include "setjmp-common.S" +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/mcount.c glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/mcount.c +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/mcount.c 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/mcount.c 2014-05-27 23:22:12.000000000 -0500 +@@ -9,7 +9,7 @@ + /* __mcount_internal was added in glibc 2.15 with version GLIBC_PRIVATE, + but it should have been put in version GLIBC_2.15. Mark the + GLIBC_PRIVATE version obsolete and add it to GLIBC_2.16 instead. */ +-default_symbol_version (___mcount_internal, __mcount_internal, GLIBC_2.16); ++versioned_symbol (libc, ___mcount_internal, __mcount_internal, GLIBC_2_16); + + #if SHLIB_COMPAT (libc, GLIBC_2_15, GLIBC_2_16) + strong_alias (___mcount_internal, ___mcount_internal_private); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp.S 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/setjmp.S 2014-05-27 23:22:12.000000000 -0500 +@@ -25,7 +25,7 @@ + + #else /* !NOT_IN_libc */ + /* Build a versioned object for libc. */ +-default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) ++versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) + # define __sigsetjmp __vmx__sigsetjmp + # define __sigjmp_save __vmx__sigjmp_save + # include "setjmp-common.S" +@@ -35,7 +35,7 @@ + # undef __sigsetjmp + # undef __sigjmp_save + # undef JB_SIZE +-symbol_version (__novmx__sigsetjmp,__sigsetjmp,GLIBC_2.0) ++compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0) + # define __sigsetjmp __novmx__sigsetjmp + # define __sigjmp_save __novmx__sigjmp_save + # include "setjmp-common.S" +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp.S 2014-05-27 23:22:10.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp.S 2014-05-27 23:22:12.000000000 -0500 +@@ -26,9 +26,9 @@ + + #else /* !NOT_IN_libc */ + /* Build a versioned object for libc. */ +-default_symbol_version (__vmxsetjmp, setjmp, GLIBC_2.3.4) +-default_symbol_version (__vmx_setjmp,_setjmp,GLIBC_2.3.4) +-default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) ++versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4) ++versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4) ++versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) + # define setjmp __vmxsetjmp + # define _setjmp __vmx_setjmp + # define __sigsetjmp __vmx__sigsetjmp +@@ -44,9 +44,9 @@ + # undef __sigjmp_save + # undef JB_SIZE + # define __NO_VMX__ +-symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3) +-symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.3); +-symbol_version (__novmx__sigsetjmp,__sigsetjmp,GLIBC_2.3) ++compat_symbol (libc, __novmxsetjmp, setjmp, GLIBC_2_3) ++compat_symbol (libc, __novmx_setjmp,_setjmp, GLIBC_2_3); ++compat_symbol (libc, __novmx__sigsetjmp,__sigsetjmp, GLIBC_2_3) + # define setjmp __novmxsetjmp + # define _setjmp __novmx_setjmp + # define __sigsetjmp __novmx__sigsetjmp diff --git a/SOURCES/glibc-ppc64le-23.patch b/SOURCES/glibc-ppc64le-23.patch new file mode 100644 index 0000000..00288b9 --- /dev/null +++ b/SOURCES/glibc-ppc64le-23.patch @@ -0,0 +1,102 @@ +# commit 02f04a6c7fea2b474b026bbce721d8c658d71fda +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:36:11 2013 +0930 +# +# PowerPC LE _dl_hwcap access +# http://sourceware.org/ml/libc-alpha/2013-08/msg00091.html +# +# More LE support, correcting word accesses to _dl_hwcap. +# +# * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S: Use +# HIWORD/LOWORD. +# * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S: Ditto. +# * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S: Ditto. +# +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S 2014-05-27 23:25:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S 2014-05-27 23:25:38.000000000 -0500 +@@ -151,15 +151,15 @@ + # ifdef SHARED + lwz r7,_rtld_global_ro@got(r7) + mtlr r8 +- lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r7) ++ lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r7) + # else + lwz r7,_dl_hwcap@got(r7) + mtlr r8 +- lwz r7,4(r7) ++ lwz r7,LOWORD(r7) + # endif + # else +- lis r7,(_dl_hwcap+4)@ha +- lwz r7,(_dl_hwcap+4)@l(r7) ++ lis r7,(_dl_hwcap+LOWORD)@ha ++ lwz r7,(_dl_hwcap+LOWORD)@l(r7) + # endif + andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16) + +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S 2014-05-27 23:25:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S 2014-05-27 23:25:38.000000000 -0500 +@@ -79,15 +79,15 @@ + # ifdef SHARED + lwz r7,_rtld_global_ro@got(r7) + mtlr r8 +- lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r7) ++ lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r7) + # else + lwz r7,_dl_hwcap@got(r7) + mtlr r8 +- lwz r7,4(r7) ++ lwz r7,LOWORD(r7) + # endif + #else +- lis r7,(_dl_hwcap+4)@ha +- lwz r7,(_dl_hwcap+4)@l(r7) ++ lis r7,(_dl_hwcap+LOWORD)@ha ++ lwz r7,(_dl_hwcap+LOWORD)@l(r7) + #endif + + #ifdef __CONTEXT_ENABLE_FPRS +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S 2014-05-27 23:25:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S 2014-05-27 23:25:38.000000000 -0500 +@@ -152,15 +152,15 @@ + # ifdef SHARED + lwz r7,_rtld_global_ro@got(r7) + mtlr r8 +- lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r7) ++ lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r7) + # else + lwz r7,_dl_hwcap@got(r7) + mtlr r8 +- lwz r7,4(r7) ++ lwz r7,LOWORD(r7) + # endif + # else +- lis r7,(_dl_hwcap+4)@ha +- lwz r7,(_dl_hwcap+4)@l(r7) ++ lis r7,(_dl_hwcap+LOWORD)@ha ++ lwz r7,(_dl_hwcap+LOWORD)@l(r7) + # endif + + # ifdef __CONTEXT_ENABLE_VRS +@@ -308,14 +308,14 @@ + mtlr r8 + # ifdef SHARED + lwz r7,_rtld_global_ro@got(r7) +- lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r7) ++ lwz r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r7) + # else + lwz r7,_dl_hwcap@got(r7) +- lwz r7,4(r7) ++ lwz r7,LOWORD(r7) + # endif + # else +- lis r7,(_dl_hwcap+4)@ha +- lwz r7,(_dl_hwcap+4)@l(r7) ++ lis r7,(_dl_hwcap+LOWORD)@ha ++ lwz r7,(_dl_hwcap+LOWORD)@l(r7) + # endif + andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16) + la r10,(_UC_VREGS)(r31) diff --git a/SOURCES/glibc-ppc64le-24.patch b/SOURCES/glibc-ppc64le-24.patch new file mode 100644 index 0000000..5870d4f --- /dev/null +++ b/SOURCES/glibc-ppc64le-24.patch @@ -0,0 +1,55 @@ +# commit 0b2c2ace3601d5d59cf89130b16840e7f132f7a6 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:36:45 2013 +0930 +# +# PowerPC makecontext +# http://sourceware.org/ml/libc-alpha/2013-08/msg00092.html +# +# Use conditional form of branch and link to avoid destroying the cpu +# link stack used to predict blr return addresses. +# +# * sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S: Use +# conditional form of branch and link when obtaining pc. +# * sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S 2014-05-28 12:25:49.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S 2014-05-28 12:25:51.000000000 -0500 +@@ -47,7 +47,9 @@ + #ifdef PIC + mflr r0 + cfi_register(lr,r0) +- bl 1f ++ /* Use this conditional form of branch and link to avoid destroying ++ the cpu link stack used to predict blr return addresses. */ ++ bcl 20,31,1f + 1: mflr r6 + addi r6,r6,L(exitcode)-1b + mtlr r0 +@@ -136,7 +138,9 @@ + #ifdef PIC + mflr r0 + cfi_register(lr,r0) +- bl 1f ++ /* Use this conditional form of branch and link to avoid destroying ++ the cpu link stack used to predict blr return addresses. */ ++ bcl 20,31,1f + 1: mflr r6 + addi r6,r6,L(novec_exitcode)-1b + mtlr r0 +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 2014-05-28 12:25:49.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 2014-05-28 12:25:51.000000000 -0500 +@@ -124,8 +124,10 @@ + + /* If the target function returns we need to do some cleanup. We use a + code trick to get the address of our cleanup function into the link +- register. Do not add any code between here and L(exitcode). */ +- bl L(gotexitcodeaddr); ++ register. Do not add any code between here and L(exitcode). ++ Use this conditional form of branch and link to avoid destroying ++ the cpu link stack used to predict blr return addresses. */ ++ bcl 20,31,L(gotexitcodeaddr); + + /* This is the helper code which gets called if a function which + is registered with 'makecontext' returns. In this case we diff --git a/SOURCES/glibc-ppc64le-25.patch b/SOURCES/glibc-ppc64le-25.patch new file mode 100644 index 0000000..144d3f3 --- /dev/null +++ b/SOURCES/glibc-ppc64le-25.patch @@ -0,0 +1,411 @@ +# commit db9b4570c5dc550074140ac1d1677077fba29a26 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:40:11 2013 +0930 +# +# PowerPC LE strlen +# http://sourceware.org/ml/libc-alpha/2013-08/msg00097.html +# +# This is the first of nine patches adding little-endian support to the +# existing optimised string and memory functions. I did spend some +# time with a power7 simulator looking at cycle by cycle behaviour for +# memchr, but most of these patches have not been run on cpu simulators +# to check that we are going as fast as possible. I'm sure PowerPC can +# do better. However, the little-endian support mostly leaves main +# loops unchanged, so I'm banking on previous authors having done a +# good job on big-endian.. As with most code you stare at long enough, +# I found some improvements for big-endian too. +# +# Little-endian support for strlen. Like most of the string functions, +# I leave the main word or multiple-word loops substantially unchanged, +# just needing to modify the tail. +# +# Removing the branch in the power7 functions is just a tidy. .align +# produces a branch anyway. Modifying regs in the non-power7 functions +# is to suit the new little-endian tail. +# +# * sysdeps/powerpc/powerpc64/power7/strlen.S (strlen): Add little-endian +# support. Don't branch over align. +# * sysdeps/powerpc/powerpc32/power7/strlen.S: Likewise. +# * sysdeps/powerpc/powerpc64/strlen.S (strlen): Add little-endian support. +# Rearrange tmp reg use to suit. Comment. +# * sysdeps/powerpc/powerpc32/strlen.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strlen.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strlen.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strlen.S 2014-05-28 12:28:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strlen.S 2014-05-28 12:28:45.000000000 -0500 +@@ -31,7 +31,11 @@ + li r0,0 /* Word with null chars to use with cmpb. */ + li r5,-1 /* MASK = 0xffffffffffffffff. */ + lwz r12,0(r4) /* Load word from memory. */ ++#ifdef __LITTLE_ENDIAN__ ++ slw r5,r5,r6 ++#else + srw 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 WORD1. */ + cmpwi cr7,r10,0 /* If r10 == 0, no null's have been found. */ +@@ -49,9 +53,6 @@ + cmpb r10,r12,r0 + cmpwi cr7,r10,0 + bne cr7,L(done) +- b L(loop) /* We branch here (rather than falling through) +- to skip the nops due to heavy alignment +- of the loop below. */ + + /* Main loop to look for the end of the string. Since it's a + small loop (< 8 instructions), align it to 32-bytes. */ +@@ -88,9 +89,15 @@ + 0xff in the same position as the null byte in the original + word from the string. Use that to calculate the length. */ + L(done): +- cntlzw r0,r10 /* Count leading zeroes before the match. */ ++#ifdef __LITTLE_ENDIAN__ ++ addi r9, r10, -1 /* Form a mask from trailing zeros. */ ++ andc r9, r9, r10 ++ popcntw r0, r9 /* Count the bits in the mask. */ ++#else ++ cntlzw r0,r10 /* Count leading zeros before the match. */ ++#endif + subf r5,r3,r4 +- srwi r0,r0,3 /* Convert leading zeroes to bytes. */ ++ srwi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r5,r0 /* Compute final length. */ + blr + END (BP_SYM (strlen)) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strlen.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strlen.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strlen.S 2014-05-28 12:28:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strlen.S 2014-05-28 12:32:24.000000000 -0500 +@@ -31,7 +31,12 @@ + 1 is subtracted you get a value in the range 0x00-0x7f, none of which + have their high bit set. The expression here is + (x + 0xfefefeff) & ~(x | 0x7f7f7f7f), which gives 0x00000000 when +- there were no 0x00 bytes in the word. ++ there were no 0x00 bytes in the word. You get 0x80 in bytes that ++ match, but possibly false 0x80 matches in the next more significant ++ byte to a true match due to carries. For little-endian this is ++ of no consequence since the least significant match is the one ++ we're interested in, but big-endian needs method 2 to find which ++ byte matches. + + 2) Given a word 'x', we can test to see _which_ byte was zero by + calculating ~(((x & 0x7f7f7f7f) + 0x7f7f7f7f) | x | 0x7f7f7f7f). +@@ -74,7 +79,7 @@ + + ENTRY (BP_SYM (strlen)) + +-#define rTMP1 r0 ++#define rTMP4 r0 + #define rRTN r3 /* incoming STR arg, outgoing result */ + #define rSTR r4 /* current string position */ + #define rPADN r5 /* number of padding bits we prepend to the +@@ -84,9 +89,9 @@ + #define rWORD1 r8 /* current string word */ + #define rWORD2 r9 /* next string word */ + #define rMASK r9 /* mask for first string word */ +-#define rTMP2 r10 +-#define rTMP3 r11 +-#define rTMP4 r12 ++#define rTMP1 r10 ++#define rTMP2 r11 ++#define rTMP3 r12 + + CHECK_BOUNDS_LOW (rRTN, rTMP1, rTMP2) + +@@ -96,15 +101,20 @@ + lwz rWORD1, 0(rSTR) + li rMASK, -1 + addi r7F7F, r7F7F, 0x7f7f +-/* That's the setup done, now do the first pair of words. +- We make an exception and use method (2) on the first two words, to reduce +- overhead. */ ++/* We use method (2) on the first two words, because rFEFE isn't ++ required which reduces setup overhead. Also gives a faster return ++ for small strings on big-endian due to needing to recalculate with ++ method (2) anyway. */ ++#ifdef __LITTLE_ENDIAN__ ++ slw rMASK, rMASK, rPADN ++#else + srw rMASK, rMASK, rPADN ++#endif + and rTMP1, r7F7F, rWORD1 + or rTMP2, r7F7F, rWORD1 + add rTMP1, rTMP1, r7F7F +- nor rTMP1, rTMP2, rTMP1 +- and. rWORD1, rTMP1, rMASK ++ nor rTMP3, rTMP2, rTMP1 ++ and. rTMP3, rTMP3, rMASK + mtcrf 0x01, rRTN + bne L(done0) + lis rFEFE, -0x101 +@@ -113,11 +123,12 @@ + bt 29, L(loop) + + /* Handle second word of pair. */ ++/* Perhaps use method (1) here for little-endian, saving one instruction? */ + lwzu rWORD1, 4(rSTR) + and rTMP1, r7F7F, rWORD1 + or rTMP2, r7F7F, rWORD1 + add rTMP1, rTMP1, r7F7F +- nor. rWORD1, rTMP2, rTMP1 ++ nor. rTMP3, rTMP2, rTMP1 + bne L(done0) + + /* The loop. */ +@@ -131,29 +142,53 @@ + add rTMP3, rFEFE, rWORD2 + nor rTMP4, r7F7F, rWORD2 + bne L(done1) +- and. rTMP1, rTMP3, rTMP4 ++ and. rTMP3, rTMP3, rTMP4 + beq L(loop) + ++#ifndef __LITTLE_ENDIAN__ + and rTMP1, r7F7F, rWORD2 + add rTMP1, rTMP1, r7F7F +- andc rWORD1, rTMP4, rTMP1 ++ andc rTMP3, rTMP4, rTMP1 + b L(done0) + + L(done1): + and rTMP1, r7F7F, rWORD1 + subi rSTR, rSTR, 4 + add rTMP1, rTMP1, r7F7F +- andc rWORD1, rTMP2, rTMP1 ++ andc rTMP3, rTMP2, rTMP1 + + /* When we get to here, rSTR points to the first word in the string that +- contains a zero byte, and the most significant set bit in rWORD1 is in that +- byte. */ ++ contains a zero byte, and rTMP3 has 0x80 for bytes that are zero, ++ and 0x00 otherwise. */ + L(done0): +- cntlzw rTMP3, rWORD1 ++ cntlzw rTMP3, rTMP3 + subf rTMP1, rRTN, rSTR + srwi rTMP3, rTMP3, 3 + add rRTN, rTMP1, rTMP3 + /* GKM FIXME: check high bound. */ + blr ++#else ++ ++L(done0): ++ addi rTMP1, rTMP3, -1 /* Form a mask from trailing zeros. */ ++ andc rTMP1, rTMP1, rTMP3 ++ cntlzw rTMP1, rTMP1 /* Count bits not in the mask. */ ++ subf rTMP3, rRTN, rSTR ++ subfic rTMP1, rTMP1, 32-7 ++ srwi rTMP1, rTMP1, 3 ++ add rRTN, rTMP1, rTMP3 ++ blr ++ ++L(done1): ++ addi rTMP3, rTMP1, -1 ++ andc rTMP3, rTMP3, rTMP1 ++ cntlzw rTMP3, rTMP3 ++ subf rTMP1, rRTN, rSTR ++ subfic rTMP3, rTMP3, 32-7-32 ++ srawi rTMP3, rTMP3, 3 ++ add rRTN, rTMP1, rTMP3 ++ blr ++#endif ++ + END (BP_SYM (strlen)) + libc_hidden_builtin_def (strlen) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strlen.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strlen.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strlen.S 2014-05-28 12:28:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strlen.S 2014-05-28 12:28:45.000000000 -0500 +@@ -32,7 +32,11 @@ + with cmpb. */ + li r5,-1 /* MASK = 0xffffffffffffffff. */ + ld r12,0(r4) /* 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. */ +@@ -50,9 +54,6 @@ + cmpb r10,r12,r0 + cmpdi cr7,r10,0 + bne cr7,L(done) +- b L(loop) /* We branch here (rather than falling through) +- to skip the nops due to heavy alignment +- of the loop below. */ + + /* Main loop to look for the end of the string. Since it's a + small loop (< 8 instructions), align it to 32-bytes. */ +@@ -89,9 +90,15 @@ + 0xff in the same position as the null byte in the original + doubleword from the string. Use that to calculate the length. */ + L(done): +- cntlzd r0,r10 /* Count leading zeroes before the match. */ ++#ifdef __LITTLE_ENDIAN__ ++ addi r9, r10, -1 /* Form a mask from trailing zeros. */ ++ andc r9, r9, r10 ++ popcntd r0, r9 /* Count the bits in the mask. */ ++#else ++ cntlzd r0,r10 /* Count leading zeros before the match. */ ++#endif + subf r5,r3,r4 +- srdi r0,r0,3 /* Convert leading zeroes to bytes. */ ++ srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */ + add r3,r5,r0 /* Compute final length. */ + blr + END (BP_SYM (strlen)) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strlen.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strlen.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strlen.S 2014-05-28 12:28:44.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strlen.S 2014-05-28 12:38:17.000000000 -0500 +@@ -31,7 +31,12 @@ + 1 is subtracted you get a value in the range 0x00-0x7f, none of which + have their high bit set. The expression here is + (x + 0xfefefeff) & ~(x | 0x7f7f7f7f), which gives 0x00000000 when +- there were no 0x00 bytes in the word. ++ there were no 0x00 bytes in the word. You get 0x80 in bytes that ++ match, but possibly false 0x80 matches in the next more significant ++ byte to a true match due to carries. For little-endian this is ++ of no consequence since the least significant match is the one ++ we're interested in, but big-endian needs method 2 to find which ++ byte matches. + + 2) Given a word 'x', we can test to see _which_ byte was zero by + calculating ~(((x & 0x7f7f7f7f) + 0x7f7f7f7f) | x | 0x7f7f7f7f). +@@ -64,7 +69,7 @@ + Answer: + 1) Added a Data Cache Block Touch early to prefetch the first 128 + byte cache line. Adding dcbt instructions to the loop would not be +- effective since most strings will be shorter than the cache line.*/ ++ effective since most strings will be shorter than the cache line. */ + + /* Some notes on register usage: Under the SVR4 ABI, we can use registers + 0 and 3 through 12 (so long as we don't call any procedures) without +@@ -80,7 +85,7 @@ + ENTRY (BP_SYM (strlen)) + CALL_MCOUNT 1 + +-#define rTMP1 r0 ++#define rTMP4 r0 + #define rRTN r3 /* incoming STR arg, outgoing result */ + #define rSTR r4 /* current string position */ + #define rPADN r5 /* number of padding bits we prepend to the +@@ -90,9 +95,9 @@ + #define rWORD1 r8 /* current string doubleword */ + #define rWORD2 r9 /* next string doubleword */ + #define rMASK r9 /* mask for first string doubleword */ +-#define rTMP2 r10 +-#define rTMP3 r11 +-#define rTMP4 r12 ++#define rTMP1 r10 ++#define rTMP2 r11 ++#define rTMP3 r12 + + /* Note: The Bounded pointer support in this code is broken. This code + was inherited from PPC32 and that support was never completed. +@@ -109,30 +114,36 @@ + addi r7F7F, r7F7F, 0x7f7f + li rMASK, -1 + insrdi r7F7F, r7F7F, 32, 0 +-/* That's the setup done, now do the first pair of doublewords. +- We make an exception and use method (2) on the first two doublewords, +- to reduce overhead. */ +- srd rMASK, rMASK, rPADN ++/* We use method (2) on the first two doublewords, because rFEFE isn't ++ required which reduces setup overhead. Also gives a faster return ++ for small strings on big-endian due to needing to recalculate with ++ method (2) anyway. */ ++#ifdef __LITTLE_ENDIAN__ ++ sld rMASK, rMASK, rPADN ++#else ++ srd rMASK, rMASK, rPADN ++#endif + and rTMP1, r7F7F, rWORD1 + or rTMP2, r7F7F, rWORD1 + lis rFEFE, -0x101 + add rTMP1, rTMP1, r7F7F + addi rFEFE, rFEFE, -0x101 +- nor rTMP1, rTMP2, rTMP1 +- and. rWORD1, rTMP1, rMASK ++ nor rTMP3, rTMP2, rTMP1 ++ and. rTMP3, rTMP3, rMASK + mtcrf 0x01, rRTN + bne L(done0) +- sldi rTMP1, rFEFE, 32 +- add rFEFE, rFEFE, rTMP1 ++ sldi rTMP1, rFEFE, 32 ++ add rFEFE, rFEFE, rTMP1 + /* Are we now aligned to a doubleword boundary? */ + bt 28, L(loop) + + /* Handle second doubleword of pair. */ ++/* Perhaps use method (1) here for little-endian, saving one instruction? */ + ldu rWORD1, 8(rSTR) + and rTMP1, r7F7F, rWORD1 + or rTMP2, r7F7F, rWORD1 + add rTMP1, rTMP1, r7F7F +- nor. rWORD1, rTMP2, rTMP1 ++ nor. rTMP3, rTMP2, rTMP1 + bne L(done0) + + /* The loop. */ +@@ -146,29 +157,53 @@ + add rTMP3, rFEFE, rWORD2 + nor rTMP4, r7F7F, rWORD2 + bne L(done1) +- and. rTMP1, rTMP3, rTMP4 ++ and. rTMP3, rTMP3, rTMP4 + beq L(loop) + ++#ifndef __LITTLE_ENDIAN__ + and rTMP1, r7F7F, rWORD2 + add rTMP1, rTMP1, r7F7F +- andc rWORD1, rTMP4, rTMP1 ++ andc rTMP3, rTMP4, rTMP1 + b L(done0) + + L(done1): + and rTMP1, r7F7F, rWORD1 + subi rSTR, rSTR, 8 + add rTMP1, rTMP1, r7F7F +- andc rWORD1, rTMP2, rTMP1 ++ andc rTMP3, rTMP2, rTMP1 + + /* When we get to here, rSTR points to the first doubleword in the string that +- contains a zero byte, and the most significant set bit in rWORD1 is in that +- byte. */ ++ contains a zero byte, and rTMP3 has 0x80 for bytes that are zero, and 0x00 ++ otherwise. */ + L(done0): +- cntlzd rTMP3, rWORD1 ++ cntlzd rTMP3, rTMP3 + subf rTMP1, rRTN, rSTR + srdi rTMP3, rTMP3, 3 + add rRTN, rTMP1, rTMP3 + /* GKM FIXME: check high bound. */ + blr ++#else ++ ++L(done0): ++ addi rTMP1, rTMP3, -1 /* Form a mask from trailing zeros. */ ++ andc rTMP1, rTMP1, rTMP3 ++ cntlzd rTMP1, rTMP1 /* Count bits not in the mask. */ ++ subf rTMP3, rRTN, rSTR ++ subfic rTMP1, rTMP1, 64-7 ++ srdi rTMP1, rTMP1, 3 ++ add rRTN, rTMP1, rTMP3 ++ blr ++ ++L(done1): ++ addi rTMP3, rTMP1, -1 ++ andc rTMP3, rTMP3, rTMP1 ++ cntlzd rTMP3, rTMP3 ++ subf rTMP1, rRTN, rSTR ++ subfic rTMP3, rTMP3, 64-7-64 ++ sradi rTMP3, rTMP3, 3 ++ add rRTN, rTMP1, rTMP3 ++ blr ++#endif ++ + END (BP_SYM (strlen)) + libc_hidden_builtin_def (strlen) diff --git a/SOURCES/glibc-ppc64le-26.patch b/SOURCES/glibc-ppc64le-26.patch new file mode 100644 index 0000000..93fd255 --- /dev/null +++ b/SOURCES/glibc-ppc64le-26.patch @@ -0,0 +1,379 @@ +# commit 33ee81de05e83ce12f32a491270bb4c1611399c7 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:40:48 2013 +0930 +# +# PowerPC LE strnlen +# http://sourceware.org/ml/libc-alpha/2013-08/msg00098.html +# +# The existing strnlen code has a number of defects, so this patch is more +# than just adding little-endian support. The changes here are similar to +# those for memchr. +# +# * sysdeps/powerpc/powerpc64/power7/strnlen.S (strnlen): Add +# little-endian support. Remove unnecessary "are we done" tests. +# Handle "s" wrapping around zero and extremely large "size". +# Correct main loop count. Handle single left-over word from main +# loop inline rather than by using small_loop. Correct comments. +# Delete "zero" tail, use "end_max" instead. +# * sysdeps/powerpc/powerpc32/power7/strnlen.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strnlen.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strnlen.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strnlen.S 2014-05-28 12:40:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strnlen.S 2014-05-28 12:44:52.000000000 -0500 +@@ -30,51 +30,47 @@ + add r7,r3,r4 /* Calculate the last acceptable address. */ + cmplwi r4,16 + li r0,0 /* Word with null chars. */ ++ addi r7,r7,-1 + ble L(small_range) + +- cmplw cr7,r3,r7 /* Is the address equal or less than r3? If +- it's equal or less, it means size is either 0 +- or a negative number. */ +- ble cr7,L(proceed) +- +- li r7,-1 /* Make r11 the biggest if r4 <= 0. */ +-L(proceed): + rlwinm r6,r3,3,27,28 /* Calculate padding. */ + lwz r12,0(r8) /* Load word from memory. */ + cmpb r10,r12,r0 /* Check for null bytes in DWORD1. */ ++#ifdef __LITTLE_ENDIAN__ ++ srw r10,r10,r6 ++ slw r10,r10,r6 ++#else + slw r10,r10,r6 + srw r10,r10,r6 ++#endif + cmplwi cr7,r10,0 /* If r10 == 0, no null's have been found. */ + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,4 +- cmplw cr6,r9,r7 +- bge cr6,L(end_max) +- ++ clrrwi r7,r7,2 /* Address of last word. */ + mtcrf 0x01,r8 + /* Are we now aligned to a doubleword boundary? If so, skip to + the main loop. Otherwise, go through the alignment code. */ + + bt 29,L(loop_setup) + +- /* Handle DWORD2 of pair. */ ++ /* Handle WORD2 of pair. */ + lwzu r12,4(r8) + cmpb r10,r12,r0 + cmplwi cr7,r10,0 + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,4 +- cmplw cr6,r9,r7 +- bge cr6,L(end_max) +- + L(loop_setup): +- sub r5,r7,r9 ++ /* The last word we want to read in the loop below is the one ++ containing the last byte of the string, ie. the word at ++ (s + size - 1) & ~3, or r7. The first word read is at ++ r8 + 4, we read 2 * cnt words, so the last word read will ++ be at r8 + 4 + 8 * cnt - 4. Solving for cnt gives ++ cnt = (r7 - r8) / 8 */ ++ sub r5,r7,r8 + srwi r6,r5,3 /* Number of loop iterations. */ + mtctr r6 /* Setup the counter. */ +- b L(loop) +- /* Main loop to look for the null byte backwards in the string. Since ++ ++ /* Main loop to look for the null byte in the string. Since + it's a small loop (< 8 instructions), align it to 32-bytes. */ + .p2align 5 + L(loop): +@@ -90,15 +86,18 @@ + cmplwi cr7,r5,0 + bne cr7,L(found) + bdnz L(loop) +- /* We're here because the counter reached 0, and that means we +- didn't have any matches for null in the whole range. Just return +- the original size. */ +- addi r9,r8,4 +- cmplw cr6,r9,r7 +- blt cr6,L(loop_small) ++ ++ /* We may have one more word to read. */ ++ cmplw cr6,r8,r7 ++ beq cr6,L(end_max) ++ ++ lwzu r12,4(r8) ++ cmpb r10,r12,r0 ++ cmplwi cr6,r10,0 ++ bne cr6,L(done) + + L(end_max): +- sub r3,r7,r3 ++ mr r3,r4 + blr + + /* OK, one (or both) of the words contains a null byte. Check +@@ -123,49 +122,56 @@ + We need to make sure the null char is *before* the end of the + range. */ + L(done): +- cntlzw r0,r10 /* Count leading zeroes before the match. */ +- srwi r0,r0,3 /* Convert leading zeroes to bytes. */ +- add r9,r8,r0 +- sub r6,r9,r3 /* Length until the match. */ +- cmplw r9,r7 +- bgt L(end_max) +- mr r3,r6 +- blr +- +- .align 4 +-L(zero): +- li r3,0 ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r10,-1 ++ andc r0,r0,r10 ++ popcntw r0,r0 ++#else ++ cntlzw r0,r10 /* Count leading zeros before the match. */ ++#endif ++ sub r3,r8,r3 ++ srwi r0,r0,3 /* Convert leading/trailing zeros to bytes. */ ++ add r3,r3,r0 /* Length until the match. */ ++ cmplw r3,r4 ++ blelr ++ mr r3,r4 + blr + +-/* Deals with size <= 32. */ ++/* Deals with size <= 16. */ + .align 4 + L(small_range): + cmplwi r4,0 +- beq L(zero) ++ beq L(end_max) ++ ++ clrrwi r7,r7,2 /* Address of last word. */ + + rlwinm r6,r3,3,27,28 /* Calculate padding. */ + lwz r12,0(r8) /* Load word from memory. */ + cmpb r10,r12,r0 /* Check for null bytes in WORD1. */ ++#ifdef __LITTLE_ENDIAN__ ++ srw r10,r10,r6 ++ slw r10,r10,r6 ++#else + slw r10,r10,r6 + srw r10,r10,r6 ++#endif + cmplwi cr7,r10,0 + bne cr7,L(done) + +- addi r9,r8,4 +- cmplw r9,r7 +- bge L(end_max) +- b L(loop_small) ++ cmplw r8,r7 ++ beq L(end_max) + + .p2align 5 + L(loop_small): + lwzu r12,4(r8) + cmpb r10,r12,r0 +- addi r9,r8,4 + cmplwi cr6,r10,0 + bne cr6,L(done) +- cmplw r9,r7 +- bge L(end_max) +- b L(loop_small) ++ cmplw r8,r7 ++ bne L(loop_small) ++ mr r3,r4 ++ blr ++ + END (BP_SYM (__strnlen)) + weak_alias (BP_SYM (__strnlen), BP_SYM(strnlen)) + libc_hidden_builtin_def (strnlen) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strnlen.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strnlen.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strnlen.S 2014-05-28 12:40:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strnlen.S 2014-05-28 13:24:41.000000000 -0500 +@@ -26,33 +26,29 @@ + ENTRY (BP_SYM (__strnlen)) + CALL_MCOUNT 2 + dcbt 0,r3 +- clrrdi r8,r3,3 ++ clrrdi r8,r3,3 + add r7,r3,r4 /* Calculate the last acceptable address. */ + cmpldi r4,32 + li r0,0 /* Doubleword with null chars. */ ++ addi r7,r7,-1 ++ + /* If we have less than 33 bytes to search, skip to a faster code. */ + ble L(small_range) + +- cmpld cr7,r3,r7 /* Is the address equal or less than r3? If +- it's equal or less, it means size is either 0 +- or a negative number. */ +- ble cr7,L(proceed) +- +- li r7,-1 /* Make r11 the biggest if r4 <= 0. */ +-L(proceed): + rlwinm r6,r3,3,26,28 /* Calculate padding. */ + ld r12,0(r8) /* Load doubleword from memory. */ + cmpb r10,r12,r0 /* Check for null bytes in DWORD1. */ ++#ifdef __LITTLE_ENDIAN__ ++ srd r10,r10,r6 ++ sld r10,r10,r6 ++#else + sld r10,r10,r6 + srd r10,r10,r6 ++#endif + cmpldi cr7,r10,0 /* If r10 == 0, no null's have been found. */ + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,8 +- cmpld cr6,r9,r7 +- bge cr6,L(end_max) +- ++ clrrdi r7,r7,3 /* Address of last doubleword. */ + mtcrf 0x01,r8 + /* Are we now aligned to a quadword boundary? If so, skip to + the main loop. Otherwise, go through the alignment code. */ +@@ -65,17 +61,18 @@ + cmpldi cr7,r10,0 + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,8 +- cmpld cr6,r9,r7 +- bge cr6,L(end_max) +- + L(loop_setup): +- sub r5,r7,r9 ++ /* The last dword we want to read in the loop below is the one ++ containing the last byte of the string, ie. the dword at ++ (s + size - 1) & ~7, or r7. The first dword read is at ++ r8 + 8, we read 2 * cnt dwords, so the last dword read will ++ be at r8 + 8 + 16 * cnt - 8. Solving for cnt gives ++ cnt = (r7 - r8) / 16 */ ++ sub r5,r7,r8 + srdi r6,r5,4 /* Number of loop iterations. */ + mtctr r6 /* Setup the counter. */ +- b L(loop) +- /* Main loop to look for the null byte backwards in the string. Since ++ ++ /* Main loop to look for the null byte in the string. Since + it's a small loop (< 8 instructions), align it to 32-bytes. */ + .p2align 5 + L(loop): +@@ -91,15 +88,18 @@ + cmpldi cr7,r5,0 + bne cr7,L(found) + bdnz L(loop) +- /* We're here because the counter reached 0, and that means we +- didn't have any matches for null in the whole range. Just return +- the original size. */ +- addi r9,r8,8 +- cmpld cr6,r9,r7 +- blt cr6,L(loop_small) ++ ++ /* We may have one more dword to read. */ ++ cmpld cr6,r8,r7 ++ beq cr6,L(end_max) ++ ++ ldu r12,8(r8) ++ cmpb r10,r12,r0 ++ cmpldi cr6,r10,0 ++ bne cr6,L(done) + + L(end_max): +- sub r3,r7,r3 ++ mr r3,r4 + blr + + /* OK, one (or both) of the doublewords contains a null byte. Check +@@ -121,52 +121,59 @@ + /* 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. +- We need to make sure the null char is *before* the start of the +- range (since we're going backwards). */ ++ We need to make sure the null char is *before* the end of the ++ range. */ + L(done): +- cntlzd r0,r10 /* Count leading zeroes before the match. */ +- srdi r0,r0,3 /* Convert leading zeroes to bytes. */ +- add r9,r8,r0 +- sub r6,r9,r3 /* Length until the match. */ +- cmpld r9,r7 +- bgt L(end_max) +- mr r3,r6 +- blr +- +- .align 4 +-L(zero): +- li r3,0 ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r10,-1 ++ andc r0,r0,r10 ++ popcntd r0,r0 ++#else ++ cntlzd r0,r10 /* Count leading zeros before the match. */ ++#endif ++ sub r3,r8,r3 ++ srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */ ++ add r3,r3,r0 /* Length until the match. */ ++ cmpld r3,r4 ++ blelr ++ mr r3,r4 + blr + + /* Deals with size <= 32. */ + .align 4 + L(small_range): + cmpldi r4,0 +- beq L(zero) ++ beq L(end_max) ++ ++ clrrdi r7,r7,3 /* Address of last doubleword. */ + + rlwinm r6,r3,3,26,28 /* Calculate padding. */ +- ld r12,0(r8) /* Load word from memory. */ ++ ld r12,0(r8) /* Load doubleword from memory. */ + cmpb r10,r12,r0 /* Check for null bytes in DWORD1. */ ++#ifdef __LITTLE_ENDIAN__ ++ srd r10,r10,r6 ++ sld r10,r10,r6 ++#else + sld r10,r10,r6 + srd r10,r10,r6 ++#endif + cmpldi cr7,r10,0 + bne cr7,L(done) + +- addi r9,r8,8 +- cmpld r9,r7 +- bge L(end_max) +- b L(loop_small) ++ cmpld r8,r7 ++ beq L(end_max) + + .p2align 5 + L(loop_small): + ldu r12,8(r8) + cmpb r10,r12,r0 +- addi r9,r8,8 + cmpldi cr6,r10,0 + bne cr6,L(done) +- cmpld r9,r7 +- bge L(end_max) +- b L(loop_small) ++ cmpld r8,r7 ++ bne L(loop_small) ++ mr r3,r4 ++ blr ++ + END (BP_SYM (__strnlen)) + weak_alias (BP_SYM (__strnlen), BP_SYM(strnlen)) + libc_hidden_builtin_def (strnlen) diff --git a/SOURCES/glibc-ppc64le-27.patch b/SOURCES/glibc-ppc64le-27.patch new file mode 100644 index 0000000..83ca794 --- /dev/null +++ b/SOURCES/glibc-ppc64le-27.patch @@ -0,0 +1,861 @@ +# commit 8a7413f9b036da83ffde491a37d9d2340bc321a7 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:41:17 2013 +0930 +# +# PowerPC LE strcmp and strncmp +# http://sourceware.org/ml/libc-alpha/2013-08/msg00099.html +# +# More little-endian support. I leave the main strcmp loops unchanged, +# (well, except for renumbering rTMP to something other than r0 since +# it's needed in an addi insn) and modify the tail for little-endian. +# +# I noticed some of the big-endian tail code was a little untidy so have +# cleaned that up too. +# +# * sysdeps/powerpc/powerpc64/strcmp.S (rTMP2): Define as r0. +# (rTMP): Define as r11. +# (strcmp): Add little-endian support. Optimise tail. +# * sysdeps/powerpc/powerpc32/strcmp.S: Similarly. +# * sysdeps/powerpc/powerpc64/strncmp.S: Likewise. +# * sysdeps/powerpc/powerpc32/strncmp.S: Likewise. +# * sysdeps/powerpc/powerpc64/power4/strncmp.S: Likewise. +# * sysdeps/powerpc/powerpc32/power4/strncmp.S: Likewise. +# * sysdeps/powerpc/powerpc64/power7/strncmp.S: Likewise. +# * sysdeps/powerpc/powerpc32/power7/strncmp.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/strncmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/strncmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/strncmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/strncmp.S 2014-05-28 13:27:02.000000000 -0500 +@@ -26,7 +26,7 @@ + + EALIGN (BP_SYM(strncmp), 4, 0) + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -42,6 +42,7 @@ + #define r7F7F r9 /* constant 0x7f7f7f7f */ + #define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f) */ + #define rBITDIF r11 /* bits that differ in s1 & s2 words */ ++#define rTMP r12 + + dcbt 0,rSTR1 + or rTMP, rSTR2, rSTR1 +@@ -80,12 +81,45 @@ + we don't compare two strings as different because of gunk beyond + the end of the strings... */ + ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ slwi rTMP, rTMP, 1 ++ addi rTMP2, rTMP, -1 ++ andc rTMP2, rTMP2, rTMP ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rldimi rTMP2, rWORD2, 24, 32 ++ rldimi rTMP, rWORD1, 24, 32 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr+ ++ ori rRTN, rTMP2, 1 ++ blr ++ ++L(different): ++ lwz rWORD1, -4(rSTR1) ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rldimi rTMP2, rWORD2, 24, 32 ++ rldimi rTMP, rWORD1, 24, 32 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr+ ++ ori rRTN, rTMP2, 1 ++ blr ++ ++#else + L(endstring): + and rTMP, r7F7F, rWORD1 + beq cr1, L(equal) + add rTMP, rTMP, r7F7F + xor. rBITDIF, rWORD1, rWORD2 +- + andc rNEG, rNEG, rTMP + blt- L(highbit) + cntlzw rBITDIF, rBITDIF +@@ -93,28 +127,20 @@ + addi rNEG, rNEG, 7 + cmpw cr1, rNEG, rBITDIF + sub rRTN, rWORD1, rWORD2 +- blt- cr1, L(equal) +- srawi rRTN, rRTN, 31 +- ori rRTN, rRTN, 1 +- blr ++ bgelr+ cr1 + L(equal): + li rRTN, 0 + blr + + L(different): +- lwzu rWORD1, -4(rSTR1) ++ lwz rWORD1, -4(rSTR1) + xor. rBITDIF, rWORD1, rWORD2 + sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- srawi rRTN, rRTN, 31 +- ori rRTN, rRTN, 1 +- blr ++ bgelr+ + L(highbit): +- srwi rWORD2, rWORD2, 24 +- srwi rWORD1, rWORD1, 24 +- sub rRTN, rWORD1, rWORD2 ++ ori rRTN, rWORD2, 1 + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strncmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strncmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strncmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strncmp.S 2014-05-28 13:27:02.000000000 -0500 +@@ -28,7 +28,7 @@ + + EALIGN (BP_SYM(strncmp),5,0) + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -44,6 +44,7 @@ + #define r7F7F r9 /* constant 0x7f7f7f7f */ + #define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f) */ + #define rBITDIF r11 /* bits that differ in s1 & s2 words */ ++#define rTMP r12 + + dcbt 0,rSTR1 + nop +@@ -83,13 +84,45 @@ + /* OK. We've hit the end of the string. We need to be careful that + we don't compare two strings as different because of gunk beyond + the end of the strings... */ ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ slwi rTMP, rTMP, 1 ++ addi rTMP2, rTMP, -1 ++ andc rTMP2, rTMP2, rTMP ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rldimi rTMP2, rWORD2, 24, 32 ++ rldimi rTMP, rWORD1, 24, 32 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr ++ ori rRTN, rTMP2, 1 ++ blr ++ ++L(different): ++ lwz rWORD1, -4(rSTR1) ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rldimi rTMP2, rWORD2, 24, 32 ++ rldimi rTMP, rWORD1, 24, 32 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr ++ ori rRTN, rTMP2, 1 ++ blr + ++#else + L(endstring): + and rTMP,r7F7F,rWORD1 + beq cr1,L(equal) + add rTMP,rTMP,r7F7F + xor. rBITDIF,rWORD1,rWORD2 +- + andc rNEG,rNEG,rTMP + blt L(highbit) + cntlzw rBITDIF,rBITDIF +@@ -97,28 +130,20 @@ + addi rNEG,rNEG,7 + cmpw cr1,rNEG,rBITDIF + sub rRTN,rWORD1,rWORD2 +- blt cr1,L(equal) +- srawi rRTN,rRTN,31 +- ori rRTN,rRTN,1 +- blr ++ bgelr cr1 + L(equal): + li rRTN,0 + blr + + L(different): +- lwzu rWORD1,-4(rSTR1) ++ lwz rWORD1,-4(rSTR1) + xor. rBITDIF,rWORD1,rWORD2 + sub rRTN,rWORD1,rWORD2 +- blt L(highbit) +- srawi rRTN,rRTN,31 +- ori rRTN,rRTN,1 +- blr ++ bgelr + L(highbit): +- srwi rWORD2,rWORD2,24 +- srwi rWORD1,rWORD1,24 +- sub rRTN,rWORD1,rWORD2 ++ ori rRTN, rWORD2, 1 + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcmp.S 2014-05-28 13:27:02.000000000 -0500 +@@ -26,7 +26,7 @@ + + EALIGN (BP_SYM (strcmp), 4, 0) + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -40,6 +40,7 @@ + #define r7F7F r8 /* constant 0x7f7f7f7f */ + #define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f) */ + #define rBITDIF r10 /* bits that differ in s1 & s2 words */ ++#define rTMP r11 + + CHECK_BOUNDS_LOW (rSTR1, rTMP, rHIGH1) + CHECK_BOUNDS_LOW (rSTR2, rTMP, rHIGH2) +@@ -64,10 +65,45 @@ + and. rTMP, rTMP, rNEG + cmpw cr1, rWORD1, rWORD2 + beq+ L(g0) +-L(endstring): ++ + /* OK. We've hit the end of the string. We need to be careful that + we don't compare two strings as different because of gunk beyond + the end of the strings... */ ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ addi rTMP2, rTMP, -1 ++ andc rTMP2, rTMP2, rTMP ++ rlwimi rTMP2, rTMP2, 1, 0, 30 ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rlwimi rTMP2, rWORD2, 24, 0, 7 ++ rlwimi rTMP, rWORD1, 24, 0, 7 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr+ ++ ori rRTN, rTMP2, 1 ++ blr ++ ++L(different): ++ lwz rWORD1, -4(rSTR1) ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rlwimi rTMP2, rWORD2, 24, 0, 7 ++ rlwimi rTMP, rWORD1, 24, 0, 7 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr+ ++ ori rRTN, rTMP2, 1 ++ blr ++ ++#else ++L(endstring): + and rTMP, r7F7F, rWORD1 + beq cr1, L(equal) + add rTMP, rTMP, r7F7F +@@ -94,7 +130,7 @@ + ori rRTN, rWORD2, 1 + /* GKM FIXME: check high bounds. */ + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strncmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strncmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strncmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strncmp.S 2014-05-28 13:27:02.000000000 -0500 +@@ -26,7 +26,7 @@ + + EALIGN (BP_SYM(strncmp), 4, 0) + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -40,6 +40,7 @@ + #define r7F7F r9 /* constant 0x7f7f7f7f */ + #define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f) */ + #define rBITDIF r11 /* bits that differ in s1 & s2 words */ ++#define rTMP r12 + + dcbt 0,rSTR1 + or rTMP, rSTR2, rSTR1 +@@ -78,12 +79,45 @@ + we don't compare two strings as different because of gunk beyond + the end of the strings... */ + ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ slwi rTMP, rTMP, 1 ++ addi rTMP2, rTMP, -1 ++ andc rTMP2, rTMP2, rTMP ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rlwimi rTMP2, rWORD2, 24, 0, 7 ++ rlwimi rTMP, rWORD1, 24, 0, 7 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr+ ++ ori rRTN, rTMP2, 1 ++ blr ++ ++L(different): ++ lwz rWORD1, -4(rSTR1) ++ rlwinm rTMP2, rWORD2, 8, 0xffffffff /* Byte reverse word. */ ++ rlwinm rTMP, rWORD1, 8, 0xffffffff ++ rlwimi rTMP2, rWORD2, 24, 0, 7 ++ rlwimi rTMP, rWORD1, 24, 0, 7 ++ rlwimi rTMP2, rWORD2, 24, 16, 23 ++ rlwimi rTMP, rWORD1, 24, 16, 23 ++ xor. rBITDIF, rTMP, rTMP2 ++ sub rRTN, rTMP, rTMP2 ++ bgelr+ ++ ori rRTN, rTMP2, 1 ++ blr ++ ++#else + L(endstring): + and rTMP, r7F7F, rWORD1 + beq cr1, L(equal) + add rTMP, rTMP, r7F7F + xor. rBITDIF, rWORD1, rWORD2 +- + andc rNEG, rNEG, rTMP + blt- L(highbit) + cntlzw rBITDIF, rBITDIF +@@ -91,28 +125,20 @@ + addi rNEG, rNEG, 7 + cmpw cr1, rNEG, rBITDIF + sub rRTN, rWORD1, rWORD2 +- blt- cr1, L(equal) +- srawi rRTN, rRTN, 31 +- ori rRTN, rRTN, 1 +- blr ++ bgelr+ cr1 + L(equal): + li rRTN, 0 + blr + + L(different): +- lwzu rWORD1, -4(rSTR1) ++ lwz rWORD1, -4(rSTR1) + xor. rBITDIF, rWORD1, rWORD2 + sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- srawi rRTN, rRTN, 31 +- ori rRTN, rRTN, 1 +- blr ++ bgelr+ + L(highbit): +- srwi rWORD2, rWORD2, 24 +- srwi rWORD1, rWORD1, 24 +- sub rRTN, rWORD1, rWORD2 ++ ori rRTN, rWORD2, 1 + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/strncmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/strncmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/strncmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/strncmp.S 2014-05-28 13:27:02.000000000 -0500 +@@ -27,7 +27,7 @@ + EALIGN (BP_SYM(strncmp), 4, 0) + CALL_MCOUNT 3 + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -43,6 +43,7 @@ + #define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */ + #define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ + #define rBITDIF r11 /* bits that differ in s1 & s2 words */ ++#define rTMP r12 + + dcbt 0,rSTR1 + or rTMP, rSTR2, rSTR1 +@@ -84,12 +85,59 @@ + we don't compare two strings as different because of gunk beyond + the end of the strings... */ + ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ addi rTMP2, rTMP, -1 ++ beq cr1, L(equal) ++ andc rTMP2, rTMP2, rTMP ++ rldimi rTMP2, rTMP2, 1, 0 ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ cmpd cr1, rWORD1, rWORD2 ++ beq cr1, L(equal) ++ xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ ++ neg rNEG, rBITDIF ++ and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ ++ cntlzd rNEG, rNEG /* bitcount of the bit. */ ++ andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ ++ sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ ++ sld rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt- L(highbit) ++ sradi rRTN, rRTN, 63 /* must return an int. */ ++ ori rRTN, rRTN, 1 ++ blr ++L(equal): ++ li rRTN, 0 ++ blr ++ ++L(different): ++ ld rWORD1, -8(rSTR1) ++ xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ ++ neg rNEG, rBITDIF ++ and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ ++ cntlzd rNEG, rNEG /* bitcount of the bit. */ ++ andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ ++ sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ ++ sld rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt- L(highbit) ++ sradi rRTN, rRTN, 63 ++ ori rRTN, rRTN, 1 ++ blr ++L(highbit): ++ sradi rRTN, rWORD2, 63 ++ ori rRTN, rRTN, 1 ++ blr ++ ++#else + L(endstring): + and rTMP, r7F7F, rWORD1 + beq cr1, L(equal) + add rTMP, rTMP, r7F7F + xor. rBITDIF, rWORD1, rWORD2 +- + andc rNEG, rNEG, rTMP + blt- L(highbit) + cntlzd rBITDIF, rBITDIF +@@ -98,7 +146,7 @@ + cmpd cr1, rNEG, rBITDIF + sub rRTN, rWORD1, rWORD2 + blt- cr1, L(equal) +- sradi rRTN, rRTN, 63 ++ sradi rRTN, rRTN, 63 /* must return an int. */ + ori rRTN, rRTN, 1 + blr + L(equal): +@@ -106,7 +154,7 @@ + blr + + L(different): +- ldu rWORD1, -8(rSTR1) ++ ld rWORD1, -8(rSTR1) + xor. rBITDIF, rWORD1, rWORD2 + sub rRTN, rWORD1, rWORD2 + blt- L(highbit) +@@ -114,11 +162,10 @@ + ori rRTN, rRTN, 1 + blr + L(highbit): +- srdi rWORD2, rWORD2, 56 +- srdi rWORD1, rWORD1, 56 +- sub rRTN, rWORD1, rWORD2 ++ sradi rRTN, rWORD2, 63 ++ ori rRTN, rRTN, 1 + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strncmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strncmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strncmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strncmp.S 2014-05-28 13:27:02.000000000 -0500 +@@ -29,7 +29,7 @@ + EALIGN (BP_SYM(strncmp),5,0) + CALL_MCOUNT 3 + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -45,6 +45,7 @@ + #define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */ + #define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ + #define rBITDIF r11 /* bits that differ in s1 & s2 words */ ++#define rTMP r12 + + dcbt 0,rSTR1 + nop +@@ -88,12 +89,57 @@ + we don't compare two strings as different because of gunk beyond + the end of the strings... */ + ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ addi rTMP2, rTMP, -1 ++ beq cr1, L(equal) ++ andc rTMP2, rTMP2, rTMP ++ rldimi rTMP2, rTMP2, 1, 0 ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ cmpd cr1, rWORD1, rWORD2 ++ beq cr1, L(equal) ++ cmpb rBITDIF, rWORD1, rWORD2 /* 0xff on equal bytes. */ ++ addi rNEG, rBITDIF, 1 ++ orc rNEG, rNEG, rBITDIF /* 0's below LS differing byte. */ ++ sldi rNEG, rNEG, 8 /* 1's above LS differing byte. */ ++ andc rWORD1, rWORD1, rNEG /* mask off MS bytes. */ ++ andc rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt L(highbit) ++ sradi rRTN, rRTN, 63 /* must return an int. */ ++ ori rRTN, rRTN, 1 ++ blr ++L(equal): ++ li rRTN, 0 ++ blr ++ ++L(different): ++ ld rWORD1, -8(rSTR1) ++ cmpb rBITDIF, rWORD1, rWORD2 /* 0xff on equal bytes. */ ++ addi rNEG, rBITDIF, 1 ++ orc rNEG, rNEG, rBITDIF /* 0's below LS differing byte. */ ++ sldi rNEG, rNEG, 8 /* 1's above LS differing byte. */ ++ andc rWORD1, rWORD1, rNEG /* mask off MS bytes. */ ++ andc rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt L(highbit) ++ sradi rRTN, rRTN, 63 ++ ori rRTN, rRTN, 1 ++ blr ++L(highbit): ++ sradi rRTN, rWORD2, 63 ++ ori rRTN, rRTN, 1 ++ blr ++ ++#else + L(endstring): + and rTMP,r7F7F,rWORD1 + beq cr1,L(equal) + add rTMP,rTMP,r7F7F + xor. rBITDIF,rWORD1,rWORD2 +- + andc rNEG,rNEG,rTMP + blt L(highbit) + cntlzd rBITDIF,rBITDIF +@@ -102,7 +148,7 @@ + cmpd cr1,rNEG,rBITDIF + sub rRTN,rWORD1,rWORD2 + blt cr1,L(equal) +- sradi rRTN,rRTN,63 ++ sradi rRTN,rRTN,63 /* must return an int. */ + ori rRTN,rRTN,1 + blr + L(equal): +@@ -110,7 +156,7 @@ + blr + + L(different): +- ldu rWORD1,-8(rSTR1) ++ ld rWORD1,-8(rSTR1) + xor. rBITDIF,rWORD1,rWORD2 + sub rRTN,rWORD1,rWORD2 + blt L(highbit) +@@ -118,11 +164,10 @@ + ori rRTN,rRTN,1 + blr + L(highbit): +- srdi rWORD2,rWORD2,56 +- srdi rWORD1,rWORD1,56 +- sub rRTN,rWORD1,rWORD2 ++ sradi rRTN,rWORD2,63 ++ ori rRTN,rRTN,1 + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcmp.S 2014-05-28 13:37:15.000000000 -0500 +@@ -27,7 +27,7 @@ + EALIGN (BP_SYM(strcmp), 4, 0) + CALL_MCOUNT 2 + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -46,6 +46,7 @@ + #define r7F7F r8 /* constant 0x7f7f7f7f7f7f7f7f */ + #define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ + #define rBITDIF r10 /* bits that differ in s1 & s2 words */ ++#define rTMP r11 + + CHECK_BOUNDS_LOW (rSTR1, rTMP, rHIGH1) + CHECK_BOUNDS_LOW (rSTR2, rTMP, rHIGH2) +@@ -72,19 +73,66 @@ + ldu rWORD2, 8(rSTR2) + L(g1): add rTMP, rFEFE, rWORD1 + nor rNEG, r7F7F, rWORD1 +- + and. rTMP, rTMP, rNEG + cmpd cr1, rWORD1, rWORD2 + beq+ L(g0) +-L(endstring): ++ + /* OK. We've hit the end of the string. We need to be careful that + we don't compare two strings as different because of gunk beyond + the end of the strings... */ ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ addi rTMP2, rTMP, -1 ++ beq cr1, L(equal) ++ andc rTMP2, rTMP2, rTMP ++ rldimi rTMP2, rTMP2, 1, 0 ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ cmpd cr1, rWORD1, rWORD2 ++ beq cr1, L(equal) ++ xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ ++ neg rNEG, rBITDIF ++ and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ ++ cntlzd rNEG, rNEG /* bitcount of the bit. */ ++ andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ ++ sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ ++ sld rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt- L(highbit) ++ sradi rRTN, rRTN, 63 /* must return an int. */ ++ ori rRTN, rRTN, 1 ++ blr ++L(equal): ++ li rRTN, 0 ++ blr ++ ++L(different): ++ ld rWORD1, -8(rSTR1) ++ xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ ++ neg rNEG, rBITDIF ++ and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ ++ cntlzd rNEG, rNEG /* bitcount of the bit. */ ++ andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ ++ sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ ++ sld rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt- L(highbit) ++ sradi rRTN, rRTN, 63 ++ ori rRTN, rRTN, 1 ++ blr ++L(highbit): ++ sradi rRTN, rWORD2, 63 ++ ori rRTN, rRTN, 1 ++ blr ++ ++#else ++L(endstring): + and rTMP, r7F7F, rWORD1 + beq cr1, L(equal) + add rTMP, rTMP, r7F7F + xor. rBITDIF, rWORD1, rWORD2 +- + andc rNEG, rNEG, rTMP + blt- L(highbit) + cntlzd rBITDIF, rBITDIF +@@ -93,7 +141,7 @@ + cmpd cr1, rNEG, rBITDIF + sub rRTN, rWORD1, rWORD2 + blt- cr1, L(equal) +- sradi rRTN, rRTN, 63 ++ sradi rRTN, rRTN, 63 /* must return an int. */ + ori rRTN, rRTN, 1 + blr + L(equal): +@@ -110,12 +158,11 @@ + ori rRTN, rRTN, 1 + blr + L(highbit): +- srdi rWORD2, rWORD2, 56 +- srdi rWORD1, rWORD1, 56 +- sub rRTN, rWORD1, rWORD2 ++ sradi rRTN, rWORD2, 63 ++ ori rRTN, rRTN, 1 + /* GKM FIXME: check high bounds. */ + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strncmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strncmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strncmp.S 2014-05-28 13:26:59.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strncmp.S 2014-05-28 13:38:31.000000000 -0500 +@@ -27,7 +27,7 @@ + EALIGN (BP_SYM(strncmp), 4, 0) + CALL_MCOUNT 3 + +-#define rTMP r0 ++#define rTMP2 r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -41,6 +41,7 @@ + #define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */ + #define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ + #define rBITDIF r11 /* bits that differ in s1 & s2 words */ ++#define rTMP r12 + + dcbt 0,rSTR1 + or rTMP, rSTR2, rSTR1 +@@ -81,13 +82,60 @@ + /* OK. We've hit the end of the string. We need to be careful that + we don't compare two strings as different because of gunk beyond + the end of the strings... */ +- ++ ++#ifdef __LITTLE_ENDIAN__ ++L(endstring): ++ addi rTMP2, rTMP, -1 ++ beq cr1, L(equal) ++ andc rTMP2, rTMP2, rTMP ++ rldimi rTMP2, rTMP2, 1, 0 ++ and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ ++ and rWORD1, rWORD1, rTMP2 ++ cmpd cr1, rWORD1, rWORD2 ++ beq cr1, L(equal) ++ xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ ++ neg rNEG, rBITDIF ++ and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ ++ cntlzd rNEG, rNEG /* bitcount of the bit. */ ++ andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ ++ sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ ++ sld rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt- L(highbit) ++ sradi rRTN, rRTN, 63 /* must return an int. */ ++ ori rRTN, rRTN, 1 ++ blr ++L(equal): ++ li rRTN, 0 ++ blr ++ ++L(different): ++ ld rWORD1, -8(rSTR1) ++ xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ ++ neg rNEG, rBITDIF ++ and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ ++ cntlzd rNEG, rNEG /* bitcount of the bit. */ ++ andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ ++ sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ ++ sld rWORD2, rWORD2, rNEG ++ xor. rBITDIF, rWORD1, rWORD2 ++ sub rRTN, rWORD1, rWORD2 ++ blt- L(highbit) ++ sradi rRTN, rRTN, 63 ++ ori rRTN, rRTN, 1 ++ blr ++L(highbit): ++ sradi rRTN, rWORD2, 63 ++ ori rRTN, rRTN, 1 ++ blr ++ ++#else + L(endstring): + and rTMP, r7F7F, rWORD1 + beq cr1, L(equal) + add rTMP, rTMP, r7F7F + xor. rBITDIF, rWORD1, rWORD2 +- + andc rNEG, rNEG, rTMP + blt- L(highbit) + cntlzd rBITDIF, rBITDIF +@@ -96,7 +144,7 @@ + cmpd cr1, rNEG, rBITDIF + sub rRTN, rWORD1, rWORD2 + blt- cr1, L(equal) +- sradi rRTN, rRTN, 63 ++ sradi rRTN, rRTN, 63 /* must return an int. */ + ori rRTN, rRTN, 1 + blr + L(equal): +@@ -104,7 +152,7 @@ + blr + + L(different): +- ldu rWORD1, -8(rSTR1) ++ ld rWORD1, -8(rSTR1) + xor. rBITDIF, rWORD1, rWORD2 + sub rRTN, rWORD1, rWORD2 + blt- L(highbit) +@@ -112,11 +160,10 @@ + ori rRTN, rRTN, 1 + blr + L(highbit): +- srdi rWORD2, rWORD2, 56 +- srdi rWORD1, rWORD1, 56 +- sub rRTN, rWORD1, rWORD2 ++ sradi rRTN, rWORD2, 63 ++ ori rRTN, rRTN, 1 + blr +- ++#endif + + /* Oh well. In this case, we just do a byte-by-byte comparison. */ + .align 4 diff --git a/SOURCES/glibc-ppc64le-28.patch b/SOURCES/glibc-ppc64le-28.patch new file mode 100644 index 0000000..05f63e9 --- /dev/null +++ b/SOURCES/glibc-ppc64le-28.patch @@ -0,0 +1,167 @@ +# commit 43b84013714c46e6dcae4a5564c5527777ad5e08 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:45:31 2013 +0930 +# +# PowerPC LE strcpy +# http://sourceware.org/ml/libc-alpha/2013-08/msg00100.html +# +# The strcpy changes for little-endian are quite straight-forward, just +# a matter of rotating the last word differently. +# +# I'll note that the powerpc64 version of stpcpy is just begging to be +# converted to use 64-bit loads and stores.. +# +# * sysdeps/powerpc/powerpc64/strcpy.S: Add little-endian support: +# * sysdeps/powerpc/powerpc32/strcpy.S: Likewise. +# * sysdeps/powerpc/powerpc64/stpcpy.S: Likewise. +# * sysdeps/powerpc/powerpc32/stpcpy.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S 2014-05-28 13:40:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/stpcpy.S 2014-05-28 13:40:01.000000000 -0500 +@@ -74,7 +74,22 @@ + + mr rALT, rWORD + /* We've hit the end of the string. Do the rest byte-by-byte. */ +-L(g1): rlwinm. rTMP, rALT, 8, 24, 31 ++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 +@@ -87,6 +102,7 @@ + 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 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S 2014-05-28 13:40:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strcpy.S 2014-05-28 13:40:01.000000000 -0500 +@@ -78,7 +78,22 @@ + + mr rALT, rWORD + /* We've hit the end of the string. Do the rest byte-by-byte. */ +-L(g1): rlwinm. rTMP, rALT, 8, 24, 31 ++L(g1): ++#ifdef __LITTLE_ENDIAN__ ++ rlwinm. rTMP, rALT, 0, 24, 31 ++ stb rALT, 4(rDEST) ++ beqlr- ++ rlwinm. rTMP, rALT, 24, 24, 31 ++ stb rTMP, 5(rDEST) ++ beqlr- ++ rlwinm. rTMP, rALT, 16, 24, 31 ++ stb rTMP, 6(rDEST) ++ beqlr- ++ rlwinm rTMP, rALT, 8, 24, 31 ++ stb rTMP, 7(rDEST) ++ blr ++#else ++ rlwinm. rTMP, rALT, 8, 24, 31 + stb rTMP, 4(rDEST) + beqlr- + rlwinm. rTMP, rALT, 16, 24, 31 +@@ -90,6 +105,7 @@ + stb rALT, 7(rDEST) + /* GKM FIXME: check high bound. */ + blr ++#endif + + /* Oh well. In this case, we just do a byte-by-byte copy. */ + .align 4 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S 2014-05-28 13:40:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/stpcpy.S 2014-05-28 13:40:01.000000000 -0500 +@@ -75,7 +75,22 @@ + + mr rALT, rWORD + /* We've hit the end of the string. Do the rest byte-by-byte. */ +-L(g1): rlwinm. rTMP, rALT, 8, 24, 31 ++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 +@@ -88,6 +103,7 @@ + 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 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S 2014-05-28 13:40:01.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strcpy.S 2014-05-28 13:40:01.000000000 -0500 +@@ -90,6 +90,32 @@ + 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 ++ stb rALT, 8(rDEST) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 48 ++ stb rTMP, 9(rDEST) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 40 ++ stb rTMP, 10(rDEST) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 32 ++ stb rTMP, 11(rDEST) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 24 ++ stb rTMP, 12(rDEST) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 16 ++ stb rTMP, 13(rDEST) ++ beqlr- ++ extrdi. rTMP, rALT, 8, 8 ++ stb rTMP, 14(rDEST) ++ beqlr- ++ extrdi rTMP, rALT, 8, 0 ++ stb rTMP, 15(rDEST) ++ blr ++#else + extrdi. rTMP, rALT, 8, 0 + stb rTMP, 8(rDEST) + beqlr- +@@ -114,6 +140,7 @@ + stb rALT, 15(rDEST) + /* GKM FIXME: check high bound. */ + blr ++#endif + + /* Oh well. In this case, we just do a byte-by-byte copy. */ + .align 4 diff --git a/SOURCES/glibc-ppc64le-29.patch b/SOURCES/glibc-ppc64le-29.patch new file mode 100644 index 0000000..291155e --- /dev/null +++ b/SOURCES/glibc-ppc64le-29.patch @@ -0,0 +1,642 @@ +# commit 664318c3eb07032e2bfcf47cb2aa3c89280c19e7 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:46:05 2013 +0930 +# +# PowerPC LE strchr +# http://sourceware.org/ml/libc-alpha/2013-08/msg00101.html +# +# Adds little-endian support to optimised strchr assembly. I've also +# tweaked the big-endian code a little. In power7/strchr.S there's a +# check in the tail of the function that we didn't match 0 before +# finding a c match, done by comparing leading zero counts. It's just +# as valid, and quicker, to compare the raw output from cmpb. +# +# Another little tweak is to use rldimi/insrdi in place of rlwimi for +# the power7 strchr functions. Since rlwimi is cracked, it is a few +# cycles slower. rldimi can be used on the 32-bit power7 functions +# too. +# +# * sysdeps/powerpc/powerpc64/power7/strchr.S (strchr): Add little-endian +# support. Correct typos, formatting. Optimize tail. Use insrdi +# rather than rlwimi. +# * sysdeps/powerpc/powerpc32/power7/strchr.S: Likewise. +# * sysdeps/powerpc/powerpc64/power7/strchrnul.S (__strchrnul): Add +# little-endian support. Correct typos. +# * sysdeps/powerpc/powerpc32/power7/strchrnul.S: Likewise. Use insrdi +# rather than rlwimi. +# * sysdeps/powerpc/powerpc64/strchr.S (rTMP4, rTMP5): Define. Use +# in loop and entry code to keep "and." results. +# (strchr): Add little-endian support. Comment. Move cntlzd +# earlier in tail. +# * sysdeps/powerpc/powerpc32/strchr.S: Likewise. +# +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strchr.S +=================================================================== +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strchr.S.orig ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strchr.S +@@ -37,8 +37,8 @@ ENTRY (BP_SYM(strchr)) + beq cr7,L(null_match) + + /* Replicate byte to word. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrdi r4,r4,8,48 ++ insrdi r4,r4,16,32 + + /* Now r4 has a word of c bytes and r0 has + a word of null bytes. */ +@@ -48,11 +48,17 @@ ENTRY (BP_SYM(strchr)) + + /* Move the words left and right to discard the bits that are + not part of the string and to bring them back as zeros. */ +- ++#ifdef __LITTLE_ENDIAN__ ++ srw r10,r10,r6 ++ srw r11,r11,r6 ++ slw r10,r10,r6 ++ slw r11,r11,r6 ++#else + slw r10,r10,r6 + slw r11,r11,r6 + srw r10,r10,r6 + srw r11,r11,r6 ++#endif + or r5,r10,r11 /* OR the results to speed things up. */ + cmpwi cr7,r5,0 /* If r5 == 0, no c or null bytes + have been found. */ +@@ -67,7 +73,7 @@ ENTRY (BP_SYM(strchr)) + + /* Handle WORD2 of pair. */ + lwzu r12,4(r8) +- cmpb r10,r12,r4 ++ cmpb r10,r12,r4 + cmpb r11,r12,r0 + or r5,r10,r11 + cmpwi cr7,r5,0 +@@ -102,22 +108,31 @@ L(loop): + bne cr6,L(done) + + /* The c/null byte must be in the second word. Adjust the address +- again and move the result of cmpb to r10 so we can calculate the +- pointer. */ ++ again and move the result of cmpb to r10/r11 so we can calculate ++ the pointer. */ + + mr r10,r6 + mr r11,r7 + addi r8,r8,4 + +- /* r5 has the output of the cmpb instruction, that is, it contains ++ /* r10/r11 have the output of the cmpb instructions, that is, + 0xff in the same position as the c/null byte in the original + word from the string. Use that to calculate the pointer. */ + L(done): +- cntlzw r4,r10 /* Count leading zeroes before c matches. */ +- cntlzw r0,r11 /* Count leading zeroes before null matches. */ +- cmplw cr7,r4,r0 ++#ifdef __LITTLE_ENDIAN__ ++ addi r3,r10,-1 ++ andc r3,r3,r10 ++ popcntw r0,r3 ++ addi r4,r11,-1 ++ andc r4,r4,r11 ++ cmplw cr7,r3,r4 ++ bgt cr7,L(no_match) ++#else ++ cntlzw r0,r10 /* Count leading zeros before c matches. */ ++ cmplw cr7,r11,r10 + bgt cr7,L(no_match) +- srwi r0,r4,3 /* Convert leading zeroes to bytes. */ ++#endif ++ srwi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of the matching c byte + or null in case c was not found. */ + blr +@@ -135,10 +150,14 @@ L(null_match): + cmpb r5,r12,r0 /* Compare each byte against null bytes. */ + + /* Move the words left and right to discard the bits that are +- not part of the string and to bring them back as zeros. */ +- ++ not part of the string and bring them back as zeros. */ ++#ifdef __LITTLE_ENDIAN__ ++ srw r5,r5,r6 ++ slw r5,r5,r6 ++#else + slw r5,r5,r6 + srw r5,r5,r6 ++#endif + cmpwi cr7,r5,0 /* If r10 == 0, no c or null bytes + have been found. */ + bne cr7,L(done_null) +@@ -193,7 +212,13 @@ L(loop_null): + 0xff in the same position as the null byte in the original + word from the string. Use that to calculate the pointer. */ + L(done_null): ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r5,-1 ++ andc r0,r0,r5 ++ popcntw r0,r0 ++#else + cntlzw r0,r5 /* Count leading zeros before the match. */ ++#endif + srwi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of the matching null byte. */ + blr +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strchrnul.S +=================================================================== +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strchrnul.S.orig ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/strchrnul.S +@@ -29,8 +29,8 @@ ENTRY (BP_SYM(__strchrnul)) + clrrwi r8,r3,2 /* Align the address to word boundary. */ + + /* Replicate byte to word. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrdi r4,r4,8,48 ++ insrdi r4,r4,16,32 + + rlwinm r6,r3,3,27,28 /* Calculate padding. */ + lwz r12,0(r8) /* Load word from memory. */ +@@ -45,10 +45,17 @@ ENTRY (BP_SYM(__strchrnul)) + + /* Move the words left and right to discard the bits that are + not part of the string and bring them back as zeros. */ ++#ifdef __LITTLE_ENDIAN__ ++ srw r10,r10,r6 ++ srw r9,r9,r6 ++ slw r10,r10,r6 ++ slw r9,r9,r6 ++#else + slw r10,r10,r6 + slw r9,r9,r6 + srw r10,r10,r6 + srw r9,r9,r6 ++#endif + or r5,r9,r10 /* OR the results to speed things up. */ + cmpwi cr7,r5,0 /* If r5 == 0, no c or null bytes + have been found. */ +@@ -56,7 +63,7 @@ ENTRY (BP_SYM(__strchrnul)) + + mtcrf 0x01,r8 + +- /* Are we now aligned to a quadword boundary? If so, skip to ++ /* Are we now aligned to a doubleword boundary? If so, skip to + the main loop. Otherwise, go through the alignment code. */ + + bt 29,L(loop) +@@ -78,7 +85,7 @@ L(loop): + single register for speed. This is an attempt + to speed up the null-checking process for bigger strings. */ + lwz r12,4(r8) +- lwzu r11,8(r8) ++ lwzu r11,8(r8) + cmpb r10,r12,r0 + cmpb r9,r12,r4 + cmpb r6,r11,r0 +@@ -97,9 +104,9 @@ L(loop): + addi r8,r8,-4 + bne cr6,L(done) + +- /* The c/null byte must be in the second word. Adjust the +- address again and move the result of cmpb to r10 so we can calculate +- the pointer. */ ++ /* The c/null byte must be in the second word. Adjust the address ++ again and move the result of cmpb to r5 so we can calculate the ++ pointer. */ + mr r5,r10 + addi r8,r8,4 + +@@ -107,7 +114,13 @@ L(loop): + 0xff in the same position as the c/null byte in the original + word from the string. Use that to calculate the pointer. */ + L(done): ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r5,-1 ++ andc r0,r0,r5 ++ popcntw r0,r0 ++#else + cntlzw r0,r5 /* Count leading zeros before the match. */ ++#endif + srwi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of matching c/null byte. */ + blr +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strchr.S +=================================================================== +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strchr.S.orig ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/strchr.S +@@ -44,6 +44,8 @@ ENTRY (BP_SYM (strchr)) + #define rIGN r10 /* number of bits we should ignore in the first word */ + #define rMASK r11 /* mask with the bits to ignore set to 0 */ + #define rTMP3 r12 ++#define rTMP4 rIGN ++#define rTMP5 rMASK + + CHECK_BOUNDS_LOW (rSTR, rTMP1, rTMP2) + STORE_RETURN_BOUNDS (rTMP1, rTMP2) +@@ -59,53 +61,74 @@ ENTRY (BP_SYM (strchr)) + addi r7F7F, r7F7F, 0x7f7f + /* Test the first (partial?) word. */ + lwz rWORD, 0(rSTR) ++#ifdef __LITTLE_ENDIAN__ ++ slw rMASK, rMASK, rIGN ++#else + srw rMASK, rMASK, rIGN ++#endif + orc rWORD, rWORD, rMASK + add rTMP1, rFEFE, rWORD + nor rTMP2, r7F7F, rWORD +- and. rTMP1, rTMP1, rTMP2 ++ and. rTMP4, rTMP1, rTMP2 + xor rTMP3, rCHR, rWORD + orc rTMP3, rTMP3, rMASK + b L(loopentry) + + /* The loop. */ + +-L(loop):lwzu rWORD, 4(rSTR) +- and. rTMP1, rTMP1, rTMP2 ++L(loop): ++ lwzu rWORD, 4(rSTR) ++ and. rTMP5, rTMP1, rTMP2 + /* Test for 0. */ +- add rTMP1, rFEFE, rWORD +- nor rTMP2, r7F7F, rWORD ++ add rTMP1, rFEFE, rWORD /* x - 0x01010101. */ ++ nor rTMP2, r7F7F, rWORD /* ~(x | 0x7f7f7f7f) == ~x & 0x80808080. */ + bne L(foundit) +- and. rTMP1, rTMP1, rTMP2 ++ and. rTMP4, rTMP1, rTMP2 /* (x - 0x01010101) & ~x & 0x80808080. */ + /* Start test for the bytes we're looking for. */ + xor rTMP3, rCHR, rWORD + L(loopentry): + add rTMP1, rFEFE, rTMP3 + nor rTMP2, r7F7F, rTMP3 + beq L(loop) ++ + /* There is a zero byte in the word, but may also be a matching byte (either + before or after the zero byte). In fact, we may be looking for a +- zero byte, in which case we return a match. We guess that this hasn't +- happened, though. */ +-L(missed): +- and. rTMP1, rTMP1, rTMP2 ++ zero byte, in which case we return a match. */ ++ and. rTMP5, rTMP1, rTMP2 + li rRTN, 0 + STORE_RETURN_VALUE (rSTR) + beqlr +-/* It did happen. Decide which one was first... +- I'm not sure if this is actually faster than a sequence of +- rotates, compares, and branches (we use it anyway because it's shorter). */ ++/* At this point: ++ rTMP5 bytes are 0x80 for each match of c, 0 otherwise. ++ rTMP4 bytes are 0x80 for each match of 0, 0 otherwise. ++ But there may be false matches in the next most significant byte from ++ a true match due to carries. This means we need to recalculate the ++ matches using a longer method for big-endian. */ ++#ifdef __LITTLE_ENDIAN__ ++ addi rTMP1, rTMP5, -1 ++ andc rTMP1, rTMP1, rTMP5 ++ cntlzw rCLZB, rTMP1 ++ addi rTMP2, rTMP4, -1 ++ andc rTMP2, rTMP2, rTMP4 ++ cmplw rTMP1, rTMP2 ++ bgtlr ++ subfic rCLZB, rCLZB, 32-7 ++#else ++/* I think we could reduce this by two instructions by keeping the "nor" ++ results from the loop for reuse here. See strlen.S tail. Similarly ++ one instruction could be pruned from L(foundit). */ + and rFEFE, r7F7F, rWORD +- or rMASK, r7F7F, rWORD ++ or rTMP5, r7F7F, rWORD + and rTMP1, r7F7F, rTMP3 +- or rIGN, r7F7F, rTMP3 ++ or rTMP4, r7F7F, rTMP3 + add rFEFE, rFEFE, r7F7F + add rTMP1, rTMP1, r7F7F +- nor rWORD, rMASK, rFEFE +- nor rTMP2, rIGN, rTMP1 ++ nor rWORD, rTMP5, rFEFE ++ nor rTMP2, rTMP4, rTMP1 ++ cntlzw rCLZB, rTMP2 + cmplw rWORD, rTMP2 + bgtlr +- cntlzw rCLZB, rTMP2 ++#endif + srwi rCLZB, rCLZB, 3 + add rRTN, rSTR, rCLZB + CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, twlge) +@@ -113,13 +136,21 @@ L(missed): + blr + + L(foundit): ++#ifdef __LITTLE_ENDIAN__ ++ addi rTMP1, rTMP5, -1 ++ andc rTMP1, rTMP1, rTMP5 ++ cntlzw rCLZB, rTMP1 ++ subfic rCLZB, rCLZB, 32-7-32 ++ srawi rCLZB, rCLZB, 3 ++#else + and rTMP1, r7F7F, rTMP3 +- or rIGN, r7F7F, rTMP3 ++ or rTMP4, r7F7F, rTMP3 + add rTMP1, rTMP1, r7F7F +- nor rTMP2, rIGN, rTMP1 ++ nor rTMP2, rTMP4, rTMP1 + cntlzw rCLZB, rTMP2 + subi rSTR, rSTR, 4 + srwi rCLZB, rCLZB, 3 ++#endif + add rRTN, rSTR, rCLZB + CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, twlge) + STORE_RETURN_VALUE (rSTR) +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strchr.S +=================================================================== +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strchr.S.orig ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strchr.S +@@ -37,8 +37,8 @@ ENTRY (BP_SYM(strchr)) + beq cr7,L(null_match) + + /* Replicate byte to doubleword. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrdi r4,r4,8,48 ++ insrdi r4,r4,16,32 + insrdi r4,r4,32,0 + + /* Now r4 has a doubleword of c bytes and r0 has +@@ -49,11 +49,17 @@ ENTRY (BP_SYM(strchr)) + + /* Move the doublewords left and right to discard the bits that are + not part of the string and bring them back as zeros. */ +- ++#ifdef __LITTLE_ENDIAN__ ++ srd r10,r10,r6 ++ srd r11,r11,r6 ++ sld r10,r10,r6 ++ sld r11,r11,r6 ++#else + sld r10,r10,r6 + sld r11,r11,r6 + srd r10,r10,r6 + srd r11,r11,r6 ++#endif + or r5,r10,r11 /* OR the results to speed things up. */ + cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes + have been found. */ +@@ -110,15 +116,24 @@ L(loop): + mr r11,r7 + addi r8,r8,8 + +- /* r5 has the output of the cmpb instruction, that is, it contains ++ /* r10/r11 have the output of the cmpb instructions, that is, + 0xff in the same position as the c/null byte in the original + doubleword from the string. Use that to calculate the pointer. */ + L(done): +- cntlzd r4,r10 /* Count leading zeroes before c matches. */ +- cntlzd r0,r11 /* Count leading zeroes before null matches. */ +- cmpld cr7,r4,r0 ++#ifdef __LITTLE_ENDIAN__ ++ addi r3,r10,-1 ++ andc r3,r3,r10 ++ popcntd r0,r3 ++ addi r4,r11,-1 ++ andc r4,r4,r11 ++ cmpld cr7,r3,r4 + bgt cr7,L(no_match) +- srdi r0,r4,3 /* Convert leading zeroes to bytes. */ ++#else ++ cntlzd r0,r10 /* Count leading zeros before c matches. */ ++ cmpld cr7,r11,r10 ++ bgt cr7,L(no_match) ++#endif ++ srdi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of the matching c byte + or null in case c was not found. */ + blr +@@ -137,9 +152,13 @@ L(null_match): + + /* Move the doublewords left and right to discard the bits that are + not part of the string and bring them back as zeros. */ +- ++#ifdef __LITTLE_ENDIAN__ ++ srd r5,r5,r6 ++ sld r5,r5,r6 ++#else + sld r5,r5,r6 + srd r5,r5,r6 ++#endif + cmpdi cr7,r5,0 /* If r10 == 0, no c or null bytes + have been found. */ + bne cr7,L(done_null) +@@ -194,7 +213,13 @@ L(loop_null): + 0xff in the same position as the null byte in the original + doubleword from the string. Use that to calculate the pointer. */ + L(done_null): ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r5,-1 ++ andc r0,r0,r5 ++ popcntd r0,r0 ++#else + cntlzd r0,r5 /* Count leading zeros before the match. */ ++#endif + srdi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of the matching null byte. */ + blr +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strchrnul.S +=================================================================== +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strchrnul.S.orig ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/strchrnul.S +@@ -29,8 +29,8 @@ ENTRY (BP_SYM(__strchrnul)) + clrrdi r8,r3,3 /* Align the address to doubleword boundary. */ + + /* Replicate byte to doubleword. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrdi r4,r4,8,48 ++ insrdi r4,r4,16,32 + insrdi r4,r4,32,0 + + rlwinm r6,r3,3,26,28 /* Calculate padding. */ +@@ -46,10 +46,17 @@ ENTRY (BP_SYM(__strchrnul)) + + /* Move the doublewords left and right to discard the bits that are + not part of the string and to bring them back as zeros. */ ++#ifdef __LITTLE_ENDIAN__ ++ srd r10,r10,r6 ++ srd r9,r9,r6 ++ sld r10,r10,r6 ++ sld r9,r9,r6 ++#else + sld r10,r10,r6 + sld r9,r9,r6 + srd r10,r10,r6 + srd r9,r9,r6 ++#endif + or r5,r9,r10 /* OR the results to speed things up. */ + cmpdi cr7,r5,0 /* If r5 == 0, no c or null bytes + have been found. */ +@@ -99,7 +106,7 @@ L(loop): + bne cr6,L(done) + + /* The c/null byte must be in the second doubleword. Adjust the +- address again and move the result of cmpb to r10 so we can calculate ++ address again and move the result of cmpb to r5 so we can calculate + the pointer. */ + mr r5,r10 + addi r8,r8,8 +@@ -108,7 +115,13 @@ L(loop): + 0xff in the same position as the c/null byte in the original + doubleword from the string. Use that to calculate the pointer. */ + L(done): ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r5,-1 ++ andc r0,r0,r5 ++ popcntd r0,r0 ++#else + cntlzd r0,r5 /* Count leading zeros before the match. */ ++#endif + srdi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of matching c/null byte. */ + blr +Index: glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strchr.S +=================================================================== +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strchr.S.orig ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/strchr.S +@@ -50,14 +50,16 @@ ENTRY (BP_SYM (strchr)) + #define rIGN r10 /* number of bits we should ignore in the first word */ + #define rMASK r11 /* mask with the bits to ignore set to 0 */ + #define rTMP3 r12 ++#define rTMP4 rIGN ++#define rTMP5 rMASK + + CHECK_BOUNDS_LOW (rSTR, rTMP1, rTMP2) + STORE_RETURN_BOUNDS (rTMP1, rTMP2) + + dcbt 0,rRTN +- rlwimi rCHR, rCHR, 8, 16, 23 ++ insrdi rCHR, rCHR, 8, 48 + li rMASK, -1 +- rlwimi rCHR, rCHR, 16, 0, 15 ++ insrdi rCHR, rCHR, 16, 32 + rlwinm rIGN, rRTN, 3, 26, 28 + insrdi rCHR, rCHR, 32, 0 + lis rFEFE, -0x101 +@@ -70,53 +72,74 @@ ENTRY (BP_SYM (strchr)) + add rFEFE, rFEFE, rTMP1 + /* Test the first (partial?) word. */ + ld rWORD, 0(rSTR) ++#ifdef __LITTLE_ENDIAN__ ++ sld rMASK, rMASK, rIGN ++#else + srd rMASK, rMASK, rIGN ++#endif + orc rWORD, rWORD, rMASK + add rTMP1, rFEFE, rWORD + nor rTMP2, r7F7F, rWORD +- and. rTMP1, rTMP1, rTMP2 ++ and. rTMP4, rTMP1, rTMP2 + xor rTMP3, rCHR, rWORD + orc rTMP3, rTMP3, rMASK + b L(loopentry) + + /* The loop. */ + +-L(loop):ldu rWORD, 8(rSTR) +- and. rTMP1, rTMP1, rTMP2 ++L(loop): ++ ldu rWORD, 8(rSTR) ++ and. rTMP5, rTMP1, rTMP2 + /* Test for 0. */ +- add rTMP1, rFEFE, rWORD +- nor rTMP2, r7F7F, rWORD ++ add rTMP1, rFEFE, rWORD /* x - 0x01010101. */ ++ nor rTMP2, r7F7F, rWORD /* ~(x | 0x7f7f7f7f) == ~x & 0x80808080. */ + bne L(foundit) +- and. rTMP1, rTMP1, rTMP2 ++ and. rTMP4, rTMP1, rTMP2 /* (x - 0x01010101) & ~x & 0x80808080. */ + /* Start test for the bytes we're looking for. */ + xor rTMP3, rCHR, rWORD + L(loopentry): + add rTMP1, rFEFE, rTMP3 + nor rTMP2, r7F7F, rTMP3 + beq L(loop) ++ + /* There is a zero byte in the word, but may also be a matching byte (either + before or after the zero byte). In fact, we may be looking for a +- zero byte, in which case we return a match. We guess that this hasn't +- happened, though. */ +-L(missed): +- and. rTMP1, rTMP1, rTMP2 ++ zero byte, in which case we return a match. */ ++ and. rTMP5, rTMP1, rTMP2 + li rRTN, 0 + STORE_RETURN_VALUE (rSTR) + beqlr +-/* It did happen. Decide which one was first... +- I'm not sure if this is actually faster than a sequence of +- rotates, compares, and branches (we use it anyway because it's shorter). */ ++/* At this point: ++ rTMP5 bytes are 0x80 for each match of c, 0 otherwise. ++ rTMP4 bytes are 0x80 for each match of 0, 0 otherwise. ++ But there may be false matches in the next most significant byte from ++ a true match due to carries. This means we need to recalculate the ++ matches using a longer method for big-endian. */ ++#ifdef __LITTLE_ENDIAN__ ++ addi rTMP1, rTMP5, -1 ++ andc rTMP1, rTMP1, rTMP5 ++ cntlzd rCLZB, rTMP1 ++ addi rTMP2, rTMP4, -1 ++ andc rTMP2, rTMP2, rTMP4 ++ cmpld rTMP1, rTMP2 ++ bgtlr ++ subfic rCLZB, rCLZB, 64-7 ++#else ++/* I think we could reduce this by two instructions by keeping the "nor" ++ results from the loop for reuse here. See strlen.S tail. Similarly ++ one instruction could be pruned from L(foundit). */ + and rFEFE, r7F7F, rWORD +- or rMASK, r7F7F, rWORD ++ or rTMP5, r7F7F, rWORD + and rTMP1, r7F7F, rTMP3 +- or rIGN, r7F7F, rTMP3 ++ or rTMP4, r7F7F, rTMP3 + add rFEFE, rFEFE, r7F7F + add rTMP1, rTMP1, r7F7F +- nor rWORD, rMASK, rFEFE +- nor rTMP2, rIGN, rTMP1 ++ nor rWORD, rTMP5, rFEFE ++ nor rTMP2, rTMP4, rTMP1 ++ cntlzd rCLZB, rTMP2 + cmpld rWORD, rTMP2 + bgtlr +- cntlzd rCLZB, rTMP2 ++#endif + srdi rCLZB, rCLZB, 3 + add rRTN, rSTR, rCLZB + CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, tdlge) +@@ -124,13 +147,21 @@ L(missed): + blr + + L(foundit): ++#ifdef __LITTLE_ENDIAN__ ++ addi rTMP1, rTMP5, -1 ++ andc rTMP1, rTMP1, rTMP5 ++ cntlzd rCLZB, rTMP1 ++ subfic rCLZB, rCLZB, 64-7-64 ++ sradi rCLZB, rCLZB, 3 ++#else + and rTMP1, r7F7F, rTMP3 +- or rIGN, r7F7F, rTMP3 ++ or rTMP4, r7F7F, rTMP3 + add rTMP1, rTMP1, r7F7F +- nor rTMP2, rIGN, rTMP1 ++ nor rTMP2, rTMP4, rTMP1 + cntlzd rCLZB, rTMP2 + subi rSTR, rSTR, 8 + srdi rCLZB, rCLZB, 3 ++#endif + add rRTN, rSTR, rCLZB + CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, tdlge) + STORE_RETURN_VALUE (rSTR) diff --git a/SOURCES/glibc-ppc64le-30.patch b/SOURCES/glibc-ppc64le-30.patch new file mode 100644 index 0000000..3834dcc --- /dev/null +++ b/SOURCES/glibc-ppc64le-30.patch @@ -0,0 +1,7383 @@ +# commit fe6e95d7171eba5f3e07848f081676fae4e86322 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:46:47 2013 +0930 +# +# PowerPC LE memcmp +# http://sourceware.org/ml/libc-alpha/2013-08/msg00102.html +# +# This is a rather large patch due to formatting and renaming. The +# formatting changes were to make it possible to compare power7 and +# power4 versions of memcmp. Using different register defines came +# about while I was wrestling with the code, trying to find spare +# registers at one stage. I found it much simpler if we refer to a reg +# by the same name throughout a function, so it's better if short-term +# multiple use regs like rTMP are referred to using their register +# number. I made the cr field usage changes when attempting to reload +# rWORDn regs in the exit path to byte swap before comparing when +# little-endian. That proved a bad idea due to the pipelining involved +# in the main loop; Offsets to reload the regs were different first +# time around the loop.. Anyway, I left the cr field usage changes in +# place for consistency. +# +# Aside from these more-or-less cosmetic changes, I fixed a number of +# places where an early exit path restores regs unnecessarily, removed +# some dead code, and optimised one or two exits. +# +# * sysdeps/powerpc/powerpc64/power7/memcmp.S: Add little-endian support. +# Formatting. Consistently use rXXX register defines or rN defines. +# Use early exit labels that avoid restoring unused non-volatile regs. +# Make cr field use more consistent with rWORDn compares. Rename +# regs used as shift registers for unaligned loop, using rN defines +# for short lifetime/multiple use regs. +# * sysdeps/powerpc/powerpc64/power4/memcmp.S: Likewise. +# * sysdeps/powerpc/powerpc32/power7/memcmp.S: Likewise. Exit with +# addi 1,1,64 to pop stack frame. Simplify return value code. +# * sysdeps/powerpc/powerpc32/power4/memcmp.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcmp.S 2014-05-28 19:22:37.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcmp.S 2014-05-28 23:55:52.000000000 -0500 +@@ -1,4 +1,4 @@ +-/* Optimized strcmp implementation for PowerPC64. ++/* Optimized strcmp implementation for PowerPC32. + Copyright (C) 2003, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + +@@ -20,13 +20,14 @@ + #include <bp-sym.h> + #include <bp-asm.h> + +-/* int [r3] memcmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */ +- ++/* int [r3] memcmp (const char *s1 [r3], ++ const char *s2 [r4], ++ size_t size [r5]) */ ++ + .machine power4 + EALIGN (BP_SYM(memcmp), 4, 0) + CALL_MCOUNT + +-#define rTMP r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -37,33 +38,32 @@ + #define rWORD4 r9 /* next word in s2 */ + #define rWORD5 r10 /* next word in s1 */ + #define rWORD6 r11 /* next word in s2 */ +-#define rBITDIF r12 /* bits that differ in s1 & s2 words */ + #define rWORD7 r30 /* next word in s1 */ + #define rWORD8 r31 /* next word in s2 */ + +- xor rTMP, rSTR2, rSTR1 ++ xor r0, rSTR2, rSTR1 + cmplwi cr6, rN, 0 + cmplwi cr1, rN, 12 +- clrlwi. rTMP, rTMP, 30 +- clrlwi rBITDIF, rSTR1, 30 +- cmplwi cr5, rBITDIF, 0 ++ clrlwi. r0, r0, 30 ++ clrlwi r12, rSTR1, 30 ++ cmplwi cr5, r12, 0 + beq- cr6, L(zeroLength) +- dcbt 0,rSTR1 +- dcbt 0,rSTR2 ++ dcbt 0, rSTR1 ++ dcbt 0, rSTR2 + /* If less than 8 bytes or not aligned, use the unaligned + byte loop. */ + blt cr1, L(bytealigned) +- stwu 1,-64(1) ++ stwu 1, -64(r1) + cfi_adjust_cfa_offset(64) +- stw r31,48(1) +- cfi_offset(31,(48-64)) +- stw r30,44(1) +- cfi_offset(30,(44-64)) ++ stw rWORD8, 48(r1) ++ cfi_offset(rWORD8, (48-64)) ++ stw rWORD7, 44(r1) ++ cfi_offset(rWORD7, (44-64)) + bne L(unaligned) + /* At this point we know both strings have the same alignment and the +- compare length is at least 8 bytes. rBITDIF contains the low order ++ compare length is at least 8 bytes. r12 contains the low order + 2 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then we are already word ++ of r12 to 0. If r12 == 0 then we are already word + aligned and can perform the word aligned loop. + + Otherwise we know the two strings have the same alignment (but not +@@ -72,74 +72,95 @@ + eliminate bits preceeding the first byte. Since we want to join the + normal (word aligned) compare loop, starting at the second word, + we need to adjust the length (rN) and special case the loop +- versioning for the first word. This insures that the loop count is ++ versioning for the first word. This ensures that the loop count is + correct and the first word (shifted) is in the expected register pair. */ +- .align 4 ++ .align 4 + L(samealignment): + clrrwi rSTR1, rSTR1, 2 + clrrwi rSTR2, rSTR2, 2 + beq cr5, L(Waligned) +- add rN, rN, rBITDIF +- slwi r11, rBITDIF, 3 +- srwi rTMP, rN, 4 /* Divide by 16 */ +- andi. rBITDIF, rN, 12 /* Get the word remainder */ ++ add rN, rN, r12 ++ slwi rWORD6, r12, 3 ++ srwi r0, rN, 4 /* Divide by 16 */ ++ andi. r12, rN, 12 /* Get the word remainder */ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 0(rSTR1) + lwz rWORD2, 0(rSTR2) +- cmplwi cr1, rBITDIF, 8 ++#endif ++ cmplwi cr1, r12, 8 + cmplwi cr7, rN, 16 + clrlwi rN, rN, 30 + beq L(dPs4) +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ + bgt cr1, L(dPs3) + beq cr1, L(dPs2) + + /* Remainder is 4 */ +- .align 3 ++ .align 3 + L(dsP1): +- slw rWORD5, rWORD1, r11 +- slw rWORD6, rWORD2, r11 ++ slw rWORD5, rWORD1, rWORD6 ++ slw rWORD6, rWORD2, rWORD6 + cmplw cr5, rWORD5, rWORD6 + blt cr7, L(dP1x) + /* Do something useful in this cycle since we have to branch anyway. */ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 4(rSTR1) + lwz rWORD2, 4(rSTR2) +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + b L(dP1e) + /* Remainder is 8 */ +- .align 4 ++ .align 4 + L(dPs2): +- slw rWORD5, rWORD1, r11 +- slw rWORD6, rWORD2, r11 ++ slw rWORD5, rWORD1, rWORD6 ++ slw rWORD6, rWORD2, rWORD6 + cmplw cr6, rWORD5, rWORD6 + blt cr7, L(dP2x) + /* Do something useful in this cycle since we have to branch anyway. */ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD7, 4(rSTR1) + lwz rWORD8, 4(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 + b L(dP2e) + /* Remainder is 12 */ +- .align 4 ++ .align 4 + L(dPs3): +- slw rWORD3, rWORD1, r11 +- slw rWORD4, rWORD2, r11 ++ slw rWORD3, rWORD1, rWORD6 ++ slw rWORD4, rWORD2, rWORD6 + cmplw cr1, rWORD3, rWORD4 + b L(dP3e) + /* Count is a multiple of 16, remainder is 0 */ +- .align 4 ++ .align 4 + L(dPs4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- slw rWORD1, rWORD1, r11 +- slw rWORD2, rWORD2, r11 +- cmplw cr0, rWORD1, rWORD2 ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ slw rWORD1, rWORD1, rWORD6 ++ slw rWORD2, rWORD2, rWORD6 ++ cmplw cr7, rWORD1, rWORD2 + b L(dP4e) + + /* At this point we know both strings are word aligned and the + compare length is at least 8 bytes. */ +- .align 4 ++ .align 4 + L(Waligned): +- andi. rBITDIF, rN, 12 /* Get the word remainder */ +- srwi rTMP, rN, 4 /* Divide by 16 */ +- cmplwi cr1, rBITDIF, 8 ++ andi. r12, rN, 12 /* Get the word remainder */ ++ srwi r0, rN, 4 /* Divide by 16 */ ++ cmplwi cr1, r12, 8 + cmplwi cr7, rN, 16 + clrlwi rN, rN, 30 + beq L(dP4) +@@ -147,177 +168,352 @@ + beq cr1, L(dP2) + + /* Remainder is 4 */ +- .align 4 ++ .align 4 + L(dP1): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ + /* Normally we'd use rWORD7/rWORD8 here, but since we might exit early + (8-15 byte compare), we want to use only volatile registers. This + means we can avoid restoring non-volatile registers since we did not + 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__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 0(rSTR1) + lwz rWORD6, 0(rSTR2) ++#endif + cmplw cr5, rWORD5, rWORD6 + blt cr7, L(dP1x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 4(rSTR1) + lwz rWORD2, 4(rSTR2) +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + L(dP1e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 8(rSTR1) + lwz rWORD4, 8(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 12(rSTR1) + lwz rWORD6, 12(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 +- bne cr5, L(dLcr5) +- bne cr0, L(dLcr0) +- ++ bne cr5, L(dLcr5x) ++ bne cr7, L(dLcr7x) ++ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwzu rWORD7, 16(rSTR1) + lwzu rWORD8, 16(rSTR2) ++#endif + bne cr1, L(dLcr1) + cmplw cr5, rWORD7, rWORD8 + bdnz L(dLoop) + bne cr6, L(dLcr6) +- lwz r30,44(1) +- lwz r31,48(1) +- .align 3 ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++ .align 3 + L(dP1x): + slwi. r12, rN, 3 +- bne cr5, L(dLcr5) ++ bne cr5, L(dLcr5x) + subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ +- lwz 1,0(1) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + bne L(d00) + li rRTN, 0 + blr + + /* Remainder is 8 */ +- .align 4 ++ .align 4 ++ cfi_adjust_cfa_offset(64) + L(dP2): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 0(rSTR1) + lwz rWORD6, 0(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 + blt cr7, L(dP2x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD7, 4(rSTR1) + lwz rWORD8, 4(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 + L(dP2e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 8(rSTR1) + lwz rWORD2, 8(rSTR2) +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 12(rSTR1) + lwz rWORD4, 12(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 4 + addi rSTR2, rSTR2, 4 ++#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 ++ .align 4 + L(dP2x): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 4(rSTR1) + lwz rWORD4, 4(rSTR2) +- cmplw cr5, rWORD3, rWORD4 ++#endif ++ cmplw cr1, rWORD3, rWORD4 + slwi. r12, rN, 3 +- bne cr6, L(dLcr6) ++ bne cr6, L(dLcr6x) ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 4 + addi rSTR2, rSTR2, 4 +- bne cr5, L(dLcr5) ++#endif ++ bne cr1, L(dLcr1x) + subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ +- lwz 1,0(1) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + bne L(d00) + li rRTN, 0 + blr + + /* Remainder is 12 */ +- .align 4 ++ .align 4 ++ cfi_adjust_cfa_offset(64) + L(dP3): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 0(rSTR1) + lwz rWORD4, 0(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 + L(dP3e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 4(rSTR1) + lwz rWORD6, 4(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 + blt cr7, L(dP3x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD7, 8(rSTR1) + lwz rWORD8, 8(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 12(rSTR1) + lwz rWORD2, 12(rSTR2) +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 ++#endif + bne cr1, L(dLcr1) + bne cr6, L(dLcr6) + b L(dLoop1) + /* Again we are on a early exit path (24-31 byte compare), we want to + only use volatile registers and avoid restoring non-volatile + registers. */ +- .align 4 ++ .align 4 + L(dP3x): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 8(rSTR1) + lwz rWORD2, 8(rSTR2) +- cmplw cr5, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + slwi. r12, rN, 3 +- bne cr1, L(dLcr1) ++ bne cr1, L(dLcr1x) ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 +- bne cr6, L(dLcr6) ++#endif ++ bne cr6, L(dLcr6x) + subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ +- bne cr5, L(dLcr5) +- lwz 1,0(1) ++ bne cr7, L(dLcr7x) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + bne L(d00) + li rRTN, 0 + blr + + /* Count is a multiple of 16, remainder is 0 */ +- .align 4 ++ .align 4 ++ cfi_adjust_cfa_offset(64) + L(dP4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 0(rSTR1) + lwz rWORD2, 0(rSTR2) +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + L(dP4e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 4(rSTR1) + lwz rWORD4, 4(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 8(rSTR1) + lwz rWORD6, 8(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwzu rWORD7, 12(rSTR1) + lwzu rWORD8, 12(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 +- bne cr0, L(dLcr0) ++ bne cr7, L(dLcr7) + bne cr1, L(dLcr1) + bdz- L(d24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ +- .align 4 ++ .align 4 + L(dLoop): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 4(rSTR1) + lwz rWORD2, 4(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 + bne cr6, L(dLcr6) + L(dLoop1): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 8(rSTR1) + lwz rWORD4, 8(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 + bne cr5, L(dLcr5) + L(dLoop2): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 12(rSTR1) + lwz rWORD6, 12(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 +- bne cr0, L(dLcr0) ++ bne cr7, L(dLcr7) + L(dLoop3): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwzu rWORD7, 16(rSTR1) + lwzu rWORD8, 16(rSTR2) ++#endif + bne- cr1, L(dLcr1) +- cmplw cr0, rWORD1, rWORD2 ++ cmplw cr7, rWORD1, rWORD2 + bdnz+ L(dLoop) + + L(dL4): +@@ -327,7 +523,7 @@ + bne cr5, L(dLcr5) + cmplw cr5, rWORD7, rWORD8 + L(d44): +- bne cr0, L(dLcr0) ++ bne cr7, L(dLcr7) + L(d34): + bne cr1, L(dLcr1) + L(d24): +@@ -336,69 +532,82 @@ + slwi. r12, rN, 3 + bne cr5, L(dLcr5) + L(d04): +- lwz r30,44(1) +- lwz r31,48(1) +- lwz 1,0(1) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ + beq L(zeroLength) + /* At this point we have a remainder of 1 to 3 bytes to compare. Since + we are aligned it is safe to load the whole word, and use +- shift right to eliminate bits beyond the compare length. */ ++ shift right to eliminate bits beyond the compare length. */ + L(d00): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 4(rSTR1) + lwz rWORD2, 4(rSTR2) ++#endif + srw rWORD1, rWORD1, rN + srw rWORD2, rWORD2, rN +- cmplw rWORD1,rWORD2 +- li rRTN,0 +- beqlr +- li rRTN,1 +- bgtlr +- li rRTN,-1 +- blr +- +- .align 4 +-L(dLcr0): +- lwz r30,44(1) +- lwz r31,48(1) ++ sub rRTN, rWORD1, rWORD2 ++ blr ++ ++ .align 4 ++ cfi_adjust_cfa_offset(64) ++L(dLcr7): ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++L(dLcr7x): + li rRTN, 1 +- lwz 1,0(1) +- bgtlr cr0 ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) ++ bgtlr cr7 + li rRTN, -1 + blr +- .align 4 ++ .align 4 ++ cfi_adjust_cfa_offset(64) + L(dLcr1): +- lwz r30,44(1) +- lwz r31,48(1) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++L(dLcr1x): + li rRTN, 1 +- lwz 1,0(1) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + bgtlr cr1 + li rRTN, -1 + blr +- .align 4 ++ .align 4 ++ cfi_adjust_cfa_offset(64) + L(dLcr6): +- lwz r30,44(1) +- lwz r31,48(1) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++L(dLcr6x): + li rRTN, 1 +- lwz 1,0(1) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + bgtlr cr6 + li rRTN, -1 + blr +- .align 4 ++ .align 4 ++ cfi_adjust_cfa_offset(64) + L(dLcr5): +- lwz r30,44(1) +- lwz r31,48(1) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) + L(dLcr5x): + li rRTN, 1 +- lwz 1,0(1) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + bgtlr cr5 + li rRTN, -1 + blr + +- .align 4 ++ .align 4 + L(bytealigned): +- cfi_adjust_cfa_offset(-64) +- mtctr rN /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr rN /* Power4 wants mtctr 1st in dispatch group */ + + /* We need to prime this loop. This loop is swing modulo scheduled + to avoid pipe delays. The dependent instruction latencies (load to +@@ -413,7 +622,7 @@ + lbz rWORD1, 0(rSTR1) + lbz rWORD2, 0(rSTR2) + bdz- L(b11) +- cmplw cr0, rWORD1, rWORD2 ++ cmplw cr7, rWORD1, rWORD2 + lbz rWORD3, 1(rSTR1) + lbz rWORD4, 1(rSTR2) + bdz- L(b12) +@@ -421,11 +630,11 @@ + lbzu rWORD5, 2(rSTR1) + lbzu rWORD6, 2(rSTR2) + bdz- L(b13) +- .align 4 ++ .align 4 + L(bLoop): + lbzu rWORD1, 1(rSTR1) + lbzu rWORD2, 1(rSTR2) +- bne- cr0, L(bLcr0) ++ bne- cr7, L(bLcr7) + + cmplw cr6, rWORD5, rWORD6 + bdz- L(b3i) +@@ -434,7 +643,7 @@ + lbzu rWORD4, 1(rSTR2) + bne- cr1, L(bLcr1) + +- cmplw cr0, rWORD1, rWORD2 ++ cmplw cr7, rWORD1, rWORD2 + bdz- L(b2i) + + lbzu rWORD5, 1(rSTR1) +@@ -451,23 +660,23 @@ + tested. In this case we must complete the pending operations + before returning. */ + L(b1i): +- bne- cr0, L(bLcr0) ++ bne- cr7, L(bLcr7) + bne- cr1, L(bLcr1) + b L(bx56) +- .align 4 ++ .align 4 + L(b2i): + bne- cr6, L(bLcr6) +- bne- cr0, L(bLcr0) ++ bne- cr7, L(bLcr7) + b L(bx34) +- .align 4 ++ .align 4 + L(b3i): + bne- cr1, L(bLcr1) + bne- cr6, L(bLcr6) + b L(bx12) +- .align 4 +-L(bLcr0): ++ .align 4 ++L(bLcr7): + li rRTN, 1 +- bgtlr cr0 ++ bgtlr cr7 + li rRTN, -1 + blr + L(bLcr1): +@@ -482,36 +691,31 @@ + blr + + L(b13): +- bne- cr0, L(bx12) ++ bne- cr7, L(bx12) + bne- cr1, L(bx34) + L(bx56): + sub rRTN, rWORD5, rWORD6 + blr + nop + L(b12): +- bne- cr0, L(bx12) ++ bne- cr7, L(bx12) + L(bx34): + sub rRTN, rWORD3, rWORD4 + blr +- + L(b11): + L(bx12): + sub rRTN, rWORD1, rWORD2 + blr +- +- .align 4 +-L(zeroLengthReturn): +- ++ .align 4 + L(zeroLength): + li rRTN, 0 + blr + +- cfi_adjust_cfa_offset(64) +- .align 4 ++ .align 4 + /* At this point we know the strings have different alignment and the +- compare length is at least 8 bytes. rBITDIF contains the low order ++ compare length is at least 8 bytes. r12 contains the low order + 2 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then rStr1 is word aligned and can ++ of r12 to 0. If r12 == 0 then rStr1 is word aligned and can + perform the Wunaligned loop. + + Otherwise we know that rSTR1 is not aready word aligned yet. +@@ -520,79 +724,88 @@ + eliminate bits preceeding the first byte. Since we want to join the + normal (Wualigned) compare loop, starting at the second word, + we need to adjust the length (rN) and special case the loop +- versioning for the first W. This insures that the loop count is ++ versioning for the first W. This ensures that the loop count is + correct and the first W (shifted) is in the expected resister pair. */ + #define rSHL r29 /* Unaligned shift left count. */ + #define rSHR r28 /* Unaligned shift right count. */ +-#define rB r27 /* Left rotation temp for rWORD2. */ +-#define rD r26 /* Left rotation temp for rWORD4. */ +-#define rF r25 /* Left rotation temp for rWORD6. */ +-#define rH r24 /* Left rotation temp for rWORD8. */ +-#define rA r0 /* Right rotation temp for rWORD2. */ +-#define rC r12 /* Right rotation temp for rWORD4. */ +-#define rE r0 /* Right rotation temp for rWORD6. */ +-#define rG r12 /* Right rotation temp for rWORD8. */ ++#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. */ ++ cfi_adjust_cfa_offset(64) + L(unaligned): +- stw r29,40(r1) +- cfi_offset(r29,(40-64)) ++ stw rSHL, 40(r1) ++ cfi_offset(rSHL, (40-64)) + clrlwi rSHL, rSTR2, 30 +- stw r28,36(r1) +- cfi_offset(r28,(36-64)) ++ stw rSHR, 36(r1) ++ cfi_offset(rSHR, (36-64)) + beq cr5, L(Wunaligned) +- stw r27,32(r1) +- cfi_offset(r27,(32-64)) ++ stw rWORD8_SHIFT, 32(r1) ++ cfi_offset(rWORD8_SHIFT, (32-64)) + /* Adjust the logical start of rSTR2 to compensate for the extra bits + in the 1st rSTR1 W. */ +- sub r27, rSTR2, rBITDIF ++ sub rWORD8_SHIFT, rSTR2, r12 + /* But do not attempt to address the W before that W that contains + the actual start of rSTR2. */ + clrrwi rSTR2, rSTR2, 2 +- stw r26,28(r1) +- cfi_offset(r26,(28-64)) +-/* Compute the left/right shift counts for the unalign rSTR2, ++ stw rWORD2_SHIFT, 28(r1) ++ cfi_offset(rWORD2_SHIFT, (28-64)) ++/* Compute the left/right shift counts for the unaligned rSTR2, + compensating for the logical (W aligned) start of rSTR1. */ +- clrlwi rSHL, r27, 30 ++ clrlwi rSHL, rWORD8_SHIFT, 30 + clrrwi rSTR1, rSTR1, 2 +- stw r25,24(r1) +- cfi_offset(r25,(24-64)) ++ stw rWORD4_SHIFT, 24(r1) ++ cfi_offset(rWORD4_SHIFT, (24-64)) + slwi rSHL, rSHL, 3 +- cmplw cr5, r27, rSTR2 +- add rN, rN, rBITDIF +- slwi r11, rBITDIF, 3 +- stw r24,20(r1) +- cfi_offset(r24,(20-64)) ++ cmplw cr5, rWORD8_SHIFT, rSTR2 ++ add rN, rN, r12 ++ slwi rWORD6, r12, 3 ++ stw rWORD6_SHIFT, 20(r1) ++ cfi_offset(rWORD6_SHIFT, (20-64)) + subfic rSHR, rSHL, 32 +- srwi rTMP, rN, 4 /* Divide by 16 */ +- andi. rBITDIF, rN, 12 /* Get the W remainder */ ++ srwi r0, rN, 4 /* Divide by 16 */ ++ andi. r12, rN, 12 /* Get the W remainder */ + /* We normally need to load 2 Ws to start the unaligned rSTR2, but in + this special case those bits may be discarded anyway. Also we + must avoid loading a W where none of the bits are part of rSTR2 as + this may cross a page boundary and cause a page fault. */ + li rWORD8, 0 + blt cr5, L(dus0) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD8, 0(rSTR2) +- la rSTR2, 4(rSTR2) ++ addi rSTR2, rSTR2, 4 ++#endif + slw rWORD8, rWORD8, rSHL + + L(dus0): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 0(rSTR1) + lwz rWORD2, 0(rSTR2) +- cmplwi cr1, rBITDIF, 8 ++#endif ++ cmplwi cr1, r12, 8 + cmplwi cr7, rN, 16 +- srw rG, rWORD2, rSHR ++ srw r12, rWORD2, rSHR + clrlwi rN, rN, 30 + beq L(duPs4) +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- or rWORD8, rG, rWORD8 ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ or rWORD8, r12, rWORD8 + bgt cr1, L(duPs3) + beq cr1, L(duPs2) + + /* Remainder is 4 */ +- .align 4 ++ .align 4 + L(dusP1): +- slw rB, rWORD2, rSHL +- slw rWORD7, rWORD1, r11 +- slw rWORD8, rWORD8, r11 ++ slw rWORD8_SHIFT, rWORD2, rSHL ++ slw rWORD7, rWORD1, rWORD6 ++ slw rWORD8, rWORD8, rWORD6 + bge cr7, L(duP1e) + /* At this point we exit early with the first word compare + complete and remainder of 0 to 3 bytes. See L(du14) for details on +@@ -602,95 +815,133 @@ + bne cr5, L(duLcr5) + cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD2, 4(rSTR2) +- srw rA, rWORD2, rSHR ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 8 */ +- .align 4 ++ .align 4 + L(duPs2): +- slw rH, rWORD2, rSHL +- slw rWORD5, rWORD1, r11 +- slw rWORD6, rWORD8, r11 ++ slw rWORD6_SHIFT, rWORD2, rSHL ++ slw rWORD5, rWORD1, rWORD6 ++ slw rWORD6, rWORD8, rWORD6 + b L(duP2e) + /* Remainder is 12 */ +- .align 4 ++ .align 4 + L(duPs3): +- slw rF, rWORD2, rSHL +- slw rWORD3, rWORD1, r11 +- slw rWORD4, rWORD8, r11 ++ slw rWORD4_SHIFT, rWORD2, rSHL ++ slw rWORD3, rWORD1, rWORD6 ++ slw rWORD4, rWORD8, rWORD6 + b L(duP3e) + /* Count is a multiple of 16, remainder is 0 */ +- .align 4 ++ .align 4 + L(duPs4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- or rWORD8, rG, rWORD8 +- slw rD, rWORD2, rSHL +- slw rWORD1, rWORD1, r11 +- slw rWORD2, rWORD8, r11 ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ or rWORD8, r12, rWORD8 ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ slw rWORD1, rWORD1, rWORD6 ++ slw rWORD2, rWORD8, rWORD6 + b L(duP4e) + + /* At this point we know rSTR1 is word aligned and the + compare length is at least 8 bytes. */ +- .align 4 ++ .align 4 + L(Wunaligned): +- stw r27,32(r1) +- cfi_offset(r27,(32-64)) ++ stw rWORD8_SHIFT, 32(r1) ++ cfi_offset(rWORD8_SHIFT, (32-64)) + clrrwi rSTR2, rSTR2, 2 +- stw r26,28(r1) +- cfi_offset(r26,(28-64)) +- srwi rTMP, rN, 4 /* Divide by 16 */ +- stw r25,24(r1) +- cfi_offset(r25,(24-64)) +- andi. rBITDIF, rN, 12 /* Get the W remainder */ +- stw r24,20(r1) +- cfi_offset(r24,(20-64)) ++ stw rWORD2_SHIFT, 28(r1) ++ cfi_offset(rWORD2_SHIFT, (28-64)) ++ srwi r0, rN, 4 /* Divide by 16 */ ++ stw rWORD4_SHIFT, 24(r1) ++ cfi_offset(rWORD4_SHIFT, (24-64)) ++ andi. r12, rN, 12 /* Get the W remainder */ ++ stw rWORD6_SHIFT, 20(r1) ++ cfi_offset(rWORD6_SHIFT, (20-64)) + slwi rSHL, rSHL, 3 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD6, 0(rSTR2) + lwzu rWORD8, 4(rSTR2) +- cmplwi cr1, rBITDIF, 8 ++#endif ++ cmplwi cr1, r12, 8 + cmplwi cr7, rN, 16 + clrlwi rN, rN, 30 + subfic rSHR, rSHL, 32 +- slw rH, rWORD6, rSHL ++ slw rWORD6_SHIFT, rWORD6, rSHL + beq L(duP4) +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ + bgt cr1, L(duP3) + beq cr1, L(duP2) + + /* Remainder is 4 */ +- .align 4 ++ .align 4 + L(duP1): +- srw rG, rWORD8, rSHR ++ srw r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else + lwz rWORD7, 0(rSTR1) +- slw rB, rWORD8, rSHL +- or rWORD8, rG, rH ++#endif ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + blt cr7, L(duP1x) + L(duP1e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 4(rSTR1) + lwz rWORD2, 4(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 +- srw rA, rWORD2, rSHR +- slw rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 8(rSTR1) + lwz rWORD4, 8(rSTR2) +- cmplw cr0, rWORD1, rWORD2 +- srw rC, rWORD4, rSHR +- slw rF, rWORD4, rSHL ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL + bne cr5, L(duLcr5) +- or rWORD4, rC, rD ++ or rWORD4, r12, rWORD2_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 12(rSTR1) + lwz rWORD6, 12(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 +- srw rE, rWORD6, rSHR +- slw rH, rWORD6, rSHL +- bne cr0, L(duLcr0) +- or rWORD6, rE, rF ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ bne cr7, L(duLcr7) ++ or rWORD6, r0, rWORD4_SHIFT + cmplw cr6, rWORD5, rWORD6 + b L(duLoop3) +- .align 4 ++ .align 4 + /* At this point we exit early with the first word compare + complete and remainder of 0 to 3 bytes. See L(du14) for details on + how we handle the remaining bytes. */ +@@ -700,186 +951,321 @@ + bne cr5, L(duLcr5) + cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) +- ld rWORD2, 8(rSTR2) +- srw rA, rWORD2, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD2, 8(rSTR2) ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 8 */ +- .align 4 ++ .align 4 + L(duP2): +- srw rE, rWORD8, rSHR ++ srw r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else + lwz rWORD5, 0(rSTR1) +- or rWORD6, rE, rH +- slw rH, rWORD8, rSHL ++#endif ++ or rWORD6, r0, rWORD6_SHIFT ++ slw rWORD6_SHIFT, rWORD8, rSHL + L(duP2e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD7, 4(rSTR1) + lwz rWORD8, 4(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 +- srw rG, rWORD8, rSHR +- slw rB, rWORD8, rSHL +- or rWORD8, rG, rH ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + blt cr7, L(duP2x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 8(rSTR1) + lwz rWORD2, 8(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) +- srw rA, rWORD2, rSHR +- slw rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 12(rSTR1) + lwz rWORD4, 12(rSTR2) +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + bne cr5, L(duLcr5) +- srw rC, rWORD4, rSHR +- slw rF, rWORD4, rSHL +- or rWORD4, rC, rD ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL ++ or rWORD4, r12, rWORD2_SHIFT ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 4 + addi rSTR2, rSTR2, 4 ++#endif + cmplw cr1, rWORD3, rWORD4 + b L(duLoop2) +- .align 4 ++ .align 4 + L(duP2x): + cmplw cr5, rWORD7, rWORD8 ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 4 + addi rSTR2, rSTR2, 4 ++#endif + bne cr6, L(duLcr6) + slwi. rN, rN, 3 + bne cr5, L(duLcr5) + cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD2, 4(rSTR2) +- srw rA, rWORD2, rSHR ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + + /* Remainder is 12 */ +- .align 4 ++ .align 4 + L(duP3): +- srw rC, rWORD8, rSHR ++ srw r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else + lwz rWORD3, 0(rSTR1) +- slw rF, rWORD8, rSHL +- or rWORD4, rC, rH ++#endif ++ slw rWORD4_SHIFT, rWORD8, rSHL ++ or rWORD4, r12, rWORD6_SHIFT + L(duP3e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 4(rSTR1) + lwz rWORD6, 4(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 +- srw rE, rWORD6, rSHR +- slw rH, rWORD6, rSHL +- or rWORD6, rE, rF ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ or rWORD6, r0, rWORD4_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD7, 8(rSTR1) + lwz rWORD8, 8(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 + bne cr1, L(duLcr1) +- srw rG, rWORD8, rSHR +- slw rB, rWORD8, rSHL +- or rWORD8, rG, rH ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + blt cr7, L(duP3x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 12(rSTR1) + lwz rWORD2, 12(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) +- srw rA, rWORD2, rSHR +- slw rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + b L(duLoop1) +- .align 4 ++ .align 4 + L(duP3x): ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 ++#endif ++#if 0 ++/* Huh? We've already branched on cr1! */ + bne cr1, L(duLcr1) ++#endif + cmplw cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) + slwi. rN, rN, 3 + bne cr5, L(duLcr5) + cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD2, 4(rSTR2) +- srw rA, rWORD2, rSHR ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + + /* Count is a multiple of 16, remainder is 0 */ +- .align 4 ++ .align 4 + L(duP4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- srw rA, rWORD8, rSHR ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ srw r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else + lwz rWORD1, 0(rSTR1) +- slw rD, rWORD8, rSHL +- or rWORD2, rA, rH ++#endif ++ slw rWORD2_SHIFT, rWORD8, rSHL ++ or rWORD2, r0, rWORD6_SHIFT + L(duP4e): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 4(rSTR1) + lwz rWORD4, 4(rSTR2) +- cmplw cr0, rWORD1, rWORD2 +- srw rC, rWORD4, rSHR +- slw rF, rWORD4, rSHL +- or rWORD4, rC, rD ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL ++ or rWORD4, r12, rWORD2_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 8(rSTR1) + lwz rWORD6, 8(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 +- bne cr0, L(duLcr0) +- srw rE, rWORD6, rSHR +- slw rH, rWORD6, rSHL +- or rWORD6, rE, rF ++ bne cr7, L(duLcr7) ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ or rWORD6, r0, rWORD4_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwzu rWORD7, 12(rSTR1) + lwzu rWORD8, 12(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 + bne cr1, L(duLcr1) +- srw rG, rWORD8, rSHR +- slw rB, rWORD8, rSHL +- or rWORD8, rG, rH ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + cmplw cr5, rWORD7, rWORD8 + bdz- L(du24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ +- .align 4 ++ .align 4 + L(duLoop): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD1, 4(rSTR1) + lwz rWORD2, 4(rSTR2) ++#endif + cmplw cr1, rWORD3, rWORD4 + bne cr6, L(duLcr6) +- srw rA, rWORD2, rSHR +- slw rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT + L(duLoop1): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD3, 8(rSTR1) + lwz rWORD4, 8(rSTR2) ++#endif + cmplw cr6, rWORD5, rWORD6 + bne cr5, L(duLcr5) +- srw rC, rWORD4, rSHR +- slw rF, rWORD4, rSHL +- or rWORD4, rC, rD ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL ++ or rWORD4, r12, rWORD2_SHIFT + L(duLoop2): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD5, 12(rSTR1) + lwz rWORD6, 12(rSTR2) ++#endif + cmplw cr5, rWORD7, rWORD8 +- bne cr0, L(duLcr0) +- srw rE, rWORD6, rSHR +- slw rH, rWORD6, rSHL +- or rWORD6, rE, rF ++ bne cr7, L(duLcr7) ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ or rWORD6, r0, rWORD4_SHIFT + L(duLoop3): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else + lwzu rWORD7, 16(rSTR1) + lwzu rWORD8, 16(rSTR2) +- cmplw cr0, rWORD1, rWORD2 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + bne- cr1, L(duLcr1) +- srw rG, rWORD8, rSHR +- slw rB, rWORD8, rSHL +- or rWORD8, rG, rH ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + bdnz+ L(duLoop) + + L(duL4): ++#if 0 ++/* Huh? We've already branched on cr1! */ + bne cr1, L(duLcr1) ++#endif + cmplw cr1, rWORD3, rWORD4 + bne cr6, L(duLcr6) + cmplw cr6, rWORD5, rWORD6 + bne cr5, L(duLcr5) + cmplw cr5, rWORD7, rWORD8 + L(du44): +- bne cr0, L(duLcr0) ++ bne cr7, L(duLcr7) + L(du34): + bne cr1, L(duLcr1) + L(du24): +@@ -889,95 +1275,101 @@ + bne cr5, L(duLcr5) + /* At this point we have a remainder of 1 to 3 bytes to compare. We use + shift right to eliminate bits beyond the compare length. ++ This allows the use of word subtract to compute the final result. + + However it may not be safe to load rWORD2 which may be beyond the + string length. So we compare the bit length of the remainder to + the right shift count (rSHR). If the bit count is less than or equal + we do not need to load rWORD2 (all significant bits are already in +- rB). */ ++ rWORD8_SHIFT). */ + cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else + lwz rWORD2, 4(rSTR2) +- srw rA, rWORD2, rSHR +- .align 4 ++#endif ++ srw r0, rWORD2, rSHR ++ .align 4 + L(dutrim): ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++#else + lwz rWORD1, 4(rSTR1) +- lwz r31,48(1) ++#endif ++ lwz rWORD8, 48(r1) + subfic rN, rN, 32 /* Shift count is 32 - (rN * 8). */ +- or rWORD2, rA, rB +- lwz r30,44(1) +- lwz r29,40(r1) ++ or rWORD2, r0, rWORD8_SHIFT ++ lwz rWORD7, 44(r1) ++ lwz rSHL, 40(r1) + srw rWORD1, rWORD1, rN + srw rWORD2, rWORD2, rN +- lwz r28,36(r1) +- lwz r27,32(r1) +- cmplw rWORD1,rWORD2 +- li rRTN,0 +- beq L(dureturn26) +- li rRTN,1 +- bgt L(dureturn26) +- li rRTN,-1 +- b L(dureturn26) +- .align 4 +-L(duLcr0): +- lwz r31,48(1) +- lwz r30,44(1) +- li rRTN, 1 +- bgt cr0, L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) ++ lwz rSHR, 36(r1) ++ lwz rWORD8_SHIFT, 32(r1) ++ sub rRTN, rWORD1, rWORD2 ++ b L(dureturn26) ++ .align 4 ++L(duLcr7): ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) ++ li rRTN, 1 ++ bgt cr7, L(dureturn29) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) + li rRTN, -1 + b L(dureturn27) +- .align 4 ++ .align 4 + L(duLcr1): +- lwz r31,48(1) +- lwz r30,44(1) ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) + li rRTN, 1 + bgt cr1, L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) + li rRTN, -1 + b L(dureturn27) +- .align 4 ++ .align 4 + L(duLcr6): +- lwz r31,48(1) +- lwz r30,44(1) ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) + li rRTN, 1 + bgt cr6, L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) + li rRTN, -1 + b L(dureturn27) +- .align 4 ++ .align 4 + L(duLcr5): +- lwz r31,48(1) +- lwz r30,44(1) ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) + li rRTN, 1 + bgt cr5, L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) + li rRTN, -1 + b L(dureturn27) + .align 3 + L(duZeroReturn): +- li rRTN,0 ++ li rRTN, 0 + .align 4 + L(dureturn): +- lwz r31,48(1) +- lwz r30,44(1) ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) + L(dureturn29): +- lwz r29,40(r1) +- lwz r28,36(r1) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) + L(dureturn27): +- lwz r27,32(r1) ++ lwz rWORD8_SHIFT, 32(r1) + L(dureturn26): +- lwz r26,28(r1) ++ lwz rWORD2_SHIFT, 28(r1) + L(dureturn25): +- lwz r25,24(r1) +- lwz r24,20(r1) +- lwz 1,0(1) ++ lwz rWORD4_SHIFT, 24(r1) ++ lwz rWORD6_SHIFT, 20(r1) ++ addi 1, 1, 64 ++ cfi_adjust_cfa_offset(-64) + blr + END (BP_SYM (memcmp)) + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcmp.S 2014-05-28 19:22:37.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcmp.S 2014-05-28 21:44:57.000000000 -0500 +@@ -25,10 +25,9 @@ + size_t size [r5]) */ + + .machine power7 +-EALIGN (BP_SYM(memcmp),4,0) ++EALIGN (BP_SYM(memcmp), 4, 0) + CALL_MCOUNT + +-#define rTMP r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ +@@ -39,35 +38,32 @@ + #define rWORD4 r9 /* next word in s2 */ + #define rWORD5 r10 /* next word in s1 */ + #define rWORD6 r11 /* next word in s2 */ +-#define rBITDIF r12 /* bits that differ in s1 & s2 words */ + #define rWORD7 r30 /* next word in s1 */ + #define rWORD8 r31 /* next word in s2 */ + +- xor rTMP,rSTR2,rSTR1 +- cmplwi cr6,rN,0 +- cmplwi cr1,rN,12 +- clrlwi. rTMP,rTMP,30 +- clrlwi rBITDIF,rSTR1,30 +- cmplwi cr5,rBITDIF,0 +- beq- cr6,L(zeroLength) +- dcbt 0,rSTR1 +- dcbt 0,rSTR2 +- +- /* If less than 8 bytes or not aligned, use the unaligned +- byte loop. */ +- +- blt cr1,L(bytealigned) +- stwu 1,-64(1) ++ xor r0, rSTR2, rSTR1 ++ cmplwi cr6, rN, 0 ++ cmplwi cr1, rN, 12 ++ clrlwi. r0, r0, 30 ++ clrlwi r12, rSTR1, 30 ++ cmplwi cr5, r12, 0 ++ beq- cr6, L(zeroLength) ++ dcbt 0, rSTR1 ++ dcbt 0, rSTR2 ++/* If less than 8 bytes or not aligned, use the unaligned ++ byte loop. */ ++ blt cr1, L(bytealigned) ++ stwu 1, -64(r1) + cfi_adjust_cfa_offset(64) +- stw r31,48(1) +- cfi_offset(31,(48-64)) +- stw r30,44(1) +- cfi_offset(30,(44-64)) ++ stw rWORD8, 48(r1) ++ cfi_offset(rWORD8, (48-64)) ++ stw rWORD7, 44(r1) ++ cfi_offset(rWORD7, (44-64)) + bne L(unaligned) + /* At this point we know both strings have the same alignment and the +- compare length is at least 8 bytes. rBITDIF contains the low order ++ compare length is at least 8 bytes. r12 contains the low order + 2 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then we are already word ++ of r12 to 0. If r12 == 0 then we are already word + aligned and can perform the word aligned loop. + + Otherwise we know the two strings have the same alignment (but not +@@ -76,332 +72,541 @@ + eliminate bits preceeding the first byte. Since we want to join the + normal (word aligned) compare loop, starting at the second word, + we need to adjust the length (rN) and special case the loop +- versioning for the first word. This insures that the loop count is ++ versioning for the first word. This ensures that the loop count is + correct and the first word (shifted) is in the expected register pair. */ + .align 4 + L(samealignment): +- clrrwi rSTR1,rSTR1,2 +- clrrwi rSTR2,rSTR2,2 +- beq cr5,L(Waligned) +- add rN,rN,rBITDIF +- slwi r11,rBITDIF,3 +- srwi rTMP,rN,4 /* Divide by 16 */ +- andi. rBITDIF,rN,12 /* Get the word remainder */ +- lwz rWORD1,0(rSTR1) +- lwz rWORD2,0(rSTR2) +- cmplwi cr1,rBITDIF,8 +- cmplwi cr7,rN,16 +- clrlwi rN,rN,30 ++ clrrwi rSTR1, rSTR1, 2 ++ clrrwi rSTR2, rSTR2, 2 ++ beq cr5, L(Waligned) ++ add rN, rN, r12 ++ slwi rWORD6, r12, 3 ++ srwi r0, rN, 4 /* Divide by 16 */ ++ andi. r12, rN, 12 /* Get the word remainder */ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 0(rSTR1) ++ lwz rWORD2, 0(rSTR2) ++#endif ++ cmplwi cr1, r12, 8 ++ cmplwi cr7, rN, 16 ++ clrlwi rN, rN, 30 + beq L(dPs4) +- mtctr rTMP +- bgt cr1,L(dPs3) +- beq cr1,L(dPs2) ++ mtctr r0 ++ bgt cr1, L(dPs3) ++ beq cr1, L(dPs2) + + /* Remainder is 4 */ + .align 3 + L(dsP1): +- slw rWORD5,rWORD1,r11 +- slw rWORD6,rWORD2,r11 +- cmplw cr5,rWORD5,rWORD6 +- blt cr7,L(dP1x) ++ slw rWORD5, rWORD1, rWORD6 ++ slw rWORD6, rWORD2, rWORD6 ++ cmplw cr5, rWORD5, rWORD6 ++ blt cr7, L(dP1x) + /* Do something useful in this cycle since we have to branch anyway. */ +- lwz rWORD1,4(rSTR1) +- lwz rWORD2,4(rSTR2) +- cmplw cr0,rWORD1,rWORD2 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 4(rSTR1) ++ lwz rWORD2, 4(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 + b L(dP1e) + /* Remainder is 8 */ + .align 4 + L(dPs2): +- slw rWORD5,rWORD1,r11 +- slw rWORD6,rWORD2,r11 +- cmplw cr6,rWORD5,rWORD6 +- blt cr7,L(dP2x) ++ slw rWORD5, rWORD1, rWORD6 ++ slw rWORD6, rWORD2, rWORD6 ++ cmplw cr6, rWORD5, rWORD6 ++ blt cr7, L(dP2x) + /* Do something useful in this cycle since we have to branch anyway. */ +- lwz rWORD7,4(rSTR1) +- lwz rWORD8,4(rSTR2) +- cmplw cr5,rWORD7,rWORD8 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD7, 4(rSTR1) ++ lwz rWORD8, 4(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 + b L(dP2e) + /* Remainder is 12 */ + .align 4 + L(dPs3): +- slw rWORD3,rWORD1,r11 +- slw rWORD4,rWORD2,r11 +- cmplw cr1,rWORD3,rWORD4 ++ slw rWORD3, rWORD1, rWORD6 ++ slw rWORD4, rWORD2, rWORD6 ++ cmplw cr1, rWORD3, rWORD4 + b L(dP3e) + /* Count is a multiple of 16, remainder is 0 */ + .align 4 + L(dPs4): +- mtctr rTMP +- slw rWORD1,rWORD1,r11 +- slw rWORD2,rWORD2,r11 +- cmplw cr0,rWORD1,rWORD2 ++ mtctr r0 ++ slw rWORD1, rWORD1, rWORD6 ++ slw rWORD2, rWORD2, rWORD6 ++ cmplw cr7, rWORD1, rWORD2 + b L(dP4e) + + /* At this point we know both strings are word aligned and the + compare length is at least 8 bytes. */ + .align 4 + L(Waligned): +- andi. rBITDIF,rN,12 /* Get the word remainder */ +- srwi rTMP,rN,4 /* Divide by 16 */ +- cmplwi cr1,rBITDIF,8 +- cmplwi cr7,rN,16 +- clrlwi rN,rN,30 ++ andi. r12, rN, 12 /* Get the word remainder */ ++ srwi r0, rN, 4 /* Divide by 16 */ ++ cmplwi cr1, r12, 8 ++ cmplwi cr7, rN, 16 ++ clrlwi rN, rN, 30 + beq L(dP4) +- bgt cr1,L(dP3) +- beq cr1,L(dP2) ++ bgt cr1, L(dP3) ++ beq cr1, L(dP2) + + /* Remainder is 4 */ + .align 4 + L(dP1): +- mtctr rTMP ++ mtctr r0 + /* Normally we'd use rWORD7/rWORD8 here, but since we might exit early + (8-15 byte compare), we want to use only volatile registers. This + means we can avoid restoring non-volatile registers since we did not + 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. */ +- lwz rWORD5,0(rSTR1) +- lwz rWORD6,0(rSTR2) +- cmplw cr5,rWORD5,rWORD6 +- blt cr7,L(dP1x) +- lwz rWORD1,4(rSTR1) +- lwz rWORD2,4(rSTR2) +- cmplw cr0,rWORD1,rWORD2 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 0(rSTR1) ++ lwz rWORD6, 0(rSTR2) ++#endif ++ cmplw cr5, rWORD5, rWORD6 ++ blt cr7, L(dP1x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 4(rSTR1) ++ lwz rWORD2, 4(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 + L(dP1e): +- lwz rWORD3,8(rSTR1) +- lwz rWORD4,8(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- lwz rWORD5,12(rSTR1) +- lwz rWORD6,12(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- bne cr5,L(dLcr5) +- bne cr0,L(dLcr0) +- +- lwzu rWORD7,16(rSTR1) +- lwzu rWORD8,16(rSTR2) +- bne cr1,L(dLcr1) +- cmplw cr5,rWORD7,rWORD8 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 8(rSTR1) ++ lwz rWORD4, 8(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 12(rSTR1) ++ lwz rWORD6, 12(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ bne cr5, L(dLcr5x) ++ bne cr7, L(dLcr7x) ++ ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwzu rWORD7, 16(rSTR1) ++ lwzu rWORD8, 16(rSTR2) ++#endif ++ bne cr1, L(dLcr1) ++ cmplw cr5, rWORD7, rWORD8 + bdnz L(dLoop) +- bne cr6,L(dLcr6) +- lwz r30,44(1) +- lwz r31,48(1) ++ bne cr6, L(dLcr6) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) + .align 3 + L(dP1x): +- slwi. r12,rN,3 +- bne cr5,L(dLcr5) +- subfic rN,r12,32 /* Shift count is 32 - (rN * 8). */ +- lwz 1,0(1) ++ slwi. r12, rN, 3 ++ bne cr5, L(dLcr5x) ++ subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) + bne L(d00) +- li rRTN,0 ++ li rRTN, 0 + blr + + /* Remainder is 8 */ + .align 4 ++ cfi_adjust_cfa_offset(64) + L(dP2): +- mtctr rTMP +- lwz rWORD5,0(rSTR1) +- lwz rWORD6,0(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- blt cr7,L(dP2x) +- lwz rWORD7,4(rSTR1) +- lwz rWORD8,4(rSTR2) +- cmplw cr5,rWORD7,rWORD8 ++ mtctr r0 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 0(rSTR1) ++ lwz rWORD6, 0(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ blt cr7, L(dP2x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD7, 4(rSTR1) ++ lwz rWORD8, 4(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 + L(dP2e): +- lwz rWORD1,8(rSTR1) +- lwz rWORD2,8(rSTR2) +- cmplw cr0,rWORD1,rWORD2 +- lwz rWORD3,12(rSTR1) +- lwz rWORD4,12(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- addi rSTR1,rSTR1,4 +- addi rSTR2,rSTR2,4 +- bne cr6,L(dLcr6) +- bne cr5,L(dLcr5) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 8(rSTR1) ++ lwz rWORD2, 8(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 12(rSTR1) ++ lwz rWORD4, 12(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#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): +- lwz rWORD3,4(rSTR1) +- lwz rWORD4,4(rSTR2) +- cmplw cr5,rWORD3,rWORD4 +- slwi. r12,rN,3 +- bne cr6,L(dLcr6) +- addi rSTR1,rSTR1,4 +- addi rSTR2,rSTR2,4 +- bne cr5,L(dLcr5) +- subfic rN,r12,32 /* Shift count is 32 - (rN * 8). */ +- lwz 1,0(1) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 4(rSTR1) ++ lwz rWORD4, 4(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++ slwi. r12, rN, 3 ++ bne cr6, L(dLcr6x) ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#endif ++ bne cr1, L(dLcr1x) ++ subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) + bne L(d00) +- li rRTN,0 ++ li rRTN, 0 + blr + + /* Remainder is 12 */ + .align 4 ++ cfi_adjust_cfa_offset(64) + L(dP3): +- mtctr rTMP +- lwz rWORD3,0(rSTR1) +- lwz rWORD4,0(rSTR2) +- cmplw cr1,rWORD3,rWORD4 ++ mtctr r0 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 0(rSTR1) ++ lwz rWORD4, 0(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 + L(dP3e): +- lwz rWORD5,4(rSTR1) +- lwz rWORD6,4(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- blt cr7,L(dP3x) +- lwz rWORD7,8(rSTR1) +- lwz rWORD8,8(rSTR2) +- cmplw cr5,rWORD7,rWORD8 +- lwz rWORD1,12(rSTR1) +- lwz rWORD2,12(rSTR2) +- cmplw cr0,rWORD1,rWORD2 +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- bne cr1,L(dLcr1) +- bne cr6,L(dLcr6) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 4(rSTR1) ++ lwz rWORD6, 4(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ blt cr7, L(dP3x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD7, 8(rSTR1) ++ lwz rWORD8, 8(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 12(rSTR1) ++ lwz rWORD2, 12(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 8 ++ addi rSTR2, rSTR2, 8 ++#endif ++ bne cr1, L(dLcr1) ++ bne cr6, L(dLcr6) + b L(dLoop1) + /* Again we are on a early exit path (24-31 byte compare), we want to + only use volatile registers and avoid restoring non-volatile + registers. */ + .align 4 + L(dP3x): +- lwz rWORD1,8(rSTR1) +- lwz rWORD2,8(rSTR2) +- cmplw cr5,rWORD1,rWORD2 +- slwi. r12,rN,3 +- bne cr1,L(dLcr1) +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- bne cr6,L(dLcr6) +- subfic rN,r12,32 /* Shift count is 32 - (rN * 8). */ +- bne cr5,L(dLcr5) +- lwz 1,0(1) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 8(rSTR1) ++ lwz rWORD2, 8(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++ slwi. r12, rN, 3 ++ bne cr1, L(dLcr1x) ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 8 ++ addi rSTR2, rSTR2, 8 ++#endif ++ bne cr6, L(dLcr6x) ++ subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ ++ bne cr7, L(dLcr7x) ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) + bne L(d00) +- li rRTN,0 ++ li rRTN, 0 + blr + + /* Count is a multiple of 16, remainder is 0 */ + .align 4 ++ cfi_adjust_cfa_offset(64) + L(dP4): +- mtctr rTMP +- lwz rWORD1,0(rSTR1) +- lwz rWORD2,0(rSTR2) +- cmplw cr0,rWORD1,rWORD2 ++ mtctr r0 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 0(rSTR1) ++ lwz rWORD2, 0(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 + L(dP4e): +- lwz rWORD3,4(rSTR1) +- lwz rWORD4,4(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- lwz rWORD5,8(rSTR1) +- lwz rWORD6,8(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- lwzu rWORD7,12(rSTR1) +- lwzu rWORD8,12(rSTR2) +- cmplw cr5,rWORD7,rWORD8 +- bne cr0,L(dLcr0) +- bne cr1,L(dLcr1) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 4(rSTR1) ++ lwz rWORD4, 4(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 8(rSTR1) ++ lwz rWORD6, 8(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwzu rWORD7, 12(rSTR1) ++ lwzu rWORD8, 12(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++ bne cr7, L(dLcr7) ++ bne cr1, L(dLcr1) + bdz- L(d24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ + .align 4 + L(dLoop): +- lwz rWORD1,4(rSTR1) +- lwz rWORD2,4(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- bne cr6,L(dLcr6) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 4(rSTR1) ++ lwz rWORD2, 4(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++ bne cr6, L(dLcr6) + L(dLoop1): +- lwz rWORD3,8(rSTR1) +- lwz rWORD4,8(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- bne cr5,L(dLcr5) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 8(rSTR1) ++ lwz rWORD4, 8(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ bne cr5, L(dLcr5) + L(dLoop2): +- lwz rWORD5,12(rSTR1) +- lwz rWORD6,12(rSTR2) +- cmplw cr5,rWORD7,rWORD8 +- bne cr0,L(dLcr0) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 12(rSTR1) ++ lwz rWORD6, 12(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++ bne cr7, L(dLcr7) + L(dLoop3): +- lwzu rWORD7,16(rSTR1) +- lwzu rWORD8,16(rSTR2) +- bne cr1,L(dLcr1) +- cmplw cr0,rWORD1,rWORD2 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwzu rWORD7, 16(rSTR1) ++ lwzu rWORD8, 16(rSTR2) ++#endif ++ bne cr1, L(dLcr1) ++ cmplw cr7, rWORD1, rWORD2 + bdnz L(dLoop) + + L(dL4): +- cmplw cr1,rWORD3,rWORD4 +- bne cr6,L(dLcr6) +- cmplw cr6,rWORD5,rWORD6 +- bne cr5,L(dLcr5) +- cmplw cr5,rWORD7,rWORD8 ++ cmplw cr1, rWORD3, rWORD4 ++ bne cr6, L(dLcr6) ++ cmplw cr6, rWORD5, rWORD6 ++ bne cr5, L(dLcr5) ++ cmplw cr5, rWORD7, rWORD8 + L(d44): +- bne cr0,L(dLcr0) ++ bne cr7, L(dLcr7) + L(d34): +- bne cr1,L(dLcr1) ++ bne cr1, L(dLcr1) + L(d24): +- bne cr6,L(dLcr6) ++ bne cr6, L(dLcr6) + L(d14): +- slwi. r12,rN,3 +- bne cr5,L(dLcr5) ++ slwi. r12, rN, 3 ++ bne cr5, L(dLcr5) + L(d04): +- lwz r30,44(1) +- lwz r31,48(1) +- lwz 1,0(1) +- subfic rN,r12,32 /* Shift count is 32 - (rN * 8). */ ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) ++ subfic rN, r12, 32 /* Shift count is 32 - (rN * 8). */ + beq L(zeroLength) + /* At this point we have a remainder of 1 to 3 bytes to compare. Since + we are aligned it is safe to load the whole word, and use +- shift right to eliminate bits beyond the compare length. */ ++ shift right to eliminate bits beyond the compare length. */ + L(d00): +- lwz rWORD1,4(rSTR1) +- lwz rWORD2,4(rSTR2) +- srw rWORD1,rWORD1,rN +- srw rWORD2,rWORD2,rN +- cmplw rWORD1,rWORD2 +- li rRTN,0 +- beqlr +- li rRTN,1 +- bgtlr +- li rRTN,-1 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 4(rSTR1) ++ lwz rWORD2, 4(rSTR2) ++#endif ++ srw rWORD1, rWORD1, rN ++ srw rWORD2, rWORD2, rN ++ sub rRTN, rWORD1, rWORD2 + blr + + .align 4 +-L(dLcr0): +- lwz r30,44(1) +- lwz r31,48(1) +- li rRTN,1 +- lwz 1,0(1) +- bgtlr cr0 +- li rRTN,-1 ++ cfi_adjust_cfa_offset(64) ++L(dLcr7): ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++L(dLcr7x): ++ li rRTN, 1 ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) ++ bgtlr cr7 ++ li rRTN, -1 + blr + .align 4 ++ cfi_adjust_cfa_offset(64) + L(dLcr1): +- lwz r30,44(1) +- lwz r31,48(1) +- li rRTN,1 +- lwz 1,0(1) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++L(dLcr1x): ++ li rRTN, 1 ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) + bgtlr cr1 +- li rRTN,-1 ++ li rRTN, -1 + blr + .align 4 ++ cfi_adjust_cfa_offset(64) + L(dLcr6): +- lwz r30,44(1) +- lwz r31,48(1) +- li rRTN,1 +- lwz 1,0(1) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) ++L(dLcr6x): ++ li rRTN, 1 ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) + bgtlr cr6 +- li rRTN,-1 ++ li rRTN, -1 + blr + .align 4 ++ cfi_adjust_cfa_offset(64) + L(dLcr5): +- lwz r30,44(1) +- lwz r31,48(1) ++ lwz rWORD7, 44(r1) ++ lwz rWORD8, 48(r1) + L(dLcr5x): +- li rRTN,1 +- lwz 1,0(1) ++ li rRTN, 1 ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) + bgtlr cr5 +- li rRTN,-1 ++ li rRTN, -1 + blr + + .align 4 + L(bytealigned): +- cfi_adjust_cfa_offset(-64) + mtctr rN + + /* We need to prime this loop. This loop is swing modulo scheduled +@@ -413,38 +618,39 @@ + + So we must precondition some registers and condition codes so that + we don't exit the loop early on the first iteration. */ +- lbz rWORD1,0(rSTR1) +- lbz rWORD2,0(rSTR2) ++ ++ lbz rWORD1, 0(rSTR1) ++ lbz rWORD2, 0(rSTR2) + bdz L(b11) +- cmplw cr0,rWORD1,rWORD2 +- lbz rWORD3,1(rSTR1) +- lbz rWORD4,1(rSTR2) ++ cmplw cr7, rWORD1, rWORD2 ++ lbz rWORD3, 1(rSTR1) ++ lbz rWORD4, 1(rSTR2) + bdz L(b12) +- cmplw cr1,rWORD3,rWORD4 +- lbzu rWORD5,2(rSTR1) +- lbzu rWORD6,2(rSTR2) ++ cmplw cr1, rWORD3, rWORD4 ++ lbzu rWORD5, 2(rSTR1) ++ lbzu rWORD6, 2(rSTR2) + bdz L(b13) + .align 4 + L(bLoop): +- lbzu rWORD1,1(rSTR1) +- lbzu rWORD2,1(rSTR2) +- bne cr0,L(bLcr0) ++ lbzu rWORD1, 1(rSTR1) ++ lbzu rWORD2, 1(rSTR2) ++ bne cr7, L(bLcr7) + +- cmplw cr6,rWORD5,rWORD6 ++ cmplw cr6, rWORD5, rWORD6 + bdz L(b3i) + +- lbzu rWORD3,1(rSTR1) +- lbzu rWORD4,1(rSTR2) +- bne cr1,L(bLcr1) ++ lbzu rWORD3, 1(rSTR1) ++ lbzu rWORD4, 1(rSTR2) ++ bne cr1, L(bLcr1) + +- cmplw cr0,rWORD1,rWORD2 ++ cmplw cr7, rWORD1, rWORD2 + bdz L(b2i) + +- lbzu rWORD5,1(rSTR1) +- lbzu rWORD6,1(rSTR2) +- bne cr6,L(bLcr6) ++ lbzu rWORD5, 1(rSTR1) ++ lbzu rWORD6, 1(rSTR2) ++ bne cr6, L(bLcr6) + +- cmplw cr1,rWORD3,rWORD4 ++ cmplw cr1, rWORD3, rWORD4 + bdnz L(bLoop) + + /* We speculatively loading bytes before we have tested the previous +@@ -454,67 +660,62 @@ + tested. In this case we must complete the pending operations + before returning. */ + L(b1i): +- bne cr0,L(bLcr0) +- bne cr1,L(bLcr1) ++ bne cr7, L(bLcr7) ++ bne cr1, L(bLcr1) + b L(bx56) + .align 4 + L(b2i): +- bne cr6,L(bLcr6) +- bne cr0,L(bLcr0) ++ bne cr6, L(bLcr6) ++ bne cr7, L(bLcr7) + b L(bx34) + .align 4 + L(b3i): +- bne cr1,L(bLcr1) +- bne cr6,L(bLcr6) ++ bne cr1, L(bLcr1) ++ bne cr6, L(bLcr6) + b L(bx12) + .align 4 +-L(bLcr0): +- li rRTN,1 +- bgtlr cr0 +- li rRTN,-1 ++L(bLcr7): ++ li rRTN, 1 ++ bgtlr cr7 ++ li rRTN, -1 + blr + L(bLcr1): +- li rRTN,1 ++ li rRTN, 1 + bgtlr cr1 +- li rRTN,-1 ++ li rRTN, -1 + blr + L(bLcr6): +- li rRTN,1 ++ li rRTN, 1 + bgtlr cr6 +- li rRTN,-1 ++ li rRTN, -1 + blr + + L(b13): +- bne cr0,L(bx12) +- bne cr1,L(bx34) ++ bne cr7, L(bx12) ++ bne cr1, L(bx34) + L(bx56): +- sub rRTN,rWORD5,rWORD6 ++ sub rRTN, rWORD5, rWORD6 + blr + nop + L(b12): +- bne cr0,L(bx12) ++ bne cr7, L(bx12) + L(bx34): +- sub rRTN,rWORD3,rWORD4 ++ sub rRTN, rWORD3, rWORD4 + blr +- + L(b11): + L(bx12): +- sub rRTN,rWORD1,rWORD2 ++ sub rRTN, rWORD1, rWORD2 + blr +- + .align 4 +-L(zeroLengthReturn): +- + L(zeroLength): +- li rRTN,0 ++ li rRTN, 0 + blr + +- cfi_adjust_cfa_offset(64) + .align 4 + /* At this point we know the strings have different alignment and the +- compare length is at least 8 bytes. rBITDIF contains the low order ++ compare length is at least 8 bytes. r12 contains the low order + 2 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then rStr1 is word aligned and can ++ of r12 to 0. If r12 == 0 then rStr1 is word aligned and can + perform the Wunaligned loop. + + Otherwise we know that rSTR1 is not aready word aligned yet. +@@ -523,465 +724,654 @@ + eliminate bits preceeding the first byte. Since we want to join the + normal (Wualigned) compare loop, starting at the second word, + we need to adjust the length (rN) and special case the loop +- versioning for the first W. This insures that the loop count is ++ versioning for the first W. This ensures that the loop count is + correct and the first W (shifted) is in the expected resister pair. */ + #define rSHL r29 /* Unaligned shift left count. */ + #define rSHR r28 /* Unaligned shift right count. */ +-#define rB r27 /* Left rotation temp for rWORD2. */ +-#define rD r26 /* Left rotation temp for rWORD4. */ +-#define rF r25 /* Left rotation temp for rWORD6. */ +-#define rH r24 /* Left rotation temp for rWORD8. */ +-#define rA r0 /* Right rotation temp for rWORD2. */ +-#define rC r12 /* Right rotation temp for rWORD4. */ +-#define rE r0 /* Right rotation temp for rWORD6. */ +-#define rG r12 /* Right rotation temp for rWORD8. */ ++#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. */ ++ cfi_adjust_cfa_offset(64) + L(unaligned): +- stw r29,40(r1) +- cfi_offset(r29,(40-64)) +- clrlwi rSHL,rSTR2,30 +- stw r28,36(r1) +- cfi_offset(r28,(36-64)) +- beq cr5,L(Wunaligned) +- stw r27,32(r1) +- cfi_offset(r27,(32-64)) ++ stw rSHL, 40(r1) ++ cfi_offset(rSHL, (40-64)) ++ clrlwi rSHL, rSTR2, 30 ++ stw rSHR, 36(r1) ++ cfi_offset(rSHR, (36-64)) ++ beq cr5, L(Wunaligned) ++ stw rWORD8_SHIFT, 32(r1) ++ cfi_offset(rWORD8_SHIFT, (32-64)) + /* Adjust the logical start of rSTR2 to compensate for the extra bits + in the 1st rSTR1 W. */ +- sub r27,rSTR2,rBITDIF ++ sub rWORD8_SHIFT, rSTR2, r12 + /* But do not attempt to address the W before that W that contains + the actual start of rSTR2. */ +- clrrwi rSTR2,rSTR2,2 +- stw r26,28(r1) +- cfi_offset(r26,(28-64)) +-/* Compute the left/right shift counts for the unalign rSTR2, ++ clrrwi rSTR2, rSTR2, 2 ++ stw rWORD2_SHIFT, 28(r1) ++ cfi_offset(rWORD2_SHIFT, (28-64)) ++/* Compute the left/right shift counts for the unaligned rSTR2, + compensating for the logical (W aligned) start of rSTR1. */ +- clrlwi rSHL,r27,30 +- clrrwi rSTR1,rSTR1,2 +- stw r25,24(r1) +- cfi_offset(r25,(24-64)) +- slwi rSHL,rSHL,3 +- cmplw cr5,r27,rSTR2 +- add rN,rN,rBITDIF +- slwi r11,rBITDIF,3 +- stw r24,20(r1) +- cfi_offset(r24,(20-64)) +- subfic rSHR,rSHL,32 +- srwi rTMP,rN,4 /* Divide by 16 */ +- andi. rBITDIF,rN,12 /* Get the W remainder */ ++ clrlwi rSHL, rWORD8_SHIFT, 30 ++ clrrwi rSTR1, rSTR1, 2 ++ stw rWORD4_SHIFT, 24(r1) ++ cfi_offset(rWORD4_SHIFT, (24-64)) ++ slwi rSHL, rSHL, 3 ++ cmplw cr5, rWORD8_SHIFT, rSTR2 ++ add rN, rN, r12 ++ slwi rWORD6, r12, 3 ++ stw rWORD6_SHIFT, 20(r1) ++ cfi_offset(rWORD6_SHIFT, (20-64)) ++ subfic rSHR, rSHL, 32 ++ srwi r0, rN, 4 /* Divide by 16 */ ++ andi. r12, rN, 12 /* Get the W remainder */ + /* We normally need to load 2 Ws to start the unaligned rSTR2, but in + this special case those bits may be discarded anyway. Also we + must avoid loading a W where none of the bits are part of rSTR2 as + this may cross a page boundary and cause a page fault. */ +- li rWORD8,0 +- blt cr5,L(dus0) +- lwz rWORD8,0(rSTR2) +- la rSTR2,4(rSTR2) +- slw rWORD8,rWORD8,rSHL ++ li rWORD8, 0 ++ blt cr5, L(dus0) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD8, 0(rSTR2) ++ addi rSTR2, rSTR2, 4 ++#endif ++ slw rWORD8, rWORD8, rSHL + + L(dus0): +- lwz rWORD1,0(rSTR1) +- lwz rWORD2,0(rSTR2) +- cmplwi cr1,rBITDIF,8 +- cmplwi cr7,rN,16 +- srw rG,rWORD2,rSHR +- clrlwi rN,rN,30 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 0(rSTR1) ++ lwz rWORD2, 0(rSTR2) ++#endif ++ cmplwi cr1, r12, 8 ++ cmplwi cr7, rN, 16 ++ srw r12, rWORD2, rSHR ++ clrlwi rN, rN, 30 + beq L(duPs4) +- mtctr rTMP +- or rWORD8,rG,rWORD8 +- bgt cr1,L(duPs3) +- beq cr1,L(duPs2) ++ mtctr r0 ++ or rWORD8, r12, rWORD8 ++ bgt cr1, L(duPs3) ++ beq cr1, L(duPs2) + + /* Remainder is 4 */ + .align 4 + L(dusP1): +- slw rB,rWORD2,rSHL +- slw rWORD7,rWORD1,r11 +- slw rWORD8,rWORD8,r11 +- bge cr7,L(duP1e) ++ slw rWORD8_SHIFT, rWORD2, rSHL ++ slw rWORD7, rWORD1, rWORD6 ++ slw rWORD8, rWORD8, rWORD6 ++ bge cr7, L(duP1e) + /* At this point we exit early with the first word compare + complete and remainder of 0 to 3 bytes. See L(du14) for details on + how we handle the remaining bytes. */ +- cmplw cr5,rWORD7,rWORD8 +- slwi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmplw cr7,rN,rSHR ++ cmplw cr5, rWORD7, rWORD8 ++ slwi. rN, rN, 3 ++ bne cr5, L(duLcr5) ++ cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- lwz rWORD2,4(rSTR2) +- srw rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD2, 4(rSTR2) ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 8 */ + .align 4 + L(duPs2): +- slw rH,rWORD2,rSHL +- slw rWORD5,rWORD1,r11 +- slw rWORD6,rWORD8,r11 ++ slw rWORD6_SHIFT, rWORD2, rSHL ++ slw rWORD5, rWORD1, rWORD6 ++ slw rWORD6, rWORD8, rWORD6 + b L(duP2e) + /* Remainder is 12 */ + .align 4 + L(duPs3): +- slw rF,rWORD2,rSHL +- slw rWORD3,rWORD1,r11 +- slw rWORD4,rWORD8,r11 ++ slw rWORD4_SHIFT, rWORD2, rSHL ++ slw rWORD3, rWORD1, rWORD6 ++ slw rWORD4, rWORD8, rWORD6 + b L(duP3e) + /* Count is a multiple of 16, remainder is 0 */ + .align 4 + L(duPs4): +- mtctr rTMP +- or rWORD8,rG,rWORD8 +- slw rD,rWORD2,rSHL +- slw rWORD1,rWORD1,r11 +- slw rWORD2,rWORD8,r11 ++ mtctr r0 ++ or rWORD8, r12, rWORD8 ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ slw rWORD1, rWORD1, rWORD6 ++ slw rWORD2, rWORD8, rWORD6 + b L(duP4e) + + /* At this point we know rSTR1 is word aligned and the + compare length is at least 8 bytes. */ + .align 4 + L(Wunaligned): +- stw r27,32(r1) +- cfi_offset(r27,(32-64)) +- clrrwi rSTR2,rSTR2,2 +- stw r26,28(r1) +- cfi_offset(r26,(28-64)) +- srwi rTMP,rN,4 /* Divide by 16 */ +- stw r25,24(r1) +- cfi_offset(r25,(24-64)) +- andi. rBITDIF,rN,12 /* Get the W remainder */ +- stw r24,20(r1) +- cfi_offset(r24,(24-64)) +- slwi rSHL,rSHL,3 +- lwz rWORD6,0(rSTR2) +- lwzu rWORD8,4(rSTR2) +- cmplwi cr1,rBITDIF,8 +- cmplwi cr7,rN,16 +- clrlwi rN,rN,30 +- subfic rSHR,rSHL,32 +- slw rH,rWORD6,rSHL ++ stw rWORD8_SHIFT, 32(r1) ++ cfi_offset(rWORD8_SHIFT, (32-64)) ++ clrrwi rSTR2, rSTR2, 2 ++ stw rWORD2_SHIFT, 28(r1) ++ cfi_offset(rWORD2_SHIFT, (28-64)) ++ srwi r0, rN, 4 /* Divide by 16 */ ++ stw rWORD4_SHIFT, 24(r1) ++ cfi_offset(rWORD4_SHIFT, (24-64)) ++ andi. r12, rN, 12 /* Get the W remainder */ ++ stw rWORD6_SHIFT, 20(r1) ++ cfi_offset(rWORD6_SHIFT, (20-64)) ++ slwi rSHL, rSHL, 3 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD6, 0(rSTR2) ++ lwzu rWORD8, 4(rSTR2) ++#endif ++ cmplwi cr1, r12, 8 ++ cmplwi cr7, rN, 16 ++ clrlwi rN, rN, 30 ++ subfic rSHR, rSHL, 32 ++ slw rWORD6_SHIFT, rWORD6, rSHL + beq L(duP4) +- mtctr rTMP +- bgt cr1,L(duP3) +- beq cr1,L(duP2) ++ mtctr r0 ++ bgt cr1, L(duP3) ++ beq cr1, L(duP2) + + /* Remainder is 4 */ + .align 4 + L(duP1): +- srw rG,rWORD8,rSHR +- lwz rWORD7,0(rSTR1) +- slw rB,rWORD8,rSHL +- or rWORD8,rG,rH +- blt cr7,L(duP1x) ++ srw r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else ++ lwz rWORD7, 0(rSTR1) ++#endif ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT ++ blt cr7, L(duP1x) + L(duP1e): +- lwz rWORD1,4(rSTR1) +- lwz rWORD2,4(rSTR2) +- cmplw cr5,rWORD7,rWORD8 +- srw rA,rWORD2,rSHR +- slw rD,rWORD2,rSHL +- or rWORD2,rA,rB +- lwz rWORD3,8(rSTR1) +- lwz rWORD4,8(rSTR2) +- cmplw cr0,rWORD1,rWORD2 +- srw rC,rWORD4,rSHR +- slw rF,rWORD4,rSHL +- bne cr5,L(duLcr5) +- or rWORD4,rC,rD +- lwz rWORD5,12(rSTR1) +- lwz rWORD6,12(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- srw rE,rWORD6,rSHR +- slw rH,rWORD6,rSHL +- bne cr0,L(duLcr0) +- or rWORD6,rE,rF +- cmplw cr6,rWORD5,rWORD6 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 4(rSTR1) ++ lwz rWORD2, 4(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 8(rSTR1) ++ lwz rWORD4, 8(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL ++ bne cr5, L(duLcr5) ++ or rWORD4, r12, rWORD2_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 12(rSTR1) ++ lwz rWORD6, 12(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ bne cr7, L(duLcr7) ++ or rWORD6, r0, rWORD4_SHIFT ++ cmplw cr6, rWORD5, rWORD6 + b L(duLoop3) + .align 4 + /* At this point we exit early with the first word compare + complete and remainder of 0 to 3 bytes. See L(du14) for details on + how we handle the remaining bytes. */ + L(duP1x): +- cmplw cr5,rWORD7,rWORD8 +- slwi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmplw cr7,rN,rSHR ++ cmplw cr5, rWORD7, rWORD8 ++ slwi. rN, rN, 3 ++ bne cr5, L(duLcr5) ++ cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- ld rWORD2,8(rSTR2) +- srw rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD2, 8(rSTR2) ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 8 */ + .align 4 + L(duP2): +- srw rE,rWORD8,rSHR +- lwz rWORD5,0(rSTR1) +- or rWORD6,rE,rH +- slw rH,rWORD8,rSHL ++ srw r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else ++ lwz rWORD5, 0(rSTR1) ++#endif ++ or rWORD6, r0, rWORD6_SHIFT ++ slw rWORD6_SHIFT, rWORD8, rSHL + L(duP2e): +- lwz rWORD7,4(rSTR1) +- lwz rWORD8,4(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- srw rG,rWORD8,rSHR +- slw rB,rWORD8,rSHL +- or rWORD8,rG,rH +- blt cr7,L(duP2x) +- lwz rWORD1,8(rSTR1) +- lwz rWORD2,8(rSTR2) +- cmplw cr5,rWORD7,rWORD8 +- bne cr6,L(duLcr6) +- srw rA,rWORD2,rSHR +- slw rD,rWORD2,rSHL +- or rWORD2,rA,rB +- lwz rWORD3,12(rSTR1) +- lwz rWORD4,12(rSTR2) +- cmplw cr0,rWORD1,rWORD2 +- bne cr5,L(duLcr5) +- srw rC,rWORD4,rSHR +- slw rF,rWORD4,rSHL +- or rWORD4,rC,rD +- addi rSTR1,rSTR1,4 +- addi rSTR2,rSTR2,4 +- cmplw cr1,rWORD3,rWORD4 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD7, 4(rSTR1) ++ lwz rWORD8, 4(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT ++ blt cr7, L(duP2x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 8(rSTR1) ++ lwz rWORD2, 8(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++ bne cr6, L(duLcr6) ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 12(rSTR1) ++ lwz rWORD4, 12(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++ bne cr5, L(duLcr5) ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL ++ or rWORD4, r12, rWORD2_SHIFT ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#endif ++ cmplw cr1, rWORD3, rWORD4 + b L(duLoop2) + .align 4 + L(duP2x): +- cmplw cr5,rWORD7,rWORD8 +- addi rSTR1,rSTR1,4 +- addi rSTR2,rSTR2,4 +- bne cr6,L(duLcr6) +- slwi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmplw cr7,rN,rSHR ++ cmplw cr5, rWORD7, rWORD8 ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#endif ++ bne cr6, L(duLcr6) ++ slwi. rN, rN, 3 ++ bne cr5, L(duLcr5) ++ cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- lwz rWORD2,4(rSTR2) +- srw rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD2, 4(rSTR2) ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + + /* Remainder is 12 */ + .align 4 + L(duP3): +- srw rC,rWORD8,rSHR +- lwz rWORD3,0(rSTR1) +- slw rF,rWORD8,rSHL +- or rWORD4,rC,rH ++ srw r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else ++ lwz rWORD3, 0(rSTR1) ++#endif ++ slw rWORD4_SHIFT, rWORD8, rSHL ++ or rWORD4, r12, rWORD6_SHIFT + L(duP3e): +- lwz rWORD5,4(rSTR1) +- lwz rWORD6,4(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- srw rE,rWORD6,rSHR +- slw rH,rWORD6,rSHL +- or rWORD6,rE,rF +- lwz rWORD7,8(rSTR1) +- lwz rWORD8,8(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- bne cr1,L(duLcr1) +- srw rG,rWORD8,rSHR +- slw rB,rWORD8,rSHL +- or rWORD8,rG,rH +- blt cr7,L(duP3x) +- lwz rWORD1,12(rSTR1) +- lwz rWORD2,12(rSTR2) +- cmplw cr5,rWORD7,rWORD8 +- bne cr6,L(duLcr6) +- srw rA,rWORD2,rSHR +- slw rD,rWORD2,rSHL +- or rWORD2,rA,rB +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- cmplw cr0,rWORD1,rWORD2 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 4(rSTR1) ++ lwz rWORD6, 4(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ or rWORD6, r0, rWORD4_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD7, 8(rSTR1) ++ lwz rWORD8, 8(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ bne cr1, L(duLcr1) ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT ++ blt cr7, L(duP3x) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 12(rSTR1) ++ lwz rWORD2, 12(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++ bne cr6, L(duLcr6) ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 8 ++ addi rSTR2, rSTR2, 8 ++#endif ++ cmplw cr7, rWORD1, rWORD2 + b L(duLoop1) + .align 4 + L(duP3x): +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- bne cr1,L(duLcr1) +- cmplw cr5,rWORD7,rWORD8 +- bne cr6,L(duLcr6) +- slwi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmplw cr7,rN,rSHR ++#ifndef __LITTLE_ENDIAN__ ++ addi rSTR1, rSTR1, 8 ++ addi rSTR2, rSTR2, 8 ++#endif ++#if 0 ++/* Huh? We've already branched on cr1! */ ++ bne cr1, L(duLcr1) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++ bne cr6, L(duLcr6) ++ slwi. rN, rN, 3 ++ bne cr5, L(duLcr5) ++ cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- lwz rWORD2,4(rSTR2) +- srw rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD2, 4(rSTR2) ++#endif ++ srw r0, rWORD2, rSHR + b L(dutrim) + + /* Count is a multiple of 16, remainder is 0 */ + .align 4 + L(duP4): +- mtctr rTMP +- srw rA,rWORD8,rSHR +- lwz rWORD1,0(rSTR1) +- slw rD,rWORD8,rSHL +- or rWORD2,rA,rH ++ mtctr r0 ++ srw r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ addi rSTR1, rSTR1, 4 ++#else ++ lwz rWORD1, 0(rSTR1) ++#endif ++ slw rWORD2_SHIFT, rWORD8, rSHL ++ or rWORD2, r0, rWORD6_SHIFT + L(duP4e): +- lwz rWORD3,4(rSTR1) +- lwz rWORD4,4(rSTR2) +- cmplw cr0,rWORD1,rWORD2 +- srw rC,rWORD4,rSHR +- slw rF,rWORD4,rSHL +- or rWORD4,rC,rD +- lwz rWORD5,8(rSTR1) +- lwz rWORD6,8(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- bne cr0,L(duLcr0) +- srw rE,rWORD6,rSHR +- slw rH,rWORD6,rSHL +- or rWORD6,rE,rF +- lwzu rWORD7,12(rSTR1) +- lwzu rWORD8,12(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- bne cr1,L(duLcr1) +- srw rG,rWORD8,rSHR +- slw rB,rWORD8,rSHL +- or rWORD8,rG,rH +- cmplw cr5,rWORD7,rWORD8 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 4(rSTR1) ++ lwz rWORD4, 4(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL ++ or rWORD4, r12, rWORD2_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 8(rSTR1) ++ lwz rWORD6, 8(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++ bne cr7, L(duLcr7) ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ or rWORD6, r0, rWORD4_SHIFT ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwzu rWORD7, 12(rSTR1) ++ lwzu rWORD8, 12(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ bne cr1, L(duLcr1) ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT ++ cmplw cr5, rWORD7, rWORD8 + bdz L(du24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ + .align 4 + L(duLoop): +- lwz rWORD1,4(rSTR1) +- lwz rWORD2,4(rSTR2) +- cmplw cr1,rWORD3,rWORD4 +- bne cr6,L(duLcr6) +- srw rA,rWORD2,rSHR +- slw rD,rWORD2,rSHL +- or rWORD2,rA,rB ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD1, 4(rSTR1) ++ lwz rWORD2, 4(rSTR2) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++ bne cr6, L(duLcr6) ++ srw r0, rWORD2, rSHR ++ slw rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT + L(duLoop1): +- lwz rWORD3,8(rSTR1) +- lwz rWORD4,8(rSTR2) +- cmplw cr6,rWORD5,rWORD6 +- bne cr5,L(duLcr5) +- srw rC,rWORD4,rSHR +- slw rF,rWORD4,rSHL +- or rWORD4,rC,rD ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD3, 0, rSTR1 ++ lwbrx rWORD4, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD3, 8(rSTR1) ++ lwz rWORD4, 8(rSTR2) ++#endif ++ cmplw cr6, rWORD5, rWORD6 ++ bne cr5, L(duLcr5) ++ srw r12, rWORD4, rSHR ++ slw rWORD4_SHIFT, rWORD4, rSHL ++ or rWORD4, r12, rWORD2_SHIFT + L(duLoop2): +- lwz rWORD5,12(rSTR1) +- lwz rWORD6,12(rSTR2) +- cmplw cr5,rWORD7,rWORD8 +- bne cr0,L(duLcr0) +- srw rE,rWORD6,rSHR +- slw rH,rWORD6,rSHL +- or rWORD6,rE,rF ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD5, 0, rSTR1 ++ lwbrx rWORD6, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD5, 12(rSTR1) ++ lwz rWORD6, 12(rSTR2) ++#endif ++ cmplw cr5, rWORD7, rWORD8 ++ bne cr7, L(duLcr7) ++ srw r0, rWORD6, rSHR ++ slw rWORD6_SHIFT, rWORD6, rSHL ++ or rWORD6, r0, rWORD4_SHIFT + L(duLoop3): +- lwzu rWORD7,16(rSTR1) +- lwzu rWORD8,16(rSTR2) +- cmplw cr0,rWORD1,rWORD2 +- bne cr1,L(duLcr1) +- srw rG,rWORD8,rSHR +- slw rB,rWORD8,rSHL +- or rWORD8,rG,rH ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD7, 0, rSTR1 ++ lwbrx rWORD8, 0, rSTR2 ++ addi rSTR1, rSTR1, 4 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwzu rWORD7, 16(rSTR1) ++ lwzu rWORD8, 16(rSTR2) ++#endif ++ cmplw cr7, rWORD1, rWORD2 ++ bne cr1, L(duLcr1) ++ srw r12, rWORD8, rSHR ++ slw rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + bdnz L(duLoop) + + L(duL4): +- bne cr1,L(duLcr1) +- cmplw cr1,rWORD3,rWORD4 +- bne cr6,L(duLcr6) +- cmplw cr6,rWORD5,rWORD6 +- bne cr5,L(duLcr5) +- cmplw cr5,rWORD7,rWORD8 ++#if 0 ++/* Huh? We've already branched on cr1! */ ++ bne cr1, L(duLcr1) ++#endif ++ cmplw cr1, rWORD3, rWORD4 ++ bne cr6, L(duLcr6) ++ cmplw cr6, rWORD5, rWORD6 ++ bne cr5, L(duLcr5) ++ cmplw cr5, rWORD7, rWORD8 + L(du44): +- bne cr0,L(duLcr0) ++ bne cr7, L(duLcr7) + L(du34): +- bne cr1,L(duLcr1) ++ bne cr1, L(duLcr1) + L(du24): +- bne cr6,L(duLcr6) ++ bne cr6, L(duLcr6) + L(du14): +- slwi. rN,rN,3 +- bne cr5,L(duLcr5) ++ slwi. rN, rN, 3 ++ bne cr5, L(duLcr5) + /* At this point we have a remainder of 1 to 3 bytes to compare. We use + shift right to eliminate bits beyond the compare length. ++ This allows the use of word subtract to compute the final result. + + However it may not be safe to load rWORD2 which may be beyond the + string length. So we compare the bit length of the remainder to + the right shift count (rSHR). If the bit count is less than or equal + we do not need to load rWORD2 (all significant bits are already in +- rB). */ +- cmplw cr7,rN,rSHR ++ rWORD8_SHIFT). */ ++ cmplw cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- lwz rWORD2,4(rSTR2) +- srw rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 4 ++#else ++ lwz rWORD2, 4(rSTR2) ++#endif ++ srw r0, rWORD2, rSHR + .align 4 + L(dutrim): +- lwz rWORD1,4(rSTR1) +- lwz r31,48(1) +- subfic rN,rN,32 /* Shift count is 32 - (rN * 8). */ +- or rWORD2,rA,rB +- lwz r30,44(1) +- lwz r29,40(r1) +- srw rWORD1,rWORD1,rN +- srw rWORD2,rWORD2,rN +- lwz r28,36(r1) +- lwz r27,32(r1) +- cmplw rWORD1,rWORD2 +- li rRTN,0 +- beq L(dureturn26) +- li rRTN,1 +- bgt L(dureturn26) +- li rRTN,-1 ++#ifdef __LITTLE_ENDIAN__ ++ lwbrx rWORD1, 0, rSTR1 ++#else ++ lwz rWORD1, 4(rSTR1) ++#endif ++ lwz rWORD8, 48(r1) ++ subfic rN, rN, 32 /* Shift count is 32 - (rN * 8). */ ++ or rWORD2, r0, rWORD8_SHIFT ++ lwz rWORD7, 44(r1) ++ lwz rSHL, 40(r1) ++ srw rWORD1, rWORD1, rN ++ srw rWORD2, rWORD2, rN ++ lwz rSHR, 36(r1) ++ lwz rWORD8_SHIFT, 32(r1) ++ sub rRTN, rWORD1, rWORD2 + b L(dureturn26) + .align 4 +-L(duLcr0): +- lwz r31,48(1) +- lwz r30,44(1) +- li rRTN,1 +- bgt cr0,L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) +- li rRTN,-1 ++L(duLcr7): ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) ++ li rRTN, 1 ++ bgt cr7, L(dureturn29) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr1): +- lwz r31,48(1) +- lwz r30,44(1) +- li rRTN,1 +- bgt cr1,L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) +- li rRTN,-1 ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) ++ li rRTN, 1 ++ bgt cr1, L(dureturn29) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr6): +- lwz r31,48(1) +- lwz r30,44(1) +- li rRTN,1 +- bgt cr6,L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) +- li rRTN,-1 ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) ++ li rRTN, 1 ++ bgt cr6, L(dureturn29) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr5): +- lwz r31,48(1) +- lwz r30,44(1) +- li rRTN,1 +- bgt cr5,L(dureturn29) +- lwz r29,40(r1) +- lwz r28,36(r1) +- li rRTN,-1 ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) ++ li rRTN, 1 ++ bgt cr5, L(dureturn29) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 3 + L(duZeroReturn): +- li rRTN,0 ++ li rRTN, 0 + .align 4 + L(dureturn): +- lwz r31,48(1) +- lwz r30,44(1) ++ lwz rWORD8, 48(r1) ++ lwz rWORD7, 44(r1) + L(dureturn29): +- lwz r29,40(r1) +- lwz r28,36(r1) ++ lwz rSHL, 40(r1) ++ lwz rSHR, 36(r1) + L(dureturn27): +- lwz r27,32(r1) ++ lwz rWORD8_SHIFT, 32(r1) + L(dureturn26): +- lwz r26,28(r1) ++ lwz rWORD2_SHIFT, 28(r1) + L(dureturn25): +- lwz r25,24(r1) +- lwz r24,20(r1) +- lwz 1,0(1) ++ lwz rWORD4_SHIFT, 24(r1) ++ lwz rWORD6_SHIFT, 20(r1) ++ addi r1, r1, 64 ++ cfi_adjust_cfa_offset(-64) + blr + END (BP_SYM (memcmp)) ++ + libc_hidden_builtin_def (memcmp) + weak_alias (memcmp,bcmp) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcmp.S 2014-05-28 19:22:37.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcmp.S 2014-05-29 09:35:25.000000000 -0500 +@@ -1,5 +1,5 @@ +-/* Optimized strcmp implementation for PowerPC64. +- Copyright (C) 2003, 2006, 2011 Free Software Foundation, Inc. ++/* Optimized memcmp implementation for PowerPC64. ++ Copyright (C) 2003-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 +@@ -17,307 +17,492 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + +-/* int [r3] memcmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */ ++/* int [r3] memcmp (const char *s1 [r3], ++ const char *s2 [r4], ++ size_t size [r5]) */ + + .machine power4 +-EALIGN (BP_SYM(memcmp), 4, 0) ++EALIGN (memcmp, 4, 0) + CALL_MCOUNT 3 + +-#define rTMP r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ + #define rN r5 /* max string length */ +-/* 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. */ + #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 rBITDIF r12 /* bits that differ in s1 & s2 words */ + #define rWORD7 r30 /* next word in s1 */ + #define rWORD8 r31 /* next word in s2 */ + +- xor rTMP, rSTR2, rSTR1 ++ xor r0, rSTR2, rSTR1 + cmpldi cr6, rN, 0 + cmpldi cr1, rN, 12 +- clrldi. rTMP, rTMP, 61 +- clrldi rBITDIF, rSTR1, 61 +- cmpldi cr5, rBITDIF, 0 ++ clrldi. r0, r0, 61 ++ clrldi r12, rSTR1, 61 ++ cmpldi cr5, r12, 0 + beq- cr6, L(zeroLength) +- dcbt 0,rSTR1 +- dcbt 0,rSTR2 +-/* If less than 8 bytes or not aligned, use the unalligned ++ dcbt 0, rSTR1 ++ dcbt 0, rSTR2 ++/* 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, -8(r1) ++ cfi_offset(rWORD8, -8) ++ std rWORD7, -16(r1) ++ cfi_offset(rWORD7, -16) + bne L(unaligned) + /* At this point we know both strings have the same alignment and the +- compare length is at least 8 bytes. rBITDIF containes the low order ++ compare length is at least 8 bytes. r12 contains the low order + 3 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then we are already double word +- aligned and can perform the DWaligned loop. +- ++ of r12 to 0. If r12 == 0 then we are already double word ++ aligned and can perform the DW aligned loop. ++ + Otherwise we know the two strings have the same alignment (but not +- yet DW). So we can force the string addresses to the next lower DW +- boundary and special case this first DW word using shift left to +- ellimiate bits preceeding the first byte. Since we want to join the +- normal (DWaligned) compare loop, starting at the second double word, ++ yet DW). So we force the string addresses to the next lower DW ++ boundary and special case this first DW using shift left to ++ eliminate bits preceding the first byte. Since we want to join the ++ normal (DW aligned) compare loop, starting at the second double word, + we need to adjust the length (rN) and special case the loop +- versioning for the first DW. This insures that the loop count is +- correct and the first DW (shifted) is in the expected resister pair. */ +- .align 4 ++ versioning for the first DW. This ensures that the loop count is ++ correct and the first DW (shifted) is in the expected register pair. */ ++ .align 4 + L(samealignment): + clrrdi rSTR1, rSTR1, 3 + clrrdi rSTR2, rSTR2, 3 + beq cr5, L(DWaligned) +- add rN, rN, rBITDIF +- sldi r11, rBITDIF, 3 +- srdi rTMP, rN, 5 /* Divide by 32 */ +- andi. rBITDIF, rN, 24 /* Get the DW remainder */ ++ add rN, rN, r12 ++ 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) +- cmpldi cr1, rBITDIF, 16 ++#endif ++ cmpldi cr1, r12, 16 + cmpldi cr7, rN, 32 + clrldi rN, rN, 61 + beq L(dPs4) +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ + bgt cr1, L(dPs3) + beq cr1, L(dPs2) + + /* Remainder is 8 */ +- .align 3 ++ .align 3 + L(dsP1): +- sld rWORD5, rWORD1, r11 +- sld rWORD6, rWORD2, r11 ++ sld rWORD5, rWORD1, rWORD6 ++ sld rWORD6, rWORD2, rWORD6 + 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) +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ cmpld cr7, rWORD1, rWORD2 + b L(dP1e) + /* Remainder is 16 */ +- .align 4 ++ .align 4 + L(dPs2): +- sld rWORD5, rWORD1, r11 +- sld rWORD6, rWORD2, r11 ++ sld rWORD5, rWORD1, rWORD6 ++ sld rWORD6, rWORD2, rWORD6 + 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 + cmpld cr5, rWORD7, rWORD8 + b L(dP2e) + /* Remainder is 24 */ +- .align 4 ++ .align 4 + L(dPs3): +- sld rWORD3, rWORD1, r11 +- sld rWORD4, rWORD2, r11 ++ sld rWORD3, rWORD1, rWORD6 ++ sld rWORD4, rWORD2, rWORD6 + cmpld cr1, rWORD3, rWORD4 + b L(dP3e) + /* Count is a multiple of 32, remainder is 0 */ +- .align 4 ++ .align 4 + L(dPs4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- sld rWORD1, rWORD1, r11 +- sld rWORD2, rWORD2, r11 +- cmpld cr0, rWORD1, rWORD2 ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ sld rWORD1, rWORD1, rWORD6 ++ sld rWORD2, rWORD2, rWORD6 ++ cmpld cr7, rWORD1, rWORD2 + b L(dP4e) + + /* At this point we know both strings are double word aligned and the + compare length is at least 8 bytes. */ +- .align 4 ++ .align 4 + L(DWaligned): +- andi. rBITDIF, rN, 24 /* Get the DW remainder */ +- srdi rTMP, rN, 5 /* Divide by 32 */ +- cmpldi cr1, rBITDIF, 16 ++ andi. r12, rN, 24 /* Get the DW remainder */ ++ srdi r0, rN, 5 /* Divide by 32 */ ++ cmpldi cr1, r12, 16 + cmpldi cr7, rN, 32 + clrldi rN, rN, 61 + beq L(dP4) + bgt cr1, L(dP3) + beq cr1, L(dP2) +- ++ + /* Remainder is 8 */ +- .align 4 ++ .align 4 + L(dP1): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ + /* Normally we'd use rWORD7/rWORD8 here, but since we might exit early +- (8-15 byte compare), we want to use only volitile registers. This +- means we can avoid restoring non-volitile registers since we did not ++ (8-15 byte compare), we want to use only volatile registers. This ++ means we can avoid restoring non-volatile registers since we did not + 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 ++ 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 + 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) +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ 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 + 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 + cmpld cr6, rWORD5, rWORD6 +- bne cr5, L(dLcr5) +- bne cr0, L(dLcr0) +- ++ 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 + bne cr1, L(dLcr1) + cmpld cr5, rWORD7, rWORD8 + bdnz L(dLoop) + bne cr6, L(dLcr6) +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- .align 3 ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++ .align 3 + L(dP1x): + sldi. r12, rN, 3 +- bne cr5, L(dLcr5) ++ bne cr5, L(dLcr5x) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + bne L(d00) + li rRTN, 0 + blr +- ++ + /* Remainder is 16 */ +- .align 4 ++ .align 4 + L(dP2): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++#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 + 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 + 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) +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ 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 + 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 volitile registers and avoid restoring non-volitile ++ only use volatile registers and avoid restoring non-volatile + registers. */ +- .align 4 ++ .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) +- cmpld cr5, rWORD3, rWORD4 ++#endif ++ cmpld cr1, rWORD3, rWORD4 + sldi. r12, rN, 3 +- bne cr6, L(dLcr6) ++ bne cr6, L(dLcr6x) ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 8 + addi rSTR2, rSTR2, 8 +- bne cr5, L(dLcr5) ++#endif ++ bne cr1, L(dLcr1x) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + bne L(d00) + li rRTN, 0 + blr +- ++ + /* Remainder is 24 */ +- .align 4 ++ .align 4 + L(dP3): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++#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 + 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 + 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 + 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) +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ 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) + /* Again we are on a early exit path (24-31 byte compare), we want to +- only use volitile registers and avoid restoring non-volitile ++ only use volatile registers and avoid restoring non-volatile + registers. */ +- .align 4 ++ .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) +- cmpld cr5, rWORD1, rWORD2 ++#endif ++ cmpld cr7, rWORD1, rWORD2 + sldi. r12, rN, 3 +- bne cr1, L(dLcr1) ++ bne cr1, L(dLcr1x) ++#ifndef __LITTLE_ENDIAN__ + addi rSTR1, rSTR1, 16 + addi rSTR2, rSTR2, 16 +- bne cr6, L(dLcr6) ++#endif ++ bne cr6, L(dLcr6x) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ +- bne cr5, L(dLcr5) ++ bne cr7, L(dLcr7x) + bne L(d00) + li rRTN, 0 + blr +- ++ + /* Count is a multiple of 32, remainder is 0 */ +- .align 4 ++ .align 4 + L(dP4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++#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) +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ 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 + 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 + 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 + cmpld cr5, rWORD7, rWORD8 +- bne cr0, L(dLcr0) ++ bne cr7, L(dLcr7) + bne cr1, L(dLcr1) + bdz- L(d24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ +- .align 4 ++ .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 + 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 + 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 + cmpld cr5, rWORD7, rWORD8 +- bne cr0, L(dLcr0) ++ 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 + bne- cr1, L(dLcr1) +- cmpld cr0, rWORD1, rWORD2 +- bdnz+ L(dLoop) +- ++ cmpld cr7, rWORD1, rWORD2 ++ bdnz+ L(dLoop) ++ + L(dL4): + cmpld cr1, rWORD3, rWORD4 + bne cr6, L(dLcr6) +@@ -325,84 +510,98 @@ + bne cr5, L(dLcr5) + cmpld cr5, rWORD7, rWORD8 + L(d44): +- bne cr0, L(dLcr0) ++ bne cr7, L(dLcr7) + L(d34): + bne cr1, L(dLcr1) + L(d24): + bne cr6, L(dLcr6) + L(d14): + sldi. r12, rN, 3 +- bne cr5, L(dLcr5) ++ bne cr5, L(dLcr5) + L(d04): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + beq L(zeroLength) + /* 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 elliminate bits beyond the compare length. */ ++ 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) ++ ld rWORD2, 8(rSTR2) ++#endif + srd rWORD1, rWORD1, rN + srd rWORD2, rWORD2, rN +- cmpld cr5, rWORD1, rWORD2 +- bne cr5, L(dLcr5x) ++ cmpld cr7, rWORD1, rWORD2 ++ bne cr7, L(dLcr7x) + li rRTN, 0 + blr +- .align 4 +-L(dLcr0): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ++ .align 4 ++L(dLcr7): ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++L(dLcr7x): + li rRTN, 1 +- bgtlr cr0 ++ bgtlr cr7 + li rRTN, -1 + blr +- .align 4 ++ .align 4 + L(dLcr1): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++L(dLcr1x): + li rRTN, 1 + bgtlr cr1 + li rRTN, -1 + blr +- .align 4 ++ .align 4 + L(dLcr6): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++L(dLcr6x): + li rRTN, 1 + bgtlr cr6 + li rRTN, -1 + blr +- .align 4 ++ .align 4 + L(dLcr5): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + L(dLcr5x): + li rRTN, 1 + bgtlr cr5 + li rRTN, -1 + blr +- +- .align 4 ++ ++ .align 4 + L(bytealigned): +- mtctr rN /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr rN /* Power4 wants mtctr 1st in dispatch group */ ++#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 ++ to avoid pipe delays. The dependent instruction latencies (load to + compare to conditional branch) is 2 to 3 cycles. In this loop each + dispatch group ends in a branch and takes 1 cycle. Effectively +- the first iteration of the loop only serves to load operands and +- branches based on compares are delayed until the next loop. ++ the first iteration of the loop only serves to load operands and ++ branches based on compares are delayed until the next loop. + + So we must precondition some registers and condition codes so that + we don't exit the loop early on the first iteration. */ +- ++ + lbz rWORD1, 0(rSTR1) + lbz rWORD2, 0(rSTR2) + bdz- L(b11) +- cmpld cr0, rWORD1, rWORD2 ++ cmpld cr7, rWORD1, rWORD2 + lbz rWORD3, 1(rSTR1) + lbz rWORD4, 1(rSTR2) + bdz- L(b12) +@@ -410,20 +609,20 @@ + lbzu rWORD5, 2(rSTR1) + lbzu rWORD6, 2(rSTR2) + bdz- L(b13) +- .align 4 ++ .align 4 + L(bLoop): + lbzu rWORD1, 1(rSTR1) + lbzu rWORD2, 1(rSTR2) +- bne- cr0, L(bLcr0) ++ bne- cr7, L(bLcr7) + + cmpld cr6, rWORD5, rWORD6 + bdz- L(b3i) +- ++ + lbzu rWORD3, 1(rSTR1) + lbzu rWORD4, 1(rSTR2) + bne- cr1, L(bLcr1) + +- cmpld cr0, rWORD1, rWORD2 ++ cmpld cr7, rWORD1, rWORD2 + bdz- L(b2i) + + lbzu rWORD5, 1(rSTR1) +@@ -432,31 +631,31 @@ + + cmpld cr1, rWORD3, rWORD4 + bdnz+ L(bLoop) +- ++ + /* We speculatively loading bytes before we have tested the previous + bytes. But we must avoid overrunning the length (in the ctr) to +- prevent these speculative loads from causing a segfault. In this ++ prevent these speculative loads from causing a segfault. In this + case the loop will exit early (before the all pending bytes are + tested. In this case we must complete the pending operations + before returning. */ + L(b1i): +- bne- cr0, L(bLcr0) ++ bne- cr7, L(bLcr7) + bne- cr1, L(bLcr1) + b L(bx56) +- .align 4 ++ .align 4 + L(b2i): + bne- cr6, L(bLcr6) +- bne- cr0, L(bLcr0) ++ bne- cr7, L(bLcr7) + b L(bx34) +- .align 4 ++ .align 4 + L(b3i): + bne- cr1, L(bLcr1) + bne- cr6, L(bLcr6) + b L(bx12) +- .align 4 +-L(bLcr0): ++ .align 4 ++L(bLcr7): + li rRTN, 1 +- bgtlr cr0 ++ bgtlr cr7 + li rRTN, -1 + blr + L(bLcr1): +@@ -471,116 +670,121 @@ + blr + + L(b13): +- bne- cr0, L(bx12) ++ bne- cr7, L(bx12) + bne- cr1, L(bx34) + L(bx56): + sub rRTN, rWORD5, rWORD6 + blr + nop + L(b12): +- bne- cr0, L(bx12) +-L(bx34): ++ bne- cr7, L(bx12) ++L(bx34): + sub rRTN, rWORD3, rWORD4 + blr + L(b11): + L(bx12): + sub rRTN, rWORD1, rWORD2 + blr +- .align 4 +-L(zeroLengthReturn): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ .align 4 + L(zeroLength): + li rRTN, 0 + blr + +- .align 4 ++ .align 4 + /* At this point we know the strings have different alignment and the +- compare length is at least 8 bytes. rBITDIF containes the low order ++ compare length is at least 8 bytes. r12 contains the low order + 3 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then rStr1 is double word ++ of r12 to 0. If r12 == 0 then rStr1 is double word + aligned and can perform the DWunaligned loop. +- +- Otherwise we know that rSTR1 is not aready DW aligned yet. ++ ++ Otherwise we know that rSTR1 is not already DW aligned yet. + So we can force the string addresses to the next lower DW +- boundary and special case this first DW word using shift left to +- ellimiate bits preceeding the first byte. Since we want to join the ++ boundary and special case this first DW using shift left to ++ eliminate bits preceding the first byte. Since we want to join the + normal (DWaligned) compare loop, starting at the second double word, + we need to adjust the length (rN) and special case the loop +- versioning for the first DW. This insures that the loop count is ++ 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 rB r27 /* Left rotation temp for rWORD2. */ +-#define rD r26 /* Left rotation temp for rWORD4. */ +-#define rF r25 /* Left rotation temp for rWORD6. */ +-#define rH r24 /* Left rotation temp for rWORD8. */ +-#define rA r0 /* Right rotation temp for rWORD2. */ +-#define rC r12 /* Right rotation temp for rWORD4. */ +-#define rE r0 /* Right rotation temp for rWORD6. */ +-#define rG r12 /* Right rotation temp for rWORD8. */ ++#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 r29,-24(r1) +- cfi_offset(r29,-24) ++ std rSHL, -24(r1) ++ cfi_offset(rSHL, -24) + clrldi rSHL, rSTR2, 61 + beq- cr6, L(duzeroLength) +- std r28,-32(r1) +- cfi_offset(r28,-32) ++ std rSHR, -32(r1) ++ cfi_offset(rSHR, -32) + beq cr5, L(DWunaligned) +- std r27,-40(r1) +- cfi_offset(r27,-40) +-/* Adjust the logical start of rSTR2 ro compensate for the extra bits ++ std rWORD8_SHIFT, -40(r1) ++ cfi_offset(rWORD8_SHIFT, -40) ++/* Adjust the logical start of rSTR2 to compensate for the extra bits + in the 1st rSTR1 DW. */ +- sub r27, rSTR2, rBITDIF ++ 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 r26,-48(r1) +- cfi_offset(r26,-48) +-/* Compute the leaft/right shift counts for the unalign rSTR2, +- compensating for the logical (DW aligned) start of rSTR1. */ +- clrldi rSHL, r27, 61 +- clrrdi rSTR1, rSTR1, 3 +- std r25,-56(r1) +- cfi_offset(r25,-56) ++ std rWORD2_SHIFT, -48(r1) ++ cfi_offset(rWORD2_SHIFT, -48) ++/* 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) + sldi rSHL, rSHL, 3 +- cmpld cr5, r27, rSTR2 +- add rN, rN, rBITDIF +- sldi r11, rBITDIF, 3 +- std r24,-64(r1) +- cfi_offset(r24,-64) ++ cmpld cr5, rWORD8_SHIFT, rSTR2 ++ add rN, rN, r12 ++ sldi rWORD6, r12, 3 ++ std rWORD6_SHIFT, -64(r1) ++ cfi_offset(rWORD6_SHIFT, -64) + subfic rSHR, rSHL, 64 +- srdi rTMP, rN, 5 /* Divide by 32 */ +- andi. rBITDIF, rN, 24 /* Get the DW remainder */ ++ srdi r0, rN, 5 /* Divide by 32 */ ++ andi. r12, rN, 24 /* Get the DW remainder */ + /* We normally need to load 2 DWs to start the unaligned rSTR2, but in + this special case those bits may be discarded anyway. Also we + must avoid loading a DW where none of the bits are part of rSTR2 as + 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 ++ addi rSTR2, rSTR2, 8 ++#else + ld rWORD8, 0(rSTR2) +- la rSTR2, 8(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) +- cmpldi cr1, rBITDIF, 16 ++#endif ++ cmpldi cr1, r12, 16 + cmpldi cr7, rN, 32 +- srd rG, rWORD2, rSHR ++ srd r12, rWORD2, rSHR + clrldi rN, rN, 61 + beq L(duPs4) +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- or rWORD8, rG, rWORD8 ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ or rWORD8, r12, rWORD8 + bgt cr1, L(duPs3) + beq cr1, L(duPs2) + + /* Remainder is 8 */ +- .align 4 ++ .align 4 + L(dusP1): +- sld rB, rWORD2, rSHL +- sld rWORD7, rWORD1, r11 +- sld rWORD8, rWORD8, r11 ++ sld rWORD8_SHIFT, rWORD2, rSHL ++ sld rWORD7, rWORD1, rWORD6 ++ sld rWORD8, rWORD8, rWORD6 + bge cr7, L(duP1e) + /* At this point we exit early with the first double word compare + complete and remainder of 0 to 7 bytes. See L(du14) for details on +@@ -590,95 +794,133 @@ + bne cr5, L(duLcr5) + cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else + ld rWORD2, 8(rSTR2) +- srd rA, rWORD2, rSHR ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 16 */ +- .align 4 ++ .align 4 + L(duPs2): +- sld rH, rWORD2, rSHL +- sld rWORD5, rWORD1, r11 +- sld rWORD6, rWORD8, r11 ++ sld rWORD6_SHIFT, rWORD2, rSHL ++ sld rWORD5, rWORD1, rWORD6 ++ sld rWORD6, rWORD8, rWORD6 + b L(duP2e) + /* Remainder is 24 */ +- .align 4 ++ .align 4 + L(duPs3): +- sld rF, rWORD2, rSHL +- sld rWORD3, rWORD1, r11 +- sld rWORD4, rWORD8, r11 ++ sld rWORD4_SHIFT, rWORD2, rSHL ++ sld rWORD3, rWORD1, rWORD6 ++ sld rWORD4, rWORD8, rWORD6 + b L(duP3e) + /* Count is a multiple of 32, remainder is 0 */ +- .align 4 ++ .align 4 + L(duPs4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- or rWORD8, rG, rWORD8 +- sld rD, rWORD2, rSHL +- sld rWORD1, rWORD1, r11 +- sld rWORD2, rWORD8, r11 ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ or rWORD8, r12, rWORD8 ++ sld rWORD2_SHIFT, rWORD2, rSHL ++ sld rWORD1, rWORD1, rWORD6 ++ sld rWORD2, rWORD8, rWORD6 + b L(duP4e) + + /* At this point we know rSTR1 is double word aligned and the + compare length is at least 8 bytes. */ +- .align 4 ++ .align 4 + L(DWunaligned): +- std r27,-40(r1) +- cfi_offset(r27,-40) ++ std rWORD8_SHIFT, -40(r1) ++ cfi_offset(rWORD8_SHIFT, -40) + clrrdi rSTR2, rSTR2, 3 +- std r26,-48(r1) +- cfi_offset(r26,-48) +- srdi rTMP, rN, 5 /* Divide by 32 */ +- std r25,-56(r1) +- cfi_offset(r25,-56) +- andi. rBITDIF, rN, 24 /* Get the DW remainder */ +- std r24,-64(r1) +- cfi_offset(r24,-64) ++ std rWORD2_SHIFT, -48(r1) ++ cfi_offset(rWORD2_SHIFT, -48) ++ srdi r0, rN, 5 /* Divide by 32 */ ++ std rWORD4_SHIFT, -56(r1) ++ cfi_offset(rWORD4_SHIFT, -56) ++ andi. r12, rN, 24 /* Get the DW remainder */ ++ std rWORD6_SHIFT, -64(r1) ++ cfi_offset(rWORD6_SHIFT, -64) + sldi rSHL, rSHL, 3 ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD6, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++ ldbrx rWORD8, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else + ld rWORD6, 0(rSTR2) + ldu rWORD8, 8(rSTR2) +- cmpldi cr1, rBITDIF, 16 ++#endif ++ cmpldi cr1, r12, 16 + cmpldi cr7, rN, 32 + clrldi rN, rN, 61 + subfic rSHR, rSHL, 64 +- sld rH, rWORD6, rSHL ++ sld rWORD6_SHIFT, rWORD6, rSHL + beq L(duP4) +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ + bgt cr1, L(duP3) + beq cr1, L(duP2) +- ++ + /* Remainder is 8 */ +- .align 4 ++ .align 4 + L(duP1): +- srd rG, rWORD8, rSHR ++ srd r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD7, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else + ld rWORD7, 0(rSTR1) +- sld rB, rWORD8, rSHL +- or rWORD8, rG, rH ++#endif ++ 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 + cmpld cr5, rWORD7, rWORD8 +- srd rA, rWORD2, rSHR +- sld rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ 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) +- cmpld cr0, rWORD1, rWORD2 +- srd rC, rWORD4, rSHR +- sld rF, rWORD4, rSHL ++#endif ++ cmpld cr7, rWORD1, rWORD2 ++ srd r12, rWORD4, rSHR ++ sld rWORD4_SHIFT, rWORD4, rSHL + bne cr5, L(duLcr5) +- or rWORD4, rC, rD ++ 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 + cmpld cr1, rWORD3, rWORD4 +- srd rE, rWORD6, rSHR +- sld rH, rWORD6, rSHL +- bne cr0, L(duLcr0) +- or rWORD6, rE, rF ++ srd r0, rWORD6, rSHR ++ sld rWORD6_SHIFT, rWORD6, rSHL ++ bne cr7, L(duLcr7) ++ or rWORD6, r0, rWORD4_SHIFT + cmpld cr6, rWORD5, rWORD6 +- b L(duLoop3) +- .align 4 ++ b L(duLoop3) ++ .align 4 + /* At this point we exit early with the first double word compare + complete and remainder of 0 to 7 bytes. See L(du14) for details on + how we handle the remaining bytes. */ +@@ -688,186 +930,321 @@ + bne cr5, L(duLcr5) + cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else + ld rWORD2, 8(rSTR2) +- srd rA, rWORD2, rSHR ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 16 */ +- .align 4 ++ .align 4 + L(duP2): +- srd rE, rWORD8, rSHR ++ srd r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD5, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else + ld rWORD5, 0(rSTR1) +- or rWORD6, rE, rH +- sld rH, rWORD8, rSHL ++#endif ++ 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 + cmpld cr6, rWORD5, rWORD6 +- srd rG, rWORD8, rSHR +- sld rB, rWORD8, rSHL +- or rWORD8, rG, rH ++ 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 + cmpld cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) +- srd rA, rWORD2, rSHR +- sld rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ 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) +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ cmpld cr7, rWORD1, rWORD2 + bne cr5, L(duLcr5) +- srd rC, rWORD4, rSHR +- sld rF, rWORD4, rSHL +- or rWORD4, rC, rD ++ 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 ++ .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) + cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else + ld rWORD2, 8(rSTR2) +- srd rA, rWORD2, rSHR ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) +- ++ + /* Remainder is 24 */ +- .align 4 ++ .align 4 + L(duP3): +- srd rC, rWORD8, rSHR ++ srd r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD3, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else + ld rWORD3, 0(rSTR1) +- sld rF, rWORD8, rSHL +- or rWORD4, rC, rH ++#endif ++ 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 + cmpld cr1, rWORD3, rWORD4 +- srd rE, rWORD6, rSHR +- sld rH, rWORD6, rSHL +- or rWORD6, rE, rF ++ 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 + cmpld cr6, rWORD5, rWORD6 + bne cr1, L(duLcr1) +- srd rG, rWORD8, rSHR +- sld rB, rWORD8, rSHL +- or rWORD8, rG, rH ++ 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 + cmpld cr5, rWORD7, rWORD8 + bne cr6, L(duLcr6) +- srd rA, rWORD2, rSHR +- sld rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ 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 +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ cmpld cr7, rWORD1, rWORD2 + b L(duLoop1) +- .align 4 ++ .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 + bne cr5, L(duLcr5) + cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else + ld rWORD2, 8(rSTR2) +- srd rA, rWORD2, rSHR ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) +- ++ + /* Count is a multiple of 32, remainder is 0 */ +- .align 4 ++ .align 4 + L(duP4): +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group */ +- srd rA, rWORD8, rSHR ++ mtctr r0 /* Power4 wants mtctr 1st in dispatch group */ ++ srd r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD1, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else + ld rWORD1, 0(rSTR1) +- sld rD, rWORD8, rSHL +- or rWORD2, rA, rH ++#endif ++ 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) +- cmpld cr0, rWORD1, rWORD2 +- srd rC, rWORD4, rSHR +- sld rF, rWORD4, rSHL +- or rWORD4, rC, rD ++#endif ++ 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 + cmpld cr1, rWORD3, rWORD4 +- bne cr0, L(duLcr0) +- srd rE, rWORD6, rSHR +- sld rH, rWORD6, rSHL +- or rWORD6, rE, rF ++ 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 + cmpld cr6, rWORD5, rWORD6 + bne cr1, L(duLcr1) +- srd rG, rWORD8, rSHR +- sld rB, rWORD8, rSHL +- or rWORD8, rG, rH ++ srd r12, rWORD8, rSHR ++ sld rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + cmpld cr5, rWORD7, rWORD8 + bdz- L(du24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ +- .align 4 ++ .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 + cmpld cr1, rWORD3, rWORD4 + bne cr6, L(duLcr6) +- srd rA, rWORD2, rSHR +- sld rD, rWORD2, rSHL +- or rWORD2, rA, rB ++ 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 + cmpld cr6, rWORD5, rWORD6 + bne cr5, L(duLcr5) +- srd rC, rWORD4, rSHR +- sld rF, rWORD4, rSHL +- or rWORD4, rC, rD ++ 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 + cmpld cr5, rWORD7, rWORD8 +- bne cr0, L(duLcr0) +- srd rE, rWORD6, rSHR +- sld rH, rWORD6, rSHL +- or rWORD6, rE, rF ++ 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) +- cmpld cr0, rWORD1, rWORD2 ++#endif ++ cmpld cr7, rWORD1, rWORD2 + bne- cr1, L(duLcr1) +- srd rG, rWORD8, rSHR +- sld rB, rWORD8, rSHL +- or rWORD8, rG, rH +- bdnz+ L(duLoop) +- ++ srd r12, rWORD8, rSHR ++ sld rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT ++ 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 + bne cr5, L(duLcr5) + cmpld cr5, rWORD7, rWORD8 + L(du44): +- bne cr0, L(duLcr0) ++ bne cr7, L(duLcr7) + L(du34): + bne cr1, L(duLcr1) + L(du24): +@@ -876,106 +1253,113 @@ + sldi. rN, rN, 3 + bne cr5, L(duLcr5) + /* At this point we have a remainder of 1 to 7 bytes to compare. We use +- shift right double to elliminate bits beyond the compare length. +- This allows the use of double word subtract to compute the final +- result. ++ shift right double to eliminate bits beyond the compare length. + +- However it may not be safe to load rWORD2 which may be beyond the ++ However it may not be safe to load rWORD2 which may be beyond the + string length. So we compare the bit length of the remainder to + the right shift count (rSHR). If the bit count is less than or equal + we do not need to load rWORD2 (all significant bits are already in +- rB). */ ++ rWORD8_SHIFT). */ + cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA, 0 ++ li r0, 0 + ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else + ld rWORD2, 8(rSTR2) +- srd rA, rWORD2, rSHR +- .align 4 ++#endif ++ srd r0, rWORD2, rSHR ++ .align 4 + L(dutrim): ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD1, 0, rSTR1 ++#else + ld rWORD1, 8(rSTR1) +- ld rWORD8,-8(r1) +- subfic rN, rN, 64 /* Shift count is 64 - (rN * 8). */ +- or rWORD2, rA, rB +- ld rWORD7,-16(r1) +- ld r29,-24(r1) ++#endif ++ 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) + srd rWORD1, rWORD1, rN + srd rWORD2, rWORD2, rN +- ld r28,-32(r1) +- ld r27,-40(r1) ++ ld rSHR, -32(r1) ++ ld rWORD8_SHIFT, -40(r1) + li rRTN, 0 +- cmpld cr0, rWORD1, rWORD2 +- ld r26,-48(r1) +- ld r25,-56(r1) +- beq cr0, L(dureturn24) +- li rRTN, 1 +- ld r24,-64(r1) +- bgtlr cr0 +- li rRTN, -1 +- blr +- .align 4 +-L(duLcr0): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN, 1 +- bgt cr0, L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) ++ cmpld cr7, rWORD1, rWORD2 ++ ld rWORD2_SHIFT, -48(r1) ++ ld rWORD4_SHIFT, -56(r1) ++ beq cr7, L(dureturn24) ++ li rRTN, 1 ++ ld rWORD6_SHIFT, -64(r1) ++ bgtlr cr7 ++ li rRTN, -1 ++ blr ++ .align 4 ++L(duLcr7): ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++ li rRTN, 1 ++ bgt cr7, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) + li rRTN, -1 + b L(dureturn27) +- .align 4 ++ .align 4 + L(duLcr1): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + li rRTN, 1 +- bgt cr1, L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) ++ bgt cr1, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) + li rRTN, -1 + b L(dureturn27) +- .align 4 ++ .align 4 + L(duLcr6): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + li rRTN, 1 +- bgt cr6, L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) ++ bgt cr6, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) + li rRTN, -1 + b L(dureturn27) +- .align 4 ++ .align 4 + L(duLcr5): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + li rRTN, 1 +- bgt cr5, L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) ++ bgt cr5, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) + li rRTN, -1 + b L(dureturn27) + .align 3 + L(duZeroReturn): +- li rRTN,0 ++ li rRTN, 0 + .align 4 + L(dureturn): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +-L(dureturn29): +- ld r29,-24(r1) +- ld r28,-32(r1) +-L(dureturn27): +- ld r27,-40(r1) +-L(dureturn26): +- ld r26,-48(r1) +-L(dureturn25): +- ld r25,-56(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++L(dureturn29): ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) ++L(dureturn27): ++ ld rWORD8_SHIFT, -40(r1) ++L(dureturn26): ++ ld rWORD2_SHIFT, -48(r1) ++L(dureturn25): ++ ld rWORD4_SHIFT, -56(r1) + L(dureturn24): +- ld r24,-64(r1) ++ ld rWORD6_SHIFT, -64(r1) + blr + L(duzeroLength): +- li rRTN,0 ++ li rRTN, 0 + blr + +-END (BP_SYM (memcmp)) ++END (memcmp) + libc_hidden_builtin_def (memcmp) + weak_alias (memcmp, bcmp) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcmp.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcmp.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcmp.S 2014-05-28 19:22:37.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcmp.S 2014-05-29 09:35:08.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memcmp implementation for POWER7/PowerPC64. +- Copyright (C) 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 2010-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 +@@ -17,379 +17,576 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + /* int [r3] memcmp (const char *s1 [r3], + const char *s2 [r4], + size_t size [r5]) */ + + .machine power7 +-EALIGN (BP_SYM(memcmp),4,0) ++EALIGN (memcmp, 4, 0) + CALL_MCOUNT 3 + +-#define rTMP r0 + #define rRTN r3 + #define rSTR1 r3 /* first string arg */ + #define rSTR2 r4 /* second string arg */ + #define rN r5 /* max string length */ +-/* 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. */ + #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 rBITDIF r12 /* bits that differ in s1 & s2 words */ + #define rWORD7 r30 /* next word in s1 */ + #define rWORD8 r31 /* next word in s2 */ + +- xor rTMP,rSTR2,rSTR1 +- cmpldi cr6,rN,0 +- cmpldi cr1,rN,12 +- clrldi. rTMP,rTMP,61 +- clrldi rBITDIF,rSTR1,61 +- cmpldi cr5,rBITDIF,0 +- beq- cr6,L(zeroLength) +- dcbt 0,rSTR1 +- dcbt 0,rSTR2 +-/* If less than 8 bytes or not aligned, use the unalligned ++ xor r0, rSTR2, rSTR1 ++ cmpldi cr6, rN, 0 ++ cmpldi cr1, rN, 12 ++ clrldi. r0, r0, 61 ++ clrldi r12, rSTR1, 61 ++ cmpldi cr5, r12, 0 ++ beq- cr6, L(zeroLength) ++ dcbt 0, rSTR1 ++ dcbt 0, rSTR2 ++/* 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) ++ blt cr1, L(bytealigned) ++ std rWORD8, -8(r1) ++ cfi_offset(rWORD8, -8) ++ std rWORD7, -16(r1) ++ cfi_offset(rWORD7, -16) + bne L(unaligned) + /* At this point we know both strings have the same alignment and the +- compare length is at least 8 bytes. rBITDIF containes the low order ++ compare length is at least 8 bytes. r12 contains the low order + 3 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then we are already double word +- aligned and can perform the DWaligned loop. ++ of r12 to 0. If r12 == 0 then we are already double word ++ aligned and can perform the DW aligned loop. + + Otherwise we know the two strings have the same alignment (but not +- yet DW). So we can force the string addresses to the next lower DW +- boundary and special case this first DW word using shift left to +- ellimiate bits preceeding the first byte. Since we want to join the +- normal (DWaligned) compare loop, starting at the second double word, ++ yet DW). So we force the string addresses to the next lower DW ++ boundary and special case this first DW using shift left to ++ eliminate bits preceding the first byte. Since we want to join the ++ normal (DW aligned) compare loop, starting at the second double word, + we need to adjust the length (rN) and special case the loop +- versioning for the first DW. This insures that the loop count is +- correct and the first DW (shifted) is in the expected resister pair. */ ++ versioning for the first DW. This ensures that the loop count is ++ correct and the first DW (shifted) is in the expected register pair. */ + .align 4 + L(samealignment): +- clrrdi rSTR1,rSTR1,3 +- clrrdi rSTR2,rSTR2,3 +- beq cr5,L(DWaligned) +- add rN,rN,rBITDIF +- sldi r11,rBITDIF,3 +- srdi rTMP,rN,5 /* Divide by 32 */ +- andi. rBITDIF,rN,24 /* Get the DW remainder */ +- ld rWORD1,0(rSTR1) +- ld rWORD2,0(rSTR2) +- cmpldi cr1,rBITDIF,16 +- cmpldi cr7,rN,32 +- clrldi rN,rN,61 ++ clrrdi rSTR1, rSTR1, 3 ++ clrrdi rSTR2, rSTR2, 3 ++ beq cr5, L(DWaligned) ++ add rN, rN, r12 ++ 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 ++ cmpldi cr1, r12, 16 ++ cmpldi cr7, rN, 32 ++ clrldi rN, rN, 61 + beq L(dPs4) +- mtctr rTMP +- bgt cr1,L(dPs3) +- beq cr1,L(dPs2) ++ mtctr r0 ++ bgt cr1, L(dPs3) ++ beq cr1, L(dPs2) + + /* Remainder is 8 */ + .align 3 + L(dsP1): +- sld rWORD5,rWORD1,r11 +- sld rWORD6,rWORD2,r11 +- cmpld cr5,rWORD5,rWORD6 +- blt cr7,L(dP1x) ++ sld rWORD5, rWORD1, rWORD6 ++ sld rWORD6, rWORD2, rWORD6 ++ cmpld cr5, rWORD5, rWORD6 ++ blt cr7, L(dP1x) + /* Do something useful in this cycle since we have to branch anyway. */ +- ld rWORD1,8(rSTR1) +- ld rWORD2,8(rSTR2) +- cmpld cr0,rWORD1,rWORD2 ++#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 ++ cmpld cr7, rWORD1, rWORD2 + b L(dP1e) + /* Remainder is 16 */ + .align 4 + L(dPs2): +- sld rWORD5,rWORD1,r11 +- sld rWORD6,rWORD2,r11 +- cmpld cr6,rWORD5,rWORD6 +- blt cr7,L(dP2x) ++ sld rWORD5, rWORD1, rWORD6 ++ sld rWORD6, rWORD2, rWORD6 ++ cmpld cr6, rWORD5, rWORD6 ++ blt cr7, L(dP2x) + /* Do something useful in this cycle since we have to branch anyway. */ +- ld rWORD7,8(rSTR1) +- ld rWORD8,8(rSTR2) +- cmpld cr5,rWORD7,rWORD8 ++#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 ++ cmpld cr5, rWORD7, rWORD8 + b L(dP2e) + /* Remainder is 24 */ + .align 4 + L(dPs3): +- sld rWORD3,rWORD1,r11 +- sld rWORD4,rWORD2,r11 +- cmpld cr1,rWORD3,rWORD4 ++ sld rWORD3, rWORD1, rWORD6 ++ sld rWORD4, rWORD2, rWORD6 ++ cmpld cr1, rWORD3, rWORD4 + b L(dP3e) + /* Count is a multiple of 32, remainder is 0 */ + .align 4 + L(dPs4): +- mtctr rTMP +- sld rWORD1,rWORD1,r11 +- sld rWORD2,rWORD2,r11 +- cmpld cr0,rWORD1,rWORD2 ++ mtctr r0 ++ sld rWORD1, rWORD1, rWORD6 ++ sld rWORD2, rWORD2, rWORD6 ++ cmpld cr7, rWORD1, rWORD2 + b L(dP4e) + + /* At this point we know both strings are double word aligned and the + compare length is at least 8 bytes. */ + .align 4 + L(DWaligned): +- andi. rBITDIF,rN,24 /* Get the DW remainder */ +- srdi rTMP,rN,5 /* Divide by 32 */ +- cmpldi cr1,rBITDIF,16 +- cmpldi cr7,rN,32 +- clrldi rN,rN,61 ++ andi. r12, rN, 24 /* Get the DW remainder */ ++ srdi r0, rN, 5 /* Divide by 32 */ ++ cmpldi cr1, r12, 16 ++ cmpldi cr7, rN, 32 ++ clrldi rN, rN, 61 + beq L(dP4) +- bgt cr1,L(dP3) +- beq cr1,L(dP2) ++ bgt cr1, L(dP3) ++ beq cr1, L(dP2) + + /* Remainder is 8 */ + .align 4 + L(dP1): +- mtctr rTMP ++ mtctr r0 + /* Normally we'd use rWORD7/rWORD8 here, but since we might exit early +- (8-15 byte compare), we want to use only volitile registers. This +- means we can avoid restoring non-volitile registers since we did not ++ (8-15 byte compare), we want to use only volatile registers. This ++ means we can avoid restoring non-volatile registers since we did not + 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. */ +- ld rWORD5,0(rSTR1) +- ld rWORD6,0(rSTR2) +- cmpld cr5,rWORD5,rWORD6 +- blt cr7,L(dP1x) +- ld rWORD1,8(rSTR1) +- ld rWORD2,8(rSTR2) +- cmpld cr0,rWORD1,rWORD2 ++#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 ++ 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 ++ cmpld cr7, rWORD1, rWORD2 + L(dP1e): +- ld rWORD3,16(rSTR1) +- ld rWORD4,16(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- ld rWORD5,24(rSTR1) +- ld rWORD6,24(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- bne cr5,L(dLcr5) +- bne cr0,L(dLcr0) +- +- ldu rWORD7,32(rSTR1) +- ldu rWORD8,32(rSTR2) +- bne cr1,L(dLcr1) +- cmpld cr5,rWORD7,rWORD8 ++#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 ++ 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 ++ 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 ++ bne cr1, L(dLcr1) ++ cmpld cr5, rWORD7, rWORD8 + bdnz L(dLoop) +- bne cr6,L(dLcr6) +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ bne cr6, L(dLcr6) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + .align 3 + L(dP1x): +- sldi. r12,rN,3 +- bne cr5,L(dLcr5) +- subfic rN,r12,64 /* Shift count is 64 - (rN * 8). */ ++ sldi. r12, rN, 3 ++ bne cr5, L(dLcr5x) ++ subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + bne L(d00) +- li rRTN,0 ++ li rRTN, 0 + blr + + /* Remainder is 16 */ + .align 4 + L(dP2): +- mtctr rTMP +- ld rWORD5,0(rSTR1) +- ld rWORD6,0(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- blt cr7,L(dP2x) +- ld rWORD7,8(rSTR1) +- ld rWORD8,8(rSTR2) +- cmpld cr5,rWORD7,rWORD8 ++ 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 ++ 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 ++ cmpld cr5, rWORD7, rWORD8 + L(dP2e): +- ld rWORD1,16(rSTR1) +- ld rWORD2,16(rSTR2) +- cmpld cr0,rWORD1,rWORD2 +- ld rWORD3,24(rSTR1) +- ld rWORD4,24(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- bne cr6,L(dLcr6) +- bne cr5,L(dLcr5) ++#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 ++ 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 ++ 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 volitile registers and avoid restoring non-volitile ++ only use volatile registers and avoid restoring non-volatile + registers. */ + .align 4 + L(dP2x): +- ld rWORD3,8(rSTR1) +- ld rWORD4,8(rSTR2) +- cmpld cr5,rWORD3,rWORD4 +- sldi. r12,rN,3 +- bne cr6,L(dLcr6) +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- bne cr5,L(dLcr5) +- subfic rN,r12,64 /* Shift count is 64 - (rN * 8). */ ++#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 ++ 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) +- li rRTN,0 ++ li rRTN, 0 + blr + + /* Remainder is 24 */ + .align 4 + L(dP3): +- mtctr rTMP +- ld rWORD3,0(rSTR1) +- ld rWORD4,0(rSTR2) +- cmpld cr1,rWORD3,rWORD4 ++ 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 ++ cmpld cr1, rWORD3, rWORD4 + L(dP3e): +- ld rWORD5,8(rSTR1) +- ld rWORD6,8(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- blt cr7,L(dP3x) +- ld rWORD7,16(rSTR1) +- ld rWORD8,16(rSTR2) +- cmpld cr5,rWORD7,rWORD8 +- ld rWORD1,24(rSTR1) +- ld rWORD2,24(rSTR2) +- cmpld cr0,rWORD1,rWORD2 +- addi rSTR1,rSTR1,16 +- addi rSTR2,rSTR2,16 +- bne cr1,L(dLcr1) +- bne cr6,L(dLcr6) ++#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 ++ 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 ++ 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 ++ 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) + /* Again we are on a early exit path (24-31 byte compare), we want to +- only use volitile registers and avoid restoring non-volitile ++ only use volatile registers and avoid restoring non-volatile + registers. */ + .align 4 + L(dP3x): +- ld rWORD1,16(rSTR1) +- ld rWORD2,16(rSTR2) +- cmpld cr5,rWORD1,rWORD2 +- sldi. r12,rN,3 +- bne cr1,L(dLcr1) +- addi rSTR1,rSTR1,16 +- addi rSTR2,rSTR2,16 +- bne cr6,L(dLcr6) +- subfic rN,r12,64 /* Shift count is 64 - (rN * 8). */ +- bne cr5,L(dLcr5) ++#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 ++ 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) +- li rRTN,0 ++ li rRTN, 0 + blr + + /* Count is a multiple of 32, remainder is 0 */ + .align 4 + L(dP4): +- mtctr rTMP +- ld rWORD1,0(rSTR1) +- ld rWORD2,0(rSTR2) +- cmpld cr0,rWORD1,rWORD2 ++ 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 ++ cmpld cr7, rWORD1, rWORD2 + L(dP4e): +- ld rWORD3,8(rSTR1) +- ld rWORD4,8(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- ld rWORD5,16(rSTR1) +- ld rWORD6,16(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- ldu rWORD7,24(rSTR1) +- ldu rWORD8,24(rSTR2) +- cmpld cr5,rWORD7,rWORD8 +- bne cr0,L(dLcr0) +- bne cr1,L(dLcr1) ++#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 ++ 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 ++ 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 ++ cmpld cr5, rWORD7, rWORD8 ++ bne cr7, L(dLcr7) ++ bne cr1, L(dLcr1) + bdz- L(d24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ + .align 4 + L(dLoop): +- ld rWORD1,8(rSTR1) +- ld rWORD2,8(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- bne cr6,L(dLcr6) ++#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 ++ cmpld cr1, rWORD3, rWORD4 ++ bne cr6, L(dLcr6) + L(dLoop1): +- ld rWORD3,16(rSTR1) +- ld rWORD4,16(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- bne cr5,L(dLcr5) ++#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 ++ cmpld cr6, rWORD5, rWORD6 ++ bne cr5, L(dLcr5) + L(dLoop2): +- ld rWORD5,24(rSTR1) +- ld rWORD6,24(rSTR2) +- cmpld cr5,rWORD7,rWORD8 +- bne cr0,L(dLcr0) ++#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 ++ cmpld cr5, rWORD7, rWORD8 ++ bne cr7, L(dLcr7) + L(dLoop3): +- ldu rWORD7,32(rSTR1) +- ldu rWORD8,32(rSTR2) +- bne cr1,L(dLcr1) +- cmpld cr0,rWORD1,rWORD2 ++#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 ++ bne cr1, L(dLcr1) ++ cmpld cr7, rWORD1, rWORD2 + bdnz L(dLoop) + + L(dL4): +- cmpld cr1,rWORD3,rWORD4 +- bne cr6,L(dLcr6) +- cmpld cr6,rWORD5,rWORD6 +- bne cr5,L(dLcr5) +- cmpld cr5,rWORD7,rWORD8 ++ cmpld cr1, rWORD3, rWORD4 ++ bne cr6, L(dLcr6) ++ cmpld cr6, rWORD5, rWORD6 ++ bne cr5, L(dLcr5) ++ cmpld cr5, rWORD7, rWORD8 + L(d44): +- bne cr0,L(dLcr0) ++ bne cr7, L(dLcr7) + L(d34): +- bne cr1,L(dLcr1) ++ bne cr1, L(dLcr1) + L(d24): +- bne cr6,L(dLcr6) ++ bne cr6, L(dLcr6) + L(d14): +- sldi. r12,rN,3 +- bne cr5,L(dLcr5) ++ sldi. r12, rN, 3 ++ bne cr5, L(dLcr5) + L(d04): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- subfic rN,r12,64 /* Shift count is 64 - (rN * 8). */ ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++ subfic rN, r12, 64 /* Shift count is 64 - (rN * 8). */ + beq L(zeroLength) + /* 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 elliminate bits beyond the compare length. */ ++ shift right double to eliminate bits beyond the compare length. */ + L(d00): +- ld rWORD1,8(rSTR1) +- ld rWORD2,8(rSTR2) +- srd rWORD1,rWORD1,rN +- srd rWORD2,rWORD2,rN +- cmpld cr5,rWORD1,rWORD2 +- bne cr5,L(dLcr5x) +- li rRTN,0 ++#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 ++ srd rWORD1, rWORD1, rN ++ srd rWORD2, rWORD2, rN ++ cmpld cr7, rWORD1, rWORD2 ++ bne cr7, L(dLcr7x) ++ li rRTN, 0 + blr ++ + .align 4 +-L(dLcr0): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN,1 +- bgtlr cr0 +- li rRTN,-1 ++L(dLcr7): ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++L(dLcr7x): ++ li rRTN, 1 ++ bgtlr cr7 ++ li rRTN, -1 + blr + .align 4 + L(dLcr1): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN,1 ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++L(dLcr1x): ++ li rRTN, 1 + bgtlr cr1 +- li rRTN,-1 ++ li rRTN, -1 + blr + .align 4 + L(dLcr6): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN,1 ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++L(dLcr6x): ++ li rRTN, 1 + bgtlr cr6 +- li rRTN,-1 ++ li rRTN, -1 + blr + .align 4 + L(dLcr5): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + L(dLcr5x): +- li rRTN,1 ++ li rRTN, 1 + bgtlr cr5 +- li rRTN,-1 ++ li rRTN, -1 + blr + + .align 4 + L(bytealigned): + mtctr rN +- beq cr6,L(zeroLength) ++#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 +@@ -401,38 +598,38 @@ + So we must precondition some registers and condition codes so that + we don't exit the loop early on the first iteration. */ + +- lbz rWORD1,0(rSTR1) +- lbz rWORD2,0(rSTR2) ++ lbz rWORD1, 0(rSTR1) ++ lbz rWORD2, 0(rSTR2) + bdz L(b11) +- cmpld cr0,rWORD1,rWORD2 +- lbz rWORD3,1(rSTR1) +- lbz rWORD4,1(rSTR2) ++ cmpld cr7, rWORD1, rWORD2 ++ lbz rWORD3, 1(rSTR1) ++ lbz rWORD4, 1(rSTR2) + bdz L(b12) +- cmpld cr1,rWORD3,rWORD4 +- lbzu rWORD5,2(rSTR1) +- lbzu rWORD6,2(rSTR2) ++ cmpld cr1, rWORD3, rWORD4 ++ lbzu rWORD5, 2(rSTR1) ++ lbzu rWORD6, 2(rSTR2) + bdz L(b13) + .align 4 + L(bLoop): +- lbzu rWORD1,1(rSTR1) +- lbzu rWORD2,1(rSTR2) +- bne cr0,L(bLcr0) ++ lbzu rWORD1, 1(rSTR1) ++ lbzu rWORD2, 1(rSTR2) ++ bne cr7, L(bLcr7) + +- cmpld cr6,rWORD5,rWORD6 ++ cmpld cr6, rWORD5, rWORD6 + bdz L(b3i) + +- lbzu rWORD3,1(rSTR1) +- lbzu rWORD4,1(rSTR2) +- bne cr1,L(bLcr1) ++ lbzu rWORD3, 1(rSTR1) ++ lbzu rWORD4, 1(rSTR2) ++ bne cr1, L(bLcr1) + +- cmpld cr0,rWORD1,rWORD2 ++ cmpld cr7, rWORD1, rWORD2 + bdz L(b2i) + +- lbzu rWORD5,1(rSTR1) +- lbzu rWORD6,1(rSTR2) +- bne cr6,L(bLcr6) ++ lbzu rWORD5, 1(rSTR1) ++ lbzu rWORD6, 1(rSTR2) ++ bne cr6, L(bLcr6) + +- cmpld cr1,rWORD3,rWORD4 ++ cmpld cr1, rWORD3, rWORD4 + bdnz L(bLoop) + + /* We speculatively loading bytes before we have tested the previous +@@ -442,542 +639,727 @@ + tested. In this case we must complete the pending operations + before returning. */ + L(b1i): +- bne cr0,L(bLcr0) +- bne cr1,L(bLcr1) ++ bne cr7, L(bLcr7) ++ bne cr1, L(bLcr1) + b L(bx56) + .align 4 + L(b2i): +- bne cr6,L(bLcr6) +- bne cr0,L(bLcr0) ++ bne cr6, L(bLcr6) ++ bne cr7, L(bLcr7) + b L(bx34) + .align 4 + L(b3i): +- bne cr1,L(bLcr1) +- bne cr6,L(bLcr6) ++ bne cr1, L(bLcr1) ++ bne cr6, L(bLcr6) + b L(bx12) + .align 4 +-L(bLcr0): +- li rRTN,1 +- bgtlr cr0 +- li rRTN,-1 ++L(bLcr7): ++ li rRTN, 1 ++ bgtlr cr7 ++ li rRTN, -1 + blr + L(bLcr1): +- li rRTN,1 ++ li rRTN, 1 + bgtlr cr1 +- li rRTN,-1 ++ li rRTN, -1 + blr + L(bLcr6): +- li rRTN,1 ++ li rRTN, 1 + bgtlr cr6 +- li rRTN,-1 ++ li rRTN, -1 + blr + + L(b13): +- bne cr0,L(bx12) +- bne cr1,L(bx34) ++ bne cr7, L(bx12) ++ bne cr1, L(bx34) + L(bx56): +- sub rRTN,rWORD5,rWORD6 ++ sub rRTN, rWORD5, rWORD6 + blr + nop + L(b12): +- bne cr0,L(bx12) ++ bne cr7, L(bx12) + L(bx34): +- sub rRTN,rWORD3,rWORD4 ++ sub rRTN, rWORD3, rWORD4 + blr + L(b11): + L(bx12): +- sub rRTN,rWORD1,rWORD2 ++ sub rRTN, rWORD1, rWORD2 + blr + .align 4 +-L(zeroLengthReturn): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) + L(zeroLength): +- li rRTN,0 ++ li rRTN, 0 + blr + + .align 4 + /* At this point we know the strings have different alignment and the +- compare length is at least 8 bytes. rBITDIF containes the low order ++ compare length is at least 8 bytes. r12 contains the low order + 3 bits of rSTR1 and cr5 contains the result of the logical compare +- of rBITDIF to 0. If rBITDIF == 0 then rStr1 is double word ++ of r12 to 0. If r12 == 0 then rStr1 is double word + aligned and can perform the DWunaligned loop. + +- Otherwise we know that rSTR1 is not aready DW aligned yet. ++ Otherwise we know that rSTR1 is not already DW aligned yet. + So we can force the string addresses to the next lower DW +- boundary and special case this first DW word using shift left to +- ellimiate bits preceeding the first byte. Since we want to join the ++ boundary and special case this first DW using shift left to ++ eliminate bits preceding the first byte. Since we want to join the + normal (DWaligned) compare loop, starting at the second double word, + we need to adjust the length (rN) and special case the loop +- versioning for the first DW. This insures that the loop count is ++ 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 rB r27 /* Left rotation temp for rWORD2. */ +-#define rD r26 /* Left rotation temp for rWORD4. */ +-#define rF r25 /* Left rotation temp for rWORD6. */ +-#define rH r24 /* Left rotation temp for rWORD8. */ +-#define rA r0 /* Right rotation temp for rWORD2. */ +-#define rC r12 /* Right rotation temp for rWORD4. */ +-#define rE r0 /* Right rotation temp for rWORD6. */ +-#define rG r12 /* Right rotation temp for rWORD8. */ ++#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 r29,-24(r1) +- cfi_offset(r29,-24) +- clrldi rSHL,rSTR2,61 +- beq cr6,L(duzeroLength) +- std r28,-32(r1) +- cfi_offset(r28,-32) +- beq cr5,L(DWunaligned) +- std r27,-40(r1) +- cfi_offset(r27,-40) +-/* Adjust the logical start of rSTR2 ro compensate for the extra bits ++ std rSHL, -24(r1) ++ cfi_offset(rSHL, -24) ++ clrldi rSHL, rSTR2, 61 ++ beq cr6, L(duzeroLength) ++ std rSHR, -32(r1) ++ cfi_offset(rSHR, -32) ++ beq cr5, L(DWunaligned) ++ std rWORD8_SHIFT, -40(r1) ++ cfi_offset(rWORD8_SHIFT, -40) ++/* Adjust the logical start of rSTR2 to compensate for the extra bits + in the 1st rSTR1 DW. */ +- sub r27,rSTR2,rBITDIF ++ 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 r26,-48(r1) +- cfi_offset(r26,-48) +-/* Compute the leaft/right shift counts for the unalign rSTR2, ++ clrrdi rSTR2, rSTR2, 3 ++ std rWORD2_SHIFT, -48(r1) ++ cfi_offset(rWORD2_SHIFT, -48) ++/* Compute the left/right shift counts for the unaligned rSTR2, + compensating for the logical (DW aligned) start of rSTR1. */ +- clrldi rSHL,r27,61 +- clrrdi rSTR1,rSTR1,3 +- std r25,-56(r1) +- cfi_offset(r25,-56) +- sldi rSHL,rSHL,3 +- cmpld cr5,r27,rSTR2 +- add rN,rN,rBITDIF +- sldi r11,rBITDIF,3 +- std r24,-64(r1) +- cfi_offset(r24,-64) +- subfic rSHR,rSHL,64 +- srdi rTMP,rN,5 /* Divide by 32 */ +- andi. rBITDIF,rN,24 /* Get the DW remainder */ ++ clrldi rSHL, rWORD8_SHIFT, 61 ++ clrrdi rSTR1, rSTR1, 3 ++ std rWORD4_SHIFT, -56(r1) ++ cfi_offset(rWORD4_SHIFT, -56) ++ 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) ++ subfic rSHR, rSHL, 64 ++ srdi r0, rN, 5 /* Divide by 32 */ ++ andi. r12, rN, 24 /* Get the DW remainder */ + /* We normally need to load 2 DWs to start the unaligned rSTR2, but in + this special case those bits may be discarded anyway. Also we + must avoid loading a DW where none of the bits are part of rSTR2 as + this may cross a page boundary and cause a page fault. */ +- li rWORD8,0 +- blt cr5,L(dus0) +- ld rWORD8,0(rSTR2) +- la rSTR2,8(rSTR2) +- sld rWORD8,rWORD8,rSHL ++ li rWORD8, 0 ++ blt cr5, L(dus0) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD8, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else ++ ld rWORD8, 0(rSTR2) ++ addi rSTR2, rSTR2, 8 ++#endif ++ sld rWORD8, rWORD8, rSHL + + L(dus0): +- ld rWORD1,0(rSTR1) +- ld rWORD2,0(rSTR2) +- cmpldi cr1,rBITDIF,16 +- cmpldi cr7,rN,32 +- srd rG,rWORD2,rSHR +- clrldi rN,rN,61 ++#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 ++ cmpldi cr1, r12, 16 ++ cmpldi cr7, rN, 32 ++ srd r12, rWORD2, rSHR ++ clrldi rN, rN, 61 + beq L(duPs4) +- mtctr rTMP +- or rWORD8,rG,rWORD8 +- bgt cr1,L(duPs3) +- beq cr1,L(duPs2) ++ mtctr r0 ++ or rWORD8, r12, rWORD8 ++ bgt cr1, L(duPs3) ++ beq cr1, L(duPs2) + + /* Remainder is 8 */ + .align 4 + L(dusP1): +- sld rB,rWORD2,rSHL +- sld rWORD7,rWORD1,r11 +- sld rWORD8,rWORD8,r11 +- bge cr7,L(duP1e) ++ sld rWORD8_SHIFT, rWORD2, rSHL ++ sld rWORD7, rWORD1, rWORD6 ++ sld rWORD8, rWORD8, rWORD6 ++ bge cr7, L(duP1e) + /* At this point we exit early with the first double word compare + complete and remainder of 0 to 7 bytes. See L(du14) for details on + how we handle the remaining bytes. */ +- cmpld cr5,rWORD7,rWORD8 +- sldi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmpld cr7,rN,rSHR ++ cmpld cr5, rWORD7, rWORD8 ++ sldi. rN, rN, 3 ++ bne cr5, L(duLcr5) ++ cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- ld rWORD2,8(rSTR2) +- srd rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else ++ ld rWORD2, 8(rSTR2) ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 16 */ + .align 4 + L(duPs2): +- sld rH,rWORD2,rSHL +- sld rWORD5,rWORD1,r11 +- sld rWORD6,rWORD8,r11 ++ sld rWORD6_SHIFT, rWORD2, rSHL ++ sld rWORD5, rWORD1, rWORD6 ++ sld rWORD6, rWORD8, rWORD6 + b L(duP2e) + /* Remainder is 24 */ + .align 4 + L(duPs3): +- sld rF,rWORD2,rSHL +- sld rWORD3,rWORD1,r11 +- sld rWORD4,rWORD8,r11 ++ sld rWORD4_SHIFT, rWORD2, rSHL ++ sld rWORD3, rWORD1, rWORD6 ++ sld rWORD4, rWORD8, rWORD6 + b L(duP3e) + /* Count is a multiple of 32, remainder is 0 */ + .align 4 + L(duPs4): +- mtctr rTMP +- or rWORD8,rG,rWORD8 +- sld rD,rWORD2,rSHL +- sld rWORD1,rWORD1,r11 +- sld rWORD2,rWORD8,r11 ++ mtctr r0 ++ or rWORD8, r12, rWORD8 ++ sld rWORD2_SHIFT, rWORD2, rSHL ++ sld rWORD1, rWORD1, rWORD6 ++ sld rWORD2, rWORD8, rWORD6 + b L(duP4e) + + /* At this point we know rSTR1 is double word aligned and the + compare length is at least 8 bytes. */ + .align 4 + L(DWunaligned): +- std r27,-40(r1) +- cfi_offset(r27,-40) +- clrrdi rSTR2,rSTR2,3 +- std r26,-48(r1) +- cfi_offset(r26,-48) +- srdi rTMP,rN,5 /* Divide by 32 */ +- std r25,-56(r1) +- cfi_offset(r25,-56) +- andi. rBITDIF,rN,24 /* Get the DW remainder */ +- std r24,-64(r1) +- cfi_offset(r24,-64) +- sldi rSHL,rSHL,3 +- ld rWORD6,0(rSTR2) +- ldu rWORD8,8(rSTR2) +- cmpldi cr1,rBITDIF,16 +- cmpldi cr7,rN,32 +- clrldi rN,rN,61 +- subfic rSHR,rSHL,64 +- sld rH,rWORD6,rSHL ++ std rWORD8_SHIFT, -40(r1) ++ cfi_offset(rWORD8_SHIFT, -40) ++ clrrdi rSTR2, rSTR2, 3 ++ std rWORD2_SHIFT, -48(r1) ++ cfi_offset(rWORD2_SHIFT, -48) ++ srdi r0, rN, 5 /* Divide by 32 */ ++ std rWORD4_SHIFT, -56(r1) ++ cfi_offset(rWORD4_SHIFT, -56) ++ andi. r12, rN, 24 /* Get the DW remainder */ ++ std rWORD6_SHIFT, -64(r1) ++ cfi_offset(rWORD6_SHIFT, -64) ++ sldi rSHL, rSHL, 3 ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD6, 0, 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 ++ subfic rSHR, rSHL, 64 ++ sld rWORD6_SHIFT, rWORD6, rSHL + beq L(duP4) +- mtctr rTMP +- bgt cr1,L(duP3) +- beq cr1,L(duP2) ++ mtctr r0 ++ bgt cr1, L(duP3) ++ beq cr1, L(duP2) + + /* Remainder is 8 */ + .align 4 + L(duP1): +- srd rG,rWORD8,rSHR +- ld rWORD7,0(rSTR1) +- sld rB,rWORD8,rSHL +- or rWORD8,rG,rH +- blt cr7,L(duP1x) ++ srd r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD7, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else ++ ld rWORD7, 0(rSTR1) ++#endif ++ sld rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT ++ blt cr7, L(duP1x) + L(duP1e): +- ld rWORD1,8(rSTR1) +- ld rWORD2,8(rSTR2) +- cmpld cr5,rWORD7,rWORD8 +- srd rA,rWORD2,rSHR +- sld rD,rWORD2,rSHL +- or rWORD2,rA,rB +- ld rWORD3,16(rSTR1) +- ld rWORD4,16(rSTR2) +- cmpld cr0,rWORD1,rWORD2 +- srd rC,rWORD4,rSHR +- sld rF,rWORD4,rSHL +- bne cr5,L(duLcr5) +- or rWORD4,rC,rD +- ld rWORD5,24(rSTR1) +- ld rWORD6,24(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- srd rE,rWORD6,rSHR +- sld rH,rWORD6,rSHL +- bne cr0,L(duLcr0) +- or rWORD6,rE,rF +- cmpld cr6,rWORD5,rWORD6 ++#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 ++ 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 ++ 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 ++ cmpld cr1, rWORD3, rWORD4 ++ srd r0, rWORD6, rSHR ++ sld rWORD6_SHIFT, rWORD6, rSHL ++ bne cr7, L(duLcr7) ++ or rWORD6, r0, rWORD4_SHIFT ++ cmpld cr6, rWORD5, rWORD6 + b L(duLoop3) + .align 4 + /* At this point we exit early with the first double word compare + complete and remainder of 0 to 7 bytes. See L(du14) for details on + how we handle the remaining bytes. */ + L(duP1x): +- cmpld cr5,rWORD7,rWORD8 +- sldi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmpld cr7,rN,rSHR ++ cmpld cr5, rWORD7, rWORD8 ++ sldi. rN, rN, 3 ++ bne cr5, L(duLcr5) ++ cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- ld rWORD2,8(rSTR2) +- srd rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else ++ ld rWORD2, 8(rSTR2) ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) + /* Remainder is 16 */ + .align 4 + L(duP2): +- srd rE,rWORD8,rSHR +- ld rWORD5,0(rSTR1) +- or rWORD6,rE,rH +- sld rH,rWORD8,rSHL ++ srd r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD5, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else ++ ld rWORD5, 0(rSTR1) ++#endif ++ or rWORD6, r0, rWORD6_SHIFT ++ sld rWORD6_SHIFT, rWORD8, rSHL + L(duP2e): +- ld rWORD7,8(rSTR1) +- ld rWORD8,8(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- srd rG,rWORD8,rSHR +- sld rB,rWORD8,rSHL +- or rWORD8,rG,rH +- blt cr7,L(duP2x) +- ld rWORD1,16(rSTR1) +- ld rWORD2,16(rSTR2) +- cmpld cr5,rWORD7,rWORD8 +- bne cr6,L(duLcr6) +- srd rA,rWORD2,rSHR +- sld rD,rWORD2,rSHL +- or rWORD2,rA,rB +- ld rWORD3,24(rSTR1) +- ld rWORD4,24(rSTR2) +- cmpld cr0,rWORD1,rWORD2 +- bne cr5,L(duLcr5) +- srd rC,rWORD4,rSHR +- sld rF,rWORD4,rSHL +- or rWORD4,rC,rD +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- cmpld cr1,rWORD3,rWORD4 ++#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 ++ 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 ++ 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 ++ 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 +- addi rSTR1,rSTR1,8 +- addi rSTR2,rSTR2,8 +- bne cr6,L(duLcr6) +- sldi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmpld cr7,rN,rSHR ++ 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) ++ cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- ld rWORD2,8(rSTR2) +- srd rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else ++ ld rWORD2, 8(rSTR2) ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) + + /* Remainder is 24 */ + .align 4 + L(duP3): +- srd rC,rWORD8,rSHR +- ld rWORD3,0(rSTR1) +- sld rF,rWORD8,rSHL +- or rWORD4,rC,rH ++ srd r12, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD3, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else ++ ld rWORD3, 0(rSTR1) ++#endif ++ sld rWORD4_SHIFT, rWORD8, rSHL ++ or rWORD4, r12, rWORD6_SHIFT + L(duP3e): +- ld rWORD5,8(rSTR1) +- ld rWORD6,8(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- srd rE,rWORD6,rSHR +- sld rH,rWORD6,rSHL +- or rWORD6,rE,rF +- ld rWORD7,16(rSTR1) +- ld rWORD8,16(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- bne cr1,L(duLcr1) +- srd rG,rWORD8,rSHR +- sld rB,rWORD8,rSHL +- or rWORD8,rG,rH +- blt cr7,L(duP3x) +- ld rWORD1,24(rSTR1) +- ld rWORD2,24(rSTR2) +- cmpld cr5,rWORD7,rWORD8 +- bne cr6,L(duLcr6) +- srd rA,rWORD2,rSHR +- sld rD,rWORD2,rSHL +- or rWORD2,rA,rB +- addi rSTR1,rSTR1,16 +- addi rSTR2,rSTR2,16 +- cmpld cr0,rWORD1,rWORD2 ++#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 ++ 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 ++ 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 ++ 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): +- addi rSTR1,rSTR1,16 +- addi rSTR2,rSTR2,16 +- bne cr1,L(duLcr1) +- cmpld cr5,rWORD7,rWORD8 +- bne cr6,L(duLcr6) +- sldi. rN,rN,3 +- bne cr5,L(duLcr5) +- cmpld cr7,rN,rSHR ++#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 ++ bne cr5, L(duLcr5) ++ cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- ld rWORD2,8(rSTR2) +- srd rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else ++ ld rWORD2, 8(rSTR2) ++#endif ++ srd r0, rWORD2, rSHR + b L(dutrim) + + /* Count is a multiple of 32, remainder is 0 */ + .align 4 + L(duP4): +- mtctr rTMP +- srd rA,rWORD8,rSHR +- ld rWORD1,0(rSTR1) +- sld rD,rWORD8,rSHL +- or rWORD2,rA,rH ++ mtctr r0 ++ srd r0, rWORD8, rSHR ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD1, 0, rSTR1 ++ addi rSTR1, rSTR1, 8 ++#else ++ ld rWORD1, 0(rSTR1) ++#endif ++ sld rWORD2_SHIFT, rWORD8, rSHL ++ or rWORD2, r0, rWORD6_SHIFT + L(duP4e): +- ld rWORD3,8(rSTR1) +- ld rWORD4,8(rSTR2) +- cmpld cr0,rWORD1,rWORD2 +- srd rC,rWORD4,rSHR +- sld rF,rWORD4,rSHL +- or rWORD4,rC,rD +- ld rWORD5,16(rSTR1) +- ld rWORD6,16(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- bne cr0,L(duLcr0) +- srd rE,rWORD6,rSHR +- sld rH,rWORD6,rSHL +- or rWORD6,rE,rF +- ldu rWORD7,24(rSTR1) +- ldu rWORD8,24(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- bne cr1,L(duLcr1) +- srd rG,rWORD8,rSHR +- sld rB,rWORD8,rSHL +- or rWORD8,rG,rH +- cmpld cr5,rWORD7,rWORD8 ++#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 ++ 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 ++ 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 ++ cmpld cr6, rWORD5, rWORD6 ++ bne cr1, L(duLcr1) ++ srd r12, rWORD8, rSHR ++ sld rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT ++ cmpld cr5, rWORD7, rWORD8 + bdz L(du24) /* Adjust CTR as we start with +4 */ + /* This is the primary loop */ + .align 4 + L(duLoop): +- ld rWORD1,8(rSTR1) +- ld rWORD2,8(rSTR2) +- cmpld cr1,rWORD3,rWORD4 +- bne cr6,L(duLcr6) +- srd rA,rWORD2,rSHR +- sld rD,rWORD2,rSHL +- or rWORD2,rA,rB ++#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 ++ cmpld cr1, rWORD3, rWORD4 ++ bne cr6, L(duLcr6) ++ srd r0, rWORD2, rSHR ++ sld rWORD2_SHIFT, rWORD2, rSHL ++ or rWORD2, r0, rWORD8_SHIFT + L(duLoop1): +- ld rWORD3,16(rSTR1) +- ld rWORD4,16(rSTR2) +- cmpld cr6,rWORD5,rWORD6 +- bne cr5,L(duLcr5) +- srd rC,rWORD4,rSHR +- sld rF,rWORD4,rSHL +- or rWORD4,rC,rD ++#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 ++ cmpld cr6, rWORD5, rWORD6 ++ bne cr5, L(duLcr5) ++ srd r12, rWORD4, rSHR ++ sld rWORD4_SHIFT, rWORD4, rSHL ++ or rWORD4, r12, rWORD2_SHIFT + L(duLoop2): +- ld rWORD5,24(rSTR1) +- ld rWORD6,24(rSTR2) +- cmpld cr5,rWORD7,rWORD8 +- bne cr0,L(duLcr0) +- srd rE,rWORD6,rSHR +- sld rH,rWORD6,rSHL +- or rWORD6,rE,rF ++#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 ++ cmpld cr5, rWORD7, rWORD8 ++ bne cr7, L(duLcr7) ++ srd r0, rWORD6, rSHR ++ sld rWORD6_SHIFT, rWORD6, rSHL ++ or rWORD6, r0, rWORD4_SHIFT + L(duLoop3): +- ldu rWORD7,32(rSTR1) +- ldu rWORD8,32(rSTR2) +- cmpld cr0,rWORD1,rWORD2 +- bne- cr1,L(duLcr1) +- srd rG,rWORD8,rSHR +- sld rB,rWORD8,rSHL +- or rWORD8,rG,rH ++#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 ++ cmpld cr7, rWORD1, rWORD2 ++ bne cr1, L(duLcr1) ++ srd r12, rWORD8, rSHR ++ sld rWORD8_SHIFT, rWORD8, rSHL ++ or rWORD8, r12, rWORD6_SHIFT + bdnz L(duLoop) + + L(duL4): +- bne cr1,L(duLcr1) +- cmpld cr1,rWORD3,rWORD4 +- bne cr6,L(duLcr6) +- cmpld cr6,rWORD5,rWORD6 +- bne cr5,L(duLcr5) +- cmpld cr5,rWORD7,rWORD8 ++#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 ++ bne cr5, L(duLcr5) ++ cmpld cr5, rWORD7, rWORD8 + L(du44): +- bne cr0,L(duLcr0) ++ bne cr7, L(duLcr7) + L(du34): +- bne cr1,L(duLcr1) ++ bne cr1, L(duLcr1) + L(du24): +- bne cr6,L(duLcr6) ++ bne cr6, L(duLcr6) + L(du14): +- sldi. rN,rN,3 +- bne cr5,L(duLcr5) ++ sldi. rN, rN, 3 ++ bne cr5, L(duLcr5) + /* At this point we have a remainder of 1 to 7 bytes to compare. We use +- shift right double to elliminate bits beyond the compare length. +- This allows the use of double word subtract to compute the final +- result. ++ shift right double to eliminate bits beyond the compare length. + + However it may not be safe to load rWORD2 which may be beyond the + string length. So we compare the bit length of the remainder to + the right shift count (rSHR). If the bit count is less than or equal + we do not need to load rWORD2 (all significant bits are already in +- rB). */ +- cmpld cr7,rN,rSHR ++ rWORD8_SHIFT). */ ++ cmpld cr7, rN, rSHR + beq L(duZeroReturn) +- li rA,0 +- ble cr7,L(dutrim) +- ld rWORD2,8(rSTR2) +- srd rA,rWORD2,rSHR ++ li r0, 0 ++ ble cr7, L(dutrim) ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD2, 0, rSTR2 ++ addi rSTR2, rSTR2, 8 ++#else ++ ld rWORD2, 8(rSTR2) ++#endif ++ srd r0, rWORD2, rSHR + .align 4 + L(dutrim): +- ld rWORD1,8(rSTR1) +- ld rWORD8,-8(r1) +- subfic rN,rN,64 /* Shift count is 64 - (rN * 8). */ +- or rWORD2,rA,rB +- ld rWORD7,-16(r1) +- ld r29,-24(r1) +- srd rWORD1,rWORD1,rN +- srd rWORD2,rWORD2,rN +- ld r28,-32(r1) +- ld r27,-40(r1) +- li rRTN,0 +- cmpld cr0,rWORD1,rWORD2 +- ld r26,-48(r1) +- ld r25,-56(r1) +- beq cr0,L(dureturn24) +- li rRTN,1 +- ld r24,-64(r1) +- bgtlr cr0 +- li rRTN,-1 +- blr +- .align 4 +-L(duLcr0): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN,1 +- bgt cr0,L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) +- li rRTN,-1 ++#ifdef __LITTLE_ENDIAN__ ++ ldbrx rWORD1, 0, rSTR1 ++#else ++ ld rWORD1, 8(rSTR1) ++#endif ++ 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) ++ srd rWORD1, rWORD1, rN ++ srd rWORD2, rWORD2, rN ++ ld rSHR, -32(r1) ++ ld rWORD8_SHIFT, -40(r1) ++ li rRTN, 0 ++ cmpld cr7, rWORD1, rWORD2 ++ ld rWORD2_SHIFT, -48(r1) ++ ld rWORD4_SHIFT, -56(r1) ++ beq cr7, L(dureturn24) ++ li rRTN, 1 ++ ld rWORD6_SHIFT, -64(r1) ++ bgtlr cr7 ++ li rRTN, -1 ++ blr ++ .align 4 ++L(duLcr7): ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++ li rRTN, 1 ++ bgt cr7, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr1): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN,1 +- bgt cr1,L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) +- li rRTN,-1 ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++ li rRTN, 1 ++ bgt cr1, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr6): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN,1 +- bgt cr6,L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) +- li rRTN,-1 ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++ li rRTN, 1 ++ bgt cr6, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 4 + L(duLcr5): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) +- li rRTN,1 +- bgt cr5,L(dureturn29) +- ld r29,-24(r1) +- ld r28,-32(r1) +- li rRTN,-1 ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) ++ li rRTN, 1 ++ bgt cr5, L(dureturn29) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) ++ li rRTN, -1 + b L(dureturn27) + .align 3 + L(duZeroReturn): +- li rRTN,0 ++ li rRTN, 0 + .align 4 + L(dureturn): +- ld rWORD8,-8(r1) +- ld rWORD7,-16(r1) ++ ld rWORD8, -8(r1) ++ ld rWORD7, -16(r1) + L(dureturn29): +- ld r29,-24(r1) +- ld r28,-32(r1) ++ ld rSHL, -24(r1) ++ ld rSHR, -32(r1) + L(dureturn27): +- ld r27,-40(r1) ++ ld rWORD8_SHIFT, -40(r1) + L(dureturn26): +- ld r26,-48(r1) ++ ld rWORD2_SHIFT, -48(r1) + L(dureturn25): +- ld r25,-56(r1) ++ ld rWORD4_SHIFT, -56(r1) + L(dureturn24): +- ld r24,-64(r1) ++ ld rWORD6_SHIFT, -64(r1) + blr + L(duzeroLength): +- li rRTN,0 ++ li rRTN, 0 + blr + +-END (BP_SYM (memcmp)) ++END (memcmp) + libc_hidden_builtin_def (memcmp) +-weak_alias (memcmp,bcmp) ++weak_alias (memcmp, bcmp) diff --git a/SOURCES/glibc-ppc64le-31.patch b/SOURCES/glibc-ppc64le-31.patch new file mode 100644 index 0000000..de90661 --- /dev/null +++ b/SOURCES/glibc-ppc64le-31.patch @@ -0,0 +1,2943 @@ +# commit 759cfef3ac4c07dba1ece0bbc1207e099348816d +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:47:22 2013 +0930 +# +# PowerPC LE memcpy +# http://sourceware.org/ml/libc-alpha/2013-08/msg00103.html +# +# LIttle-endian support for memcpy. I spent some time cleaning up the +# 64-bit power7 memcpy, in order to avoid the extra alignment traps +# power7 takes for little-endian. It probably would have been better +# to copy the linux kernel version of memcpy. +# +# * sysdeps/powerpc/powerpc32/power4/memcpy.S: Add little endian support. +# * sysdeps/powerpc/powerpc32/power6/memcpy.S: Likewise. +# * sysdeps/powerpc/powerpc32/power7/memcpy.S: Likewise. +# * sysdeps/powerpc/powerpc32/power7/mempcpy.S: Likewise. +# * sysdeps/powerpc/powerpc64/memcpy.S: Likewise. +# * sysdeps/powerpc/powerpc64/power4/memcpy.S: Likewise. +# * sysdeps/powerpc/powerpc64/power6/memcpy.S: Likewise. +# * sysdeps/powerpc/powerpc64/power7/memcpy.S: Likewise. +# * sysdeps/powerpc/powerpc64/power7/mempcpy.S: Likewise. Make better +# use of regs. Use power7 mtocrf. Tidy function tails. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memcpy.S 2014-05-29 13:04:56.000000000 -0500 +@@ -205,15 +205,28 @@ + blt cr6,5f + srwi 7,6,16 + bgt cr6,3f ++#ifdef __LITTLE_ENDIAN__ ++ sth 7,0(3) ++#else + sth 6,0(3) ++#endif + b 7f + .align 4 + 3: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,24 ++ stb 6,0(3) ++ sth 7,1(3) ++#else + stb 7,0(3) + sth 6,1(3) ++#endif + b 7f + .align 4 + 5: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,8 ++#endif + stb 6,0(3) + 7: + cmplwi cr1,10,16 +@@ -341,13 +354,23 @@ + bf 30,1f + + /* there are at least two words to copy, so copy them */ ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,6,10 ++ slw 8,7,9 ++#else + slw 0,6,10 /* shift 1st src word to left align it in R0 */ + srw 8,7,9 /* shift 2nd src word to right align it in R8 */ ++#endif + or 0,0,8 /* or them to get word to store */ + lwz 6,8(5) /* load the 3rd src word */ + stw 0,0(4) /* store the 1st dst word */ ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,7,10 ++ slw 8,6,9 ++#else + slw 0,7,10 /* now left align 2nd src word into R0 */ + srw 8,6,9 /* shift 3rd src word to right align it in R8 */ ++#endif + or 0,0,8 /* or them to get word to store */ + lwz 7,12(5) + stw 0,4(4) /* store the 2nd dst word */ +@@ -355,8 +378,13 @@ + addi 5,5,16 + bf 31,4f + /* there is a third word to copy, so copy it */ ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,6,10 ++ slw 8,7,9 ++#else + slw 0,6,10 /* shift 3rd src word to left align it in R0 */ + srw 8,7,9 /* shift 4th src word to right align it in R8 */ ++#endif + or 0,0,8 /* or them to get word to store */ + stw 0,0(4) /* store 3rd dst word */ + mr 6,7 +@@ -366,8 +394,13 @@ + b 4f + .align 4 + 1: ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,6,10 ++ slw 8,7,9 ++#else + slw 0,6,10 /* shift 1st src word to left align it in R0 */ + srw 8,7,9 /* shift 2nd src word to right align it in R8 */ ++#endif + addi 5,5,8 + or 0,0,8 /* or them to get word to store */ + bf 31,4f +@@ -380,23 +413,43 @@ + .align 4 + 4: + /* copy 16 bytes at a time */ ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,6,10 ++ slw 8,7,9 ++#else + slw 0,6,10 + srw 8,7,9 ++#endif + or 0,0,8 + lwz 6,0(5) + stw 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,7,10 ++ slw 8,6,9 ++#else + slw 0,7,10 + srw 8,6,9 ++#endif + or 0,0,8 + lwz 7,4(5) + stw 0,4(4) ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,6,10 ++ slw 8,7,9 ++#else + slw 0,6,10 + srw 8,7,9 ++#endif + or 0,0,8 + lwz 6,8(5) + stw 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,7,10 ++ slw 8,6,9 ++#else + slw 0,7,10 + srw 8,6,9 ++#endif + or 0,0,8 + lwz 7,12(5) + stw 0,12(4) +@@ -405,8 +458,13 @@ + bdnz+ 4b + 8: + /* calculate and store the final word */ ++#ifdef __LITTLE_ENDIAN__ ++ srw 0,6,10 ++ slw 8,7,9 ++#else + slw 0,6,10 + srw 8,7,9 ++#endif + or 0,0,8 + stw 0,0(4) + 3: +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memcpy.S 2014-05-29 13:04:56.000000000 -0500 +@@ -221,15 +221,28 @@ + blt cr6,5f + srwi 7,6,16 + bgt cr6,3f ++#ifdef __LITTLE_ENDIAN__ ++ sth 7,0(3) ++#else + sth 6,0(3) ++#endif + b 7f + .align 4 + 3: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,24 ++ stb 6,0(3) ++ sth 7,1(3) ++#else + stb 7,0(3) + sth 6,1(3) ++#endif + b 7f + .align 4 + 5: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,8 ++#endif + stb 6,0(3) + 7: + cmplwi cr1,10,16 +@@ -579,7 +592,11 @@ + lwz 6,-1(4) + cmplwi cr6,31,4 + srwi 8,31,5 /* calculate the 32 byte loop count */ ++#ifdef __LITTLE_ENDIAN__ ++ srwi 6,6,8 ++#else + slwi 6,6,8 ++#endif + clrlwi 31,31,27 /* The remaining bytes, < 32. */ + blt cr5,L(wdu1_32tail) + mtctr 8 +@@ -587,8 +604,12 @@ + + lwz 8,3(4) + lwz 7,4(4) ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,24,32 ++#else + /* Equivalent to: srwi 8,8,32-8; or 6,6,8 */ + rlwimi 6,8,8,(32-8),31 ++#endif + b L(wdu1_loop32x) + .align 4 + L(wdu1_loop32): +@@ -597,8 +618,12 @@ + lwz 7,4(4) + stw 10,-8(3) + stw 11,-4(3) ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,24,32 ++#else + /* Equivalent to srwi 8,8,32-8; or 6,6,8 */ + rlwimi 6,8,8,(32-8),31 ++#endif + L(wdu1_loop32x): + lwz 10,8(4) + lwz 11,12(4) +@@ -615,7 +640,11 @@ + stw 6,16(3) + stw 7,20(3) + addi 3,3,32 ++#ifdef __LITTLE_ENDIAN__ ++ srwi 6,8,8 ++#else + slwi 6,8,8 ++#endif + bdnz+ L(wdu1_loop32) + stw 10,-8(3) + stw 11,-4(3) +@@ -626,8 +655,12 @@ + blt cr6,L(wdu_4tail) + /* calculate and store the final word */ + lwz 8,3(4) +-/* Equivalent to: srwi 8,8,32-9; or 6,6,8 */ ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,24,32 ++#else ++/* Equivalent to: srwi 8,8,32-8; or 6,6,8 */ + rlwimi 6,8,8,(32-8),31 ++#endif + b L(wdu_32tailx) + + L(wdu2_32): +@@ -635,7 +668,11 @@ + lwz 6,-2(4) + cmplwi cr6,31,4 + srwi 8,31,5 /* calculate the 32 byte loop count */ ++#ifdef __LITTLE_ENDIAN__ ++ srwi 6,6,16 ++#else + slwi 6,6,16 ++#endif + clrlwi 31,31,27 /* The remaining bytes, < 32. */ + blt cr5,L(wdu2_32tail) + mtctr 8 +@@ -643,8 +680,11 @@ + + lwz 8,2(4) + lwz 7,4(4) +-/* Equivalent to: srwi 8,8,32-8; or 6,6,8 */ ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,16,32 ++#else + rlwimi 6,8,16,(32-16),31 ++#endif + b L(wdu2_loop32x) + .align 4 + L(wdu2_loop32): +@@ -653,8 +693,11 @@ + lwz 7,4(4) + stw 10,-8(3) + stw 11,-4(3) +-/* Equivalent to srwi 8,8,32-8; or 6,6,8 */ ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,16,32 ++#else + rlwimi 6,8,16,(32-16),31 ++#endif + L(wdu2_loop32x): + lwz 10,8(4) + lwz 11,12(4) +@@ -672,7 +715,11 @@ + stw 6,16(3) + stw 7,20(3) + addi 3,3,32 ++#ifdef __LITTLE_ENDIAN__ ++ srwi 6,8,16 ++#else + slwi 6,8,16 ++#endif + bdnz+ L(wdu2_loop32) + stw 10,-8(3) + stw 11,-4(3) +@@ -683,8 +730,11 @@ + blt cr6,L(wdu_4tail) + /* calculate and store the final word */ + lwz 8,2(4) +-/* Equivalent to: srwi 8,8,32-9; or 6,6,8 */ ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,16,32 ++#else + rlwimi 6,8,16,(32-16),31 ++#endif + b L(wdu_32tailx) + + L(wdu3_32): +@@ -692,7 +742,11 @@ + lwz 6,-3(4) + cmplwi cr6,31,4 + srwi 8,31,5 /* calculate the 32 byte loop count */ ++#ifdef __LITTLE_ENDIAN__ ++ srwi 6,6,24 ++#else + slwi 6,6,24 ++#endif + clrlwi 31,31,27 /* The remaining bytes, < 32. */ + blt cr5,L(wdu3_32tail) + mtctr 8 +@@ -700,8 +754,11 @@ + + lwz 8,1(4) + lwz 7,4(4) +-/* Equivalent to: srwi 8,8,32-8; or 6,6,8 */ ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,8,32 ++#else + rlwimi 6,8,24,(32-24),31 ++#endif + b L(wdu3_loop32x) + .align 4 + L(wdu3_loop32): +@@ -710,8 +767,11 @@ + lwz 7,4(4) + stw 10,-8(3) + stw 11,-4(3) +-/* Equivalent to srwi 8,8,32-8; or 6,6,8 */ ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,8,32 ++#else + rlwimi 6,8,24,(32-24),31 ++#endif + L(wdu3_loop32x): + lwz 10,8(4) + lwz 11,12(4) +@@ -728,7 +788,11 @@ + stw 6,16(3) + stw 7,20(3) + addi 3,3,32 ++#ifdef __LITTLE_ENDIAN__ ++ srwi 6,8,24 ++#else + slwi 6,8,24 ++#endif + bdnz+ L(wdu3_loop32) + stw 10,-8(3) + stw 11,-4(3) +@@ -739,8 +803,11 @@ + blt cr6,L(wdu_4tail) + /* calculate and store the final word */ + lwz 8,1(4) +-/* Equivalent to: srwi 8,8,32-9; or 6,6,8 */ ++#ifdef __LITTLE_ENDIAN__ ++ rldimi 6,8,8,32 ++#else + rlwimi 6,8,24,(32-24),31 ++#endif + b L(wdu_32tailx) + .align 4 + L(wdu_32tailx): +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memcpy.S 2014-05-29 13:04:56.000000000 -0500 +@@ -385,7 +385,7 @@ + + beq L(copy_GE_32_unaligned_cont) + +- /* SRC is not quadword aligned, get it aligned. */ ++ /* DST is not quadword aligned, get it aligned. */ + + mtcrf 0x01,0 + subf 31,0,5 +@@ -437,13 +437,21 @@ + mr 11,12 + mtcrf 0x01,9 + cmplwi cr6,9,1 ++#ifdef __LITTLE_ENDIAN__ ++ lvsr 5,0,12 ++#else + lvsl 5,0,12 ++#endif + lvx 3,0,12 + bf 31,L(setup_unaligned_loop) + + /* Copy another 16 bytes to align to 32-bytes due to the loop . */ + lvx 4,12,6 ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else + vperm 6,3,4,5 ++#endif + addi 11,12,16 + addi 10,3,16 + stvx 6,0,3 +@@ -463,11 +471,17 @@ + vector instructions though. */ + + lvx 4,11,6 /* vr4 = r11+16. */ +- vperm 6,3,4,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr6. */ ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else ++ vperm 6,3,4,5 ++#endif + lvx 3,11,7 /* vr3 = r11+32. */ +- vperm 10,4,3,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr10. */ ++#ifdef __LITTLE_ENDIAN__ ++ vperm 10,3,4,5 ++#else ++ vperm 10,4,3,5 ++#endif + addi 11,11,32 + stvx 6,0,10 + stvx 10,10,6 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/mempcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/mempcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/mempcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/mempcpy.S 2014-05-29 13:04:56.000000000 -0500 +@@ -327,7 +327,7 @@ + + beq L(copy_GE_32_unaligned_cont) + +- /* SRC is not quadword aligned, get it aligned. */ ++ /* DST is not quadword aligned, get it aligned. */ + + mtcrf 0x01,0 + subf 31,0,5 +@@ -379,13 +379,21 @@ + mr 11,12 + mtcrf 0x01,9 + cmplwi cr6,9,1 +- lvsl 5,0,12 ++#ifdef __LITTLE_ENDIAN__ ++ lvsr 5,0,12 ++#else ++ lvsl 5,0,12 ++#endif + lvx 3,0,12 + bf 31,L(setup_unaligned_loop) + + /* Copy another 16 bytes to align to 32-bytes due to the loop . */ + lvx 4,12,6 +- vperm 6,3,4,5 ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else ++ vperm 6,3,4,5 ++#endif + addi 11,12,16 + addi 10,3,16 + stvx 6,0,3 +@@ -405,11 +413,17 @@ + vector instructions though. */ + + lvx 4,11,6 /* vr4 = r11+16. */ +- vperm 6,3,4,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr6. */ ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else ++ vperm 6,3,4,5 ++#endif + lvx 3,11,7 /* vr3 = r11+32. */ +- vperm 10,4,3,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr10. */ ++#ifdef __LITTLE_ENDIAN__ ++ vperm 10,3,4,5 ++#else ++ vperm 10,4,3,5 ++#endif + addi 11,11,32 + stvx 6,0,10 + stvx 10,10,6 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memcpy.S 2014-05-29 13:04:56.000000000 -0500 +@@ -214,15 +214,28 @@ + blt cr6,5f + srdi 7,6,16 + bgt cr6,3f ++#ifdef __LITTLE_ENDIAN__ ++ sth 7,0(3) ++#else + sth 6,0(3) ++#endif + b 7f + .align 4 + 3: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,24 ++ stb 6,0(3) ++ sth 7,1(3) ++#else + stb 7,0(3) + sth 6,1(3) ++#endif + b 7f + .align 4 + 5: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,8 ++#endif + stb 6,0(3) + 7: + cmpldi cr1,10,16 +@@ -330,7 +343,11 @@ + ld 7,8(5) + subfic 9,10,64 + beq 2f ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,6,10 ++#else + sld 0,6,10 ++#endif + cmpldi 11,1 + mr 6,7 + addi 4,4,-8 +@@ -338,15 +355,25 @@ + b 1f + 2: addi 5,5,8 + .align 4 ++#ifdef __LITTLE_ENDIAN__ ++0: srd 0,6,10 ++ sld 8,7,9 ++#else + 0: sld 0,6,10 + srd 8,7,9 ++#endif + cmpldi 11,2 + ld 6,8(5) + or 0,0,8 + addi 11,11,-2 + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,7,10 ++1: sld 8,6,9 ++#else + sld 0,7,10 + 1: srd 8,6,9 ++#endif + or 0,0,8 + beq 8f + ld 7,16(5) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memcpy.S 2014-05-29 13:05:51.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memcpy implementation for PowerPC64. +- Copyright (C) 2003, 2006, 2011 Free Software Foundation, Inc. ++ Copyright (C) 2003-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 +@@ -17,26 +17,24 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + /* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]); + Returns 'dst'. + +- Memcpy handles short copies (< 32-bytes) using a binary move blocks +- (no loops) of lwz/stw. The tail (remaining 1-3) bytes is handled +- with the appropriate combination of byte and halfword load/stores. +- There is minimal effort to optimize the alignment of short moves. ++ Memcpy handles short copies (< 32-bytes) using a binary move blocks ++ (no loops) of lwz/stw. The tail (remaining 1-3) bytes is handled ++ with the appropriate combination of byte and halfword load/stores. ++ There is minimal effort to optimize the alignment of short moves. + The 64-bit implementations of POWER3 and POWER4 do a reasonable job +- of handling unligned load/stores that do not cross 32-byte boundries. ++ of handling unaligned load/stores that do not cross 32-byte boundaries. + + Longer moves (>= 32-bytes) justify the effort to get at least the + destination doubleword (8-byte) aligned. Further optimization is +- posible when both source and destination are doubleword aligned. ++ possible when both source and destination are doubleword aligned. + Each case has a optimized unrolled loop. */ + + .machine power4 +-EALIGN (BP_SYM (memcpy), 5, 0) ++EALIGN (memcpy, 5, 0) + CALL_MCOUNT 3 + + cmpldi cr1,5,31 +@@ -44,20 +42,20 @@ + std 3,-16(1) + std 31,-8(1) + cfi_offset(31,-8) +- andi. 11,3,7 /* check alignement of dst. */ ++ andi. 11,3,7 /* check alignment of dst. */ + clrldi 0,0,61 /* Number of bytes until the 1st doubleword of dst. */ +- clrldi 10,4,61 /* check alignement of src. */ ++ clrldi 10,4,61 /* check alignment of src. */ + cmpldi cr6,5,8 + ble- cr1,.L2 /* If move < 32 bytes use short move code. */ +- cmpld cr6,10,11 ++ cmpld cr6,10,11 + mr 12,4 + srdi 9,5,3 /* Number of full double words remaining. */ + mtcrf 0x01,0 + mr 31,5 + beq .L0 +- ++ + subf 31,0,5 +- /* Move 0-7 bytes as needed to get the destination doubleword alligned. */ ++ /* Move 0-7 bytes as needed to get the destination doubleword aligned. */ + 1: bf 31,2f + lbz 6,0(12) + addi 12,12,1 +@@ -74,17 +72,17 @@ + stw 6,0(3) + addi 3,3,4 + 0: +- clrldi 10,12,61 /* check alignement of src again. */ ++ clrldi 10,12,61 /* check alignment of src again. */ + srdi 9,31,3 /* Number of full double words remaining. */ +- +- /* Copy doublewords from source to destination, assumpting the ++ ++ /* Copy doublewords from source to destination, assuming the + destination is aligned on a doubleword boundary. + + At this point we know there are at least 25 bytes left (32-7) to copy. +- The next step is to determine if the source is also doubleword aligned. ++ The next step is to determine if the source is also doubleword aligned. + If not branch to the unaligned move code at .L6. which uses + a load, shift, store strategy. +- ++ + Otherwise source and destination are doubleword aligned, and we can + the optimized doubleword copy loop. */ + .L0: +@@ -97,14 +95,14 @@ + Use a unrolled loop to copy 4 doubleword (32-bytes) per iteration. + If the copy is not an exact multiple of 32 bytes, 1-3 + doublewords are copied as needed to set up the main loop. After +- the main loop exits there may be a tail of 1-7 bytes. These byte are ++ the main loop exits there may be a tail of 1-7 bytes. These byte are + copied a word/halfword/byte at a time as needed to preserve alignment. */ + + srdi 8,31,5 + cmpldi cr1,9,4 + cmpldi cr6,11,0 + mr 11,12 +- ++ + bf 30,1f + ld 6,0(12) + ld 7,8(12) +@@ -115,7 +113,7 @@ + addi 10,3,16 + bf 31,4f + ld 0,16(12) +- std 0,16(3) ++ std 0,16(3) + blt cr1,3f + addi 11,12,24 + addi 10,3,24 +@@ -129,7 +127,7 @@ + addi 11,12,8 + std 6,0(3) + addi 10,3,8 +- ++ + .align 4 + 4: + ld 6,0(11) +@@ -144,7 +142,7 @@ + std 0,24(10) + addi 10,10,32 + bdnz 4b +-3: ++3: + + rldicr 0,31,0,60 + mtcrf 0x01,31 +@@ -152,9 +150,9 @@ + .L9: + add 3,3,0 + add 12,12,0 +- ++ + /* At this point we have a tail of 0-7 bytes and we know that the +- destiniation is double word aligned. */ ++ destination is double word aligned. */ + 4: bf 29,2f + lwz 6,0(12) + addi 12,12,4 +@@ -173,29 +171,29 @@ + ld 31,-8(1) + ld 3,-16(1) + blr +- +-/* Copy up to 31 bytes. This divided into two cases 0-8 bytes and 9-31 +- bytes. Each case is handled without loops, using binary (1,2,4,8) +- tests. +- ++ ++/* Copy up to 31 bytes. This divided into two cases 0-8 bytes and 9-31 ++ bytes. Each case is handled without loops, using binary (1,2,4,8) ++ tests. ++ + In the short (0-8 byte) case no attempt is made to force alignment +- of either source or destination. The hardware will handle the +- unaligned load/stores with small delays for crossing 32- 64-byte, and ++ of either source or destination. The hardware will handle the ++ unaligned load/stores with small delays for crossing 32- 64-byte, and + 4096-byte boundaries. Since these short moves are unlikely to be +- unaligned or cross these boundaries, the overhead to force ++ unaligned or cross these boundaries, the overhead to force + alignment is not justified. +- ++ + The longer (9-31 byte) move is more likely to cross 32- or 64-byte + boundaries. Since only loads are sensitive to the 32-/64-byte +- boundaries it is more important to align the source then the ++ boundaries it is more important to align the source then the + destination. If the source is not already word aligned, we first +- move 1-3 bytes as needed. Since we are only word aligned we don't +- use double word load/stores to insure that all loads are aligned. ++ move 1-3 bytes as needed. Since we are only word aligned we don't ++ use double word load/stores to insure that all loads are aligned. + While the destination and stores may still be unaligned, this + is only an issue for page (4096 byte boundary) crossing, which + should be rare for these short moves. The hardware handles this +- case automatically with a small delay. */ +- ++ case automatically with a small delay. */ ++ + .align 4 + .L2: + mtcrf 0x01,5 +@@ -216,15 +214,28 @@ + blt cr6,5f + srdi 7,6,16 + bgt cr6,3f ++#ifdef __LITTLE_ENDIAN__ ++ sth 7,0(3) ++#else + sth 6,0(3) ++#endif + b 7f + .align 4 + 3: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,24 ++ stb 6,0(3) ++ sth 7,1(3) ++#else + stb 7,0(3) + sth 6,1(3) ++#endif + b 7f + .align 4 + 5: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,8 ++#endif + stb 6,0(3) + 7: + cmpldi cr1,10,16 +@@ -258,11 +269,11 @@ + lwz 6,0(12) + addi 12,12,4 + stw 6,0(3) +- addi 3,3,4 ++ addi 3,3,4 + 2: /* Move 2-3 bytes. */ + bf 30,1f + lhz 6,0(12) +- sth 6,0(3) ++ sth 6,0(3) + bf 31,0f + lbz 7,2(12) + stb 7,2(3) +@@ -283,8 +294,8 @@ + mr 12,4 + bne cr6,4f + /* Would have liked to use use ld/std here but the 630 processors are +- slow for load/store doubles that are not at least word aligned. +- Unaligned Load/Store word execute with only a 1 cycle penaltity. */ ++ slow for load/store doubles that are not at least word aligned. ++ Unaligned Load/Store word execute with only a 1 cycle penalty. */ + lwz 6,0(4) + lwz 7,4(4) + stw 6,0(3) +@@ -299,14 +310,14 @@ + 6: + bf 30,5f + lhz 7,4(4) +- sth 7,4(3) ++ sth 7,4(3) + bf 31,0f + lbz 8,6(4) + stb 8,6(3) + ld 3,-16(1) + blr + .align 4 +-5: ++5: + bf 31,0f + lbz 6,4(4) + stb 6,4(3) +@@ -336,13 +347,23 @@ + bf 30,1f + + /* there are at least two DWs to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,6,10 ++ sld 8,7,9 ++#else + sld 0,6,10 + srd 8,7,9 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,7,10 ++ sld 8,6,9 ++#else + sld 0,7,10 + srd 8,6,9 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -351,8 +372,13 @@ + blt cr6,8f /* if total DWs = 3, then bypass loop */ + bf 31,4f + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,6,10 ++ sld 8,7,9 ++#else + sld 0,6,10 + srd 8,7,9 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -363,8 +389,13 @@ + b 4f + .align 4 + 1: ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,6,10 ++ sld 8,7,9 ++#else + sld 0,6,10 + srd 8,7,9 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,4f +@@ -375,23 +406,44 @@ + addi 4,4,8 + .align 4 + /* copy 32 bytes at a time */ +-4: sld 0,6,10 ++4: ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,6,10 ++ sld 8,7,9 ++#else ++ sld 0,6,10 + srd 8,7,9 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,7,10 ++ sld 8,6,9 ++#else + sld 0,7,10 + srd 8,6,9 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,6,10 ++ sld 8,7,9 ++#else + sld 0,6,10 + srd 8,7,9 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,7,10 ++ sld 8,6,9 ++#else + sld 0,7,10 + srd 8,6,9 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -401,9 +453,14 @@ + .align 4 + 8: + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srd 0,6,10 ++ sld 8,7,9 ++#else + sld 0,6,10 + srd 8,7,9 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + 3: + rldicr 0,31,0,60 +@@ -413,5 +470,5 @@ + ld 31,-8(1) + ld 3,-16(1) + blr +-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS) ++END_GEN_TB (memcpy,TB_TOCLESS) + libc_hidden_builtin_def (memcpy) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memcpy.S 2014-05-29 13:05:27.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memcpy implementation for PowerPC64. +- Copyright (C) 2003, 2006, 2007, 2011 Free Software Foundation, Inc. ++ Copyright (C) 2003-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 +@@ -17,52 +17,50 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + /* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]); + Returns 'dst'. + +- Memcpy handles short copies (< 32-bytes) using a binary move blocks +- (no loops) of lwz/stw. The tail (remaining 1-3) bytes is handled +- with the appropriate combination of byte and halfword load/stores. +- There is minimal effort to optimize the alignment of short moves. ++ Memcpy handles short copies (< 32-bytes) using a binary move blocks ++ (no loops) of lwz/stw. The tail (remaining 1-3) bytes is handled ++ with the appropriate combination of byte and halfword load/stores. ++ There is minimal effort to optimize the alignment of short moves. + The 64-bit implementations of POWER3 and POWER4 do a reasonable job +- of handling unligned load/stores that do not cross 32-byte boundries. ++ of handling unaligned load/stores that do not cross 32-byte boundaries. + + Longer moves (>= 32-bytes) justify the effort to get at least the + destination doubleword (8-byte) aligned. Further optimization is +- posible when both source and destination are doubleword aligned. +- Each case has a optimized unrolled loop. +- +- For POWER6 unaligned loads will take a 20+ cycle hicup for any ++ possible when both source and destination are doubleword aligned. ++ Each case has a optimized unrolled loop. ++ ++ For POWER6 unaligned loads will take a 20+ cycle hiccup for any + L1 cache miss that crosses a 32- or 128-byte boundary. Store +- is more forgiving and does not take a hicup until page or +- segment boundaries. So we require doubleword alignment for ++ is more forgiving and does not take a hiccup until page or ++ segment boundaries. So we require doubleword alignment for + the source but may take a risk and only require word alignment + for the destination. */ + + .machine "power6" +-EALIGN (BP_SYM (memcpy), 7, 0) ++EALIGN (memcpy, 7, 0) + CALL_MCOUNT 3 + + cmpldi cr1,5,31 + neg 0,3 + std 3,-16(1) + std 31,-8(1) +- andi. 11,3,7 /* check alignement of dst. */ ++ andi. 11,3,7 /* check alignment of dst. */ + clrldi 0,0,61 /* Number of bytes until the 1st doubleword of dst. */ +- clrldi 10,4,61 /* check alignement of src. */ ++ clrldi 10,4,61 /* check alignment of src. */ + cmpldi cr6,5,8 + ble- cr1,.L2 /* If move < 32 bytes use short move code. */ + mtcrf 0x01,0 +- cmpld cr6,10,11 ++ cmpld cr6,10,11 + srdi 9,5,3 /* Number of full double words remaining. */ + beq .L0 +- ++ + subf 5,0,5 +- /* Move 0-7 bytes as needed to get the destination doubleword alligned. +- Duplicate some code to maximize fall-throught and minimize agen delays. */ ++ /* Move 0-7 bytes as needed to get the destination doubleword aligned. ++ Duplicate some code to maximize fall-through and minimize agen delays. */ + 1: bf 31,2f + lbz 6,0(4) + stb 6,0(3) +@@ -78,7 +76,7 @@ + lwz 6,1(4) + stw 6,1(3) + b 0f +- ++ + 2: bf 30,4f + lhz 6,0(4) + sth 6,0(3) +@@ -86,26 +84,26 @@ + lwz 6,2(4) + stw 6,2(3) + b 0f +- ++ + 4: bf 29,0f + lwz 6,0(4) + stw 6,0(3) +-0: ++0: + /* Add the number of bytes until the 1st doubleword of dst to src and dst. */ + add 4,4,0 + add 3,3,0 +- +- clrldi 10,4,61 /* check alignement of src again. */ ++ ++ clrldi 10,4,61 /* check alignment of src again. */ + srdi 9,5,3 /* Number of full double words remaining. */ +- +- /* Copy doublewords from source to destination, assumpting the ++ ++ /* Copy doublewords from source to destination, assuming the + destination is aligned on a doubleword boundary. + + At this point we know there are at least 25 bytes left (32-7) to copy. +- The next step is to determine if the source is also doubleword aligned. ++ The next step is to determine if the source is also doubleword aligned. + If not branch to the unaligned move code at .L6. which uses + a load, shift, store strategy. +- ++ + Otherwise source and destination are doubleword aligned, and we can + the optimized doubleword copy loop. */ + .align 4 +@@ -123,14 +121,14 @@ + the main loop exits there may be a tail of 1-7 bytes. These byte + are copied a word/halfword/byte at a time as needed to preserve + alignment. +- ++ + For POWER6 the L1 is store-through and the L2 is store-in. The + L2 is clocked at half CPU clock so we can store 16 bytes every + other cycle. POWER6 also has a load/store bypass so we can do +- load, load, store, store every 2 cycles. +- ++ load, load, store, store every 2 cycles. ++ + The following code is sensitive to cache line alignment. Do not +- make any change with out first making sure thay don't result in ++ make any change with out first making sure they don't result in + splitting ld/std pairs across a cache line. */ + + mtcrf 0x02,5 +@@ -273,7 +271,7 @@ + std 8,16+96(10) + std 0,24+96(10) + ble cr5,L(das_loop_e) +- ++ + mtctr 12 + .align 4 + L(das_loop2): +@@ -326,10 +324,10 @@ + .align 4 + L(das_tail): + beq cr1,0f +- ++ + L(das_tail2): + /* At this point we have a tail of 0-7 bytes and we know that the +- destiniation is double word aligned. */ ++ destination is double word aligned. */ + 4: bf 29,2f + lwz 6,0(4) + stw 6,0(3) +@@ -344,7 +342,7 @@ + lbz 6,4(4) + stb 6,4(3) + b 0f +- ++ + 2: bf 30,1f + lhz 6,0(4) + sth 6,0(3) +@@ -352,7 +350,7 @@ + lbz 6,2(4) + stb 6,2(3) + b 0f +- ++ + 1: bf 31,0f + lbz 6,0(4) + stb 6,0(3) +@@ -361,7 +359,7 @@ + ld 3,-16(1) + blr + +-/* Copy up to 31 bytes. This divided into two cases 0-8 bytes and 9-31 ++/* Copy up to 31 bytes. This divided into two cases 0-8 bytes and 9-31 + bytes. Each case is handled without loops, using binary (1,2,4,8) + tests. + +@@ -402,15 +400,28 @@ + blt cr6,5f + srdi 7,6,16 + bgt cr6,3f ++#ifdef __LITTLE_ENDIAN__ ++ sth 7,0(3) ++#else + sth 6,0(3) ++#endif + b 7f + .align 4 + 3: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,24 ++ stb 6,0(3) ++ sth 7,1(3) ++#else + stb 7,0(3) + sth 6,1(3) ++#endif + b 7f + .align 4 + 5: ++#ifdef __LITTLE_ENDIAN__ ++ rotlwi 6,6,8 ++#endif + stb 6,0(3) + 7: + cmpldi cr1,10,16 +@@ -421,7 +432,7 @@ + /* At least 6 bytes left and the source is word aligned. This allows + some speculative loads up front. */ + /* We need to special case the fall-through because the biggest delays +- are due to address computation not being ready in time for the ++ are due to address computation not being ready in time for the + AGEN. */ + lwz 6,0(12) + lwz 7,4(12) +@@ -452,7 +463,7 @@ + ld 3,-16(1) + blr + .align 4 +-L(dus_tail16p8): /* less then 8 bytes left. */ ++L(dus_tail16p8): /* less than 8 bytes left. */ + beq cr1,L(dus_tailX) /* exactly 16 bytes, early exit. */ + cmpldi cr1,10,20 + bf 29,L(dus_tail16p2) +@@ -466,7 +477,7 @@ + ld 3,-16(1) + blr + .align 4 +-L(dus_tail16p4): /* less then 4 bytes left. */ ++L(dus_tail16p4): /* less than 4 bytes left. */ + addi 12,12,24 + addi 3,3,24 + bgt cr0,L(dus_tail2) +@@ -474,7 +485,7 @@ + ld 3,-16(1) + blr + .align 4 +-L(dus_tail16p2): /* 16 bytes moved, less then 4 bytes left. */ ++L(dus_tail16p2): /* 16 bytes moved, less than 4 bytes left. */ + addi 12,12,16 + addi 3,3,16 + b L(dus_tail2) +@@ -499,7 +510,7 @@ + ld 3,-16(1) + blr + .align 4 +-L(dus_tail8p4): /* less then 4 bytes left. */ ++L(dus_tail8p4): /* less than 4 bytes left. */ + addi 12,12,8 + addi 3,3,8 + bgt cr1,L(dus_tail2) +@@ -510,14 +521,14 @@ + .align 4 + L(dus_tail4): /* Move 4 bytes. */ + /* r6 already loaded speculatively. If we are here we know there is +- more then 4 bytes left. So there is no need to test. */ ++ more than 4 bytes left. So there is no need to test. */ + addi 12,12,4 + stw 6,0(3) + addi 3,3,4 + L(dus_tail2): /* Move 2-3 bytes. */ + bf 30,L(dus_tail1) + lhz 6,0(12) +- sth 6,0(3) ++ sth 6,0(3) + bf 31,L(dus_tailX) + lbz 7,2(12) + stb 7,2(3) +@@ -537,7 +548,7 @@ + .LE8: + mr 12,4 + bne cr6,L(dus_4) +-/* Exactly 8 bytes. We may cross a 32-/128-byte boundry and take a ~20 ++/* Exactly 8 bytes. We may cross a 32-/128-byte boundary and take a ~20 + cycle delay. This case should be rare and any attempt to avoid this + would take most of 20 cycles any way. */ + ld 6,0(4) +@@ -552,7 +563,7 @@ + stw 6,0(3) + bf 30,L(dus_5) + lhz 7,4(4) +- sth 7,4(3) ++ sth 7,4(3) + bf 31,L(dus_0) + lbz 8,6(4) + stb 8,6(3) +@@ -590,20 +601,31 @@ + bge cr0, L(du4_do) + blt cr5, L(du1_do) + beq cr5, L(du2_do) +- b L(du3_do) +- ++ b L(du3_do) ++ + .align 4 + L(du1_do): + bf 30,L(du1_1dw) + + /* there are at least two DWs to copy */ ++ /* FIXME: can combine last shift and "or" into "rldimi" */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 8 ++ sldi 8,7, 64-8 ++#else + sldi 0,6, 8 + srdi 8,7, 64-8 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 8 ++ sldi 8,6, 64-8 ++#else + sldi 0,7, 8 + srdi 8,6, 64-8 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -612,8 +634,13 @@ + blt cr6,L(du1_fini) /* if total DWs = 3, then bypass loop */ + bf 31,L(du1_loop) + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 8 ++ sldi 8,7, 64-8 ++#else + sldi 0,6, 8 + srdi 8,7, 64-8 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -624,8 +651,13 @@ + b L(du1_loop) + .align 4 + L(du1_1dw): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 8 ++ sldi 8,7, 64-8 ++#else + sldi 0,6, 8 + srdi 8,7, 64-8 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,L(du1_loop) +@@ -637,23 +669,43 @@ + .align 4 + /* copy 32 bytes at a time */ + L(du1_loop): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 8 ++ sldi 8,7, 64-8 ++#else + sldi 0,6, 8 + srdi 8,7, 64-8 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 8 ++ sldi 8,6, 64-8 ++#else + sldi 0,7, 8 + srdi 8,6, 64-8 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 8 ++ sldi 8,7, 64-8 ++#else + sldi 0,6, 8 + srdi 8,7, 64-8 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 8 ++ sldi 8,6, 64-8 ++#else + sldi 0,7, 8 + srdi 8,6, 64-8 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -663,9 +715,14 @@ + .align 4 + L(du1_fini): + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 8 ++ sldi 8,7, 64-8 ++#else + sldi 0,6, 8 + srdi 8,7, 64-8 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + b L(du_done) + +@@ -674,13 +731,23 @@ + bf 30,L(du2_1dw) + + /* there are at least two DWs to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 16 ++ sldi 8,7, 64-16 ++#else + sldi 0,6, 16 + srdi 8,7, 64-16 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 16 ++ sldi 8,6, 64-16 ++#else + sldi 0,7, 16 + srdi 8,6, 64-16 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -689,8 +756,13 @@ + blt cr6,L(du2_fini) /* if total DWs = 3, then bypass loop */ + bf 31,L(du2_loop) + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 16 ++ sldi 8,7, 64-16 ++#else + sldi 0,6, 16 + srdi 8,7, 64-16 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -701,8 +773,13 @@ + b L(du2_loop) + .align 4 + L(du2_1dw): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 16 ++ sldi 8,7, 64-16 ++#else + sldi 0,6, 16 + srdi 8,7, 64-16 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,L(du2_loop) +@@ -714,23 +791,43 @@ + .align 4 + /* copy 32 bytes at a time */ + L(du2_loop): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 16 ++ sldi 8,7, 64-16 ++#else + sldi 0,6, 16 + srdi 8,7, 64-16 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 16 ++ sldi 8,6, 64-16 ++#else + sldi 0,7, 16 + srdi 8,6, 64-16 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 16 ++ sldi 8,7, 64-16 ++#else + sldi 0,6, 16 + srdi 8,7, 64-16 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 16 ++ sldi 8,6, 64-16 ++#else + sldi 0,7, 16 + srdi 8,6, 64-16 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -740,9 +837,14 @@ + .align 4 + L(du2_fini): + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 16 ++ sldi 8,7, 64-16 ++#else + sldi 0,6, 16 + srdi 8,7, 64-16 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + b L(du_done) + +@@ -751,13 +853,23 @@ + bf 30,L(du3_1dw) + + /* there are at least two DWs to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 24 ++ sldi 8,7, 64-24 ++#else + sldi 0,6, 24 + srdi 8,7, 64-24 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 24 ++ sldi 8,6, 64-24 ++#else + sldi 0,7, 24 + srdi 8,6, 64-24 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -766,8 +878,13 @@ + blt cr6,L(du3_fini) /* if total DWs = 3, then bypass loop */ + bf 31,L(du3_loop) + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 24 ++ sldi 8,7, 64-24 ++#else + sldi 0,6, 24 + srdi 8,7, 64-24 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -778,8 +895,13 @@ + b L(du3_loop) + .align 4 + L(du3_1dw): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 24 ++ sldi 8,7, 64-24 ++#else + sldi 0,6, 24 + srdi 8,7, 64-24 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,L(du3_loop) +@@ -791,23 +913,43 @@ + .align 4 + /* copy 32 bytes at a time */ + L(du3_loop): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 24 ++ sldi 8,7, 64-24 ++#else + sldi 0,6, 24 + srdi 8,7, 64-24 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 24 ++ sldi 8,6, 64-24 ++#else + sldi 0,7, 24 + srdi 8,6, 64-24 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 24 ++ sldi 8,7, 64-24 ++#else + sldi 0,6, 24 + srdi 8,7, 64-24 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 24 ++ sldi 8,6, 64-24 ++#else + sldi 0,7, 24 + srdi 8,6, 64-24 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -817,9 +959,14 @@ + .align 4 + L(du3_fini): + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 24 ++ sldi 8,7, 64-24 ++#else + sldi 0,6, 24 + srdi 8,7, 64-24 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + b L(du_done) + +@@ -834,13 +981,23 @@ + bf 30,L(du4_1dw) + + /* there are at least two DWs to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 32 ++ sldi 8,7, 64-32 ++#else + sldi 0,6, 32 + srdi 8,7, 64-32 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 32 ++ sldi 8,6, 64-32 ++#else + sldi 0,7, 32 + srdi 8,6, 64-32 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -849,8 +1006,13 @@ + blt cr6,L(du4_fini) /* if total DWs = 3, then bypass loop */ + bf 31,L(du4_loop) + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 32 ++ sldi 8,7, 64-32 ++#else + sldi 0,6, 32 + srdi 8,7, 64-32 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -861,8 +1023,13 @@ + b L(du4_loop) + .align 4 + L(du4_1dw): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 32 ++ sldi 8,7, 64-32 ++#else + sldi 0,6, 32 + srdi 8,7, 64-32 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,L(du4_loop) +@@ -874,23 +1041,43 @@ + .align 4 + /* copy 32 bytes at a time */ + L(du4_loop): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 32 ++ sldi 8,7, 64-32 ++#else + sldi 0,6, 32 + srdi 8,7, 64-32 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 32 ++ sldi 8,6, 64-32 ++#else + sldi 0,7, 32 + srdi 8,6, 64-32 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 32 ++ sldi 8,7, 64-32 ++#else + sldi 0,6, 32 + srdi 8,7, 64-32 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 32 ++ sldi 8,6, 64-32 ++#else + sldi 0,7, 32 + srdi 8,6, 64-32 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -900,9 +1087,14 @@ + .align 4 + L(du4_fini): + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 32 ++ sldi 8,7, 64-32 ++#else + sldi 0,6, 32 + srdi 8,7, 64-32 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + b L(du_done) + +@@ -911,13 +1103,23 @@ + bf 30,L(du5_1dw) + + /* there are at least two DWs to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 40 ++ sldi 8,7, 64-40 ++#else + sldi 0,6, 40 + srdi 8,7, 64-40 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 40 ++ sldi 8,6, 64-40 ++#else + sldi 0,7, 40 + srdi 8,6, 64-40 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -926,8 +1128,13 @@ + blt cr6,L(du5_fini) /* if total DWs = 3, then bypass loop */ + bf 31,L(du5_loop) + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 40 ++ sldi 8,7, 64-40 ++#else + sldi 0,6, 40 + srdi 8,7, 64-40 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -938,8 +1145,13 @@ + b L(du5_loop) + .align 4 + L(du5_1dw): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 40 ++ sldi 8,7, 64-40 ++#else + sldi 0,6, 40 + srdi 8,7, 64-40 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,L(du5_loop) +@@ -951,23 +1163,43 @@ + .align 4 + /* copy 32 bytes at a time */ + L(du5_loop): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 40 ++ sldi 8,7, 64-40 ++#else + sldi 0,6, 40 + srdi 8,7, 64-40 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 40 ++ sldi 8,6, 64-40 ++#else + sldi 0,7, 40 + srdi 8,6, 64-40 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 40 ++ sldi 8,7, 64-40 ++#else + sldi 0,6, 40 + srdi 8,7, 64-40 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 40 ++ sldi 8,6, 64-40 ++#else + sldi 0,7, 40 + srdi 8,6, 64-40 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -977,9 +1209,14 @@ + .align 4 + L(du5_fini): + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 40 ++ sldi 8,7, 64-40 ++#else + sldi 0,6, 40 + srdi 8,7, 64-40 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + b L(du_done) + +@@ -988,13 +1225,23 @@ + bf 30,L(du6_1dw) + + /* there are at least two DWs to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 48 ++ sldi 8,7, 64-48 ++#else + sldi 0,6, 48 + srdi 8,7, 64-48 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 48 ++ sldi 8,6, 64-48 ++#else + sldi 0,7, 48 + srdi 8,6, 64-48 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -1003,8 +1250,13 @@ + blt cr6,L(du6_fini) /* if total DWs = 3, then bypass loop */ + bf 31,L(du6_loop) + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 48 ++ sldi 8,7, 64-48 ++#else + sldi 0,6, 48 + srdi 8,7, 64-48 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -1015,8 +1267,13 @@ + b L(du6_loop) + .align 4 + L(du6_1dw): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 48 ++ sldi 8,7, 64-48 ++#else + sldi 0,6, 48 + srdi 8,7, 64-48 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,L(du6_loop) +@@ -1028,23 +1285,43 @@ + .align 4 + /* copy 32 bytes at a time */ + L(du6_loop): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 48 ++ sldi 8,7, 64-48 ++#else + sldi 0,6, 48 + srdi 8,7, 64-48 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 48 ++ sldi 8,6, 64-48 ++#else + sldi 0,7, 48 + srdi 8,6, 64-48 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 48 ++ sldi 8,7, 64-48 ++#else + sldi 0,6, 48 + srdi 8,7, 64-48 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 48 ++ sldi 8,6, 64-48 ++#else + sldi 0,7, 48 + srdi 8,6, 64-48 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -1054,9 +1331,14 @@ + .align 4 + L(du6_fini): + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 48 ++ sldi 8,7, 64-48 ++#else + sldi 0,6, 48 + srdi 8,7, 64-48 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + b L(du_done) + +@@ -1065,13 +1347,23 @@ + bf 30,L(du7_1dw) + + /* there are at least two DWs to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 56 ++ sldi 8,7, 64-56 ++#else + sldi 0,6, 56 + srdi 8,7, 64-56 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 56 ++ sldi 8,6, 64-56 ++#else + sldi 0,7, 56 + srdi 8,6, 64-56 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,8(4) +@@ -1080,8 +1372,13 @@ + blt cr6,L(du7_fini) /* if total DWs = 3, then bypass loop */ + bf 31,L(du7_loop) + /* there is a third DW to copy */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 56 ++ sldi 8,7, 64-56 ++#else + sldi 0,6, 56 + srdi 8,7, 64-56 ++#endif + or 0,0,8 + std 0,0(4) + mr 6,7 +@@ -1092,8 +1389,13 @@ + b L(du7_loop) + .align 4 + L(du7_1dw): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 56 ++ sldi 8,7, 64-56 ++#else + sldi 0,6, 56 + srdi 8,7, 64-56 ++#endif + addi 5,5,16 + or 0,0,8 + bf 31,L(du7_loop) +@@ -1105,23 +1407,43 @@ + .align 4 + /* copy 32 bytes at a time */ + L(du7_loop): ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 56 ++ sldi 8,7, 64-56 ++#else + sldi 0,6, 56 + srdi 8,7, 64-56 ++#endif + or 0,0,8 + ld 6,0(5) + std 0,0(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 56 ++ sldi 8,6, 64-56 ++#else + sldi 0,7, 56 + srdi 8,6, 64-56 ++#endif + or 0,0,8 + ld 7,8(5) + std 0,8(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 56 ++ sldi 8,7, 64-56 ++#else + sldi 0,6, 56 + srdi 8,7, 64-56 ++#endif + or 0,0,8 + ld 6,16(5) + std 0,16(4) ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,7, 56 ++ sldi 8,6, 64-56 ++#else + sldi 0,7, 56 + srdi 8,6, 64-56 ++#endif + or 0,0,8 + ld 7,24(5) + std 0,24(4) +@@ -1131,12 +1453,17 @@ + .align 4 + L(du7_fini): + /* calculate and store the final DW */ ++#ifdef __LITTLE_ENDIAN__ ++ srdi 0,6, 56 ++ sldi 8,7, 64-56 ++#else + sldi 0,6, 56 + srdi 8,7, 64-56 +- or 0,0,8 ++#endif ++ or 0,0,8 + std 0,0(4) + b L(du_done) +- ++ + .align 4 + L(du_done): + rldicr 0,31,0,60 +@@ -1144,9 +1471,9 @@ + beq cr1,0f /* If the tail is 0 bytes we are done! */ + + add 3,3,0 +- add 12,12,0 ++ add 12,12,0 + /* At this point we have a tail of 0-7 bytes and we know that the +- destiniation is double word aligned. */ ++ destination is double word aligned. */ + 4: bf 29,2f + lwz 6,0(12) + addi 12,12,4 +@@ -1165,5 +1492,5 @@ + ld 31,-8(1) + ld 3,-16(1) + blr +-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS) ++END_GEN_TB (memcpy,TB_TOCLESS) + libc_hidden_builtin_def (memcpy) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memcpy.S 2014-05-29 13:05:40.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memcpy implementation for PowerPC64/POWER7. +- Copyright (C) 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 2010-2014 Free Software Foundation, Inc. + Contributed by Luis Machado <luisgpm@br.ibm.com>. + This file is part of the GNU C Library. + +@@ -18,425 +18,366 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + + /* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]); + Returns 'dst'. */ + ++#define dst 11 /* Use r11 so r3 kept unchanged. */ ++#define src 4 ++#define cnt 5 ++ + .machine power7 +-EALIGN (BP_SYM (memcpy), 5, 0) ++EALIGN (memcpy, 5, 0) + CALL_MCOUNT 3 + +- cmpldi cr1,5,31 ++ cmpldi cr1,cnt,31 + neg 0,3 +- std 3,-16(1) +- std 31,-8(1) +- cfi_offset(31,-8) + ble cr1, L(copy_LT_32) /* If move < 32 bytes use short move + code. */ + +- andi. 11,3,7 /* Check alignment of DST. */ +- ++#ifdef __LITTLE_ENDIAN__ ++/* In little-endian mode, power7 takes an alignment trap on any lxvd2x ++ or stxvd2x crossing a 32-byte boundary, so ensure the aligned_copy ++ loop is only used for quadword aligned copies. */ ++ andi. 10,3,15 ++ clrldi 11,4,60 ++#else ++ andi. 10,3,7 /* Check alignment of DST. */ ++ clrldi 11,4,61 /* Check alignment of SRC. */ ++#endif ++ cmpld cr6,10,11 /* SRC and DST alignments match? */ + +- clrldi 10,4,61 /* Check alignment of SRC. */ +- cmpld cr6,10,11 /* SRC and DST alignments match? */ +- mr 12,4 +- mr 31,5 ++ mr dst,3 + bne cr6,L(copy_GE_32_unaligned) ++ beq L(aligned_copy) + +- srdi 9,5,3 /* Number of full quadwords remaining. */ +- +- beq L(copy_GE_32_aligned_cont) +- +- clrldi 0,0,61 +- mtcrf 0x01,0 +- subf 31,0,5 +- +- /* Get the SRC aligned to 8 bytes. */ +- +-1: bf 31,2f +- lbz 6,0(12) +- addi 12,12,1 +- stb 6,0(3) +- addi 3,3,1 +-2: bf 30,4f +- lhz 6,0(12) +- addi 12,12,2 +- sth 6,0(3) +- addi 3,3,2 +-4: bf 29,0f +- lwz 6,0(12) +- addi 12,12,4 +- stw 6,0(3) +- addi 3,3,4 +-0: +- clrldi 10,12,61 /* Check alignment of SRC again. */ +- srdi 9,31,3 /* Number of full doublewords remaining. */ +- +-L(copy_GE_32_aligned_cont): +- +- clrldi 11,31,61 +- mtcrf 0x01,9 +- +- srdi 8,31,5 +- cmpldi cr1,9,4 +- cmpldi cr6,11,0 +- mr 11,12 ++ mtocrf 0x01,0 ++#ifdef __LITTLE_ENDIAN__ ++ clrldi 0,0,60 ++#else ++ clrldi 0,0,61 ++#endif + +- /* Copy 1~3 doublewords so the main loop starts +- at a multiple of 32 bytes. */ +- +- bf 30,1f +- ld 6,0(12) +- ld 7,8(12) +- addi 11,12,16 +- mtctr 8 +- std 6,0(3) +- std 7,8(3) +- addi 10,3,16 +- bf 31,4f +- ld 0,16(12) +- std 0,16(3) +- blt cr1,3f +- addi 11,12,24 +- addi 10,3,24 +- b 4f +- +- .align 4 +-1: /* Copy 1 doubleword and set the counter. */ +- mr 10,3 +- mtctr 8 +- bf 31,4f +- ld 6,0(12) +- addi 11,12,8 +- std 6,0(3) +- addi 10,3,8 ++/* Get the DST and SRC aligned to 8 bytes (16 for little-endian). */ ++1: ++ bf 31,2f ++ lbz 6,0(src) ++ addi src,src,1 ++ stb 6,0(dst) ++ addi dst,dst,1 ++2: ++ bf 30,4f ++ lhz 6,0(src) ++ addi src,src,2 ++ sth 6,0(dst) ++ addi dst,dst,2 ++4: ++ bf 29,8f ++ lwz 6,0(src) ++ addi src,src,4 ++ stw 6,0(dst) ++ addi dst,dst,4 ++8: ++#ifdef __LITTLE_ENDIAN__ ++ bf 28,16f ++ ld 6,0(src) ++ addi src,src,8 ++ std 6,0(dst) ++ addi dst,dst,8 ++16: ++#endif ++ subf cnt,0,cnt + ++/* Main aligned copy loop. Copies 128 bytes at a time. */ + L(aligned_copy): +- /* Main aligned copy loop. Copies up to 128-bytes at a time. */ +- .align 4 +-4: +- /* check for any 32-byte or 64-byte lumps that are outside of a +- nice 128-byte range. R8 contains the number of 32-byte +- lumps, so drop this into the CR, and use the SO/EQ bits to help +- handle the 32- or 64- byte lumps. Then handle the rest with an +- unrolled 128-bytes-at-a-time copy loop. */ +- mtocrf 1,8 +- li 6,16 # 16() index +- li 7,32 # 32() index +- li 8,48 # 48() index +- +-L(aligned_32byte): +- /* if the SO bit (indicating a 32-byte lump) is not set, move along. */ +- bns cr7,L(aligned_64byte) +- lxvd2x 6,0,11 +- lxvd2x 7,11,6 +- addi 11,11,32 +- stxvd2x 6,0,10 +- stxvd2x 7,10,6 +- addi 10,10,32 +- +-L(aligned_64byte): +- /* if the EQ bit (indicating a 64-byte lump) is not set, move along. */ +- bne cr7,L(aligned_128setup) +- lxvd2x 6,0,11 +- lxvd2x 7,11,6 +- lxvd2x 8,11,7 +- lxvd2x 9,11,8 +- addi 11,11,64 +- stxvd2x 6,0,10 +- stxvd2x 7,10,6 +- stxvd2x 8,10,7 +- stxvd2x 9,10,8 +- addi 10,10,64 +- +-L(aligned_128setup): +- /* Set up for the 128-byte at a time copy loop. */ +- srdi 8,31,7 +- cmpdi 8,0 # Any 4x lumps left? +- beq 3f # if not, move along. +- lxvd2x 6,0,11 +- lxvd2x 7,11,6 +- mtctr 8 # otherwise, load the ctr and begin. +- li 8,48 # 48() index ++ li 6,16 ++ li 7,32 ++ li 8,48 ++ mtocrf 0x02,cnt ++ srdi 12,cnt,7 ++ cmpdi 12,0 ++ beq L(aligned_tail) ++ lxvd2x 6,0,src ++ lxvd2x 7,src,6 ++ mtctr 12 + b L(aligned_128loop) + ++ .align 4 + L(aligned_128head): + /* for the 2nd + iteration of this loop. */ +- lxvd2x 6,0,11 +- lxvd2x 7,11,6 ++ lxvd2x 6,0,src ++ lxvd2x 7,src,6 + L(aligned_128loop): +- lxvd2x 8,11,7 +- lxvd2x 9,11,8 +- stxvd2x 6,0,10 +- addi 11,11,64 +- stxvd2x 7,10,6 +- stxvd2x 8,10,7 +- stxvd2x 9,10,8 +- lxvd2x 6,0,11 +- lxvd2x 7,11,6 +- addi 10,10,64 +- lxvd2x 8,11,7 +- lxvd2x 9,11,8 +- addi 11,11,64 +- stxvd2x 6,0,10 +- stxvd2x 7,10,6 +- stxvd2x 8,10,7 +- stxvd2x 9,10,8 +- addi 10,10,64 ++ lxvd2x 8,src,7 ++ lxvd2x 9,src,8 ++ stxvd2x 6,0,dst ++ addi src,src,64 ++ stxvd2x 7,dst,6 ++ stxvd2x 8,dst,7 ++ stxvd2x 9,dst,8 ++ lxvd2x 6,0,src ++ lxvd2x 7,src,6 ++ addi dst,dst,64 ++ lxvd2x 8,src,7 ++ lxvd2x 9,src,8 ++ addi src,src,64 ++ stxvd2x 6,0,dst ++ stxvd2x 7,dst,6 ++ stxvd2x 8,dst,7 ++ stxvd2x 9,dst,8 ++ addi dst,dst,64 + bdnz L(aligned_128head) + +-3: +- /* Check for tail bytes. */ +- rldicr 0,31,0,60 +- mtcrf 0x01,31 +- beq cr6,0f +- +-.L9: +- add 3,3,0 +- add 12,12,0 +- +- /* At this point we have a tail of 0-7 bytes and we know that the +- destination is doubleword-aligned. */ +-4: /* Copy 4 bytes. */ +- bf 29,2f +- +- lwz 6,0(12) +- addi 12,12,4 +- stw 6,0(3) +- addi 3,3,4 +-2: /* Copy 2 bytes. */ +- bf 30,1f +- +- lhz 6,0(12) +- addi 12,12,2 +- sth 6,0(3) +- addi 3,3,2 +-1: /* Copy 1 byte. */ +- bf 31,0f +- +- lbz 6,0(12) +- stb 6,0(3) +-0: /* Return original DST pointer. */ +- ld 31,-8(1) +- ld 3,-16(1) ++L(aligned_tail): ++ mtocrf 0x01,cnt ++ bf 25,32f ++ lxvd2x 6,0,src ++ lxvd2x 7,src,6 ++ lxvd2x 8,src,7 ++ lxvd2x 9,src,8 ++ addi src,src,64 ++ stxvd2x 6,0,dst ++ stxvd2x 7,dst,6 ++ stxvd2x 8,dst,7 ++ stxvd2x 9,dst,8 ++ addi dst,dst,64 ++32: ++ bf 26,16f ++ lxvd2x 6,0,src ++ lxvd2x 7,src,6 ++ addi src,src,32 ++ stxvd2x 6,0,dst ++ stxvd2x 7,dst,6 ++ addi dst,dst,32 ++16: ++ bf 27,8f ++ lxvd2x 6,0,src ++ addi src,src,16 ++ stxvd2x 6,0,dst ++ addi dst,dst,16 ++8: ++ bf 28,4f ++ ld 6,0(src) ++ addi src,src,8 ++ std 6,0(dst) ++ addi dst,dst,8 ++4: /* Copies 4~7 bytes. */ ++ bf 29,L(tail2) ++ lwz 6,0(src) ++ stw 6,0(dst) ++ bf 30,L(tail5) ++ lhz 7,4(src) ++ sth 7,4(dst) ++ bflr 31 ++ lbz 8,6(src) ++ stb 8,6(dst) ++ /* Return original DST pointer. */ + blr + +- /* Handle copies of 0~31 bytes. */ +- .align 4 ++ ++/* Handle copies of 0~31 bytes. */ ++ .align 4 + L(copy_LT_32): +- cmpldi cr6,5,8 +- mr 12,4 +- mtcrf 0x01,5 ++ mr dst,3 ++ cmpldi cr6,cnt,8 ++ mtocrf 0x01,cnt + ble cr6,L(copy_LE_8) + + /* At least 9 bytes to go. */ + neg 8,4 +- clrrdi 11,4,2 +- andi. 0,8,3 +- cmpldi cr1,5,16 +- mr 10,5 ++ andi. 0,8,3 ++ cmpldi cr1,cnt,16 + beq L(copy_LT_32_aligned) + +- /* Force 4-bytes alignment for SRC. */ +- mtocrf 0x01,0 +- subf 10,0,5 +-2: bf 30,1f +- +- lhz 6,0(12) +- addi 12,12,2 +- sth 6,0(3) +- addi 3,3,2 +-1: bf 31,L(end_4bytes_alignment) +- +- lbz 6,0(12) +- addi 12,12,1 +- stb 6,0(3) +- addi 3,3,1 ++ /* Force 4-byte alignment for SRC. */ ++ mtocrf 0x01,0 ++ subf cnt,0,cnt ++2: ++ bf 30,1f ++ lhz 6,0(src) ++ addi src,src,2 ++ sth 6,0(dst) ++ addi dst,dst,2 ++1: ++ bf 31,L(end_4bytes_alignment) ++ lbz 6,0(src) ++ addi src,src,1 ++ stb 6,0(dst) ++ addi dst,dst,1 + +- .align 4 ++ .align 4 + L(end_4bytes_alignment): +- cmpldi cr1,10,16 +- mtcrf 0x01,10 ++ cmpldi cr1,cnt,16 ++ mtocrf 0x01,cnt + + L(copy_LT_32_aligned): + /* At least 6 bytes to go, and SRC is word-aligned. */ + blt cr1,8f + + /* Copy 16 bytes. */ +- lwz 6,0(12) +- lwz 7,4(12) +- stw 6,0(3) +- lwz 8,8(12) +- stw 7,4(3) +- lwz 6,12(12) +- addi 12,12,16 +- stw 8,8(3) +- stw 6,12(3) +- addi 3,3,16 ++ lwz 6,0(src) ++ lwz 7,4(src) ++ stw 6,0(dst) ++ lwz 8,8(src) ++ stw 7,4(dst) ++ lwz 6,12(src) ++ addi src,src,16 ++ stw 8,8(dst) ++ stw 6,12(dst) ++ addi dst,dst,16 + 8: /* Copy 8 bytes. */ +- bf 28,4f ++ bf 28,L(tail4) ++ lwz 6,0(src) ++ lwz 7,4(src) ++ addi src,src,8 ++ stw 6,0(dst) ++ stw 7,4(dst) ++ addi dst,dst,8 ++ ++ .align 4 ++/* Copies 4~7 bytes. */ ++L(tail4): ++ bf 29,L(tail2) ++ lwz 6,0(src) ++ stw 6,0(dst) ++ bf 30,L(tail5) ++ lhz 7,4(src) ++ sth 7,4(dst) ++ bflr 31 ++ lbz 8,6(src) ++ stb 8,6(dst) ++ /* Return original DST pointer. */ ++ blr + +- lwz 6,0(12) +- lwz 7,4(12) +- addi 12,12,8 +- stw 6,0(3) +- stw 7,4(3) +- addi 3,3,8 +-4: /* Copy 4 bytes. */ +- bf 29,2f +- +- lwz 6,0(12) +- addi 12,12,4 +- stw 6,0(3) +- addi 3,3,4 +-2: /* Copy 2-3 bytes. */ ++ .align 4 ++/* Copies 2~3 bytes. */ ++L(tail2): + bf 30,1f +- +- lhz 6,0(12) +- sth 6,0(3) +- bf 31,0f +- lbz 7,2(12) +- stb 7,2(3) +- ld 3,-16(1) ++ lhz 6,0(src) ++ sth 6,0(dst) ++ bflr 31 ++ lbz 7,2(src) ++ stb 7,2(dst) + blr + +- .align 4 +-1: /* Copy 1 byte. */ +- bf 31,0f ++ .align 4 ++L(tail5): ++ bflr 31 ++ lbz 6,4(src) ++ stb 6,4(dst) ++ blr + +- lbz 6,0(12) +- stb 6,0(3) +-0: /* Return original DST pointer. */ +- ld 3,-16(1) ++ .align 4 ++1: ++ bflr 31 ++ lbz 6,0(src) ++ stb 6,0(dst) ++ /* Return original DST pointer. */ + blr + +- /* Handles copies of 0~8 bytes. */ +- .align 4 ++ ++/* Handles copies of 0~8 bytes. */ ++ .align 4 + L(copy_LE_8): +- bne cr6,4f ++ bne cr6,L(tail4) + + /* Though we could've used ld/std here, they are still + slow for unaligned cases. */ + +- lwz 6,0(4) +- lwz 7,4(4) +- stw 6,0(3) +- stw 7,4(3) +- ld 3,-16(1) /* Return original DST pointers. */ ++ lwz 6,0(src) ++ lwz 7,4(src) ++ stw 6,0(dst) ++ stw 7,4(dst) + blr + +- .align 4 +-4: /* Copies 4~7 bytes. */ +- bf 29,2b + +- lwz 6,0(4) +- stw 6,0(3) +- bf 30,5f +- lhz 7,4(4) +- sth 7,4(3) +- bf 31,0f +- lbz 8,6(4) +- stb 8,6(3) +- ld 3,-16(1) +- blr +- +- .align 4 +-5: /* Copy 1 byte. */ +- bf 31,0f +- +- lbz 6,4(4) +- stb 6,4(3) +- +-0: /* Return original DST pointer. */ +- ld 3,-16(1) +- blr +- +- /* Handle copies of 32+ bytes where DST is aligned (to quadword) but +- SRC is not. Use aligned quadword loads from SRC, shifted to realign +- the data, allowing for aligned DST stores. */ +- .align 4 ++/* Handle copies of 32+ bytes where DST is aligned (to quadword) but ++ SRC is not. Use aligned quadword loads from SRC, shifted to realign ++ the data, allowing for aligned DST stores. */ ++ .align 4 + L(copy_GE_32_unaligned): +- clrldi 0,0,60 /* Number of bytes until the 1st +- quadword. */ +- andi. 11,3,15 /* Check alignment of DST (against +- quadwords). */ +- srdi 9,5,4 /* Number of full quadwords remaining. */ ++ clrldi 0,0,60 /* Number of bytes until the 1st dst quadword. */ ++#ifndef __LITTLE_ENDIAN__ ++ andi. 10,3,15 /* Check alignment of DST (against quadwords). */ ++#endif ++ srdi 9,cnt,4 /* Number of full quadwords remaining. */ + + beq L(copy_GE_32_unaligned_cont) + +- /* SRC is not quadword aligned, get it aligned. */ ++ /* DST is not quadword aligned, get it aligned. */ + +- mtcrf 0x01,0 +- subf 31,0,5 ++ mtocrf 0x01,0 ++ subf cnt,0,cnt + + /* Vector instructions work best when proper alignment (16-bytes) + is present. Move 0~15 bytes as needed to get DST quadword-aligned. */ +-1: /* Copy 1 byte. */ ++1: + bf 31,2f +- +- lbz 6,0(12) +- addi 12,12,1 +- stb 6,0(3) +- addi 3,3,1 +-2: /* Copy 2 bytes. */ ++ lbz 6,0(src) ++ addi src,src,1 ++ stb 6,0(dst) ++ addi dst,dst,1 ++2: + bf 30,4f +- +- lhz 6,0(12) +- addi 12,12,2 +- sth 6,0(3) +- addi 3,3,2 +-4: /* Copy 4 bytes. */ ++ lhz 6,0(src) ++ addi src,src,2 ++ sth 6,0(dst) ++ addi dst,dst,2 ++4: + bf 29,8f +- +- lwz 6,0(12) +- addi 12,12,4 +- stw 6,0(3) +- addi 3,3,4 +-8: /* Copy 8 bytes. */ ++ lwz 6,0(src) ++ addi src,src,4 ++ stw 6,0(dst) ++ addi dst,dst,4 ++8: + bf 28,0f +- +- ld 6,0(12) +- addi 12,12,8 +- std 6,0(3) +- addi 3,3,8 ++ ld 6,0(src) ++ addi src,src,8 ++ std 6,0(dst) ++ addi dst,dst,8 + 0: +- clrldi 10,12,60 /* Check alignment of SRC. */ +- srdi 9,31,4 /* Number of full quadwords remaining. */ ++ srdi 9,cnt,4 /* Number of full quadwords remaining. */ + + /* The proper alignment is present, it is OK to copy the bytes now. */ + L(copy_GE_32_unaligned_cont): + + /* Setup two indexes to speed up the indexed vector operations. */ +- clrldi 11,31,60 +- li 6,16 /* Index for 16-bytes offsets. */ ++ clrldi 10,cnt,60 ++ li 6,16 /* Index for 16-bytes offsets. */ + li 7,32 /* Index for 32-bytes offsets. */ +- cmpldi cr1,11,0 +- srdi 8,31,5 /* Setup the loop counter. */ +- mr 10,3 +- mr 11,12 +- mtcrf 0x01,9 +- cmpldi cr6,9,1 +- lvsl 5,0,12 +- lvx 3,0,12 +- bf 31,L(setup_unaligned_loop) +- +- /* Copy another 16 bytes to align to 32-bytes due to the loop . */ +- lvx 4,12,6 +- vperm 6,3,4,5 +- addi 11,12,16 +- addi 10,3,16 +- stvx 6,0,3 ++ cmpldi cr1,10,0 ++ srdi 8,cnt,5 /* Setup the loop counter. */ ++ mtocrf 0x01,9 ++ cmpldi cr6,9,1 ++#ifdef __LITTLE_ENDIAN__ ++ lvsr 5,0,src ++#else ++ lvsl 5,0,src ++#endif ++ lvx 3,0,src ++ li 0,0 ++ bf 31,L(setup_unaligned_loop) ++ ++ /* Copy another 16 bytes to align to 32-bytes due to the loop. */ ++ lvx 4,src,6 ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else ++ vperm 6,3,4,5 ++#endif ++ addi src,src,16 ++ stvx 6,0,dst ++ addi dst,dst,16 + vor 3,4,4 ++ clrrdi 0,src,60 + + L(setup_unaligned_loop): +- mtctr 8 +- ble cr6,L(end_unaligned_loop) ++ mtctr 8 ++ ble cr6,L(end_unaligned_loop) + + /* Copy 32 bytes at a time using vector instructions. */ +- .align 4 ++ .align 4 + L(unaligned_loop): + + /* Note: vr6/vr10 may contain data that was already copied, +@@ -444,63 +385,56 @@ + some portions again. This is faster than having unaligned + vector instructions though. */ + +- lvx 4,11,6 /* vr4 = r11+16. */ +- vperm 6,3,4,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr6. */ +- lvx 3,11,7 /* vr3 = r11+32. */ +- vperm 10,4,3,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr10. */ +- addi 11,11,32 +- stvx 6,0,10 +- stvx 10,10,6 +- addi 10,10,32 +- ++ lvx 4,src,6 ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else ++ vperm 6,3,4,5 ++#endif ++ lvx 3,src,7 ++#ifdef __LITTLE_ENDIAN__ ++ vperm 10,3,4,5 ++#else ++ vperm 10,4,3,5 ++#endif ++ addi src,src,32 ++ stvx 6,0,dst ++ stvx 10,dst,6 ++ addi dst,dst,32 + bdnz L(unaligned_loop) + +- .align 4 ++ clrrdi 0,src,60 ++ ++ .align 4 + L(end_unaligned_loop): + + /* Check for tail bytes. */ +- rldicr 0,31,0,59 +- mtcrf 0x01,31 +- beq cr1,0f ++ mtocrf 0x01,cnt ++ beqlr cr1 + +- add 3,3,0 +- add 12,12,0 ++ add src,src,0 + + /* We have 1~15 tail bytes to copy, and DST is quadword aligned. */ +-8: /* Copy 8 bytes. */ ++ /* Copy 8 bytes. */ + bf 28,4f +- +- lwz 6,0(12) +- lwz 7,4(12) +- addi 12,12,8 +- stw 6,0(3) +- stw 7,4(3) +- addi 3,3,8 +-4: /* Copy 4 bytes. */ +- bf 29,2f +- +- lwz 6,0(12) +- addi 12,12,4 +- stw 6,0(3) +- addi 3,3,4 +-2: /* Copy 2~3 bytes. */ +- bf 30,1f +- +- lhz 6,0(12) +- addi 12,12,2 +- sth 6,0(3) +- addi 3,3,2 +-1: /* Copy 1 byte. */ +- bf 31,0f +- +- lbz 6,0(12) +- stb 6,0(3) +-0: /* Return original DST pointer. */ +- ld 31,-8(1) +- ld 3,-16(1) ++ lwz 6,0(src) ++ lwz 7,4(src) ++ addi src,src,8 ++ stw 6,0(dst) ++ stw 7,4(dst) ++ addi dst,dst,8 ++4: /* Copy 4~7 bytes. */ ++ bf 29,L(tail2) ++ lwz 6,0(src) ++ stw 6,0(dst) ++ bf 30,L(tail5) ++ lhz 7,4(src) ++ sth 7,4(dst) ++ bflr 31 ++ lbz 8,6(src) ++ stb 8,6(dst) ++ /* Return original DST pointer. */ + blr + +-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS) ++END_GEN_TB (memcpy,TB_TOCLESS) + libc_hidden_builtin_def (memcpy) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/mempcpy.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/mempcpy.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/mempcpy.S 2014-05-29 13:04:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/mempcpy.S 2014-05-29 13:04:56.000000000 -0500 +@@ -367,13 +367,21 @@ + mr 11,12 + mtcrf 0x01,9 + cmpldi cr6,9,1 +- lvsl 5,0,12 ++#ifdef __LITTLE_ENDIAN__ ++ lvsr 5,0,12 ++#else ++ lvsl 5,0,12 ++#endif + lvx 3,0,12 + bf 31,L(setup_unaligned_loop) + + /* Copy another 16 bytes to align to 32-bytes due to the loop . */ + lvx 4,12,6 +- vperm 6,3,4,5 ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else ++ vperm 6,3,4,5 ++#endif + addi 11,12,16 + addi 10,3,16 + stvx 6,0,3 +@@ -393,11 +401,17 @@ + vector instructions though. */ + + lvx 4,11,6 /* vr4 = r11+16. */ +- vperm 6,3,4,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr6. */ ++#ifdef __LITTLE_ENDIAN__ ++ vperm 6,4,3,5 ++#else ++ vperm 6,3,4,5 ++#endif + lvx 3,11,7 /* vr3 = r11+32. */ +- vperm 10,4,3,5 /* Merge the correctly-aligned portions +- of vr3/vr4 into vr10. */ ++#ifdef __LITTLE_ENDIAN__ ++ vperm 10,3,4,5 ++#else ++ vperm 10,4,3,5 ++#endif + addi 11,11,32 + stvx 6,0,10 + stvx 10,10,6 diff --git a/SOURCES/glibc-ppc64le-32.patch b/SOURCES/glibc-ppc64le-32.patch new file mode 100644 index 0000000..058d53a --- /dev/null +++ b/SOURCES/glibc-ppc64le-32.patch @@ -0,0 +1,272 @@ +# commit 3be87c77d24c4456ccca4034363b6d1814cd0c84 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:47:59 2013 +0930 +# +# PowerPC LE memset +# http://sourceware.org/ml/libc-alpha/2013-08/msg00104.html +# +# One of the things I noticed when looking at power7 timing is that rlwimi +# is cracked and the two resulting insns have a register dependency. +# That makes it a little slower than the equivalent rldimi. +# +# * sysdeps/powerpc/powerpc64/memset.S: Replace rlwimi with +# insrdi. Formatting. +# * sysdeps/powerpc/powerpc64/power4/memset.S: Likewise. +# * sysdeps/powerpc/powerpc64/power6/memset.S: Likewise. +# * sysdeps/powerpc/powerpc64/power7/memset.S: Likewise. +# * sysdeps/powerpc/powerpc32/power4/memset.S: Likewise. +# * sysdeps/powerpc/powerpc32/power6/memset.S: Likewise. +# * sysdeps/powerpc/powerpc32/power7/memset.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memset.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memset.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memset.S 2014-05-29 13:07:41.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/memset.S 2014-05-29 13:07:46.000000000 -0500 +@@ -52,7 +52,7 @@ + + /* Align to word boundary. */ + cmplwi cr5, rLEN, 31 +- rlwimi rCHR, rCHR, 8, 16, 23 /* Replicate byte to halfword. */ ++ insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */ + beq+ L(aligned) + mtcrf 0x01, rMEMP0 + subfic rALIGN, rALIGN, 4 +@@ -67,7 +67,7 @@ + /* Handle the case of size < 31. */ + L(aligned): + mtcrf 0x01, rLEN +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + ble cr5, L(medium) + /* Align to 32-byte boundary. */ + andi. rALIGN, rMEMP, 0x1C +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memset.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memset.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memset.S 2014-05-29 13:07:41.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power6/memset.S 2014-05-29 13:07:46.000000000 -0500 +@@ -50,7 +50,7 @@ + ble- cr1, L(small) + /* Align to word boundary. */ + cmplwi cr5, rLEN, 31 +- rlwimi rCHR, rCHR, 8, 16, 23 /* Replicate byte to halfword. */ ++ insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */ + beq+ L(aligned) + mtcrf 0x01, rMEMP0 + subfic rALIGN, rALIGN, 4 +@@ -66,7 +66,7 @@ + /* Handle the case of size < 31. */ + L(aligned): + mtcrf 0x01, rLEN +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + ble cr5, L(medium) + /* Align to 32-byte boundary. */ + andi. rALIGN, rMEMP, 0x1C +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memset.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memset.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memset.S 2014-05-29 13:07:41.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memset.S 2014-05-29 13:07:46.000000000 -0500 +@@ -37,8 +37,8 @@ + cfi_offset(31,-8) + + /* Replicate byte to word. */ +- rlwimi 4,4,8,16,23 +- rlwimi 4,4,16,0,15 ++ insrdi 4,4,8,48 ++ insrdi 4,4,16,32 + + ble cr6,L(small) /* If length <= 8, use short copy code. */ + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memset.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memset.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memset.S 2014-05-29 13:07:41.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/memset.S 2014-05-29 13:07:46.000000000 -0500 +@@ -73,14 +73,14 @@ + + /* Align to doubleword boundary. */ + cmpldi cr5, rLEN, 31 +- rlwimi rCHR, rCHR, 8, 16, 23 /* Replicate byte to halfword. */ ++ insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */ + beq+ L(aligned2) + mtcrf 0x01, rMEMP0 + subfic rALIGN, rALIGN, 8 + cror 28,30,31 /* Detect odd word aligned. */ + add rMEMP, rMEMP, rALIGN + sub rLEN, rLEN, rALIGN +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + bt 29, L(g4) + /* Process the even word of doubleword. */ + bf+ 31, L(g2) +@@ -102,14 +102,14 @@ + + /* Handle the case of size < 31. */ + L(aligned2): +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + L(aligned): + mtcrf 0x01, rLEN + ble cr5, L(medium) + /* Align to 32-byte boundary. */ + andi. rALIGN, rMEMP, 0x18 + subfic rALIGN, rALIGN, 0x20 +- insrdi rCHR,rCHR,32,0 /* Replicate word to double word. */ ++ insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */ + beq L(caligned) + mtcrf 0x01, rALIGN + add rMEMP, rMEMP, rALIGN +@@ -230,7 +230,7 @@ + /* Memset of 0-31 bytes. */ + .align 5 + L(medium): +- insrdi rCHR,rCHR,32,0 /* Replicate word to double word. */ ++ insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */ + cmpldi cr1, rLEN, 16 + L(medium_tail2): + add rMEMP, rMEMP, rLEN +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memset.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memset.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memset.S 2014-05-29 13:07:41.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power4/memset.S 2014-05-29 13:07:46.000000000 -0500 +@@ -68,14 +68,14 @@ + + /* Align to doubleword boundary. */ + cmpldi cr5, rLEN, 31 +- rlwimi rCHR, rCHR, 8, 16, 23 /* Replicate byte to halfword. */ ++ insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */ + beq+ L(aligned2) + mtcrf 0x01, rMEMP0 + subfic rALIGN, rALIGN, 8 + cror 28,30,31 /* Detect odd word aligned. */ + add rMEMP, rMEMP, rALIGN + sub rLEN, rLEN, rALIGN +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + bt 29, L(g4) + /* Process the even word of doubleword. */ + bf+ 31, L(g2) +@@ -97,14 +97,14 @@ + + /* Handle the case of size < 31. */ + L(aligned2): +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + L(aligned): + mtcrf 0x01, rLEN + ble cr5, L(medium) + /* Align to 32-byte boundary. */ + andi. rALIGN, rMEMP, 0x18 + subfic rALIGN, rALIGN, 0x20 +- insrdi rCHR,rCHR,32,0 /* Replicate word to double word. */ ++ insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */ + beq L(caligned) + mtcrf 0x01, rALIGN + add rMEMP, rMEMP, rALIGN +@@ -164,24 +164,24 @@ + L(getCacheAligned): + cmpldi cr1,rLEN,32 + andi. rTMP,rMEMP,127 +- blt cr1,L(handletail32) +- beq L(cacheAligned) ++ blt cr1,L(handletail32) ++ beq L(cacheAligned) + addi rMEMP,rMEMP,32 + addi rLEN,rLEN,-32 +- std rCHR,-32(rMEMP) +- std rCHR,-24(rMEMP) +- std rCHR,-16(rMEMP) +- std rCHR,-8(rMEMP) +- b L(getCacheAligned) ++ std rCHR,-32(rMEMP) ++ std rCHR,-24(rMEMP) ++ std rCHR,-16(rMEMP) ++ std rCHR,-8(rMEMP) ++ b L(getCacheAligned) + + /* Now we are aligned to the cache line and can use dcbz. */ + L(cacheAligned): + cmpld cr1,rLEN,rCLS +- blt cr1,L(handletail32) ++ blt cr1,L(handletail32) + dcbz 0,rMEMP + subf rLEN,rCLS,rLEN +- add rMEMP,rMEMP,rCLS +- b L(cacheAligned) ++ add rMEMP,rMEMP,rCLS ++ b L(cacheAligned) + + /* We are here because the cache line size was set and was not 32-bytes + and the remainder (rLEN) is less than the actual cache line size. +@@ -218,7 +218,7 @@ + /* Memset of 0-31 bytes. */ + .align 5 + L(medium): +- insrdi rCHR,rCHR,32,0 /* Replicate word to double word. */ ++ insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */ + cmpldi cr1, rLEN, 16 + L(medium_tail2): + add rMEMP, rMEMP, rLEN +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memset.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memset.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memset.S 2014-05-29 13:07:41.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power6/memset.S 2014-05-29 13:07:46.000000000 -0500 +@@ -65,14 +65,14 @@ + + /* Align to doubleword boundary. */ + cmpldi cr5, rLEN, 31 +- rlwimi rCHR, rCHR, 8, 16, 23 /* Replicate byte to halfword. */ ++ insrdi rCHR, rCHR, 8, 48 /* Replicate byte to halfword. */ + beq+ L(aligned2) + mtcrf 0x01, rMEMP0 + subfic rALIGN, rALIGN, 8 + cror 28,30,31 /* Detect odd word aligned. */ + add rMEMP, rMEMP, rALIGN + sub rLEN, rLEN, rALIGN +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + bt 29, L(g4) + /* Process the even word of doubleword. */ + bf+ 31, L(g2) +@@ -94,14 +94,14 @@ + + /* Handle the case of size < 31. */ + L(aligned2): +- rlwimi rCHR, rCHR, 16, 0, 15 /* Replicate halfword to word. */ ++ insrdi rCHR, rCHR, 16, 32 /* Replicate halfword to word. */ + L(aligned): + mtcrf 0x01, rLEN + ble cr5, L(medium) + /* Align to 32-byte boundary. */ + andi. rALIGN, rMEMP, 0x18 + subfic rALIGN, rALIGN, 0x20 +- insrdi rCHR,rCHR,32,0 /* Replicate word to double word. */ ++ insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */ + beq L(caligned) + mtcrf 0x01, rALIGN + add rMEMP, rMEMP, rALIGN +@@ -362,7 +362,7 @@ + /* Memset of 0-31 bytes. */ + .align 5 + L(medium): +- insrdi rCHR,rCHR,32,0 /* Replicate word to double word. */ ++ insrdi rCHR, rCHR, 32, 0 /* Replicate word to double word. */ + cmpldi cr1, rLEN, 16 + L(medium_tail2): + add rMEMP, rMEMP, rLEN +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memset.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memset.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memset.S 2014-05-29 13:07:41.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memset.S 2014-05-29 13:07:46.000000000 -0500 +@@ -34,8 +34,8 @@ + mr 10,3 + + /* Replicate byte to word. */ +- rlwimi 4,4,8,16,23 +- rlwimi 4,4,16,0,15 ++ insrdi 4,4,8,48 ++ insrdi 4,4,16,32 + ble cr6,L(small) /* If length <= 8, use short copy code. */ + + neg 0,3 +@@ -323,7 +323,7 @@ + clrldi 0,0,62 + beq L(medium_aligned) + +- /* Force 4-bytes alignment for SRC. */ ++ /* Force 4-bytes alignment for DST. */ + mtocrf 0x01,0 + subf 5,0,5 + 1: /* Copy 1 byte. */ diff --git a/SOURCES/glibc-ppc64le-33.patch b/SOURCES/glibc-ppc64le-33.patch new file mode 100644 index 0000000..9da11df --- /dev/null +++ b/SOURCES/glibc-ppc64le-33.patch @@ -0,0 +1,1255 @@ +# commit 466b03933234017473c12dd1d92bda5e7fe49df7 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:48:36 2013 +0930 +# +# PowerPC LE memchr and memrchr +# http://sourceware.org/ml/libc-alpha/2013-08/msg00105.html +# +# Like strnlen, memchr and memrchr had a number of defects fixed by this +# patch as well as adding little-endian support. The first one I +# noticed was that the entry to the main loop needlessly checked for +# "are we done yet?" when we know the size is large enough that we can't +# be done. The second defect I noticed was that the main loop count was +# wrong, which in turn meant that the small loop needed to handle an +# extra word. Thirdly, there is nothing to say that the string can't +# wrap around zero, except of course that we'd normally hit a segfault +# on trying to read from address zero. Fixing that simplified a number +# of places: +# +# - /* Are we done already? */ +# - addi r9,r8,8 +# - cmpld r9,r7 +# - bge L(null) +# +# becomes +# +# + cmpld r8,r7 +# + beqlr +# +# However, the exit gets an extra test because I test for being on the +# last word then if so whether the byte offset is less than the end. +# Overall, the change is a win. +# +# Lastly, memrchr used the wrong cache hint. +# +# * sysdeps/powerpc/powerpc64/power7/memchr.S: Replace rlwimi with +# insrdi. Make better use of reg selection to speed exit slightly. +# Schedule entry path a little better. Remove useless "are we done" +# checks on entry to main loop. Handle wrapping around zero address. +# Correct main loop count. Handle single left-over word from main +# loop inline rather than by using loop_small. Remove extra word +# case in loop_small caused by wrong loop count. Add little-endian +# support. +# * sysdeps/powerpc/powerpc32/power7/memchr.S: Likewise. +# * sysdeps/powerpc/powerpc64/power7/memrchr.S: Likewise. Use proper +# cache hint. +# * sysdeps/powerpc/powerpc32/power7/memrchr.S: Likewise. +# * sysdeps/powerpc/powerpc64/power7/rawmemchr.S: Add little-endian +# support. Avoid rlwimi. +# * sysdeps/powerpc/powerpc32/power7/rawmemchr.S: Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memchr.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memchr.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memchr.S 2014-05-29 13:09:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memchr.S 2014-05-29 13:13:37.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memchr implementation for PowerPC32/POWER7 using cmpb insn. +- Copyright (C) 2010-2012 Free Software Foundation, Inc. ++ Copyright (C) 2010-2014 Free Software Foundation, Inc. + Contributed by Luis Machado <luisgpm@br.ibm.com>. + This file is part of the GNU C Library. + +@@ -18,116 +18,118 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + /* int [r3] memchr (char *s [r3], int byte [r4], int size [r5]) */ + .machine power7 +-ENTRY (BP_SYM (__memchr)) ++ENTRY (__memchr) + CALL_MCOUNT + dcbt 0,r3 + clrrwi r8,r3,2 +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrwi r4,r4,8,16 /* Replicate byte to word. */ + add r7,r3,r5 /* Calculate the last acceptable address. */ ++ insrwi r4,r4,16,0 + cmplwi r5,16 ++ li r9, -1 ++ rlwinm r6,r3,3,27,28 /* Calculate padding. */ ++ addi r7,r7,-1 ++#ifdef __LITTLE_ENDIAN__ ++ slw r9,r9,r6 ++#else ++ srw r9,r9,r6 ++#endif + ble L(small_range) + +- cmplw cr7,r3,r7 /* Compare the starting address (r3) with the +- ending address (r7). If (r3 >= r7), the size +- passed in is zero or negative. */ +- ble cr7,L(proceed) +- +- li r7,-1 /* Artificially set our ending address (r7) +- such that we will exit early. */ +-L(proceed): +- rlwinm r6,r3,3,27,28 /* Calculate padding. */ +- cmpli cr6,r6,0 /* cr6 == Do we have padding? */ + lwz r12,0(r8) /* Load word from memory. */ +- cmpb r10,r12,r4 /* Check for BYTE's in WORD1. */ +- beq cr6,L(proceed_no_padding) +- slw r10,r10,r6 +- srw r10,r10,r6 +-L(proceed_no_padding): +- cmplwi cr7,r10,0 /* If r10 == 0, no BYTEs have been found. */ ++ cmpb r3,r12,r4 /* Check for BYTEs in WORD1. */ ++ and r3,r3,r9 ++ clrlwi r5,r7,30 /* Byte count - 1 in last word. */ ++ clrrwi r7,r7,2 /* Address of last word. */ ++ cmplwi cr7,r3,0 /* If r3 == 0, no BYTEs have been found. */ + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,4 +- cmplw cr6,r9,r7 +- bge cr6,L(null) +- + mtcrf 0x01,r8 + /* Are we now aligned to a doubleword boundary? If so, skip to + the main loop. Otherwise, go through the alignment code. */ +- + bt 29,L(loop_setup) + + /* Handle WORD2 of pair. */ + lwzu r12,4(r8) +- cmpb r10,r12,r4 +- cmplwi cr7,r10,0 ++ cmpb r3,r12,r4 ++ cmplwi cr7,r3,0 + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,4 +- cmplw cr6,r9,r7 +- bge cr6,L(null) +- + L(loop_setup): +- sub r5,r7,r9 +- srwi r6,r5,3 /* Number of loop iterations. */ ++ /* The last word we want to read in the loop below is the one ++ containing the last byte of the string, ie. the word at ++ (s + size - 1) & ~3, or r7. The first word read is at ++ r8 + 4, we read 2 * cnt words, so the last word read will ++ be at r8 + 4 + 8 * cnt - 4. Solving for cnt gives ++ cnt = (r7 - r8) / 8 */ ++ sub r6,r7,r8 ++ srwi r6,r6,3 /* Number of loop iterations. */ + mtctr r6 /* Setup the counter. */ +- b L(loop) +- /* Main loop to look for BYTE backwards in the string. Since +- it's a small loop (< 8 instructions), align it to 32-bytes. */ +- .p2align 5 ++ ++ /* Main loop to look for BYTE in the string. Since ++ it's a small loop (8 instructions), align it to 32-bytes. */ ++ .align 5 + L(loop): + /* Load two words, compare and merge in a + single register for speed. This is an attempt + to speed up the byte-checking process for bigger strings. */ + lwz r12,4(r8) + lwzu r11,8(r8) +- cmpb r10,r12,r4 ++ cmpb r3,r12,r4 + cmpb r9,r11,r4 +- or r5,r9,r10 /* Merge everything in one word. */ +- cmplwi cr7,r5,0 ++ or r6,r9,r3 /* Merge everything in one word. */ ++ cmplwi cr7,r6,0 + bne cr7,L(found) + bdnz L(loop) + +- /* We're here because the counter reached 0, and that means we +- didn't have any matches for BYTE in the whole range. */ +- subi r11,r7,4 +- cmplw cr6,r8,r11 +- blt cr6,L(loop_small) +- b L(null) ++ /* We may have one more dword to read. */ ++ cmplw r8,r7 ++ beqlr + ++ lwzu r12,4(r8) ++ cmpb r3,r12,r4 ++ cmplwi cr6,r3,0 ++ bne cr6,L(done) ++ blr ++ ++ .align 4 ++L(found): + /* OK, one (or both) of the words contains BYTE. Check + the first word and decrement the address in case the first + word really contains BYTE. */ +- .align 4 +-L(found): +- cmplwi cr6,r10,0 ++ cmplwi cr6,r3,0 + addi r8,r8,-4 + bne cr6,L(done) + + /* BYTE must be in the second word. Adjust the address +- again and move the result of cmpb to r10 so we can calculate the ++ again and move the result of cmpb to r3 so we can calculate the + pointer. */ + +- mr r10,r9 ++ mr r3,r9 + addi r8,r8,4 + +- /* r10 has the output of the cmpb instruction, that is, it contains ++ /* r3 has the output of the cmpb instruction, that is, it contains + 0xff in the same position as BYTE in the original + word from the string. Use that to calculate the pointer. + We need to make sure BYTE is *before* the end of the range. */ + L(done): +- cntlzw r0,r10 /* Count leading zeroes before the match. */ +- srwi r0,r0,3 /* Convert leading zeroes to bytes. */ ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r3,-1 ++ andc r0,r0,r3 ++ popcntw r0,r0 /* Count trailing zeros. */ ++#else ++ cntlzw r0,r3 /* Count leading zeros before the match. */ ++#endif ++ cmplw r8,r7 /* Are we on the last word? */ ++ srwi r0,r0,3 /* Convert leading/trailing zeros to bytes. */ + add r3,r8,r0 +- cmplw r3,r7 +- bge L(null) ++ cmplw cr7,r0,r5 /* If on the last dword, check byte offset. */ ++ bnelr ++ blelr cr7 ++ li r3,0 + blr + + .align 4 +@@ -139,69 +141,44 @@ + .align 4 + L(small_range): + cmplwi r5,0 +- rlwinm r6,r3,3,27,28 /* Calculate padding. */ +- beq L(null) /* This branch is for the cmplwi r5,0 above */ ++ beq L(null) + lwz r12,0(r8) /* Load word from memory. */ +- cmplwi cr6,r6,0 /* cr6 == Do we have padding? */ +- cmpb r10,r12,r4 /* Check for BYTE in DWORD1. */ +- beq cr6,L(small_no_padding) +- slw r10,r10,r6 +- srw r10,r10,r6 +-L(small_no_padding): +- cmplwi cr7,r10,0 ++ cmpb r3,r12,r4 /* Check for BYTE in DWORD1. */ ++ and r3,r3,r9 ++ cmplwi cr7,r3,0 ++ clrlwi r5,r7,30 /* Byte count - 1 in last word. */ ++ clrrwi r7,r7,2 /* Address of last word. */ ++ cmplw r8,r7 /* Are we done already? */ + bne cr7,L(done) ++ beqlr + +- /* Are we done already? */ +- addi r9,r8,4 +- cmplw r9,r7 +- bge L(null) +- +-L(loop_small): /* loop_small has been unrolled. */ + lwzu r12,4(r8) +- cmpb r10,r12,r4 +- addi r9,r8,4 +- cmplwi cr6,r10,0 +- cmplw r9,r7 ++ cmpb r3,r12,r4 ++ cmplwi cr6,r3,0 ++ cmplw r8,r7 + bne cr6,L(done) +- bge L(null) ++ beqlr + + lwzu r12,4(r8) +- cmpb r10,r12,r4 +- addi r9,r8,4 +- cmplwi cr6,r10,0 +- cmplw r9,r7 ++ cmpb r3,r12,r4 ++ cmplwi cr6,r3,0 ++ cmplw r8,r7 + bne cr6,L(done) +- bge L(null) ++ beqlr + + lwzu r12,4(r8) +- cmpb r10,r12,r4 +- addi r9,r8,4 +- cmplwi cr6,r10,0 +- cmplw r9,r7 ++ cmpb r3,r12,r4 ++ cmplwi cr6,r3,0 ++ cmplw r8,r7 + bne cr6,L(done) +- bge L(null) ++ beqlr + + lwzu r12,4(r8) +- cmpb r10,r12,r4 +- addi r9,r8,4 +- cmplwi cr6,r10,0 +- cmplw r9,r7 ++ cmpb r3,r12,r4 ++ cmplwi cr6,r3,0 + bne cr6,L(done) +- bge L(null) +- +- /* For most cases we will never get here. Under some combinations of +- padding + length there is a leftover word that still needs to be +- checked. */ +- lwzu r12,4(r8) +- cmpb r10,r12,r4 +- addi r9,r8,4 +- cmplwi cr6,r10,0 +- bne cr6,L(done) +- +- /* save a branch and exit directly */ +- li r3,0 + blr + +-END (BP_SYM (__memchr)) +-weak_alias (BP_SYM (__memchr), BP_SYM(memchr)) ++END (__memchr) ++weak_alias (__memchr, memchr) + libc_hidden_builtin_def (memchr) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memrchr.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memrchr.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memrchr.S 2014-05-29 13:09:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/memrchr.S 2014-05-29 13:13:47.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memrchr implementation for PowerPC32/POWER7 using cmpb insn. +- Copyright (C) 2010 Free Software Foundation, Inc. ++ Copyright (C) 2010-2014 Free Software Foundation, Inc. + Contributed by Luis Machado <luisgpm@br.ibm.com>. + This file is part of the GNU C Library. + +@@ -18,124 +18,136 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + /* int [r3] memrchr (char *s [r3], int byte [r4], int size [r5]) */ + .machine power7 +-ENTRY (BP_SYM (__memrchr)) ++ENTRY (__memrchr) + CALL_MCOUNT +- dcbt 0,r3 +- mr r7,r3 +- add r3,r7,r5 /* Calculate the last acceptable address. */ +- cmplw cr7,r3,r7 /* Is the address equal or less than r3? */ ++ add r7,r3,r5 /* Calculate the last acceptable address. */ ++ neg r0,r7 ++ addi r7,r7,-1 ++ mr r10,r3 ++ clrrwi r6,r7,7 ++ li r9,3<<5 ++ dcbt r9,r6,16 /* Stream hint, decreasing addresses. */ + + /* Replicate BYTE to word. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 +- bge cr7,L(proceed) +- +- li r3,-1 /* Make r11 the biggest if r4 <= 0. */ +-L(proceed): ++ insrwi r4,r4,8,16 ++ insrwi r4,r4,16,0 + li r6,-4 +- addi r9,r3,-1 +- clrrwi r8,r9,2 +- addi r8,r8,4 +- neg r0,r3 ++ li r9,-1 + rlwinm r0,r0,3,27,28 /* Calculate padding. */ +- ++ clrrwi r8,r7,2 ++ srw r9,r9,r0 + cmplwi r5,16 ++ clrrwi r0,r10,2 + ble L(small_range) + +- lwbrx r12,r8,r6 /* Load reversed word from memory. */ +- cmpb r10,r12,r4 /* Check for BYTE in WORD1. */ +- slw r10,r10,r0 +- srw r10,r10,r0 +- cmplwi cr7,r10,0 /* If r10 == 0, no BYTE's have been found. */ ++#ifdef __LITTLE_ENDIAN__ ++ lwzx r12,0,r8 ++#else ++ lwbrx r12,0,r8 /* Load reversed word from memory. */ ++#endif ++ cmpb r3,r12,r4 /* Check for BYTE in WORD1. */ ++ and r3,r3,r9 ++ cmplwi cr7,r3,0 /* If r3 == 0, no BYTEs have been found. */ + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,-4 +- cmplw cr6,r9,r7 +- ble cr6,L(null) +- + mtcrf 0x01,r8 + /* Are we now aligned to a doubleword boundary? If so, skip to + the main loop. Otherwise, go through the alignment code. */ +- mr r8,r9 +- bt 29,L(loop_setup) ++ bf 29,L(loop_setup) + + /* Handle WORD2 of pair. */ ++#ifdef __LITTLE_ENDIAN__ ++ lwzx r12,r8,r6 ++#else + lwbrx r12,r8,r6 +- cmpb r10,r12,r4 +- cmplwi cr7,r10,0 +- bne cr7,L(done) +- +- /* Are we done already? */ ++#endif + addi r8,r8,-4 +- cmplw cr6,r8,r7 +- ble cr6,L(null) ++ cmpb r3,r12,r4 ++ cmplwi cr7,r3,0 ++ bne cr7,L(done) + + L(loop_setup): +- li r0,-8 +- sub r5,r8,r7 +- srwi r9,r5,3 /* Number of loop iterations. */ ++ /* The last word we want to read in the loop below is the one ++ containing the first byte of the string, ie. the word at ++ s & ~3, or r0. The first word read is at r8 - 4, we ++ read 2 * cnt words, so the last word read will be at ++ r8 - 4 - 8 * cnt + 4. Solving for cnt gives ++ cnt = (r8 - r0) / 8 */ ++ sub r5,r8,r0 ++ addi r8,r8,-4 ++ srwi r9,r5,3 /* Number of loop iterations. */ + mtctr r9 /* Setup the counter. */ +- b L(loop) +- /* Main loop to look for BYTE backwards in the string. Since it's a +- small loop (< 8 instructions), align it to 32-bytes. */ +- .p2align 5 ++ ++ /* Main loop to look for BYTE backwards in the string. ++ FIXME: Investigate whether 32 byte align helps with this ++ 9 instruction loop. */ ++ .align 5 + L(loop): + /* Load two words, compare and merge in a + single register for speed. This is an attempt + to speed up the byte-checking process for bigger strings. */ + +- lwbrx r12,r8,r6 +- lwbrx r11,r8,r0 +- addi r8,r8,-4 +- cmpb r10,r12,r4 ++#ifdef __LITTLE_ENDIAN__ ++ lwzx r12,0,r8 ++ lwzx r11,r8,r6 ++#else ++ lwbrx r12,0,r8 ++ lwbrx r11,r8,r6 ++#endif ++ cmpb r3,r12,r4 + cmpb r9,r11,r4 +- or r5,r9,r10 /* Merge everything in one word. */ ++ or r5,r9,r3 /* Merge everything in one word. */ + cmplwi cr7,r5,0 + bne cr7,L(found) +- addi r8,r8,-4 ++ addi r8,r8,-8 + bdnz L(loop) +- /* We're here because the counter reached 0, and that means we +- didn't have any matches for BYTE in the whole range. Just return +- the original range. */ +- addi r9,r8,4 +- cmplw cr6,r9,r7 +- bgt cr6,L(loop_small) +- b L(null) + +- /* OK, one (or both) of the words contains BYTE. Check +- the first word and decrement the address in case the first +- word really contains BYTE. */ ++ /* We may have one more word to read. */ ++ cmplw r8,r0 ++ bnelr ++ ++#ifdef __LITTLE_ENDIAN__ ++ lwzx r12,0,r8 ++#else ++ lwbrx r12,0,r8 ++#endif ++ cmpb r3,r12,r4 ++ cmplwi cr7,r3,0 ++ bne cr7,L(done) ++ blr ++ + .align 4 + L(found): +- cmplwi cr6,r10,0 +- addi r8,r8,4 ++ /* OK, one (or both) of the words contains BYTE. Check ++ the first word. */ ++ cmplwi cr6,r3,0 + bne cr6,L(done) + + /* BYTE must be in the second word. Adjust the address +- again and move the result of cmpb to r10 so we can calculate the ++ again and move the result of cmpb to r3 so we can calculate the + pointer. */ + +- mr r10,r9 ++ mr r3,r9 + addi r8,r8,-4 + +- /* r10 has the output of the cmpb instruction, that is, it contains ++ /* r3 has the output of the cmpb instruction, that is, it contains + 0xff in the same position as BYTE in the original + word from the string. Use that to calculate the pointer. + We need to make sure BYTE is *before* the end of the + range. */ + L(done): +- cntlzw r0,r10 /* Count leading zeroes before the match. */ +- srwi r6,r0,3 /* Convert leading zeroes to bytes. */ +- addi r0,r6,1 ++ cntlzw r9,r3 /* Count leading zeros before the match. */ ++ cmplw r8,r0 /* Are we on the last word? */ ++ srwi r6,r9,3 /* Convert leading zeros to bytes. */ ++ addi r0,r6,-3 + sub r3,r8,r0 +- cmplw r3,r7 +- blt L(null) ++ cmplw cr7,r3,r10 ++ bnelr ++ bgelr cr7 ++ li r3,0 + blr + + .align 4 +@@ -149,29 +161,36 @@ + cmplwi r5,0 + beq L(null) + +- lwbrx r12,r8,r6 /* Load reversed word from memory. */ +- cmpb r10,r12,r4 /* Check for null bytes in WORD1. */ +- slw r10,r10,r0 +- srw r10,r10,r0 +- cmplwi cr7,r10,0 ++#ifdef __LITTLE_ENDIAN__ ++ lwzx r12,0,r8 ++#else ++ lwbrx r12,0,r8 /* Load reversed word from memory. */ ++#endif ++ cmpb r3,r12,r4 /* Check for BYTE in WORD1. */ ++ and r3,r3,r9 ++ cmplwi cr7,r3,0 + bne cr7,L(done) + ++ /* Are we done already? */ ++ cmplw r8,r0 + addi r8,r8,-4 +- cmplw r8,r7 +- ble L(null) +- b L(loop_small) ++ beqlr + +- .p2align 5 ++ .align 5 + L(loop_small): +- lwbrx r12,r8,r6 +- cmpb r10,r12,r4 +- cmplwi cr6,r10,0 +- bne cr6,L(done) ++#ifdef __LITTLE_ENDIAN__ ++ lwzx r12,0,r8 ++#else ++ lwbrx r12,0,r8 ++#endif ++ cmpb r3,r12,r4 ++ cmplw r8,r0 ++ cmplwi cr7,r3,0 ++ bne cr7,L(done) + addi r8,r8,-4 +- cmplw r8,r7 +- ble L(null) +- b L(loop_small) ++ bne L(loop_small) ++ blr + +-END (BP_SYM (__memrchr)) +-weak_alias (BP_SYM (__memrchr), BP_SYM(memrchr)) ++END (__memrchr) ++weak_alias (__memrchr, memrchr) + libc_hidden_builtin_def (memrchr) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/rawmemchr.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/rawmemchr.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/rawmemchr.S 2014-05-29 13:09:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power7/rawmemchr.S 2014-05-29 13:09:19.000000000 -0500 +@@ -29,16 +29,21 @@ + clrrwi r8,r3,2 /* Align the address to word boundary. */ + + /* Replicate byte to word. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ rldimi r4,r4,8,48 ++ rldimi r4,r4,16,32 + + /* Now r4 has a word of c bytes. */ + + rlwinm r6,r3,3,27,28 /* Calculate padding. */ + lwz r12,0(r8) /* Load word from memory. */ + cmpb r5,r12,r4 /* Compare each byte against c byte. */ ++#ifdef __LITTLE_ENDIAN__ ++ srw r5,r5,r6 ++ slw r5,r5,r6 ++#else + slw r5,r5,r6 /* Move left to discard ignored bits. */ + srw r5,r5,r6 /* Bring the bits back as zeros. */ ++#endif + cmpwi cr7,r5,0 /* If r5 == 0, no c bytes have been found. */ + bne cr7,L(done) + +@@ -92,8 +97,14 @@ + word from the string. Use that fact to find out what is + the position of the byte inside the string. */ + L(done): ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r5,-1 ++ andc r0,r0,r5 ++ popcntw r0,r0 ++#else + cntlzw r0,r5 /* Count leading zeros before the match. */ +- srwi r0,r0,3 /* Convert leading zeroes to bytes. */ ++#endif ++ srwi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of the matching char. */ + blr + END (BP_SYM (__rawmemchr)) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memchr.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memchr.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memchr.S 2014-05-29 13:09:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memchr.S 2014-05-29 13:13:57.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memchr implementation for PowerPC64/POWER7 using cmpb insn. +- Copyright (C) 2010-2012 Free Software Foundation, Inc. ++ Copyright (C) 2010-2014 Free Software Foundation, Inc. + Contributed by Luis Machado <luisgpm@br.ibm.com>. + This file is part of the GNU C Library. + +@@ -18,118 +18,119 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + /* int [r3] memchr (char *s [r3], int byte [r4], int size [r5]) */ + .machine power7 +-ENTRY (BP_SYM (__memchr)) +- CALL_MCOUNT 2 ++ENTRY (__memchr) ++ CALL_MCOUNT 3 + dcbt 0,r3 + clrrdi r8,r3,3 +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrdi r4,r4,8,48 + add r7,r3,r5 /* Calculate the last acceptable address. */ ++ insrdi r4,r4,16,32 + cmpldi r5,32 ++ li r9, -1 ++ rlwinm r6,r3,3,26,28 /* Calculate padding. */ + insrdi r4,r4,32,0 ++ addi r7,r7,-1 ++#ifdef __LITTLE_ENDIAN__ ++ sld r9,r9,r6 ++#else ++ srd r9,r9,r6 ++#endif + ble L(small_range) + +- cmpld cr7,r3,r7 /* Compare the starting address (r3) with the +- ending address (r7). If (r3 >= r7), +- the size passed in was zero or negative. */ +- ble cr7,L(proceed) +- +- li r7,-1 /* Artificially set our ending address (r7) +- such that we will exit early. */ +- +-L(proceed): +- rlwinm r6,r3,3,26,28 /* Calculate padding. */ +- cmpldi cr6,r6,0 /* cr6 == Do we have padding? */ + ld r12,0(r8) /* Load doubleword from memory. */ +- cmpb r10,r12,r4 /* Check for BYTEs in DWORD1. */ +- beq cr6,L(proceed_no_padding) +- sld r10,r10,r6 +- srd r10,r10,r6 +-L(proceed_no_padding): +- cmpldi cr7,r10,0 /* Does r10 indicate we got a hit? */ ++ cmpb r3,r12,r4 /* Check for BYTEs in DWORD1. */ ++ and r3,r3,r9 ++ clrldi r5,r7,61 /* Byte count - 1 in last dword. */ ++ clrrdi r7,r7,3 /* Address of last doubleword. */ ++ cmpldi cr7,r3,0 /* Does r3 indicate we got a hit? */ + bne cr7,L(done) + +- /* See if we are at the last acceptable address yet. */ +- addi r9,r8,8 +- cmpld cr6,r9,r7 +- bge cr6,L(null) +- + mtcrf 0x01,r8 + /* Are we now aligned to a quadword boundary? If so, skip to + the main loop. Otherwise, go through the alignment code. */ +- + bt 28,L(loop_setup) + + /* Handle DWORD2 of pair. */ + ldu r12,8(r8) +- cmpb r10,r12,r4 +- cmpldi cr7,r10,0 ++ cmpb r3,r12,r4 ++ cmpldi cr7,r3,0 + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,8 +- cmpld cr6,r9,r7 +- bge cr6,L(null) +- + L(loop_setup): +- sub r5,r7,r9 +- srdi r6,r5,4 /* Number of loop iterations. */ ++ /* The last dword we want to read in the loop below is the one ++ containing the last byte of the string, ie. the dword at ++ (s + size - 1) & ~7, or r7. The first dword read is at ++ r8 + 8, we read 2 * cnt dwords, so the last dword read will ++ be at r8 + 8 + 16 * cnt - 8. Solving for cnt gives ++ cnt = (r7 - r8) / 16 */ ++ sub r6,r7,r8 ++ srdi r6,r6,4 /* Number of loop iterations. */ + mtctr r6 /* Setup the counter. */ +- b L(loop) +- /* Main loop to look for BYTE backwards in the string. Since +- it's a small loop (< 8 instructions), align it to 32-bytes. */ +- .p2align 5 ++ ++ /* Main loop to look for BYTE in the string. Since ++ it's a small loop (8 instructions), align it to 32-bytes. */ ++ .align 5 + L(loop): + /* Load two doublewords, compare and merge in a + single register for speed. This is an attempt + to speed up the byte-checking process for bigger strings. */ + ld r12,8(r8) + ldu r11,16(r8) +- cmpb r10,r12,r4 ++ cmpb r3,r12,r4 + cmpb r9,r11,r4 +- or r5,r9,r10 /* Merge everything in one doubleword. */ +- cmpldi cr7,r5,0 ++ or r6,r9,r3 /* Merge everything in one doubleword. */ ++ cmpldi cr7,r6,0 + bne cr7,L(found) + bdnz L(loop) + +- /* We're here because the counter reached 0, and that means we +- didn't have any matches for BYTE in the whole range. */ +- subi r11,r7,8 +- cmpld cr6,r8,r11 +- blt cr6,L(loop_small) +- b L(null) ++ /* We may have one more dword to read. */ ++ cmpld r8,r7 ++ beqlr + ++ ldu r12,8(r8) ++ cmpb r3,r12,r4 ++ cmpldi cr6,r3,0 ++ bne cr6,L(done) ++ blr ++ ++ .align 4 ++L(found): + /* OK, one (or both) of the doublewords contains BYTE. Check + the first doubleword and decrement the address in case the first + doubleword really contains BYTE. */ +- .align 4 +-L(found): +- cmpldi cr6,r10,0 ++ cmpldi cr6,r3,0 + addi r8,r8,-8 + bne cr6,L(done) + + /* BYTE must be in the second doubleword. Adjust the address +- again and move the result of cmpb to r10 so we can calculate the ++ again and move the result of cmpb to r3 so we can calculate the + pointer. */ + +- mr r10,r9 ++ mr r3,r9 + addi r8,r8,8 + +- /* r10 has the output of the cmpb instruction, that is, it contains ++ /* r3 has the output of the cmpb instruction, that is, it contains + 0xff in the same position as BYTE in the original + doubleword from the string. Use that to calculate the pointer. + We need to make sure BYTE is *before* the end of the range. */ + L(done): +- cntlzd r0,r10 /* Count leading zeroes before the match. */ +- srdi r0,r0,3 /* Convert leading zeroes to bytes. */ ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r3,-1 ++ andc r0,r0,r3 ++ popcntd r0,r0 /* Count trailing zeros. */ ++#else ++ cntlzd r0,r3 /* Count leading zeros before the match. */ ++#endif ++ cmpld r8,r7 /* Are we on the last dword? */ ++ srdi r0,r0,3 /* Convert leading/trailing zeros to bytes. */ + add r3,r8,r0 +- cmpld r3,r7 +- bge L(null) ++ cmpld cr7,r0,r5 /* If on the last dword, check byte offset. */ ++ bnelr ++ blelr cr7 ++ li r3,0 + blr + + .align 4 +@@ -141,67 +142,44 @@ + .align 4 + L(small_range): + cmpldi r5,0 +- rlwinm r6,r3,3,26,28 /* Calculate padding. */ +- beq L(null) /* This branch is for the cmpldi r5,0 above. */ ++ beq L(null) + ld r12,0(r8) /* Load word from memory. */ +- cmpldi cr6,r6,0 /* cr6 == Do we have padding? */ +- cmpb r10,r12,r4 /* Check for BYTE in DWORD1. */ +- /* If no padding, skip the shifts. */ +- beq cr6,L(small_no_padding) +- sld r10,r10,r6 +- srd r10,r10,r6 +-L(small_no_padding): +- cmpldi cr7,r10,0 ++ cmpb r3,r12,r4 /* Check for BYTE in DWORD1. */ ++ and r3,r3,r9 ++ cmpldi cr7,r3,0 ++ clrldi r5,r7,61 /* Byte count - 1 in last dword. */ ++ clrrdi r7,r7,3 /* Address of last doubleword. */ ++ cmpld r8,r7 /* Are we done already? */ + bne cr7,L(done) +- +- /* Are we done already? */ +- addi r9,r8,8 +- cmpld r9,r7 +- bge L(null) +- /* If we're not done, drop through into loop_small. */ +- +-L(loop_small): /* loop_small has been unrolled. */ +- ldu r12,8(r8) +- cmpb r10,r12,r4 +- addi r9,r8,8 +- cmpldi cr6,r10,0 +- cmpld r9,r7 +- bne cr6,L(done) /* Found something. */ +- bge L(null) /* Hit end of string (length). */ ++ beqlr + + ldu r12,8(r8) +- cmpb r10,r12,r4 +- addi r9,r8,8 +- cmpldi cr6,r10,0 +- cmpld r9,r7 ++ cmpb r3,r12,r4 ++ cmpldi cr6,r3,0 ++ cmpld r8,r7 + bne cr6,L(done) /* Found something. */ +- bge L(null) ++ beqlr /* Hit end of string (length). */ + + ldu r12,8(r8) +- subi r11,r7,8 +- cmpb r10,r12,r4 +- cmpldi cr6,r10,0 +- ori r2,r2,0 /* Force a dispatch group. */ ++ cmpb r3,r12,r4 ++ cmpldi cr6,r3,0 ++ cmpld r8,r7 + bne cr6,L(done) ++ beqlr + +- cmpld r8,r11 /* At end of range? */ +- bge L(null) +- +- /* For most cases we will never get here. Under some combinations of +- padding + length there is a leftover double that still needs to be +- checked. */ +- ldu r12,8(r8) +- cmpb r10,r12,r4 +- addi r9,r8,8 +- cmpldi cr6,r10,0 +- cmpld r9,r7 +- bne cr6,L(done) /* Found something. */ ++ ldu r12,8(r8) ++ cmpb r3,r12,r4 ++ cmpldi cr6,r3,0 ++ cmpld r8,r7 ++ bne cr6,L(done) ++ beqlr + +- /* Save a branch and exit directly. */ +- li r3,0 ++ ldu r12,8(r8) ++ cmpb r3,r12,r4 ++ cmpldi cr6,r3,0 ++ bne cr6,L(done) + blr + +- +-END (BP_SYM (__memchr)) +-weak_alias (BP_SYM (__memchr), BP_SYM(memchr)) ++END (__memchr) ++weak_alias (__memchr, memchr) + libc_hidden_builtin_def (memchr) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memrchr.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memrchr.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memrchr.S 2014-05-29 13:09:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/memrchr.S 2014-05-29 13:14:06.000000000 -0500 +@@ -1,5 +1,5 @@ + /* Optimized memrchr implementation for PowerPC64/POWER7 using cmpb insn. +- Copyright (C) 2010 Free Software Foundation, Inc. ++ Copyright (C) 2010-2014 Free Software Foundation, Inc. + Contributed by Luis Machado <luisgpm@br.ibm.com>. + This file is part of the GNU C Library. + +@@ -18,125 +18,137 @@ + <http://www.gnu.org/licenses/>. */ + + #include <sysdep.h> +-#include <bp-sym.h> +-#include <bp-asm.h> + + /* int [r3] memrchr (char *s [r3], int byte [r4], int size [r5]) */ + .machine power7 +-ENTRY (BP_SYM (__memrchr)) +- CALL_MCOUNT +- dcbt 0,r3 +- mr r7,r3 +- add r3,r7,r5 /* Calculate the last acceptable address. */ +- cmpld cr7,r3,r7 /* Is the address equal or less than r3? */ ++ENTRY (__memrchr) ++ CALL_MCOUNT 3 ++ add r7,r3,r5 /* Calculate the last acceptable address. */ ++ neg r0,r7 ++ addi r7,r7,-1 ++ mr r10,r3 ++ clrrdi r6,r7,7 ++ li r9,3<<5 ++ dcbt r9,r6,8 /* Stream hint, decreasing addresses. */ + + /* Replicate BYTE to doubleword. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrdi r4,r4,8,48 ++ insrdi r4,r4,16,32 + insrdi r4,r4,32,0 +- bge cr7,L(proceed) +- +- li r3,-1 /* Make r11 the biggest if r4 <= 0. */ +-L(proceed): + li r6,-8 +- addi r9,r3,-1 +- clrrdi r8,r9,3 +- addi r8,r8,8 +- neg r0,r3 ++ li r9,-1 + rlwinm r0,r0,3,26,28 /* Calculate padding. */ +- ++ clrrdi r8,r7,3 ++ srd r9,r9,r0 + cmpldi r5,32 ++ clrrdi r0,r10,3 + ble L(small_range) + +- ldbrx r12,r8,r6 /* Load reversed doubleword from memory. */ +- cmpb r10,r12,r4 /* Check for BYTE in DWORD1. */ +- sld r10,r10,r0 +- srd r10,r10,r0 +- cmpldi cr7,r10,0 /* If r10 == 0, no BYTE's have been found. */ ++#ifdef __LITTLE_ENDIAN__ ++ ldx r12,0,r8 ++#else ++ ldbrx r12,0,r8 /* Load reversed doubleword from memory. */ ++#endif ++ cmpb r3,r12,r4 /* Check for BYTE in DWORD1. */ ++ and r3,r3,r9 ++ cmpldi cr7,r3,0 /* If r3 == 0, no BYTEs have been found. */ + bne cr7,L(done) + +- /* Are we done already? */ +- addi r9,r8,-8 +- cmpld cr6,r9,r7 +- ble cr6,L(null) +- + mtcrf 0x01,r8 +- /* Are we now aligned to a doubleword boundary? If so, skip to ++ /* Are we now aligned to a quadword boundary? If so, skip to + the main loop. Otherwise, go through the alignment code. */ +- mr r8,r9 +- bt 28,L(loop_setup) ++ bf 28,L(loop_setup) + + /* Handle DWORD2 of pair. */ ++#ifdef __LITTLE_ENDIAN__ ++ ldx r12,r8,r6 ++#else + ldbrx r12,r8,r6 +- cmpb r10,r12,r4 +- cmpldi cr7,r10,0 +- bne cr7,L(done) +- +- /* Are we done already. */ ++#endif + addi r8,r8,-8 +- cmpld cr6,r8,r7 +- ble cr6,L(null) ++ cmpb r3,r12,r4 ++ cmpldi cr7,r3,0 ++ bne cr7,L(done) + + L(loop_setup): +- li r0,-16 +- sub r5,r8,r7 +- srdi r9,r5,4 /* Number of loop iterations. */ ++ /* The last dword we want to read in the loop below is the one ++ containing the first byte of the string, ie. the dword at ++ s & ~7, or r0. The first dword read is at r8 - 8, we ++ read 2 * cnt dwords, so the last dword read will be at ++ r8 - 8 - 16 * cnt + 8. Solving for cnt gives ++ cnt = (r8 - r0) / 16 */ ++ sub r5,r8,r0 ++ addi r8,r8,-8 ++ srdi r9,r5,4 /* Number of loop iterations. */ + mtctr r9 /* Setup the counter. */ +- b L(loop) +- /* Main loop to look for BYTE backwards in the string. Since it's a +- small loop (< 8 instructions), align it to 32-bytes. */ +- .p2align 5 ++ ++ /* Main loop to look for BYTE backwards in the string. ++ FIXME: Investigate whether 32 byte align helps with this ++ 9 instruction loop. */ ++ .align 5 + L(loop): + /* Load two doublewords, compare and merge in a + single register for speed. This is an attempt + to speed up the byte-checking process for bigger strings. */ + +- ldbrx r12,r8,r6 +- ldbrx r11,r8,r0 +- addi r8,r8,-8 +- cmpb r10,r12,r4 ++#ifdef __LITTLE_ENDIAN__ ++ ldx r12,0,r8 ++ ldx r11,r8,r6 ++#else ++ ldbrx r12,0,r8 ++ ldbrx r11,r8,r6 ++#endif ++ cmpb r3,r12,r4 + cmpb r9,r11,r4 +- or r5,r9,r10 /* Merge everything in one doubleword. */ ++ or r5,r9,r3 /* Merge everything in one doubleword. */ + cmpldi cr7,r5,0 + bne cr7,L(found) +- addi r8,r8,-8 ++ addi r8,r8,-16 + bdnz L(loop) +- /* We're here because the counter reached 0, and that means we +- didn't have any matches for BYTE in the whole range. Just return +- the original range. */ +- addi r9,r8,8 +- cmpld cr6,r9,r7 +- bgt cr6,L(loop_small) +- b L(null) +- +- /* OK, one (or both) of the words contains BYTE. Check +- the first word and decrement the address in case the first +- word really contains BYTE. */ ++ ++ /* We may have one more word to read. */ ++ cmpld r8,r0 ++ bnelr ++ ++#ifdef __LITTLE_ENDIAN__ ++ ldx r12,0,r8 ++#else ++ ldbrx r12,0,r8 ++#endif ++ cmpb r3,r12,r4 ++ cmpldi cr7,r3,0 ++ bne cr7,L(done) ++ blr ++ + .align 4 + L(found): +- cmpldi cr6,r10,0 +- addi r8,r8,8 ++ /* OK, one (or both) of the dwords contains BYTE. Check ++ the first dword. */ ++ cmpldi cr6,r3,0 + bne cr6,L(done) + + /* BYTE must be in the second word. Adjust the address +- again and move the result of cmpb to r10 so we can calculate the ++ again and move the result of cmpb to r3 so we can calculate the + pointer. */ + +- mr r10,r9 ++ mr r3,r9 + addi r8,r8,-8 + +- /* r10 has the output of the cmpb instruction, that is, it contains +- 0xff in the same position as the BYTE in the original ++ /* r3 has the output of the cmpb instruction, that is, it contains ++ 0xff in the same position as BYTE in the original + word from the string. Use that to calculate the pointer. + We need to make sure BYTE is *before* the end of the + range. */ + L(done): +- cntlzd r0,r10 /* Count leading zeroes before the match. */ +- srdi r6,r0,3 /* Convert leading zeroes to bytes. */ +- addi r0,r6,1 ++ cntlzd r9,r3 /* Count leading zeros before the match. */ ++ cmpld r8,r0 /* Are we on the last word? */ ++ srdi r6,r9,3 /* Convert leading zeros to bytes. */ ++ addi r0,r6,-7 + sub r3,r8,r0 +- cmpld r3,r7 +- blt L(null) ++ cmpld cr7,r3,r10 ++ bnelr ++ bgelr cr7 ++ li r3,0 + blr + + .align 4 +@@ -150,30 +162,36 @@ + cmpldi r5,0 + beq L(null) + +- ldbrx r12,r8,r6 /* Load reversed doubleword from memory. */ +- cmpb r10,r12,r4 /* Check for BYTE in DWORD1. */ +- sld r10,r10,r0 +- srd r10,r10,r0 +- cmpldi cr7,r10,0 ++#ifdef __LITTLE_ENDIAN__ ++ ldx r12,0,r8 ++#else ++ ldbrx r12,0,r8 /* Load reversed doubleword from memory. */ ++#endif ++ cmpb r3,r12,r4 /* Check for BYTE in DWORD1. */ ++ and r3,r3,r9 ++ cmpldi cr7,r3,0 + bne cr7,L(done) + + /* Are we done already? */ ++ cmpld r8,r0 + addi r8,r8,-8 +- cmpld r8,r7 +- ble L(null) +- b L(loop_small) ++ beqlr + +- .p2align 5 ++ .align 5 + L(loop_small): +- ldbrx r12,r8,r6 +- cmpb r10,r12,r4 +- cmpldi cr6,r10,0 +- bne cr6,L(done) ++#ifdef __LITTLE_ENDIAN__ ++ ldx r12,0,r8 ++#else ++ ldbrx r12,0,r8 ++#endif ++ cmpb r3,r12,r4 ++ cmpld r8,r0 ++ cmpldi cr7,r3,0 ++ bne cr7,L(done) + addi r8,r8,-8 +- cmpld r8,r7 +- ble L(null) +- b L(loop_small) ++ bne L(loop_small) ++ blr + +-END (BP_SYM (__memrchr)) +-weak_alias (BP_SYM (__memrchr), BP_SYM(memrchr)) ++END (__memrchr) ++weak_alias (__memrchr, memrchr) + libc_hidden_builtin_def (memrchr) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/rawmemchr.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/rawmemchr.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/rawmemchr.S 2014-05-29 13:09:17.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/power7/rawmemchr.S 2014-05-29 13:09:19.000000000 -0500 +@@ -29,8 +29,8 @@ + clrrdi r8,r3,3 /* Align the address to doubleword boundary. */ + + /* Replicate byte to doubleword. */ +- rlwimi r4,r4,8,16,23 +- rlwimi r4,r4,16,0,15 ++ insrdi r4,r4,8,48 ++ insrdi r4,r4,16,32 + insrdi r4,r4,32,0 + + /* Now r4 has a doubleword of c bytes. */ +@@ -38,8 +38,13 @@ + rlwinm r6,r3,3,26,28 /* Calculate padding. */ + ld r12,0(r8) /* Load doubleword from memory. */ + cmpb r5,r12,r4 /* Compare each byte against c byte. */ ++#ifdef __LITTLE_ENDIAN__ ++ srd r5,r5,r6 ++ sld r5,r5,r6 ++#else + sld r5,r5,r6 /* Move left to discard ignored bits. */ + srd r5,r5,r6 /* Bring the bits back as zeros. */ ++#endif + cmpdi cr7,r5,0 /* If r5 == 0, no c bytes have been found. */ + bne cr7,L(done) + +@@ -93,8 +98,14 @@ + doubleword from the string. Use that fact to find out what is + the position of the byte inside the string. */ + L(done): ++#ifdef __LITTLE_ENDIAN__ ++ addi r0,r5,-1 ++ andc r0,r0,r5 ++ popcntd r0,r0 /* Count trailing zeros. */ ++#else + cntlzd r0,r5 /* Count leading zeros before the match. */ +- srdi r0,r0,3 /* Convert leading zeroes to bytes. */ ++#endif ++ srdi r0,r0,3 /* Convert leading zeros to bytes. */ + add r3,r8,r0 /* Return address of the matching char. */ + blr + END (BP_SYM (__rawmemchr)) diff --git a/SOURCES/glibc-ppc64le-34.patch b/SOURCES/glibc-ppc64le-34.patch new file mode 100644 index 0000000..ef6362d --- /dev/null +++ b/SOURCES/glibc-ppc64le-34.patch @@ -0,0 +1,68 @@ +# commit 8f9ebb08af1368962d9f24c4cfacb55cf8eee560 +# Author: Alan Modra <amodra@gmail.com> +# Date: Thu Oct 3 14:03:03 2013 +0930 +# +# PowerPC LE configury +# http://sourceware.org/ml/libc-alpha/2013-08/msg00096.html +# +# This adds the basic configury bits for powerpc64le and powerpcle. +# +# * configure.in: Map powerpc64le and powerpcle to base_machine/machine. +# * configure: Regenerate. +# * nptl/shlib-versions: Powerpc*le starts at 2.18. +# * shlib-versions: Likewise. +# +# commit 0ff8246327401ae8779e2697d5c7348611cdbf8a +# Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> +# Date: Tue Feb 4 09:49:08 2014 -0200 +# +# PowerPC: Change powerpc64le start ABI to 2.17. +# +diff -urN glibc-2.17-c758a686/configure glibc-2.17-c758a686/configure +--- glibc-2.17-c758a686/configure 2014-05-26 19:52:31.000000000 -0500 ++++ glibc-2.17-c758a686/configure 2014-05-26 19:54:13.000000000 -0500 +@@ -4195,8 +4195,8 @@ + # base_machine, we don't change it. + test -n "$base_machine" || case "$machine" in + i[34567]86) base_machine=i386 machine=i386/$machine ;; +-powerpc) base_machine=powerpc machine=powerpc/powerpc32 ;; +-powerpc64) base_machine=powerpc machine=powerpc/powerpc64 ;; ++powerpc64*) base_machine=powerpc machine=powerpc/powerpc64 ;; ++powerpc*) base_machine=powerpc machine=powerpc/powerpc32 ;; + s390) base_machine=s390 machine=s390/s390-32 ;; + s390x) base_machine=s390 machine=s390/s390-64 ;; + sh3*) base_machine=sh machine=sh/sh3 ;; +diff -urN glibc-2.17-c758a686/configure.in glibc-2.17-c758a686/configure.in +--- glibc-2.17-c758a686/configure.in 2014-05-26 19:52:30.000000000 -0500 ++++ glibc-2.17-c758a686/configure.in 2014-05-26 19:54:45.000000000 -0500 +@@ -549,8 +549,8 @@ + # base_machine, we don't change it. + test -n "$base_machine" || case "$machine" in + i[34567]86) base_machine=i386 machine=i386/$machine ;; +-powerpc) base_machine=powerpc machine=powerpc/powerpc32 ;; +-powerpc64) base_machine=powerpc machine=powerpc/powerpc64 ;; ++powerpc64*) base_machine=powerpc machine=powerpc/powerpc64 ;; ++powerpc*) base_machine=powerpc machine=powerpc/powerpc32 ;; + s390) base_machine=s390 machine=s390/s390-32 ;; + s390x) base_machine=s390 machine=s390/s390-64 ;; + sh3*) base_machine=sh machine=sh/sh3 ;; +diff -urN glibc-2.17-c758a686/nptl/shlib-versions glibc-2.17-c758a686/nptl/shlib-versions +--- glibc-2.17-c758a686/nptl/shlib-versions 2014-05-26 19:52:31.000000000 -0500 ++++ glibc-2.17-c758a686/nptl/shlib-versions 2014-05-26 19:53:31.000000000 -0500 +@@ -2,4 +2,5 @@ + sh.*-.*-linux.* libpthread=0 GLIBC_2.2 + s390x-.*-linux.* libpthread=0 GLIBC_2.2 + powerpc64-.*-linux.* libpthread=0 GLIBC_2.3 ++powerpc.*le-.*-linux.* libpthread=0 GLIBC_2.17 + .*-.*-linux.* libpthread=0 +diff -urN glibc-2.17-c758a686/shlib-versions glibc-2.17-c758a686/shlib-versions +--- glibc-2.17-c758a686/shlib-versions 2014-05-26 19:52:31.000000000 -0500 ++++ glibc-2.17-c758a686/shlib-versions 2014-05-26 19:53:31.000000000 -0500 +@@ -23,6 +23,7 @@ + + s390x-.*-linux.* DEFAULT GLIBC_2.2 + powerpc64-.*-linux.* DEFAULT GLIBC_2.3 ++powerpc.*le-.*-linux.* DEFAULT GLIBC_2.17 + .*-.*-gnu-gnu.* DEFAULT GLIBC_2.2.6 + + # Configuration ABI Identifier for ABI data files diff --git a/SOURCES/glibc-ppc64le-35.patch b/SOURCES/glibc-ppc64le-35.patch new file mode 100644 index 0000000..17434b9 --- /dev/null +++ b/SOURCES/glibc-ppc64le-35.patch @@ -0,0 +1,106 @@ +# commit 5162e7dd96efcd9b45c1dc1471a964d45278b1e1 +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:41:52 2013 -0600 +# +# PowerPC64: Fix incorrect CFI in *context routines +# +# The context established by "makecontext" has a link register pointing +# back to an error path within the makecontext routine. This is currently +# covered by the CFI FDE for makecontext itself, which is simply wrong +# for the stack frame *inside* the context. When trying to unwind (e.g. +# doing a backtrace) in a routine inside a context created by makecontext, +# this can lead to uninitialized stack slots being accessed, causing the +# unwinder to crash in the worst case. +# +# Similarly, during parts of the "setcontext" routine, when the stack +# pointer has already been switched to point to the new context, the +# address range is still covered by the CFI FDE for setcontext. When +# trying to unwind in that situation (e.g. backtrace from an async +# signal handler for profiling), it is again possible that the unwinder +# crashes. +# +# Theses are all problems in existing code, but the changes in stack +# frame layout appear to make the "worst case" much more likely in +# the ELFv2 ABI context. This causes regressions e.g. in the libgo +# testsuite on ELFv2. +# +# This patch fixes this by ending the makecontext/setcontext FDEs +# before those problematic parts of the assembler, similar to what +# is already done on other platforms. This fixes the libgo +# regression on ELFv2. +# +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 2014-05-29 13:16:16.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 2014-05-29 13:16:17.000000000 -0500 +@@ -129,6 +129,10 @@ + the cpu link stack used to predict blr return addresses. */ + bcl 20,31,L(gotexitcodeaddr); + ++ /* End FDE now, because while executing on the context's stack ++ the unwind info would be wrong otherwise. */ ++ cfi_endproc ++ + /* This is the helper code which gets called if a function which + is registered with 'makecontext' returns. In this case we + have to install the context listed in the uc_link element of +@@ -157,6 +161,11 @@ + #endif + b L(do_exit) + ++ /* Re-establish FDE for the rest of the actual makecontext routine. */ ++ cfi_startproc ++ cfi_offset (lr, FRAME_LR_SAVE) ++ cfi_adjust_cfa_offset (128) ++ + /* The address of the exit code is in the link register. Store the lr + in the ucontext as LNK so the target function will return to our + exit code. */ +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S 2014-05-29 13:16:16.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S 2014-05-29 13:16:17.000000000 -0500 +@@ -129,6 +129,10 @@ + lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31) + lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31) + ++ /* End FDE now, because the unwind info would be wrong while ++ we're reloading registers to switch to the new context. */ ++ cfi_endproc ++ + ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31) + ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31) + mtlr r0 +@@ -177,6 +181,11 @@ + ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31) + bctr + ++ /* Re-establish FDE for the rest of the actual setcontext routine. */ ++ cfi_startproc ++ cfi_offset (lr, FRAME_LR_SAVE) ++ cfi_adjust_cfa_offset (128) ++ + L(nv_error_exit): + ld r0,128+FRAME_LR_SAVE(r1) + addi r1,r1,128 +@@ -403,6 +412,10 @@ + lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31) + lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31) + ++ /* End FDE now, because the unwind info would be wrong while ++ we're reloading registers to switch to the new context. */ ++ cfi_endproc ++ + ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31) + ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31) + mtlr r0 +@@ -451,6 +464,11 @@ + ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31) + bctr + ++ /* Re-establish FDE for the rest of the actual setcontext routine. */ ++ cfi_startproc ++ cfi_offset (lr, FRAME_LR_SAVE) ++ cfi_adjust_cfa_offset (128) ++ + L(error_exit): + ld r0,128+FRAME_LR_SAVE(r1) + addi r1,r1,128 diff --git a/SOURCES/glibc-ppc64le-36.patch b/SOURCES/glibc-ppc64le-36.patch new file mode 100644 index 0000000..fbe351c --- /dev/null +++ b/SOURCES/glibc-ppc64le-36.patch @@ -0,0 +1,105 @@ +# commit 7ec07d9a7b501f1b7d740fda02ba5f39d6d684e5 +# Author: Alan Modra <amodra@gmail.com> +# Date: Wed Dec 4 06:44:06 2013 -0600 +# +# PowerPC64: Report overflow on @h and @ha relocations +# +# This patch updates glibc in accordance with the binutils patch checked in here: +# https://sourceware.org/ml/binutils/2013-10/msg00372.html +# +# This changes the various R_PPC64_..._HI and _HA relocations to report +# 32-bit overflows. The motivation is that existing uses of @h / @ha +# are to build up 32-bit offsets (for the "medium model" TOC access +# that GCC now defaults to), and we'd really like to see failures at +# link / load time rather than silent truncations. +# +# For those rare cases where a modifier is needed to build up a 64-bit +# constant, new relocations _HIGH / _HIGHA are supported. +# +# The patch also fixes a bug in overflow checking for the R_PPC64_ADDR30 +# and R_PPC64_ADDR32 relocations. +# +diff -urN glibc-2.17-c758a686/elf/elf.h glibc-2.17-c758a686/elf/elf.h +--- glibc-2.17-c758a686/elf/elf.h 2014-05-29 13:17:35.000000000 -0500 ++++ glibc-2.17-c758a686/elf/elf.h 2014-05-29 13:17:35.000000000 -0500 +@@ -2243,6 +2243,17 @@ + #define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */ + #define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */ + #define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */ ++#define R_PPC64_TLSGD 107 /* none (sym+add)@tlsgd */ ++#define R_PPC64_TLSLD 108 /* none (sym+add)@tlsld */ ++#define R_PPC64_TOCSAVE 109 /* none */ ++ ++/* Added when HA and HI relocs were changed to report overflows. */ ++#define R_PPC64_ADDR16_HIGH 110 ++#define R_PPC64_ADDR16_HIGHA 111 ++#define R_PPC64_TPREL16_HIGH 112 ++#define R_PPC64_TPREL16_HIGHA 113 ++#define R_PPC64_DTPREL16_HIGH 114 ++#define R_PPC64_DTPREL16_HIGHA 115 + + /* GNU extension to support local ifunc. */ + #define R_PPC64_JMP_IREL 247 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 13:17:34.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 13:17:35.000000000 -0500 +@@ -663,11 +663,25 @@ + + case R_PPC64_TPREL16_HI: + value = elf_machine_tprel (map, sym_map, sym, reloc); ++ if (dont_expect (value + 0x80000000 >= 0x100000000LL)) ++ _dl_reloc_overflow (map, "R_PPC64_TPREL16_HI", reloc_addr, refsym); ++ *(Elf64_Half *) reloc_addr = PPC_HI (value); ++ break; ++ ++ case R_PPC64_TPREL16_HIGH: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); + *(Elf64_Half *) reloc_addr = PPC_HI (value); + break; + + case R_PPC64_TPREL16_HA: + value = elf_machine_tprel (map, sym_map, sym, reloc); ++ if (dont_expect (value + 0x80008000 >= 0x100000000LL)) ++ _dl_reloc_overflow (map, "R_PPC64_TPREL16_HA", reloc_addr, refsym); ++ *(Elf64_Half *) reloc_addr = PPC_HA (value); ++ break; ++ ++ case R_PPC64_TPREL16_HIGHA: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); + *(Elf64_Half *) reloc_addr = PPC_HA (value); + break; + +@@ -703,17 +717,23 @@ + break; + + case R_PPC64_ADDR16_HI: ++ if (dont_expect (value + 0x80000000 >= 0x100000000LL)) ++ _dl_reloc_overflow (map, "R_PPC64_ADDR16_HI", reloc_addr, refsym); ++ case R_PPC64_ADDR16_HIGH: + *(Elf64_Half *) reloc_addr = PPC_HI (value); + break; + + case R_PPC64_ADDR16_HA: ++ if (dont_expect (value + 0x80008000 >= 0x100000000LL)) ++ _dl_reloc_overflow (map, "R_PPC64_ADDR16_HA", reloc_addr, refsym); ++ case R_PPC64_ADDR16_HIGHA: + *(Elf64_Half *) reloc_addr = PPC_HA (value); + break; + + case R_PPC64_ADDR30: + { + Elf64_Addr delta = value - (Elf64_Xword) reloc_addr; +- if (dont_expect ((delta + 0x80000000) >= 0x10000000 ++ if (dont_expect ((delta + 0x80000000) >= 0x100000000LL + || (delta & 3) != 0)) + _dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym); + BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc); +@@ -762,7 +782,7 @@ + return; + + case R_PPC64_ADDR32: +- if (dont_expect ((value + 0x80000000) >= 0x10000000)) ++ if (dont_expect ((value + 0x80000000) >= 0x100000000LL)) + _dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, refsym); + *(Elf64_Word *) reloc_addr = value; + return; diff --git a/SOURCES/glibc-ppc64le-37.patch b/SOURCES/glibc-ppc64le-37.patch new file mode 100644 index 0000000..dad59a6 --- /dev/null +++ b/SOURCES/glibc-ppc64le-37.patch @@ -0,0 +1,31 @@ +# commit b525166bb93b060e1146f0263b76a9c1e7455b06 +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:45:56 2013 -0600 +# +# PowerPC64: Add __private_ss field to TCB header +# +# The TCB header on Intel contains a field __private_ss that is used +# to efficiently implement the -fsplit-stack GCC feature. +# +# In order to prepare for a possible future implementation of that +# feature on powerpc64, we'd like to reserve a similar field in +# the TCB header as well. (It would be good if this went in with +# or before the ELFv2 patches to ensure that this field will be +# available always in the ELFv2 environment.) +# +# The field needs to be added at the front of tcbhead_t structure +# to avoid changing the ABI; see the recent discussion when adding +# the EBB fields. +# +diff -urN glibc-2.17-c758a686/nptl/sysdeps/powerpc/tls.h glibc-2.17-c758a686/nptl/sysdeps/powerpc/tls.h +--- glibc-2.17-c758a686/nptl/sysdeps/powerpc/tls.h 2014-05-29 13:19:25.000000000 -0500 ++++ glibc-2.17-c758a686/nptl/sysdeps/powerpc/tls.h 2014-05-29 13:19:25.000000000 -0500 +@@ -61,6 +61,8 @@ + are private. */ + typedef struct + { ++ /* GCC split stack support. */ ++ void *__private_ss; + /* Reservation for the Event-Based Branching ABI. */ + uintptr_t ebb_handler; + uintptr_t ebb_ctx_pointer; diff --git a/SOURCES/glibc-ppc64le-38.patch b/SOURCES/glibc-ppc64le-38.patch new file mode 100644 index 0000000..196f0ad --- /dev/null +++ b/SOURCES/glibc-ppc64le-38.patch @@ -0,0 +1,262 @@ +# commit d31beafa8e4ca69faa4cf362784796ef17299341 +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:49:15 2013 -0600 +# +# PowerPC64 ELFv2 ABI 1/6: Code refactoring +# +# This is the first patch to support the new ELFv2 ABI in glibc. +# +# As preparation, this patch simply refactors some of the powerpc64 assembler +# code to move all code related to creating function descriptors (.opd section) +# or using function descriptors (function pointer call) into a central place +# in sysdep.h. +# +# Note that most locations creating .opd entries were already using macros +# in sysdep.h, this patch simply extends this to the remaining places. +# +# No relevant change in generated code expected. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S 2014-05-29 13:56:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S 2014-05-29 13:56:37.000000000 -0500 +@@ -60,18 +60,8 @@ + .LC0: + .tc PREINIT_FUNCTION[TC], PREINIT_FUNCTION + #endif +- .type BODY_LABEL (_init), @function +- .globl _init +- .section ".opd", "aw" +- .align 3 +-_init: OPD_ENT (_init) +-#ifdef HAVE_ASM_GLOBAL_DOT_NAME +- .globl BODY_LABEL (_init) +- .size _init, 24 +-#else +- .type _init, @function +-#endif + .section ".init", "ax", @progbits ++ ENTRY_2(_init) + .align ALIGNARG (2) + BODY_LABEL (_init): + mflr 0 +@@ -87,18 +77,8 @@ + nop + 1: + +- .type BODY_LABEL (_fini), @function +- .globl _fini +- .section ".opd", "aw" +- .align 3 +-_fini: OPD_ENT (_fini) +-#ifdef HAVE_ASM_GLOBAL_DOT_NAME +- .globl BODY_LABEL (_fini) +- .size _fini, 24 +-#else +- .type _fini, @function +-#endif + .section ".fini", "ax", @progbits ++ ENTRY_2(_fini) + .align ALIGNARG (2) + BODY_LABEL (_fini): + mflr 0 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 13:56:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 13:56:37.000000000 -0500 +@@ -122,14 +122,7 @@ + #define RTLD_START \ + asm (".pushsection \".text\"\n" \ + " .align 2\n" \ +-" .type " BODY_PREFIX "_start,@function\n" \ +-" .pushsection \".opd\",\"aw\"\n" \ +-" .align 3\n" \ +-" .globl _start\n" \ + " " ENTRY_2(_start) "\n" \ +-"_start:\n" \ +-" " OPD_ENT(_start) "\n" \ +-" .popsection\n" \ + BODY_PREFIX "_start:\n" \ + /* We start with the following on the stack, from top: \ + argc (4 bytes); \ +@@ -154,11 +147,6 @@ + ".LT__start_name_end:\n" \ + " .align 2\n" \ + " " END_2(_start) "\n" \ +-" .globl _dl_start_user\n" \ +-" .pushsection \".opd\",\"aw\"\n" \ +-"_dl_start_user:\n" \ +-" " OPD_ENT(_dl_start_user) "\n" \ +-" .popsection\n" \ + " .pushsection \".toc\",\"aw\"\n" \ + DL_STARTING_UP_DEF \ + ".LC__rtld_local:\n" \ +@@ -170,7 +158,6 @@ + ".LC__dl_fini:\n" \ + " .tc _dl_fini[TC],_dl_fini\n" \ + " .popsection\n" \ +-" .type " BODY_PREFIX "_dl_start_user,@function\n" \ + " " ENTRY_2(_dl_start_user) "\n" \ + /* Now, we do our main work of calling initialisation procedures. \ + The ELF ABI doesn't say anything about parameters for these, \ +@@ -228,10 +215,7 @@ + /* Now, call the start function descriptor at r30... */ \ + " .globl ._dl_main_dispatch\n" \ + "._dl_main_dispatch:\n" \ +-" ld 0,0(30)\n" \ +-" ld 2,8(30)\n" \ +-" mtctr 0\n" \ +-" ld 11,16(30)\n" \ ++" " PPC64_LOAD_FUNCPTR(30) "\n" \ + " bctr\n" \ + ".LT__dl_start_user:\n" \ + " .long 0\n" \ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 13:56:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 13:56:37.000000000 -0500 +@@ -71,12 +71,8 @@ + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) + mtcrf 0xFF,r0 +-/* Load the target address, toc and static chain reg from the function +- descriptor returned by fixup. */ +- ld r0,0(r3) +- ld r2,8(r3) +- mtctr r0 +- ld r11,16(r3) ++/* Prepare for calling the function returned by fixup. */ ++ PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) + /* Unwind the stack frame, and jump. */ + addi r1,r1,FRAME_SIZE +@@ -322,13 +318,9 @@ + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) + mtcrf 0xFF,r0 +-/* Load the target address, toc and static chain reg from the function +- descriptor returned by fixup. */ +- ld r0,0(r3) +- ld r2,8(r3) +- ld r11,16(r3) ++/* Prepare for calling the function returned by fixup. */ ++ PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) +- mtctr r0 + /* Load the floating point registers. */ + lfd fp1,FPR_PARMS+0(r1) + lfd fp2,FPR_PARMS+8(r1) +@@ -386,14 +378,10 @@ + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) + mtcrf 0xFF,r0 +-/* Load the target address, toc and static chain reg from the function +- descriptor returned by fixup. */ +- ld r0,0(r3) ++/* Prepare for calling the function returned by fixup. */ + std r2,40(r1) +- ld r2,8(r3) +- ld r11,16(r3) ++ PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) +- mtctr r0 + /* Load the floating point registers. */ + lfd fp1,FPR_PARMS+0(r1) + lfd fp2,FPR_PARMS+8(r1) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h 2014-05-29 13:56:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h 2014-05-29 13:56:37.000000000 -0500 +@@ -74,6 +74,14 @@ + #endif + .endm + ++/* Macro to prepare for calling via a function pointer. */ ++ .macro PPC64_LOAD_FUNCPTR PTR ++ ld r12,0(\PTR) ++ ld r2,8(\PTR) ++ mtctr r12 ++ ld r11,16(\PTR) ++ .endm ++ + #ifdef USE_PPC64_OVERLAPPING_OPD + # define OPD_ENT(name) .quad BODY_LABEL (name), .TOC.@tocbase + #else +@@ -81,7 +89,6 @@ + #endif + + #define ENTRY_1(name) \ +- .section ".text"; \ + .type BODY_LABEL(name),@function; \ + .globl name; \ + .section ".opd","aw"; \ +@@ -110,6 +117,7 @@ + #endif + + #define ENTRY(name) \ ++ .section ".text"; \ + ENTRY_2(name) \ + .align ALIGNARG(2); \ + BODY_LABEL(name): \ +@@ -127,6 +135,7 @@ + /* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes + past a 2^alignt boundary. */ + #define EALIGN(name, alignt, words) \ ++ .section ".text"; \ + ENTRY_2(name) \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ +@@ -286,24 +295,42 @@ + + #else /* !__ASSEMBLER__ */ + ++#define PPC64_LOAD_FUNCPTR(ptr) \ ++ "ld 12,0(" #ptr ");\n" \ ++ "ld 2,8(" #ptr ");\n" \ ++ "mtctr 12;\n" \ ++ "ld 11,16(" #ptr ");" ++ + #ifdef USE_PPC64_OVERLAPPING_OPD + # define OPD_ENT(name) ".quad " BODY_PREFIX #name ", .TOC.@tocbase;" + #else + # define OPD_ENT(name) ".quad " BODY_PREFIX #name ", .TOC.@tocbase, 0;" + #endif + ++#define ENTRY_1(name) \ ++ ".type " BODY_PREFIX #name ",@function;\n" \ ++ ".globl " #name ";\n" \ ++ ".pushsection \".opd\",\"aw\";\n" \ ++ ".align 3;\n" \ ++#name ":\n" \ ++ OPD_ENT (name) "\n" \ ++ ".popsection;" ++ + #ifdef HAVE_ASM_GLOBAL_DOT_NAME + # define DOT_PREFIX "." + # define BODY_PREFIX "." + # define ENTRY_2(name) \ + ".globl " BODY_PREFIX #name ";\n" \ ++ ENTRY_1(name) "\n" \ + ".size " #name ", 24;" + # define END_2(name) \ + ".size " BODY_PREFIX #name ",.-" BODY_PREFIX #name ";" + #else + # define DOT_PREFIX "" + # define BODY_PREFIX ".LY" +-# define ENTRY_2(name) ".type " #name ",@function;" ++# define ENTRY_2(name) \ ++ ".type " #name ",@function;\n" \ ++ ENTRY_1(name) + # define END_2(name) \ + ".size " #name ",.-" BODY_PREFIX #name ";\n" \ + ".size " BODY_PREFIX #name ",.-" BODY_PREFIX #name ";" +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S 2014-05-29 13:56:35.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S 2014-05-29 13:56:37.000000000 -0500 +@@ -104,9 +104,7 @@ + + std r2,40(r1) + /* Call procedure. */ +- ld r0,0(r30) +- ld r2,8(r30) +- mtctr r0 ++ PPC64_LOAD_FUNCPTR r30 + mr r3,r31 + bctrl + ld r2,40(r1) diff --git a/SOURCES/glibc-ppc64le-39.patch b/SOURCES/glibc-ppc64le-39.patch new file mode 100644 index 0000000..f837d99 --- /dev/null +++ b/SOURCES/glibc-ppc64le-39.patch @@ -0,0 +1,508 @@ +# commit 696caf1d002ff059ddd20fd5eaccd76229c14850 +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:51:11 2013 -0600 +# +# PowerPC64 ELFv2 ABI 2/6: Remove function descriptors +# +# This patch adds support for the ELFv2 ABI feature to remove function +# descriptors. See this GCC patch for in-depth discussion: +# http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01141.html +# +# This mostly involves two types of changes: updating assembler source +# files to the new logic, and updating the dynamic loader. +# +# After the refactoring in the previous patch, most of the assembler source +# changes can be handled simply by providing ELFv2 versions of the +# macros in sysdep.h. One somewhat non-obvious change is in __GI__setjmp: +# this used to "fall through" to the immediately following __setjmp ENTRY +# point. This is no longer safe in the ELFv2 since ENTRY defines both +# a global and a local entry point, and you cannot simply fall through +# to a global entry point as it requires r12 to be set up. +# +# Also, makecontext needs to be updated to set up registers according to +# the new ABI for calling into the context's start routine. +# +# The dynamic linker changes mostly consist of removing special code +# to handle function descriptors. We also need to support the new PLT +# and glink format used by the the ELFv2 linker, see: +# https://sourceware.org/ml/binutils/2013-10/msg00376.html +# +# In addition, the dynamic linker now verifies that the dynamic libraries +# it loads match its own ABI. +# +# The hack in VDSO_IFUNC_RET to "synthesize" a function descriptor +# for vDSO routines is also no longer necessary for ELFv2. +# +diff -urN glibc-2.17-c758a686/elf/elf.h glibc-2.17-c758a686/elf/elf.h +--- glibc-2.17-c758a686/elf/elf.h 2014-05-29 13:58:25.000000000 -0500 ++++ glibc-2.17-c758a686/elf/elf.h 2014-05-29 13:58:25.000000000 -0500 +@@ -2263,6 +2263,12 @@ + #define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */ + #define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */ + ++/* e_flags bits specifying ABI. ++ 1 for original function descriptor using ABI, ++ 2 for revised ABI without function descriptors, ++ 0 for unspecified or not using any features affected by the differences. */ ++#define EF_PPC64_ABI 3 ++ + /* PowerPC64 specific values for the Dyn d_tag field. */ + #define DT_PPC64_GLINK (DT_LOPROC + 0) + #define DT_PPC64_OPD (DT_LOPROC + 1) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S 2014-05-29 13:58:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S 2014-05-29 13:58:25.000000000 -0500 +@@ -64,6 +64,7 @@ + ENTRY_2(_init) + .align ALIGNARG (2) + BODY_LABEL (_init): ++ LOCALENTRY(_init) + mflr 0 + std 0, 16(r1) + stdu r1, -112(r1) +@@ -81,6 +82,7 @@ + ENTRY_2(_fini) + .align ALIGNARG (2) + BODY_LABEL (_fini): ++ LOCALENTRY(_fini) + mflr 0 + std 0, 16(r1) + stdu r1, -112(r1) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-irel.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-irel.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-irel.h 2014-05-29 13:58:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-irel.h 2014-05-29 13:58:25.000000000 -0500 +@@ -50,7 +50,11 @@ + { + Elf64_Addr *const reloc_addr = (void *) reloc->r_offset; + Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend); ++#if _CALL_ELF != 2 + *(Elf64_FuncDesc *) reloc_addr = *(Elf64_FuncDesc *) value; ++#else ++ *reloc_addr = value; ++#endif + } + else + __libc_fatal ("unexpected reloc type in static binary"); +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 13:58:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 14:05:46.000000000 -0500 +@@ -31,6 +31,7 @@ + in l_info array. */ + #define DT_PPC64(x) (DT_PPC64_##x - DT_LOPROC + DT_NUM) + ++#if _CALL_ELF != 2 + /* A PowerPC64 function descriptor. The .plt (procedure linkage + table) and .opd (official procedure descriptor) sections are + arrays of these. */ +@@ -40,6 +41,7 @@ + Elf64_Addr fd_toc; + Elf64_Addr fd_aux; + } Elf64_FuncDesc; ++#endif + + #define ELF_MULT_MACHINES_SUPPORTED + +@@ -47,6 +49,18 @@ + static inline int + elf_machine_matches_host (const Elf64_Ehdr *ehdr) + { ++ /* Verify that the binary matches our ABI version. */ ++ if ((ehdr->e_flags & EF_PPC64_ABI) != 0) ++ { ++#if _CALL_ELF != 2 ++ if ((ehdr->e_flags & EF_PPC64_ABI) != 1) ++ return 0; ++#else ++ if ((ehdr->e_flags & EF_PPC64_ABI) != 2) ++ return 0; ++#endif ++ } ++ + return ehdr->e_machine == EM_PPC64; + } + +@@ -124,6 +138,7 @@ + " .align 2\n" \ + " " ENTRY_2(_start) "\n" \ + BODY_PREFIX "_start:\n" \ ++" " LOCALENTRY(_start) "\n" \ + /* We start with the following on the stack, from top: \ + argc (4 bytes); \ + arguments for program (terminated by NULL); \ +@@ -165,6 +180,7 @@ + Changing these is strongly discouraged (not least because argc is \ + passed by value!). */ \ + BODY_PREFIX "_dl_start_user:\n" \ ++" " LOCALENTRY(_dl_start_user) "\n" \ + /* the address of _start in r30. */ \ + " mr 30,3\n" \ + /* &_dl_argc in 29, &_dl_argv in 27, and _dl_loaded in 28. */ \ +@@ -256,8 +272,22 @@ + relocations behave "normally", ie. always use the real address + like PLT relocations. So always set ELF_RTYPE_CLASS_PLT. */ + ++#if _CALL_ELF != 2 + #define elf_machine_type_class(type) \ + (ELF_RTYPE_CLASS_PLT | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY)) ++#else ++/* And now that you have read that large comment, you can disregard it ++ all for ELFv2. ELFv2 does need the special SHN_UNDEF treatment. */ ++#define IS_PPC64_TLS_RELOC(R) \ ++ (((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \ ++ || ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA)) ++ ++#define elf_machine_type_class(type) \ ++ ((((type) == R_PPC64_JMP_SLOT \ ++ || (type) == R_PPC64_ADDR24 \ ++ || IS_PPC64_TLS_RELOC (type)) * ELF_RTYPE_CLASS_PLT) \ ++ | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY)) ++#endif + + /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ + #define ELF_MACHINE_JMP_SLOT R_PPC64_JMP_SLOT +@@ -266,8 +296,19 @@ + #define ELF_MACHINE_NO_REL 1 + + /* Stuff for the PLT. */ ++#if _CALL_ELF != 2 + #define PLT_INITIAL_ENTRY_WORDS 3 ++#define PLT_ENTRY_WORDS 3 + #define GLINK_INITIAL_ENTRY_WORDS 8 ++/* The first 32k entries of glink can set an index and branch using two ++ instructions; past that point, glink uses three instructions. */ ++#define GLINK_ENTRY_WORDS(I) (((I) < 0x8000)? 2 : 3) ++#else ++#define PLT_INITIAL_ENTRY_WORDS 2 ++#define PLT_ENTRY_WORDS 1 ++#define GLINK_INITIAL_ENTRY_WORDS 8 ++#define GLINK_ENTRY_WORDS(I) 1 ++#endif + + #define PPC_DCBST(where) asm volatile ("dcbst 0,%0" : : "r"(where) : "memory") + #define PPC_DCBT(where) asm volatile ("dcbt 0,%0" : : "r"(where) : "memory") +@@ -312,17 +353,12 @@ + + if (lazy) + { +- /* The function descriptor of the appropriate trampline +- routine is used to set the 1st and 2nd doubleword of the +- plt_reserve. */ +- Elf64_FuncDesc *resolve_fd; + Elf64_Word glink_offset; +- /* the plt_reserve area is the 1st 3 doublewords of the PLT */ +- Elf64_FuncDesc *plt_reserve = (Elf64_FuncDesc *) plt; + Elf64_Word offset; ++ Elf64_Addr dlrr; + +- resolve_fd = (Elf64_FuncDesc *) (profile ? _dl_profile_resolve +- : _dl_runtime_resolve); ++ dlrr = (Elf64_Addr) (profile ? _dl_profile_resolve ++ : _dl_runtime_resolve); + if (profile && GLRO(dl_profile) != NULL + && _dl_name_match_p (GLRO(dl_profile), map)) + /* This is the object we are looking for. Say that we really +@@ -330,20 +366,33 @@ + GL(dl_profile_map) = map; + + ++#if _CALL_ELF != 2 + /* We need to stuff the address/TOC of _dl_runtime_resolve + into doublewords 0 and 1 of plt_reserve. Then we need to + stuff the map address into doubleword 2 of plt_reserve. + This allows the GLINK0 code to transfer control to the + correct trampoline which will transfer control to fixup + in dl-machine.c. */ +- plt_reserve->fd_func = resolve_fd->fd_func; +- plt_reserve->fd_toc = resolve_fd->fd_toc; +- plt_reserve->fd_aux = (Elf64_Addr) map; ++ { ++ /* The plt_reserve area is the 1st 3 doublewords of the PLT. */ ++ Elf64_FuncDesc *plt_reserve = (Elf64_FuncDesc *) plt; ++ Elf64_FuncDesc *resolve_fd = (Elf64_FuncDesc *) dlrr; ++ plt_reserve->fd_func = resolve_fd->fd_func; ++ plt_reserve->fd_toc = resolve_fd->fd_toc; ++ plt_reserve->fd_aux = (Elf64_Addr) map; + #ifdef RTLD_BOOTSTRAP +- /* When we're bootstrapping, the opd entry will not have +- been relocated yet. */ +- plt_reserve->fd_func += l_addr; +- plt_reserve->fd_toc += l_addr; ++ /* When we're bootstrapping, the opd entry will not have ++ been relocated yet. */ ++ plt_reserve->fd_func += l_addr; ++ plt_reserve->fd_toc += l_addr; ++#endif ++ } ++#else ++ /* When we don't have function descriptors, the first doubleword ++ of the PLT holds the address of _dl_runtime_resolve, and the ++ second doubleword holds the map address. */ ++ plt[0] = dlrr; ++ plt[1] = (Elf64_Addr) map; + #endif + + /* Set up the lazy PLT entries. */ +@@ -354,14 +403,8 @@ + { + + plt[offset] = (Elf64_Xword) &glink[glink_offset]; +- offset += 3; +- /* The first 32k entries of glink can set an index and +- branch using two instructions; Past that point, +- glink uses three instructions. */ +- if (i < 0x8000) +- glink_offset += 2; +- else +- glink_offset += 3; ++ offset += PLT_ENTRY_WORDS; ++ glink_offset += GLINK_ENTRY_WORDS (i); + } + + /* Now, we've modified data. We need to write the changes from +@@ -389,6 +432,7 @@ + const Elf64_Rela *reloc, + Elf64_Addr *reloc_addr, Elf64_Addr finaladdr) + { ++#if _CALL_ELF != 2 + Elf64_FuncDesc *plt = (Elf64_FuncDesc *) reloc_addr; + Elf64_FuncDesc *rel = (Elf64_FuncDesc *) finaladdr; + Elf64_Addr offset = 0; +@@ -426,6 +470,9 @@ + plt->fd_func = rel->fd_func + offset; + PPC_DCBST (&plt->fd_func); + PPC_ISYNC; ++#else ++ *reloc_addr = finaladdr; ++#endif + + return finaladdr; + } +@@ -433,6 +480,7 @@ + static inline void __attribute__ ((always_inline)) + elf_machine_plt_conflict (Elf64_Addr *reloc_addr, Elf64_Addr finaladdr) + { ++#if _CALL_ELF != 2 + Elf64_FuncDesc *plt = (Elf64_FuncDesc *) reloc_addr; + Elf64_FuncDesc *rel = (Elf64_FuncDesc *) finaladdr; + +@@ -443,6 +491,9 @@ + PPC_DCBST (&plt->fd_aux); + PPC_DCBST (&plt->fd_toc); + PPC_SYNC; ++#else ++ *reloc_addr = finaladdr; ++#endif + } + + /* Return the final value of a plt relocation. */ +@@ -512,6 +563,7 @@ + resolve_ifunc (Elf64_Addr value, + const struct link_map *map, const struct link_map *sym_map) + { ++#if _CALL_ELF != 2 + #ifndef RESOLVE_CONFLICT_FIND_MAP + /* The function we are calling may not yet have its opd entry relocated. */ + Elf64_FuncDesc opd; +@@ -529,6 +581,7 @@ + value = (Elf64_Addr) &opd; + } + #endif ++#endif + return ((Elf64_Addr (*) (unsigned long int)) value) (GLRO(dl_hwcap)); + } + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S 2014-05-29 13:58:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S 2014-05-29 14:00:27.000000000 -0500 +@@ -55,21 +55,22 @@ + 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 + HAVE_CLEANUP_JMP_BUF is defined. */ +-ENTRY (BP_SYM (__GI__setjmp)) ++ENTRY (__GI__setjmp) + std r2,40(r1) /* Save the callers TOC in the save area. */ +- cfi_endproc +-END_2 (BP_SYM (__GI__setjmp)) +-/* Fall thru. */ ++ CALL_MCOUNT 1 ++ li r4,0 /* Set second argument to 0. */ ++ b JUMPTARGET (GLUE(__sigsetjmp,_ent)) ++END (__GI__setjmp) + #endif + +-ENTRY (BP_SYM (_setjmp)) ++ENTRY (_setjmp) + CALL_MCOUNT 1 + li r4,0 /* Set second argument to 0. */ + b JUMPTARGET (GLUE(__sigsetjmp,_ent)) +-END (BP_SYM (_setjmp)) ++END (_setjmp) + libc_hidden_def (_setjmp) + +-ENTRY (BP_SYM (__sigsetjmp)) ++ENTRY (__sigsetjmp) + CALL_MCOUNT 2 + JUMPTARGET(GLUE(__sigsetjmp,_ent)): + CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) +@@ -215,18 +216,18 @@ + li r3,0 + blr + #elif defined SHARED +- b JUMPTARGET (BP_SYM (__sigjmp_save)) ++ b JUMPTARGET (__sigjmp_save) + #else + mflr r0 + std r0,16(r1) + stdu r1,-112(r1) + cfi_adjust_cfa_offset(112) + cfi_offset(lr,16) +- bl JUMPTARGET (BP_SYM (__sigjmp_save)) ++ bl JUMPTARGET (__sigjmp_save) + nop + ld r0,112+16(r1) + addi r1,r1,112 + mtlr r0 + blr + #endif +-END (BP_SYM (__sigsetjmp)) ++END (__sigsetjmp) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h 2014-05-29 13:58:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h 2014-05-29 13:58:25.000000000 -0500 +@@ -74,6 +74,8 @@ + #endif + .endm + ++#if _CALL_ELF != 2 ++ + /* Macro to prepare for calling via a function pointer. */ + .macro PPC64_LOAD_FUNCPTR PTR + ld r12,0(\PTR) +@@ -115,13 +117,37 @@ + .size name,.-BODY_LABEL(name); \ + .size BODY_LABEL(name),.-BODY_LABEL(name); + #endif ++#define LOCALENTRY(name) ++ ++#else /* _CALL_ELF */ ++ ++/* Macro to prepare for calling via a function pointer. */ ++ .macro PPC64_LOAD_FUNCPTR PTR ++ mr r12,\PTR ++ mtctr r12 ++ .endm ++ ++#define DOT_LABEL(X) X ++#define BODY_LABEL(X) X ++#define ENTRY_2(name) \ ++ .globl name; \ ++ .type name,@function; ++#define END_2(name) \ ++ .size name,.-name; ++#define LOCALENTRY(name) \ ++1: addis r2,r12,.TOC.-1b@ha; \ ++ addi r2,r2,.TOC.-1b@l; \ ++ .localentry name,.-name; ++ ++#endif /* _CALL_ELF */ + + #define ENTRY(name) \ + .section ".text"; \ + ENTRY_2(name) \ + .align ALIGNARG(2); \ + BODY_LABEL(name): \ +- cfi_startproc; ++ cfi_startproc; \ ++ LOCALENTRY(name) + + #define EALIGN_W_0 /* No words to insert. */ + #define EALIGN_W_1 nop +@@ -140,7 +166,8 @@ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ + BODY_LABEL(name): \ +- cfi_startproc; ++ cfi_startproc; \ ++ LOCALENTRY(name) + + /* Local labels stripped out by the linker. */ + #undef L +@@ -295,6 +322,8 @@ + + #else /* !__ASSEMBLER__ */ + ++#if _CALL_ELF != 2 ++ + #define PPC64_LOAD_FUNCPTR(ptr) \ + "ld 12,0(" #ptr ");\n" \ + "ld 2,8(" #ptr ");\n" \ +@@ -335,5 +364,26 @@ + ".size " #name ",.-" BODY_PREFIX #name ";\n" \ + ".size " BODY_PREFIX #name ",.-" BODY_PREFIX #name ";" + #endif ++#define LOCALENTRY(name) ++ ++#else /* _CALL_ELF */ ++ ++#define PPC64_LOAD_FUNCPTR(ptr) \ ++ "mr 12," #ptr ";\n" \ ++ "mtctr 12;" ++ ++#define DOT_PREFIX "" ++#define BODY_PREFIX "" ++#define ENTRY_2(name) \ ++ ".type " #name ",@function;\n" \ ++ ".globl " #name ";" ++#define END_2(name) \ ++ ".size " #name ",.-" #name ";" ++#define LOCALENTRY(name) \ ++ "1: addis 2,12,.TOC.-1b@ha;\n" \ ++ "addi 2,2,.TOC.-1b@l;\n" \ ++ ".localentry " #name ",.-" #name ";" ++ ++#endif /* _CALL_ELF */ + + #endif /* __ASSEMBLER__ */ +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h 2014-05-29 13:58:24.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h 2014-05-29 13:58:25.000000000 -0500 +@@ -23,6 +23,8 @@ + + /* Now define our stuff. */ + ++#if _CALL_ELF != 2 ++ + static __always_inline bool + _dl_ppc64_is_opd_sym (const struct link_map *l, const ElfW(Sym) *sym) + { +@@ -73,4 +75,6 @@ + #define DL_ADDR_SYM_MATCH(L, SYM, MATCHSYM, ADDR) \ + _dl_ppc64_addr_sym_match (L, SYM, MATCHSYM, ADDR) + ++#endif ++ + #endif /* ldsodefs.h */ +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 2014-05-29 13:58:24.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 2014-05-29 13:58:25.000000000 -0500 +@@ -111,6 +111,7 @@ + + L(noparms): + ++#if _CALL_ELF != 2 + /* Load the function address and TOC from the function descriptor + and store them in the ucontext as NIP and r2. Store the 3rd + field of the function descriptor into the ucontext as r11 in case +@@ -121,6 +122,12 @@ + std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3) + std r10,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3) + std r9,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r3) ++#else ++ /* In the ELFv2 ABI, the function pointer is already the address. ++ Store it as NIP and r12 as required by the ABI. */ ++ std r4,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3) ++ std r4,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r3) ++#endif + + /* If the target function returns we need to do some cleanup. We use a + code trick to get the address of our cleanup function into the link diff --git a/SOURCES/glibc-ppc64le-40.patch b/SOURCES/glibc-ppc64le-40.patch new file mode 100644 index 0000000..663d2f3 --- /dev/null +++ b/SOURCES/glibc-ppc64le-40.patch @@ -0,0 +1,159 @@ +# commit 122b66defdb9e4ded3ccc5c2b290f0520c6fa3cd +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:52:40 2013 -0600 +# +# PowerPC64 ELFv2 ABI 3/6: PLT local entry point optimization +# +# This is a follow-on to the previous patch to support the ELFv2 ABI in the +# dynamic loader, split off into its own patch since it is just an optional +# optimization. +# +# In the ELFv2 ABI, most functions define both a global and a local entry +# point; the local entry requires r2 to be already set up by the caller +# to point to the callee's TOC; while the global entry does not require +# the caller to know about the callee's TOC, but it needs to set up r12 +# to the callee's entry point address. +# +# Now, when setting up a PLT slot, the dynamic linker will usually need +# to enter the target function's global entry point. However, if the +# linker can prove that the target function is in the same DSO as the +# PLT slot itself, and the whole DSO only uses a single TOC (which the +# linker will let ld.so know via a DT_PPC64_OPT entry), then it is +# possible to actually enter the local entry point address into the +# PLT slot, for a slight improvement in performance. +# +# Note that this uncovered a problem on the first call via _dl_runtime_resolve, +# because that routine neglected to restore the caller's TOC before calling +# the target function for the first time, since it assumed that function +# would always reload its own TOC anyway ... +# +diff -urN glibc-2.17-c758a686/elf/elf.h glibc-2.17-c758a686/elf/elf.h +--- glibc-2.17-c758a686/elf/elf.h 2014-05-29 14:08:44.000000000 -0500 ++++ glibc-2.17-c758a686/elf/elf.h 2014-05-29 14:08:44.000000000 -0500 +@@ -2273,8 +2273,19 @@ + #define DT_PPC64_GLINK (DT_LOPROC + 0) + #define DT_PPC64_OPD (DT_LOPROC + 1) + #define DT_PPC64_OPDSZ (DT_LOPROC + 2) ++#define DT_PPC64_OPT (DT_LOPROC + 3) + #define DT_PPC64_NUM 3 + ++/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry. */ ++#define PPC64_OPT_TLS 1 ++#define PPC64_OPT_MULTI_TOC 2 ++ ++/* PowerPC64 specific values for the Elf64_Sym st_other field. */ ++#define STO_PPC64_LOCAL_BIT 5 ++#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT) ++#define PPC64_LOCAL_ENTRY_OFFSET(other) \ ++ (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2) ++ + + /* ARM specific declarations */ + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 14:08:40.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 14:08:44.000000000 -0500 +@@ -425,6 +425,42 @@ + return lazy; + } + ++#if _CALL_ELF == 2 ++/* If the PLT entry whose reloc is 'reloc' resolves to a function in ++ the same object, return the target function's local entry point ++ offset if usable. */ ++static inline Elf64_Addr __attribute__ ((always_inline)) ++ppc64_local_entry_offset (struct link_map *map, lookup_t sym_map, ++ const Elf64_Rela *reloc) ++{ ++ const Elf64_Sym *symtab; ++ const Elf64_Sym *sym; ++ ++ /* If the target function is in a different object, we cannot ++ use the local entry point. */ ++ if (sym_map != map) ++ return 0; ++ ++ /* If the linker inserted multiple TOCs, we cannot use the ++ local entry point. */ ++ if (map->l_info[DT_PPC64(OPT)] ++ && (map->l_info[DT_PPC64(OPT)]->d_un.d_val & PPC64_OPT_MULTI_TOC)) ++ return 0; ++ ++ /* Otherwise, we can use the local entry point. Retrieve its offset ++ from the symbol's ELF st_other field. */ ++ symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]); ++ sym = &symtab[ELFW(R_SYM) (reloc->r_info)]; ++ ++ /* If the target function is an ifunc then the local entry offset is ++ for the resolver, not the final destination. */ ++ if (__builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)) ++ return 0; ++ ++ return PPC64_LOCAL_ENTRY_OFFSET (sym->st_other); ++} ++#endif ++ + /* Change the PLT entry whose reloc is 'reloc' to call the actual + routine. */ + static inline Elf64_Addr __attribute__ ((always_inline)) +@@ -471,6 +507,7 @@ + PPC_DCBST (&plt->fd_func); + PPC_ISYNC; + #else ++ finaladdr += ppc64_local_entry_offset (map, sym_map, reloc); + *reloc_addr = finaladdr; + #endif + +@@ -478,7 +515,9 @@ + } + + static inline void __attribute__ ((always_inline)) +-elf_machine_plt_conflict (Elf64_Addr *reloc_addr, Elf64_Addr finaladdr) ++elf_machine_plt_conflict (struct link_map *map, lookup_t sym_map, ++ const Elf64_Rela *reloc, ++ Elf64_Addr *reloc_addr, Elf64_Addr finaladdr) + { + #if _CALL_ELF != 2 + Elf64_FuncDesc *plt = (Elf64_FuncDesc *) reloc_addr; +@@ -492,6 +531,7 @@ + PPC_DCBST (&plt->fd_toc); + PPC_SYNC; + #else ++ finaladdr += ppc64_local_entry_offset (map, sym_map, reloc); + *reloc_addr = finaladdr; + #endif + } +@@ -641,7 +681,7 @@ + /* Fall thru */ + case R_PPC64_JMP_SLOT: + #ifdef RESOLVE_CONFLICT_FIND_MAP +- elf_machine_plt_conflict (reloc_addr, value); ++ elf_machine_plt_conflict (map, sym_map, reloc, reloc_addr, value); + #else + elf_machine_fixup_plt (map, sym_map, reloc, reloc_addr, value); + #endif +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:08:40.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:08:44.000000000 -0500 +@@ -74,6 +74,10 @@ + /* Prepare for calling the function returned by fixup. */ + PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) ++#if _CALL_ELF == 2 ++/* Restore the caller's TOC in case we jump to a local entry point. */ ++ ld r2,FRAME_SIZE+40(r1) ++#endif + /* Unwind the stack frame, and jump. */ + addi r1,r1,FRAME_SIZE + bctr +@@ -321,6 +325,10 @@ + /* Prepare for calling the function returned by fixup. */ + PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) ++#if _CALL_ELF == 2 ++/* Restore the caller's TOC in case we jump to a local entry point. */ ++ ld r2,FRAME_SIZE+40(r1) ++#endif + /* Load the floating point registers. */ + lfd fp1,FPR_PARMS+0(r1) + lfd fp2,FPR_PARMS+8(r1) diff --git a/SOURCES/glibc-ppc64le-41.patch b/SOURCES/glibc-ppc64le-41.patch new file mode 100644 index 0000000..506d761 --- /dev/null +++ b/SOURCES/glibc-ppc64le-41.patch @@ -0,0 +1,764 @@ +# commit 8b8a692cfd7d80f1ee7c8b9ab356a259367dd187 +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:55:03 2013 -0600 +# +# PowerPC64 ELFv2 ABI 4/6: Stack frame layout changes +# +# This updates glibc for the changes in the ELFv2 relating to the +# stack frame layout. These are described in more detail here: +# http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01149.html +# http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01146.html +# +# Specifically, the "compiler and linker doublewords" were removed, +# which has the effect that the save slot for the TOC register is +# now at offset 24 rather than 40 to the stack pointer. +# +# In addition, a function may now no longer necessarily assume that +# its caller has set up a 64-byte register save area its use. +# +# To address the first change, the patch goes through all assembler +# files and replaces immediate offsets in instructions accessing the +# ABI-defined stack slots by symbolic offsets. Those already were +# defined in ucontext_i.sym and used in some of the context routines, +# but that doesn't really seem like the right place for those defines. +# +# The patch instead defines those symbolic offsets in sysdeps.h, +# in two variants for the old and new ABI, and uses them systematically +# in all assembler files, not just the context routines. +# +# The second change only affected a few assembler files that used +# the save area to temporarily store some registers. In those +# cases where this happens within a leaf function, this patch +# changes the code to store those registers to the "red zone" +# below the stack pointer. Otherwise, the functions already allocate +# a stack frame, and the patch changes them to add extra space in +# these frames as temporary space for the ELFv2 ABI. +# +diff -urN glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h 2014-05-29 14:10:00.000000000 -0500 ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h 2014-05-29 14:10:00.000000000 -0500 +@@ -31,6 +31,14 @@ + # define DASHDASHPFX(str) __##str + # endif + ++#if _CALL_ELF == 2 ++#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16+48) ++#define CANCEL_PARM_SAVE (FRAME_MIN_SIZE+16) ++#else ++#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16) ++#define CANCEL_PARM_SAVE (CANCEL_FRAMESIZE+FRAME_PARM_SAVE) ++#endif ++ + # undef PSEUDO + # define PSEUDO(name, syscall_name, args) \ + .section ".text"; \ +@@ -44,52 +52,52 @@ + PSEUDO_RET; \ + .size DASHDASHPFX(syscall_name##_nocancel),.-DASHDASHPFX(syscall_name##_nocancel); \ + .Lpseudo_cancel: \ +- stdu 1,-128(1); \ +- cfi_adjust_cfa_offset (128); \ ++ stdu 1,-CANCEL_FRAMESIZE(1); \ ++ cfi_adjust_cfa_offset (CANCEL_FRAMESIZE); \ + mflr 9; \ +- std 9,128+16(1); \ +- cfi_offset (lr, 16); \ ++ std 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \ ++ cfi_offset (lr, FRAME_LR_SAVE); \ + DOCARGS_##args; /* save syscall args around CENABLE. */ \ + CENABLE; \ +- std 3,112(1); /* store CENABLE return value (MASK). */ \ ++ std 3,FRAME_MIN_SIZE(1); /* store CENABLE return value (MASK). */ \ + UNDOCARGS_##args; /* restore syscall args. */ \ + DO_CALL (SYS_ify (syscall_name)); \ + mfcr 0; /* save CR/R3 around CDISABLE. */ \ +- std 3,120(1); \ +- std 0,128+8(1); \ +- cfi_offset (cr, 8); \ +- ld 3,112(1); /* pass MASK to CDISABLE. */ \ ++ std 3,FRAME_MIN_SIZE+8(1); \ ++ std 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); \ ++ cfi_offset (cr, FRAME_CR_SAVE); \ ++ ld 3,FRAME_MIN_SIZE(1); /* pass MASK to CDISABLE. */ \ + CDISABLE; \ +- ld 9,128+16(1); \ +- ld 0,128+8(1); /* restore CR/R3. */ \ +- ld 3,120(1); \ ++ ld 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \ ++ ld 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); /* restore CR/R3. */ \ ++ ld 3,FRAME_MIN_SIZE+8(1); \ + mtlr 9; \ + mtcr 0; \ +- addi 1,1,128; \ +- cfi_adjust_cfa_offset (-128); \ ++ addi 1,1,CANCEL_FRAMESIZE; \ ++ cfi_adjust_cfa_offset (-CANCEL_FRAMESIZE); \ + cfi_restore (lr); \ + cfi_restore (cr) + + # define DOCARGS_0 + # define UNDOCARGS_0 + +-# define DOCARGS_1 std 3,128+48(1); DOCARGS_0 +-# define UNDOCARGS_1 ld 3,128+48(1); UNDOCARGS_0 ++# define DOCARGS_1 std 3,CANCEL_PARM_SAVE(1); DOCARGS_0 ++# define UNDOCARGS_1 ld 3,CANCEL_PARM_SAVE(1); UNDOCARGS_0 + +-# define DOCARGS_2 std 4,128+56(1); DOCARGS_1 +-# define UNDOCARGS_2 ld 4,128+56(1); UNDOCARGS_1 ++# define DOCARGS_2 std 4,CANCEL_PARM_SAVE+8(1); DOCARGS_1 ++# define UNDOCARGS_2 ld 4,CANCEL_PARM_SAVE+8(1); UNDOCARGS_1 + +-# define DOCARGS_3 std 5,128+64(1); DOCARGS_2 +-# define UNDOCARGS_3 ld 5,128+64(1); UNDOCARGS_2 ++# define DOCARGS_3 std 5,CANCEL_PARM_SAVE+16(1); DOCARGS_2 ++# define UNDOCARGS_3 ld 5,CANCEL_PARM_SAVE+16(1); UNDOCARGS_2 + +-# define DOCARGS_4 std 6,128+72(1); DOCARGS_3 +-# define UNDOCARGS_4 ld 6,128+72(1); UNDOCARGS_3 ++# define DOCARGS_4 std 6,CANCEL_PARM_SAVE+24(1); DOCARGS_3 ++# define UNDOCARGS_4 ld 6,CANCEL_PARM_SAVE+24(1); UNDOCARGS_3 + +-# define DOCARGS_5 std 7,128+80(1); DOCARGS_4 +-# define UNDOCARGS_5 ld 7,128+80(1); UNDOCARGS_4 ++# define DOCARGS_5 std 7,CANCEL_PARM_SAVE+32(1); DOCARGS_4 ++# define UNDOCARGS_5 ld 7,CANCEL_PARM_SAVE+32(1); UNDOCARGS_4 + +-# define DOCARGS_6 std 8,128+88(1); DOCARGS_5 +-# define UNDOCARGS_6 ld 8,128+88(1); UNDOCARGS_5 ++# 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 + # ifdef SHARED +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/__longjmp-common.S 2014-05-29 14:10:00.000000000 -0500 +@@ -133,7 +133,7 @@ + ld r14,((JB_GPRS+0)*8)(r3) + lfd fp14,((JB_FPRS+0)*8)(r3) + #if defined SHARED && !defined IS_IN_rtld +- std r2,40(r1) /* Restore the callers TOC save area. */ ++ std r2,FRAME_TOC_SAVE(r1) /* Restore the callers TOC save area. */ + #endif + ld r15,((JB_GPRS+1)*8)(r3) + lfd fp15,((JB_FPRS+1)*8)(r3) +@@ -151,7 +151,7 @@ + PTR_DEMANGLE2 (r0, r25) + #endif + mtlr r0 +-/* std r2,40(r1) Restore the TOC save area. */ ++/* std r2,FRAME_TOC_SAVE(r1) Restore the TOC save area. */ + ld r21,((JB_GPRS+7)*8)(r3) + lfd fp21,((JB_FPRS+7)*8)(r3) + ld r22,((JB_GPRS+8)*8)(r3) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crti.S 2014-05-29 14:10:00.000000000 -0500 +@@ -66,8 +66,8 @@ + BODY_LABEL (_init): + LOCALENTRY(_init) + mflr 0 +- std 0, 16(r1) +- stdu r1, -112(r1) ++ std 0, FRAME_LR_SAVE(r1) ++ stdu r1, -FRAME_MIN_SIZE_PARM(r1) + #if PREINIT_FUNCTION_WEAK + addis r9, r2, .LC0@toc@ha + ld r0, .LC0@toc@l(r9) +@@ -84,5 +84,5 @@ + BODY_LABEL (_fini): + LOCALENTRY(_fini) + mflr 0 +- std 0, 16(r1) +- stdu r1, -112(r1) ++ std 0, FRAME_LR_SAVE(r1) ++ stdu r1, -FRAME_MIN_SIZE_PARM(r1) +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crtn.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crtn.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crtn.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/crtn.S 2014-05-29 14:10:00.000000000 -0500 +@@ -39,13 +39,13 @@ + #include <sysdep.h> + + .section .init,"ax",@progbits +- addi r1, r1, 112 +- ld r0, 16(r1) ++ addi r1, r1, FRAME_MIN_SIZE_PARM ++ ld r0, FRAME_LR_SAVE(r1) + mtlr r0 + blr + + .section .fini,"ax",@progbits +- addi r1, r1, 112 +- ld r0, 16(r1) ++ addi r1, r1, FRAME_MIN_SIZE_PARM ++ ld r0, FRAME_LR_SAVE(r1) + mtlr r0 + blr +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:10:00.000000000 -0500 +@@ -26,13 +26,13 @@ + parm1 (r3) and the index (r0) need to be converted to an offset + (index * 24) in parm2 (r4). */ + +-#define FRAME_SIZE 176 ++#define FRAME_SIZE (FRAME_MIN_SIZE+64) + /* We need to save the registers used to pass parameters, ie. r3 thru + r10; Use local var space rather than the parameter save area, + because gcc as of 2010/05 doesn't allocate a proper stack frame for + a function that makes no calls except for __tls_get_addr and we + might be here resolving the __tls_get_addr call. */ +-#define INT_PARMS 112 ++#define INT_PARMS FRAME_MIN_SIZE + EALIGN(_dl_runtime_resolve, 4, 0) + stdu r1,-FRAME_SIZE(r1) + cfi_adjust_cfa_offset (FRAME_SIZE) +@@ -48,25 +48,25 @@ + mflr r0 + std r8,INT_PARMS+40(r1) + /* Store the LR in the LR Save area. */ +- std r0,FRAME_SIZE+16(r1) +- cfi_offset (lr, 16) ++ std r0,FRAME_SIZE+FRAME_LR_SAVE(r1) ++ cfi_offset (lr, FRAME_LR_SAVE) + mfcr r0 + std r9,INT_PARMS+48(r1) + std r10,INT_PARMS+56(r1) + /* I'm almost certain we don't have to save cr... be safe. */ +- std r0,FRAME_SIZE+8(r1) ++ std r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + bl JUMPTARGET(_dl_fixup) + #ifndef SHARED + nop + #endif + /* Put the registers back. */ +- ld r0,FRAME_SIZE+16(r1) ++ ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1) + ld r10,INT_PARMS+56(r1) + ld r9,INT_PARMS+48(r1) + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+8(r1) ++ ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +@@ -76,7 +76,7 @@ + ld r3,INT_PARMS+0(r1) + #if _CALL_ELF == 2 + /* Restore the caller's TOC in case we jump to a local entry point. */ +- ld r2,FRAME_SIZE+40(r1) ++ ld r2,FRAME_SIZE+FRAME_TOC_SAVE(r1) + #endif + /* Unwind the stack frame, and jump. */ + addi r1,r1,FRAME_SIZE +@@ -86,6 +86,7 @@ + #undef INT_PARMS + + /* Stack layout: ++ (Note: some of these are not required for the ELFv2 ABI.) + +592 previous backchain + +584 spill_r31 + +576 spill_r30 +@@ -147,10 +148,11 @@ + +64 parm3 + +56 parm2 + +48 parm1 +- * Parameter save area, Allocated by the call, at least 8 double words +- +40 TOC save area +- +32 Reserved for linker +- +24 Reserved for compiler ++ * Parameter save area ++ * (v1 ABI: Allocated by the call, at least 8 double words) ++ +40 v1 ABI: TOC save area ++ +32 v1 ABI: Reserved for linker ++ +24 v1 ABI: Reserved for compiler / v2 ABI: TOC save area + +16 LR save area + +8 CR save area + r1+0 stack back chain +@@ -206,15 +208,15 @@ + /* Store the LR in the LR Save area of the previous frame. */ + /* XXX Do we have to do this? */ + la r8,FRAME_SIZE(r1) +- std r5,FRAME_SIZE+16(r1) +- cfi_offset (lr, 16) ++ std r5,FRAME_SIZE+FRAME_LR_SAVE(r1) ++ cfi_offset (lr, FRAME_LR_SAVE) + std r5,CALLING_LR(r1) + mfcr r0 + std r9,INT_PARMS+48(r1) + std r10,INT_PARMS+56(r1) + std r8,CALLING_SP(r1) + /* I'm almost certain we don't have to save cr... be safe. */ +- std r0,FRAME_SIZE+8(r1) ++ std r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r12,.LC__dl_hwcap@toc(r2) + #ifdef SHARED + /* Load _rtld_local_ro._dl_hwcap. */ +@@ -311,13 +313,13 @@ + lvx v12,r11,r10 + lvx v13,r11,r9 + L(restoreFXR): +- ld r0,FRAME_SIZE+16(r1) ++ ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1) + ld r10,INT_PARMS+56(r1) + ld r9,INT_PARMS+48(r1) + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+8(r1) ++ ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +@@ -327,7 +329,7 @@ + ld r3,INT_PARMS+0(r1) + #if _CALL_ELF == 2 + /* Restore the caller's TOC in case we jump to a local entry point. */ +- ld r2,FRAME_SIZE+40(r1) ++ ld r2,FRAME_SIZE+FRAME_TOC_SAVE(r1) + #endif + /* Load the floating point registers. */ + lfd fp1,FPR_PARMS+0(r1) +@@ -375,19 +377,19 @@ + lvx v12,r11,r10 + lvx v13,r11,r9 + L(restoreFXR2): +- ld r0,FRAME_SIZE+16(r1) ++ ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1) + ld r10,INT_PARMS+56(r1) + ld r9,INT_PARMS+48(r1) + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+8(r1) ++ ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) + mtcrf 0xFF,r0 + /* Prepare for calling the function returned by fixup. */ +- std r2,40(r1) ++ std r2,FRAME_TOC_SAVE(r1) + PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) + /* Load the floating point registers. */ +@@ -406,7 +408,7 @@ + lfd fp13,FPR_PARMS+96(r1) + /* Call the target function. */ + bctrl +- ld r2,40(r1) ++ ld r2,FRAME_TOC_SAVE(r1) + lwz r12,VR_VRSAVE(r1) + /* But return here and store the return values. */ + std r3,INT_RTN(r1) +@@ -441,7 +443,7 @@ + beq L(pltexitreturn) + lvx v2,0,r10 + L(pltexitreturn): +- ld r0,FRAME_SIZE+16(r1) ++ ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1) + ld r31,584(r1) + ld r30,576(r1) + mtlr r0 +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/ppc-mcount.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/ppc-mcount.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/ppc-mcount.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/ppc-mcount.S 2014-05-29 14:10:00.000000000 -0500 +@@ -24,16 +24,16 @@ + ENTRY(_mcount) + mflr r4 + ld r11, 0(r1) +- stdu r1,-112(r1) +- cfi_adjust_cfa_offset (112) +- std r4, 128(r1) +- cfi_offset (lr, 16) +- ld r3, 16(r11) ++ stdu r1,-FRAME_MIN_SIZE(r1) ++ cfi_adjust_cfa_offset (FRAME_MIN_SIZE) ++ std r4, FRAME_MIN_SIZE+FRAME_LR_SAVE(r1) ++ cfi_offset (lr, FRAME_LR_SAVE) ++ ld r3, FRAME_LR_SAVE(r11) + bl JUMPTARGET(__mcount_internal) + nop +- ld r0, 128(r1) ++ ld r0, FRAME_MIN_SIZE+FRAME_LR_SAVE(r1) + mtlr r0 +- addi r1,r1,112 ++ addi r1,r1,FRAME_MIN_SIZE + blr + END(_mcount) + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/setjmp-common.S 2014-05-29 14:10:00.000000000 -0500 +@@ -56,7 +56,7 @@ + bugz #269. __GI__setjmp is used in csu/libc-start.c when + HAVE_CLEANUP_JMP_BUF is defined. */ + ENTRY (__GI__setjmp) +- std r2,40(r1) /* Save the callers TOC in the save area. */ ++ std r2,FRAME_TOC_SAVE(r1) /* Save the callers TOC in the save area. */ + CALL_MCOUNT 1 + li r4,0 /* Set second argument to 0. */ + b JUMPTARGET (GLUE(__sigsetjmp,_ent)) +@@ -83,7 +83,7 @@ + #endif + mflr r0 + #if defined SHARED && !defined IS_IN_rtld +- ld r5,40(r1) /* Retrieve the callers TOC. */ ++ ld r5,FRAME_TOC_SAVE(r1) /* Retrieve the callers TOC. */ + std r5,(JB_GPR2*8)(3) + #else + std r2,(JB_GPR2*8)(3) +@@ -219,14 +219,14 @@ + b JUMPTARGET (__sigjmp_save) + #else + mflr r0 +- std r0,16(r1) +- stdu r1,-112(r1) +- cfi_adjust_cfa_offset(112) +- cfi_offset(lr,16) ++ std r0,FRAME_LR_SAVE(r1) ++ stdu r1,-FRAME_MIN_SIZE(r1) ++ cfi_adjust_cfa_offset(FRAME_MIN_SIZE) ++ cfi_offset(lr,FRAME_LR_SAVE) + bl JUMPTARGET (__sigjmp_save) + nop +- ld r0,112+16(r1) +- addi r1,r1,112 ++ ld r0,FRAME_MIN_SIZE+FRAME_LR_SAVE(r1) ++ addi r1,r1,FRAME_MIN_SIZE + mtlr r0 + blr + #endif +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/sysdep.h 2014-05-29 14:10:00.000000000 -0500 +@@ -20,25 +20,67 @@ + + #ifdef __ASSEMBLER__ + ++/* Stack frame offsets. */ ++#if _CALL_ELF != 2 ++#define FRAME_MIN_SIZE 112 ++#define FRAME_MIN_SIZE_PARM 112 ++#define FRAME_BACKCHAIN 0 ++#define FRAME_CR_SAVE 8 ++#define FRAME_LR_SAVE 16 ++#define FRAME_TOC_SAVE 40 ++#define FRAME_PARM_SAVE 48 ++#define FRAME_PARM1_SAVE 48 ++#define FRAME_PARM2_SAVE 56 ++#define FRAME_PARM3_SAVE 64 ++#define FRAME_PARM4_SAVE 72 ++#define FRAME_PARM5_SAVE 80 ++#define FRAME_PARM6_SAVE 88 ++#define FRAME_PARM7_SAVE 96 ++#define FRAME_PARM8_SAVE 104 ++#define FRAME_PARM9_SAVE 112 ++#else ++#define FRAME_MIN_SIZE 32 ++#define FRAME_MIN_SIZE_PARM 96 ++#define FRAME_BACKCHAIN 0 ++#define FRAME_CR_SAVE 8 ++#define FRAME_LR_SAVE 16 ++#define FRAME_TOC_SAVE 24 ++#define FRAME_PARM_SAVE 32 ++#define FRAME_PARM1_SAVE 32 ++#define FRAME_PARM2_SAVE 40 ++#define FRAME_PARM3_SAVE 48 ++#define FRAME_PARM4_SAVE 56 ++#define FRAME_PARM5_SAVE 64 ++#define FRAME_PARM6_SAVE 72 ++#define FRAME_PARM7_SAVE 80 ++#define FRAME_PARM8_SAVE 88 ++#define FRAME_PARM9_SAVE 96 ++#endif ++ + /* Support macros for CALL_MCOUNT. */ ++#if _CALL_ELF == 2 ++#define call_mcount_parm_offset (-64) ++#else ++#define call_mcount_parm_offset FRAME_PARM_SAVE ++#endif + .macro SAVE_ARG NARG + .if \NARG + SAVE_ARG \NARG-1 +- std 2+\NARG,40+8*(\NARG)(1) ++ std 2+\NARG,call_mcount_parm_offset-8+8*(\NARG)(1) + .endif + .endm + + .macro REST_ARG NARG + .if \NARG + REST_ARG \NARG-1 +- ld 2+\NARG,112+40+8*(\NARG)(1) ++ ld 2+\NARG,FRAME_MIN_SIZE_PARM+call_mcount_parm_offset-8+8*(\NARG)(1) + .endif + .endm + + .macro CFI_SAVE_ARG NARG + .if \NARG + CFI_SAVE_ARG \NARG-1 +- cfi_offset(2+\NARG,40+8*(\NARG)) ++ cfi_offset(2+\NARG,call_mcount_parm_offset-8+8*(\NARG)) + .endif + .endm + +@@ -55,20 +97,20 @@ + #ifdef PROF + mflr r0 + SAVE_ARG \NARG +- std r0,16(r1) +- stdu r1,-112(r1) +- cfi_adjust_cfa_offset(112) +- cfi_offset(lr,16) ++ std r0,FRAME_LR_SAVE(r1) ++ stdu r1,-FRAME_MIN_SIZE_PARM(r1) ++ cfi_adjust_cfa_offset(FRAME_MIN_SIZE_PARM) ++ cfi_offset(lr,FRAME_LR_SAVE) + CFI_SAVE_ARG \NARG + bl JUMPTARGET (_mcount) + #ifndef SHARED + nop + #endif +- ld r0,128(r1) ++ ld r0,FRAME_MIN_SIZE_PARM+FRAME_LR_SAVE(r1) + REST_ARG \NARG + mtlr r0 +- addi r1,r1,112 +- cfi_adjust_cfa_offset(-112) ++ addi r1,r1,FRAME_MIN_SIZE_PARM ++ cfi_adjust_cfa_offset(-FRAME_MIN_SIZE_PARM) + cfi_restore(lr) + CFI_REST_ARG \NARG + #endif +@@ -267,15 +309,15 @@ + .else; \ + .Local_syscall_error: \ + mflr 0; \ +- std 0,16(1); \ +- stdu 1,-112(1); \ +- cfi_adjust_cfa_offset(112); \ +- cfi_offset(lr,16); \ ++ std 0,FRAME_LR_SAVE(1); \ ++ stdu 1,-FRAME_MIN_SIZE(1); \ ++ cfi_adjust_cfa_offset(FRAME_MIN_SIZE); \ ++ cfi_offset(lr,FRAME_LR_SAVE); \ + bl JUMPTARGET(__syscall_error); \ + nop; \ +- ld 0,112+16(1); \ +- addi 1,1,112; \ +- cfi_adjust_cfa_offset(-112); \ ++ ld 0,FRAME_MIN_SIZE+FRAME_LR_SAVE(1); \ ++ addi 1,1,FRAME_MIN_SIZE; \ ++ cfi_adjust_cfa_offset(-FRAME_MIN_SIZE); \ + mtlr 0; \ + cfi_restore(lr); \ + blr; \ +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S 2014-05-29 14:10:00.000000000 -0500 +@@ -33,24 +33,24 @@ + cmpld reg, r1; \ + bge+ .Lok; \ + mflr r0; \ +- std r0,16(r1); \ ++ std r0,FRAME_LR_SAVE(r1); \ + mr r31,r3; \ + mr r30,r4; \ +- stdu r1,-144(r1); \ ++ stdu r1,-FRAME_MIN_SIZE-32(r1); \ + cfi_remember_state; \ +- cfi_adjust_cfa_offset (144); \ +- cfi_offset (lr, 16); \ ++ cfi_adjust_cfa_offset (FRAME_MIN_SIZE+32); \ ++ cfi_offset (lr, FRAME_LR_SAVE); \ + li r3,0; \ +- addi r4,r1,112; \ ++ addi r4,r1,FRAME_MIN_SIZE; \ + li r0,__NR_sigaltstack; \ + sc; \ + /* Without working sigaltstack we cannot perform the test. */ \ + bso .Lok2; \ +- lwz r0,112+8(r1); \ ++ lwz r0,FRAME_MIN_SIZE+8(r1); \ + andi. r4,r0,1; \ + beq .Lfail; \ +- ld r0,112+16(r1); \ +- ld r4,112(r1); \ ++ ld r0,FRAME_MIN_SIZE+16(r1); \ ++ ld r4,FRAME_MIN_SIZE(r1); \ + add r4,r4,r0; \ + sub r3,r3,reg; \ + cmpld r3,r0; \ +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S 2014-05-29 14:10:00.000000000 -0500 +@@ -31,9 +31,9 @@ + CALL_MCOUNT 1 + DISCARD_BOUNDS (r3) /* the bounds are meaningless, so toss 'em. */ + +- std r3,48(r1) ++ std r3,-8(r1) + DO_CALL(SYS_ify(brk)) +- ld r6,48(r1) ++ ld r6,-8(r1) + ld r5,.LC__curbrk@toc(r2) + std r3,0(r5) + cmpld r6,r3 +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S 2014-05-29 14:10:00.000000000 -0500 +@@ -45,22 +45,22 @@ + cror cr0*4+eq,cr1*4+eq,cr0*4+eq + beq- cr0,L(badargs) + +- /* Save some regs in parm save area. */ ++ /* Save some regs in the "red zone". */ + #ifdef RESET_PID +- std r29,48(r1) ++ std r29,-24(r1) + #endif +- std r30,56(r1) +- std r31,64(r1) ++ std r30,-16(r1) ++ std r31,-8(r1) + #ifdef RESET_PID +- cfi_offset(r29,48) ++ cfi_offset(r29,-24) + #endif +- cfi_offset(r30,56) +- cfi_offset(r31,64) ++ cfi_offset(r30,-16) ++ cfi_offset(r31,-8) + + /* Set up stack frame for child. */ + clrrdi r4,r4,4 + li r0,0 +- stdu r0,-112(r4) /* min stack frame is 112 bytes per ABI */ ++ stdu r0,-FRAME_MIN_SIZE_PARM(r4) + + /* Save fn, args, stack across syscall. */ + mr r30,r3 /* Function in r30. */ +@@ -102,12 +102,12 @@ + L(oldpid): + #endif + +- std r2,40(r1) ++ std r2,FRAME_TOC_SAVE(r1) + /* Call procedure. */ + PPC64_LOAD_FUNCPTR r30 + mr r3,r31 + bctrl +- ld r2,40(r1) ++ ld r2,FRAME_TOC_SAVE(r1) + /* Call _exit with result from procedure. */ + #ifdef SHARED + b JUMPTARGET(__GI__exit) +@@ -126,15 +126,15 @@ + L(parent): + /* Parent. Restore registers & return. */ + #ifdef RESET_PID +- cfi_offset(r29,48) ++ cfi_offset(r29,-24) + #endif +- cfi_offset(r30,56) +- cfi_offset(r31,64) ++ cfi_offset(r30,-16) ++ cfi_offset(r31,-8) + #ifdef RESET_PID +- ld r29,48(r1) ++ ld r29,-24(r1) + #endif +- ld r30,56(r1) +- ld r31,64(r1) ++ ld r30,-16(r1) ++ ld r31,-8(r1) + #ifdef RESET_PID + cfi_restore(r29) + #endif +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S 2014-05-29 14:10:00.000000000 -0500 +@@ -46,8 +46,13 @@ + # endif + #endif + +-#define FRAMESIZE 128 +-#define stackblock FRAMESIZE+48 /* offset to parm save area. */ ++#if _CALL_ELF == 2 ++#define FRAMESIZE (FRAME_MIN_SIZE+16+64) ++#define stackblock (FRAME_MIN_SIZE+16) ++#else ++#define FRAMESIZE (FRAME_MIN_SIZE+16) ++#define stackblock (FRAMESIZE+FRAME_PARM_SAVE) /* offset to parm save area. */ ++#endif + + .text + ENTRY(__socket) +@@ -98,22 +103,22 @@ + .Lsocket_cancel: + cfi_adjust_cfa_offset(FRAMESIZE) + mflr r9 +- std r9,FRAMESIZE+16(r1) +- cfi_offset (lr, 16) ++ std r9,FRAMESIZE+FRAME_LR_SAVE(r1) ++ cfi_offset (lr, FRAME_LR_SAVE) + CENABLE +- std r3,120(r1) ++ std r3,FRAME_MIN_SIZE+8(r1) + li r3,P(SOCKOP_,socket) + addi r4,r1,stackblock + DO_CALL(SYS_ify(socketcall)) + mfcr r0 +- std r3,112(r1) +- std r0,FRAMESIZE+8(r1) +- cfi_offset (cr, 8) +- ld r3,120(r1) ++ std r3,FRAME_MIN_SIZE(r1) ++ std r0,FRAMESIZE+FRAME_CR_SAVE(r1) ++ cfi_offset (cr, FRAME_CR_SAVE) ++ ld r3,FRAME_MIN_SIZE+8(r1) + CDISABLE +- ld r4,FRAMESIZE+16(r1) +- ld r0,FRAMESIZE+8(r1) +- ld r3,112(r1) ++ ld r4,FRAMESIZE+FRAME_LR_SAVE(r1) ++ ld r0,FRAMESIZE+FRAME_CR_SAVE(r1) ++ ld r3,FRAME_MIN_SIZE(r1) + mtlr r4 + mtcr r0 + addi r1,r1,FRAMESIZE +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym 2014-05-29 14:09:56.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym 2014-05-29 14:10:00.000000000 -0500 +@@ -8,27 +8,6 @@ + SIG_SETMASK + + +--- Offsets of the fields in the powerpc64 ABI stack frame. +--- XXX Do these correspond to some struct? +- +-FRAME_BACKCHAIN 0 +-FRAME_CR_SAVE 8 +-FRAME_LR_SAVE 16 +-FRAME_COMPILER_DW 24 +-FRAME_LINKER_DW 32 +-FRAME_TOC_SAVE 40 +-FRAME_PARM_SAVE 48 +-FRAME_PARM1_SAVE 48 +-FRAME_PARM2_SAVE 56 +-FRAME_PARM3_SAVE 64 +-FRAME_PARM4_SAVE 72 +-FRAME_PARM5_SAVE 80 +-FRAME_PARM6_SAVE 88 +-FRAME_PARM7_SAVE 96 +-FRAME_PARM8_SAVE 104 +-FRAME_PARM9_SAVE 112 +- +- + -- Offsets of the fields in the ucontext_t structure. + #define ucontext(member) offsetof (ucontext_t, member) + #define mcontext(member) ucontext (uc_mcontext.member) diff --git a/SOURCES/glibc-ppc64le-42.patch b/SOURCES/glibc-ppc64le-42.patch new file mode 100644 index 0000000..f5fa53e --- /dev/null +++ b/SOURCES/glibc-ppc64le-42.patch @@ -0,0 +1,404 @@ +# commit 61cd8fe4017c251617dd300818917e61a12ab48e +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 06:59:37 2013 -0600 +# +# PowerPC64 ELFv2 ABI 5/6: LD_AUDIT interface changes +# +# The ELFv2 ABI changes the calling convention by passing and returning +# structures in registers in more cases than the old ABI: +# http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01145.html +# http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01147.html +# +# For the most part, this does not affect glibc, since glibc assembler +# files do not use structure parameters / return values. However, one +# place is affected: the LD_AUDIT interface provides a structure to +# the audit routine that contains all registers holding function +# argument and return values for the intercepted PLT call. +# +# Since the new ABI now sometimes uses registers to return values +# that were never used for this purpose in the old ABI, this structure +# has to be extended. To force audit routines to be modified for the +# new ABI if necessary, the patch defines v2 variants of the la_ppc64 +# types and routines. +# +# In addition, the patch contains two unrelated changes to the +# PLT trampoline routines: it fixes a bug where FPR return values +# were stored in the wrong place, and it removes the unnecessary +# save/restore of CR. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h +--- glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/bits/link.h 2014-05-29 14:11:20.000000000 -0500 +@@ -63,7 +63,7 @@ + + __END_DECLS + +-#else ++#elif _CALL_ELF != 2 + + /* Registers for entry into PLT on PPC64. */ + typedef struct La_ppc64_regs +@@ -107,4 +107,48 @@ + + __END_DECLS + ++#else ++ ++/* Registers for entry into PLT on PPC64 in the ELFv2 ABI. */ ++typedef struct La_ppc64v2_regs ++{ ++ uint64_t lr_reg[8]; ++ double lr_fp[13]; ++ uint32_t __padding; ++ uint32_t lr_vrsave; ++ uint32_t lr_vreg[12][4] __attribute__ ((aligned (16))); ++ uint64_t lr_r1; ++ uint64_t lr_lr; ++} La_ppc64v2_regs; ++ ++/* Return values for calls from PLT on PPC64 in the ELFv2 ABI. */ ++typedef struct La_ppc64v2_retval ++{ ++ uint64_t lrv_r3; ++ uint64_t lrv_r4; ++ double lrv_fp[10]; ++ uint32_t lrv_vreg[8][4] __attribute__ ((aligned (16))); ++} La_ppc64v2_retval; ++ ++ ++__BEGIN_DECLS ++ ++extern Elf64_Addr la_ppc64v2_gnu_pltenter (Elf64_Sym *__sym, ++ unsigned int __ndx, ++ uintptr_t *__refcook, ++ uintptr_t *__defcook, ++ La_ppc64v2_regs *__regs, ++ unsigned int *__flags, ++ const char *__symname, ++ long int *__framesizep); ++extern unsigned int la_ppc64v2_gnu_pltexit (Elf64_Sym *__sym, ++ unsigned int __ndx, ++ uintptr_t *__refcook, ++ uintptr_t *__defcook, ++ const La_ppc64v2_regs *__inregs, ++ La_ppc64v2_retval *__outregs, ++ const char *__symname); ++ ++__END_DECLS ++ + #endif +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h +--- glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/ldsodefs.h 2014-05-29 14:11:20.000000000 -0500 +@@ -25,6 +25,8 @@ + struct La_ppc32_retval; + struct La_ppc64_regs; + struct La_ppc64_retval; ++struct La_ppc64v2_regs; ++struct La_ppc64v2_retval; + + #define ARCH_PLTENTER_MEMBERS \ + Elf32_Addr (*ppc32_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *, \ +@@ -34,7 +36,12 @@ + Elf64_Addr (*ppc64_gnu_pltenter) (Elf64_Sym *, unsigned int, uintptr_t *, \ + uintptr_t *, struct La_ppc64_regs *, \ + unsigned int *, const char *name, \ +- long int *framesizep) ++ long int *framesizep); \ ++ Elf64_Addr (*ppc64v2_gnu_pltenter) (Elf64_Sym *, unsigned int, \ ++ uintptr_t *, uintptr_t *, \ ++ struct La_ppc64v2_regs *, \ ++ unsigned int *, const char *name, \ ++ long int *framesizep) + + #define ARCH_PLTEXIT_MEMBERS \ + unsigned int (*ppc32_gnu_pltexit) (Elf32_Sym *, unsigned int, \ +@@ -47,7 +54,14 @@ + uintptr_t *, \ + uintptr_t *, \ + const struct La_ppc64_regs *, \ +- struct La_ppc64_retval *, const char *) ++ struct La_ppc64_retval *, \ ++ const char *); \ ++ unsigned int (*ppc64v2_gnu_pltexit) (Elf64_Sym *, unsigned int, \ ++ uintptr_t *, \ ++ uintptr_t *, \ ++ const struct La_ppc64v2_regs *,\ ++ struct La_ppc64v2_retval *, \ ++ const char *) + + #include_next <ldsodefs.h> + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-05-29 14:11:20.000000000 -0500 +@@ -546,8 +546,13 @@ + + + /* Names of the architecture-specific auditing callback functions. */ ++#if _CALL_ELF != 2 + #define ARCH_LA_PLTENTER ppc64_gnu_pltenter + #define ARCH_LA_PLTEXIT ppc64_gnu_pltexit ++#else ++#define ARCH_LA_PLTENTER ppc64v2_gnu_pltenter ++#define ARCH_LA_PLTEXIT ppc64v2_gnu_pltexit ++#endif + + #endif /* dl_machine_h */ + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-trampoline.S 2014-05-29 14:11:20.000000000 -0500 +@@ -50,11 +50,8 @@ + /* Store the LR in the LR Save area. */ + std r0,FRAME_SIZE+FRAME_LR_SAVE(r1) + cfi_offset (lr, FRAME_LR_SAVE) +- mfcr r0 + std r9,INT_PARMS+48(r1) + std r10,INT_PARMS+56(r1) +-/* I'm almost certain we don't have to save cr... be safe. */ +- std r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + bl JUMPTARGET(_dl_fixup) + #ifndef SHARED + nop +@@ -66,11 +63,9 @@ + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +- mtcrf 0xFF,r0 + /* Prepare for calling the function returned by fixup. */ + PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) +@@ -85,18 +80,30 @@ + #undef FRAME_SIZE + #undef INT_PARMS + +- /* Stack layout: +- (Note: some of these are not required for the ELFv2 ABI.) +- +592 previous backchain +- +584 spill_r31 +- +576 spill_r30 +- +560 v1 +- +552 fp4 +- +544 fp3 +- +536 fp2 +- +528 fp1 +- +520 r4 +- +512 r3 ++ /* Stack layout: ELFv2 ABI. ++ +752 previous backchain ++ +744 spill_r31 ++ +736 spill_r30 ++ +720 v8 ++ +704 v7 ++ +688 v6 ++ +672 v5 ++ +656 v4 ++ +640 v3 ++ +624 v2 ++ +608 v1 ++ +600 fp10 ++ ELFv1 ABI +592 fp9 ++ +592 previous backchain +584 fp8 ++ +584 spill_r31 +576 fp7 ++ +576 spill_r30 +568 fp6 ++ +560 v1 +560 fp5 ++ +552 fp4 +552 fp4 ++ +544 fp3 +544 fp3 ++ +536 fp2 +536 fp2 ++ +528 fp1 +528 fp1 ++ +520 r4 +520 r4 ++ +512 r3 +512 r3 + return values + +504 free + +496 stackframe +@@ -157,10 +164,15 @@ + +8 CR save area + r1+0 stack back chain + */ +-#define FRAME_SIZE 592 ++#if _CALL_ELF == 2 ++# define FRAME_SIZE 752 ++# define VR_RTN 608 ++#else ++# define FRAME_SIZE 592 ++# define VR_RTN 560 ++#endif + #define INT_RTN 512 + #define FPR_RTN 528 +-#define VR_RTN 560 + #define STACK_FRAME 496 + #define CALLING_LR 488 + #define CALLING_SP 480 +@@ -205,18 +217,14 @@ + mflr r5 + std r7,INT_PARMS+32(r1) + std r8,INT_PARMS+40(r1) +-/* Store the LR in the LR Save area of the previous frame. */ +-/* XXX Do we have to do this? */ ++/* Store the LR in the LR Save area. */ + la r8,FRAME_SIZE(r1) + std r5,FRAME_SIZE+FRAME_LR_SAVE(r1) + cfi_offset (lr, FRAME_LR_SAVE) + std r5,CALLING_LR(r1) +- mfcr r0 + std r9,INT_PARMS+48(r1) + std r10,INT_PARMS+56(r1) + std r8,CALLING_SP(r1) +-/* I'm almost certain we don't have to save cr... be safe. */ +- std r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r12,.LC__dl_hwcap@toc(r2) + #ifdef SHARED + /* Load _rtld_local_ro._dl_hwcap. */ +@@ -319,11 +327,9 @@ + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +- mtcrf 0xFF,r0 + /* Prepare for calling the function returned by fixup. */ + PPC64_LOAD_FUNCPTR r3 + ld r3,INT_PARMS+0(r1) +@@ -346,10 +352,11 @@ + lfd fp12,FPR_PARMS+88(r1) + lfd fp13,FPR_PARMS+96(r1) + /* Unwind the stack frame, and jump. */ +- ld r31,584(r1) +- ld r30,576(r1) ++ ld r31,FRAME_SIZE-8(r1) ++ ld r30,FRAME_SIZE-16(r1) + addi r1,r1,FRAME_SIZE + bctr ++ + L(do_pltexit): + la r10,(VR_PARMS+0)(r1) + la r9,(VR_PARMS+16)(r1) +@@ -383,11 +390,9 @@ + ld r8,INT_PARMS+40(r1) + ld r7,INT_PARMS+32(r1) + mtlr r0 +- ld r0,FRAME_SIZE+FRAME_CR_SAVE(r1) + ld r6,INT_PARMS+24(r1) + ld r5,INT_PARMS+16(r1) + ld r4,INT_PARMS+8(r1) +- mtcrf 0xFF,r0 + /* Prepare for calling the function returned by fixup. */ + std r2,FRAME_TOC_SAVE(r1) + PPC64_LOAD_FUNCPTR r3 +@@ -413,16 +418,37 @@ + /* But return here and store the return values. */ + std r3,INT_RTN(r1) + std r4,INT_RTN+8(r1) +- stfd fp1,FPR_PARMS+0(r1) +- stfd fp2,FPR_PARMS+8(r1) ++ stfd fp1,FPR_RTN+0(r1) ++ stfd fp2,FPR_RTN+8(r1) + cmpdi cr0,r12,0 + la r10,VR_RTN(r1) +- stfd fp3,FPR_PARMS+16(r1) +- stfd fp4,FPR_PARMS+24(r1) ++ stfd fp3,FPR_RTN+16(r1) ++ stfd fp4,FPR_RTN+24(r1) ++#if _CALL_ELF == 2 ++ la r12,VR_RTN+16(r1) ++ stfd fp5,FPR_RTN+32(r1) ++ stfd fp6,FPR_RTN+40(r1) ++ li r5,32 ++ li r6,64 ++ stfd fp7,FPR_RTN+48(r1) ++ stfd fp8,FPR_RTN+56(r1) ++ stfd fp9,FPR_RTN+64(r1) ++ stfd fp10,FPR_RTN+72(r1) ++#endif + mr r3,r31 + mr r4,r30 + beq L(callpltexit) + stvx v2,0,r10 ++#if _CALL_ELF == 2 ++ stvx v3,0,r12 ++ stvx v4,r5,r10 ++ stvx v5,r5,r12 ++ addi r5,r5,64 ++ stvx v6,r6,r10 ++ stvx v7,r6,r12 ++ stvx v8,r5,r10 ++ stvx v9,r5,r12 ++#endif + L(callpltexit): + addi r5,r1,INT_PARMS + addi r6,r1,INT_RTN +@@ -434,18 +460,39 @@ + lwz r12,VR_VRSAVE(r1) + ld r3,INT_RTN(r1) + ld r4,INT_RTN+8(r1) +- lfd fp1,FPR_PARMS+0(r1) +- lfd fp2,FPR_PARMS+8(r1) ++ lfd fp1,FPR_RTN+0(r1) ++ lfd fp2,FPR_RTN+8(r1) + cmpdi cr0,r12,0 +- la r10,VR_RTN(r1) +- lfd fp3,FPR_PARMS+16(r1) +- lfd fp4,FPR_PARMS+24(r1) ++ la r11,VR_RTN(r1) ++ lfd fp3,FPR_RTN+16(r1) ++ lfd fp4,FPR_RTN+24(r1) ++#if _CALL_ELF == 2 ++ la r12,VR_RTN+16(r1) ++ lfd fp5,FPR_RTN+32(r1) ++ lfd fp6,FPR_RTN+40(r1) ++ li r30,32 ++ li r31,64 ++ lfd fp7,FPR_RTN+48(r1) ++ lfd fp8,FPR_RTN+56(r1) ++ lfd fp9,FPR_RTN+64(r1) ++ lfd fp10,FPR_RTN+72(r1) ++#endif + beq L(pltexitreturn) +- lvx v2,0,r10 ++ lvx v2,0,r11 ++#if _CALL_ELF == 2 ++ lvx v3,0,r12 ++ lvx v4,r30,r11 ++ lvx v5,r30,r12 ++ addi r30,r30,64 ++ lvx v6,r31,r11 ++ lvx v7,r31,r12 ++ lvx v8,r30,r11 ++ lvx v9,r30,r12 ++#endif + L(pltexitreturn): + ld r0,FRAME_SIZE+FRAME_LR_SAVE(r1) +- ld r31,584(r1) +- ld r30,576(r1) ++ ld r31,FRAME_SIZE-8(r1) ++ ld r30,FRAME_SIZE-16(r1) + mtlr r0 + ld r1,0(r1) + blr +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h 2014-05-29 14:11:12.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/tst-audit.h 2014-05-29 14:11:20.000000000 -0500 +@@ -18,8 +18,16 @@ + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + ++#if _CALL_ELF != 2 + #define pltenter la_ppc64_gnu_pltenter + #define pltexit la_ppc64_gnu_pltexit + #define La_regs La_ppc64_regs + #define La_retval La_ppc64_retval + #define int_retval lrv_r3 ++#else ++#define pltenter la_ppc64v2_gnu_pltenter ++#define pltexit la_ppc64v2_gnu_pltexit ++#define La_regs La_ppc64v2_regs ++#define La_retval La_ppc64v2_retval ++#define int_retval lrv_r3 ++#endif diff --git a/SOURCES/glibc-ppc64le-43.patch b/SOURCES/glibc-ppc64le-43.patch new file mode 100644 index 0000000..8c43abb --- /dev/null +++ b/SOURCES/glibc-ppc64le-43.patch @@ -0,0 +1,248 @@ +# commit 5b118558f9fb0620508d51c34c2cb5ba4f1f01c2 +# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com> +# Date: Wed Dec 4 07:08:48 2013 -0600 +# +# PowerPC64 ELFv2 ABI 6/6: Bump ld.so soname version number +# +# To avoid having a ELFv2 binary accidentally picking up an old ABI ld.so, +# this patch bumps the soname to ld64.so.2. +# +# In theory (or for testing purposes) this will also allow co-installing +# ld.so versions for both ABIs on the same system. Note that the kernel +# will already be able to load executables of both ABIs. However, there +# is currently no plan to use that theoretical possibility in a any +# supported distribution environment ... +# +# Note that in order to check which ABI to use, we need to invoke the +# compiler to check the _CALL_ELF macro; this is done in a new configure +# check in sysdeps/unix/sysv/linux/powerpc/powerpc64/configure.ac, +# replacing the hard-coded value of default-abi in the Makefile. +# +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/Makefile glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/Makefile +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/Makefile 2014-05-29 14:12:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/Makefile 2014-05-29 14:12:30.000000000 -0500 +@@ -1,9 +1,12 @@ +-abi-variants := 32 64 ++abi-variants := 32 64-v1 64-v2 + abi-32-options := -U__powerpc64__ + abi-32-condition := __WORDSIZE == 32 +-abi-64-options := -D__powerpc64__ +-abi-64-condition := __WORDSIZE == 64 +-abi-64-ld-soname := ld64.so.1 ++abi-64-v1-options := -D__powerpc64__ -U_CALL_ELF -D_CALL_ELF=1 ++abi-64-v1-condition := __WORDSIZE == 64 && _CALL_ELF != 2 ++abi-64-v1-ld-soname := ld64.so.1 ++abi-64-v2-options := -D__powerpc64__ -U_CALL_ELF -D_CALL_ELF=2 ++abi-64-v2-condition := __WORDSIZE == 64 && _CALL_ELF == 2 ++abi-64-v2-ld-soname := ld64.so.2 + + ifeq ($(subdir),rt) + librt-routines += rt-sysdep +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/ldconfig.h glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/ldconfig.h +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/ldconfig.h 2014-05-29 14:12:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/ldconfig.h 2014-05-29 14:12:30.000000000 -0500 +@@ -20,7 +20,8 @@ + + #define SYSDEP_KNOWN_INTERPRETER_NAMES \ + { "/lib/ld.so.1", FLAG_ELF_LIBC6 }, \ +- { "/lib64/ld64.so.1", FLAG_ELF_LIBC6 }, ++ { "/lib64/ld64.so.1", FLAG_ELF_LIBC6 }, \ ++ { "/lib64/ld64.so.2", FLAG_ELF_LIBC6 }, + #define SYSDEP_KNOWN_LIBRARY_NAMES \ + { "libc.so.6", FLAG_ELF_LIBC6 }, \ + { "libm.so.6", FLAG_ELF_LIBC6 }, +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile 2014-05-29 14:12:25.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile 1969-12-31 18:00:00.000000000 -0600 +@@ -1,2 +0,0 @@ +-# See Makeconfig regarding the use of default-abi. +-default-abi := 64 +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure 1969-12-31 18:00:00.000000000 -0600 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure 2014-05-29 14:12:30.000000000 -0500 +@@ -0,0 +1,166 @@ ++# This file is generated from configure.ac by Autoconf. DO NOT EDIT! ++ # Local configure fragment for sysdeps/unix/sysv/linux/powerpc/powerpc64/. ++ ++# Define default-abi according to compiler flags. ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 ++$as_echo_n "checking for grep that handles long lines and -e... " >&6; } ++if ${ac_cv_path_GREP+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -z "$GREP"; then ++ ac_path_GREP_found=false ++ # Loop through the user's path and test for each of PROGNAME-LIST ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_prog in grep ggrep; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" ++ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue ++# Check for GNU ac_path_GREP and select it if it is found. ++ # Check for GNU $ac_path_GREP ++case `"$ac_path_GREP" --version 2>&1` in ++*GNU*) ++ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; ++*) ++ ac_count=0 ++ $as_echo_n 0123456789 >"conftest.in" ++ while : ++ do ++ cat "conftest.in" "conftest.in" >"conftest.tmp" ++ mv "conftest.tmp" "conftest.in" ++ cp "conftest.in" "conftest.nl" ++ $as_echo 'GREP' >> "conftest.nl" ++ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break ++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ++ as_fn_arith $ac_count + 1 && ac_count=$as_val ++ if test $ac_count -gt ${ac_path_GREP_max-0}; then ++ # Best one so far, save it but keep looking for a better one ++ ac_cv_path_GREP="$ac_path_GREP" ++ ac_path_GREP_max=$ac_count ++ fi ++ # 10*(2^10) chars as input seems more than enough ++ test $ac_count -gt 10 && break ++ done ++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; ++esac ++ ++ $ac_path_GREP_found && break 3 ++ done ++ done ++ done ++IFS=$as_save_IFS ++ if test -z "$ac_cv_path_GREP"; then ++ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ fi ++else ++ ac_cv_path_GREP=$GREP ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 ++$as_echo "$ac_cv_path_GREP" >&6; } ++ GREP="$ac_cv_path_GREP" ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 ++$as_echo_n "checking for egrep... " >&6; } ++if ${ac_cv_path_EGREP+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 ++ then ac_cv_path_EGREP="$GREP -E" ++ else ++ if test -z "$EGREP"; then ++ ac_path_EGREP_found=false ++ # Loop through the user's path and test for each of PROGNAME-LIST ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_prog in egrep; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" ++ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue ++# Check for GNU ac_path_EGREP and select it if it is found. ++ # Check for GNU $ac_path_EGREP ++case `"$ac_path_EGREP" --version 2>&1` in ++*GNU*) ++ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; ++*) ++ ac_count=0 ++ $as_echo_n 0123456789 >"conftest.in" ++ while : ++ do ++ cat "conftest.in" "conftest.in" >"conftest.tmp" ++ mv "conftest.tmp" "conftest.in" ++ cp "conftest.in" "conftest.nl" ++ $as_echo 'EGREP' >> "conftest.nl" ++ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break ++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ++ as_fn_arith $ac_count + 1 && ac_count=$as_val ++ if test $ac_count -gt ${ac_path_EGREP_max-0}; then ++ # Best one so far, save it but keep looking for a better one ++ ac_cv_path_EGREP="$ac_path_EGREP" ++ ac_path_EGREP_max=$ac_count ++ fi ++ # 10*(2^10) chars as input seems more than enough ++ test $ac_count -gt 10 && break ++ done ++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; ++esac ++ ++ $ac_path_EGREP_found && break 3 ++ done ++ done ++ done ++IFS=$as_save_IFS ++ if test -z "$ac_cv_path_EGREP"; then ++ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ fi ++else ++ ac_cv_path_EGREP=$EGREP ++fi ++ ++ fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 ++$as_echo "$ac_cv_path_EGREP" >&6; } ++ EGREP="$ac_cv_path_EGREP" ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler is using the PowerPC64 ELFv2 ABI" >&5 ++$as_echo_n "checking whether the compiler is using the PowerPC64 ELFv2 ABI... " >&6; } ++if ${libc_cv_ppc64_elfv2_abi+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#if _CALL_ELF == 2 ++ yes ++ #endif ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "yes" >/dev/null 2>&1; then : ++ libc_cv_ppc64_elfv2_abi=yes ++else ++ libc_cv_ppc64_elfv2_abi=no ++fi ++rm -f conftest* ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ppc64_elfv2_abi" >&5 ++$as_echo "$libc_cv_ppc64_elfv2_abi" >&6; } ++if test $libc_cv_ppc64_elfv2_abi = yes; then ++ config_vars="$config_vars ++default-abi = 64-v2" ++else ++ config_vars="$config_vars ++default-abi = 64-v1" ++fi +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure.ac glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure.ac +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure.ac 1969-12-31 18:00:00.000000000 -0600 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure.ac 2014-05-29 14:12:30.000000000 -0500 +@@ -0,0 +1,15 @@ ++GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. ++# Local configure fragment for sysdeps/unix/sysv/linux/powerpc/powerpc64/. ++ ++# Define default-abi according to compiler flags. ++AC_CACHE_CHECK([whether the compiler is using the PowerPC64 ELFv2 ABI], ++ [libc_cv_ppc64_elfv2_abi], ++ [AC_EGREP_CPP(yes,[#if _CALL_ELF == 2 ++ yes ++ #endif ++ ], libc_cv_ppc64_elfv2_abi=yes, libc_cv_ppc64_elfv2_abi=no)]) ++if test $libc_cv_ppc64_elfv2_abi = yes; then ++ LIBC_CONFIG_VAR([default-abi], [64-v2]) ++else ++ LIBC_CONFIG_VAR([default-abi], [64-v1]) ++fi diff --git a/SOURCES/glibc-ppc64le-44.patch b/SOURCES/glibc-ppc64le-44.patch new file mode 100644 index 0000000..e074cb9 --- /dev/null +++ b/SOURCES/glibc-ppc64le-44.patch @@ -0,0 +1,26 @@ +# commit c859b32e9d76afe8a3f20bb9528961a573c06937 +# Author: Alan Modra <amodra@gmail.com> +# Date: Tue Apr 1 14:07:42 2014 +1030 +# +# Fix s_copysign stack temp for PowerPC64 ELFv2 +# +# [BZ #16786] +# * sysdeps/powerpc/powerpc64/fpu/s_copysign.S: Don't trash stack. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysign.S glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysign.S +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysign.S 2014-05-29 14:13:47.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/fpu/s_copysign.S 2014-05-29 14:13:50.000000000 -0500 +@@ -27,11 +27,11 @@ + /* double [f1] copysign (double [f1] x, double [f2] y); + copysign(x,y) returns a value with the magnitude of x and + with the sign bit of y. */ +- stfd fp2,56(r1) ++ stfd fp2,-8(r1) + nop + nop + nop +- ld r3,56(r1) ++ ld r3,-8(r1) + cmpdi r3,0 + blt L(0) + fabs fp1,fp1 diff --git a/SOURCES/glibc-ppc64le-45.patch b/SOURCES/glibc-ppc64le-45.patch new file mode 100644 index 0000000..9030fc2 --- /dev/null +++ b/SOURCES/glibc-ppc64le-45.patch @@ -0,0 +1,33 @@ +# +# For PPC64LE only! +# +# This is fixed upstream by the removal of Versions.def +# and auto-generation of the SHLIB_COMPAT required entries. +# See: https://sourceware.org/ml/libc-alpha/2014-02/msg00818.html +# Backporting that infrastructure to RHEL 7.x is too much work +# at this junction for little reward. Instead we simply fix up +# the Versions.def to include GLIBC_2.3 which is used by +# nptl/old_pthread_atfork.c, otherwise ppc64le will get +# pthread_atfork in libpthread.so.0 when it should not. +# +# The ABI testing for libpthread.so now passes for ppc64le. +# +diff -urN glibc-2.17-c758a686/Versions.def glibc-2.17-c758a686/Versions.def +--- glibc-2.17-c758a686/Versions.def 2014-06-02 21:13:12.000000000 +0000 ++++ glibc-2.17-c758a686/Versions.def 2014-06-02 21:14:38.000000000 +0000 +@@ -92,6 +92,7 @@ + GLIBC_2.2 + GLIBC_2.2.3 + GLIBC_2.2.6 ++ GLIBC_2.3 + GLIBC_2.3.2 + GLIBC_2.3.3 + GLIBC_2.3.4 +@@ -99,6 +100,7 @@ + GLIBC_2.6 + GLIBC_2.11 + GLIBC_2.12 ++ GLIBC_2.17 + GLIBC_PRIVATE + } + libresolv { diff --git a/SOURCES/glibc-ppc64le-46.patch b/SOURCES/glibc-ppc64le-46.patch new file mode 100644 index 0000000..6f3d1d9 --- /dev/null +++ b/SOURCES/glibc-ppc64le-46.patch @@ -0,0 +1,22 @@ +# +# On POWER this patch also fixes test-ildoubl and test-ldouble failures where tan +# rounded toward zero had acceptable 1 ULP error. Upstream is using 3 ULP, but +# we prefer to keep the bound tighter unless we have a reason not to. +# +# This is the ppc64le version which is required becuase it applies *after* another +# ppc64le patch that touches the same ULPs file. See glibc-power-libm-test-ulps.patch +# for the ppc64/ppc version. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps +--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-07-25 22:07:06.280020855 -0400 ++++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-07-25 22:26:54.650021033 -0400 +@@ -2644,6 +2644,9 @@ + Test "tan_towardzero (2)": + ildouble: 1 + ldouble: 1 ++Test "tan_towardzero (2) == -2.1850398632615189916433061023136825434320": ++ildouble: 1 ++ldouble: 1 + Test "tan_towardzero (3) == -0.1425465430742778052956354105339134932261": + float: 1 + ifloat: 1 diff --git a/SOURCES/glibc-rh1000923.patch b/SOURCES/glibc-rh1000923.patch new file mode 100644 index 0000000..afc6f63 --- /dev/null +++ b/SOURCES/glibc-rh1000923.patch @@ -0,0 +1,32 @@ +commit 595aba70a4c676f7efaf6a012f54cd22aa189c5b +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Mon Aug 26 15:42:29 2013 +0530 + + Initialize res_hconf in nscd + + Fixes BZ #15890. + +diff -pruN glibc-2.17-c758a686/nscd/aicache.c glibc-2.17-c758a686/nscd/aicache.c +--- glibc-2.17-c758a686/nscd/aicache.c 2013-08-11 04:22:55.000000000 +0530 ++++ glibc-2.17-c758a686/nscd/aicache.c 2013-08-26 11:10:25.843470413 +0530 +@@ -25,6 +25,7 @@ + #include <time.h> + #include <unistd.h> + #include <sys/mman.h> ++#include <resolv/res_hconf.h> + + #include "dbg_log.h" + #include "nscd.h" +@@ -100,8 +101,11 @@ addhstaiX (struct database_dyn *db, int + no_more = __nss_database_lookup ("hosts", NULL, + "dns [!UNAVAIL=return] files", &nip); + ++ /* Initialize configurations. */ ++ if (__builtin_expect (!_res_hconf.initialized, 0)) ++ _res_hconf_init (); + if (__res_maybe_init (&_res, 0) == -1) +- no_more = 1; ++ no_more = 1; + + /* If we are looking for both IPv4 and IPv6 address we don't want + the lookup functions to automatically promote IPv4 addresses to diff --git a/SOURCES/glibc-rh1008298.patch b/SOURCES/glibc-rh1008298.patch new file mode 100644 index 0000000..9d7b35c --- /dev/null +++ b/SOURCES/glibc-rh1008298.patch @@ -0,0 +1,46 @@ +diff --git glibc-2.17-c758a686/malloc/malloc.c glibc-2.17-c758a686/malloc/malloc.c +index 3148c5f..f7718a9 100644 +--- glibc-2.17-c758a686/malloc/malloc.c ++++ glibc-2.17-c758a686/malloc/malloc.c +@@ -3015,6 +3015,13 @@ __libc_memalign(size_t alignment, size_t bytes) + /* Otherwise, ensure that it is at least a minimum chunk size */ + if (alignment < MINSIZE) alignment = MINSIZE; + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - alignment - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + arena_get(ar_ptr, bytes + alignment + MINSIZE); + if(!ar_ptr) + return 0; +@@ -3046,6 +3046,13 @@ __libc_valloc(size_t bytes) + + size_t pagesz = GLRO(dl_pagesize); + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - pagesz - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, + const __malloc_ptr_t)) = + force_reg (__memalign_hook); +@@ -3082,6 +3082,13 @@ __libc_pvalloc(size_t bytes) + size_t page_mask = GLRO(dl_pagesize) - 1; + size_t rounded_bytes = (bytes + page_mask) & ~(page_mask); + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - 2*pagesz - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, + const __malloc_ptr_t)) = + force_reg (__memalign_hook); diff --git a/SOURCES/glibc-rh1020637.patch b/SOURCES/glibc-rh1020637.patch new file mode 100644 index 0000000..9d4561a --- /dev/null +++ b/SOURCES/glibc-rh1020637.patch @@ -0,0 +1,128 @@ +commit acd98a8ed1460497e788c701eb92616f1df9b446 +Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com> +Date: Fri Nov 29 09:57:04 2013 +0100 + + [BZ #16214] S/390: Fix TLS GOT pointer setup. + +diff --git glibc-2.17-c758a686/sysdeps/s390/Versions glibc-2.17-c758a686/sysdeps/s390/Versions +index e18617c..baf9842 100644 +--- glibc-2.17-c758a686/sysdeps/s390/Versions ++++ glibc-2.17-c758a686/sysdeps/s390/Versions +@@ -3,4 +3,8 @@ ld { + # runtime interface to TLS + __tls_get_offset; + } ++ GLIBC_PRIVATE { ++ # Exported by ld used by libc. ++ __tls_get_addr_internal; ++ } + } +diff --git glibc-2.17-c758a686/sysdeps/s390/dl-tls.h glibc-2.17-c758a686/sysdeps/s390/dl-tls.h +index 68a5af4..52192a2 100644 +--- glibc-2.17-c758a686/sysdeps/s390/dl-tls.h ++++ glibc-2.17-c758a686/sysdeps/s390/dl-tls.h +@@ -26,11 +26,26 @@ typedef struct + + + #ifdef SHARED +-/* This is the prototype for the GNU version. */ +-extern void *__tls_get_addr (tls_index *ti) attribute_hidden; ++ + extern unsigned long __tls_get_offset (unsigned long got_offset); + + # ifdef IS_IN_rtld ++ ++# include <shlib-compat.h> ++ ++extern void *__tls_get_addr (tls_index *ti) attribute_hidden; ++/* Make a temporary alias of __tls_get_addr to remove the hidden ++ attribute. Then export __tls_get_addr as __tls_get_addr_internal ++ for use from libc. We do not want to export __tls_get_addr, but we ++ do need to use it from libc when looking up the address of a TLS ++ variable. We don't use __tls_get_offset because it requires r12 to ++ be setup and that might not always be true. Either way it's more ++ optimal to use __tls_get_addr directly (that's what ++ __tls_get_offset does anyways). */ ++strong_alias (__tls_get_addr, __tls_get_addr_internal_tmp); ++versioned_symbol (ld, __tls_get_addr_internal_tmp, ++ __tls_get_addr_internal, GLIBC_PRIVATE); ++ + /* The special thing about the s390 TLS ABI is that we do not have the + standard __tls_get_addr function but the __tls_get_offset function + which differs in two important aspects: +@@ -63,15 +78,21 @@ __tls_get_offset:\n\ + 1: .long __tls_get_addr - 0b\n\ + "); + # endif +-# endif ++# else /* IS_IN_rtld */ ++extern void *__tls_get_addr_internal (tls_index *ti); ++# endif /* !IS_IN_rtld */ + + # define GET_ADDR_OFFSET \ + (ti->ti_offset - (unsigned long) __builtin_thread_pointer ()) + +-# define __TLS_GET_ADDR(__ti) \ +- ({ extern char _GLOBAL_OFFSET_TABLE_[] attribute_hidden; \ +- (void *) __tls_get_offset ((char *) (__ti) - _GLOBAL_OFFSET_TABLE_) \ +- + (unsigned long) __builtin_thread_pointer (); }) ++/* Use the privately exported __tls_get_addr_internal instead of ++ __tls_get_offset in order to avoid the __tls_get_offset special ++ linkage requiring the GOT pointer to be set up in r12. The ++ compiler will take care of setting up r12 only if itself issued the ++ __tls_get_offset call. */ ++# define __TLS_GET_ADDR(__ti) \ ++ ({ (void *) __tls_get_addr_internal ((char *) (__ti)) \ ++ + (unsigned long) __builtin_thread_pointer (); }) + + #endif + +diff --git glibc-2.17-c758a686/sysdeps/s390/s390-32/tls-macros.h glibc-2.17-c758a686/sysdeps/s390/s390-32/tls-macros.h +index 8a0ad58..a592d81 100644 +--- glibc-2.17-c758a686/sysdeps/s390/s390-32/tls-macros.h ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/tls-macros.h +@@ -8,12 +8,15 @@ + + #ifdef PIC + # define TLS_IE(x) \ +- ({ unsigned long __offset; \ ++ ({ unsigned long __offset, __got; \ + asm ("bras %0,1f\n" \ +- "0:\t.long " #x "@gotntpoff\n" \ +- "1:\tl %0,0(%0)\n\t" \ +- "l %0,0(%0,%%r12):tls_load:" #x \ +- : "=&a" (__offset) : : "cc" ); \ ++ "0:\t.long _GLOBAL_OFFSET_TABLE_-0b\n\t" \ ++ ".long " #x "@gotntpoff\n" \ ++ "1:\tl %1,0(%0)\n\t" \ ++ "la %1,0(%1,%0)\n\t" \ ++ "l %0,4(%0)\n\t" \ ++ "l %0,0(%0,%1):tls_load:" #x "\n" \ ++ : "=&a" (__offset), "=&a" (__got) : : "cc" ); \ + (int *) (__builtin_thread_pointer() + __offset); }) + #else + # define TLS_IE(x) \ +diff --git glibc-2.17-c758a686/sysdeps/s390/s390-64/tls-macros.h glibc-2.17-c758a686/sysdeps/s390/s390-64/tls-macros.h +index be8aa6c..3c59436 100644 +--- glibc-2.17-c758a686/sysdeps/s390/s390-64/tls-macros.h ++++ glibc-2.17-c758a686/sysdeps/s390/s390-64/tls-macros.h +@@ -8,12 +8,13 @@ + + #ifdef PIC + # define TLS_IE(x) \ +- ({ unsigned long __offset; \ +- asm ("bras %0,1f\n" \ +- "0:\t.quad " #x "@gotntpoff\n" \ +- "1:\tlg %0,0(%0)\n\t" \ +- "lg %0,0(%0,%%r12):tls_load:" #x \ +- : "=&a" (__offset) : : "cc" ); \ ++ ({ unsigned long __offset, __got; \ ++ asm ("bras %0,0f\n\t" \ ++ ".quad " #x "@gotntpoff\n" \ ++ "0:\tlarl %1,_GLOBAL_OFFSET_TABLE_\n\t" \ ++ "lg %0,0(%0)\n\t" \ ++ "lg %0,0(%0,%1):tls_load:" #x "\n" \ ++ : "=&a" (__offset), "=&a" (__got) : : "cc" ); \ + (int *) (__builtin_thread_pointer() + __offset); }) + #else + # define TLS_IE(x) \ diff --git a/SOURCES/glibc-rh1025612.patch b/SOURCES/glibc-rh1025612.patch new file mode 100644 index 0000000..93ab27d --- /dev/null +++ b/SOURCES/glibc-rh1025612.patch @@ -0,0 +1,50 @@ +commit 7cbcdb3699584db8913ca90f705d6337633ee10f +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Fri Oct 25 10:22:12 2013 +0530 + + Fix stack overflow due to large AF_INET6 requests + + Resolves #16072 (CVE-2013-4458). + + This patch fixes another stack overflow in getaddrinfo when it is + called with AF_INET6. The AF_UNSPEC case was fixed as CVE-2013-1914, + but the AF_INET6 case went undetected back then. + +diff --git glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c +index e6ce4cf..8ff74b4 100644 +--- glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c ++++ glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c +@@ -197,7 +197,22 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, + &rc, &herrno, NULL, &localcanon)); \ + if (rc != ERANGE || herrno != NETDB_INTERNAL) \ + break; \ +- tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen); \ ++ if (!malloc_tmpbuf && __libc_use_alloca (alloca_used + 2 * tmpbuflen)) \ ++ tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen, 2 * tmpbuflen, \ ++ alloca_used); \ ++ else \ ++ { \ ++ char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL, \ ++ 2 * tmpbuflen); \ ++ if (newp == NULL) \ ++ { \ ++ result = -EAI_MEMORY; \ ++ goto free_and_return; \ ++ } \ ++ tmpbuf = newp; \ ++ malloc_tmpbuf = true; \ ++ tmpbuflen = 2 * tmpbuflen; \ ++ } \ + } \ + if (status == NSS_STATUS_SUCCESS && rc == 0) \ + h = &th; \ +@@ -209,7 +224,8 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, + { \ + __set_h_errno (herrno); \ + _res.options |= old_res_options & RES_USE_INET6; \ +- return -EAI_SYSTEM; \ ++ result = -EAI_SYSTEM; \ ++ goto free_and_return; \ + } \ + if (herrno == TRY_AGAIN) \ + no_data = EAI_AGAIN; \ diff --git a/SOURCES/glibc-rh1025934.patch b/SOURCES/glibc-rh1025934.patch new file mode 100644 index 0000000..37758d9 --- /dev/null +++ b/SOURCES/glibc-rh1025934.patch @@ -0,0 +1,143 @@ +Mostly equivalent upstream commit: + +commit 0699f766b10c86912b75f35bef697106b70c1cf6 +Author: Carlos O'Donell <carlos@redhat.com> +Date: Thu Apr 10 18:31:53 2014 -0400 + + nscd: Make SELinux checks dynamic. + +diff --git glibc-2.17-c758a686/nscd/selinux.c glibc-2.17-c758a686/nscd/selinux.c +index 0866c44..ba55b04 100644 +--- glibc-2.17-c758a686/nscd/selinux.c ++++ glibc-2.17-c758a686/nscd/selinux.c +@@ -44,35 +44,31 @@ + /* Global variable to tell if the kernel has SELinux support. */ + int selinux_enabled; + +-/* Define mappings of access vector permissions to request types. */ +-static const access_vector_t perms[LASTREQ] = ++/* Define mappings of request type to AVC permission name. */ ++static const char *perms[LASTREQ] = + { +- [GETPWBYNAME] = NSCD__GETPWD, +- [GETPWBYUID] = NSCD__GETPWD, +- [GETGRBYNAME] = NSCD__GETGRP, +- [GETGRBYGID] = NSCD__GETGRP, +- [GETHOSTBYNAME] = NSCD__GETHOST, +- [GETHOSTBYNAMEv6] = NSCD__GETHOST, +- [GETHOSTBYADDR] = NSCD__GETHOST, +- [GETHOSTBYADDRv6] = NSCD__GETHOST, +- [GETSTAT] = NSCD__GETSTAT, +- [SHUTDOWN] = NSCD__ADMIN, +- [INVALIDATE] = NSCD__ADMIN, +- [GETFDPW] = NSCD__SHMEMPWD, +- [GETFDGR] = NSCD__SHMEMGRP, +- [GETFDHST] = NSCD__SHMEMHOST, +- [GETAI] = NSCD__GETHOST, +- [INITGROUPS] = NSCD__GETGRP, +-#ifdef NSCD__GETSERV +- [GETSERVBYNAME] = NSCD__GETSERV, +- [GETSERVBYPORT] = NSCD__GETSERV, +- [GETFDSERV] = NSCD__SHMEMSERV, +-#endif +-#ifdef NSCD__GETNETGRP +- [GETNETGRENT] = NSCD__GETNETGRP, +- [INNETGR] = NSCD__GETNETGRP, +- [GETFDNETGR] = NSCD__SHMEMNETGRP, +-#endif ++ [GETPWBYNAME] = "getpwd", ++ [GETPWBYUID] = "getpwd", ++ [GETGRBYNAME] = "getgrp", ++ [GETGRBYGID] = "getgrp", ++ [GETHOSTBYNAME] = "gethost", ++ [GETHOSTBYNAMEv6] = "gethost", ++ [GETHOSTBYADDR] = "gethost", ++ [GETHOSTBYADDRv6] = "gethost", ++ [SHUTDOWN] = "admin", ++ [GETSTAT] = "getstat", ++ [INVALIDATE] = "admin", ++ [GETFDPW] = "shmempwd", ++ [GETFDGR] = "shmemgrp", ++ [GETFDHST] = "shmemhost", ++ [GETAI] = "gethost", ++ [INITGROUPS] = "getgrp", ++ [GETSERVBYNAME] = "getserv", ++ [GETSERVBYPORT] = "getserv", ++ [GETFDSERV] = "shmemserv", ++ [GETNETGRENT] = "getnetgrp", ++ [INNETGR] = "getnetgrp", ++ [GETFDNETGR] = "shmemnetgrp", + }; + + /* Store an entry ref to speed AVC decisions. */ +@@ -344,7 +340,18 @@ nscd_avc_init (void) + + + /* Check the permission from the caller (via getpeercon) to nscd. +- Returns 0 if access is allowed, 1 if denied, and -1 on error. */ ++ Returns 0 if access is allowed, 1 if denied, and -1 on error. ++ ++ Implementation note: ++ The SELinux policy, enablement, and permission bits are all dynamic ++ and the caching done by glibc is not entirely correct. This nscd ++ support should be rewritten to use selinux_check_permission. ++ A rewrite is risky though and requires some refactoring fist. ++ Instead we use symbolic mappings instead of compile time ++ constants (which selinux upstream says are going away), and use ++ security_deny_unknown to determine what to do if selinux-policy ++ doesn't have a definition for the the permission or object class ++ we are looking up. */ + int + nscd_request_avc_has_perm (int fd, request_type req) + { +@@ -354,6 +361,33 @@ nscd_request_avc_has_perm (int fd, request_type req) + security_id_t ssid = NULL; + security_id_t tsid = NULL; + int rc = -1; ++ security_class_t sc_nscd = 0; ++ access_vector_t perm = 0; ++ int avc_deny_unknown = 0; ++ ++ /* Check if SELinux denys or allows unknown object classes ++ and permissions. It is 0 if they are allowed, 1 if they ++ are not allowed and -1 on error. */ ++ if ((avc_deny_unknown = security_deny_unknown ()) == -1) ++ dbg_log (_("Error querying policy for undefined object classes " ++ "or permissions.")); ++ ++ /* Get the security class for nscd. If this fails we will likely be ++ unable to do anything unless avc_deny_unknown is 0. */ ++ if ((sc_nscd = string_to_security_class ("nscd")) == 0 ++ && avc_deny_unknown == 1) ++ dbg_log (_("Error getting security class for nscd.")); ++ ++ /* Convert permission to AVC bits. */ ++ perm = string_to_av_perm (sc_nscd, perms[req]); ++ if (perm == 0 && avc_deny_unknown == 1) ++ dbg_log (_("Error translating permission name " ++ "\"%s\" to access vector bit."), perms[req]); ++ ++ /* If the nscd security class was not found or perms were not ++ found and AVC does not deny unknown values then allow it. */ ++ if ((sc_nscd == 0 || perm == 0) && avc_deny_unknown == 0) ++ return 0; + + if (getpeercon (fd, &scon) < 0) + { +@@ -372,15 +406,7 @@ nscd_request_avc_has_perm (int fd, request_type req) + goto out; + } + +-#ifndef NSCD__GETSERV +- if (perms[req] == 0) +- { +- dbg_log (_("compile-time support for database policy missing")); +- goto out; +- } +-#endif +- +- rc = avc_has_perm (ssid, tsid, SECCLASS_NSCD, perms[req], &aeref, NULL) < 0; ++ rc = avc_has_perm (ssid, tsid, sc_nscd, perm, &aeref, NULL) < 0; + + out: + if (scon) diff --git a/SOURCES/glibc-rh1027101.patch b/SOURCES/glibc-rh1027101.patch new file mode 100644 index 0000000..2b419c9 --- /dev/null +++ b/SOURCES/glibc-rh1027101.patch @@ -0,0 +1,58 @@ +commit 362b47fe09ca9a928d444c7e2f7992f7f61bfc3e +Author: Maxim Kuvyrkov <maxim@kugelworks.com> +Date: Tue Dec 24 09:44:50 2013 +1300 + + Fix race in free() of fastbin chunk: BZ #15073 + + Perform sanity check only if we have_lock. Due to lockless nature of fastbins + we need to be careful derefencing pointers to fastbin entries (chunksize(old) + in this case) in multithreaded environments. + + The fix is to add have_lock to the if-condition checks. The rest of the patch + only makes code more readable. + + * malloc/malloc.c (_int_free): Perform sanity check only if we + have_lock. + +Index: b/malloc/malloc.c +=================================================================== +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -3909,25 +3909,29 @@ _int_free(mstate av, mchunkptr p, int ha + unsigned int idx = fastbin_index(size); + fb = &fastbin (av, idx); + +- mchunkptr fd; +- mchunkptr old = *fb; ++ /* Atomically link P to its fastbin: P->FD = *FB; *FB = P; */ ++ mchunkptr old = *fb, old2; + unsigned int old_idx = ~0u; + do + { +- /* Another simple check: make sure the top of the bin is not the +- record we are going to add (i.e., double free). */ ++ /* Check that the top of the bin is not the record we are going to add ++ (i.e., double free). */ + if (__builtin_expect (old == p, 0)) + { + errstr = "double free or corruption (fasttop)"; + goto errout; + } +- if (old != NULL) ++ /* Check that size of fastbin chunk at the top is the same as ++ size of the chunk that we are adding. We can dereference OLD ++ only if we have the lock, otherwise it might have already been ++ deallocated. See use of OLD_IDX below for the actual check. */ ++ if (have_lock && old != NULL) + old_idx = fastbin_index(chunksize(old)); +- p->fd = fd = old; ++ p->fd = old2 = old; + } +- while ((old = catomic_compare_and_exchange_val_rel (fb, p, fd)) != fd); ++ while ((old = catomic_compare_and_exchange_val_rel (fb, p, old2)) != old2); + +- if (fd != NULL && __builtin_expect (old_idx != idx, 0)) ++ if (have_lock && old != NULL && __builtin_expect (old_idx != idx, 0)) + { + errstr = "invalid fastbin entry (free)"; + goto errout; 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 <triegel@redhat.com> +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 <sys/asm.h> 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 <triegel@redhat.com> +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 <roland@hack.frob.com> +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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <errno.h> ++#include <limits.h> ++#include <semaphore.h> ++#include <stdio.h> ++#include <string.h> ++#include <unistd.h> ++ ++ ++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 <joseph@codesourcery.com> +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 + <https://sourceware.org/glibc/wiki/PortStatus>, and fixed by the + unreviewed + <https://sourceware.org/ml/libc-alpha/2014-12/msg00655.html> 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 <kernel-features.h>. + (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 + <http://www.gnu.org/licenses/>. */ + ++#include <kernel-features.h> + #include <errno.h> + #include <sysdep.h> + #include <lowlevellock.h> +@@ -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 <carlos@systemhalted.org> +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 <semaphore.h> + #include <shlib-compat.h> + #include "semaphoreP.h" ++#include <atomic.h> + + + 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 <errno.h> + #include <semaphore.h> +-#include <lowlevellock.h> + #include <shlib-compat.h> + #include "semaphoreP.h" + #include <kernel-features.h> + ++/* 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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <structsem.h> +-#include <lowlevellock.h> +- +- +- .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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <structsem.h> +-#include <lowlevellock.h> +- +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <lowlevellock.h> +- +- .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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <structsem.h> +-#include <lowlevellock.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 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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#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 <stdint.h> ++#include <atomic.h> ++#include <endian.h> + + + 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 <paulus@au.ibm.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <errno.h> +-#include <sysdep.h> +-#include <lowlevellock.h> +-#include <internaltypes.h> +-#include <semaphore.h> +- +-#include <shlib-compat.h> +- +-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 <shlib-compat.h> + ++/* 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 <paulus@au.ibm.com>, 2003. + +@@ -17,42 +17,13 @@ + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +-#include <errno.h> +-#include <sysdep.h> +-#include <lowlevellock.h> +-#include <internaltypes.h> +-#include <semaphore.h> +- +-#include <pthreadP.h> +-#include <shlib-compat.h> +- +- +-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 <paulus@au.ibm.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <errno.h> +-#include <sysdep.h> +-#include <lowlevellock.h> +-#include <internaltypes.h> +-#include <semaphore.h> +- +-#include <shlib-compat.h> +- +- +-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 + <http://www.gnu.org/licenses/>. */ + +-#include <errno.h> +-#include <sysdep.h> +-#include <lowlevellock.h> +-#include <internaltypes.h> +-#include <semaphore.h> +- +-#include <pthreadP.h> +-#include <shlib-compat.h> +- +- +-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 <paulus@au.ibm.com>, 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <errno.h> ++#include <sysdep.h> ++#include <lowlevellock.h> ++#include <internaltypes.h> ++#include <semaphore.h> ++#include <sys/time.h> ++ ++#include <pthreadP.h> ++#include <shlib-compat.h> ++#include <atomic.h> ++ ++/* 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 <limits.h> +-#include <stddef.h> +-#include <sched.h> +-#include <bits/pthreadtypes.h> +-#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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <lowlevellock.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <structsem.h> +- +- +- .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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <kernel-features.h> +-#include <lowlevellock.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <structsem.h> +- +- .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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <lowlevellock.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +- +- .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 <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <lowlevellock.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <structsem.h> +- +- +- .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 <nptl/sysdeps/unix/sysv/linux/sem_post.c> +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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <structsem.h> +-#include <lowlevellock.h> +-#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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <tcb-offsets.h> +-#include <structsem.h> +-#include <lowlevellock.h> +-#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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <lowlevellock.h> +-#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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <shlib-compat.h> +-#include <pthread-errnos.h> +-#include <tcb-offsets.h> +-#include <structsem.h> +-#include <lowlevellock.h> +-#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-rh1028652.patch b/SOURCES/glibc-rh1028652.patch new file mode 100644 index 0000000..0717f71 --- /dev/null +++ b/SOURCES/glibc-rh1028652.patch @@ -0,0 +1,96 @@ +# +# Upstream power patch to increase MINSIGSTKSZ and SIGSTKSZ to +# account for the kernel signal frame size increase. +# +# commit f7c399cff5bd04ee9dc117fb6b0f39597dc047c6 +# Author: Alan Modra <amodra@gmail.com> +# Date: Sat Aug 17 18:37:18 2013 +0930 +# +# PowerPC SIGSTKSZ +# http://sourceware.org/ml/libc-alpha/2013-08/msg00093.html +# +# This copies the sparc version of sigstack.h, which gives powerpc +# #define MINSIGSTKSZ 4096 +# #define SIGSTKSZ 16384 +# +# Before the VSX changes, struct rt_sigframe size was 1920 plus 128 for +# __SIGNAL_FRAMESIZE giving ppc64 exactly the default MINSIGSTKSZ of +# 2048. +# +# After VSX, ucontext increased by 256 bytes. Oops, we're over +# MINSIGSTKSZ, so powerpc has been using the wrong value for quite a +# while. Add another ucontext for TM and rt_sigframe is now at 3872, +# giving actual MINSIGSTKSZ of 4000. +# +# The glibc testcase that I was looking at was tst-cancel21, which +# allocates 2*SIGSTKSZ (not because the test is trying to be +# conservative, but because the test actually has nested signal stack +# frames). We blew the allocation by 48 bytes when using current +# mainline gcc to compile glibc (le ppc64). +# +# The required stack depth in _dl_lookup_symbol_x from the top of the +# next signal frame was 10944 bytes. I guess you'd want to add 288 to +# that, implying an actual SIGSTKSZ of 11232. +# +# * sysdeps/unix/sysv/linux/powerpc/bits/sigstack.h: New file. +# +diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/bits/sigstack.h glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/bits/sigstack.h +new file mode 100644 +index 0000000..33be9e8 +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/bits/sigstack.h +@@ -0,0 +1,54 @@ ++/* sigstack, sigaltstack definitions. ++ Copyright (C) 1998-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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef _SIGNAL_H ++# error "Never include this file directly. Use <signal.h> 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 4096 ++ ++/* 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-rh1032435.patch b/SOURCES/glibc-rh1032435.patch new file mode 100644 index 0000000..694bec2 --- /dev/null +++ b/SOURCES/glibc-rh1032435.patch @@ -0,0 +1,390 @@ +commit 977f4b31b7ca4a4e498c397f3fd70510694bbd86 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Oct 30 16:13:37 2013 +0530 + + Fix reads for sizes larger than INT_MAX in AF_INET lookup + + Currently for AF_INET lookups from the hosts file, buffer sizes larger + than INT_MAX silently overflow and may result in access beyond bounds + of a buffer. This happens when the number of results in an AF_INET + lookup in /etc/hosts are very large. + + There are two aspects to the problem. One problem is that the size + computed from the buffer size is stored into an int, which results in + overflow for large sizes. Additionally, even if this size was + expanded, the function used to read content into the buffer (fgets) + accepts only int sizes. As a result, the fix is to have a function + wrap around fgets that calls it multiple times with int sizes if + necessary. + +(The previous commit fixes upstream bug 16071.) + +commit ac60763eac3d43b7234dd21286ad3ec3f17957fc +Author: Andreas Schwab <schwab@suse.de> +Date: Mon Jun 23 10:24:45 2014 +0200 + + Don't ignore too long lines in nss_files (BZ #17079) + +commit e07aabba73ea62e7dfa0512507c92efb851fbdbe +Author: Florian Weimer <fweimer@redhat.com> +Date: Tue Sep 22 13:20:18 2015 +0200 + + Add test case for bug 18287 + +commit 90fa42a1d7b78de0d75f7e3af362275b2abe807f +Author: Florian Weimer <fweimer@redhat.com> +Date: Tue Sep 22 13:40:17 2015 +0200 + + Test in commit e07aabba73ea62e7dfa0512507c92efb851fbdbe is for bug 17079 + +diff -u b/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c +--- b/nss/nss_files/files-XXX.c ++++ b/nss/nss_files/files-XXX.c +@@ -179,8 +179,53 @@ + return NSS_STATUS_SUCCESS; + } + +-/* Parsing the database file into `struct STRUCTURE' data structures. */ + ++typedef enum ++{ ++ gcr_ok = 0, ++ gcr_error = -1, ++ gcr_overflow = -2 ++} get_contents_ret; ++ ++/* Hack around the fact that fgets only accepts int sizes. */ ++static get_contents_ret ++get_contents (char *linebuf, size_t len, FILE *stream) ++{ ++ size_t remaining_len = len; ++ char *curbuf = linebuf; ++ ++ do ++ { ++ int curlen = ((remaining_len > (size_t) INT_MAX) ? INT_MAX ++ : remaining_len); ++ ++ /* Terminate the line so that we can test for overflow. */ ++ ((unsigned char *) curbuf)[curlen - 1] = 0xff; ++ ++ char *p = fgets_unlocked (curbuf, curlen, stream); ++ ++ /* EOF or read error. */ ++ if (p == NULL) ++ return gcr_error; ++ ++ /* Done reading in the line. */ ++ if (((unsigned char *) curbuf)[curlen - 1] == 0xff) ++ return gcr_ok; ++ ++ /* Drop the terminating '\0'. */ ++ remaining_len -= curlen - 1; ++ curbuf += curlen - 1; ++ } ++ /* fgets copies one less than the input length. Our last iteration is of ++ REMAINING_LEN and once that is done, REMAINING_LEN is decremented by ++ REMAINING_LEN - 1, leaving the result as 1. */ ++ while (remaining_len > 1); ++ ++ /* This means that the current buffer was not large enough. */ ++ return gcr_overflow; ++} ++ ++/* Parsing the database file into `struct STRUCTURE' data structures. */ + static enum nss_status + internal_getent (struct STRUCTURE *result, + char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO +@@ -188,7 +233,7 @@ + { + char *p; + struct parser_data *data = (void *) buffer; +- int linebuflen = buffer + buflen - data->linebuffer; ++ size_t linebuflen = buffer + buflen - data->linebuffer; + int parse_result; + + if (buflen < sizeof *data + 2) +@@ -200,17 +245,16 @@ + + do + { +- /* Terminate the line so that we can test for overflow. */ +- ((unsigned char *) data->linebuffer)[linebuflen - 1] = '\xff'; ++ get_contents_ret r = get_contents (data->linebuffer, linebuflen, stream); + +- p = fgets_unlocked (data->linebuffer, linebuflen, stream); +- if (p == NULL) ++ if (r == gcr_error) + { + /* End of file or read error. */ + H_ERRNO_SET (HOST_NOT_FOUND); + return NSS_STATUS_NOTFOUND; + } +- else if (((unsigned char *) data->linebuffer)[linebuflen - 1] != 0xff) ++ ++ if (r == gcr_overflow) + { + /* The line is too long. Give the user the opportunity to + enlarge the buffer. */ +@@ -219,7 +263,8 @@ + return NSS_STATUS_TRYAGAIN; + } + +- /* Skip leading blanks. */ ++ /* Everything OK. Now skip leading blanks. */ ++ p = data->linebuffer; + while (isspace (*p)) + ++p; + } + +diff a/nss/bug17079.c b/nss/bug17079.c +--- /dev/null ++++ b/nss/bug17079.c +@@ -0,0 +1,236 @@ ++/* Test for bug 17079: heap overflow in NSS with small buffers. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <errno.h> ++#include <pwd.h> ++#include <stdbool.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++ ++/* Check if two passwd structs contain the same data. */ ++static bool ++equal (const struct passwd *a, const struct passwd *b) ++{ ++ return strcmp (a->pw_name, b->pw_name) == 0 ++ && strcmp (a->pw_passwd, b->pw_passwd) == 0 ++ && a->pw_uid == b->pw_uid ++ && a->pw_gid == b->pw_gid ++ && strcmp (a->pw_gecos, b->pw_gecos) == 0 ++ && strcmp (a->pw_dir, b->pw_dir) == 0 ++ && strcmp (a->pw_shell, b->pw_shell) == 0; ++} ++ ++enum { MAX_TEST_ITEMS = 10 }; ++static struct passwd test_items[MAX_TEST_ITEMS]; ++static int test_count; ++ ++/* Initialize test_items and test_count above, with data from the ++ passwd database. */ ++static bool ++init_test_items (void) ++{ ++ setpwent (); ++ do ++ { ++ struct passwd *pwd = getpwent (); ++ if (pwd == NULL) ++ break; ++ struct passwd *target = test_items + test_count; ++ target->pw_name = strdup (pwd->pw_name); ++ target->pw_passwd = strdup (pwd->pw_passwd); ++ target->pw_uid = pwd->pw_uid; ++ target->pw_gid = pwd->pw_gid; ++ target->pw_gecos = strdup (pwd->pw_gecos); ++ target->pw_dir = strdup (pwd->pw_dir); ++ target->pw_shell = strdup (pwd->pw_shell); ++ } ++ while (++test_count < MAX_TEST_ITEMS); ++ endpwent (); ++ ++ /* Filter out those test items which cannot be looked up by name or ++ UID. */ ++ bool found = false; ++ for (int i = 0; i < test_count; ++i) ++ { ++ struct passwd *pwd1 = getpwnam (test_items[i].pw_name); ++ 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; ++ else ++ found = true; ++ } ++ ++ if (!found) ++ puts ("error: no accounts found which can be looked up by name and UID."); ++ return found; ++} ++ ++/* Set to true if an error is encountered. */ ++static bool errors; ++ ++/* Return true if the padding has not been tampered with. */ ++static bool ++check_padding (char *buffer, size_t size, char pad) ++{ ++ char *end = buffer + size; ++ while (buffer < end) ++ { ++ if (*buffer != pad) ++ return false; ++ ++buffer; ++ } ++ return true; ++} ++ ++/* Test one buffer size and padding combination. */ ++static void ++test_one (const struct passwd *item, size_t buffer_size, ++ char pad, size_t padding_size) ++{ ++ char *buffer = malloc (buffer_size + padding_size); ++ if (buffer == NULL) ++ { ++ puts ("error: malloc failure"); ++ errors = true; ++ return; ++ } ++ ++ struct passwd pwd; ++ struct passwd *result; ++ int ret; ++ ++ /* Test getpwname_r. */ ++ memset (buffer, pad, buffer_size + padding_size); ++ pwd = (struct passwd) {}; ++ ret = getpwnam_r (item->pw_name, &pwd, buffer, buffer_size, &result); ++ if (!check_padding (buffer + buffer_size, padding_size, pad)) ++ { ++ printf ("error: padding change: " ++ "name \"%s\", buffer size %zu, padding size %zu, pad 0x%02x\n", ++ item->pw_name, buffer_size, padding_size, (unsigned char) pad); ++ errors = true; ++ } ++ if (ret == 0) ++ { ++ if (result == NULL) ++ { ++ printf ("error: no data: name \"%s\", buffer size %zu\n", ++ item->pw_name, buffer_size); ++ errors = true; ++ } ++ else if (!equal (item, result)) ++ { ++ printf ("error: lookup mismatch: name \"%s\", buffer size %zu\n", ++ item->pw_name, buffer_size); ++ errors = true; ++ } ++ } ++ else if (ret != ERANGE) ++ { ++ errno = ret; ++ printf ("error: lookup failure for name \"%s\": %m (%d)\n", ++ item->pw_name, ret); ++ errors = true; ++ } ++ ++ /* Test getpwuid_r. */ ++ memset (buffer, pad, buffer_size + padding_size); ++ pwd = (struct passwd) {}; ++ ret = getpwuid_r (item->pw_uid, &pwd, buffer, buffer_size, &result); ++ if (!check_padding (buffer + buffer_size, padding_size, pad)) ++ { ++ printf ("error: padding change: " ++ "UID %ld, buffer size %zu, padding size %zu, pad 0x%02x\n", ++ (long) item->pw_uid, buffer_size, padding_size, ++ (unsigned char) pad); ++ errors = true; ++ } ++ if (ret == 0) ++ { ++ if (result == NULL) ++ { ++ printf ("error: no data: UID %ld, buffer size %zu\n", ++ (long) item->pw_uid, buffer_size); ++ errors = true; ++ } ++ else if (!equal (item, result)) ++ { ++ printf ("error: lookup mismatch: UID %ld, buffer size %zu\n", ++ (long) item->pw_uid, buffer_size); ++ errors = true; ++ } ++ } ++ else if (ret != ERANGE) ++ { ++ errno = ret; ++ printf ("error: lookup failure for UID \"%ld\": %m (%d)\n", ++ (long) item->pw_uid, ret); ++ errors = true; ++ } ++ ++ free (buffer); ++} ++ ++/* Test one buffer size with different paddings. */ ++static void ++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) ++ { ++ test_one (test_items + i, buffer_size, '\0', padding_size); ++ if (padding_size > 0) ++ { ++ test_one (test_items + i, buffer_size, ':', padding_size); ++ test_one (test_items + i, buffer_size, '\n', padding_size); ++ test_one (test_items + i, buffer_size, '\xff', padding_size); ++ test_one (test_items + i, buffer_size, '@', padding_size); ++ } ++ } ++} ++ ++int ++do_test (void) ++{ ++ if (!init_test_items ()) ++ return 1; ++ printf ("info: %d test items\n", test_count); ++ ++ for (size_t buffer_size = 0; buffer_size <= 65; ++buffer_size) ++ test_buffer_size (buffer_size); ++ for (size_t buffer_size = 64 + 4; buffer_size < 256; buffer_size += 4) ++ test_buffer_size (buffer_size); ++ test_buffer_size (255); ++ test_buffer_size (257); ++ for (size_t buffer_size = 256; buffer_size < 512; buffer_size += 8) ++ test_buffer_size (buffer_size); ++ test_buffer_size (511); ++ test_buffer_size (513); ++ test_buffer_size (1024); ++ test_buffer_size (2048); ++ ++ if (errors) ++ return 1; ++ else ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff a/nss/Makefile b/nss/Makefile +--- a/nss/Makefile ++++ b/nss/Makefile +@@ -39,6 +39,6 @@ + extra-objs += $(makedb-modules:=.o) + +-tests = test-netdb tst-nss-test1 ++tests = test-netdb tst-nss-test1 bug17079 + xtests = bug-erange + + include ../Makeconfig diff --git a/SOURCES/glibc-rh1039304-1.patch b/SOURCES/glibc-rh1039304-1.patch new file mode 100644 index 0000000..f2bbe6e --- /dev/null +++ b/SOURCES/glibc-rh1039304-1.patch @@ -0,0 +1,185 @@ +commit 5c1a69238fcb87ff7f916a5ce7960b2864afb3a1 +Author: Florian Weimer <fweimer@redhat.com> +Date: Sat Nov 11 11:23:40 2017 +0100 + + resolv: Add tst-res_hnok + +diff --git a/resolv/Makefile b/resolv/Makefile +index 988871086a70b291..b1fd2e2db8736f9b 100644 +--- a/resolv/Makefile ++++ b/resolv/Makefile +@@ -50,6 +50,7 @@ tests += \ + tst-ns_name \ + tst-ns_name_compress \ + tst-res_hconf_reorder \ ++ tst-res_hnok \ + tst-res_use_inet6 \ + tst-resolv-basic \ + tst-resolv-edns \ +@@ -182,6 +183,7 @@ $(objpfx)tst-resolv-canonname: \ + $(objpfx)tst-ns_name: $(objpfx)libresolv.so + $(objpfx)tst-ns_name.out: tst-ns_name.data + $(objpfx)tst-ns_name_compress: $(objpfx)libresolv.so ++$(objpfx)tst-res_hnok: $(objpfx)libresolv.so + + + # This test case uses the deprecated RES_USE_INET6 resolver option. +diff --git a/resolv/tst-res_hnok.c b/resolv/tst-res_hnok.c +new file mode 100644 +index 0000000000000000..9c923038218e965c +--- /dev/null ++++ b/resolv/tst-res_hnok.c +@@ -0,0 +1,153 @@ ++/* Tests for res_hnok and related functions. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <array_length.h> ++#include <resolv.h> ++#include <string.h> ++#include <support/check.h> ++#include <support/test-driver.h> ++ ++/* Bits which indicate which functions are supposed to report ++ success. */ ++enum ++ { ++ hnok = 1, ++ dnok = 2, ++ mailok = 4, ++ ownok = 8, ++ allnomailok = hnok | dnok | ownok, ++ allok = hnok | dnok | mailok | ownok ++ }; ++ ++/* A string of 60 characters. */ ++#define STRING60 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" ++ ++/* A string of 63 characters (maximum label length). */ ++#define STRING63 STRING60 "zzz" ++ ++/* Combines a test name with the expected results. */ ++struct test_case ++{ ++ const char *dn; ++ unsigned int result; /* Combination of the *ok flags. */ ++}; ++ ++static const struct test_case tests[] = ++ { ++ { "", allok }, ++ { ".", allok }, ++ { "www", allnomailok }, ++ { "example", allnomailok }, ++ { "example.com", allok }, ++ { "www.example.com", allok }, ++ { "www.example.com.", allok }, ++ { "*.example.com", dnok | mailok | ownok }, ++ { "-v", dnok }, ++ { "-v.example.com", mailok | dnok }, ++ { "**.example.com", dnok | mailok }, ++ { STRING63, allnomailok }, ++ { STRING63 ".example.com", allok }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "z", allok }, ++ { "hostmaster@mail.example.com", dnok | mailok }, ++ { "with whitespace", 0 }, ++ { "with\twhitespace", 0 }, ++ { "with\nwhitespace", 0 }, ++ { "with.whitespace ", 0 }, ++ { "with.whitespace\t", 0 }, ++ { "with.whitespace\n", 0 }, ++ { "with\\ whitespace", 0 }, ++ { "with\\\twhitespace", 0 }, ++ { "with\\\nwhitespace", 0 }, ++ { "with.whitespace\\ ", 0 }, ++ { "with.whitespace\\\t", 0 }, ++ { "with.whitespace\\\n", 0 }, ++ }; ++ ++/* Run test case *TEST with FUNC (named FUNCNAME) and report an error ++ if the result does not match the result flag at BIT. */ ++static void ++one_test (const struct test_case *test, const char *funcname, ++ int (*func) (const char *), unsigned int bit) ++{ ++ int expected = (test->result & bit) != 0; ++ int actual = func (test->dn); ++ if (actual != expected) ++ { ++ support_record_failure (); ++ printf ("error: %s (\"%s\"): expected=%d, actual=%d\n", ++ funcname, test->dn, expected, actual); ++ } ++} ++ ++/* Run 255 tests using all the bytes from 1 to 255, surround the byte ++ with the strings PREFIX and SUFFIX, and check that FUNC (named ++ FUNCNAME) accepts only those bytes listed in ACCEPTED. */ ++static void ++one_char (const char *prefix, const char *accepted, const char *suffix, ++ const char *funcname, int (*func) (const char *)) ++{ ++ for (int ch = 1; ch <= 255; ++ch) ++ { ++ char dn[1024]; ++ snprintf (dn, sizeof (dn), "%s%c%s", prefix, ch, suffix); ++ int expected = strchr (accepted, ch) != NULL; ++ int actual = func (dn); ++ if (actual != expected) ++ { ++ support_record_failure (); ++ printf ("error: %s (\"%s\"): expected=%d, actual=%d\n", ++ funcname, dn, expected, actual); ++ } ++ } ++} ++ ++static int ++do_test (void) ++{ ++ for (const struct test_case *test = tests; test < array_end (tests); ++test) ++ { ++ if (test_verbose) ++ printf ("info: testing domain name [[[%s]]] (0x%x)\n", ++ test->dn, test->result); ++ one_test (test, "res_hnok", res_hnok, hnok); ++ one_test (test, "res_dnok", res_dnok, dnok); ++ one_test (test, "res_mailok", res_mailok, mailok); ++ one_test (test, "res_ownok", res_ownok, ownok); ++ } ++ ++ one_char ++ ("", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.", ++ "", "res_hnok", res_hnok); ++ one_char ++ ("middle", ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_", ++ "suffix", "res_hnok", res_hnok); ++ one_char ++ ("middle", ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_" ++ "!\"#$%&'()*+,/:;<=>?@[\\]^`{|}~", ++ "suffix.example", "res_mailok", res_mailok); ++ one_char ++ ("mailbox.middle", ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_", ++ "suffix.example", "res_mailok", res_mailok); ++ ++ return 0; ++} ++ ++#include <support/test-driver.c> diff --git a/SOURCES/glibc-rh1039304-2.patch b/SOURCES/glibc-rh1039304-2.patch new file mode 100644 index 0000000..7bea4a3 --- /dev/null +++ b/SOURCES/glibc-rh1039304-2.patch @@ -0,0 +1,235 @@ +commit e2a9fca8101443076235a8dbcfceaa2d96bf4801 +Author: Florian Weimer <fweimer@redhat.com> +Date: Sat Nov 11 11:33:32 2017 +0100 + + resolv: Add tst-ns_name_pton + +diff --git a/resolv/Makefile b/resolv/Makefile +index b1fd2e2db8736f9b..0130a09db2d69451 100644 +--- a/resolv/Makefile ++++ b/resolv/Makefile +@@ -49,6 +49,7 @@ tests += \ + tst-bug18665-tcp \ + tst-ns_name \ + tst-ns_name_compress \ ++ tst-ns_name_pton \ + tst-res_hconf_reorder \ + tst-res_hnok \ + tst-res_use_inet6 \ +@@ -183,6 +184,7 @@ $(objpfx)tst-resolv-canonname: \ + $(objpfx)tst-ns_name: $(objpfx)libresolv.so + $(objpfx)tst-ns_name.out: tst-ns_name.data + $(objpfx)tst-ns_name_compress: $(objpfx)libresolv.so ++$(objpfx)tst-ns_name_pton: $(objpfx)libresolv.so + $(objpfx)tst-res_hnok: $(objpfx)libresolv.so + + +diff --git a/resolv/tst-ns_name_pton.c b/resolv/tst-ns_name_pton.c +new file mode 100644 +index 0000000000000000..879d97c9d3816210 +--- /dev/null ++++ b/resolv/tst-ns_name_pton.c +@@ -0,0 +1,203 @@ ++/* Tests for ns_name_pton. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <arpa/nameser.h> ++#include <array_length.h> ++#include <stdbool.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <support/check.h> ++#include <support/support.h> ++#include <support/test-driver.h> ++ ++/* Bits which indicate which functions are supposed to report ++ success. */ ++enum ++ { ++ hnok = 1, ++ dnok = 2, ++ mailok = 4, ++ ownok = 8, ++ allnomailok = hnok | dnok | ownok, ++ allok = hnok | dnok | mailok | ownok ++ }; ++ ++/* A string of 60 characters. */ ++#define STRING60 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" ++ ++/* A string of 63 characters (maximum label length). */ ++#define STRING63 STRING60 "zzz" ++ ++/* A string of 60 bytes (non-ASCII). */ ++#define STRING60OCT \ ++ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ ++ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ ++ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ ++ "\377\377\377\377\377\377\377\377\377" ++ ++/* A string of 63 bytes (non-ASCII). */ ++#define STRING63OCT STRING60OCT "\377\377\377" ++ ++/* A string of 60 bytes (non-ASCII, quoted decimal). */ ++#define STRING60DEC \ ++ "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \ ++ "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \ ++ "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \ ++ "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \ ++ "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \ ++ "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" ++ ++/* A string of 63 bytes (non-ASCII, quoted decimal). */ ++#define STRING63DEC STRING60DEC "\\255\\255\\255" ++ ++/* Combines a test name with the expected results. */ ++struct test_case ++{ ++ const char *dn; ++ const char *back; /* Expected test result converted using ns_name_ntop. */ ++ bool fully_qualified; /* True if the domain name has a trailing dot. */ ++}; ++ ++static const struct test_case tests[] = ++ { ++ { "", ".", false }, ++ { ".", ".", true }, ++ { "..", NULL, }, ++ { "www", "www", false }, ++ { "www.", "www", true }, ++ { "www\\.", "www\\.", false }, ++ { ".www", NULL, }, ++ { ".www\\.", NULL, }, ++ { "example.com", "example.com", false }, ++ { "example.com.", "example.com", true }, ++ { ".example.com", NULL, }, ++ { ".example.com.", NULL, }, ++ { "example\\.com", "example\\.com", false }, ++ { "example\\.com.", "example\\.com", true }, ++ { "example..", NULL, }, ++ { "example..com", NULL, }, ++ { "example..com", NULL, }, ++ { "\\0", NULL, }, ++ { "\\00", NULL, }, ++ { "\\000", "\\000", false }, ++ { "\\1", NULL, }, ++ { "\\01", NULL, }, ++ { "\\001", "\\001", false }, ++ { "\\1x", NULL, }, ++ { "\\01x", NULL, }, ++ { "\\001x", "\\001x", false }, ++ { "\\256", NULL, }, ++ { "\\0641", "\\@1", false }, ++ { "\\0011", "\\0011", false }, ++ { STRING63, STRING63, false }, ++ { STRING63 ".", STRING63, true }, ++ { STRING63 "z", NULL, }, ++ { STRING63 "\\.", NULL, }, ++ { STRING60 "zz\\.", STRING60 "zz\\.", false }, ++ { STRING60 "zz\\..", STRING60 "zz\\.", true }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "z", ++ STRING63 "." STRING63 "." STRING63 "." STRING60 "z", false }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "z.", ++ STRING63 "." STRING63 "." STRING63 "." STRING60 "z", true }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "zz", NULL, }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "zzz", NULL, }, ++ { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT "\377", ++ STRING63DEC "." STRING63DEC "." STRING63DEC "." STRING60DEC "\\255", ++ false }, ++ { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT "\377.", ++ STRING63DEC "." STRING63DEC "." STRING63DEC "." STRING60DEC "\\255", ++ true }, ++ { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT ++ "\377\377", NULL, }, ++ { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT ++ "\377\377\377", NULL, }, ++ }; ++ ++static int ++do_test (void) ++{ ++ unsigned char *wire = xmalloc (NS_MAXCDNAME); ++ char *text = xmalloc (NS_MAXDNAME); ++ for (const struct test_case *test = tests; test < array_end (tests); ++test) ++ { ++ if (test_verbose) ++ printf ("info: testing domain name [[[%s]]]\n", test->dn); ++ int ret = ns_name_pton (test->dn, wire, NS_MAXCDNAME); ++ if (ret == -1) ++ { ++ if (test->back != NULL) ++ { ++ support_record_failure (); ++ printf ("error: unexpected decoding failure for [[%s]]\n", ++ test->dn); ++ } ++ /* Otherwise, we have an expected decoding failure. */ ++ continue; ++ } ++ ++ if (ret < -1 || ret > 1) ++ { ++ support_record_failure (); ++ printf ("error: invalid return value %d for [[%s]]\n", ++ ret, test->dn); ++ continue; ++ } ++ ++ int ret2 = ns_name_ntop (wire, text, NS_MAXDNAME); ++ ++ if (ret2 < 0) ++ { ++ support_record_failure (); ++ printf ("error: failure to convert back [[%s]]\n", test->dn); ++ } ++ ++ if (test->back == NULL) ++ { ++ support_record_failure (); ++ printf ("error: unexpected success converting [[%s]]\n", test->dn); ++ if (ret2 >= 1) ++ printf ("error: result converts back to [[%s]]\n", test->dn); ++ continue; ++ } ++ ++ if (strcmp (text, test->back) != 0) ++ { ++ support_record_failure (); ++ printf ("error: back-conversion of [[%s]] did not match\n", ++ test->dn); ++ printf ("error: expected: [[%s]]\n", test->back); ++ printf ("error: actual: [[%s]]\n", text); ++ } ++ ++ if (ret != test->fully_qualified) ++ { ++ support_record_failure (); ++ printf ("error: invalid fully-qualified status for [[%s]]\n", ++ test->dn); ++ printf ("error: expected: %d\n", (int) test->fully_qualified); ++ printf ("error: actual: %d\n", ret); ++ } ++ } ++ ++ free (text); ++ free (wire); ++ return 0; ++} ++ ++#include <support/test-driver.c> diff --git a/SOURCES/glibc-rh1039304-3.patch b/SOURCES/glibc-rh1039304-3.patch new file mode 100644 index 0000000..d39d4d2 --- /dev/null +++ b/SOURCES/glibc-rh1039304-3.patch @@ -0,0 +1,40 @@ +commit 9e0ad3049dbae88d615bfb038e53bf365a39a634 +Author: Florian Weimer <fweimer@redhat.com> +Date: Sat Nov 11 11:41:45 2017 +0100 + + resolv: ns_name_pton should report trailing \ as error [BZ #22413] + +diff --git a/resolv/ns_name.c b/resolv/ns_name.c +index 08a75e2fe0b4edd6..73213fee2dca530b 100644 +--- a/resolv/ns_name.c ++++ b/resolv/ns_name.c +@@ -222,6 +222,11 @@ ns_name_pton(const char *src, u_char *dst, size_t dstsiz) + } + *bp++ = (u_char)c; + } ++ if (escaped) { ++ /* Trailing backslash. */ ++ __set_errno (EMSGSIZE); ++ return -1; ++ } + c = (bp - label - 1); + if ((c & NS_CMPRSFLGS) != 0) { /*%< Label too big. */ + __set_errno (EMSGSIZE); +diff --git a/resolv/tst-ns_name_pton.c b/resolv/tst-ns_name_pton.c +index 879d97c9d3816210..73bdb05e08e405dc 100644 +--- a/resolv/tst-ns_name_pton.c ++++ b/resolv/tst-ns_name_pton.c +@@ -127,6 +127,13 @@ static const struct test_case tests[] = + "\377\377", NULL, }, + { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT + "\377\377\377", NULL, }, ++ { "\\", NULL, }, ++ { "\\\\", "\\\\", false }, ++ { "\\\\.", "\\\\", true }, ++ { "\\\\\\", NULL, }, ++ { "a\\", NULL, }, ++ { "a.\\", NULL, }, ++ { "a.b\\", NULL, }, + }; + + static int diff --git a/SOURCES/glibc-rh1039304-4.patch b/SOURCES/glibc-rh1039304-4.patch new file mode 100644 index 0000000..e67eab1 --- /dev/null +++ b/SOURCES/glibc-rh1039304-4.patch @@ -0,0 +1,322 @@ +commit c0a25aa92b612786f4e45292c4aee1d7d47123f8 +Author: Florian Weimer <fweimer@redhat.com> +Date: Sat Nov 11 11:51:08 2017 +0100 + + resolv: More precise checks in res_hnok, res_dnok [BZ #22409] [BZ #22412] + + res_hnok rejected some host names used on the Internet, such as + www-.example.com. res_hnok and res_dnok failed to perform basic syntax + checking on DNS domain names. + + Also fix res_mailok, res_ownok. + +diff --git a/resolv/res_comp.c b/resolv/res_comp.c +index ffb2ed59147d3680..79760e891f607daa 100644 +--- a/resolv/res_comp.c ++++ b/resolv/res_comp.c +@@ -1,3 +1,21 @@ ++/* Domain name processing functions. ++ Copyright (C) 1995-2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ + /* + * Copyright (c) 1985, 1993 + * The Regents of the University of California. All rights reserved. +@@ -121,110 +139,118 @@ dn_skipname(const u_char *ptr, const u_char *eom) { + } + libresolv_hidden_def (dn_skipname) + +-/* +- * Verify that a domain name uses an acceptable character set. +- */ ++/* Return true if the string consists of printable ASCII characters ++ only. */ ++static bool ++printable_string (const char *dn) ++{ ++ while (true) ++ { ++ char ch = *dn; ++ if (ch == '\0') ++ return true; ++ if (ch <= ' ' || ch > '~') ++ return false; ++ ++dn; ++ } ++} + +-/* +- * Note the conspicuous absence of ctype macros in these definitions. On +- * non-ASCII hosts, we can't depend on string literals or ctype macros to +- * tell us anything about network-format data. The rest of the BIND system +- * is not careful about this, but for some reason, we're doing it right here. +- */ +-#define PERIOD 0x2e +-#define hyphenchar(c) ((c) == 0x2d) +-#define underscorechar(c) ((c) == 0x5f) +-#define bslashchar(c) ((c) == 0x5c) +-#define periodchar(c) ((c) == PERIOD) +-#define asterchar(c) ((c) == 0x2a) +-#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \ +- || ((c) >= 0x61 && (c) <= 0x7a)) +-#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39) +- +-#define borderchar(c) (alphachar(c) || digitchar(c)) +-#define middlechar(c) (borderchar(c) || hyphenchar(c) || underscorechar(c)) +-#define domainchar(c) ((c) > 0x20 && (c) < 0x7f) ++/* Return true if DN points to a name consisting only of [0-9a-zA-Z_-] ++ characters. DN must be in DNS wire format, without ++ compression. */ ++static bool ++binary_hnok (const unsigned char *dn) ++{ ++ while (true) ++ { ++ size_t label_length = *dn; ++ if (label_length == 0) ++ break; ++ ++dn; ++ const unsigned char *label_end = dn + label_length; ++ do ++ { ++ unsigned char ch = *dn; ++ if (!(('0' <= ch && ch <= '9') ++ || ('A' <= ch && ch <= 'Z') ++ || ('a' <= ch && ch <= 'z') ++ || ch == '-' || ch == '_')) ++ return false; ++ ++dn; ++ } ++ while (dn < label_end); ++ } ++ return true; ++} ++ ++/* Return true if the binary domain name has a first labels which ++ starts with '-'. */ ++static inline bool ++binary_leading_dash (const unsigned char *dn) ++{ ++ return dn[0] > 0 && dn[1] == '-'; ++} + ++/* Return 1 if res_hnok is a valid host name. Labels must only ++ contain [0-9a-zA-Z_-] characters, and the name must not start with ++ a '-'. The latter is to avoid confusion with program options. */ + int +-res_hnok(const char *dn) { +- int pch = PERIOD, ch = *dn++; +- +- while (ch != '\0') { +- int nch = *dn++; +- +- if (periodchar(ch)) { +- (void)NULL; +- } else if (periodchar(pch)) { +- if (!borderchar(ch)) +- return (0); +- } else if (periodchar(nch) || nch == '\0') { +- if (!borderchar(ch)) +- return (0); +- } else { +- if (!middlechar(ch)) +- return (0); +- } +- pch = ch, ch = nch; +- } +- return (1); ++res_hnok (const char *dn) ++{ ++ unsigned char buf[NS_MAXCDNAME]; ++ if (!printable_string (dn) ++ || ns_name_pton (dn, buf, sizeof (buf)) < 0 ++ || binary_leading_dash (buf)) ++ return 0; ++ return binary_hnok (buf); + } + libresolv_hidden_def (res_hnok) + +-/* +- * hostname-like (A, MX, WKS) owners can have "*" as their first label +- * but must otherwise be as a host name. +- */ ++/* Hostname-like (A, MX, WKS) owners can have "*" as their first label ++ but must otherwise be as a host name. */ + int +-res_ownok(const char *dn) { +- if (asterchar(dn[0])) { +- if (periodchar(dn[1])) +- return (res_hnok(dn+2)); +- if (dn[1] == '\0') +- return (1); +- } +- return (res_hnok(dn)); ++res_ownok (const char *dn) ++{ ++ unsigned char buf[NS_MAXCDNAME]; ++ if (!printable_string (dn) ++ || ns_name_pton (dn, buf, sizeof (buf)) < 0 ++ || binary_leading_dash (buf)) ++ return 0; ++ if (buf[0] == 1 && buf [1] == '*') ++ /* Skip over the leading "*." part. */ ++ return binary_hnok (buf + 2); ++ else ++ return binary_hnok (buf); + } + +-/* +- * SOA RNAMEs and RP RNAMEs can have any printable character in their first +- * label, but the rest of the name has to look like a host name. +- */ ++/* SOA RNAMEs and RP RNAMEs can have any byte in their first label, ++ but the rest of the name has to look like a host name. */ + int +-res_mailok(const char *dn) { +- int ch, escaped = 0; +- +- /* "." is a valid missing representation */ +- if (*dn == '\0') +- return (1); +- +- /* otherwise <label>.<hostname> */ +- while ((ch = *dn++) != '\0') { +- if (!domainchar(ch)) +- return (0); +- if (!escaped && periodchar(ch)) +- break; +- if (escaped) +- escaped = 0; +- else if (bslashchar(ch)) +- escaped = 1; +- } +- if (periodchar(ch)) +- return (res_hnok(dn)); +- return (0); ++res_mailok (const char *dn) ++{ ++ unsigned char buf[NS_MAXCDNAME]; ++ if (!printable_string (dn) ++ || ns_name_pton (dn, buf, sizeof (buf)) < 0) ++ return 0; ++ unsigned char label_length = buf[0]; ++ /* "." is a valid missing representation */ ++ if (label_length == 0) ++ return 1; ++ /* Skip over the first label. */ ++ unsigned char *tail = buf + 1 + label_length; ++ if (*tail == 0) ++ /* More than one label is required (except for "."). */ ++ return 0; ++ return binary_hnok (tail); + } + +-/* +- * This function is quite liberal, since RFC 1034's character sets are only +- * recommendations. +- */ ++/* Return 1 if DN is a syntactically valid domain name. Empty names ++ are accepted. */ + int +-res_dnok(const char *dn) { +- int ch; +- +- while ((ch = *dn++) != '\0') +- if (!domainchar(ch)) +- return (0); +- return (1); ++res_dnok (const char *dn) ++{ ++ unsigned char buf[NS_MAXCDNAME]; ++ return printable_string (dn) && ns_name_pton (dn, buf, sizeof (buf)) >= 0; + } + libresolv_hidden_def (res_dnok) + +diff --git a/resolv/tst-res_hnok.c b/resolv/tst-res_hnok.c +index 9c923038218e965c..314477a2ce2661c0 100644 +--- a/resolv/tst-res_hnok.c ++++ b/resolv/tst-res_hnok.c +@@ -51,19 +51,31 @@ static const struct test_case tests[] = + { + { "", allok }, + { ".", allok }, ++ { "..", 0 }, + { "www", allnomailok }, ++ { "www.", allnomailok }, + { "example", allnomailok }, + { "example.com", allok }, + { "www.example.com", allok }, + { "www.example.com.", allok }, ++ { "www-.example.com.", allok }, ++ { "www.-example.com.", allok }, + { "*.example.com", dnok | mailok | ownok }, + { "-v", dnok }, + { "-v.example.com", mailok | dnok }, + { "**.example.com", dnok | mailok }, ++ { "www.example.com\\", 0 }, + { STRING63, allnomailok }, ++ { STRING63 ".", allnomailok }, ++ { STRING63 "\\.", 0 }, ++ { STRING63 "z", 0 }, + { STRING63 ".example.com", allok }, + { STRING63 "." STRING63 "." STRING63 "." STRING60 "z", allok }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "z.", allok }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "zz", 0 }, ++ { STRING63 "." STRING63 "." STRING63 "." STRING60 "zzz", 0 }, + { "hostmaster@mail.example.com", dnok | mailok }, ++ { "hostmaster\\@mail.example.com", dnok | mailok }, + { "with whitespace", 0 }, + { "with\twhitespace", 0 }, + { "with\nwhitespace", 0 }, +@@ -116,6 +128,12 @@ one_char (const char *prefix, const char *accepted, const char *suffix, + } + } + ++#define LETTERSDIGITS \ ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ++ ++#define PRINTABLE \ ++ "!\"#$%&'()*+,/:;<=>?@[\\]^`{|}~" ++ + static int + do_test (void) + { +@@ -131,20 +149,18 @@ do_test (void) + } + + one_char +- ("", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.", +- "", "res_hnok", res_hnok); ++ ("", LETTERSDIGITS "._", "", "res_hnok", res_hnok); + one_char + ("middle", +- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_", ++ LETTERSDIGITS ".-_\\", /* "middle\\suffix" == "middlesuffix", so good. */ + "suffix", "res_hnok", res_hnok); + one_char + ("middle", +- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_" +- "!\"#$%&'()*+,/:;<=>?@[\\]^`{|}~", ++ LETTERSDIGITS ".-_" PRINTABLE, + "suffix.example", "res_mailok", res_mailok); + one_char + ("mailbox.middle", +- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_", ++ LETTERSDIGITS ".-_\\", + "suffix.example", "res_mailok", res_mailok); + + return 0; diff --git a/SOURCES/glibc-rh1039496.patch b/SOURCES/glibc-rh1039496.patch new file mode 100644 index 0000000..1243bbb --- /dev/null +++ b/SOURCES/glibc-rh1039496.patch @@ -0,0 +1,102 @@ +diff -urNglibc-2.17-c758a686/libio/tst-widetext.inputglibc-2.17-c758a686/libio/tst-widetext.input +--- glibc-2.17-c758a686/libio/tst-widetext.input 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/libio/tst-widetext.input 2013-12-11 09:48:30.760084849 -0500 +@@ -126,7 +126,7 @@ + ◌ઁ◌ંઃઅઆઇઈઉઊઋઌઍએઐઑઓઔકખગઘઙચછજઝઞટઠડઢણતથદધનપફબભમયરલળવશષસહ◌઼ઽાિ + ી◌ુ◌ૂ◌ૃ◌ૄ◌ૅ◌ે◌ૈૉોૌ◌્ૐૠૡૢૣ૦૧૨૩૪૫૬૭૮૯૰૱ૹૺૻૼ૽૾૿ + +-Oriya (U+0B00-U+0B7F): ++Odia (U+0B00-U+0B7F): + + ◌ଁଂଃଅଆଇଈଉଊଋଌଏଐଓଔକଖଗଘଙଚଛଜଝଞଟଠଡଢଣତଥଦଧନପଫବଭମଯରଲଳଵଶଷସହ◌଼ଽା◌ି + ୀ◌ୁ◌ୂ◌ୃୄେୈୋୌ◌୍୕◌ୖୗଡ଼ଢ଼ୟୠୡୢୣ୦୧୨୩୪୫୬୭୮୯୰ୱ୲୳୴୵୶୷ +diff -urNglibc-2.17-c758a686/locale/iso-639.defglibc-2.17-c758a686/locale/iso-639.def +--- glibc-2.17-c758a686/locale/iso-639.def 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/locale/iso-639.def 2013-12-11 09:58:58.414959856 -0500 +@@ -181,7 +181,7 @@ + DEFINE_LANGUAGE_CODE ("Greek, Modern (1453-)", el, ell, gre) + DEFINE_LANGUAGE_CODE ("Guarani", gn, grn, grn) + DEFINE_LANGUAGE_CODE ("Gujarati", gu, guj, guj) +-DEFINE_LANGUAGE_CODE3 ("Gwich�in", gwi, gwi) ++DEFINE_LANGUAGE_CODE3 ("Gwich´in", gwi, gwi) + DEFINE_LANGUAGE_CODE3 ("Haida", hai, hai) + DEFINE_LANGUAGE_CODE ("Haitian; Haitian Creole", ht, hat, hat) + DEFINE_LANGUAGE_CODE ("Hausa", ha, hau, hau) +@@ -337,7 +337,7 @@ + DEFINE_LANGUAGE_CODE3 ("North American Indian", nai, nai) + DEFINE_LANGUAGE_CODE ("Northern Sami", se, sme, sme) + DEFINE_LANGUAGE_CODE3 ("Northern Sotho; Pedi; Sepedi", nso, nso) +-DEFINE_LANGUAGE_CODE ("Norwegian Bokm�l", nb, nob, nob) ++DEFINE_LANGUAGE_CODE ("Norwegian Bokmål", nb, nob, nob) + DEFINE_LANGUAGE_CODE ("Norwegian Nynorsk", nn, nno, nno) + DEFINE_LANGUAGE_CODE ("Norwegian", no, nor, nor) + DEFINE_LANGUAGE_CODE3 ("Nubian languages", nub, nub) +@@ -345,9 +345,9 @@ + DEFINE_LANGUAGE_CODE3 ("Nyankole", nyn, nyn) + DEFINE_LANGUAGE_CODE3 ("Nyoro", nyo, nyo) + DEFINE_LANGUAGE_CODE3 ("Nzima", nzi, nzi) +-DEFINE_LANGUAGE_CODE ("Occitan (post 1500); Proven�al", oc, oci, oci) ++DEFINE_LANGUAGE_CODE ("Occitan (post 1500); Provençal", oc, oci, oci) + DEFINE_LANGUAGE_CODE ("Ojibwa", oj, oji, oji) +-DEFINE_LANGUAGE_CODE ("Oriya", or, ori, ori) ++DEFINE_LANGUAGE_CODE ("Odia", or, ori, ori) + DEFINE_LANGUAGE_CODE ("Oromo", om, orm, orm) + DEFINE_LANGUAGE_CODE3 ("Osage", osa, osa) + DEFINE_LANGUAGE_CODE ("Ossetian; Ossetic", os, oss, oss) +@@ -368,7 +368,7 @@ + DEFINE_LANGUAGE_CODE ("Polish", pl, pol, pol) + DEFINE_LANGUAGE_CODE ("Portuguese", pt, por, por) + DEFINE_LANGUAGE_CODE3 ("Prakrit languages", pra, pra) +-DEFINE_LANGUAGE_CODE3 ("Proven�al, Old (to 1500)", pro, pro) ++DEFINE_LANGUAGE_CODE3 ("Provençal, Old (to 1500)", pro, pro) + DEFINE_LANGUAGE_CODE ("Pushto", ps, pus, pus) + DEFINE_LANGUAGE_CODE ("Quechua", qu, que, que) + DEFINE_LANGUAGE_CODE ("Raeto-Romance", rm, roh, roh) +@@ -476,7 +476,7 @@ + DEFINE_LANGUAGE_CODE3 ("Vai", vai, vai) + DEFINE_LANGUAGE_CODE ("Venda", ve, ven, ven) + DEFINE_LANGUAGE_CODE ("Vietnamese", vi, vie, vie) +-DEFINE_LANGUAGE_CODE ("Volap�k", vo, vol, vol) ++DEFINE_LANGUAGE_CODE ("Volapük", vo, vol, vol) + DEFINE_LANGUAGE_CODE3 ("Votic", vot, vot) + DEFINE_LANGUAGE_CODE3 ("Wakashan languages", wak, wak) + DEFINE_LANGUAGE_CODE3 ("Walser", wae, wae) +diff -urNglibc-2.17-c758a686/localedata/locales/or_INglibc-2.17-c758a686/localedata/locales/or_IN +--- glibc-2.17-c758a686/localedata/locales/or_IN 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/localedata/locales/or_IN 2013-12-11 09:52:26.932931534 -0500 +@@ -1,19 +1,19 @@ + comment_char % + escape_char / + +-% Oriya locale for India. ++% Odia locale for India. + % Contributed by Masahide Washizawa <washi at jp ibm com> + + %%%%%%%%%%%%% + LC_IDENTIFICATION +-title "Oriya language locale for India" ++title "Odia language locale for India" + source "IBM AP Linux Technology Center, Yamato Software Laboratory" + address "1623-14, Shimotsuruma, Yamato-shi, Kanagawa-ken, 242-8502, Japan" + contact "" + email "bug-glibc@gnu.org" + tel "" + fax "" +-language "Oriya" ++language "Odia" + territory "India" + revision "1.0" + date "2006-05-25" +@@ -35,10 +35,10 @@ + LC_CTYPE + copy "i18n" + +-% Oriya uses the alternate digits U+0B66..U+0B6F ++% Odia uses the alternate digits U+0B66..U+0B6F + outdigit <U0B66>..<U0B6F> + +-% This is used in the scanf family of functions to read Oriya numbers ++% This is used in the scanf family of functions to read Odia numbers + % using "%Id" and such. + map to_inpunct; / + (<U0030>,<U0B66>); / diff --git a/SOURCES/glibc-rh1039970.patch b/SOURCES/glibc-rh1039970.patch new file mode 100644 index 0000000..85f8b91 --- /dev/null +++ b/SOURCES/glibc-rh1039970.patch @@ -0,0 +1,135 @@ +commit 9a3c6a6ff602c88d7155139a7d7d0000b7b7e946 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Jan 2 10:05:27 2014 +0530 + + Fix return code from getent netgroup when the netgroup is not found (bz #16366) + +diff -pruN glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +--- glibc-2.17-c758a686/nscd/netgroupcache.c 2013-12-03 20:41:12.000000000 -0500 ++++ glibc-2.17-c758a686/nscd/netgroupcache.c 2013-12-19 08:36:52.253000000 -0500 +@@ -65,6 +65,55 @@ struct dataset + char strdata[0]; + }; + ++/* Sends a notfound message and prepares a notfound dataset to write to the ++ cache. Returns true if there was enough memory to allocate the dataset and ++ returns the dataset in DATASETP, total bytes to write in TOTALP and the ++ timeout in TIMEOUTP. KEY_COPY is set to point to the copy of the key in the ++ dataset. */ ++static bool ++do_notfound (struct database_dyn *db, int fd, request_header *req, ++ const char *key, struct dataset **datasetp, ssize_t *totalp, ++ time_t *timeoutp, char **key_copy) ++{ ++ struct dataset *dataset; ++ ssize_t total; ++ time_t timeout; ++ bool cacheable = false; ++ ++ total = sizeof (notfound); ++ timeout = time (NULL) + db->negtimeout; ++ ++ if (fd != -1) ++ TEMP_FAILURE_RETRY (send (fd, ¬found, total, MSG_NOSIGNAL)); ++ ++ dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, 1); ++ /* If we cannot permanently store the result, so be it. */ ++ if (dataset != NULL) ++ { ++ dataset->head.allocsize = sizeof (struct dataset) + req->key_len; ++ dataset->head.recsize = total; ++ dataset->head.notfound = true; ++ dataset->head.nreloads = 0; ++ dataset->head.usable = true; ++ ++ /* Compute the timeout time. */ ++ timeout = dataset->head.timeout = time (NULL) + db->negtimeout; ++ dataset->head.ttl = db->negtimeout; ++ ++ /* This is the reply. */ ++ memcpy (&dataset->resp, ¬found, total); ++ ++ /* Copy the key data. */ ++ memcpy (dataset->strdata, key, req->key_len); ++ *key_copy = dataset->strdata; ++ ++ cacheable = true; ++ } ++ *timeoutp = timeout; ++ *totalp = total; ++ *datasetp = dataset; ++ return cacheable; ++} + + static time_t + addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, +@@ -84,6 +133,7 @@ addgetnetgrentX (struct database_dyn *db + struct dataset *dataset; + bool cacheable = false; + ssize_t total; ++ bool found = false; + + char *key_copy = NULL; + struct __netgrent data; +@@ -103,35 +153,8 @@ addgetnetgrentX (struct database_dyn *db + && __nss_database_lookup ("netgroup", NULL, NULL, &netgroup_database)) + { + /* No such service. */ +- total = sizeof (notfound); +- timeout = time (NULL) + db->negtimeout; +- +- if (fd != -1) +- TEMP_FAILURE_RETRY (send (fd, ¬found, total, MSG_NOSIGNAL)); +- +- dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, 1); +- /* If we cannot permanently store the result, so be it. */ +- if (dataset != NULL) +- { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = time (NULL) + db->negtimeout; +- dataset->head.ttl = db->negtimeout; +- +- /* This is the reply. */ +- memcpy (&dataset->resp, ¬found, total); +- +- /* Copy the key data. */ +- memcpy (dataset->strdata, key, req->key_len); +- +- cacheable = true; +- } +- ++ cacheable = do_notfound (db, fd, req, key, &dataset, &total, &timeout, ++ &key_copy); + goto writeout; + } + +@@ -167,6 +190,7 @@ addgetnetgrentX (struct database_dyn *db + + if (status == NSS_STATUS_SUCCESS) + { ++ found = true; + union + { + enum nss_status (*f) (struct __netgrent *, char *, size_t, +@@ -325,6 +349,15 @@ addgetnetgrentX (struct database_dyn *db + } + } + ++ /* No results. Return a failure and write out a notfound record in the ++ cache. */ ++ if (!found) ++ { ++ cacheable = do_notfound (db, fd, req, key, &dataset, &total, &timeout, ++ &key_copy); ++ goto writeout; ++ } ++ + total = buffilled; + + /* Fill in the dataset. */ diff --git a/SOURCES/glibc-rh1046199.patch b/SOURCES/glibc-rh1046199.patch new file mode 100644 index 0000000..b00c985 --- /dev/null +++ b/SOURCES/glibc-rh1046199.patch @@ -0,0 +1,23 @@ +commit d41242129ba693cdbc8db85b846fcaccf9f0b7c4 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Jan 2 10:03:12 2014 +0530 + + Fix infinite loop in nscd when netgroup is empty (bz #16365) + +diff -pruN glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +--- glibc-2.17-c758a686/nscd/netgroupcache.c 2013-12-20 04:38:40.432000000 -0500 ++++ glibc-2.17-c758a686/nscd/netgroupcache.c 2013-12-20 04:37:29.945000000 -0500 +@@ -204,9 +204,10 @@ addgetnetgrentX (struct database_dyn *db + int e; + status = getfct.f (&data, buffer + buffilled, + buflen - buffilled, &e); +- if (status == NSS_STATUS_RETURN) +- /* This was the last one for this group. Look +- at next group if available. */ ++ if (status == NSS_STATUS_RETURN ++ || status == NSS_STATUS_NOTFOUND) ++ /* This was either the last one for this group or the ++ group was empty. Look at next group if available. */ + break; + if (status == NSS_STATUS_SUCCESS) + { diff --git a/SOURCES/glibc-rh1047983.patch b/SOURCES/glibc-rh1047983.patch new file mode 100644 index 0000000..a5877cd --- /dev/null +++ b/SOURCES/glibc-rh1047983.patch @@ -0,0 +1,555 @@ +commit 5a4c6d53f50b264d60cf6453576ca2810c7890b7 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Nov 28 17:18:12 2013 +0530 + + Get canonical name in getaddrinfo from hosts file for AF_INET (fixes 16077) + + AF_INET lookup in hosts file uses _nss_files_gethostbyname2_r, which + is not capable of returning a canonical name if it has found one. + This change adds _nss_files_gethostbyname3_r, which wraps around + _nss_files_gethostbyname2_r and then returns result.h_name as the + canonical name. + +diff --git glibc-2.17-c758a686/nss/Versions glibc-2.17-c758a686/nss/Versions +index d13d570..f8ababc 100644 +--- glibc-2.17-c758a686/nss/Versions ++++ glibc-2.17-c758a686/nss/Versions +@@ -40,6 +40,7 @@ libnss_files { + _nss_files_endhostent; + _nss_files_gethostbyaddr_r; + _nss_files_gethostbyname2_r; ++ _nss_files_gethostbyname3_r; + _nss_files_gethostbyname4_r; + _nss_files_gethostbyname_r; + _nss_files_gethostent_r; +diff --git glibc-2.17-c758a686/nss/nss_files/files-hosts.c glibc-2.17-c758a686/nss/nss_files/files-hosts.c +index 6db2535..957c9aa 100644 +--- glibc-2.17-c758a686/nss/nss_files/files-hosts.c ++++ glibc-2.17-c758a686/nss/nss_files/files-hosts.c +@@ -97,262 +97,12 @@ LINE_PARSER + STRING_FIELD (result->h_name, isspace, 1); + }) + +- +- +-#define HOST_DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...) \ +-enum nss_status \ +-_nss_files_get##name##_r (proto, \ +- struct STRUCTURE *result, char *buffer, \ +- size_t buflen, int *errnop H_ERRNO_PROTO) \ +-{ \ +- uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data); \ +- buffer += pad; \ +- buflen = buflen > pad ? buflen - pad : 0; \ +- \ +- __libc_lock_lock (lock); \ +- \ +- /* Reset file pointer to beginning or open file. */ \ +- enum nss_status status = internal_setent (keep_stream); \ +- \ +- if (status == NSS_STATUS_SUCCESS) \ +- { \ +- /* Tell getent function that we have repositioned the file pointer. */ \ +- last_use = getby; \ +- \ +- while ((status = internal_getent (result, buffer, buflen, errnop \ +- H_ERRNO_ARG EXTRA_ARGS_VALUE)) \ +- == NSS_STATUS_SUCCESS) \ +- { break_if_match } \ +- \ +- if (status == NSS_STATUS_SUCCESS \ +- && _res_hconf.flags & HCONF_FLAG_MULTI) \ +- { \ +- /* We have to get all host entries from the file. */ \ +- size_t tmp_buflen = MIN (buflen, 4096); \ +- char tmp_buffer_stack[tmp_buflen] \ +- __attribute__ ((__aligned__ (__alignof__ (struct hostent_data))));\ +- char *tmp_buffer = tmp_buffer_stack; \ +- struct hostent tmp_result_buf; \ +- int naddrs = 1; \ +- int naliases = 0; \ +- char *bufferend; \ +- bool tmp_buffer_malloced = false; \ +- \ +- while (result->h_aliases[naliases] != NULL) \ +- ++naliases; \ +- \ +- bufferend = (char *) &result->h_aliases[naliases + 1]; \ +- \ +- again: \ +- while ((status = internal_getent (&tmp_result_buf, tmp_buffer, \ +- tmp_buflen, errnop H_ERRNO_ARG \ +- EXTRA_ARGS_VALUE)) \ +- == NSS_STATUS_SUCCESS) \ +- { \ +- int matches = 1; \ +- struct hostent *old_result = result; \ +- result = &tmp_result_buf; \ +- /* The following piece is a bit clumsy but we want to use the \ +- `break_if_match' value. The optimizer should do its \ +- job. */ \ +- do \ +- { \ +- break_if_match \ +- result = old_result; \ +- } \ +- while ((matches = 0)); \ +- \ +- if (matches) \ +- { \ +- /* We could be very clever and try to recycle a few bytes \ +- in the buffer instead of generating new arrays. But \ +- we are not doing this here since it's more work than \ +- it's worth. Simply let the user provide a bit bigger \ +- buffer. */ \ +- char **new_h_addr_list; \ +- char **new_h_aliases; \ +- int newaliases = 0; \ +- size_t newstrlen = 0; \ +- int cnt; \ +- \ +- /* Count the new aliases and the length of the strings. */ \ +- while (tmp_result_buf.h_aliases[newaliases] != NULL) \ +- { \ +- char *cp = tmp_result_buf.h_aliases[newaliases]; \ +- ++newaliases; \ +- newstrlen += strlen (cp) + 1; \ +- } \ +- /* If the real name is different add it also to the \ +- aliases. This means that there is a duplication \ +- in the alias list but this is really the user's \ +- problem. */ \ +- if (strcmp (old_result->h_name, \ +- tmp_result_buf.h_name) != 0) \ +- { \ +- ++newaliases; \ +- newstrlen += strlen (tmp_result_buf.h_name) + 1; \ +- } \ +- \ +- /* Make sure bufferend is aligned. */ \ +- assert ((bufferend - (char *) 0) % sizeof (char *) == 0); \ +- \ +- /* Now we can check whether the buffer is large enough. \ +- 16 is the maximal size of the IP address. */ \ +- if (bufferend + 16 + (naddrs + 2) * sizeof (char *) \ +- + roundup (newstrlen, sizeof (char *)) \ +- + (naliases + newaliases + 1) * sizeof (char *) \ +- >= buffer + buflen) \ +- { \ +- *errnop = ERANGE; \ +- *herrnop = NETDB_INTERNAL; \ +- status = NSS_STATUS_TRYAGAIN; \ +- goto out; \ +- } \ +- \ +- new_h_addr_list = \ +- (char **) (bufferend \ +- + roundup (newstrlen, sizeof (char *)) \ +- + 16); \ +- new_h_aliases = \ +- (char **) ((char *) new_h_addr_list \ +- + (naddrs + 2) * sizeof (char *)); \ +- \ +- /* Copy the old data in the new arrays. */ \ +- for (cnt = 0; cnt < naddrs; ++cnt) \ +- new_h_addr_list[cnt] = old_result->h_addr_list[cnt]; \ +- \ +- for (cnt = 0; cnt < naliases; ++cnt) \ +- new_h_aliases[cnt] = old_result->h_aliases[cnt]; \ +- \ +- /* Store the new strings. */ \ +- cnt = 0; \ +- while (tmp_result_buf.h_aliases[cnt] != NULL) \ +- { \ +- new_h_aliases[naliases++] = bufferend; \ +- bufferend = (__stpcpy (bufferend, \ +- tmp_result_buf.h_aliases[cnt]) \ +- + 1); \ +- ++cnt; \ +- } \ +- \ +- if (cnt < newaliases) \ +- { \ +- new_h_aliases[naliases++] = bufferend; \ +- bufferend = __stpcpy (bufferend, \ +- tmp_result_buf.h_name) + 1; \ +- } \ +- \ +- /* Final NULL pointer. */ \ +- new_h_aliases[naliases] = NULL; \ +- \ +- /* Round up the buffer end address. */ \ +- bufferend += (sizeof (char *) \ +- - ((bufferend - (char *) 0) \ +- % sizeof (char *))) % sizeof (char *); \ +- \ +- /* Now the new address. */ \ +- new_h_addr_list[naddrs++] = \ +- memcpy (bufferend, tmp_result_buf.h_addr, \ +- tmp_result_buf.h_length); \ +- \ +- /* Also here a final NULL pointer. */ \ +- new_h_addr_list[naddrs] = NULL; \ +- \ +- /* Store the new array pointers. */ \ +- old_result->h_aliases = new_h_aliases; \ +- old_result->h_addr_list = new_h_addr_list; \ +- \ +- /* Compute the new buffer end. */ \ +- bufferend = (char *) &new_h_aliases[naliases + 1]; \ +- assert (bufferend <= buffer + buflen); \ +- \ +- result = old_result; \ +- } \ +- } \ +- \ +- if (status == NSS_STATUS_TRYAGAIN) \ +- { \ +- size_t newsize = 2 * tmp_buflen; \ +- if (tmp_buffer_malloced) \ +- { \ +- char *newp = realloc (tmp_buffer, newsize); \ +- if (newp != NULL) \ +- { \ +- assert ((((uintptr_t) newp) \ +- & (__alignof__ (struct hostent_data) - 1)) \ +- == 0); \ +- tmp_buffer = newp; \ +- tmp_buflen = newsize; \ +- goto again; \ +- } \ +- } \ +- else if (!__libc_use_alloca (buflen + newsize)) \ +- { \ +- tmp_buffer = malloc (newsize); \ +- if (tmp_buffer != NULL) \ +- { \ +- assert ((((uintptr_t) tmp_buffer) \ +- & (__alignof__ (struct hostent_data) - 1)) \ +- == 0); \ +- tmp_buffer_malloced = true; \ +- tmp_buflen = newsize; \ +- goto again; \ +- } \ +- } \ +- else \ +- { \ +- tmp_buffer \ +- = extend_alloca (tmp_buffer, tmp_buflen, \ +- newsize \ +- + __alignof__ (struct hostent_data)); \ +- tmp_buffer = (char *) (((uintptr_t) tmp_buffer \ +- + __alignof__ (struct hostent_data) \ +- - 1) \ +- & ~(__alignof__ (struct hostent_data)\ +- - 1)); \ +- goto again; \ +- } \ +- } \ +- else \ +- status = NSS_STATUS_SUCCESS; \ +- out: \ +- if (tmp_buffer_malloced) \ +- free (tmp_buffer); \ +- } \ +- \ +- \ +- if (! keep_stream) \ +- internal_endent (); \ +- } \ +- \ +- __libc_lock_unlock (lock); \ +- \ +- return status; \ +-} +- +- + #define EXTRA_ARGS_VALUE \ + , ((_res.options & RES_USE_INET6) ? AF_INET6 : AF_INET), \ + ((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0) + #include "files-XXX.c" +-HOST_DB_LOOKUP (hostbyname, ,, +- { +- LOOKUP_NAME_CASE (h_name, h_aliases) +- }, const char *name) + #undef EXTRA_ARGS_VALUE + +- +-/* XXX Is using _res to determine whether we want to convert IPv4 addresses +- to IPv6 addresses really the right thing to do? */ +-#define EXTRA_ARGS_VALUE \ +- , af, ((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0) +-HOST_DB_LOOKUP (hostbyname2, ,, +- { +- LOOKUP_NAME_CASE (h_name, h_aliases) +- }, const char *name, int af) +-#undef EXTRA_ARGS_VALUE +- +- + /* We only need to consider IPv4 mapped addresses if the input to the + gethostbyaddr() function is an IPv6 address. */ + #define EXTRA_ARGS_VALUE \ +@@ -365,6 +115,263 @@ DB_LOOKUP (hostbyaddr, ,,, + }, const void *addr, socklen_t len, int af) + #undef EXTRA_ARGS_VALUE + ++enum nss_status ++_nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result, ++ char *buffer, size_t buflen, int *errnop, ++ int *herrnop, int32_t *ttlp, char **canonp) ++{ ++ uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data); ++ buffer += pad; ++ buflen = buflen > pad ? buflen - pad : 0; ++ ++ __libc_lock_lock (lock); ++ ++ /* Reset file pointer to beginning or open file. */ ++ enum nss_status status = internal_setent (keep_stream); ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ /* XXX Is using _res to determine whether we want to convert IPv4 ++ addresses to IPv6 addresses really the right thing to do? */ ++ int flags = ((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0); ++ ++ /* Tell getent function that we have repositioned the file pointer. */ ++ last_use = getby; ++ ++ while ((status = internal_getent (result, buffer, buflen, errnop, ++ herrnop, af, flags)) ++ == NSS_STATUS_SUCCESS) ++ { ++ LOOKUP_NAME_CASE (h_name, h_aliases) ++ } ++ ++ if (status == NSS_STATUS_SUCCESS ++ && _res_hconf.flags & HCONF_FLAG_MULTI) ++ { ++ /* We have to get all host entries from the file. */ ++ size_t tmp_buflen = MIN (buflen, 4096); ++ char tmp_buffer_stack[tmp_buflen] ++ __attribute__ ((__aligned__ (__alignof__ (struct hostent_data)))); ++ char *tmp_buffer = tmp_buffer_stack; ++ struct hostent tmp_result_buf; ++ int naddrs = 1; ++ int naliases = 0; ++ char *bufferend; ++ bool tmp_buffer_malloced = false; ++ ++ while (result->h_aliases[naliases] != NULL) ++ ++naliases; ++ ++ bufferend = (char *) &result->h_aliases[naliases + 1]; ++ ++ again: ++ while ((status = internal_getent (&tmp_result_buf, tmp_buffer, ++ tmp_buflen, errnop, herrnop, af, ++ flags)) ++ == NSS_STATUS_SUCCESS) ++ { ++ int matches = 1; ++ struct hostent *old_result = result; ++ result = &tmp_result_buf; ++ /* The following piece is a bit clumsy but we want to use the ++ `LOOKUP_NAME_CASE' value. The optimizer should do its ++ job. */ ++ do ++ { ++ LOOKUP_NAME_CASE (h_name, h_aliases) ++ result = old_result; ++ } ++ while ((matches = 0)); ++ ++ if (matches) ++ { ++ /* We could be very clever and try to recycle a few bytes ++ in the buffer instead of generating new arrays. But ++ we are not doing this here since it's more work than ++ it's worth. Simply let the user provide a bit bigger ++ buffer. */ ++ char **new_h_addr_list; ++ char **new_h_aliases; ++ int newaliases = 0; ++ size_t newstrlen = 0; ++ int cnt; ++ ++ /* Count the new aliases and the length of the strings. */ ++ while (tmp_result_buf.h_aliases[newaliases] != NULL) ++ { ++ char *cp = tmp_result_buf.h_aliases[newaliases]; ++ ++newaliases; ++ newstrlen += strlen (cp) + 1; ++ } ++ /* If the real name is different add it also to the ++ aliases. This means that there is a duplication ++ in the alias list but this is really the user's ++ problem. */ ++ if (strcmp (old_result->h_name, ++ tmp_result_buf.h_name) != 0) ++ { ++ ++newaliases; ++ newstrlen += strlen (tmp_result_buf.h_name) + 1; ++ } ++ ++ /* Make sure bufferend is aligned. */ ++ assert ((bufferend - (char *) 0) % sizeof (char *) == 0); ++ ++ /* Now we can check whether the buffer is large enough. ++ 16 is the maximal size of the IP address. */ ++ if (bufferend + 16 + (naddrs + 2) * sizeof (char *) ++ + roundup (newstrlen, sizeof (char *)) ++ + (naliases + newaliases + 1) * sizeof (char *) ++ >= buffer + buflen) ++ { ++ *errnop = ERANGE; ++ *herrnop = NETDB_INTERNAL; ++ status = NSS_STATUS_TRYAGAIN; ++ goto out; ++ } ++ ++ new_h_addr_list = ++ (char **) (bufferend ++ + roundup (newstrlen, sizeof (char *)) ++ + 16); ++ new_h_aliases = ++ (char **) ((char *) new_h_addr_list ++ + (naddrs + 2) * sizeof (char *)); ++ ++ /* Copy the old data in the new arrays. */ ++ for (cnt = 0; cnt < naddrs; ++cnt) ++ new_h_addr_list[cnt] = old_result->h_addr_list[cnt]; ++ ++ for (cnt = 0; cnt < naliases; ++cnt) ++ new_h_aliases[cnt] = old_result->h_aliases[cnt]; ++ ++ /* Store the new strings. */ ++ cnt = 0; ++ while (tmp_result_buf.h_aliases[cnt] != NULL) ++ { ++ new_h_aliases[naliases++] = bufferend; ++ bufferend = (__stpcpy (bufferend, ++ tmp_result_buf.h_aliases[cnt]) ++ + 1); ++ ++cnt; ++ } ++ ++ if (cnt < newaliases) ++ { ++ new_h_aliases[naliases++] = bufferend; ++ bufferend = __stpcpy (bufferend, ++ tmp_result_buf.h_name) + 1; ++ } ++ ++ /* Final NULL pointer. */ ++ new_h_aliases[naliases] = NULL; ++ ++ /* Round up the buffer end address. */ ++ bufferend += (sizeof (char *) ++ - ((bufferend - (char *) 0) ++ % sizeof (char *))) % sizeof (char *); ++ ++ /* Now the new address. */ ++ new_h_addr_list[naddrs++] = ++ memcpy (bufferend, tmp_result_buf.h_addr, ++ tmp_result_buf.h_length); ++ ++ /* Also here a final NULL pointer. */ ++ new_h_addr_list[naddrs] = NULL; ++ ++ /* Store the new array pointers. */ ++ old_result->h_aliases = new_h_aliases; ++ old_result->h_addr_list = new_h_addr_list; ++ ++ /* Compute the new buffer end. */ ++ bufferend = (char *) &new_h_aliases[naliases + 1]; ++ assert (bufferend <= buffer + buflen); ++ ++ result = old_result; ++ } ++ } ++ ++ if (status == NSS_STATUS_TRYAGAIN) ++ { ++ size_t newsize = 2 * tmp_buflen; ++ if (tmp_buffer_malloced) ++ { ++ char *newp = realloc (tmp_buffer, newsize); ++ if (newp != NULL) ++ { ++ assert ((((uintptr_t) newp) ++ & (__alignof__ (struct hostent_data) - 1)) ++ == 0); ++ tmp_buffer = newp; ++ tmp_buflen = newsize; ++ goto again; ++ } ++ } ++ else if (!__libc_use_alloca (buflen + newsize)) ++ { ++ tmp_buffer = malloc (newsize); ++ if (tmp_buffer != NULL) ++ { ++ assert ((((uintptr_t) tmp_buffer) ++ & (__alignof__ (struct hostent_data) - 1)) ++ == 0); ++ tmp_buffer_malloced = true; ++ tmp_buflen = newsize; ++ goto again; ++ } ++ } ++ else ++ { ++ tmp_buffer ++ = extend_alloca (tmp_buffer, tmp_buflen, ++ newsize ++ + __alignof__ (struct hostent_data)); ++ tmp_buffer = (char *) (((uintptr_t) tmp_buffer ++ + __alignof__ (struct hostent_data) ++ - 1) ++ & ~(__alignof__ (struct hostent_data) ++ - 1)); ++ goto again; ++ } ++ } ++ else ++ status = NSS_STATUS_SUCCESS; ++ out: ++ if (tmp_buffer_malloced) ++ free (tmp_buffer); ++ } ++ ++ if (! keep_stream) ++ internal_endent (); ++ } ++ ++ if (canonp && status == NSS_STATUS_SUCCESS) ++ *canonp = result->h_name; ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_files_gethostbyname_r (const char *name, struct hostent *result, ++ char *buffer, size_t buflen, int *errnop, ++ int *herrnop) ++{ ++ int af = ((_res.options & RES_USE_INET6) ? AF_INET6 : AF_INET); ++ ++ return _nss_files_gethostbyname3_r (name, af, result, buffer, buflen, ++ errnop, herrnop, NULL, NULL); ++} ++ ++enum nss_status ++_nss_files_gethostbyname2_r (const char *name, int af, struct hostent *result, ++ char *buffer, size_t buflen, int *errnop, ++ int *herrnop) ++{ ++ return _nss_files_gethostbyname3_r (name, af, result, buffer, buflen, ++ errnop, herrnop, NULL, NULL); ++} + + enum nss_status + _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, diff --git a/SOURCES/glibc-rh1048036.patch b/SOURCES/glibc-rh1048036.patch new file mode 100644 index 0000000..5d8836e --- /dev/null +++ b/SOURCES/glibc-rh1048036.patch @@ -0,0 +1,29 @@ +diff --git glibc-2.17-c758a686/libio/wfileops.c glibc-2.17-c758a686/libio/wfileops.c +index 87d3cdc..877fc1f 100644 +--- glibc-2.17-c758a686/libio/wfileops.c ++++ glibc-2.17-c758a686/libio/wfileops.c +@@ -715,7 +715,7 @@ _IO_wfile_seekoff (fp, offset, dir, mode) + - fp->_wide_data->_IO_write_base) / clen; + else + { +- enum __codecvt_result status; ++ enum __codecvt_result status = __codecvt_ok; + delta = (fp->_wide_data->_IO_write_ptr + - fp->_wide_data->_IO_write_base); + const wchar_t *write_base = fp->_wide_data->_IO_write_base; +@@ -728,9 +728,12 @@ _IO_wfile_seekoff (fp, offset, dir, mode) + flush buffers for every ftell. */ + do + { +- /* Ugh, no point trying to avoid the flush. Just do it +- and go back to how it was with the read mode. */ +- if (delta > 0 && new_write_ptr == fp->_IO_buf_end) ++ /* There is not enough space in the buffer to do the entire ++ conversion, so there is no point trying to avoid the ++ buffer flush. Just do it and go back to how it was with ++ the read mode. */ ++ if (status == __codecvt_partial ++ || (delta > 0 && new_write_ptr == fp->_IO_buf_end)) + { + if (_IO_switch_to_wget_mode (fp)) + return WEOF; diff --git a/SOURCES/glibc-rh1048123.patch b/SOURCES/glibc-rh1048123.patch new file mode 100644 index 0000000..a90ffaa --- /dev/null +++ b/SOURCES/glibc-rh1048123.patch @@ -0,0 +1,515 @@ +commit 0582f6b3d6fab2128ee43a06250571922ee7c1e3 +Author: Andreas Schwab <schwab@suse.de> +Date: Sun Dec 23 09:45:07 2012 +0100 + + nscd: don't fork twice + +commit 532a60357ef4c5852cc1bf836cfd9d6f093ef204 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Mon Mar 3 22:51:39 2014 +0530 + + nscd: Improved support for tracking startup failure in nscd service (BZ #16639) + + Currently, the nscd parent process parses commandline options and + configuration, forks on startup and immediately exits with a success. + If the child process encounters some error after this, it goes + undetected and any services started up after it may have to repeatedly + check to make sure that the nscd service did actually start up and is + serving requests. + + To make this process more reliable, I have added a pipe between the + parent and child process, through which the child process sends a + notification to the parent informing it of its status. The parent + waits for this status and once it receives it, exits with the + corresponding exit code. So if the child service sends a success + status (0), the parent exits with a success status. Similarly for + error conditions, the child sends the non-zero status code, which the + parent passes on as the exit code. + + This, along with setting the nscd service type to forking in its + systemd configuration file, allows systemd to be certain that the nscd + service is ready and is accepting connections. + + +diff --git glibc-2.17-c758a686/nscd/connections.c glibc-2.17-c758a686/nscd/connections.c +index f463f45..180ae77 100644 +--- glibc-2.17-c758a686/nscd/connections.c ++++ glibc-2.17-c758a686/nscd/connections.c +@@ -649,8 +649,8 @@ cannot create read-only descriptor for \"%s\"; no mmap"), + close (fd); + } + else if (errno == EACCES) +- error (EXIT_FAILURE, 0, _("cannot access '%s'"), +- dbs[cnt].db_filename); ++ do_exit (EXIT_FAILURE, 0, _("cannot access '%s'"), ++ dbs[cnt].db_filename); + } + + if (dbs[cnt].head == NULL) +@@ -699,8 +699,7 @@ cannot create read-only descriptor for \"%s\"; no mmap"), + { + dbg_log (_("database for %s corrupted or simultaneously used; remove %s manually if necessary and restart"), + dbnames[cnt], dbs[cnt].db_filename); +- // XXX Correct way to terminate? +- exit (1); ++ do_exit (1, 0, NULL); + } + + if (dbs[cnt].persistent) +@@ -867,7 +866,7 @@ cannot set socket to close on exec: %s; disabling paranoia mode"), + if (sock < 0) + { + dbg_log (_("cannot open socket: %s"), strerror (errno)); +- exit (errno == EACCES ? 4 : 1); ++ do_exit (errno == EACCES ? 4 : 1, 0, NULL); + } + /* Bind a name to the socket. */ + struct sockaddr_un sock_addr; +@@ -876,7 +875,7 @@ cannot set socket to close on exec: %s; disabling paranoia mode"), + if (bind (sock, (struct sockaddr *) &sock_addr, sizeof (sock_addr)) < 0) + { + dbg_log ("%s: %s", _PATH_NSCDSOCKET, strerror (errno)); +- exit (errno == EACCES ? 4 : 1); ++ do_exit (errno == EACCES ? 4 : 1, 0, NULL); + } + + #ifndef __ASSUME_SOCK_CLOEXEC +@@ -888,7 +887,7 @@ cannot set socket to close on exec: %s; disabling paranoia mode"), + { + dbg_log (_("cannot change socket to nonblocking mode: %s"), + strerror (errno)); +- exit (1); ++ do_exit (1, 0, NULL); + } + + /* The descriptor needs to be closed on exec. */ +@@ -896,7 +895,7 @@ cannot set socket to close on exec: %s; disabling paranoia mode"), + { + dbg_log (_("cannot set socket to close on exec: %s"), + strerror (errno)); +- exit (1); ++ do_exit (1, 0, NULL); + } + } + #endif +@@ -909,7 +908,7 @@ cannot set socket to close on exec: %s; disabling paranoia mode"), + { + dbg_log (_("cannot enable socket to accept connections: %s"), + strerror (errno)); +- exit (1); ++ do_exit (1, 0, NULL); + } + + #ifdef HAVE_NETLINK +@@ -953,7 +952,7 @@ cannot set socket to close on exec: %s; disabling paranoia mode"), + dbg_log (_("\ + cannot change socket to nonblocking mode: %s"), + strerror (errno)); +- exit (1); ++ do_exit (1, 0, NULL); + } + + /* The descriptor needs to be closed on exec. */ +@@ -962,7 +961,7 @@ cannot change socket to nonblocking mode: %s"), + { + dbg_log (_("cannot set socket to close on exec: %s"), + strerror (errno)); +- exit (1); ++ do_exit (1, 0, NULL); + } + } + # endif +@@ -2392,7 +2391,7 @@ start_threads (void) + if (pthread_cond_init (&dbs[i].prune_cond, &condattr) != 0) + { + dbg_log (_("could not initialize conditional variable")); +- exit (1); ++ do_exit (1, 0, NULL); + } + + pthread_t th; +@@ -2400,7 +2399,7 @@ start_threads (void) + && pthread_create (&th, &attr, nscd_run_prune, (void *) i) != 0) + { + dbg_log (_("could not start clean-up thread; terminating")); +- exit (1); ++ do_exit (1, 0, NULL); + } + } + +@@ -2414,13 +2413,17 @@ start_threads (void) + if (i == 0) + { + dbg_log (_("could not start any worker thread; terminating")); +- exit (1); ++ do_exit (1, 0, NULL); + } + + break; + } + } + ++ /* Now it is safe to let the parent know that we're doing fine and it can ++ exit. */ ++ notify_parent (0); ++ + /* Determine how much room for descriptors we should initially + allocate. This might need to change later if we cap the number + with MAXCONN. */ +@@ -2465,8 +2468,8 @@ begin_drop_privileges (void) + if (pwd == NULL) + { + dbg_log (_("Failed to run nscd as user '%s'"), server_user); +- error (EXIT_FAILURE, 0, _("Failed to run nscd as user '%s'"), +- server_user); ++ do_exit (EXIT_FAILURE, 0, ++ _("Failed to run nscd as user '%s'"), server_user); + } + + server_uid = pwd->pw_uid; +@@ -2483,7 +2486,8 @@ begin_drop_privileges (void) + { + /* This really must never happen. */ + dbg_log (_("Failed to run nscd as user '%s'"), server_user); +- error (EXIT_FAILURE, errno, _("initial getgrouplist failed")); ++ do_exit (EXIT_FAILURE, errno, ++ _("initial getgrouplist failed")); + } + + server_groups = (gid_t *) xmalloc (server_ngroups * sizeof (gid_t)); +@@ -2492,7 +2496,7 @@ begin_drop_privileges (void) + == -1) + { + dbg_log (_("Failed to run nscd as user '%s'"), server_user); +- error (EXIT_FAILURE, errno, _("getgrouplist failed")); ++ do_exit (EXIT_FAILURE, errno, _("getgrouplist failed")); + } + } + +@@ -2510,7 +2514,7 @@ finish_drop_privileges (void) + if (setgroups (server_ngroups, server_groups) == -1) + { + dbg_log (_("Failed to run nscd as user '%s'"), server_user); +- error (EXIT_FAILURE, errno, _("setgroups failed")); ++ do_exit (EXIT_FAILURE, errno, _("setgroups failed")); + } + + int res; +@@ -2521,8 +2525,7 @@ finish_drop_privileges (void) + if (res == -1) + { + dbg_log (_("Failed to run nscd as user '%s'"), server_user); +- perror ("setgid"); +- exit (4); ++ do_exit (4, errno, "setgid"); + } + + if (paranoia) +@@ -2532,8 +2535,7 @@ finish_drop_privileges (void) + if (res == -1) + { + dbg_log (_("Failed to run nscd as user '%s'"), server_user); +- perror ("setuid"); +- exit (4); ++ do_exit (4, errno, "setuid"); + } + + #if defined HAVE_LIBAUDIT && defined HAVE_LIBCAP +diff --git glibc-2.17-c758a686/nscd/nscd.c glibc-2.17-c758a686/nscd/nscd.c +index 63d9d83..5680378 100644 +--- glibc-2.17-c758a686/nscd/nscd.c ++++ glibc-2.17-c758a686/nscd/nscd.c +@@ -39,6 +39,8 @@ + #include <sys/stat.h> + #include <sys/uio.h> + #include <sys/un.h> ++#include <sys/wait.h> ++#include <stdarg.h> + + #include "dbg_log.h" + #include "nscd.h" +@@ -101,6 +103,7 @@ gid_t old_gid; + + static int check_pid (const char *file); + static int write_pid (const char *file); ++static int monitor_child (int fd); + + /* Name and version of program. */ + static void print_version (FILE *stream, struct argp_state *state); +@@ -142,6 +145,7 @@ static struct argp argp = + + /* True if only statistics are requested. */ + static bool get_stats; ++static int parent_fd = -1; + + int + main (int argc, char **argv) +@@ -196,11 +200,27 @@ main (int argc, char **argv) + /* Behave like a daemon. */ + if (run_mode == RUN_DAEMONIZE) + { ++ int fd[2]; ++ ++ if (pipe (fd) != 0) ++ error (EXIT_FAILURE, errno, ++ _("cannot create a pipe to talk to the child")); ++ + pid = fork (); + if (pid == -1) + error (EXIT_FAILURE, errno, _("cannot fork")); + if (pid != 0) +- exit (0); ++ { ++ /* The parent only reads from the child. */ ++ close (fd[1]); ++ exit (monitor_child (fd[0])); ++ } ++ else ++ { ++ /* The child only writes to the parent. */ ++ close (fd[0]); ++ parent_fd = fd[1]; ++ } + } + + int nullfd = open (_PATH_DEVNULL, O_RDWR); +@@ -242,7 +262,8 @@ main (int argc, char **argv) + char *endp; + long int fdn = strtol (dirent->d_name, &endp, 10); + +- if (*endp == '\0' && fdn != dfdn && fdn >= min_close_fd) ++ if (*endp == '\0' && fdn != dfdn && fdn >= min_close_fd ++ && fdn != parent_fd) + close ((int) fdn); + } + +@@ -250,22 +271,14 @@ main (int argc, char **argv) + } + else + for (i = min_close_fd; i < getdtablesize (); i++) +- close (i); ++ if (i != parent_fd) ++ close (i); + +- if (run_mode == RUN_DAEMONIZE) +- { +- pid = fork (); +- if (pid == -1) +- error (EXIT_FAILURE, errno, _("cannot fork")); +- if (pid != 0) +- exit (0); +- } +- + setsid (); + + if (chdir ("/") != 0) +- error (EXIT_FAILURE, errno, +- _("cannot change current working directory to \"/\"")); ++ do_exit (EXIT_FAILURE, errno, ++ _("cannot change current working directory to \"/\"")); + + openlog ("nscd", LOG_CONS | LOG_ODELAY, LOG_DAEMON); + +@@ -592,3 +614,79 @@ write_pid (const char *file) + + return result; + } ++ ++static int ++monitor_child (int fd) ++{ ++ int child_ret = 0; ++ int ret = read (fd, &child_ret, sizeof (child_ret)); ++ ++ /* The child terminated with an error, either via exit or some other abnormal ++ method, like a segfault. */ ++ if (ret <= 0 || child_ret != 0) ++ { ++ int err = wait (&child_ret); ++ ++ if (err < 0) ++ { ++ fprintf (stderr, _("wait failed")); ++ return 1; ++ } ++ ++ fprintf (stderr, _("child exited with status %d"), ++ WEXITSTATUS (child_ret)); ++ if (WIFSIGNALED (child_ret)) ++ fprintf (stderr, _(", terminated by signal %d.\n"), ++ WTERMSIG (child_ret)); ++ else ++ fprintf (stderr, ".\n"); ++ } ++ ++ /* We have the child status, so exit with that code. */ ++ close (fd); ++ ++ return child_ret; ++} ++ ++void ++do_exit (int child_ret, int errnum, const char *format, ...) ++{ ++ if (parent_fd != -1) ++ { ++ int ret = write (parent_fd, &child_ret, sizeof (child_ret)); ++ assert (ret == sizeof (child_ret)); ++ close (parent_fd); ++ } ++ ++ if (format != NULL) ++ { ++ /* Emulate error() since we don't have a va_list variant for it. */ ++ va_list argp; ++ ++ fflush (stdout); ++ ++ fprintf (stderr, "%s: ", program_invocation_name); ++ ++ va_start (argp, format); ++ vfprintf (stderr, format, argp); ++ va_end (argp); ++ ++ fprintf (stderr, ": %s\n", strerror (errnum)); ++ fflush (stderr); ++ } ++ ++ /* Finally, exit. */ ++ exit (child_ret); ++} ++ ++void ++notify_parent (int child_ret) ++{ ++ if (parent_fd == -1) ++ return; ++ ++ int ret = write (parent_fd, &child_ret, sizeof (child_ret)); ++ assert (ret == sizeof (child_ret)); ++ close (parent_fd); ++ parent_fd = -1; ++} +diff --git glibc-2.17-c758a686/nscd/nscd.h glibc-2.17-c758a686/nscd/nscd.h +index 972f462..529b3f5 100644 +--- glibc-2.17-c758a686/nscd/nscd.h ++++ glibc-2.17-c758a686/nscd/nscd.h +@@ -205,6 +205,8 @@ extern gid_t old_gid; + /* nscd.c */ + extern void termination_handler (int signum) __attribute__ ((__noreturn__)); + extern int nscd_open_socket (void); ++void notify_parent (int child_ret); ++void do_exit (int child_ret, int errnum, const char *format, ...); + + /* connections.c */ + extern void nscd_init (void); +diff --git glibc-2.17-c758a686/nscd/selinux.c glibc-2.17-c758a686/nscd/selinux.c +index e477254..46b0ea9 100644 +--- glibc-2.17-c758a686/nscd/selinux.c ++++ glibc-2.17-c758a686/nscd/selinux.c +@@ -179,7 +179,7 @@ preserve_capabilities (void) + if (prctl (PR_SET_KEEPCAPS, 1) == -1) + { + dbg_log (_("Failed to set keep-capabilities")); +- error (EXIT_FAILURE, errno, _("prctl(KEEPCAPS) failed")); ++ do_exit (EXIT_FAILURE, errno, _("prctl(KEEPCAPS) failed")); + /* NOTREACHED */ + } + +@@ -194,7 +194,7 @@ preserve_capabilities (void) + cap_free (tmp_caps); + + dbg_log (_("Failed to initialize drop of capabilities")); +- error (EXIT_FAILURE, 0, _("cap_init failed")); ++ do_exit (EXIT_FAILURE, 0, _("cap_init failed")); + } + + /* There is no reason why these should not work. */ +@@ -216,7 +216,7 @@ preserve_capabilities (void) + { + cap_free (new_caps); + dbg_log (_("Failed to drop capabilities")); +- error (EXIT_FAILURE, 0, _("cap_set_proc failed")); ++ do_exit (EXIT_FAILURE, 0, _("cap_set_proc failed")); + } + + return new_caps; +@@ -233,7 +233,7 @@ install_real_capabilities (cap_t new_caps) + { + cap_free (new_caps); + dbg_log (_("Failed to drop capabilities")); +- error (EXIT_FAILURE, 0, _("cap_set_proc failed")); ++ do_exit (EXIT_FAILURE, 0, _("cap_set_proc failed")); + /* NOTREACHED */ + } + +@@ -242,7 +242,7 @@ install_real_capabilities (cap_t new_caps) + if (prctl (PR_SET_KEEPCAPS, 0) == -1) + { + dbg_log (_("Failed to unset keep-capabilities")); +- error (EXIT_FAILURE, errno, _("prctl(KEEPCAPS) failed")); ++ do_exit (EXIT_FAILURE, errno, _("prctl(KEEPCAPS) failed")); + /* NOTREACHED */ + } + } +@@ -258,7 +258,7 @@ nscd_selinux_enabled (int *selinux_enabled) + if (*selinux_enabled < 0) + { + dbg_log (_("Failed to determine if kernel supports SELinux")); +- exit (EXIT_FAILURE); ++ do_exit (EXIT_FAILURE, 0, NULL); + } + } + +@@ -272,7 +272,7 @@ avc_create_thread (void (*run) (void)) + rc = + pthread_create (&avc_notify_thread, NULL, (void *(*) (void *)) run, NULL); + if (rc != 0) +- error (EXIT_FAILURE, rc, _("Failed to start AVC thread")); ++ do_exit (EXIT_FAILURE, rc, _("Failed to start AVC thread")); + + return &avc_notify_thread; + } +@@ -294,7 +294,7 @@ avc_alloc_lock (void) + + avc_mutex = malloc (sizeof (pthread_mutex_t)); + if (avc_mutex == NULL) +- error (EXIT_FAILURE, errno, _("Failed to create AVC lock")); ++ do_exit (EXIT_FAILURE, errno, _("Failed to create AVC lock")); + pthread_mutex_init (avc_mutex, NULL); + + return avc_mutex; +@@ -334,7 +334,7 @@ nscd_avc_init (void) + avc_entry_ref_init (&aeref); + + if (avc_init ("avc", NULL, &log_cb, &thread_cb, &lock_cb) < 0) +- error (EXIT_FAILURE, errno, _("Failed to start AVC")); ++ do_exit (EXIT_FAILURE, errno, _("Failed to start AVC")); + else + dbg_log (_("Access Vector Cache (AVC) started")); + #ifdef HAVE_LIBAUDIT +--- glibc-2.17-c758a686/releng/nscd.service 2012-11-06 03:03:19.000000000 +0530 ++++ glibc-2.17-c758a686/releng/nscd.service 2014-02-28 16:59:51.096630222 +0530 +@@ -1,10 +1,13 @@ ++# systemd service file for nscd ++ + [Unit] + Description=Name Service Cache Daemon + After=syslog.target + + [Service] ++Type=forking + EnvironmentFile=-/etc/sysconfig/nscd +-ExecStart=/usr/sbin/nscd --foreground $NSCD_OPTIONS ++ExecStart=/usr/sbin/nscd $NSCD_OPTIONS + ExecStop=/usr/sbin/nscd --shutdown + ExecReload=/usr/sbin/nscd -i passwd + ExecReload=/usr/sbin/nscd -i group +@@ -12,6 +14,7 @@ + ExecReload=/usr/sbin/nscd -i services + ExecReload=/usr/sbin/nscd -i netgroup + Restart=always ++PIDFile=/run/nscd/nscd.pid + + [Install] + WantedBy=multi-user.target diff --git a/SOURCES/glibc-rh1063681.patch b/SOURCES/glibc-rh1063681.patch new file mode 100644 index 0000000..c8ad2c2 --- /dev/null +++ b/SOURCES/glibc-rh1063681.patch @@ -0,0 +1,948 @@ +diff --git glibc-2.17-c758a686/libio/Makefile glibc-2.17-c758a686/libio/Makefile +index 22dbcae..488ee51 100644 +--- glibc-2.17-c758a686/libio/Makefile ++++ glibc-2.17-c758a686/libio/Makefile +@@ -60,7 +60,7 @@ tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc \ + tst-wmemstream1 tst-wmemstream2 \ + bug-memstream1 bug-wmemstream1 \ + tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos tst-fseek \ +- tst-fwrite-error ++ tst-fwrite-error tst-ftell-active-handler + ifeq (yes,$(build-shared)) + # Add test-fopenloc only if shared library is enabled since it depends on + # shared localedata objects. +diff --git glibc-2.17-c758a686/libio/fileops.c glibc-2.17-c758a686/libio/fileops.c +index a3499be..2e7bc8d 100644 +--- glibc-2.17-c758a686/libio/fileops.c ++++ glibc-2.17-c758a686/libio/fileops.c +@@ -929,6 +929,93 @@ _IO_file_sync_mmap (_IO_FILE *fp) + return 0; + } + ++/* Get the current file offset using a system call. This is the safest method ++ to get the current file offset, since we are sure that we get the current ++ state of the file. Before the stream handle is activated (by using fread, ++ fwrite, etc.), an application may alter the state of the file descriptor ++ underlying it by calling read/write/lseek on it. Using a cached offset at ++ this point will result in returning the incorrect value. Same is the case ++ when one switches from reading in a+ mode to writing, where the buffer has ++ not been flushed - the cached offset would reflect the reading position ++ while the actual write position would be at the end of the file. ++ ++ do_ftell and do_ftell_wide may resort to using the cached offset in some ++ special cases instead of calling get_file_offset, but those cases should be ++ thoroughly described. */ ++_IO_off64_t ++get_file_offset (_IO_FILE *fp) ++{ ++ if ((fp->_flags & _IO_IS_APPENDING) == _IO_IS_APPENDING) ++ { ++ struct stat64 st; ++ bool ret = (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode)); ++ if (ret) ++ return st.st_size; ++ else ++ return EOF; ++ } ++ else ++ return _IO_SYSSEEK (fp, 0, _IO_seek_cur); ++} ++ ++ ++/* ftell{,o} implementation. Don't modify any state of the file pointer while ++ we try to get the current state of the stream. */ ++static _IO_off64_t ++do_ftell (_IO_FILE *fp) ++{ ++ _IO_off64_t result = 0; ++ bool use_cached_offset = false; ++ ++ /* No point looking at unflushed data if we haven't allocated buffers ++ yet. */ ++ if (fp->_IO_buf_base != NULL) ++ { ++ bool was_writing = (fp->_IO_write_ptr > fp->_IO_write_base ++ || _IO_in_put_mode (fp)); ++ ++ /* Adjust for unflushed data. */ ++ if (!was_writing) ++ result -= fp->_IO_read_end - fp->_IO_read_ptr; ++ else ++ result += fp->_IO_write_ptr - fp->_IO_read_end; ++ ++ /* It is safe to use the cached offset when available if there is ++ unbuffered data (indicating that the file handle is active) and the ++ handle is not for a file open in a+ mode. The latter condition is ++ because there could be a scenario where there is a switch from read ++ mode to write mode using an fseek to an arbitrary position. In this ++ case, there would be unbuffered data due to be appended to the end of ++ the file, but the offset may not necessarily be the end of the ++ file. It is fine to use the cached offset when the a+ stream is in ++ read mode though, since the offset is maintained correctly in that ++ case. Note that this is not a comprehensive set of cases when the ++ offset is reliable. The offset may be reliable even in some cases ++ where there is no unflushed input and the handle is active, but it's ++ just that we don't have a way to identify that condition reliably. */ ++ use_cached_offset = (result != 0 && fp->_offset != _IO_pos_BAD ++ && ((fp->_flags & (_IO_IS_APPENDING | _IO_NO_READS)) ++ == (_IO_IS_APPENDING | _IO_NO_READS) ++ && was_writing)); ++ } ++ ++ if (use_cached_offset) ++ result += fp->_offset; ++ else ++ result += get_file_offset (fp); ++ ++ if (result == EOF) ++ return result; ++ ++ if (result < 0) ++ { ++ __set_errno (EINVAL); ++ return EOF; ++ } ++ ++ return result; ++} ++ + + _IO_off64_t + _IO_new_file_seekoff (fp, offset, dir, mode) +@@ -940,6 +1027,13 @@ _IO_new_file_seekoff (fp, offset, dir, mode) + _IO_off64_t result; + _IO_off64_t delta, new_offset; + long count; ++ ++ /* Short-circuit into a separate function. We don't want to mix any ++ functionality and we don't want to touch anything inside the FILE ++ object. */ ++ if (mode == 0) ++ return do_ftell (fp); ++ + /* POSIX.1 8.2.3.7 says that after a call the fflush() the file + offset of the underlying file must be exact. */ + int must_be_exact = (fp->_IO_read_base == fp->_IO_read_end +@@ -948,9 +1042,6 @@ _IO_new_file_seekoff (fp, offset, dir, mode) + bool was_writing = (fp->_IO_write_ptr > fp->_IO_write_base + || _IO_in_put_mode (fp)); + +- if (mode == 0) +- dir = _IO_seek_cur, offset = 0; /* Don't move any pointers. */ +- + /* Flush unwritten characters. + (This may do an unneeded write if we seek within the buffer. + But to be able to switch to reading, we would need to set +@@ -958,7 +1049,7 @@ _IO_new_file_seekoff (fp, offset, dir, mode) + which assumes file_ptr() is eGptr. Anyway, since we probably + end up flushing when we close(), it doesn't make much difference.) + FIXME: simulate mem-mapped files. */ +- else if (was_writing && _IO_switch_to_get_mode (fp)) ++ if (was_writing && _IO_switch_to_get_mode (fp)) + return EOF; + + if (fp->_IO_buf_base == NULL) +@@ -978,30 +1069,10 @@ _IO_new_file_seekoff (fp, offset, dir, mode) + { + case _IO_seek_cur: + /* Adjust for read-ahead (bytes is buffer). */ +- if (mode != 0 || !was_writing) +- offset -= fp->_IO_read_end - fp->_IO_read_ptr; +- else +- { +- /* _IO_read_end coincides with fp._offset, so the actual file position +- is fp._offset - (_IO_read_end - new_write_ptr). This is fine +- even if fp._offset is not set, since fp->_IO_read_end is then at +- _IO_buf_base and this adjustment is for unbuffered output. */ +- offset -= fp->_IO_read_end - fp->_IO_write_ptr; +- } ++ offset -= fp->_IO_read_end - fp->_IO_read_ptr; + + if (fp->_offset == _IO_pos_BAD) +- { +- if (mode != 0) +- goto dumb; +- else +- { +- result = _IO_SYSSEEK (fp, 0, dir); +- if (result == EOF) +- return result; +- +- fp->_offset = result; +- } +- } ++ goto dumb; + /* Make offset absolute, assuming current pointer is file_ptr(). */ + offset += fp->_offset; + if (offset < 0) +@@ -1028,10 +1099,6 @@ _IO_new_file_seekoff (fp, offset, dir, mode) + } + /* At this point, dir==_IO_seek_set. */ + +- /* If we are only interested in the current position we've found it now. */ +- if (mode == 0) +- return offset; +- + /* If destination is within current buffer, optimize: */ + if (fp->_offset != _IO_pos_BAD && fp->_IO_read_base != NULL + && !_IO_in_backup (fp)) +diff --git glibc-2.17-c758a686/libio/iofdopen.c glibc-2.17-c758a686/libio/iofdopen.c +index 066ff19..3f266f7 100644 +--- glibc-2.17-c758a686/libio/iofdopen.c ++++ glibc-2.17-c758a686/libio/iofdopen.c +@@ -141,9 +141,6 @@ _IO_new_fdopen (fd, mode) + #ifdef _IO_MTSAFE_IO + new_f->fp.file._lock = &new_f->lock; + #endif +- /* Set up initially to use the `maybe_mmap' jump tables rather than using +- __fopen_maybe_mmap to do it, because we need them in place before we +- call _IO_file_attach or else it will allocate a buffer immediately. */ + _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, + #ifdef _G_HAVE_MMAP + (use_mmap && (read_write & _IO_NO_WRITES)) +@@ -159,13 +156,12 @@ _IO_new_fdopen (fd, mode) + #if !_IO_UNIFIED_JUMPTABLES + new_f->fp.vtable = NULL; + #endif +- if (_IO_file_attach ((_IO_FILE *) &new_f->fp, fd) == NULL) +- { +- _IO_setb (&new_f->fp.file, NULL, NULL, 0); +- _IO_un_link (&new_f->fp); +- free (new_f); +- return NULL; +- } ++ /* We only need to record the fd because _IO_file_init will have unset the ++ offset. It is important to unset the cached offset because the real ++ offset in the file could change between now and when the handle is ++ activated and we would then mislead ftell into believing that we have a ++ valid offset. */ ++ new_f->fp.file._fileno = fd; + new_f->fp.file._flags &= ~_IO_DELETE_DONT_CLOSE; + + _IO_mask_flags (&new_f->fp.file, read_write, +diff --git glibc-2.17-c758a686/libio/iofwide.c glibc-2.17-c758a686/libio/iofwide.c +index 5cff632..64187e4 100644 +--- glibc-2.17-c758a686/libio/iofwide.c ++++ glibc-2.17-c758a686/libio/iofwide.c +@@ -199,12 +199,6 @@ _IO_fwide (fp, mode) + + /* From now on use the wide character callback functions. */ + ((struct _IO_FILE_plus *) fp)->vtable = fp->_wide_data->_wide_vtable; +- +- /* One last twist: we get the current stream position. The wide +- char streams have much more problems with not knowing the +- current position and so we should disable the optimization +- which allows the functions without knowing the position. */ +- fp->_offset = _IO_SYSSEEK (fp, 0, _IO_seek_cur); + } + + /* Set the mode now. */ +diff --git glibc-2.17-c758a686/libio/libioP.h glibc-2.17-c758a686/libio/libioP.h +index 4ca723c..8a7b85b 100644 +--- glibc-2.17-c758a686/libio/libioP.h ++++ glibc-2.17-c758a686/libio/libioP.h +@@ -397,6 +397,7 @@ extern void _IO_wdoallocbuf (_IO_FILE *) __THROW; + libc_hidden_proto (_IO_wdoallocbuf) + extern void _IO_unsave_wmarkers (_IO_FILE *) __THROW; + extern unsigned _IO_adjust_wcolumn (unsigned, const wchar_t *, int) __THROW; ++extern _IO_off64_t get_file_offset (_IO_FILE *fp); + + /* Marker-related function. */ + +diff --git glibc-2.17-c758a686/libio/tst-ftell-active-handler.c glibc-2.17-c758a686/libio/tst-ftell-active-handler.c +new file mode 100644 +index 0000000..175e904 +--- /dev/null ++++ glibc-2.17-c758a686/libio/tst-ftell-active-handler.c +@@ -0,0 +1,384 @@ ++/* Verify that ftell returns the correct value at various points before and ++ after the handler on which it is called becomes active. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <errno.h> ++#include <unistd.h> ++#include <fcntl.h> ++#include <locale.h> ++#include <wchar.h> ++ ++static int do_test (void); ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" ++ ++#define get_handles_fdopen(filename, fd, fp, fd_mode, mode) \ ++({ \ ++ int ret = 0; \ ++ (fd) = open ((filename), (fd_mode), 0); \ ++ if ((fd) == -1) \ ++ { \ ++ printf ("open failed: %m\n"); \ ++ ret = 1; \ ++ } \ ++ else \ ++ { \ ++ (fp) = fdopen ((fd), (mode)); \ ++ if ((fp) == NULL) \ ++ { \ ++ printf ("fdopen failed: %m\n"); \ ++ close (fd); \ ++ ret = 1; \ ++ } \ ++ } \ ++ ret; \ ++}) ++ ++#define get_handles_fopen(filename, fd, fp, mode) \ ++({ \ ++ int ret = 0; \ ++ (fp) = fopen ((filename), (mode)); \ ++ if ((fp) == NULL) \ ++ { \ ++ printf ("fopen failed: %m\n"); \ ++ ret = 1; \ ++ } \ ++ else \ ++ { \ ++ (fd) = fileno (fp); \ ++ if ((fd) == -1) \ ++ { \ ++ printf ("fileno failed: %m\n"); \ ++ ret = 1; \ ++ } \ ++ } \ ++ ret; \ ++}) ++ ++/* data points to either char_data or wide_data, depending on whether we're ++ testing regular file mode or wide mode respectively. Similarly, ++ fputs_func points to either fputs or fputws. data_len keeps track of the ++ length of the current data and file_len maintains the current file ++ length. */ ++static const void *data; ++static const char *char_data = "abcdef"; ++static const wchar_t *wide_data = L"abcdef"; ++static size_t data_len; ++static size_t file_len; ++ ++typedef int (*fputs_func_t) (const void *data, FILE *fp); ++fputs_func_t fputs_func; ++ ++/* Test that the value of ftell is not cached when the stream handle is not ++ active. */ ++static int ++do_ftell_test (const char *filename) ++{ ++ int ret = 0; ++ struct test ++ { ++ const char *mode; ++ int fd_mode; ++ size_t old_off; ++ size_t new_off; ++ } test_modes[] = { ++ /* In w, w+ and r+ modes, the file position should be at the ++ beginning of the file. After the write, the offset should be ++ updated to data_len. */ ++ {"w", O_WRONLY, 0, data_len}, ++ {"w+", O_RDWR, 0, data_len}, ++ {"r+", O_RDWR, 0, data_len}, ++ /* For 'a' and 'a+' modes, the initial file position should be the ++ current end of file. After the write, the offset has data_len ++ added to the old value. */ ++ {"a", O_WRONLY, data_len, 2 * data_len}, ++ {"a+", O_RDWR, 2 * data_len, 3 * data_len}, ++ }; ++ for (int j = 0; j < 2; j++) ++ { ++ for (int i = 0; i < sizeof (test_modes) / sizeof (struct test); i++) ++ { ++ FILE *fp; ++ int fd; ++ printf ("\tftell: %s (file, \"%s\"): ", j == 0 ? "fdopen" : "fopen", ++ test_modes[i].mode); ++ ++ if (j == 0) ++ ret = get_handles_fdopen (filename, fd, fp, test_modes[i].fd_mode, ++ test_modes[i].mode); ++ else ++ ret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ ++ if (ret != 0) ++ return ret; ++ ++ long off = ftell (fp); ++ if (off != test_modes[i].old_off) ++ { ++ printf ("Incorrect old offset. Expected %zu but got %ld, ", ++ test_modes[i].old_off, off); ++ ret |= 1; ++ } ++ else ++ printf ("old offset = %ld, ", off); ++ ++ /* The effect of this write on the offset should be seen in the ftell ++ call that follows it. */ ++ int ret = write (fd, data, data_len); ++ off = ftell (fp); ++ ++ if (off != test_modes[i].new_off) ++ { ++ printf ("Incorrect new offset. Expected %zu but got %ld\n", ++ test_modes[i].old_off, off); ++ ret |= 1; ++ } ++ else ++ printf ("new offset = %ld\n", off); ++ ++ fclose (fp); ++ } ++ } ++ ++ return ret; ++} ++ ++/* This test opens the file for writing, moves the file offset of the ++ underlying file, writes out data and then checks if ftell trips on it. */ ++static int ++do_write_test (const char *filename) ++{ ++ FILE *fp = NULL; ++ int fd; ++ int ret = 0; ++ struct test ++ { ++ const char *mode; ++ int fd_mode; ++ } test_modes[] = { ++ {"w", O_WRONLY}, ++ {"w+", O_RDWR}, ++ {"r+", O_RDWR} ++ }; ++ ++ for (int j = 0; j < 2; j++) ++ { ++ for (int i = 0; i < sizeof (test_modes) / sizeof (struct test); i++) ++ { ++ printf ("\twrite: %s (file, \"%s\"): ", j == 0 ? "fopen" : "fdopen", ++ test_modes[i].mode); ++ ++ if (j == 0) ++ ret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ else ++ ret = get_handles_fdopen (filename, fd, fp, test_modes[i].fd_mode, ++ test_modes[i].mode); ++ ++ if (ret != 0) ++ return ret; ++ ++ /* Move offset to just before the end of the file. */ ++ off_t ret = lseek (fd, file_len - 1, SEEK_SET); ++ if (ret == -1) ++ { ++ printf ("lseek failed: %m\n"); ++ ret |= 1; ++ } ++ ++ /* Write some data. */ ++ size_t written = fputs_func (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs[1] failed to write data\n"); ++ ret |= 1; ++ } ++ ++ /* Verify that the offset points to the end of the file. The length ++ of the file would be the original length + the length of data ++ written to it - the amount by which we moved the offset using ++ lseek. */ ++ long offset = ftell (fp); ++ file_len = file_len - 1 + data_len; ++ ++ if (offset != file_len) ++ { ++ printf ("Incorrect offset. Expected %zu, but got %ld\n", ++ file_len, offset); ++ ++ ret |= 1; ++ } ++ ++ printf ("offset = %ld\n", offset); ++ fclose (fp); ++ } ++ } ++ ++ return ret; ++} ++ ++/* This test opens a file in append mode, writes some data, and then verifies ++ that ftell does not trip over it. */ ++static int ++do_append_test (const char *filename) ++{ ++ FILE *fp = NULL; ++ int ret = 0; ++ int fd; ++ ++ struct test ++ { ++ const char *mode; ++ int fd_mode; ++ } test_modes[] = { ++ {"a", O_WRONLY}, ++ {"a+", O_RDWR} ++ }; ++ ++ for (int j = 0; j < 2; j++) ++ { ++ for (int i = 0; i < sizeof (test_modes) / sizeof (struct test); i++) ++ { ++ printf ("\tappend: %s (file, \"%s\"): ", j == 0 ? "fopen" : "fdopen", ++ test_modes[i].mode); ++ ++ if (j == 0) ++ ret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ else ++ ret = get_handles_fdopen (filename, fd, fp, test_modes[i].fd_mode, ++ test_modes[i].mode); ++ ++ if (ret != 0) ++ return ret; ++ ++ /* Write some data. */ ++ size_t written = fputs_func (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs[1] failed to write all data\n"); ++ ret |= 1; ++ } ++ ++ /* Verify that the offset points to the end of the file. The file ++ len is maintained by adding data_len each time to reflect the data ++ written to it. */ ++ long offset = ftell (fp); ++ file_len += data_len; ++ ++ if (offset != file_len) ++ { ++ printf ("Incorrect offset. Expected %zu, but got %ld\n", ++ file_len, offset); ++ ++ ret |= 1; ++ } ++ ++ printf ("offset = %ld\n", offset); ++ fclose (fp); ++ } ++ } ++ ++ return ret; ++} ++ ++static int ++do_one_test (const char *filename) ++{ ++ int ret = 0; ++ ++ ret |= do_ftell_test (filename); ++ ret |= do_write_test (filename); ++ ret |= do_append_test (filename); ++ ++ return ret; ++} ++ ++/* Run a set of tests for ftell for regular files and wide mode files. */ ++static int ++do_test (void) ++{ ++ int ret = 0; ++ FILE *fp = NULL; ++ char *filename; ++ size_t written; ++ int fd = create_temp_file ("tst-active-handler-tmp.", &filename); ++ ++ if (fd == -1) ++ { ++ printf ("create_temp_file: %m\n"); ++ return 1; ++ } ++ ++ fp = fdopen (fd, "w"); ++ if (fp == NULL) ++ { ++ printf ("fdopen[0]: %m\n"); ++ close (fd); ++ return 1; ++ } ++ ++ data = char_data; ++ data_len = strlen (char_data); ++ file_len = strlen (char_data); ++ written = fputs (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs[1] failed to write data\n"); ++ ret = 1; ++ } ++ ++ fclose (fp); ++ if (ret) ++ return ret; ++ ++ /* Tests for regular files. */ ++ puts ("Regular mode:"); ++ fputs_func = (fputs_func_t) fputs; ++ data = char_data; ++ data_len = strlen (char_data); ++ ret |= do_one_test (filename); ++ ++ /* Truncate the file before repeating the tests in wide mode. */ ++ fp = fopen (filename, "w"); ++ if (fp == NULL) ++ { ++ printf ("fopen failed %m\n"); ++ return 1; ++ } ++ fclose (fp); ++ ++ /* Tests for wide files. */ ++ puts ("Wide mode:"); ++ if (setlocale (LC_ALL, "en_US.UTF-8") == NULL) ++ { ++ printf ("Cannot set en_US.UTF-8 locale.\n"); ++ return 1; ++ } ++ fputs_func = (fputs_func_t) fputws; ++ data = wide_data; ++ data_len = wcslen (wide_data); ++ ret |= do_one_test (filename); ++ ++ return ret; ++} +diff --git glibc-2.17-c758a686/libio/wfileops.c glibc-2.17-c758a686/libio/wfileops.c +index 9cebe77..8b2e108 100644 +--- glibc-2.17-c758a686/libio/wfileops.c ++++ glibc-2.17-c758a686/libio/wfileops.c +@@ -596,29 +596,25 @@ done: + return 0; + } + +-_IO_off64_t +-_IO_wfile_seekoff (fp, offset, dir, mode) +- _IO_FILE *fp; +- _IO_off64_t offset; +- int dir; +- int mode; ++/* ftell{,o} implementation for wide mode. Don't modify any state of the file ++ pointer while we try to get the current state of the stream. */ ++static _IO_off64_t ++do_ftell_wide (_IO_FILE *fp) + { +- _IO_off64_t result; +- _IO_off64_t delta, new_offset; +- long int count; +- /* POSIX.1 8.2.3.7 says that after a call the fflush() the file +- offset of the underlying file must be exact. */ +- int must_be_exact = ((fp->_wide_data->_IO_read_base +- == fp->_wide_data->_IO_read_end) +- && (fp->_wide_data->_IO_write_base +- == fp->_wide_data->_IO_write_ptr)); ++ _IO_off64_t result, offset = 0; ++ bool use_cached_offset = false; + +- bool was_writing = ((fp->_wide_data->_IO_write_ptr +- > fp->_wide_data->_IO_write_base) +- || _IO_in_put_mode (fp)); +- +- if (mode == 0) ++ /* No point looking for offsets in the buffer if it hasn't even been ++ allocated. */ ++ if (fp->_wide_data->_IO_buf_base != NULL) + { ++ const wchar_t *wide_read_base; ++ const wchar_t *wide_read_ptr; ++ const wchar_t *wide_read_end; ++ bool was_writing = ((fp->_wide_data->_IO_write_ptr ++ > fp->_wide_data->_IO_write_base) ++ || _IO_in_put_mode (fp)); ++ + /* XXX For wide stream with backup store it is not very + reasonable to determine the offset. The pushed-back + character might require a state change and we need not be +@@ -633,14 +629,142 @@ _IO_wfile_seekoff (fp, offset, dir, mode) + return -1; + } + +- /* There is no more data in the backup buffer. We can +- switch back. */ +- _IO_switch_to_main_wget_area (fp); ++ /* Nothing in the backup store, so note the backed up pointers ++ without changing the state. */ ++ wide_read_base = fp->_wide_data->_IO_save_base; ++ wide_read_ptr = wide_read_base; ++ wide_read_end = fp->_wide_data->_IO_save_end; ++ } ++ else ++ { ++ wide_read_base = fp->_wide_data->_IO_read_base; ++ wide_read_ptr = fp->_wide_data->_IO_read_ptr; ++ wide_read_end = fp->_wide_data->_IO_read_end; ++ } ++ ++ struct _IO_codecvt *cv = fp->_codecvt; ++ int clen = (*cv->__codecvt_do_encoding) (cv); ++ ++ if (!was_writing) ++ { ++ if (clen > 0) ++ { ++ offset -= (wide_read_end - wide_read_ptr) * clen; ++ offset -= fp->_IO_read_end - fp->_IO_read_ptr; ++ } ++ else ++ { ++ int nread; ++ ++ size_t delta = wide_read_ptr - wide_read_base; ++ __mbstate_t state = fp->_wide_data->_IO_last_state; ++ nread = (*cv->__codecvt_do_length) (cv, &state, ++ fp->_IO_read_base, ++ fp->_IO_read_end, delta); ++ offset -= fp->_IO_read_end - fp->_IO_read_base - nread; ++ } ++ } ++ else ++ { ++ if (clen > 0) ++ offset += (fp->_wide_data->_IO_write_ptr ++ - fp->_wide_data->_IO_write_base) * clen; ++ else ++ { ++ size_t delta = (fp->_wide_data->_IO_write_ptr ++ - fp->_wide_data->_IO_write_base); ++ ++ /* Allocate enough space for the conversion. */ ++ size_t outsize = delta * sizeof (wchar_t); ++ char *out = malloc (outsize); ++ char *outstop = out; ++ const wchar_t *in = fp->_wide_data->_IO_write_base; ++ ++ enum __codecvt_result status; ++ ++ __mbstate_t state = fp->_wide_data->_IO_last_state; ++ status = (*cv->__codecvt_do_out) (cv, &state, ++ in, in + delta, &in, ++ out, out + outsize, &outstop); ++ ++ /* We don't check for __codecvt_partial because it can be ++ returned on one of two conditions: either the output ++ buffer is full or the input sequence is incomplete. We ++ take care to allocate enough buffer and our input ++ sequences must be complete since they are accepted as ++ wchar_t; if not, then that is an error. */ ++ if (__glibc_unlikely (status != __codecvt_ok)) ++ return WEOF; ++ ++ offset += outstop - out; ++ } ++ ++ /* _IO_read_end coincides with fp._offset, so the actual file ++ position is fp._offset - (_IO_read_end - new_write_ptr). */ ++ offset -= fp->_IO_read_end - fp->_IO_write_ptr; + } + +- dir = _IO_seek_cur, offset = 0; /* Don't move any pointers. */ ++ /* It is safe to use the cached offset when available if there is ++ unbuffered data (indicating that the file handle is active) and ++ the handle is not for a file open in a+ mode. The latter ++ condition is because there could be a scenario where there is a ++ switch from read mode to write mode using an fseek to an arbitrary ++ position. In this case, there would be unbuffered data due to be ++ appended to the end of the file, but the offset may not ++ necessarily be the end of the file. It is fine to use the cached ++ offset when the a+ stream is in read mode though, since the offset ++ is maintained correctly in that case. Note that this is not a ++ comprehensive set of cases when the offset is reliable. The ++ offset may be reliable even in some cases where there is no ++ unflushed input and the handle is active, but it's just that we ++ don't have a way to identify that condition reliably. */ ++ use_cached_offset = (offset != 0 && fp->_offset != _IO_pos_BAD ++ && ((fp->_flags & (_IO_IS_APPENDING | _IO_NO_READS)) ++ == (_IO_IS_APPENDING | _IO_NO_READS) ++ && was_writing)); + } + ++ if (use_cached_offset) ++ result = fp->_offset; ++ else ++ result = get_file_offset (fp); ++ ++ if (result == EOF) ++ return result; ++ ++ result += offset; ++ ++ return result; ++} ++ ++_IO_off64_t ++_IO_wfile_seekoff (fp, offset, dir, mode) ++ _IO_FILE *fp; ++ _IO_off64_t offset; ++ int dir; ++ int mode; ++{ ++ _IO_off64_t result; ++ _IO_off64_t delta, new_offset; ++ long int count; ++ ++ /* Short-circuit into a separate function. We don't want to mix any ++ functionality and we don't want to touch anything inside the FILE ++ object. */ ++ if (mode == 0) ++ return do_ftell_wide (fp); ++ ++ /* POSIX.1 8.2.3.7 says that after a call the fflush() the file ++ offset of the underlying file must be exact. */ ++ int must_be_exact = ((fp->_wide_data->_IO_read_base ++ == fp->_wide_data->_IO_read_end) ++ && (fp->_wide_data->_IO_write_base ++ == fp->_wide_data->_IO_write_ptr)); ++ ++ bool was_writing = ((fp->_wide_data->_IO_write_ptr ++ > fp->_wide_data->_IO_write_base) ++ || _IO_in_put_mode (fp)); ++ + /* Flush unwritten characters. + (This may do an unneeded write if we seek within the buffer. + But to be able to switch to reading, we would need to set +@@ -648,7 +772,7 @@ _IO_wfile_seekoff (fp, offset, dir, mode) + which assumes file_ptr() is eGptr. Anyway, since we probably + end up flushing when we close(), it doesn't make much difference.) + FIXME: simulate mem-mapped files. */ +- else if (was_writing && _IO_switch_to_wget_mode (fp)) ++ if (was_writing && _IO_switch_to_wget_mode (fp)) + return WEOF; + + if (fp->_wide_data->_IO_buf_base == NULL) +@@ -693,7 +817,6 @@ _IO_wfile_seekoff (fp, offset, dir, mode) + { + int nread; + +- flushed: + delta = (fp->_wide_data->_IO_read_ptr + - fp->_wide_data->_IO_read_base); + fp->_wide_data->_IO_state = fp->_wide_data->_IO_last_state; +@@ -706,80 +829,9 @@ _IO_wfile_seekoff (fp, offset, dir, mode) + offset -= fp->_IO_read_end - fp->_IO_read_base - nread; + } + } +- else +- { +- char *new_write_ptr = fp->_IO_write_ptr; +- +- if (clen > 0) +- offset += (fp->_wide_data->_IO_write_ptr +- - fp->_wide_data->_IO_write_base) / clen; +- else +- { +- enum __codecvt_result status = __codecvt_ok; +- delta = (fp->_wide_data->_IO_write_ptr +- - fp->_wide_data->_IO_write_base); +- const wchar_t *write_base = fp->_wide_data->_IO_write_base; +- +- /* FIXME: This actually ends up in two iterations of conversion, +- one here and the next when the buffer actually gets flushed. +- It may be possible to optimize this in future so that +- wdo_write identifies already converted content and does not +- redo it. In any case, this is much better than having to +- flush buffers for every ftell. */ +- do +- { +- /* There is not enough space in the buffer to do the entire +- conversion, so there is no point trying to avoid the +- buffer flush. Just do it and go back to how it was with +- the read mode. */ +- if (status == __codecvt_partial +- || (delta > 0 && new_write_ptr == fp->_IO_buf_end)) +- { +- if (_IO_switch_to_wget_mode (fp)) +- return WEOF; +- goto flushed; +- } +- +- const wchar_t *new_wbase = fp->_wide_data->_IO_write_base; +- fp->_wide_data->_IO_state = fp->_wide_data->_IO_last_state; +- status = (*cv->__codecvt_do_out) (cv, +- &fp->_wide_data->_IO_state, +- write_base, +- write_base + delta, +- &new_wbase, +- new_write_ptr, +- fp->_IO_buf_end, +- &new_write_ptr); +- +- delta -= new_wbase - write_base; +- +- /* If there was an error, then return WEOF. +- TODO: set buffer state. */ +- if (__builtin_expect (status == __codecvt_error, 0)) +- return WEOF; +- } +- while (delta > 0); +- } +- +- /* _IO_read_end coincides with fp._offset, so the actual file position +- is fp._offset - (_IO_read_end - new_write_ptr). This is fine +- even if fp._offset is not set, since fp->_IO_read_end is then at +- _IO_buf_base and this adjustment is for unbuffered output. */ +- offset -= fp->_IO_read_end - new_write_ptr; +- } + + if (fp->_offset == _IO_pos_BAD) +- { +- if (mode != 0) +- goto dumb; +- else +- { +- result = _IO_SYSSEEK (fp, 0, dir); +- if (result == EOF) +- return result; +- fp->_offset = result; +- } +- } ++ goto dumb; + + /* Make offset absolute, assuming current pointer is file_ptr(). */ + offset += fp->_offset; +@@ -802,10 +854,6 @@ _IO_wfile_seekoff (fp, offset, dir, mode) + } + /* At this point, dir==_IO_seek_set. */ + +- /* If we are only interested in the current position we've found it now. */ +- if (mode == 0) +- return offset; +- + /* If destination is within current buffer, optimize: */ + if (fp->_offset != _IO_pos_BAD && fp->_IO_read_base != NULL + && !_IO_in_backup (fp)) 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 <murphyp@linux.vnet.ibm.com> +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 <msebor@redhat.com> + + [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-rh1064066.patch b/SOURCES/glibc-rh1064066.patch new file mode 100644 index 0000000..bdac2bb --- /dev/null +++ b/SOURCES/glibc-rh1064066.patch @@ -0,0 +1,32 @@ +--- /var/lib/mock/glibc-2.17-79.el7/root/builddir/build/BUILD/glibc-2.17-c758a686/math/libm-test.inc 2015-04-06 17:36:33.268209956 -0400 ++++ glibc-2.17-c758a686/math/libm-test.inc 2015-04-07 12:00:03.102360299 -0400 +@@ -521,7 +521,8 @@ + } + + +-static void __attribute__ ((noinline)) ++/* Attributes work around suspected gcc 4.8 bug #1209619. */ ++static void __attribute__ ((noclone, noinline)) + check_float_internal (const char *test_name, FLOAT computed, FLOAT expected, + FLOAT max_ulp, int xfail, int exceptions, + FLOAT *curr_max_error) +@@ -610,7 +611,8 @@ + } + + +-static void __attribute__ ((noinline)) ++/* Attributes work around suspected gcc 4.8 bug #1209619. */ ++static void __attribute__ ((noclone, noinline)) + check_float (const char *test_name, FLOAT computed, FLOAT expected, + FLOAT max_ulp, int xfail, int exceptions) + { +@@ -619,7 +621,8 @@ + } + + +-static void __attribute__ ((noinline)) ++/* Attributes work around suspected gcc 4.8 bug #1209619. */ ++static void __attribute__ ((noclone, noinline)) + check_complex (const char *test_name, __complex__ FLOAT computed, + __complex__ FLOAT expected, + __complex__ FLOAT max_ulp, __complex__ int xfail, diff --git a/SOURCES/glibc-rh1064945.patch b/SOURCES/glibc-rh1064945.patch new file mode 100644 index 0000000..69a5b2a --- /dev/null +++ b/SOURCES/glibc-rh1064945.patch @@ -0,0 +1,78 @@ +commit 736c304a1ab4cee36a2f3343f1698bc0abae4608 +Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> +Date: Thu Jan 16 06:53:18 2014 -0600 + + PowerPC: Fix ftime gettimeofday internal call returning bogus data + + This patches fixes BZ#16430 by setting a different symbol for internal + GLIBC calls that points to ifunc resolvers. For PPC32, if the symbol + is defined as hidden (which is the case for gettimeofday and time) the + compiler will create local branches (symbol@local) and linker will not + create PLT calls (required for IFUNC). This will leads to internal symbol + calling the IFUNC resolver instead of the resolved symbol. + For PPC64 this behavior does not occur because a call to a function in + another translation unit might use a different toc pointer thus requiring + a PLT call. + +diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +index 29a5e08..2085b68 100644 +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +@@ -44,8 +44,24 @@ asm (".type __gettimeofday, %gnu_indirect_function"); + /* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't + let us do it in C because it doesn't know we're defining __gettimeofday + here in this file. */ +-asm (".globl __GI___gettimeofday\n" +- "__GI___gettimeofday = __gettimeofday"); ++asm (".globl __GI___gettimeofday"); ++ ++/* __GI___gettimeofday is defined as hidden and for ppc32 it enables the ++ compiler make a local call (symbol@local) for internal GLIBC usage. It ++ means the PLT won't be used and the ifunc resolver will be called directly. ++ For ppc64 a call to a function in another translation unit might use a ++ different toc pointer thus disallowing direct branchess and making internal ++ ifuncs calls safe. */ ++#ifdef __powerpc64__ ++asm ("__GI___gettimeofday = __gettimeofday"); ++#else ++int ++__gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz) ++{ ++ return INLINE_VSYSCALL (gettimeofday, 2, tv, tz); ++} ++asm ("__GI___gettimeofday = __gettimeofday_vsyscall"); ++#endif + + #else + +diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c +index 089d0b6..023bc02 100644 +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c +@@ -54,8 +54,24 @@ asm (".type time, %gnu_indirect_function"); + /* This is doing "libc_hidden_def (time)" but the compiler won't + * let us do it in C because it doesn't know we're defining time + * here in this file. */ +-asm (".globl __GI_time\n" +- "__GI_time = time"); ++asm (".globl __GI_time"); ++ ++/* __GI_time is defined as hidden and for ppc32 it enables the ++ compiler make a local call (symbol@local) for internal GLIBC usage. It ++ means the PLT won't be used and the ifunc resolver will be called directly. ++ For ppc64 a call to a function in another translation unit might use a ++ different toc pointer thus disallowing direct branchess and making internal ++ ifuncs calls safe. */ ++#ifdef __powerpc64__ ++asm ("__GI_time = time"); ++#else ++time_t ++__time_vsyscall (time_t *t) ++{ ++ return INLINE_VSYSCALL (time, 1, t); ++} ++asm ("__GI_time = __time_vsyscall"); ++#endif + + #else + diff --git a/SOURCES/glibc-rh1065574-1.patch b/SOURCES/glibc-rh1065574-1.patch new file mode 100644 index 0000000..99b157e --- /dev/null +++ b/SOURCES/glibc-rh1065574-1.patch @@ -0,0 +1,38 @@ +commit 8b35e35d0f4eae28a47c23e2aa15ddf570fa86ef +Author: Ondřej Bílka <neleai@seznam.cz> +Date: Fri Nov 1 15:39:26 2013 +0100 + + Fix malloc_info statistic. Fixes bug 16112 + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index b47d99ac65344c82..c98b3f79ed38b4f0 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -5068,23 +5068,11 @@ malloc_info (int options, FILE *fp) + sizes[i].total = sizes[i].count * sizes[i].to; + } + +- mbinptr bin = bin_at (ar_ptr, 1); +- struct malloc_chunk *r = bin->fd; +- if (r != NULL) +- { +- while (r != bin) +- { +- ++sizes[NFASTBINS].count; +- sizes[NFASTBINS].total += r->size; +- sizes[NFASTBINS].from = MIN (sizes[NFASTBINS].from, r->size); +- sizes[NFASTBINS].to = MAX (sizes[NFASTBINS].to, r->size); +- r = r->fd; +- } +- nblocks += sizes[NFASTBINS].count; +- avail += sizes[NFASTBINS].total; +- } + +- for (size_t i = 2; i < NBINS; ++i) ++ mbinptr bin; ++ struct malloc_chunk *r; ++ ++ for (size_t i = 1; i < NBINS; ++i) + { + bin = bin_at (ar_ptr, i); + r = bin->fd; diff --git a/SOURCES/glibc-rh1065574-2.patch b/SOURCES/glibc-rh1065574-2.patch new file mode 100644 index 0000000..77d6b50 --- /dev/null +++ b/SOURCES/glibc-rh1065574-2.patch @@ -0,0 +1,236 @@ +This is a partial recreation of this upstream commit, restricted to +the malloc_info function: + +commit 6c8dbf00f536d78b1937b5af6f57be47fd376344 +Author: Ondřej Bílka <neleai@seznam.cz> +Date: Thu Jan 2 09:38:18 2014 +0100 + + Reformat malloc to gnu style. + +It is not an exact copy because glibc-rh1103856.patch backported +commit 4d653a59ffeae0f46f76a40230e2cfa9587b7e7e ("Add mmap usage in +malloc_info output"), which came after the reformatting upstream. + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index c98b3f79ed38b4f0..5c7a27129d66e06a 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -5023,7 +5023,8 @@ malloc_info (int options, FILE *fp) + size_t total_aspace = 0; + size_t total_aspace_mprotect = 0; + +- void mi_arena (mstate ar_ptr) ++ void ++ mi_arena (mstate ar_ptr) + { + fprintf (fp, "<heap nr=\"%d\">\n<sizes>\n", n++); + +@@ -5044,28 +5045,28 @@ malloc_info (int options, FILE *fp) + + for (size_t i = 0; i < NFASTBINS; ++i) + { +- mchunkptr p = fastbin (ar_ptr, i); +- if (p != NULL) +- { +- size_t nthissize = 0; +- size_t thissize = chunksize (p); +- +- while (p != NULL) +- { +- ++nthissize; +- p = p->fd; +- } +- +- fastavail += nthissize * thissize; +- nfastblocks += nthissize; +- sizes[i].from = thissize - (MALLOC_ALIGNMENT - 1); +- sizes[i].to = thissize; +- sizes[i].count = nthissize; +- } +- else +- sizes[i].from = sizes[i].to = sizes[i].count = 0; +- +- sizes[i].total = sizes[i].count * sizes[i].to; ++ mchunkptr p = fastbin (ar_ptr, i); ++ if (p != NULL) ++ { ++ size_t nthissize = 0; ++ size_t thissize = chunksize (p); ++ ++ while (p != NULL) ++ { ++ ++nthissize; ++ p = p->fd; ++ } ++ ++ fastavail += nthissize * thissize; ++ nfastblocks += nthissize; ++ sizes[i].from = thissize - (MALLOC_ALIGNMENT - 1); ++ sizes[i].to = thissize; ++ sizes[i].count = nthissize; ++ } ++ else ++ sizes[i].from = sizes[i].to = sizes[i].count = 0; ++ ++ sizes[i].total = sizes[i].count * sizes[i].to; + } + + +@@ -5074,29 +5075,29 @@ malloc_info (int options, FILE *fp) + + for (size_t i = 1; i < NBINS; ++i) + { +- bin = bin_at (ar_ptr, i); +- r = bin->fd; +- sizes[NFASTBINS - 1 + i].from = ~((size_t) 0); +- sizes[NFASTBINS - 1 + i].to = sizes[NFASTBINS - 1 + i].total +- = sizes[NFASTBINS - 1 + i].count = 0; +- +- if (r != NULL) +- while (r != bin) +- { +- ++sizes[NFASTBINS - 1 + i].count; +- sizes[NFASTBINS - 1 + i].total += r->size; +- sizes[NFASTBINS - 1 + i].from +- = MIN (sizes[NFASTBINS - 1 + i].from, r->size); +- sizes[NFASTBINS - 1 + i].to = MAX (sizes[NFASTBINS - 1 + i].to, +- r->size); +- +- r = r->fd; +- } +- +- if (sizes[NFASTBINS - 1 + i].count == 0) +- sizes[NFASTBINS - 1 + i].from = 0; +- nblocks += sizes[NFASTBINS - 1 + i].count; +- avail += sizes[NFASTBINS - 1 + i].total; ++ bin = bin_at (ar_ptr, i); ++ r = bin->fd; ++ sizes[NFASTBINS - 1 + i].from = ~((size_t) 0); ++ sizes[NFASTBINS - 1 + i].to = sizes[NFASTBINS - 1 + i].total ++ = sizes[NFASTBINS - 1 + i].count = 0; ++ ++ if (r != NULL) ++ while (r != bin) ++ { ++ ++sizes[NFASTBINS - 1 + i].count; ++ sizes[NFASTBINS - 1 + i].total += r->size; ++ sizes[NFASTBINS - 1 + i].from ++ = MIN (sizes[NFASTBINS - 1 + i].from, r->size); ++ sizes[NFASTBINS - 1 + i].to = MAX (sizes[NFASTBINS - 1 + i].to, ++ r->size); ++ ++ r = r->fd; ++ } ++ ++ if (sizes[NFASTBINS - 1 + i].count == 0) ++ sizes[NFASTBINS - 1 + i].from = 0; ++ nblocks += sizes[NFASTBINS - 1 + i].count; ++ avail += sizes[NFASTBINS - 1 + i].total; + } + + mutex_unlock (&ar_ptr->mutex); +@@ -5109,51 +5110,51 @@ malloc_info (int options, FILE *fp) + + for (size_t i = 0; i < nsizes; ++i) + if (sizes[i].count != 0 && i != NFASTBINS) +- fprintf (fp, "\ ++ fprintf (fp, " \ + <size from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n", +- sizes[i].from, sizes[i].to, sizes[i].total, sizes[i].count); ++ sizes[i].from, sizes[i].to, sizes[i].total, sizes[i].count); + + if (sizes[NFASTBINS].count != 0) + fprintf (fp, "\ + <unsorted from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n", +- sizes[NFASTBINS].from, sizes[NFASTBINS].to, +- sizes[NFASTBINS].total, sizes[NFASTBINS].count); ++ sizes[NFASTBINS].from, sizes[NFASTBINS].to, ++ sizes[NFASTBINS].total, sizes[NFASTBINS].count); + + total_system += ar_ptr->system_mem; + total_max_system += ar_ptr->max_system_mem; + + fprintf (fp, +- "</sizes>\n<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n" +- "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n" +- "<system type=\"current\" size=\"%zu\"/>\n" +- "<system type=\"max\" size=\"%zu\"/>\n", +- nfastblocks, fastavail, nblocks, avail, +- ar_ptr->system_mem, ar_ptr->max_system_mem); ++ "</sizes>\n<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n" ++ "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n" ++ "<system type=\"current\" size=\"%zu\"/>\n" ++ "<system type=\"max\" size=\"%zu\"/>\n", ++ nfastblocks, fastavail, nblocks, avail, ++ ar_ptr->system_mem, ar_ptr->max_system_mem); + + if (ar_ptr != &main_arena) + { +- heap_info *heap = heap_for_ptr(top(ar_ptr)); +- fprintf (fp, +- "<aspace type=\"total\" size=\"%zu\"/>\n" +- "<aspace type=\"mprotect\" size=\"%zu\"/>\n", +- heap->size, heap->mprotect_size); +- total_aspace += heap->size; +- total_aspace_mprotect += heap->mprotect_size; ++ heap_info *heap = heap_for_ptr (top (ar_ptr)); ++ fprintf (fp, ++ "<aspace type=\"total\" size=\"%zu\"/>\n" ++ "<aspace type=\"mprotect\" size=\"%zu\"/>\n", ++ heap->size, heap->mprotect_size); ++ total_aspace += heap->size; ++ total_aspace_mprotect += heap->mprotect_size; + } + else + { +- fprintf (fp, +- "<aspace type=\"total\" size=\"%zu\"/>\n" +- "<aspace type=\"mprotect\" size=\"%zu\"/>\n", +- ar_ptr->system_mem, ar_ptr->system_mem); +- total_aspace += ar_ptr->system_mem; +- total_aspace_mprotect += ar_ptr->system_mem; ++ fprintf (fp, ++ "<aspace type=\"total\" size=\"%zu\"/>\n" ++ "<aspace type=\"mprotect\" size=\"%zu\"/>\n", ++ ar_ptr->system_mem, ar_ptr->system_mem); ++ total_aspace += ar_ptr->system_mem; ++ total_aspace_mprotect += ar_ptr->system_mem; + } + + fputs ("</heap>\n", fp); + } + +- if(__malloc_initialized < 0) ++ if (__malloc_initialized < 0) + ptmalloc_init (); + + fputs ("<malloc version=\"1\">\n", fp); +@@ -5168,18 +5169,18 @@ malloc_info (int options, FILE *fp) + while (ar_ptr != &main_arena); + + fprintf (fp, +- "<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n" +- "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n" ++ "<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n" ++ "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n" + "<total type=\"mmap\" count=\"%d\" size=\"%zu\"/>\n" +- "<system type=\"current\" size=\"%zu\"/>\n" +- "<system type=\"max\" size=\"%zu\"/>\n" +- "<aspace type=\"total\" size=\"%zu\"/>\n" +- "<aspace type=\"mprotect\" size=\"%zu\"/>\n" +- "</malloc>\n", +- total_nfastblocks, total_fastavail, total_nblocks, total_avail, ++ "<system type=\"current\" size=\"%zu\"/>\n" ++ "<system type=\"max\" size=\"%zu\"/>\n" ++ "<aspace type=\"total\" size=\"%zu\"/>\n" ++ "<aspace type=\"mprotect\" size=\"%zu\"/>\n" ++ "</malloc>\n", ++ total_nfastblocks, total_fastavail, total_nblocks, total_avail, + mp_.n_mmaps, mp_.mmapped_mem, +- total_system, total_max_system, +- total_aspace, total_aspace_mprotect); ++ total_system, total_max_system, ++ total_aspace, total_aspace_mprotect); + + return 0; + } diff --git a/SOURCES/glibc-rh1065574-3.patch b/SOURCES/glibc-rh1065574-3.patch new file mode 100644 index 0000000..aff8bf3 --- /dev/null +++ b/SOURCES/glibc-rh1065574-3.patch @@ -0,0 +1,276 @@ +commit 987c02692a88b8c9024cb99187434aad02c3c047 +Author: Ondřej Bílka <neleai@seznam.cz> +Date: Fri May 30 13:24:56 2014 +0200 + + Remove mi_arena nested function. + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index 5c7a27129d66e06a..c99b26d4a85e1b22 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -5023,147 +5023,143 @@ malloc_info (int options, FILE *fp) + size_t total_aspace = 0; + size_t total_aspace_mprotect = 0; + +- void +- mi_arena (mstate ar_ptr) +- { +- fprintf (fp, "<heap nr=\"%d\">\n<sizes>\n", n++); + +- size_t nblocks = 0; +- size_t nfastblocks = 0; +- size_t avail = 0; +- size_t fastavail = 0; +- struct +- { +- size_t from; +- size_t to; +- size_t total; +- size_t count; +- } sizes[NFASTBINS + NBINS - 1]; +-#define nsizes (sizeof (sizes) / sizeof (sizes[0])) + +- mutex_lock (&ar_ptr->mutex); ++ if (__malloc_initialized < 0) ++ ptmalloc_init (); ++ ++ fputs ("<malloc version=\"1\">\n", fp); ++ ++ /* Iterate over all arenas currently in use. */ ++ mstate ar_ptr = &main_arena; ++ do ++ { ++ fprintf (fp, "<heap nr=\"%d\">\n<sizes>\n", n++); + +- for (size_t i = 0; i < NFASTBINS; ++i) ++ size_t nblocks = 0; ++ size_t nfastblocks = 0; ++ size_t avail = 0; ++ size_t fastavail = 0; ++ struct + { +- mchunkptr p = fastbin (ar_ptr, i); +- if (p != NULL) +- { +- size_t nthissize = 0; +- size_t thissize = chunksize (p); +- +- while (p != NULL) +- { +- ++nthissize; +- p = p->fd; +- } +- +- fastavail += nthissize * thissize; +- nfastblocks += nthissize; +- sizes[i].from = thissize - (MALLOC_ALIGNMENT - 1); +- sizes[i].to = thissize; +- sizes[i].count = nthissize; +- } +- else +- sizes[i].from = sizes[i].to = sizes[i].count = 0; +- +- sizes[i].total = sizes[i].count * sizes[i].to; +- } ++ size_t from; ++ size_t to; ++ size_t total; ++ size_t count; ++ } sizes[NFASTBINS + NBINS - 1]; ++#define nsizes (sizeof (sizes) / sizeof (sizes[0])) + ++ mutex_lock (&ar_ptr->mutex); + +- mbinptr bin; +- struct malloc_chunk *r; ++ for (size_t i = 0; i < NFASTBINS; ++i) ++ { ++ mchunkptr p = fastbin (ar_ptr, i); ++ if (p != NULL) ++ { ++ size_t nthissize = 0; ++ size_t thissize = chunksize (p); ++ ++ while (p != NULL) ++ { ++ ++nthissize; ++ p = p->fd; ++ } ++ ++ fastavail += nthissize * thissize; ++ nfastblocks += nthissize; ++ sizes[i].from = thissize - (MALLOC_ALIGNMENT - 1); ++ sizes[i].to = thissize; ++ sizes[i].count = nthissize; ++ } ++ else ++ sizes[i].from = sizes[i].to = sizes[i].count = 0; + +- for (size_t i = 1; i < NBINS; ++i) +- { +- bin = bin_at (ar_ptr, i); +- r = bin->fd; +- sizes[NFASTBINS - 1 + i].from = ~((size_t) 0); +- sizes[NFASTBINS - 1 + i].to = sizes[NFASTBINS - 1 + i].total +- = sizes[NFASTBINS - 1 + i].count = 0; +- +- if (r != NULL) +- while (r != bin) +- { +- ++sizes[NFASTBINS - 1 + i].count; +- sizes[NFASTBINS - 1 + i].total += r->size; +- sizes[NFASTBINS - 1 + i].from +- = MIN (sizes[NFASTBINS - 1 + i].from, r->size); +- sizes[NFASTBINS - 1 + i].to = MAX (sizes[NFASTBINS - 1 + i].to, +- r->size); +- +- r = r->fd; +- } +- +- if (sizes[NFASTBINS - 1 + i].count == 0) +- sizes[NFASTBINS - 1 + i].from = 0; +- nblocks += sizes[NFASTBINS - 1 + i].count; +- avail += sizes[NFASTBINS - 1 + i].total; +- } ++ sizes[i].total = sizes[i].count * sizes[i].to; ++ } + +- mutex_unlock (&ar_ptr->mutex); + +- total_nfastblocks += nfastblocks; +- total_fastavail += fastavail; ++ mbinptr bin; ++ struct malloc_chunk *r; + +- total_nblocks += nblocks; +- total_avail += avail; ++ for (size_t i = 1; i < NBINS; ++i) ++ { ++ bin = bin_at (ar_ptr, i); ++ r = bin->fd; ++ sizes[NFASTBINS - 1 + i].from = ~((size_t) 0); ++ sizes[NFASTBINS - 1 + i].to = sizes[NFASTBINS - 1 + i].total ++ = sizes[NFASTBINS - 1 + i].count = 0; ++ ++ if (r != NULL) ++ while (r != bin) ++ { ++ ++sizes[NFASTBINS - 1 + i].count; ++ sizes[NFASTBINS - 1 + i].total += r->size; ++ sizes[NFASTBINS - 1 + i].from ++ = MIN (sizes[NFASTBINS - 1 + i].from, r->size); ++ sizes[NFASTBINS - 1 + i].to = MAX (sizes[NFASTBINS - 1 + i].to, ++ r->size); ++ ++ r = r->fd; ++ } + +- for (size_t i = 0; i < nsizes; ++i) +- if (sizes[i].count != 0 && i != NFASTBINS) +- fprintf (fp, " \ +-<size from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n", +- sizes[i].from, sizes[i].to, sizes[i].total, sizes[i].count); ++ if (sizes[NFASTBINS - 1 + i].count == 0) ++ sizes[NFASTBINS - 1 + i].from = 0; ++ nblocks += sizes[NFASTBINS - 1 + i].count; ++ avail += sizes[NFASTBINS - 1 + i].total; ++ } + +- if (sizes[NFASTBINS].count != 0) +- fprintf (fp, "\ +-<unsorted from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n", +- sizes[NFASTBINS].from, sizes[NFASTBINS].to, +- sizes[NFASTBINS].total, sizes[NFASTBINS].count); ++ mutex_unlock (&ar_ptr->mutex); + +- total_system += ar_ptr->system_mem; +- total_max_system += ar_ptr->max_system_mem; ++ total_nfastblocks += nfastblocks; ++ total_fastavail += fastavail; + +- fprintf (fp, +- "</sizes>\n<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n" +- "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n" +- "<system type=\"current\" size=\"%zu\"/>\n" +- "<system type=\"max\" size=\"%zu\"/>\n", +- nfastblocks, fastavail, nblocks, avail, +- ar_ptr->system_mem, ar_ptr->max_system_mem); ++ total_nblocks += nblocks; ++ total_avail += avail; + +- if (ar_ptr != &main_arena) +- { +- heap_info *heap = heap_for_ptr (top (ar_ptr)); +- fprintf (fp, +- "<aspace type=\"total\" size=\"%zu\"/>\n" +- "<aspace type=\"mprotect\" size=\"%zu\"/>\n", +- heap->size, heap->mprotect_size); +- total_aspace += heap->size; +- total_aspace_mprotect += heap->mprotect_size; +- } +- else +- { +- fprintf (fp, +- "<aspace type=\"total\" size=\"%zu\"/>\n" +- "<aspace type=\"mprotect\" size=\"%zu\"/>\n", +- ar_ptr->system_mem, ar_ptr->system_mem); +- total_aspace += ar_ptr->system_mem; +- total_aspace_mprotect += ar_ptr->system_mem; +- } ++ for (size_t i = 0; i < nsizes; ++i) ++ if (sizes[i].count != 0 && i != NFASTBINS) ++ fprintf (fp, " \ ++ <size from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n", ++ sizes[i].from, sizes[i].to, sizes[i].total, sizes[i].count); + +- fputs ("</heap>\n", fp); +- } ++ if (sizes[NFASTBINS].count != 0) ++ fprintf (fp, "\ ++ <unsorted from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n", ++ sizes[NFASTBINS].from, sizes[NFASTBINS].to, ++ sizes[NFASTBINS].total, sizes[NFASTBINS].count); + +- if (__malloc_initialized < 0) +- ptmalloc_init (); ++ total_system += ar_ptr->system_mem; ++ total_max_system += ar_ptr->max_system_mem; + +- fputs ("<malloc version=\"1\">\n", fp); ++ fprintf (fp, ++ "</sizes>\n<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n" ++ "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n" ++ "<system type=\"current\" size=\"%zu\"/>\n" ++ "<system type=\"max\" size=\"%zu\"/>\n", ++ nfastblocks, fastavail, nblocks, avail, ++ ar_ptr->system_mem, ar_ptr->max_system_mem); + +- /* Iterate over all arenas currently in use. */ +- mstate ar_ptr = &main_arena; +- do +- { +- mi_arena (ar_ptr); ++ if (ar_ptr != &main_arena) ++ { ++ heap_info *heap = heap_for_ptr (top (ar_ptr)); ++ fprintf (fp, ++ "<aspace type=\"total\" size=\"%zu\"/>\n" ++ "<aspace type=\"mprotect\" size=\"%zu\"/>\n", ++ heap->size, heap->mprotect_size); ++ total_aspace += heap->size; ++ total_aspace_mprotect += heap->mprotect_size; ++ } ++ else ++ { ++ fprintf (fp, ++ "<aspace type=\"total\" size=\"%zu\"/>\n" ++ "<aspace type=\"mprotect\" size=\"%zu\"/>\n", ++ ar_ptr->system_mem, ar_ptr->system_mem); ++ total_aspace += ar_ptr->system_mem; ++ total_aspace_mprotect += ar_ptr->system_mem; ++ } ++ ++ fputs ("</heap>\n", fp); + ar_ptr = ar_ptr->next; + } + while (ar_ptr != &main_arena); diff --git a/SOURCES/glibc-rh1065574-4.patch b/SOURCES/glibc-rh1065574-4.patch new file mode 100644 index 0000000..c50a3c7 --- /dev/null +++ b/SOURCES/glibc-rh1065574-4.patch @@ -0,0 +1,38 @@ +commit c52ff39e8ee052e4a57676d65a27f09bd0a859ad +Author: Joseph Myers <joseph@codesourcery.com> +Date: Wed Nov 12 22:31:38 2014 +0000 + + Fix malloc_info namespace (bug 17570). + + malloc_info is defined in the same file as malloc and free, but is not + an ISO C function, so should be a weak symbol. This patch makes it + so. + + Tested for x86_64 (testsuite, and that disassembly of installed shared + libraries is unchanged by the patch). + + [BZ #17570] + * malloc/malloc.c (malloc_info): Rename to __malloc_info and + define as weak alias of __malloc_info. + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index c99b26d4a85e1b22..18e00315c6edba4d 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -5007,7 +5007,7 @@ weak_alias (__posix_memalign, posix_memalign) + + + int +-malloc_info (int options, FILE *fp) ++__malloc_info (int options, FILE *fp) + { + /* For now, at least. */ + if (options != 0) +@@ -5180,6 +5180,7 @@ malloc_info (int options, FILE *fp) + + return 0; + } ++weak_alias (__malloc_info, malloc_info) + + + strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc) diff --git a/SOURCES/glibc-rh1065574-5.patch b/SOURCES/glibc-rh1065574-5.patch new file mode 100644 index 0000000..133d422 --- /dev/null +++ b/SOURCES/glibc-rh1065574-5.patch @@ -0,0 +1,31 @@ +This is a partial recreation of this upstream commit, restricted to +the __malloc_info function: + +commit 4bf5f2224baa1590f92f7a26930928fe9f7e4b57 +Author: Florian Weimer <fweimer@redhat.com> +Date: Tue Sep 6 12:49:54 2016 +0200 + + malloc: Automated part of conversion to __libc_lock + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index 18e00315c6edba4d..d2a5e251da4f1191 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -5049,7 +5049,7 @@ __malloc_info (int options, FILE *fp) + } sizes[NFASTBINS + NBINS - 1]; + #define nsizes (sizeof (sizes) / sizeof (sizes[0])) + +- mutex_lock (&ar_ptr->mutex); ++ __libc_lock_lock (ar_ptr->mutex); + + for (size_t i = 0; i < NFASTBINS; ++i) + { +@@ -5108,7 +5108,7 @@ __malloc_info (int options, FILE *fp) + avail += sizes[NFASTBINS - 1 + i].total; + } + +- mutex_unlock (&ar_ptr->mutex); ++ __libc_lock_unlock (ar_ptr->mutex); + + total_nfastblocks += nfastblocks; + total_fastavail += fastavail; diff --git a/SOURCES/glibc-rh1065574-6.patch b/SOURCES/glibc-rh1065574-6.patch new file mode 100644 index 0000000..6ca5491 --- /dev/null +++ b/SOURCES/glibc-rh1065574-6.patch @@ -0,0 +1,175 @@ +commit 7a9368a1174cb15b9f1d6342e0e10dd90dae238d +Author: Florian Weimer <fweimer@redhat.com> +Date: Wed Nov 15 11:39:01 2017 +0100 + + malloc: Add missing arena lock in malloc_info [BZ #22408] + + Obtain the size information while the arena lock is acquired, and only + print it later. + +Conflicts: + malloc/Makefile + (Differences in available tests.) + +diff --git a/malloc/Makefile b/malloc/Makefile +index 992cec6b03115a76..6f216f423293dc6c 100644 +--- a/malloc/Makefile ++++ b/malloc/Makefile +@@ -31,6 +31,7 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ + tst-malloc-thread-fail tst-malloc-fork-deadlock \ + tst-interpose-nothread \ + tst-interpose-thread \ ++ tst-malloc_info \ + tst-interpose-static-nothread \ + tst-interpose-static-thread \ + tst-scratch_buffer \ +@@ -214,3 +215,5 @@ $(objpfx)tst-dynarray-mem: $(objpfx)tst-dynarray.out + tst-dynarray-fail-ENV = MALLOC_TRACE=$(objpfx)tst-dynarray-fail.mtrace + $(objpfx)tst-dynarray-fail-mem: $(objpfx)tst-dynarray-fail.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-dynarray-fail.mtrace > $@ ++ ++$(objpfx)tst-malloc_info: $(shared-thread-library) +diff --git a/malloc/malloc.c b/malloc/malloc.c +index d2a5e251da4f1191..035f2167be7019d8 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -5108,6 +5108,15 @@ __malloc_info (int options, FILE *fp) + avail += sizes[NFASTBINS - 1 + i].total; + } + ++ size_t heap_size = 0; ++ size_t heap_mprotect_size = 0; ++ if (ar_ptr != &main_arena) ++ { ++ heap_info *heap = heap_for_ptr (top (ar_ptr)); ++ heap_size = heap->size; ++ heap_mprotect_size = heap->mprotect_size; ++ } ++ + __libc_lock_unlock (ar_ptr->mutex); + + total_nfastblocks += nfastblocks; +@@ -5141,13 +5150,12 @@ __malloc_info (int options, FILE *fp) + + if (ar_ptr != &main_arena) + { +- heap_info *heap = heap_for_ptr (top (ar_ptr)); + fprintf (fp, + "<aspace type=\"total\" size=\"%zu\"/>\n" + "<aspace type=\"mprotect\" size=\"%zu\"/>\n", +- heap->size, heap->mprotect_size); +- total_aspace += heap->size; +- total_aspace_mprotect += heap->mprotect_size; ++ heap_size, heap_mprotect_size); ++ total_aspace += heap_size; ++ total_aspace_mprotect += heap_mprotect_size; + } + else + { +diff --git a/malloc/tst-malloc_info.c b/malloc/tst-malloc_info.c +new file mode 100644 +index 0000000000000000..a25b8cbeae78e710 +--- /dev/null ++++ b/malloc/tst-malloc_info.c +@@ -0,0 +1,101 @@ ++/* Smoke test for malloc_info. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++/* The purpose of this test is to provide a quick way to run ++ malloc_info in a multi-threaded process. */ ++ ++#include <array_length.h> ++#include <malloc.h> ++#include <stdlib.h> ++#include <support/support.h> ++#include <support/xthread.h> ++ ++/* This barrier is used to have the main thread wait until the helper ++ threads have performed their allocations. */ ++static pthread_barrier_t barrier; ++ ++enum ++ { ++ /* Number of threads performing allocations. */ ++ thread_count = 4, ++ ++ /* Amount of memory allocation per thread. This should be large ++ enough to cause the allocation of multiple heaps per arena. */ ++ per_thread_allocations ++ = sizeof (void *) == 4 ? 16 * 1024 * 1024 : 128 * 1024 * 1024, ++ }; ++ ++static void * ++allocation_thread_function (void *closure) ++{ ++ struct list ++ { ++ struct list *next; ++ long dummy[4]; ++ }; ++ ++ struct list *head = NULL; ++ size_t allocated = 0; ++ while (allocated < per_thread_allocations) ++ { ++ struct list *new_head = xmalloc (sizeof (*new_head)); ++ allocated += sizeof (*new_head); ++ new_head->next = head; ++ head = new_head; ++ } ++ ++ xpthread_barrier_wait (&barrier); ++ ++ /* Main thread prints first statistics here. */ ++ ++ xpthread_barrier_wait (&barrier); ++ ++ while (head != NULL) ++ { ++ struct list *next_head = head->next; ++ free (head); ++ head = next_head; ++ } ++ ++ return NULL; ++} ++ ++static int ++do_test (void) ++{ ++ xpthread_barrier_init (&barrier, NULL, thread_count + 1); ++ ++ pthread_t threads[thread_count]; ++ for (size_t i = 0; i < array_length (threads); ++i) ++ threads[i] = xpthread_create (NULL, allocation_thread_function, NULL); ++ ++ xpthread_barrier_wait (&barrier); ++ puts ("info: After allocation:"); ++ malloc_info (0, stdout); ++ ++ xpthread_barrier_wait (&barrier); ++ for (size_t i = 0; i < array_length (threads); ++i) ++ xpthread_join (threads[i]); ++ ++ puts ("\ninfo: After deallocation:"); ++ malloc_info (0, stdout); ++ ++ return 0; ++} ++ ++#include <support/test-driver.c> diff --git a/SOURCES/glibc-rh1065574-7.patch b/SOURCES/glibc-rh1065574-7.patch new file mode 100644 index 0000000..b3340c0 --- /dev/null +++ b/SOURCES/glibc-rh1065574-7.patch @@ -0,0 +1,24 @@ +commit b0f6679bcd738ea244a14acd879d974901e56c8e +Author: Florian Weimer <fweimer@redhat.com> +Date: Thu Aug 1 14:06:24 2019 +0200 + + malloc: Remove unwanted leading whitespace in malloc_info [BZ #24867] + + It was introduced in commit 6c8dbf00f536d78b1937b5af6f57be47fd376344 + ("Reformat malloc to gnu style."). + + Reviewed-by: Carlos O'Donell <carlos@redhat.com> + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index 035f2167be7019d8..ffa0f7f00152f339 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -5127,7 +5127,7 @@ __malloc_info (int options, FILE *fp) + + for (size_t i = 0; i < nsizes; ++i) + if (sizes[i].count != 0 && i != NFASTBINS) +- fprintf (fp, " \ ++ fprintf (fp, "\ + <size from=\"%zu\" to=\"%zu\" total=\"%zu\" count=\"%zu\"/>\n", + sizes[i].from, sizes[i].to, sizes[i].total, sizes[i].count); + diff --git a/SOURCES/glibc-rh1067755.patch b/SOURCES/glibc-rh1067755.patch new file mode 100644 index 0000000..9aa89d9 --- /dev/null +++ b/SOURCES/glibc-rh1067755.patch @@ -0,0 +1,123 @@ +diff --git glibc-2.17-c758a686/elf/tst-stackguard1.c glibc-2.17-c758a686/elf/tst-stackguard1.c +index 2b4fd9a..fba60bd 100644 +--- glibc-2.17-c758a686/elf/tst-stackguard1.c ++++ glibc-2.17-c758a686/elf/tst-stackguard1.c +@@ -23,6 +23,7 @@ + #include <string.h> + #include <sys/wait.h> + #include <stackguard-macros.h> ++#include <tls.h> + #include <unistd.h> + + static const char *command; +diff --git glibc-2.17-c758a686/include/errno.h glibc-2.17-c758a686/include/errno.h +index 98c6080..f1b93a8 100644 +--- glibc-2.17-c758a686/include/errno.h ++++ glibc-2.17-c758a686/include/errno.h +@@ -17,7 +17,7 @@ + # define errno rtld_errno + extern int rtld_errno attribute_hidden; + +-# else ++# elif !defined NOT_IN_libc || defined IN_LIB + + # include <tls.h> + +@@ -29,7 +29,7 @@ extern int rtld_errno attribute_hidden; + # endif + extern __thread int errno attribute_tls_model_ie; + +-# endif /* RTLD_PRIVATE_ERRNO */ ++# endif /* !NOT_IN_libc || IN_LIB */ + + # define __set_errno(val) (errno = (val)) + +diff --git glibc-2.17-c758a686/include/netdb.h glibc-2.17-c758a686/include/netdb.h +index 3f2ae06..8a569ba 100644 +--- glibc-2.17-c758a686/include/netdb.h ++++ glibc-2.17-c758a686/include/netdb.h +@@ -3,18 +3,20 @@ + + #ifndef _ISOMAC + /* Macros for accessing h_errno from inside libc. */ +-# undef h_errno +-# ifdef _LIBC_REENTRANT +-# include <tls.h> +-# ifndef NOT_IN_libc +-# define h_errno __libc_h_errno +-# else +-# define h_errno h_errno /* For #ifndef h_errno tests. */ +-# endif ++# if !defined NOT_IN_libc || defined IN_LIB ++# undef h_errno ++# ifdef _LIBC_REENTRANT ++# include <tls.h> ++# ifndef NOT_IN_libc ++# define h_errno __libc_h_errno ++# else ++# define h_errno h_errno /* For #ifndef h_errno tests. */ ++# endif + extern __thread int h_errno attribute_tls_model_ie; +-# else ++# else + extern int h_errno; +-# endif /* _LIBC_REENTRANT */ ++# endif /* _LIBC_REENTRANT */ ++# endif /* !NOT_IN_libc || IN_LIB */ + # define __set_h_errno(x) (h_errno = (x)) + + libc_hidden_proto (hstrerror) +diff --git glibc-2.17-c758a686/nptl/tst-cancel14.c glibc-2.17-c758a686/nptl/tst-cancel14.c +index fbaed49..ca9042d 100644 +--- glibc-2.17-c758a686/nptl/tst-cancel14.c ++++ glibc-2.17-c758a686/nptl/tst-cancel14.c +@@ -23,6 +23,7 @@ + #include <stdlib.h> + #include <string.h> + #include <unistd.h> ++#include <sys/time.h> + + + static pthread_barrier_t bar; +diff --git glibc-2.17-c758a686/nptl/tst-cancel15.c glibc-2.17-c758a686/nptl/tst-cancel15.c +index 0119cc7..3f320ad 100644 +--- glibc-2.17-c758a686/nptl/tst-cancel15.c ++++ glibc-2.17-c758a686/nptl/tst-cancel15.c +@@ -23,6 +23,7 @@ + #include <stdlib.h> + #include <string.h> + #include <unistd.h> ++#include <sys/time.h> + + + static pthread_barrier_t bar; +diff --git glibc-2.17-c758a686/nptl/tst-mutex9.c glibc-2.17-c758a686/nptl/tst-mutex9.c +index adb3b61..1d689bd 100644 +--- glibc-2.17-c758a686/nptl/tst-mutex9.c ++++ glibc-2.17-c758a686/nptl/tst-mutex9.c +@@ -18,10 +18,13 @@ + + #include <errno.h> + #include <pthread.h> ++#include <stdint.h> + #include <stdio.h> ++#include <stdlib.h> + #include <string.h> + #include <unistd.h> + #include <sys/mman.h> ++#include <sys/time.h> + #include <sys/wait.h> + + +diff --git glibc-2.17-c758a686/nptl/tst-stackguard1.c glibc-2.17-c758a686/nptl/tst-stackguard1.c +index f0f707f..57a48ad 100644 +--- glibc-2.17-c758a686/nptl/tst-stackguard1.c ++++ glibc-2.17-c758a686/nptl/tst-stackguard1.c +@@ -24,6 +24,7 @@ + #include <string.h> + #include <sys/wait.h> + #include <stackguard-macros.h> ++#include <tls.h> + #include <unistd.h> + + static const char *command; diff --git a/SOURCES/glibc-rh1070458.patch b/SOURCES/glibc-rh1070458.patch new file mode 100644 index 0000000..31b2966 --- /dev/null +++ b/SOURCES/glibc-rh1070458.patch @@ -0,0 +1,124 @@ +Backport of commit f8b4877a75765b14432a6f83ead11dcecc5b1985 +Author: Marcus Shawcroft <marcus.shawcroft@linaro.org> +Date: Fri Jul 26 08:29:17 2013 +0100 + + [AArch64] Provide symbol version for _mcount. + +2013-07-26 Marcus Shawcroft <marcus.shawcroft@linaro.org> + + * sysdeps/aarch64/Versions: New file. + * sysdeps/aarch64/machine-gmon.h: New file. + * sysdeps/aarch64/mcount.c: New file. + * sysdeps/unix/sysv/linux/aarch64/nptl/libc.abilist (_mcount): Add. + + + +diff -ruNp glibc-2.17-c758a686/ports/sysdeps/aarch64/machine-gmon.h glibc-2.17-c758a686/ports/sysdeps/aarch64/machine-gmon.h +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/machine-gmon.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/machine-gmon.h 2014-03-27 12:06:51.361046886 -0400 +@@ -1,5 +1,5 @@ +-/* Copyright (C) 2011-2012 Free Software Foundation, Inc. +- ++/* AArch64 definitions for profiling support. ++ Copyright (C) 1996-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 +@@ -13,13 +13,22 @@ + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library. If not, see ++ License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +-#define _MCOUNT_DECL(from, self) \ +- void __mcount_internal (u_long from, u_long self) +- +-/* Call __mcount_internal with our the return PC for our caller, and +- the return PC our caller will return to. Empty since we use an +- assembly stub instead. */ +-#define MCOUNT ++/* Accept 'frompc' address as argument from the function that calls ++ __mcount for profiling. Use __builtin_return_address (0) ++ for the 'selfpc' address. */ ++ ++#include <sysdep.h> ++ ++static void mcount_internal (u_long frompc, u_long selfpc); ++ ++#define _MCOUNT_DECL(frompc, selfpc) \ ++static inline void mcount_internal (u_long frompc, u_long selfpc) ++ ++#define MCOUNT \ ++void __mcount (void *frompc) \ ++{ \ ++ mcount_internal ((u_long) frompc, (u_long) RETURN_ADDRESS (0)); \ ++} +diff -ruNp glibc-2.17-c758a686/ports/sysdeps/aarch64/mcount.c glibc-2.17-c758a686/ports/sysdeps/aarch64/mcount.c +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/mcount.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/mcount.c 2014-03-27 11:54:54.435418262 -0400 +@@ -0,0 +1,33 @@ ++/* 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <shlib-compat.h> ++ ++#include <gmon/mcount.c> ++ ++/* We forgot to add _mcount in glibc 2.17. We added it in 2.18 ++ therefore we want it to be added with version GLIBC_2_18. However, ++ setting the version is not straight forward because a generic ++ Version file includes an earlier 2.xx version for each this symbol ++ and the linker uses the first version it sees. */ ++ ++#if SHLIB_COMPAT (libc, GLIBC_2_17, GLIBC_2_18) ++versioned_symbol (libc, __mcount, _mcount, GLIBC_2_18); ++#else ++strong_alias (__mcount, _mcount); ++#endif +diff -ruNp glibc-2.17-c758a686/ports/sysdeps/aarch64/Versions glibc-2.17-c758a686/ports/sysdeps/aarch64/Versions +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/Versions 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/Versions 2014-03-27 11:54:54.435418262 -0400 +@@ -0,0 +1,5 @@ ++libc { ++ GLIBC_2.18 { ++ _mcount; ++ } ++} +diff -ruNp glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libc.abilist glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libc.abilist +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libc.abilist 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libc.abilist 2014-03-27 11:54:54.495412015 -0400 +@@ -2077,3 +2077,6 @@ GLIBC_2.17 + xencrypt F + xprt_register F + xprt_unregister F ++GLIBC_2.18 ++ GLIBC_2.18 A ++ _mcount F +diff -ruNp glibc-2.17-c758a686/Versions.def glibc-2.17-c758a686/Versions.def +--- glibc-2.17-c758a686/Versions.def 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/Versions.def 2014-03-27 11:54:54.535407851 -0400 +@@ -34,6 +34,7 @@ libc { + GLIBC_2.15 + GLIBC_2.16 + GLIBC_2.17 ++ GLIBC_2.18 + HURD_CTHREADS_0.3 + %ifdef EXPORT_UNWIND_FIND_FDE + GCC_3.0 diff --git a/SOURCES/glibc-rh1070471.patch b/SOURCES/glibc-rh1070471.patch new file mode 100644 index 0000000..0e38ad6 --- /dev/null +++ b/SOURCES/glibc-rh1070471.patch @@ -0,0 +1,53 @@ +Backport of commit 052aff95782fefe9c63566471063e8b20836bfb8 +Author: Joseph Myers <joseph@codesourcery.com> +Date: Wed Jan 23 00:42:51 2013 +0000 + + Make bits/wchar.h correct for all architectures (bug 15036). + +2013-01-23 Joseph Myers <joseph@codesourcery.com> + + [BZ #15036] + * bits/wchar.h (__WCHAR_MAX): Define based on __WCHAR_MAX__, or + based on [L'\0' - 1 > 0] if [!__WCHAR_MAX__]. + (__WCHAR_MIN): Likewise, using __WCHAR_MIN__. + * sysdeps/unix/sysv/linux/x86/bits/wchar.h: Remove. + + + +diff -ruNp glibc-2.17-c758a686/bits/wchar.h glibc-2.17-c758a686/bits/wchar.h +--- glibc-2.17-c758a686/bits/wchar.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/bits/wchar.h 2014-03-27 14:53:45.940914030 -0400 +@@ -19,7 +19,31 @@ + #ifndef _BITS_WCHAR_H + #define _BITS_WCHAR_H 1 + +-#define __WCHAR_MIN (-2147483647 - 1) +-#define __WCHAR_MAX (2147483647) ++/* The fallback definitions, for when __WCHAR_MAX__ or __WCHAR_MIN__ ++ are not defined, give the right value and type as long as both int ++ and wchar_t are 32-bit types. Adding L'\0' to a constant value ++ ensures that the type is correct; it is necessary to use (L'\0' + ++ 0) rather than just L'\0' so that the type in C++ is the promoted ++ version of wchar_t rather than the distinct wchar_t type itself. ++ Because wchar_t in preprocessor #if expressions is treated as ++ intmax_t or uintmax_t, the expression (L'\0' - 1) would have the ++ wrong value for WCHAR_MAX in such expressions and so cannot be used ++ to define __WCHAR_MAX in the unsigned case. */ ++ ++#ifdef __WCHAR_MAX__ ++# define __WCHAR_MAX __WCHAR_MAX__ ++#elif L'\0' - 1 > 0 ++# define __WCHAR_MAX (0xffffffffu + L'\0') ++#else ++# define __WCHAR_MAX (0x7fffffff + L'\0') ++#endif ++ ++#ifdef __WCHAR_MIN__ ++# define __WCHAR_MIN __WCHAR_MIN__ ++#elif L'\0' - 1 > 0 ++# define __WCHAR_MIN (L'\0' + 0) ++#else ++# define __WCHAR_MIN (-__WCHAR_MAX - 1) ++#endif + + #endif /* bits/wchar.h */ diff --git a/SOURCES/glibc-rh1070806.patch b/SOURCES/glibc-rh1070806.patch new file mode 100644 index 0000000..9f5fa3d --- /dev/null +++ b/SOURCES/glibc-rh1070806.patch @@ -0,0 +1,118 @@ +Comprehensive stack protector support was added to upstream glibc with +this commit: + +commit cecbc7967f0bcac718b6f8f8942b58403c0e917c +Author: Nick Alcock <nick.alcock@oracle.com> +Date: Mon Dec 26 10:09:10 2016 +0100 + + Enable -fstack-protector=* when requested by configure [BZ #7065] + +It is a superset of the functionality in this patch. + +diff -urN glibc-2.17-c758a686/config.make.in glibc-2.17-c758a686/config.make.in +--- glibc-2.17-c758a686/config.make.in 2014-02-27 10:33:11.466763885 -0500 ++++ glibc-2.17-c758a686/config.make.in 2014-02-27 10:36:44.481320149 -0500 +@@ -62,6 +62,7 @@ + have-as-vis3 = @libc_cv_sparc_as_vis3@ + gnu89-inline-CFLAGS = @gnu89_inline@ + have-ssp = @libc_cv_ssp@ ++have-ssp-strong = @libc_cv_ssp_strong@ + have-selinux = @have_selinux@ + have-libaudit = @have_libaudit@ + have-libcap = @have_libcap@ +diff -urN glibc-2.17-c758a686/configure glibc-2.17-c758a686/configure +--- glibc-2.17-c758a686/configure 2014-02-27 10:33:11.561763687 -0500 ++++ glibc-2.17-c758a686/configure 2014-02-27 10:32:28.885852593 -0500 +@@ -610,6 +610,7 @@ + libc_cv_cc_submachine + exceptions + gnu89_inline ++libc_cv_ssp_strong + libc_cv_ssp + fno_unit_at_a_time + libc_cv_output_format +@@ -6758,6 +6759,27 @@ + $as_echo "$libc_cv_ssp" >&6; } + + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fstack-protector-strong" >&5 ++$as_echo_n "checking for -fstack-protector-strong... " >&6; } ++if ${libc_cv_ssp_strong+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Werror -fstack-protector-strong -xc /dev/null -S -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_ssp_strong=yes ++else ++ libc_cv_ssp_strong=no ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ssp_strong" >&5 ++$as_echo "$libc_cv_ssp_strong" >&6; } ++ ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fgnu89-inline" >&5 + $as_echo_n "checking for -fgnu89-inline... " >&6; } + if ${libc_cv_gnu89_inline+:} false; then : +diff -urN glibc-2.17-c758a686/configure.in glibc-2.17-c758a686/configure.in +--- glibc-2.17-c758a686/configure.in 2014-02-27 10:33:11.469763878 -0500 ++++ glibc-2.17-c758a686/configure.in 2014-02-27 10:32:09.171893663 -0500 +@@ -1682,6 +1682,13 @@ + ]) + AC_SUBST(libc_cv_ssp) + ++AC_CACHE_CHECK(for -fstack-protector-strong, libc_cv_ssp_strong, [dnl ++LIBC_TRY_CC_OPTION([$CFLAGS $CPPFLAGS -Werror -fstack-protector-strong], ++ [libc_cv_ssp_strong=yes], ++ [libc_cv_ssp_strong=no]) ++]) ++AC_SUBST(libc_cv_ssp_strong) ++ + AC_CACHE_CHECK(for -fgnu89-inline, libc_cv_gnu89_inline, [dnl + cat > conftest.c <<EOF + int foo; +diff -urN glibc-2.17-c758a686/login/Makefile glibc-2.17-c758a686/login/Makefile +--- glibc-2.17-c758a686/login/Makefile 2014-02-27 10:33:11.325764178 -0500 ++++ glibc-2.17-c758a686/login/Makefile 2014-02-27 10:35:30.785473661 -0500 +@@ -60,6 +60,9 @@ + ifeq (yes,$(have-ssp)) + pt_chown-cflags += -fstack-protector + endif ++ifeq (yes,$(have-ssp-strong)) ++pt_chown-cflags += -fstack-protector-strong ++endif + ifeq (yes,$(have-libcap)) + libcap = -lcap + endif +diff -urN glibc-2.17-c758a686/nscd/Makefile glibc-2.17-c758a686/nscd/Makefile +--- glibc-2.17-c758a686/nscd/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nscd/Makefile 2014-02-27 10:36:00.017412769 -0500 +@@ -87,6 +87,9 @@ + ifeq (yes,$(have-ssp)) + CFLAGS-nonlib += -fstack-protector + endif ++ifeq (yes,$(have-ssp-strong)) ++CFLAGS-nonlib += -fstack-protector-strong ++endif + + ifeq (yesyes,$(have-fpie)$(build-shared)) + LDFLAGS-nscd = -Wl,-z,now +diff -urN glibc-2.17-c758a686/resolv/Makefile glibc-2.17-c758a686/resolv/Makefile +--- glibc-2.17-c758a686/resolv/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/resolv/Makefile 2014-02-27 10:36:29.449351461 -0500 +@@ -79,6 +79,10 @@ + ifeq (yes,$(have-ssp)) + CFLAGS-libresolv += -fstack-protector + endif ++ifeq (yes,$(have-ssp-strong)) ++CFLAGS-libresolv += -fstack-protector-strong ++endif ++ + CFLAGS-res_hconf.c = -fexceptions + + # The BIND code elicits some harmless warnings. diff --git a/SOURCES/glibc-rh1073667.patch b/SOURCES/glibc-rh1073667.patch new file mode 100644 index 0000000..46657cf --- /dev/null +++ b/SOURCES/glibc-rh1073667.patch @@ -0,0 +1,91 @@ +commit e39adf43c7d1979884dd304ed1250baf1f78fadc +Author: Andreas Schwab <schwab@suse.de> +Date: Mon May 20 10:19:31 2013 +0200 + + AArch64: Don't clobber argument for tail call to __sigjmp_save in sigsetjmp + +diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +index cff81c7..10e0709 100644 +--- glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S ++++ glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S +@@ -44,8 +44,14 @@ ENTRY (__sigsetjmp) + stp d10, d11, [x0, #JB_D10<<3] + stp d12, d13, [x0, #JB_D12<<3] + stp d14, d15, [x0, #JB_D14<<3] +- mov x1, sp +- str x1, [x0, #JB_SP<<3] ++ mov x2, sp ++ str x2, [x0, #JB_SP<<3] ++#if defined NOT_IN_libc && defined IS_IN_rtld ++ /* In ld.so we never save the signal mask */ ++ mov w0, #0 ++ RET ++#else + b C_SYMBOL_NAME(__sigjmp_save) ++#endif + END (__sigsetjmp) + hidden_def (__sigsetjmp) +diff --git glibc-2.17-c758a686/setjmp/Makefile glibc-2.17-c758a686/setjmp/Makefile +index 6124333..913359c 100644 +--- glibc-2.17-c758a686/setjmp/Makefile ++++ glibc-2.17-c758a686/setjmp/Makefile +@@ -25,7 +25,8 @@ headers := setjmp.h bits/setjmp.h bits/setjmp2.h + routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \ + longjmp __longjmp jmp-unwind + +-tests := tst-setjmp jmpbug bug269-setjmp ++tests := tst-setjmp jmpbug bug269-setjmp \ ++ tst-sigsetjmp + + + include ../Rules +diff --git glibc-2.17-c758a686/setjmp/tst-sigsetjmp.c glibc-2.17-c758a686/setjmp/tst-sigsetjmp.c +new file mode 100644 +index 0000000..467c26a +--- /dev/null ++++ glibc-2.17-c758a686/setjmp/tst-sigsetjmp.c +@@ -0,0 +1,44 @@ ++/* 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++/* Test case for BZ #15493 */ ++ ++#include <stdlib.h> ++#include <signal.h> ++#include <setjmp.h> ++ ++static int ++do_test (void) ++{ ++ sigjmp_buf sj; ++ sigset_t m; ++ ++ sigemptyset (&m); ++ sigprocmask (SIG_SETMASK, &m, NULL); ++ if (sigsetjmp (sj, 0) == 0) ++ { ++ sigaddset (&m, SIGUSR1); ++ sigprocmask (SIG_SETMASK, &m, NULL); ++ siglongjmp (sj, 1); ++ return EXIT_FAILURE; ++ } ++ sigprocmask (SIG_SETMASK, NULL, &m); ++ return sigismember (&m, SIGUSR1) ? EXIT_SUCCESS : EXIT_FAILURE; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/SOURCES/glibc-rh1074410-2.patch b/SOURCES/glibc-rh1074410-2.patch new file mode 100644 index 0000000..21c876d --- /dev/null +++ b/SOURCES/glibc-rh1074410-2.patch @@ -0,0 +1,259 @@ +commit e8b9e065a1ae9d7d8b888909ae761cbd5cf7be32 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Mar 19 00:42:30 2014 +0530 + + Fix offset computation for append+ mode on switching from read (BZ #16724) + + The offset computation in write mode uses the fact that _IO_read_end + is kept in sync with the external file offset. This however is not + true when O_APPEND is in effect since switching to write mode ought to + send the external file offset to the end of file without making the + necessary adjustment to _IO_read_end. + + Hence in append mode, offset computation when writing should only + consider the effect of unflushed writes, i.e. from _IO_write_base to + _IO_write_ptr. + +diff --git glibc-2.17-c758a686/libio/Makefile glibc-2.17-c758a686/libio/Makefile +index 69c25c0..4bedfad 100644 +--- glibc-2.17-c758a686/libio/Makefile ++++ glibc-2.17-c758a686/libio/Makefile +@@ -60,7 +60,8 @@ tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc \ + tst-wmemstream1 tst-wmemstream2 \ + bug-memstream1 bug-wmemstream1 \ + tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos tst-fseek \ +- tst-fwrite-error tst-ftell-active-handler ++ tst-fwrite-error tst-ftell-active-handler \ ++ tst-ftell-append + ifeq (yes,$(build-shared)) + # Add test-fopenloc only if shared library is enabled since it depends on + # shared localedata objects. +diff --git glibc-2.17-c758a686/libio/fileops.c glibc-2.17-c758a686/libio/fileops.c +index cf68dbf..204cfea 100644 +--- glibc-2.17-c758a686/libio/fileops.c ++++ glibc-2.17-c758a686/libio/fileops.c +@@ -91,7 +91,9 @@ extern struct __gconv_trans_data __libio_translit attribute_hidden; + + The position in the buffer that corresponds to the position + in external file system is normally _IO_read_end, except in putback +- mode, when it is _IO_save_end. ++ mode, when it is _IO_save_end and also when the file is in append mode, ++ since switching from read to write mode automatically sends the position in ++ the external file system to the end of file. + If the field _fb._offset is >= 0, it gives the offset in + the file as a whole corresponding to eGptr(). (?) + +@@ -966,6 +968,14 @@ do_ftell (_IO_FILE *fp) + /* Adjust for unflushed data. */ + if (!was_writing) + offset -= fp->_IO_read_end - fp->_IO_read_ptr; ++ /* We don't trust _IO_read_end to represent the current file offset when ++ writing in append mode because the value would have to be shifted to ++ the end of the file during a flush. Use the write base instead, along ++ with the new offset we got above when we did a seek to the end of the ++ file. */ ++ else if (append_mode) ++ offset += fp->_IO_write_ptr - fp->_IO_write_base; ++ /* For all other modes, _IO_read_end represents the file offset. */ + else + offset += fp->_IO_write_ptr - fp->_IO_read_end; + } +diff --git glibc-2.17-c758a686/libio/tst-ftell-append.c glibc-2.17-c758a686/libio/tst-ftell-append.c +new file mode 100644 +index 0000000..604dc03 +--- /dev/null ++++ glibc-2.17-c758a686/libio/tst-ftell-append.c +@@ -0,0 +1,169 @@ ++/* Verify that ftell returns the correct value after a read and a write on a ++ file opened in a+ mode. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <errno.h> ++#include <unistd.h> ++#include <locale.h> ++#include <wchar.h> ++ ++/* data points to either char_data or wide_data, depending on whether we're ++ testing regular file mode or wide mode respectively. Similarly, ++ fputs_func points to either fputs or fputws. data_len keeps track of the ++ length of the current data and file_len maintains the current file ++ length. */ ++#define BUF_LEN 4 ++static void *buf; ++static char char_buf[BUF_LEN]; ++static wchar_t wide_buf[BUF_LEN]; ++static const void *data; ++static const char *char_data = "abcdefghijklmnopqrstuvwxyz"; ++static const wchar_t *wide_data = L"abcdefghijklmnopqrstuvwxyz"; ++static size_t data_len; ++static size_t file_len; ++ ++typedef int (*fputs_func_t) (const void *data, FILE *fp); ++fputs_func_t fputs_func; ++ ++typedef void *(*fgets_func_t) (void *s, int size, FILE *stream); ++fgets_func_t fgets_func; ++ ++static int do_test (void); ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" ++ ++static FILE * ++init_file (const char *filename) ++{ ++ FILE *fp = fopen (filename, "w"); ++ if (fp == NULL) ++ { ++ printf ("fopen: %m\n"); ++ return NULL; ++ } ++ ++ int written = fputs_func (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs failed to write data\n"); ++ fclose (fp); ++ return NULL; ++ } ++ ++ file_len = data_len; ++ ++ fclose (fp); ++ ++ fp = fopen (filename, "a+"); ++ if (fp == NULL) ++ { ++ printf ("fopen(a+): %m\n"); ++ return NULL; ++ } ++ ++ return fp; ++} ++ ++static int ++do_one_test (const char *filename) ++{ ++ FILE *fp = init_file (filename); ++ ++ if (fp == NULL) ++ return 1; ++ ++ void *ret = fgets_func (buf, BUF_LEN, fp); ++ ++ if (ret == NULL) ++ { ++ printf ("read failed: %m\n"); ++ fclose (fp); ++ return 1; ++ } ++ ++ int written = fputs_func (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs failed to write data\n"); ++ fclose (fp); ++ return 1; ++ } ++ ++ file_len += data_len; ++ ++ long off = ftell (fp); ++ ++ if (off != file_len) ++ { ++ printf ("Incorrect offset %ld, expected %zu\n", off, file_len); ++ fclose (fp); ++ return 1; ++ } ++ else ++ printf ("Correct offset %ld after write.\n", off); ++ ++ return 0; ++} ++ ++/* Run the tests for regular files and wide mode files. */ ++static int ++do_test (void) ++{ ++ int ret = 0; ++ char *filename; ++ int fd = create_temp_file ("tst-ftell-append-tmp.", &filename); ++ ++ if (fd == -1) ++ { ++ printf ("create_temp_file: %m\n"); ++ return 1; ++ } ++ ++ close (fd); ++ ++ /* Tests for regular files. */ ++ puts ("Regular mode:"); ++ fputs_func = (fputs_func_t) fputs; ++ fgets_func = (fgets_func_t) fgets; ++ data = char_data; ++ buf = char_buf; ++ data_len = strlen (char_data); ++ ret |= do_one_test (filename); ++ ++ /* Tests for wide files. */ ++ puts ("Wide mode:"); ++ if (setlocale (LC_ALL, "en_US.UTF-8") == NULL) ++ { ++ printf ("Cannot set en_US.UTF-8 locale.\n"); ++ return 1; ++ } ++ fputs_func = (fputs_func_t) fputws; ++ fgets_func = (fgets_func_t) fgetws; ++ data = wide_data; ++ buf = wide_buf; ++ data_len = wcslen (wide_data); ++ ret |= do_one_test (filename); ++ ++ return ret; ++} +diff --git glibc-2.17-c758a686/libio/wfileops.c glibc-2.17-c758a686/libio/wfileops.c +index 3199861..f123add 100644 +--- glibc-2.17-c758a686/libio/wfileops.c ++++ glibc-2.17-c758a686/libio/wfileops.c +@@ -713,9 +713,16 @@ do_ftell_wide (_IO_FILE *fp) + offset += outstop - out; + } + +- /* _IO_read_end coincides with fp._offset, so the actual file +- position is fp._offset - (_IO_read_end - new_write_ptr). */ +- offset -= fp->_IO_read_end - fp->_IO_write_ptr; ++ /* We don't trust _IO_read_end to represent the current file offset ++ when writing in append mode because the value would have to be ++ shifted to the end of the file during a flush. Use the write base ++ instead, along with the new offset we got above when we did a seek ++ to the end of the file. */ ++ if (append_mode) ++ offset += fp->_IO_write_ptr - fp->_IO_write_base; ++ /* For all other modes, _IO_read_end represents the file offset. */ ++ else ++ offset += fp->_IO_write_ptr - fp->_IO_read_end; + } + } + diff --git a/SOURCES/glibc-rh1074410.patch b/SOURCES/glibc-rh1074410.patch new file mode 100644 index 0000000..3241ef7 --- /dev/null +++ b/SOURCES/glibc-rh1074410.patch @@ -0,0 +1,656 @@ +commit ae42bbc55a9e05976269026ddabcfb917f6e922f +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Mon Mar 17 18:42:53 2014 +0530 + + Change offset in fdopen only if setting O_APPEND + + fdopen should only be allowed to change the offset in the file it + attaches to if it is setting O_APPEND. If O_APPEND is already set, it + should not change the state of the handle. + +commit ea33158c96c53a64402a772186956c1f5cb556ae +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Tue Mar 11 17:04:49 2014 +0530 + + Fix offset caching for streams and use it for ftell (BZ #16680) + + The ftell implementation was made conservative to ensure that + incorrectly cached offsets never affect it. However, this causes + problems for append mode when a file stream is rewound. Additionally, + the 'clever' trick of using stat to get position for append mode files + caused more problems than it solved and broke old behavior. I have + described the various problems that it caused and then finally the + solution. + + For a and a+ mode files, rewinding the stream should result in ftell + returning 0 as the offset, but the stat() trick caused it to + (incorrectly) always return the end of file. Now I couldn't find + anything in POSIX that specifies the stream position after rewind() + for a file opened in 'a' mode, but for 'a+' mode it should be set to + 0. For 'a' mode too, it probably makes sense to keep it set to 0 in + the interest of retaining old behavior. + + The initial file position for append mode files is implementation + defined, so the implementation could either retain the current file + position or move the position to the end of file. The earlier ftell + implementation would move the offset to end of file for append-only + mode, but retain the old offset for a+ mode. It would also cache the + offset (this detail is important). My patch broke this and would set + the initial position to end of file for both append modes, thus + breaking old behavior. I was ignorant enough to write an incorrect + test case for it too. + + The Change: + + I have now brought back the behavior of seeking to end of file for + append-only streams, but with a slight difference. I don't cache the + offset though, since we would want ftell to query the current file + position through lseek while the stream is not active. Since the + offset is moved to the end of file, we can rely on the file position + reported by lseek and we don't need to resort to the stat() nonsense. + + Finally, the cache is always reliable, except when there are unflished + writes in an append mode stream (i.e. both a and a+). In the latter + case, it is safe to just do an lseek to SEEK_END. The value can be + safely cached too, since the file handle is already active at this + point. Incidentally, this is the only state change we affect in the + file handle (apart from taking locks of course). + + I have also updated the test case to correct my impression of the + initial file position for a+ streams to the initial behavior. I have + verified that this does not break any existing tests in the testsuite + and also passes with the new tests. + +commit b1dbb426e164ad1236c2c76268e03fec5c7a7bbe +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Mon Mar 10 16:20:01 2014 +0530 + + Fix up return codes for tests in tst-ftell-active-handler + + The test functions used a variable ret to store failure codes for + individual tests, but the variable was incorrectly used to record + other failure codes too, resulting in overwriting of the tests status. + This is now fixed by making sure that the ret variable is used only + for recording test failures. + + * libio/tst-ftell-active-handler.c (do_ftell_test): Don't mix + up test status with function return status. + (do_write_test): Likewise. + (do_append_test): Likewise. +diff --git glibc-2.17-c758a686/libio/fileops.c glibc-2.17-c758a686/libio/fileops.c +index 2e7bc8d..cf68dbf 100644 +--- glibc-2.17-c758a686/libio/fileops.c ++++ glibc-2.17-c758a686/libio/fileops.c +@@ -232,13 +232,18 @@ _IO_file_open (fp, filename, posix_mode, prot, read_write, is32not64) + return NULL; + fp->_fileno = fdesc; + _IO_mask_flags (fp, read_write,_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING); +- if ((read_write & _IO_IS_APPENDING) && (read_write & _IO_NO_READS)) +- if (_IO_SEEKOFF (fp, (_IO_off64_t)0, _IO_seek_end, _IOS_INPUT|_IOS_OUTPUT) +- == _IO_pos_BAD && errno != ESPIPE) +- { +- close_not_cancel (fdesc); +- return NULL; +- } ++ /* For append mode, send the file offset to the end of the file. Don't ++ update the offset cache though, since the file handle is not active. */ ++ if ((read_write & (_IO_IS_APPENDING | _IO_NO_READS)) ++ == (_IO_IS_APPENDING | _IO_NO_READS)) ++ { ++ _IO_off64_t new_pos = _IO_SYSSEEK (fp, 0, _IO_seek_end); ++ if (new_pos == _IO_pos_BAD && errno != ESPIPE) ++ { ++ close_not_cancel (fdesc); ++ return NULL; ++ } ++ } + _IO_link_in ((struct _IO_FILE_plus *) fp); + return fp; + } +@@ -929,43 +934,13 @@ _IO_file_sync_mmap (_IO_FILE *fp) + return 0; + } + +-/* Get the current file offset using a system call. This is the safest method +- to get the current file offset, since we are sure that we get the current +- state of the file. Before the stream handle is activated (by using fread, +- fwrite, etc.), an application may alter the state of the file descriptor +- underlying it by calling read/write/lseek on it. Using a cached offset at +- this point will result in returning the incorrect value. Same is the case +- when one switches from reading in a+ mode to writing, where the buffer has +- not been flushed - the cached offset would reflect the reading position +- while the actual write position would be at the end of the file. +- +- do_ftell and do_ftell_wide may resort to using the cached offset in some +- special cases instead of calling get_file_offset, but those cases should be +- thoroughly described. */ +-_IO_off64_t +-get_file_offset (_IO_FILE *fp) +-{ +- if ((fp->_flags & _IO_IS_APPENDING) == _IO_IS_APPENDING) +- { +- struct stat64 st; +- bool ret = (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode)); +- if (ret) +- return st.st_size; +- else +- return EOF; +- } +- else +- return _IO_SYSSEEK (fp, 0, _IO_seek_cur); +-} +- +- +-/* ftell{,o} implementation. Don't modify any state of the file pointer while +- we try to get the current state of the stream. */ ++/* ftell{,o} implementation. The only time we modify the state of the stream ++ is when we have unflushed writes. In that case we seek to the end and ++ record that offset in the stream object. */ + static _IO_off64_t + do_ftell (_IO_FILE *fp) + { +- _IO_off64_t result = 0; +- bool use_cached_offset = false; ++ _IO_off64_t result, offset = 0; + + /* No point looking at unflushed data if we haven't allocated buffers + yet. */ +@@ -974,39 +949,37 @@ do_ftell (_IO_FILE *fp) + bool was_writing = (fp->_IO_write_ptr > fp->_IO_write_base + || _IO_in_put_mode (fp)); + ++ bool append_mode = (fp->_flags & _IO_IS_APPENDING) == _IO_IS_APPENDING; ++ ++ /* When we have unflushed writes in append mode, seek to the end of the ++ file and record that offset. This is the only time we change the file ++ stream state and it is safe since the file handle is active. */ ++ if (was_writing && append_mode) ++ { ++ result = _IO_SYSSEEK (fp, 0, _IO_seek_end); ++ if (result == _IO_pos_BAD) ++ return EOF; ++ else ++ fp->_offset = result; ++ } ++ + /* Adjust for unflushed data. */ + if (!was_writing) +- result -= fp->_IO_read_end - fp->_IO_read_ptr; ++ offset -= fp->_IO_read_end - fp->_IO_read_ptr; + else +- result += fp->_IO_write_ptr - fp->_IO_read_end; +- +- /* It is safe to use the cached offset when available if there is +- unbuffered data (indicating that the file handle is active) and the +- handle is not for a file open in a+ mode. The latter condition is +- because there could be a scenario where there is a switch from read +- mode to write mode using an fseek to an arbitrary position. In this +- case, there would be unbuffered data due to be appended to the end of +- the file, but the offset may not necessarily be the end of the +- file. It is fine to use the cached offset when the a+ stream is in +- read mode though, since the offset is maintained correctly in that +- case. Note that this is not a comprehensive set of cases when the +- offset is reliable. The offset may be reliable even in some cases +- where there is no unflushed input and the handle is active, but it's +- just that we don't have a way to identify that condition reliably. */ +- use_cached_offset = (result != 0 && fp->_offset != _IO_pos_BAD +- && ((fp->_flags & (_IO_IS_APPENDING | _IO_NO_READS)) +- == (_IO_IS_APPENDING | _IO_NO_READS) +- && was_writing)); ++ offset += fp->_IO_write_ptr - fp->_IO_read_end; + } + +- if (use_cached_offset) +- result += fp->_offset; ++ if (fp->_offset != _IO_pos_BAD) ++ result = fp->_offset; + else +- result += get_file_offset (fp); ++ result = _IO_SYSSEEK (fp, 0, _IO_seek_cur); + + if (result == EOF) + return result; + ++ result += offset; ++ + if (result < 0) + { + __set_errno (EINVAL); +@@ -1016,7 +989,6 @@ do_ftell (_IO_FILE *fp) + return result; + } + +- + _IO_off64_t + _IO_new_file_seekoff (fp, offset, dir, mode) + _IO_FILE *fp; +diff --git glibc-2.17-c758a686/libio/iofdopen.c glibc-2.17-c758a686/libio/iofdopen.c +index 3f266f7..b36d21d 100644 +--- glibc-2.17-c758a686/libio/iofdopen.c ++++ glibc-2.17-c758a686/libio/iofdopen.c +@@ -59,6 +59,11 @@ _IO_new_fdopen (fd, mode) + int i; + int use_mmap = 0; + ++ /* Decide whether we modify the offset of the file we attach to and seek to ++ the end of file. We only do this if the mode is 'a' and if the file ++ descriptor did not have O_APPEND in its flags already. */ ++ bool do_seek = false; ++ + switch (*mode) + { + case 'r': +@@ -128,6 +133,7 @@ _IO_new_fdopen (fd, mode) + */ + if ((posix_mode & O_APPEND) && !(fd_flags & O_APPEND)) + { ++ do_seek = true; + #ifdef F_SETFL + if (_IO_fcntl (fd, F_SETFL, fd_flags | O_APPEND) == -1) + #endif +@@ -167,6 +173,16 @@ _IO_new_fdopen (fd, mode) + _IO_mask_flags (&new_f->fp.file, read_write, + _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING); + ++ /* For append mode, set the file offset to the end of the file if we added ++ O_APPEND to the file descriptor flags. Don't update the offset cache ++ though, since the file handle is not active. */ ++ if (do_seek && ((read_write & (_IO_IS_APPENDING | _IO_NO_READS)) ++ == (_IO_IS_APPENDING | _IO_NO_READS))) ++ { ++ _IO_off64_t new_pos = _IO_SYSSEEK (&new_f->fp.file, 0, _IO_seek_end); ++ if (new_pos == _IO_pos_BAD && errno != ESPIPE) ++ return NULL; ++ } + return &new_f->fp.file; + } + libc_hidden_ver (_IO_new_fdopen, _IO_fdopen) +diff --git glibc-2.17-c758a686/libio/tst-ftell-active-handler.c glibc-2.17-c758a686/libio/tst-ftell-active-handler.c +index 54bfe63..e9dc7b3 100644 +--- glibc-2.17-c758a686/libio/tst-ftell-active-handler.c ++++ glibc-2.17-c758a686/libio/tst-ftell-active-handler.c +@@ -88,6 +88,107 @@ static size_t file_len; + typedef int (*fputs_func_t) (const void *data, FILE *fp); + fputs_func_t fputs_func; + ++/* Test that ftell output after a rewind is correct. */ ++static int ++do_rewind_test (const char *filename) ++{ ++ int ret = 0; ++ struct test ++ { ++ const char *mode; ++ int fd_mode; ++ size_t old_off; ++ size_t new_off; ++ } test_modes[] = { ++ {"w", O_WRONLY, 0, data_len}, ++ {"w+", O_RDWR, 0, data_len}, ++ {"r+", O_RDWR, 0, data_len}, ++ /* The new offsets for 'a' and 'a+' modes have to factor in the ++ previous writes since they always append to the end of the ++ file. */ ++ {"a", O_WRONLY, 0, 3 * data_len}, ++ {"a+", O_RDWR, 0, 4 * data_len}, ++ }; ++ ++ /* Empty the file before the test so that our offsets are simple to ++ calculate. */ ++ FILE *fp = fopen (filename, "w"); ++ if (fp == NULL) ++ { ++ printf ("Failed to open file for emptying\n"); ++ return 1; ++ } ++ fclose (fp); ++ ++ for (int j = 0; j < 2; j++) ++ { ++ for (int i = 0; i < sizeof (test_modes) / sizeof (struct test); i++) ++ { ++ FILE *fp; ++ int fd; ++ int fileret; ++ ++ printf ("\trewind: %s (file, \"%s\"): ", j == 0 ? "fdopen" : "fopen", ++ test_modes[i].mode); ++ ++ if (j == 0) ++ fileret = get_handles_fdopen (filename, fd, fp, ++ test_modes[i].fd_mode, ++ test_modes[i].mode); ++ else ++ fileret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ ++ if (fileret != 0) ++ return fileret; ++ ++ /* Write some content to the file, rewind and ensure that the ftell ++ output after the rewind is 0. POSIX does not specify what the ++ behavior is when a file is rewound in 'a' mode, so we retain ++ current behavior, which is to keep the 0 offset. */ ++ size_t written = fputs_func (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs[1] failed to write data\n"); ++ ret |= 1; ++ } ++ ++ rewind (fp); ++ long offset = ftell (fp); ++ ++ if (offset != test_modes[i].old_off) ++ { ++ printf ("Incorrect old offset. Expected %zu, but got %ld, ", ++ test_modes[i].old_off, offset); ++ ret |= 1; ++ } ++ else ++ printf ("old offset = %ld, ", offset); ++ ++ written = fputs_func (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs[1] failed to write data\n"); ++ ret |= 1; ++ } ++ ++ /* After this write, the offset in append modes should factor in the ++ implicit lseek to the end of file. */ ++ offset = ftell (fp); ++ if (offset != test_modes[i].new_off) ++ { ++ printf ("Incorrect new offset. Expected %zu, but got %ld\n", ++ test_modes[i].new_off, offset); ++ ret |= 1; ++ } ++ else ++ printf ("new offset = %ld\n", offset); ++ } ++ } ++ return ret; ++} ++ + /* Test that the value of ftell is not cached when the stream handle is not + active. */ + static int +@@ -107,11 +208,13 @@ do_ftell_test (const char *filename) + {"w", O_WRONLY, 0, data_len}, + {"w+", O_RDWR, 0, data_len}, + {"r+", O_RDWR, 0, data_len}, +- /* For 'a' and 'a+' modes, the initial file position should be the ++ /* For the 'a' mode, the initial file position should be the + current end of file. After the write, the offset has data_len +- added to the old value. */ ++ added to the old value. For a+ mode however, the initial file ++ position is the file position of the underlying file descriptor, ++ since it is initially assumed to be in read mode. */ + {"a", O_WRONLY, data_len, 2 * data_len}, +- {"a+", O_RDWR, 2 * data_len, 3 * data_len}, ++ {"a+", O_RDWR, 0, 3 * data_len}, + }; + for (int j = 0; j < 2; j++) + { +@@ -119,17 +222,20 @@ do_ftell_test (const char *filename) + { + FILE *fp; + int fd; ++ int fileret; ++ + printf ("\tftell: %s (file, \"%s\"): ", j == 0 ? "fdopen" : "fopen", + test_modes[i].mode); + + if (j == 0) +- ret = get_handles_fdopen (filename, fd, fp, test_modes[i].fd_mode, +- test_modes[i].mode); ++ fileret = get_handles_fdopen (filename, fd, fp, ++ test_modes[i].fd_mode, ++ test_modes[i].mode); + else +- ret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ fileret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); + +- if (ret != 0) +- return ret; ++ if (fileret != 0) ++ return fileret; + + long off = ftell (fp); + if (off != test_modes[i].old_off) +@@ -143,13 +249,18 @@ do_ftell_test (const char *filename) + + /* The effect of this write on the offset should be seen in the ftell + call that follows it. */ +- int ret = write (fd, data, data_len); ++ int write_ret = write (fd, data, data_len); ++ if (write_ret != data_len) ++ { ++ printf ("write failed (%m)\n"); ++ ret |= 1; ++ } + off = ftell (fp); + + if (off != test_modes[i].new_off) + { + printf ("Incorrect new offset. Expected %zu but got %ld\n", +- test_modes[i].old_off, off); ++ test_modes[i].new_off, off); + ret |= 1; + } + else +@@ -184,21 +295,23 @@ do_write_test (const char *filename) + { + for (int i = 0; i < sizeof (test_modes) / sizeof (struct test); i++) + { ++ int fileret; + printf ("\twrite: %s (file, \"%s\"): ", j == 0 ? "fopen" : "fdopen", + test_modes[i].mode); + + if (j == 0) +- ret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ fileret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); + else +- ret = get_handles_fdopen (filename, fd, fp, test_modes[i].fd_mode, +- test_modes[i].mode); ++ fileret = get_handles_fdopen (filename, fd, fp, ++ test_modes[i].fd_mode, ++ test_modes[i].mode); + +- if (ret != 0) +- return ret; ++ if (fileret != 0) ++ return fileret; + + /* Move offset to just before the end of the file. */ +- off_t ret = lseek (fd, file_len - 1, SEEK_SET); +- if (ret == -1) ++ off_t seek_ret = lseek (fd, file_len - 1, SEEK_SET); ++ if (seek_ret == -1) + { + printf ("lseek failed: %m\n"); + ret |= 1; +@@ -258,17 +371,20 @@ do_append_test (const char *filename) + { + for (int i = 0; i < sizeof (test_modes) / sizeof (struct test); i++) + { ++ int fileret; ++ + printf ("\tappend: %s (file, \"%s\"): ", j == 0 ? "fopen" : "fdopen", + test_modes[i].mode); + + if (j == 0) +- ret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ fileret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); + else +- ret = get_handles_fdopen (filename, fd, fp, test_modes[i].fd_mode, +- test_modes[i].mode); ++ fileret = get_handles_fdopen (filename, fd, fp, ++ test_modes[i].fd_mode, ++ test_modes[i].mode); + +- if (ret != 0) +- return ret; ++ if (fileret != 0) ++ return fileret; + + /* Write some data. */ + size_t written = fputs_func (data, fp); +@@ -298,6 +414,61 @@ do_append_test (const char *filename) + } + } + ++ /* For fdopen in 'a' mode, the file descriptor should not change if the file ++ is already open with the O_APPEND flag set. */ ++ fd = open (filename, O_WRONLY | O_APPEND, 0); ++ if (fd == -1) ++ { ++ printf ("open(O_APPEND) failed: %m\n"); ++ return 1; ++ } ++ ++ off_t seek_ret = lseek (fd, file_len - 1, SEEK_SET); ++ if (seek_ret == -1) ++ { ++ printf ("lseek[O_APPEND][0] failed: %m\n"); ++ ret |= 1; ++ } ++ ++ fp = fdopen (fd, "a"); ++ if (fp == NULL) ++ { ++ printf ("fdopen(O_APPEND) failed: %m\n"); ++ close (fd); ++ return 1; ++ } ++ ++ off_t new_seek_ret = lseek (fd, 0, SEEK_CUR); ++ if (seek_ret == -1) ++ { ++ printf ("lseek[O_APPEND][1] failed: %m\n"); ++ ret |= 1; ++ } ++ ++ printf ("\tappend: fdopen (file, \"a\"): O_APPEND: "); ++ ++ if (seek_ret != new_seek_ret) ++ { ++ printf ("incorrectly modified file offset to %ld, should be %ld", ++ new_seek_ret, seek_ret); ++ ret |= 1; ++ } ++ else ++ printf ("retained current file offset %ld", seek_ret); ++ ++ new_seek_ret = ftello (fp); ++ ++ if (seek_ret != new_seek_ret) ++ { ++ printf (", ftello reported incorrect offset %ld, should be %ld\n", ++ new_seek_ret, seek_ret); ++ ret |= 1; ++ } ++ else ++ printf (", ftello reported correct offset %ld\n", seek_ret); ++ ++ fclose (fp); ++ + return ret; + } + +@@ -309,6 +480,7 @@ do_one_test (const char *filename) + ret |= do_ftell_test (filename); + ret |= do_write_test (filename); + ret |= do_append_test (filename); ++ ret |= do_rewind_test (filename); + + return ret; + } +diff --git glibc-2.17-c758a686/libio/wfileops.c glibc-2.17-c758a686/libio/wfileops.c +index 8b2e108..3199861 100644 +--- glibc-2.17-c758a686/libio/wfileops.c ++++ glibc-2.17-c758a686/libio/wfileops.c +@@ -597,12 +597,12 @@ done: + } + + /* ftell{,o} implementation for wide mode. Don't modify any state of the file +- pointer while we try to get the current state of the stream. */ ++ pointer while we try to get the current state of the stream except in one ++ case, which is when we have unflushed writes in append mode. */ + static _IO_off64_t + do_ftell_wide (_IO_FILE *fp) + { + _IO_off64_t result, offset = 0; +- bool use_cached_offset = false; + + /* No point looking for offsets in the buffer if it hasn't even been + allocated. */ +@@ -615,6 +615,20 @@ do_ftell_wide (_IO_FILE *fp) + > fp->_wide_data->_IO_write_base) + || _IO_in_put_mode (fp)); + ++ bool append_mode = (fp->_flags & _IO_IS_APPENDING) == _IO_IS_APPENDING; ++ ++ /* When we have unflushed writes in append mode, seek to the end of the ++ file and record that offset. This is the only time we change the file ++ stream state and it is safe since the file handle is active. */ ++ if (was_writing && append_mode) ++ { ++ result = _IO_SYSSEEK (fp, 0, _IO_seek_end); ++ if (result == _IO_pos_BAD) ++ return EOF; ++ else ++ fp->_offset = result; ++ } ++ + /* XXX For wide stream with backup store it is not very + reasonable to determine the offset. The pushed-back + character might require a state change and we need not be +@@ -703,37 +717,24 @@ do_ftell_wide (_IO_FILE *fp) + position is fp._offset - (_IO_read_end - new_write_ptr). */ + offset -= fp->_IO_read_end - fp->_IO_write_ptr; + } +- +- /* It is safe to use the cached offset when available if there is +- unbuffered data (indicating that the file handle is active) and +- the handle is not for a file open in a+ mode. The latter +- condition is because there could be a scenario where there is a +- switch from read mode to write mode using an fseek to an arbitrary +- position. In this case, there would be unbuffered data due to be +- appended to the end of the file, but the offset may not +- necessarily be the end of the file. It is fine to use the cached +- offset when the a+ stream is in read mode though, since the offset +- is maintained correctly in that case. Note that this is not a +- comprehensive set of cases when the offset is reliable. The +- offset may be reliable even in some cases where there is no +- unflushed input and the handle is active, but it's just that we +- don't have a way to identify that condition reliably. */ +- use_cached_offset = (offset != 0 && fp->_offset != _IO_pos_BAD +- && ((fp->_flags & (_IO_IS_APPENDING | _IO_NO_READS)) +- == (_IO_IS_APPENDING | _IO_NO_READS) +- && was_writing)); + } + +- if (use_cached_offset) ++ if (fp->_offset != _IO_pos_BAD) + result = fp->_offset; + else +- result = get_file_offset (fp); ++ result = _IO_SYSSEEK (fp, 0, _IO_seek_cur); + + if (result == EOF) + return result; + + result += offset; + ++ if (result < 0) ++ { ++ __set_errno (EINVAL); ++ return EOF; ++ } ++ + return result; + } + diff --git a/SOURCES/glibc-rh1077389-p1.patch b/SOURCES/glibc-rh1077389-p1.patch new file mode 100644 index 0000000..3ee3152 --- /dev/null +++ b/SOURCES/glibc-rh1077389-p1.patch @@ -0,0 +1,78 @@ +# +# commit 76a9b9986141b1a7d9fd290c349d27fcee780c7a +# Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> +# Date: Thu Nov 7 05:34:22 2013 -0600 +# +# PowerPC: Fix vDSO missing ODP entries +# +# This patch fixes the vDSO symbol used directed in IFUNC resolver where +# they do not have an associated ODP entry leading to undefined behavior +# in some cases. It adds an artificial OPD static entry to such cases +# and set its TOC to non 0 to avoid triggering lazy resolutions. +# +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h 2015-01-15 16:05:08.853681325 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h 2015-01-15 16:06:11.451747716 -0500 +@@ -34,12 +34,32 @@ + + extern void *__vdso_time; + +-/* This macro is needed for PPC64 to return a skeleton OPD entry of a vDSO +- symbol. This works because _dl_vdso_vsym always return the function +- address, and no vDSO symbols use the TOC or chain pointers from the OPD +- so we can allow them to be garbage. */ +-#if defined(__PPC64__) || defined(__powerpc64__) +-#define VDSO_IFUNC_RET(value) ((void *) &(value)) ++/* The correct solution is for _dl_vdso_vsym to return the address of the OPD ++ for the kernel VDSO function. That address would then be stored in the ++ __vdso_* variables and returned as the result of the IFUNC resolver function. ++ Yet, the kernel does not contain any OPD entries for the VDSO functions ++ (incomplete implementation). However, PLT relocations for IFUNCs still expect ++ the address of an OPD to be returned from the IFUNC resolver function (since ++ PLT entries on PPC64 are just copies of OPDs). The solution for now is to ++ create an artificial static OPD for each VDSO function returned by a resolver ++ function. The TOC value is set to a non-zero value to avoid triggering lazy ++ symbol resolution via .glink0/.plt0 for a zero TOC (requires thread-safe PLT ++ sequences) when the dynamic linker isn't prepared for it e.g. RTLD_NOW. None ++ of the kernel VDSO routines use the TOC or AUX values so any non-zero value ++ will work. Note that function pointer comparisons will not use this artificial ++ static OPD since those are resolved via ADDR64 relocations and will point at ++ the non-IFUNC default OPD for the symbol. Lastly, because the IFUNC relocations ++ are processed immediately at startup the resolver functions and this code need ++ not be thread-safe, but if the caller writes to a PLT slot it must do so in a ++ thread-safe manner with all the required barriers. */ ++#if (defined(__PPC64__) || defined(__powerpc64__)) && _CALL_ELF != 2 ++#define VDSO_IFUNC_RET(value) \ ++ ({ \ ++ static Elf64_FuncDesc vdso_opd = { .fd_toc = ~0x0 }; \ ++ vdso_opd.fd_func = (Elf64_Addr)value; \ ++ &vdso_opd; \ ++ }) ++ + #else + #define VDSO_IFUNC_RET(value) ((void *) (value)) + #endif +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c 2015-01-15 16:05:08.912679502 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c 2015-01-15 16:06:11.451747716 -0500 +@@ -21,6 +21,7 @@ + + # include <dl-vdso.h> + # include <bits/libc-vdso.h> ++# include <dl-machine.h> + + void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); + +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c 2015-01-15 16:05:08.912679502 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c 2015-01-15 16:06:11.451747716 -0500 +@@ -20,7 +20,9 @@ + + # include <time.h> + # include <sysdep.h> ++# include <dl-vdso.h> + # include <bits/libc-vdso.h> ++# include <dl-machine.h> + + void *time_ifunc (void) asm ("time"); + diff --git a/SOURCES/glibc-rh1077389-p2.patch b/SOURCES/glibc-rh1077389-p2.patch new file mode 100644 index 0000000..a37893c --- /dev/null +++ b/SOURCES/glibc-rh1077389-p2.patch @@ -0,0 +1,53 @@ +# +# commit d98720e07f67fbeec00f9e1347840404240d3c48 +# Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> +# Date: Mon Jan 20 12:29:51 2014 -0600 +# +# PowerPC: Fix gettimeofday ifunc selection +# +# The IFUNC selector for gettimeofday runs before _libc_vdso_platform_setup where +# __vdso_gettimeofday is set. The selector then sets __gettimeofday (the internal +# version used within GLIBC) to use the system call version instead of the vDSO one. +# This patch changes the check if vDSO is available to get its value directly +# instead of rely on __vdso_gettimeofday. +# +# This patch changes it by getting the vDSO value directly. +# +# It fixes BZ#16431. +# +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c 2015-01-15 16:07:59.167420456 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c 2015-01-15 16:07:41.408969001 -0500 +@@ -34,9 +34,12 @@ + void * + gettimeofday_ifunc (void) + { ++ PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565); ++ + /* If the vDSO is not available we fall back syscall. */ +- return (__vdso_gettimeofday ? VDSO_IFUNC_RET (__vdso_gettimeofday) +- : __gettimeofday_syscall); ++ void *vdso_gettimeofday = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2615); ++ return (vdso_gettimeofday ? VDSO_IFUNC_RET (vdso_gettimeofday) ++ : (void*)__gettimeofday_syscall); + } + asm (".type __gettimeofday, %gnu_indirect_function"); + +diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c 2015-01-15 16:07:59.168420425 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/time.c 2015-01-15 16:07:41.408969001 -0500 +@@ -45,9 +45,12 @@ + void * + time_ifunc (void) + { ++ PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565); ++ + /* If the vDSO is not available we fall back to the syscall. */ +- return (__vdso_time ? VDSO_IFUNC_RET (__vdso_time) +- : time_syscall); ++ void *vdso_time = _dl_vdso_vsym ("__kernel_time", &linux2615); ++ return (vdso_time ? VDSO_IFUNC_RET (vdso_time) ++ : (void*)time_syscall); + } + asm (".type time, %gnu_indirect_function"); + diff --git a/SOURCES/glibc-rh1078225.patch b/SOURCES/glibc-rh1078225.patch new file mode 100644 index 0000000..9743e87 --- /dev/null +++ b/SOURCES/glibc-rh1078225.patch @@ -0,0 +1,46 @@ +From 3a3acb6afc753475675b5724f206e619d0c9590d Mon Sep 17 00:00:00 2001 +From: Tom Tromey <tromey@redhat.com> +Date: Mon, 20 Jan 2014 12:58:03 +0000 +Subject: [PATCH] [AArch64] BZ #16169 Add CFI directives to clone.S + +[BZ #16169] Add CFI directives to the AArch64 clone.S implementation +and ensure that the FP in the child is zero'd in order to comply with +AAPCS. +--- + NEWS | 8 ++++---- + ports/ChangeLog.aarch64 | 6 ++++++ + ports/sysdeps/unix/sysv/linux/aarch64/clone.S | 7 ++++++- + 3 files changed, 16 insertions(+), 5 deletions(-) + +Index: glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/clone.S +=================================================================== +--- glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/clone.S ++++ glibc-2.17-c758a686/ports/sysdeps/unix/sysv/linux/aarch64/clone.S +@@ -63,6 +63,7 @@ ENTRY(__clone) + mov x8, #SYS_ify(clone) + /* X0:flags, x1:newsp, x2:parenttidptr, x3:newtls, x4:childtid. */ + svc 0x0 ++ cfi_endproc + cmp x0, #0 + beq 2f + blt C_SYMBOL_NAME(__syscall_error) +@@ -71,6 +72,9 @@ ENTRY(__clone) + b syscall_error + + 2: ++ cfi_startproc ++ cfi_undefined (x30) ++ mov x29, 0 + #ifdef RESET_PID + tbnz x5, #CLONE_THREAD_BIT, 3f + mov x0, #-1 +@@ -92,7 +96,8 @@ ENTRY(__clone) + + /* We are done, pass the return value through x0. */ + b HIDDEN_JUMPTARGET(_exit) +- ++ cfi_endproc ++ cfi_startproc + PSEUDO_END (__clone) + + weak_alias (__clone, clone) diff --git a/SOURCES/glibc-rh1080766.patch b/SOURCES/glibc-rh1080766.patch new file mode 100644 index 0000000..2fffaa8 --- /dev/null +++ b/SOURCES/glibc-rh1080766.patch @@ -0,0 +1,57 @@ +commit fbd6b5a4052316f7eb03c4617eebfaafc59dcc06 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Mar 27 07:15:22 2014 +0530 + + Fix nscd lookup for innetgr when netgroup has wildcards (BZ #16758) + + nscd works correctly when the request in innetgr is a wildcard, + i.e. when one or more of host, user or domain parameters is NULL. + However, it does not work when the the triplet in the netgroup + definition has a wildcard. This is easy to reproduce for a triplet + defined as follows: + + foonet (,foo,) + + Here, an innetgr call that looks like this: + + innetgr ("foonet", "foohost", "foo", NULL); + + should succeed and so should: + + innetgr ("foonet", NULL, "foo", "foodomain"); + + It does succeed with nscd disabled, but not with nscd enabled. This + fix adds this additional check for all three parts of the triplet so + that it gives the correct result. + + [BZ #16758] + * nscd/netgroupcache.c (addinnetgrX): Succeed if triplet has + blank values. + +diff --git glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +index 5ba1e1f..5d15aa4 100644 +--- glibc-2.17-c758a686/nscd/netgroupcache.c ++++ glibc-2.17-c758a686/nscd/netgroupcache.c +@@ -560,15 +560,19 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, + { + bool success = true; + +- if (host != NULL) ++ /* For the host, user and domain in each triplet, we assume success ++ if the value is blank because that is how the wildcard entry to ++ match anything is stored in the netgroup cache. */ ++ if (host != NULL && *triplets != '\0') + success = strcmp (host, triplets) == 0; + triplets = (const char *) rawmemchr (triplets, '\0') + 1; + +- if (success && user != NULL) ++ if (success && user != NULL && *triplets != '\0') + success = strcmp (user, triplets) == 0; + triplets = (const char *) rawmemchr (triplets, '\0') + 1; + +- if (success && (domain == NULL || strcmp (domain, triplets) == 0)) ++ if (success && (domain == NULL || *triplets == '\0' ++ || strcmp (domain, triplets) == 0)) + { + dataset->resp.result = 1; + break; diff --git a/SOURCES/glibc-rh1083644.patch b/SOURCES/glibc-rh1083644.patch new file mode 100644 index 0000000..14c4acf --- /dev/null +++ b/SOURCES/glibc-rh1083644.patch @@ -0,0 +1,63 @@ +commit ea7d8b95e2fcb81f68b04ed7787a3dbda023991a +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Mar 27 19:48:15 2014 +0530 + + Avoid overlapping addresses to stpcpy calls in nscd (BZ #16760) + + Calls to stpcpy from nscd netgroups code will have overlapping source + and destination when all three values in the returned triplet are + non-NULL and in the expected (host,user,domain) order. This is seen + in valgrind as: + + ==3181== Source and destination overlap in stpcpy(0x19973b48, 0x19973b48) + ==3181== at 0x4C2F30A: stpcpy (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) + ==3181== by 0x12567A: addgetnetgrentX (string3.h:111) + ==3181== by 0x12722D: addgetnetgrent (netgroupcache.c:665) + ==3181== by 0x11114C: nscd_run_worker (connections.c:1338) + ==3181== by 0x4E3C102: start_thread (pthread_create.c:309) + ==3181== by 0x59B81AC: clone (clone.S:111) + ==3181== + + Fix this by using memmove instead of stpcpy. + +diff --git glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +index 5d15aa4..820d823 100644 +--- glibc-2.17-c758a686/nscd/netgroupcache.c ++++ glibc-2.17-c758a686/nscd/netgroupcache.c +@@ -216,6 +216,10 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + const char *nuser = data.val.triple.user; + const char *ndomain = data.val.triple.domain; + ++ size_t hostlen = strlen (nhost ?: "") + 1; ++ size_t userlen = strlen (nuser ?: "") + 1; ++ size_t domainlen = strlen (ndomain ?: "") + 1; ++ + if (nhost == NULL || nuser == NULL || ndomain == NULL + || nhost > nuser || nuser > ndomain) + { +@@ -233,9 +237,6 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + : last + strlen (last) + 1 - buffer); + + /* We have to make temporary copies. */ +- size_t hostlen = strlen (nhost ?: "") + 1; +- size_t userlen = strlen (nuser ?: "") + 1; +- size_t domainlen = strlen (ndomain ?: "") + 1; + size_t needed = hostlen + userlen + domainlen; + + if (buflen - req->key_len - bufused < needed) +@@ -269,9 +270,12 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + } + + char *wp = buffer + buffilled; +- wp = stpcpy (wp, nhost) + 1; +- wp = stpcpy (wp, nuser) + 1; +- wp = stpcpy (wp, ndomain) + 1; ++ wp = memmove (wp, nhost ?: "", hostlen); ++ wp += hostlen; ++ wp = memmove (wp, nuser ?: "", userlen); ++ wp += userlen; ++ wp = memmove (wp, ndomain ?: "", domainlen); ++ wp += domainlen; + buffilled = wp - buffer; + ++nentries; + } diff --git a/SOURCES/glibc-rh1083646.patch b/SOURCES/glibc-rh1083646.patch new file mode 100644 index 0000000..dcc232c --- /dev/null +++ b/SOURCES/glibc-rh1083646.patch @@ -0,0 +1,398 @@ +commit bc8f194c8c29e46e8ee4034f06e46988dfff38f7 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Apr 30 12:00:39 2014 +0530 + + Initialize all of datahead structure in nscd (BZ #16791) + + The datahead structure has an unused padding field that remains + uninitialized. Valgrind prints out a warning for it on querying a + netgroups entry. This is harmless, but is a potential data leak since + it would result in writing out an uninitialized byte to the cache + file. Besides, this happens only when there is a cache miss, so we're + not adding computation to any fast path. + +commit 1cdeb2372ddecac0dfe0c132a033e9590ffa07d2 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Apr 30 11:57:09 2014 +0530 + + Consolidate code to initialize nscd dataset header + + This patch consolidates the code to initialize the header of a dataset + into a single set of functions (one for positive and another for + negative datasets) primarily to reduce repetition of code. The + secondary reason is to simplify Patch 2/2 which fixes the problem of + an uninitialized byte in the header by initializing an unused field in + the structure and hence preventing a possible data leak into the cache + file. + +diff --git glibc-2.17-c758a686/nscd/aicache.c glibc-2.17-c758a686/nscd/aicache.c +index 98d40a1..d7966bd 100644 +--- glibc-2.17-c758a686/nscd/aicache.c ++++ glibc-2.17-c758a686/nscd/aicache.c +@@ -383,17 +383,12 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, + cp = family; + } + +- /* Fill in the rest of the dataset. */ +- dataset->head.allocsize = total + req->key_len; +- dataset->head.recsize = total - offsetof (struct dataset, resp); +- dataset->head.notfound = false; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- dataset->head.ttl = ttl == INT32_MAX ? db->postimeout : ttl; +- timeout = dataset->head.timeout = time (NULL) + dataset->head.ttl; ++ timeout = datahead_init_pos (&dataset->head, total + req->key_len, ++ total - offsetof (struct dataset, resp), ++ he == NULL ? 0 : dh->nreloads + 1, ++ ttl == INT32_MAX ? db->postimeout : ttl); + ++ /* Fill in the rest of the dataset. */ + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; + dataset->resp.naddrs = naddrs; +@@ -528,15 +523,9 @@ next_nip: + else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) + + req->key_len), 1)) != NULL) + { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = time (NULL) + db->negtimeout; +- dataset->head.ttl = db->negtimeout; ++ timeout = datahead_init_neg (&dataset->head, ++ sizeof (struct dataset) + req->key_len, ++ total, db->negtimeout); + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +diff --git glibc-2.17-c758a686/nscd/grpcache.c glibc-2.17-c758a686/nscd/grpcache.c +index b5a33eb..df59fa7 100644 +--- glibc-2.17-c758a686/nscd/grpcache.c ++++ glibc-2.17-c758a686/nscd/grpcache.c +@@ -128,14 +128,10 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, + } + else if ((dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, 1)) != NULL) + { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = t + db->negtimeout; ++ timeout = datahead_init_neg (&dataset->head, ++ (sizeof (struct dataset) ++ + req->key_len), total, ++ db->negtimeout); + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -232,14 +228,10 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, + dataset_temporary = true; + } + +- dataset->head.allocsize = total + n; +- dataset->head.recsize = total - offsetof (struct dataset, resp); +- dataset->head.notfound = false; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = t + db->postimeout; ++ timeout = datahead_init_pos (&dataset->head, total + n, ++ total - offsetof (struct dataset, resp), ++ he == NULL ? 0 : dh->nreloads + 1, ++ db->postimeout); + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +diff --git glibc-2.17-c758a686/nscd/hstcache.c glibc-2.17-c758a686/nscd/hstcache.c +index a79b67a..d4f1ad2 100644 +--- glibc-2.17-c758a686/nscd/hstcache.c ++++ glibc-2.17-c758a686/nscd/hstcache.c +@@ -152,15 +152,11 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req, + else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) + + req->key_len), 1)) != NULL) + { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- dataset->head.ttl = ttl == INT32_MAX ? db->negtimeout : ttl; +- timeout = dataset->head.timeout = t + dataset->head.ttl; ++ timeout = datahead_init_neg (&dataset->head, ++ (sizeof (struct dataset) ++ + req->key_len), total, ++ (ttl == INT32_MAX ++ ? db->negtimeout : ttl)); + + /* This is the reply. */ + memcpy (&dataset->resp, resp, total); +@@ -257,15 +253,10 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req, + alloca_used = true; + } + +- dataset->head.allocsize = total + req->key_len; +- dataset->head.recsize = total - offsetof (struct dataset, resp); +- dataset->head.notfound = false; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- dataset->head.ttl = ttl == INT32_MAX ? db->postimeout : ttl; +- timeout = dataset->head.timeout = t + dataset->head.ttl; ++ timeout = datahead_init_pos (&dataset->head, total + req->key_len, ++ total - offsetof (struct dataset, resp), ++ he == NULL ? 0 : dh->nreloads + 1, ++ ttl == INT32_MAX ? db->postimeout : ttl); + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +diff --git glibc-2.17-c758a686/nscd/initgrcache.c glibc-2.17-c758a686/nscd/initgrcache.c +index 1bf9f0d..361319f 100644 +--- glibc-2.17-c758a686/nscd/initgrcache.c ++++ glibc-2.17-c758a686/nscd/initgrcache.c +@@ -213,14 +213,10 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req, + else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) + + req->key_len), 1)) != NULL) + { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = time (NULL) + db->negtimeout; ++ timeout = datahead_init_neg (&dataset->head, ++ (sizeof (struct dataset) ++ + req->key_len), total, ++ db->negtimeout); + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -276,14 +272,10 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req, + alloca_used = true; + } + +- dataset->head.allocsize = total + req->key_len; +- dataset->head.recsize = total - offsetof (struct dataset, resp); +- dataset->head.notfound = false; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = time (NULL) + db->postimeout; ++ timeout = datahead_init_pos (&dataset->head, total + req->key_len, ++ total - offsetof (struct dataset, resp), ++ he == NULL ? 0 : dh->nreloads + 1, ++ db->postimeout); + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +diff --git glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +index 820d823..b3d40e9 100644 +--- glibc-2.17-c758a686/nscd/netgroupcache.c ++++ glibc-2.17-c758a686/nscd/netgroupcache.c +@@ -90,15 +90,9 @@ do_notfound (struct database_dyn *db, int fd, request_header *req, + /* If we cannot permanently store the result, so be it. */ + if (dataset != NULL) + { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = time (NULL) + db->negtimeout; +- dataset->head.ttl = db->negtimeout; ++ timeout = datahead_init_neg (&dataset->head, ++ sizeof (struct dataset) + req->key_len, ++ total, db->negtimeout); + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -359,13 +353,10 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + + /* Fill in the dataset. */ + dataset = (struct dataset *) buffer; +- dataset->head.allocsize = total + req->key_len; +- dataset->head.recsize = total - offsetof (struct dataset, resp); +- dataset->head.notfound = false; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- dataset->head.ttl = db->postimeout; +- timeout = dataset->head.timeout = time (NULL) + dataset->head.ttl; ++ timeout = datahead_init_pos (&dataset->head, total + req->key_len, ++ total - offsetof (struct dataset, resp), ++ he == NULL ? 0 : dh->nreloads + 1, ++ db->postimeout); + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +@@ -541,12 +532,12 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, + dataset = &dataset_mem; + } + +- dataset->head.allocsize = sizeof (*dataset) + req->key_len; +- dataset->head.recsize = sizeof (innetgroup_response_header); ++ datahead_init_pos (&dataset->head, sizeof (*dataset) + req->key_len, ++ sizeof (innetgroup_response_header), ++ he == NULL ? 0 : dh->nreloads + 1, result->head.ttl); ++ /* Set the notfound status and timeout based on the result from ++ getnetgrent. */ + dataset->head.notfound = result->head.notfound; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- dataset->head.ttl = result->head.ttl; + dataset->head.timeout = timeout; + + dataset->resp.version = NSCD_VERSION; +diff --git glibc-2.17-c758a686/nscd/nscd-client.h glibc-2.17-c758a686/nscd/nscd-client.h +index 98f77e7..ee16df6 100644 +--- glibc-2.17-c758a686/nscd/nscd-client.h ++++ glibc-2.17-c758a686/nscd/nscd-client.h +@@ -236,6 +236,48 @@ struct datahead + } data[0]; + }; + ++static inline time_t ++datahead_init_common (struct datahead *head, nscd_ssize_t allocsize, ++ nscd_ssize_t recsize, uint32_t ttl) ++{ ++ /* Initialize so that we don't write out junk in uninitialized data to the ++ cache. */ ++ memset (head, 0, sizeof (*head)); ++ ++ head->allocsize = allocsize; ++ head->recsize = recsize; ++ head->usable = true; ++ ++ head->ttl = ttl; ++ ++ /* Compute and return the timeout time. */ ++ return head->timeout = time (NULL) + ttl; ++} ++ ++static inline time_t ++datahead_init_pos (struct datahead *head, nscd_ssize_t allocsize, ++ nscd_ssize_t recsize, uint8_t nreloads, uint32_t ttl) ++{ ++ time_t ret = datahead_init_common (head, allocsize, recsize, ttl); ++ ++ head->notfound = false; ++ head->nreloads = nreloads; ++ ++ return ret; ++} ++ ++static inline time_t ++datahead_init_neg (struct datahead *head, nscd_ssize_t allocsize, ++ nscd_ssize_t recsize, uint32_t ttl) ++{ ++ time_t ret = datahead_init_common (head, allocsize, recsize, ttl); ++ ++ /* We don't need to touch nreloads here since it is set to our desired value ++ (0) when we clear the structure. */ ++ head->notfound = true; ++ ++ return ret; ++} + + /* Structure for one hash table entry. */ + struct hashentry +diff --git glibc-2.17-c758a686/nscd/pwdcache.c glibc-2.17-c758a686/nscd/pwdcache.c +index fa355c3..41c245b 100644 +--- glibc-2.17-c758a686/nscd/pwdcache.c ++++ glibc-2.17-c758a686/nscd/pwdcache.c +@@ -135,14 +135,10 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, + else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) + + req->key_len), 1)) != NULL) + { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = t + db->negtimeout; ++ timeout = datahead_init_neg (&dataset->head, ++ (sizeof (struct dataset) ++ + req->key_len), total, ++ db->negtimeout); + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -215,14 +211,10 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, + alloca_used = true; + } + +- dataset->head.allocsize = total + n; +- dataset->head.recsize = total - offsetof (struct dataset, resp); +- dataset->head.notfound = false; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = t + db->postimeout; ++ timeout = datahead_init_pos (&dataset->head, total + n, ++ total - offsetof (struct dataset, resp), ++ he == NULL ? 0 : dh->nreloads + 1, ++ db->postimeout); + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +diff --git glibc-2.17-c758a686/nscd/servicescache.c glibc-2.17-c758a686/nscd/servicescache.c +index 12ce9b2..95bdcfe 100644 +--- glibc-2.17-c758a686/nscd/servicescache.c ++++ glibc-2.17-c758a686/nscd/servicescache.c +@@ -120,14 +120,10 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, + else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) + + req->key_len), 1)) != NULL) + { +- dataset->head.allocsize = sizeof (struct dataset) + req->key_len; +- dataset->head.recsize = total; +- dataset->head.notfound = true; +- dataset->head.nreloads = 0; +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = t + db->negtimeout; ++ timeout = datahead_init_neg (&dataset->head, ++ (sizeof (struct dataset) ++ + req->key_len), total, ++ db->negtimeout); + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -207,14 +203,10 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, + alloca_used = true; + } + +- dataset->head.allocsize = total + req->key_len; +- dataset->head.recsize = total - offsetof (struct dataset, resp); +- dataset->head.notfound = false; +- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1); +- dataset->head.usable = true; +- +- /* Compute the timeout time. */ +- timeout = dataset->head.timeout = t + db->postimeout; ++ timeout = datahead_init_pos (&dataset->head, total + req->key_len, ++ total - offsetof (struct dataset, resp), ++ he == NULL ? 0 : dh->nreloads + 1, ++ db->postimeout); + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; diff --git a/SOURCES/glibc-rh1083647.patch b/SOURCES/glibc-rh1083647.patch new file mode 100644 index 0000000..70d8b27 --- /dev/null +++ b/SOURCES/glibc-rh1083647.patch @@ -0,0 +1,26 @@ +commit c44496df2f090a56d3bf75df930592dac6bba46f +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Mar 12 17:27:22 2014 +0530 + + Provide correct buffer length to netgroup queries in nscd (BZ #16695) + + The buffer to query netgroup entries is allocated sufficient space for + the netgroup entries and the key to be appended at the end, but it + sends in an incorrect available length to the NSS netgroup query + functions, resulting in overflow of the buffer in some special cases. + The fix here is to factor in the key length when sending the available + buffer and buffer length to the query functions. + +diff --git glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +index 426d3c5..5ba1e1f 100644 +--- glibc-2.17-c758a686/nscd/netgroupcache.c ++++ glibc-2.17-c758a686/nscd/netgroupcache.c +@@ -202,7 +202,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + { + int e; + status = getfct.f (&data, buffer + buffilled, +- buflen - buffilled, &e); ++ buflen - buffilled - req->key_len, &e); + if (status == NSS_STATUS_RETURN + || status == NSS_STATUS_NOTFOUND) + /* This was either the last one for this group or the diff --git a/SOURCES/glibc-rh1084089.patch b/SOURCES/glibc-rh1084089.patch new file mode 100644 index 0000000..6c4e220 --- /dev/null +++ b/SOURCES/glibc-rh1084089.patch @@ -0,0 +1,65 @@ +diff -pruN glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/lowlevellock.c glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/lowlevellock.c +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/lowlevellock.c 2012-12-25 08:32:13.000000000 +0530 ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/lowlevellock.c 2014-09-05 21:50:56.982975803 +0530 +@@ -21,11 +21,13 @@ + #include <sysdep.h> + #include <lowlevellock.h> + #include <sys/time.h> ++#include <stap-probe.h> + + + void + __lll_lock_wait_private (int *futex) + { ++ LIBC_PROBE (lll_lock_wait_private, 1, futex); + if (*futex == 2) + lll_futex_wait (futex, 2, LLL_PRIVATE); + +@@ -39,6 +42,7 @@ __lll_lock_wait_private (int *futex) + void + __lll_lock_wait (int *futex, int private) + { ++ LIBC_PROBE (lll_lock_wait, 2, futex, FUTEX_WAIT | private); + if (*futex == 2) + lll_futex_wait (futex, 2, private); + +diff -pruN glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h 2012-12-25 08:32:13.000000000 +0530 ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h 2014-09-05 21:51:58.722483631 +0530 +@@ -19,6 +19,8 @@ + #ifndef _LOWLEVELLOCK_H + #define _LOWLEVELLOCK_H 1 + ++#include <stap-probe.h> ++ + #include <time.h> + #include <sys/param.h> + #include <bits/pthreadtypes.h> +@@ -106,6 +108,7 @@ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + \ ++ LIBC_PROBE (lll_futex_wake, 3, futexp, nr, private); \ + __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp), \ + __lll_private_flag (FUTEX_WAKE, private), \ + (nr), 0); \ +diff -pruN glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h +--- glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h 2012-12-25 08:32:13.000000000 +0530 ++++ glibc-2.17-c758a686/nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h 2014-09-05 21:51:58.722483631 +0530 +@@ -19,6 +19,8 @@ + #ifndef _LOWLEVELLOCK_H + #define _LOWLEVELLOCK_H 1 + ++#include <stap-probe.h> ++ + #include <time.h> + #include <sys/param.h> + #include <bits/pthreadtypes.h> +@@ -122,6 +124,7 @@ + register unsigned long int __r4 asm ("4") = (unsigned long int) (nr); \ + register unsigned long int __result asm ("2"); \ + \ ++ LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \ + __asm __volatile ("svc %b1" \ + : "=d" (__result) \ + : "i" (SYS_futex), "0" (__r2), "d" (__r3), "d" (__r4) \ diff --git a/SOURCES/glibc-rh1084395.patch b/SOURCES/glibc-rh1084395.patch new file mode 100644 index 0000000..dc7cc7e --- /dev/null +++ b/SOURCES/glibc-rh1084395.patch @@ -0,0 +1,28895 @@ +diff -urN glibc-2.17-c758a686/benchtests/acosh-inputs glibc-2.17-c758a686/benchtests/acosh-inputs +--- glibc-2.17-c758a686/benchtests/acosh-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/acosh-inputs 2015-06-20 21:22:16.295458166 -0400 +@@ -0,0 +1,303 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.6d46e7252da2fp388 ++0x1.c18cc3982093ep775 ++0x1.2e9a406645b9bp609 ++0x1.006d075b935c9p0 ++0x1.4d49f6cda4ceap0 ++0x1.e0ba4580ef871p21 ++0x1.ffab14f637eaap733 ++0x1.f0a22293c4ecbp852 ++0x1.24baf479f025cp0 ++0x1.91bc310a7648ep243 ++0x1.93d4c19692fbfp80 ++0x1.9eb0b40303dcap843 ++0x1.945a20aa092e2p4 ++0x1.ac2677a0ed292p0 ++0x1.64c6a3d5a0867p304 ++0x1.e0d6324c882e9p0 ++0x1.7e0ba7c987b9ep7 ++0x1.3975f02686229p10 ++0x1.cc4916f089070p25 ++0x1.729be339c67b2p0 ++0x1.c64b8297569c4p207 ++0x1.2c1544d816155p340 ++0x1.ad443265c6b4ap845 ++0x1.f53624533eb2cp0 ++0x1.92e4800542f83p108 ++0x1.f873e456e1975p0 ++0x1.84a7b4b80f227p4 ++0x1.46dd43031fe1fp0 ++0x1.e28b805a73a97p0 ++0x1.9e11325b1c3c4p22 ++0x1.5c76b43d66941p15 ++0x1.98109155dd7bfp21 ++0x1.3d88b121650aap8 ++0x1.adff01fab2117p0 ++0x1.5e76d52c7f729p15 ++0x1.0a46e3262c2b8p20 ++0x1.52f9a11ad6e66p0 ++0x1.96f8f26a41c3bp122 ++0x1.161fd6fd320d5p745 ++0x1.c5fb927d2cb09p8 ++0x1.265a61a0bb1d4p0 ++0x1.09a5d681397d0p0 ++0x1.ebef22f6aa8aap0 ++0x1.3ac9b75c613bdp160 ++0x1.b77615a1e2a3ap0 ++0x1.68f9d755d5eadp0 ++0x1.ed2c9188571d9p0 ++0x1.e8f886346b284p15 ++0x1.f65bd2ce4416ap0 ++0x1.4574341b05968p656 ++0x1.5c2cb3414299cp154 ++0x1.c4ea7682d0661p832 ++0x1.b221562a61af2p0 ++0x1.d7f9c739e0b26p561 ++0x1.eb28429726661p423 ++0x1.e7a5f5b2cc9e8p902 ++0x1.9fd093db922f4p0 ++0x1.c1cb5159d4e46p0 ++0x1.a0bed3234b8cdp0 ++0x1.bc8ff7e59e82ep18 ++0x1.de8f25287ff7cp0 ++0x1.a1ab66b8f9098p0 ++0x1.c36c11c290063p20 ++0x1.72e9e736d6e41p0 ++0x1.38b134391f71ep21 ++0x1.a500e5cf1a2cfp246 ++0x1.253da08c9c318p144 ++0x1.f5efb379e3b3fp952 ++0x1.07c767a225a7bp21 ++0x1.f82770adf361dp19 ++0x1.39e42524c048ep894 ++0x1.a4ae84e202a44p0 ++0x1.e17e23b598415p925 ++0x1.08fa931bd21f5p10 ++0x1.b52541759872ep0 ++0x1.91bf33cdb6804p710 ++0x1.5c18505e522d6p0 ++0x1.9fe7c5ca15212p9 ++0x1.62c360b992b13p10 ++0x1.57a000ceee049p800 ++0x1.da296671c3e5cp0 ++0x1.ff43325a40608p0 ++0x1.295d65809666fp111 ++0x1.2781e3f5d0e0fp249 ++0x1.875d5703776fcp0 ++0x1.0f8045a313158p26 ++0x1.bd30a3b638a67p11 ++0x1.0a3184db8d287p0 ++0x1.c6d33006f978ep0 ++0x1.8c6476a610245p0 ++0x1.aa7fc36f3cea9p461 ++0x1.afb5c0c4f933ap6 ++0x1.20b75365bd50fp16 ++0x1.69c8245c09535p19 ++0x1.30dcf0414c561p292 ++0x1.c2323455e5501p0 ++0x1.c2e3d08f78fb2p0 ++0x1.f479457ec8f4fp25 ++0x1.4c1e32e79005dp7 ++0x1.86b9a4aed3300p26 ++0x1.ee654167b045bp0 ++0x1.a339c796ccd9fp0 ++0x1.75f6f32348765p4 ++0x1.6120d7e4e5d9ep498 ++0x1.01c843ae8b440p20 ++0x1.034a67c534113p0 ++0x1.94d6d681be7e6p0 ++0x1.2576745f4cca6p22 ++0x1.813994f759a60p171 ++0x1.0308a4c5b820dp0 ++0x1.d073e0e895907p580 ++0x1.6094d2dc7af3bp0 ++0x1.3348d7ba303bep0 ++0x1.a0830483382afp2 ++0x1.e3558408e36dep0 ++0x1.d55db05590c97p0 ++0x1.95680648261ecp0 ++0x1.d54c401b55bd9p18 ++0x1.584be75027a11p872 ++0x1.594273cdd339dp4 ++0x1.85d9676b1ae49p752 ++0x1.38f122e7f7be0p220 ++0x1.75c3a575deb13p251 ++0x1.2c85f1a74ac0fp0 ++0x1.0dc9e789128acp947 ++0x1.51dbf3461a224p0 ++0x1.61c9644526617p809 ++0x1.89494217ed887p204 ++0x1.2a57014d8c24bp317 ++0x1.c4d527df0d553p762 ++0x1.ad2717638f0adp986 ++0x1.63352752d72c5p847 ++0x1.d124a052e9410p0 ++0x1.373d228ee6061p505 ++0x1.0bbe63d8b48d2p0 ++0x1.0b5115dd5774dp4 ++0x1.f50d62ef77ac6p3 ++0x1.4cb6110ea61e4p1 ++0x1.b056b690aef8ap0 ++0x1.a32cd47340669p2 ++0x1.f917868895288p872 ++0x1.332a86c10c0e1p14 ++0x1.07f7c34023735p881 ++0x1.7935f21efcfadp24 ++0x1.644ad1a392b18p0 ++0x1.f930b772bba49p0 ++0x1.019a86d2e2300p18 ++0x1.a25af297e68fep194 ++0x1.80ab316f210c8p0 ++0x1.f73a3049f9d76p16 ++0x1.8b1a0407ae636p7 ++0x1.9bdf23a917930p2 ++0x1.d139574e3913ep168 ++0x1.caf9468b5f459p0 ++0x1.c3b5f0096df0dp24 ++0x1.d3451096baf1ep0 ++0x1.7bb5671e2bfcap719 ++0x1.64b7e3621a6ddp0 ++0x1.08b544290bb37p0 ++0x1.2b65c78ec87a4p0 ++0x1.993a6363227e2p12 ++0x1.a09d26d2a558fp216 ++0x1.daff104bb08a5p25 ++0x1.7d77308fd73cap655 ++0x1.8946b691ecf5ap10 ++0x1.8ec222d562aa9p25 ++0x1.b7da17cd3268ap0 ++0x1.250500a0b4266p831 ++0x1.8e6f071075758p0 ++0x1.984146d8a6c69p20 ++0x1.558480e0da8bdp15 ++0x1.b6bea5e996fdbp11 ++0x1.f289853c632ddp11 ++0x1.8fbe179f273aap0 ++0x1.6b4382f669e8dp0 ++0x1.a966a17972ca9p601 ++0x1.dbd635362ec6bp6 ++0x1.899e75c43e065p675 ++0x1.f11c07e219bafp7 ++0x1.3ab637a02ed36p0 ++0x1.36b913a68fe70p901 ++0x1.049fe294eb450p0 ++0x1.0547247e7518ap677 ++0x1.9e07054aa7309p743 ++0x1.aff281fbb3a6ap874 ++0x1.6c1b6312efacfp783 ++0x1.a38c639c0df57p243 ++0x1.f07b95fd415ccp9 ++0x1.ca1c23fd6ce37p7 ++0x1.9ed9906a6f029p18 ++0x1.f1a483c62adecp74 ++0x1.617df662bbf02p0 ++0x1.22e1608c31f55p13 ++0x1.d840853d46285p15 ++0x1.023fd69d438dep12 ++0x1.8184a3fcc1ac3p942 ++0x1.25c5071d2dc6ep8 ++0x1.0eec25d2a59ccp27 ++0x1.d55b11ee07cc4p0 ++0x1.175347bf29152p23 ++0x1.546624c66c38bp0 ++0x1.212fc4abebddep723 ++0x1.75f1269063e4dp5 ++0x1.3b51233fed0a5p381 ++0x1.486e24ad660e1p686 ++0x1.7788055510c4dp23 ++0x1.55bf96fcf9458p905 ++0x1.0a5aa2d61be59p0 ++0x1.5da757c1a95c6p895 ++0x1.d596e1ea9dcefp0 ++0x1.e91b460893372p0 ++0x1.d934d6ea17649p728 ++0x1.cd74423b4c4aep15 ++0x1.dc3151a1b4289p0 ++0x1.5799c072442dep0 ++0x1.97ae606371057p22 ++0x1.7369c3195238ap0 ++0x1.43a1d0e6eae29p109 ++0x1.7fd922252a24ep425 ++0x1.bf01d7e826d2cp0 ++0x1.a397b7c711fcfp14 ++0x1.7b40809d9f6b5p0 ++0x1.58098134bf6afp0 ++0x1.567e92bdee806p3 ++0x1.641866cfab5e7p382 ++0x1.11d483657f659p0 ++0x1.f0b1d4cd82236p18 ++0x1.a18365ad84301p6 ++0x1.4f749259eb02dp140 ++0x1.4b1d721633901p747 ++0x1.fa9e9543d1dfbp5 ++0x1.ae33e3ae5e0ecp0 ++0x1.29c444207fa90p0 ++0x1.b55e708600082p19 ++0x1.bb1464c1f136fp0 ++0x1.d36f165b63b8fp880 ++0x1.c1a0d0ee96f75p27 ++0x1.9b1376e7377a3p0 ++0x1.6e88361aa13bbp619 ++0x1.d109f410d341bp822 ++0x1.654255768c727p0 ++0x1.c938959e450d6p0 ++0x1.26fd92ae3e170p356 ++0x1.157c240adb715p982 ++0x1.749735f182597p15 ++0x1.2291e3ab7501cp0 ++0x1.96d320a0153bap383 ++0x1.b569919b79b6fp214 ++0x1.0872c2cff972dp276 ++0x1.bd98342544357p0 ++0x1.853327d0e2f4dp11 ++0x1.23438314fb10bp0 ++0x1.342f35eabf622p707 ++0x1.d19f05a5a1fe4p13 ++0x1.67c566bcf73aap0 ++0x1.2ce065238fb73p27 ++0x1.5219d2e05f184p0 ++0x1.4a163440f7c98p4 ++0x1.d780c4711b212p0 ++0x1.395461c5f96a6p5 ++0x1.21efa25110e19p12 ++0x1.c9ddf4f375933p17 ++0x1.3da0800fe1f5ep0 ++0x1.90f147b3d0164p829 ++0x1.001d955d8a436p344 ++0x1.c6b2115b84675p319 ++0x1.650441a7059bdp554 ++0x1.3a49216bbe75ep0 ++0x1.fdd3c3404c763p750 ++0x1.0b97d555f912cp1 ++0x1.95c32605e6c59p20 ++0x1.6acfa746531b2p0 ++0x1.13f4d3bbd6417p8 ++0x1.ac31b628eaa2cp0 ++0x1.4293b3d3169d2p8 ++0x1.6e8a94f758a02p802 ++0x1.701604374d526p0 ++0x1.bec162f84a16cp13 ++0x1.2015764e98ea6p481 ++0x1.b9d12441e91a7p11 ++0x1.55a4c648ebcc2p378 ++0x1.65b6e4f33cc66p0 ++0x1.b12c01289b0c4p15 ++0x1.ce91f580c5091p228 ++0x1.719ec056f57fep1 ++0x1.0b2c87979b28cp23 ++0x1.218c0592aa7fcp95 ++0x1.ec1e878f29cf8p97 ++0x1.adc8d213f43b1p0 ++0x1.e788f6152fe51p0 ++0x1.a026b0485c0e8p12 ++0x1.f181e3ec38f77p3 ++0x1.dafd9764a705fp13 ++0x1.a292f29dfe6c4p0 ++0x1.661d765a50087p13 ++0x1.f619932e8e376p1010 ++0x1.4a1600b2e95dbp880 ++0x1.f5b95104bb64dp320 ++0x1.a7a935f93958ap22 ++0x1.5fe3a6a58526dp20 +diff -urN glibc-2.17-c758a686/benchtests/acos-inputs glibc-2.17-c758a686/benchtests/acos-inputs +--- glibc-2.17-c758a686/benchtests/acos-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/acos-inputs 2015-06-20 21:22:16.295458166 -0400 +@@ -0,0 +1,2712 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.e9ba80c1b0cc6p-1 ++0x1.0c06540e252bdp-3 ++0x1.eda8e7c0a34bfp-1 ++-0x1.fe8e777376d24p-1 ++0x1.cb1673c92f0c9p-1 ++0x1.e9ec316d0de94p-1 ++0x1.7307e45a9bfb6p-5 ++0x1.c16b847c92f30p-3 ++0x1.cf0d270e371f6p-1 ++0x1.129af5729ef19p-1 ++0x1.bce5d0689ab4ep-1 ++0x1.2952217220937p-1 ++0x1.1c76822aee340p-1 ++0x1.e24a2187c1a7ap-1 ++0x1.f952508426fa4p-1 ++-0x1.e800444223cecp-1 ++0x1.edbc56657e3b4p-1 ++0x1.5bcc935e4afc7p-1 ++-0x1.e008619377db7p-1 ++0x1.e7ca21e5cb233p-1 ++0x1.c426411a0bd0ep-1 ++-0x1.54b193e5a6106p-1 ++0x1.ef45d30d3aaeap-1 ++-0x1.0a7fa1bbcb68ep-18 ++0x1.7b4f05763d852p-1 ++0x1.dbc0233bcbacdp-1 ++-0x1.f9ecd08896017p-1 ++0x1.933a30bb5aecbp-1 ++0x1.d87450bf54160p-2 ++0x1.e74342dc955f8p-1 ++0x1.e46ab59e4b1eep-1 ++0x1.fde01341b468cp-1 ++-0x1.989e4472a3f0cp-1 ++0x1.e098a4166e777p-1 ++0x1.566335c979611p-1 ++0x1.596d3268f925ap-1 ++0x1.219017042f1fep-1 ++0x1.ecc867fb960bfp-1 ++0x1.b60655bef4f13p-3 ++0x1.f4a57127c7a0cp-1 ++-0x1.f62ee5fe0cadfp-1 ++0x1.3cd7211d9ad3dp-1 ++0x1.9df0943df0ed7p-1 ++0x1.ea161524e7d47p-1 ++0x1.e55a50493b1a9p-1 ++0x1.ec8561690ba28p-1 ++0x1.f16282757d76ap-1 ++0x1.51e1f7c96d12bp-1 ++-0x1.9e34b40c77bdbp-1 ++0x1.1703345163fc4p-1 ++0x1.4bc66758655fap-1 ++0x1.b153d53781d7dp-1 ++-0x1.f9ad04c73d758p-6 ++0x1.ee83a64fcc712p-1 ++-0x1.26b3228cfdb15p-1 ++0x1.a2c1325da062fp-1 ++0x1.eacf918428269p-1 ++0x1.210c161c12427p-1 ++0x1.8f4653c521ef3p-1 ++-0x1.3d666235ebc4dp-1 ++0x1.fbf321159facbp-1 ++0x1.fb0ae69837b58p-1 ++0x1.e7add59a28c21p-1 ++-0x1.b3931490e5c15p-22 ++-0x1.62bb903865b73p-7 ++0x1.d8d4c3d683cd2p-1 ++-0x1.f414e43e31308p-1 ++0x1.e85ef4b7677afp-1 ++0x1.8e5c2284c58ebp-1 ++0x1.350fc6069df8ap-1 ++0x1.b156a051f0bd8p-1 ++-0x1.cd2350b2a476cp-3 ++0x1.f2cd66a92c33ap-1 ++-0x1.e9d4a5abc7463p-1 ++0x1.edf3474fdf1bfp-1 ++0x1.ded3e00b45be7p-1 ++0x1.ecca5018f3375p-1 ++-0x1.f784a20ae007ep-1 ++0x1.79cd244068e29p-3 ++0x1.0520d4698e9c4p-1 ++0x1.df7633193349fp-1 ++0x1.eeacc7895ee01p-1 ++-0x1.cbddd66bebde8p-1 ++0x1.eaaab5eed4d48p-1 ++-0x1.b786c6d51b98dp-1 ++-0x1.61c366c7c79fap-3 ++0x1.f6f55566f3c9dp-1 ++-0x1.8455d26a48743p-1 ++-0x1.f027619f4ec1cp-1 ++0x1.4de6d77cd7b97p-2 ++-0x1.2d45e43d1b629p-1 ++0x1.dd061720e456ap-1 ++0x1.3bfb31bd7ed4ep-3 ++0x1.f35563c6fc9e1p-1 ++-0x1.da4995d5cee72p-1 ++0x1.a96983d9102b9p-1 ++0x1.e004440ae8f05p-1 ++0x1.e53b304fb4d06p-3 ++-0x1.f03185a1019d1p-1 ++0x1.8676b01d07ce0p-1 ++0x1.ea1916d533f0dp-1 ++0x1.03a04519c4e1fp-1 ++-0x1.e8ac5756ef915p-1 ++0x1.4d6bf1a203446p-4 ++0x1.d981a70cd845bp-1 ++0x1.1c125719eaaf8p-3 ++0x1.e85fb3990f27ap-1 ++0x1.e8e035a26d083p-1 ++0x1.cbfe848a09c42p-3 ++-0x1.e06e527c5ae19p-14 ++-0x1.bbd103472cef1p-25 ++-0x1.feed81508a469p-1 ++-0x1.dab671cd03097p-2 ++0x1.ea30578b17269p-1 ++0x1.6d0684ce3aa60p-8 ++0x1.66d50185eedb5p-2 ++0x1.e74243adbcc15p-1 ++-0x1.f64db1b1939aap-1 ++-0x1.ebd6465bc4b63p-1 ++0x1.e006e50dea620p-3 ++-0x1.c2fcf77c4861dp-1 ++-0x1.e632b5939513cp-1 ++-0x1.9ab8b4c3cb0b4p-1 ++-0x1.3a3bc41b1b0fcp-2 ++0x1.3372c7d8d3206p-25 ++-0x1.fd74373268dbbp-1 ++0x1.f4e100915be05p-1 ++0x1.9bc0232dfa0efp-1 ++-0x1.cc03e1478de39p-4 ++0x1.e93d0775eb299p-1 ++-0x1.a2bb4749faabep-3 ++-0x1.f052a40d8e48bp-1 ++0x1.c07334b1aac33p-26 ++-0x1.13463673ea539p-3 ++0x1.d66e5598d3262p-25 ++0x1.0dae423f0189ep-2 ++0x1.df1a0195dfca4p-1 ++-0x1.598e9260d11fdp-1 ++0x1.67c773c2070cep-1 ++-0x1.ed1f510c9ce11p-1 ++0x1.dae297d5d3bafp-2 ++-0x1.39af35b44da1fp-2 ++-0x1.c679d76fc2b15p-3 ++0x1.88f507621e546p-2 ++0x1.f702c7007d0f8p-1 ++0x1.f2ef13107c805p-1 ++0x1.e4bcf61e9db8ep-1 ++0x1.3bbb12f88beeap-1 ++-0x1.fdb1502db4889p-1 ++0x1.3318578e20bc0p-1 ++0x1.e9de7563a7493p-1 ++0x1.6188f44707072p-1 ++0x1.f8903254e120cp-1 ++-0x1.f38db4b985d52p-1 ++-0x1.cbccf0e19cc7fp-3 ++-0x1.be12773f273cdp-10 ++-0x1.2b3e149bb0426p-2 ++0x1.ad69976c033a1p-1 ++0x1.edd13194f87aep-1 ++-0x1.18a974fd7bbebp-1 ++0x1.9f1fc231a2241p-1 ++0x1.10e56678c706ap-25 ++-0x1.da0f94397e1efp-1 ++-0x1.76c026d8ec2b4p-1 ++0x1.0a089692fa9d6p-1 ++-0x1.da1ff0b273cd7p-3 ++-0x1.f97015d611b73p-1 ++0x1.dbe9c72d38923p-1 ++0x1.bad6c26512dbcp-1 ++-0x1.fb6fb5159af3ep-1 ++-0x1.9198b69ff20eep-3 ++-0x1.fe0c97242979ap-1 ++0x1.2287403404baep-1 ++-0x1.f3f5449170a5dp-1 ++0x1.f3a6840c57d33p-1 ++-0x1.03c0045400546p-1 ++0x1.f838e0db37795p-1 ++-0x1.7accc66f1a867p-1 ++0x1.e82562eb8444fp-1 ++0x1.df27b76e86704p-1 ++0x1.f4da573b55ec2p-1 ++0x1.efe5a6e5fbe8bp-1 ++0x1.0659847830f85p-1 ++0x1.e32184673d6a3p-1 ++-0x1.fea5968e2edf9p-1 ++0x1.466c21bdb53d6p-1 ++0x1.e7078679d9affp-1 ++0x1.befbe4ecbe8cbp-1 ++-0x1.e2d534c706c26p-18 ++0x1.32616231a62c1p-26 ++0x1.54edc38ae367fp-1 ++-0x1.3007019386da4p-5 ++-0x1.a336f67af7129p-1 ++-0x1.8c2257c536d60p-2 ++-0x1.84d896f47ecd4p-1 ++0x1.977af609a6d12p-18 ++0x1.e932a72cac166p-2 ++0x1.2945179c842bap-1 ++0x1.4a5182138dbd3p-3 ++0x1.dbe2458d35539p-1 ++0x1.1f1092dd29f91p-1 ++0x1.dc693710eb9b2p-1 ++0x1.ecb8b2274a503p-1 ++0x1.412eb424708fap-1 ++0x1.93ca610ea7b0cp-1 ++0x1.563fa238b86bfp-3 ++0x1.6cc3c369c6079p-1 ++0x1.f783b429dc0f3p-1 ++0x1.9b875417727f6p-1 ++-0x1.a03c44361af74p-1 ++0x1.f577461815545p-1 ++-0x1.1b83d2880ad3bp-1 ++-0x1.2850a5ece60c7p-22 ++0x1.03ce907b337a2p-7 ++0x1.e13907a8a623bp-1 ++0x1.ea3a84b97d192p-1 ++-0x1.a41072eb8d471p-1 ++0x1.eb4c15b45d01ep-1 ++-0x1.101d32f8c74c8p-1 ++0x1.0193b3f4d9074p-3 ++-0x1.537154d5f6ae7p-3 ++0x1.bfaf90a91ac01p-1 ++-0x1.0c10917ddebb8p-1 ++-0x1.8eadf732729dcp-21 ++0x1.e86b603c02c7fp-1 ++-0x1.e1d732a3d845ep-1 ++0x1.f11cd0a6f6f03p-13 ++0x1.8d26805424934p-3 ++0x1.f145109d6bdccp-1 ++0x1.c543a6761e121p-1 ++-0x1.c25a322cf34eap-2 ++-0x1.865940819f5fcp-1 ++0x1.dc04807986da6p-1 ++0x1.ed429667932c9p-1 ++-0x1.76fd636ed6498p-2 ++-0x1.e53ac26588b25p-1 ++-0x1.8f5d4684f487ap-1 ++0x1.e09a34d1ff29bp-1 ++-0x1.fa9d102a95505p-1 ++0x1.1b05e56138440p-3 ++0x1.1bc9a7f1d79eap-3 ++-0x1.6811368ab0abbp-1 ++0x1.ed98e0214a336p-1 ++0x1.e7e686da575a0p-1 ++-0x1.965f75ff798a9p-1 ++0x1.80eaa23a91ec2p-1 ++-0x1.d36fb043f6300p-5 ++0x1.7018a38a05ffdp-2 ++0x1.fae070244fb19p-1 ++0x1.d0dd401b30198p-1 ++0x1.42f142dadfa1dp-1 ++0x1.ec68818823d1dp-1 ++0x1.85f3e7bec93a0p-1 ++0x1.af29d1ff6c1dap-2 ++0x1.35c4a6805cca0p-1 ++0x1.df0b063501081p-1 ++0x1.5bcd000b70207p-2 ++0x1.a24de48ee748dp-1 ++-0x1.6a318265b0ce0p-1 ++0x1.c534f40a7def8p-3 ++-0x1.9f4e543169174p-1 ++0x1.f2de70648aed5p-1 ++0x1.fe8ab52a90cb0p-1 ++-0x1.f680253c19250p-1 ++-0x1.fc63569b7f833p-1 ++-0x1.6b2935d76744bp-1 ++0x1.ea5f006b8edcep-1 ++-0x1.5342e394b5397p-1 ++0x1.ec4706c41bd83p-16 ++-0x1.b7a5b13013786p-3 ++0x1.efc8b1d13cab4p-1 ++0x1.f524140aa4f9fp-1 ++-0x1.8d59b2246d1b5p-2 ++-0x1.e10a8025fd5c2p-1 ++0x1.ffe555d68b776p-1 ++0x1.5ccb0133fca6ep-2 ++0x1.47b60350a0542p-1 ++0x1.f3d4414a57242p-1 ++-0x1.4c94d139f13e8p-1 ++-0x1.f598238e275f3p-1 ++0x1.818fb41d76b85p-1 ++-0x1.fa14d2d9c0775p-11 ++0x1.f16ec2400aebap-1 ++-0x1.eac587507894dp-1 ++0x1.f20e64bfc7419p-1 ++-0x1.85ce9765938ccp-3 ++0x1.92bff695a5d90p-1 ++-0x1.8d0a2047280efp-2 ++-0x1.2559e3d4e777dp-22 ++0x1.e8390104997a7p-1 ++0x1.e99044f21a5c8p-1 ++-0x1.ea12258aac145p-1 ++0x1.f68a246001b3cp-1 ++0x1.db5b870d933e5p-1 ++0x1.a140f339c5bdep-20 ++0x1.8193402b5c8ecp-1 ++-0x1.04d5676a38199p-12 ++0x1.a455655209ff8p-1 ++-0x1.e63ba4f3d8c3ep-1 ++-0x1.6a28d15928650p-1 ++-0x1.64b6d0a25c33dp-9 ++0x1.46915799cfaccp-1 ++-0x1.fbd157a2c23b1p-3 ++0x1.ffa3663aba6d5p-1 ++0x1.411d129126d0dp-1 ++0x1.7063d30f52d4dp-1 ++0x1.8201c2f453059p-1 ++-0x1.f27a071cddd3bp-15 ++0x1.7aca32522bbf5p-6 ++0x1.c9846775a72c1p-3 ++0x1.6d082285276a9p-15 ++0x1.c6a6b4f8f837ep-24 ++0x1.ee27e42a2b26bp-1 ++0x1.e191c47dea938p-1 ++0x1.44b0e7864ee92p-2 ++0x1.9c4882b7b62cap-1 ++0x1.20b6f0f17af05p-3 ++0x1.0301e36c00af6p-1 ++0x1.dfe705d59ecb0p-1 ++-0x1.dbead5cf594d7p-1 ++0x1.f12b06bbb4e7bp-3 ++0x1.efe8c7612f386p-1 ++-0x1.eb9e2463b8a3ap-1 ++-0x1.faf13348b1a37p-1 ++0x1.cd50167950c5ep-1 ++0x1.dba5c79d7a05ep-1 ++-0x1.a334d05fa6dd2p-1 ++0x1.8cb1a630bb9c2p-1 ++-0x1.9681e2cf54b70p-1 ++0x1.39aca667fcf3fp-1 ++-0x1.e8bd029d083e4p-2 ++-0x1.50e857e4f8090p-1 ++0x1.dc16134a07952p-1 ++0x1.2c4bb22847712p-1 ++0x1.e7b0645e8a0abp-9 ++-0x1.8fc066ee56befp-11 ++0x1.edbf80f8c492cp-1 ++0x1.e3d6a1c24d10cp-1 ++-0x1.fbd4f63a7219dp-1 ++0x1.f6fd10b1bdf09p-3 ++-0x1.6530f1b557057p-1 ++0x1.b88262a6e1331p-1 ++-0x1.eb0e3015adc06p-1 ++-0x1.26cfc26e19c43p-3 ++0x1.59bc70a355e7fp-2 ++0x1.5fee801ec378cp-1 ++0x1.154984a08fb2ap-1 ++-0x1.75a356a8a9292p-5 ++0x1.ea9314dc90613p-1 ++0x1.ea2107288cf84p-1 ++-0x1.ebe7414198207p-1 ++0x1.65aee12e3ceffp-1 ++-0x1.51ba6636b9f2fp-15 ++-0x1.c626d4507f69ap-1 ++-0x1.e2e3f55bb23a1p-1 ++0x1.98b000eb73a71p-1 ++0x1.43af03a6b9b8dp-3 ++-0x1.7f2ab3a80ac43p-1 ++0x1.d9d2a5d6d0097p-1 ++0x1.e3f984fc9c133p-1 ++-0x1.afeb916e3177fp-21 ++0x1.4e04b4277b006p-1 ++0x1.efe0107fb5684p-1 ++-0x1.4515b4c2b21dap-1 ++0x1.11a6b0c515920p-1 ++0x1.6164a6618d12ep-21 ++0x1.dae745520e0c5p-1 ++-0x1.dd2d72e85c929p-1 ++0x1.6d9ef5d5611fbp-1 ++-0x1.f0f797fed0a55p-1 ++0x1.2eab0154ef308p-1 ++0x1.ed1fd3af0b556p-1 ++-0x1.e71b754c98246p-2 ++-0x1.2590214dd2a24p-3 ++0x1.fdd1961109848p-1 ++0x1.7eb1071ff2770p-1 ++-0x1.15bd45916de1ep-2 ++-0x1.44d715ad68f89p-1 ++-0x1.7641422787614p-1 ++0x1.eefe328d3d881p-1 ++-0x1.eca8704b551c7p-1 ++0x1.2ee67226d5529p-1 ++0x1.e8ac53c1395d3p-1 ++-0x1.64646108e67cbp-1 ++0x1.db91c36140425p-1 ++0x1.4605c5134237bp-1 ++0x1.f903e462cc94dp-1 ++-0x1.73f4c75c9d5f2p-1 ++-0x1.dac8a6d776479p-1 ++-0x1.2b4492bd73b64p-15 ++-0x1.373103fbf2dbbp-26 ++0x1.851581e8ee5f8p-8 ++0x1.ebca3047b32cfp-1 ++-0x1.07c16329a6368p-1 ++0x1.fccc50d54ff1fp-1 ++0x1.fe9de2486d607p-1 ++0x1.ef48b46c9b643p-1 ++0x1.e8ef618c8024bp-1 ++0x1.993fe684e622bp-1 ++0x1.460b45e598a8cp-12 ++-0x1.d9e786749e8b9p-3 ++-0x1.559071a09ac62p-1 ++0x1.ef7432ff2df38p-1 ++0x1.e45a36a5fb72fp-3 ++0x1.b3d5275cfb554p-1 ++-0x1.98e8e522e4a82p-23 ++-0x1.02aed44057b67p-2 ++0x1.2197f1f7c6e26p-1 ++0x1.0837b5e1cec38p-1 ++-0x1.ca8a4237c9e0cp-17 ++0x1.6006c4b0268aap-1 ++-0x1.7208a0ee99588p-18 ++0x1.b4b1e471a5f5fp-26 ++0x1.8fe1f13a9702cp-1 ++0x1.f02b227033d9ap-1 ++0x1.d97ec10440781p-1 ++0x1.f76fb1e91d5b2p-1 ++0x1.deb247936f19fp-1 ++0x1.8af0f66d4b0dcp-12 ++-0x1.b64be0350cfd6p-1 ++-0x1.f932f26d539d5p-1 ++0x1.e82a219e74d13p-1 ++-0x1.7e09139513a33p-26 ++0x1.18f8069a74b77p-1 ++0x1.dc6726bfa7475p-1 ++0x1.08c813e4436a5p-2 ++-0x1.d8320749306c8p-16 ++0x1.9472944ec390dp-1 ++-0x1.a99987154cea1p-1 ++0x1.c882368b557a4p-1 ++-0x1.1aa794570d691p-3 ++0x1.5c77249e4aea0p-1 ++0x1.eb9813be6a2b6p-1 ++0x1.f431a44ef4d40p-1 ++0x1.eea5d7d2221dap-1 ++0x1.2c6291d7f2ad7p-2 ++0x1.ac443697d70fdp-1 ++0x1.e20ca7c2912a5p-1 ++0x1.7ab1d7104d182p-18 ++0x1.339513d5d0ee8p-1 ++0x1.f589b5ee62b16p-1 ++-0x1.fad8f2a47e9f4p-1 ++-0x1.1dd663fac6b4fp-1 ++-0x1.0f9652222f8e9p-1 ++0x1.f35714209b7bdp-1 ++0x1.6834569b7a1fap-1 ++0x1.00dd565cc9ccfp-15 ++0x1.65da25ab2220cp-1 ++0x1.d84fa7357d48fp-1 ++-0x1.c51a11571e3e9p-1 ++0x1.f381b3df02583p-1 ++0x1.fbf8c33676a44p-1 ++0x1.82bc413c6aff0p-1 ++0x1.0dca9008fbcebp-2 ++0x1.235506540c7b9p-1 ++-0x1.3e3c739c48dc4p-1 ++-0x1.f73153b059fbap-1 ++0x1.cc56d349d03bap-2 ++-0x1.53099013f8190p-2 ++0x1.e53de61c37f3ap-1 ++0x1.a6a246bf1a535p-22 ++0x1.91d3b66fca3a2p-1 ++0x1.0f5d16ce3edabp-12 ++-0x1.9a7b92e12b5f7p-1 ++-0x1.76ca124cf6f47p-3 ++-0x1.c41b9411e2424p-1 ++-0x1.34c885f2eb328p-1 ++0x1.ec1e45f6f7b9dp-1 ++0x1.0a4775720ed55p-1 ++-0x1.31efb599b0c90p-1 ++0x1.edbe60062d7a3p-1 ++0x1.2319304ed36b5p-1 ++-0x1.cb6aa416f444fp-4 ++0x1.504f676650b1ep-1 ++0x1.3d1aa4401c058p-3 ++-0x1.f60c37def0ad1p-1 ++0x1.f9792648513f5p-1 ++0x1.94a7e574d0288p-1 ++0x1.94f7926ce6fbcp-18 ++-0x1.f6fad097104e4p-1 ++0x1.3088005339ad3p-1 ++0x1.f03355e0191c2p-1 ++0x1.dcd3d17610280p-1 ++0x1.e05d2667abb1fp-1 ++0x1.e82525f9fbf01p-1 ++-0x1.de3ca0ef987b7p-1 ++0x1.f59943ba80acep-1 ++-0x1.e960c36a66790p-1 ++0x1.9d26903f5cd50p-10 ++-0x1.89bec5921086fp-1 ++-0x1.f4e8b5ec98f6cp-20 ++-0x1.711982a677be4p-3 ++0x1.f46112d3fe843p-1 ++0x1.083e13f8fffefp-1 ++-0x1.baf382671db8ap-1 ++0x1.e0d881ff65497p-1 ++-0x1.45bc320aa4dfep-2 ++0x1.40e3e60b110dcp-1 ++-0x1.f4e3046089560p-1 ++-0x1.ea56c46279081p-1 ++0x1.e9e48261cb26ep-1 ++0x1.4d48f2887cd66p-2 ++0x1.e51d745ef2138p-1 ++0x1.ae3d476739166p-1 ++-0x1.3b19c402e1ab5p-1 ++0x1.93db32ee991c6p-1 ++0x1.159cd3c2eac06p-2 ++0x1.f2196713b8de3p-3 ++0x1.c3c4d2e87e40cp-5 ++0x1.546b31afe7b81p-3 ++0x1.1cd7423631f45p-23 ++-0x1.f98921eb79da8p-1 ++0x1.da4473bb667adp-1 ++0x1.f6d1c21979168p-1 ++-0x1.f83452138ebc1p-1 ++-0x1.77e2149e4a15bp-1 ++-0x1.e374023473851p-1 ++0x1.6135557835b0ep-1 ++0x1.116497cc82db6p-1 ++-0x1.d604e43246f1ap-1 ++0x1.e03ba16e3b2d0p-1 ++-0x1.fbcc51c3d0adap-1 ++-0x1.230833754cbadp-1 ++-0x1.e859b3f551706p-1 ++0x1.8ed6352b2279fp-1 ++0x1.e833c05936a7ep-1 ++-0x1.f45f124fb19f4p-1 ++-0x1.bcc7e5fa33d67p-1 ++0x1.cb5bf39c4168fp-1 ++0x1.d913109c549a2p-6 ++-0x1.5df3a69b09a81p-3 ++0x1.e92f739ce65adp-1 ++0x1.eddff4fa793e3p-1 ++0x1.fd0d826c5a1d9p-1 ++0x1.f01142b6404c5p-2 ++0x1.ed3e7235fb716p-1 ++-0x1.3f08a31b67052p-6 ++0x1.6c6bd2dd525cdp-1 ++0x1.e42d42ade6dd4p-2 ++-0x1.7c4f407d91487p-8 ++-0x1.1441528bd2bc9p-8 ++0x1.e5db61dfac951p-1 ++-0x1.cf52b5c3c6b19p-1 ++0x1.e83f57fd71bfcp-1 ++0x1.ae8f91695d74cp-1 ++0x1.545021fa9de9cp-1 ++-0x1.45c9266ea4970p-1 ++0x1.eafea77c551aep-1 ++0x1.eba4171524f40p-1 ++-0x1.425187f18c762p-18 ++-0x1.485fe6e78b76fp-1 ++-0x1.db6f1755478ccp-1 ++0x1.f8e25686998acp-1 ++0x1.ccbba7e740751p-1 ++0x1.7816a0d6522cep-1 ++-0x1.0cad003c37274p-22 ++-0x1.4249d37181745p-3 ++-0x1.1aea32c571f90p-2 ++0x1.eff2c75d80ec9p-1 ++0x1.dedbb5aa065c5p-1 ++0x1.022c15ed03102p-2 ++0x1.e28cc0a25217ep-1 ++-0x1.e75507711de7bp-1 ++0x1.6994d6b07313bp-1 ++-0x1.93938552d7672p-3 ++0x1.e9f062935639ep-1 ++0x1.efc9111829a30p-1 ++0x1.e82d352bd52d4p-1 ++0x1.8aefc30a2949bp-1 ++0x1.e829e785fe6bcp-1 ++0x1.906de67167cd7p-1 ++0x1.3cf7801ab3ddcp-1 ++-0x1.d674412d314f7p-1 ++0x1.b8f3652b4e782p-8 ++0x1.0797f77b05b64p-1 ++0x1.fa845330ec5ebp-1 ++-0x1.513a3093d637fp-1 ++-0x1.a0ae922b44732p-1 ++0x1.eb5b41b522564p-1 ++0x1.e9e54719a6384p-1 ++0x1.dc6a025cdf557p-1 ++0x1.8e2720ee32c68p-1 ++-0x1.08a965eef1feep-1 ++-0x1.fa6306dd46e3fp-1 ++0x1.155615f73dc49p-1 ++-0x1.ad5ce2c9a061dp-2 ++0x1.3a6b650c8bc49p-1 ++0x1.1d1f86d1e1e30p-1 ++0x1.cc1b051550465p-1 ++-0x1.eb9871c6f4d8dp-11 ++-0x1.9da0d78b9cbe4p-2 ++0x1.e6cb460ebeeebp-1 ++-0x1.ebcbb7d352b98p-1 ++0x1.f10602c31c4ffp-1 ++0x1.f83d00511f1a6p-1 ++0x1.e70ef18e894dcp-1 ++0x1.f42747759511dp-1 ++-0x1.e210555e48210p-1 ++0x1.e8be424104e58p-1 ++0x1.e269c29bcef60p-1 ++0x1.f85ef0fd21f0bp-1 ++0x1.937141f2672e0p-1 ++0x1.38ec61bd517ccp-1 ++-0x1.d6e9722dc24fcp-1 ++0x1.f8d1b326b2ed1p-1 ++0x1.d86da58fba185p-1 ++0x1.65efb1356114ap-3 ++0x1.f72791c9cf436p-1 ++0x1.0ae4753a5c894p-13 ++0x1.f7415347bb40bp-1 ++0x1.dc65a4f6e740cp-1 ++0x1.d88607a3797e0p-1 ++0x1.eed61776e402fp-1 ++0x1.ee0df44fb77d0p-1 ++-0x1.f450159e992b8p-1 ++0x1.e29cb14cdbcd0p-1 ++0x1.f653a3375d51dp-1 ++-0x1.f57f5552ab569p-1 ++0x1.6480d3d0c5efep-20 ++0x1.38e266cf4e67bp-23 ++0x1.d51cd22b5b6cap-1 ++0x1.dc3de7d2fc8d2p-1 ++-0x1.312a5566cde3fp-1 ++-0x1.fab1d3aa238acp-1 ++-0x1.95bac47704824p-3 ++-0x1.891b43164f852p-2 ++-0x1.80e9f033f4793p-2 ++0x1.df255385153fbp-1 ++0x1.de67748161291p-1 ++-0x1.777e66869b5a2p-2 ++0x1.95b610da4b767p-1 ++-0x1.0eaeb02390875p-24 ++0x1.ed4d9348c4329p-1 ++-0x1.96df34af5a088p-21 ++0x1.f2d162c70d8b5p-1 ++-0x1.deb665e66d761p-1 ++-0x1.0f044763f2eaap-3 ++-0x1.9c3784de626cbp-3 ++0x1.ad40b341217cep-1 ++0x1.a3d8456656f09p-1 ++-0x1.30688704ba934p-13 ++-0x1.f3cf5294a6a88p-1 ++0x1.e906911183a95p-1 ++0x1.d875b2a4cfad9p-1 ++0x1.e9ecd5820a5eap-1 ++-0x1.948a52ed5c31bp-5 ++0x1.f9c6e1a503f35p-1 ++-0x1.ec4f82e92c41cp-1 ++-0x1.2ee365574b66ap-6 ++-0x1.cf7594c4759eep-19 ++-0x1.a0d5f18128988p-2 ++-0x1.806c918e71aeep-1 ++0x1.df5d715846162p-1 ++0x1.f67f859e5cfe0p-1 ++0x1.ecc2b558d729fp-1 ++0x1.ff9fd0805bf30p-2 ++0x1.432fe2eead4f4p-1 ++-0x1.8366e3d1a2b7cp-1 ++0x1.e3f070eec2596p-1 ++0x1.30ba2715f8514p-1 ++0x1.e977633ddb6c8p-1 ++0x1.ecfff5d1ed4fcp-1 ++0x1.6e88143883032p-1 ++-0x1.e95fa37e7e7bbp-1 ++-0x1.b83c53c09f546p-1 ++0x1.517d53ed1b833p-1 ++0x1.db8f51d5f71aep-1 ++-0x1.1678154436606p-2 ++-0x1.fc21417ad3694p-1 ++0x1.1c843518d2e94p-25 ++0x1.e8eee13ebc573p-1 ++0x1.fee6721632c37p-23 ++-0x1.f6a87247c9154p-1 ++0x1.fe6af4fb98692p-1 ++0x1.e7c390a9bbc3dp-2 ++-0x1.e0f877f179d56p-1 ++0x1.d96bf428df776p-1 ++0x1.fc1c23962674cp-1 ++0x1.b198a6962238ep-1 ++0x1.033e6517daa6fp-5 ++-0x1.2d2db09cc6e86p-21 ++-0x1.1ed1f46145a42p-1 ++-0x1.aceee1f163bb0p-1 ++0x1.e775b65834bfap-1 ++0x1.b59893a929786p-1 ++-0x1.0e4bb0b067b5bp-1 ++-0x1.ff1285390535cp-1 ++-0x1.f8d0963809a50p-1 ++-0x1.e5a865ab089bcp-1 ++0x1.c6d112328b280p-1 ++0x1.f013574be1027p-1 ++-0x1.e0a691caa2943p-1 ++0x1.2506d6a72e424p-15 ++0x1.0e385386801e9p-1 ++-0x1.2c8ac0b1cee68p-6 ++-0x1.e44cf154f7837p-3 ++-0x1.9c7c24975ad82p-1 ++0x1.0d8d44f6a38b9p-1 ++-0x1.fb5c33ee7ffa5p-2 ++0x1.4ce97693eab63p-1 ++0x1.2d57b32c61adep-1 ++-0x1.ddc8c1bd6b2f6p-1 ++-0x1.60a8174ee182cp-2 ++-0x1.fe3ab0326a9ebp-1 ++0x1.c99672ad8233dp-1 ++-0x1.a05f0442a1f89p-11 ++0x1.f4efa58696ba2p-1 ++0x1.e8f0874ac9593p-1 ++0x1.697a477d1fbd3p-2 ++0x1.66b7a3a5f4bbcp-2 ++0x1.ec3a1130d87e6p-1 ++-0x1.5faae7d3bcf38p-1 ++0x1.be54761e95348p-1 ++0x1.d053b71612732p-1 ++0x1.f13a35b68c59ap-1 ++-0x1.ffd2875be2cf2p-1 ++0x1.e62df4c494b61p-1 ++-0x1.3471231cca442p-6 ++-0x1.a7b9e784d9434p-16 ++0x1.ece3f29820bdfp-1 ++0x1.ef6b47f54b2d8p-1 ++-0x1.df2c8655fc70dp-1 ++0x1.eda0969bec905p-1 ++0x1.488f14cfb8987p-1 ++0x1.feb910bbdd186p-1 ++-0x1.ed55067dcc2e0p-2 ++0x1.dee9b5b493f34p-1 ++0x1.37f0201120141p-2 ++0x1.bcf1c52c54526p-1 ++0x1.e2e2e4afd49aep-1 ++-0x1.a828f2fd070e9p-1 ++0x1.0995c67dde325p-2 ++-0x1.b9cee2442f243p-11 ++0x1.b5ffd6affbe68p-1 ++-0x1.898db08ff9e7ep-3 ++-0x1.eea7123455743p-1 ++0x1.e22364d8d2ffbp-25 ++0x1.9bc512637b567p-1 ++0x1.908f41ab382c6p-1 ++0x1.daa6242404908p-3 ++0x1.354d96ce0c1f1p-3 ++0x1.e4909407d6b04p-1 ++-0x1.ae60e50c81658p-1 ++0x1.d83d9616cffd1p-1 ++0x1.68d57679fbad0p-1 ++0x1.ee2a61e036810p-1 ++0x1.ff2523154e342p-1 ++0x1.e80a234204ccep-1 ++0x1.ee12e03c07731p-3 ++-0x1.f53bb6a0244b9p-1 ++0x1.a7d1d4d25fc9bp-15 ++-0x1.0d5e226bae52dp-3 ++-0x1.f7553430f26b9p-1 ++0x1.561a2200e4797p-1 ++0x1.dda171643a8f8p-3 ++-0x1.e9a0822672116p-1 ++0x1.9c8ad39c801dep-1 ++0x1.50fe36a2e907bp-1 ++-0x1.f5cb55c5f89b0p-1 ++0x1.e55b90ffc4db3p-1 ++-0x1.f580e64339dfbp-1 ++-0x1.c786d16c31b03p-1 ++0x1.ab3d818097c47p-1 ++0x1.f628956df2bddp-1 ++0x1.3c1983a14fe08p-1 ++0x1.ea6977319eac4p-26 ++-0x1.a2b2a3cf330a0p-2 ++0x1.e06d66507bd76p-1 ++0x1.ed4aa34d83d9dp-1 ++0x1.adbf4089e4bf0p-1 ++0x1.169462af69653p-1 ++0x1.7cdae69e34be4p-23 ++-0x1.f476a5d67b80dp-3 ++0x1.e4f9a4e8edcabp-1 ++0x1.fcb451b72ca3ap-1 ++0x1.bbee334a41744p-2 ++-0x1.e669334dbdbb2p-1 ++0x1.e1ef409647a27p-3 ++0x1.e2f3d0f200912p-1 ++-0x1.0ee0376cb5980p-1 ++-0x1.cd90d53a85604p-24 ++0x1.da2ee339cc169p-1 ++-0x1.91bee2eec93ebp-1 ++-0x1.db27252020025p-3 ++-0x1.ac0763a2833a8p-1 ++0x1.ed7de7964d7b7p-1 ++0x1.387816b7132c2p-15 ++0x1.bde1b11fb418ep-14 ++-0x1.f4b0e44a782a9p-1 ++0x1.c85742cc49d4ep-1 ++-0x1.2ae4206794c97p-2 ++0x1.e8ede2eca6ebcp-1 ++0x1.e83ec2bd612adp-1 ++0x1.cec725af1011dp-1 ++-0x1.f3f110dc11f36p-3 ++-0x1.82c441472b814p-1 ++0x1.12aee0aad581cp-1 ++0x1.d843d56f7661dp-1 ++-0x1.0fa9100cde2b7p-1 ++0x1.fbb577823c6b2p-1 ++-0x1.e7e0f30c7c41bp-1 ++0x1.ead455b35dcfcp-1 ++-0x1.af50723be988fp-1 ++-0x1.c6df54f302009p-2 ++-0x1.f69220aac2bb2p-1 ++0x1.db2795c5314edp-1 ++0x1.f0e804039007cp-1 ++0x1.16e3c0bc73e90p-1 ++0x1.56f925b7342efp-2 ++0x1.2b1a40efca711p-1 ++-0x1.c95572af1befbp-1 ++-0x1.ea363656402fcp-1 ++0x1.9fcea6314eb53p-3 ++0x1.c384447b8f44dp-2 ++0x1.d9cb8501968aep-1 ++0x1.d213669b363a3p-1 ++0x1.dbbce7d0130a1p-1 ++0x1.ef1b07c170256p-1 ++0x1.e5d87723e3720p-1 ++-0x1.dc9450089dc1dp-1 ++-0x1.a400e154e4d4ep-22 ++0x1.f0b8639dae8c0p-1 ++-0x1.c0d7a6d0e58c3p-22 ++0x1.ebe277900a6d5p-1 ++0x1.ddc883853f7b1p-1 ++-0x1.f26d718326d24p-1 ++0x1.b444f4ecea2d4p-1 ++0x1.db5285f43880ap-1 ++0x1.ec2a704fa7ba7p-1 ++0x1.d9d38554f4ae7p-1 ++0x1.40a287e0245c7p-1 ++-0x1.bb5997a01dc09p-1 ++0x1.dbfe825428361p-1 ++0x1.eab9e61d0bb13p-1 ++0x1.dbf8477b40f85p-1 ++0x1.5977a5e9562d5p-2 ++-0x1.6d6582d27a94ep-3 ++0x1.ef98c62116f6bp-1 ++0x1.b195e01c1649fp-1 ++0x1.ed47e34ba7118p-1 ++-0x1.2e1b55053587cp-1 ++0x1.f46e72b797c76p-1 ++0x1.e58d17977d4c7p-1 ++-0x1.78044314faf55p-12 ++0x1.e67de4828d079p-1 ++-0x1.f72481a2b0f3ap-1 ++0x1.ef6de28920541p-1 ++0x1.81a907ff59256p-1 ++0x1.121bf667b781ap-1 ++0x1.e41ba30cd763ap-1 ++0x1.1e76d67046217p-1 ++-0x1.1250820739879p-1 ++-0x1.d15f33646b553p-2 ++0x1.e90c01d074c50p-1 ++-0x1.dc98c564661f8p-2 ++0x1.aab3b79abd652p-22 ++-0x1.12c3e674c7017p-3 ++0x1.207186d6329bap-23 ++-0x1.e9de504c45574p-1 ++-0x1.87494270ac164p-1 ++-0x1.e88cd321ec1dap-1 ++-0x1.9317565e1a195p-19 ++-0x1.350c40dd7d78ep-1 ++0x1.75b8a20113b5ap-3 ++0x1.ae0882e067102p-3 ++-0x1.313bb034e4980p-1 ++0x1.944cd3352094fp-1 ++0x1.e845447d64568p-1 ++0x1.fe614045bdde4p-5 ++0x1.c23a220bff5cfp-5 ++0x1.e4e1454ecf85dp-1 ++-0x1.fcf1e7da10e5ep-1 ++0x1.ee9f80c3fe210p-1 ++-0x1.dae080dc56bf7p-1 ++0x1.f8b43563a02aep-1 ++-0x1.debb0319481e9p-1 ++-0x1.f1d9c2f758defp-1 ++0x1.deb7334be5d7ep-1 ++0x1.e24ac198b2950p-1 ++-0x1.4b4613f445564p-13 ++-0x1.faf37271307aep-1 ++0x1.6a02646fd3199p-1 ++-0x1.e520507f83ff0p-1 ++0x1.974227fac5c71p-1 ++0x1.fe97f4454153cp-1 ++0x1.64cc47f51d1ebp-1 ++0x1.e0aeb2661bc7ep-1 ++0x1.865c7062df26ep-1 ++0x1.2b9d94fd96933p-1 ++0x1.dc43445d9d6c0p-1 ++-0x1.0bcd5161b4780p-1 ++0x1.e8eba118b0a26p-1 ++0x1.c838228508974p-1 ++-0x1.712d5001098d3p-14 ++0x1.eaafe5872fba9p-1 ++0x1.badc0660a7f51p-1 ++0x1.e66ca4a1fdcf4p-1 ++-0x1.ed40630f17ef4p-19 ++-0x1.eab7a154b753bp-1 ++0x1.8610d1e8e6c64p-3 ++-0x1.fd61a56639941p-1 ++0x1.26cb23fb114cep-3 ++-0x1.bf3de5d1277c8p-3 ++0x1.eda2c028553a7p-1 ++0x1.e0be233591f18p-1 ++0x1.fa64112d9b7bdp-1 ++-0x1.f5e2246ae2dd4p-1 ++-0x1.57b0e23b39e09p-1 ++0x1.d97671e65ea90p-1 ++-0x1.e6be223004611p-1 ++0x1.d56357592f5acp-2 ++0x1.6475907a120e3p-1 ++-0x1.f47e6381c6551p-1 ++-0x1.f2b9635cc6607p-1 ++-0x1.5277123e133e3p-1 ++0x1.47e5a403ff975p-15 ++-0x1.3b47975249d03p-1 ++-0x1.2d4395c82f1adp-2 ++0x1.1450373bbdbf4p-1 ++-0x1.f3f605106ccd2p-1 ++0x1.e4fb505afc536p-1 ++-0x1.c45f37ee28f93p-1 ++-0x1.ea50f192e21edp-1 ++0x1.eb0711bcb2188p-1 ++0x1.b7a016b696338p-1 ++0x1.623046e714274p-3 ++0x1.43e5923d7c3c7p-1 ++0x1.2fa122f6646a9p-1 ++0x1.f4f6b5de34b5ep-23 ++0x1.f469264200881p-1 ++0x1.655d872a08e7bp-1 ++-0x1.efbc035d5241cp-1 ++0x1.eecee67cb7c37p-1 ++0x1.ef23215f6de12p-1 ++-0x1.9157d3c02c3b2p-1 ++0x1.c15691eeda91ap-3 ++0x1.f39d271893c42p-1 ++-0x1.e4f743d28a786p-1 ++-0x1.e3439360d1751p-2 ++-0x1.e307d799961afp-1 ++0x1.e25a6469a523ep-1 ++0x1.f220a525222a6p-1 ++-0x1.e47060fdcc071p-1 ++0x1.36f464d433610p-1 ++0x1.d2182142a2d5cp-1 ++0x1.eeae3359ec957p-1 ++0x1.9af5d2ec8ebd9p-1 ++0x1.e11a171b22e03p-1 ++0x1.b610305edff4ep-19 ++0x1.ed7ab363b3447p-1 ++-0x1.e41a54d8498d1p-1 ++0x1.51de25b587b24p-1 ++-0x1.c0e965c3967f1p-24 ++-0x1.c773d52b04af3p-3 ++0x1.d986851c611b7p-1 ++0x1.c82c83eaf14c7p-3 ++0x1.f7cc714398d27p-1 ++0x1.cb56a41743a82p-1 ++-0x1.c101b1037e3f5p-1 ++0x1.70704180d156ap-1 ++0x1.f2d9a4e18b93ep-1 ++-0x1.70f794d622807p-3 ++0x1.ea0c748947c48p-1 ++-0x1.a1436628d7964p-2 ++0x1.e577a48f03d8cp-1 ++0x1.fb333192c3fd8p-1 ++-0x1.849bb070f27dcp-3 ++0x1.ef97766ebf4d8p-1 ++0x1.bba5845fd0c44p-1 ++0x1.cc35e07310ee9p-1 ++0x1.bbf8c7bb9c20fp-1 ++0x1.e52107bcb90ccp-1 ++-0x1.53078258ff064p-6 ++-0x1.1d3673a2a8700p-8 ++0x1.eb3ae6f949eb2p-1 ++-0x1.8a2f305b13ed1p-2 ++-0x1.30fbb21b54296p-12 ++-0x1.448976b9db4f3p-4 ++-0x1.fba6c7b54d231p-1 ++-0x1.1f9010499bc15p-19 ++0x1.bf8d6212e3c0dp-1 ++-0x1.c3658532b752dp-17 ++-0x1.e40de71a02d0dp-1 ++-0x1.c7ef32e8414f7p-3 ++0x1.ecf661eaa759fp-1 ++0x1.5030f4f39c66fp-1 ++-0x1.a724314a500bcp-2 ++0x1.9999d51105133p-1 ++0x1.d9f6e4d727d70p-1 ++0x1.ed1fc550f095ap-1 ++0x1.503b14d81b366p-1 ++0x1.34b7d05a78c28p-1 ++-0x1.2cba67b857796p-1 ++-0x1.d77251ee3df8ap-1 ++0x1.59f032ff510d6p-2 ++0x1.4f88d744710e7p-1 ++0x1.d9e8209b73ea1p-1 ++-0x1.ffb86378c6e93p-1 ++0x1.ea73f543c07f7p-1 ++-0x1.87a6e44eaf473p-14 ++0x1.8db074f7cba71p-1 ++0x1.38b80586e18e2p-5 ++0x1.f8be8469e0f90p-1 ++0x1.821ca4290f63bp-1 ++-0x1.0dd78014ef1a2p-3 ++-0x1.149aa666c3c46p-2 ++0x1.eeb59431123bfp-1 ++-0x1.c253e67cccb47p-23 ++-0x1.1721b193cb808p-1 ++-0x1.f29d328022c9bp-1 ++0x1.dd6ca355705abp-1 ++0x1.d7e5a3e80c978p-1 ++-0x1.ff693303d6a1bp-1 ++-0x1.9792d040f6098p-1 ++0x1.e1bf0284f90b9p-15 ++-0x1.f841c459354cfp-1 ++-0x1.ea326681d6327p-1 ++0x1.ec41879c45965p-1 ++0x1.fa2d97e552ed9p-1 ++0x1.5522431c3f1d5p-1 ++0x1.f52c75ff3d843p-3 ++0x1.df7ff289d597ep-1 ++0x1.89e6d140f4474p-1 ++-0x1.f5e8400a879eep-1 ++0x1.d0ee108472a16p-1 ++0x1.22c9e3d23737bp-2 ++-0x1.f180d30e2ee8fp-1 ++0x1.dc4355da08d39p-1 ++0x1.83cc96505115ep-1 ++0x1.df1a927ae2d49p-1 ++0x1.f7cb87ac643cbp-24 ++-0x1.b5b5e40f69460p-1 ++0x1.b768756962650p-1 ++0x1.385d044ddae6ep-1 ++-0x1.20b4a1a53c3d5p-1 ++0x1.7a97a05587a0dp-1 ++0x1.f298d21034624p-17 ++0x1.0f4422ec03b3ap-1 ++0x1.8c67965cd0051p-1 ++0x1.cee130d0b5a2bp-3 ++0x1.3dc4e295f1f30p-1 ++0x1.808b2220ea364p-1 ++-0x1.fd05a69ce67b4p-22 ++0x1.c6af341fa003ap-1 ++0x1.ecd747e9c09c1p-1 ++-0x1.551e1792426dap-1 ++-0x1.fdc4b78598f6dp-1 ++0x1.e705a3952cb55p-1 ++-0x1.e302b444c2d4ap-1 ++0x1.6079b20e499ddp-1 ++0x1.9deca443255dap-1 ++0x1.6c4eb3d0781b2p-1 ++0x1.ea66d20e1b503p-1 ++0x1.eaed6246abfe5p-1 ++0x1.e9b823bbcfc07p-1 ++-0x1.ce30a300a911ap-3 ++0x1.a87ec3c5f01d2p-2 ++0x1.bb25e46a7f518p-1 ++0x1.edf7166512c36p-1 ++-0x1.efe7a1f38e957p-14 ++0x1.ea9ef4d1cf987p-1 ++0x1.8eba239546037p-13 ++0x1.4e7173f8c3108p-25 ++0x1.e87141103b5edp-1 ++0x1.fe1db59696078p-1 ++0x1.f81a9367f49ecp-1 ++-0x1.1c8ca3340ee9ep-2 ++0x1.f4be90d6a08a2p-1 ++0x1.a57e54c302ffcp-1 ++0x1.3f689114ae747p-1 ++0x1.ba3652b8cb6e8p-25 ++0x1.d83d808a7f332p-1 ++0x1.dfd2264b6c472p-1 ++-0x1.e800e2c46ef54p-1 ++0x1.df8f111ae2866p-1 ++-0x1.6d6c5532e2cd9p-21 ++-0x1.1e2c81ace6c11p-22 ++0x1.e953222af7df2p-1 ++0x1.e925616ce5429p-1 ++-0x1.b26906bfadf37p-1 ++0x1.dbe1f423f0122p-1 ++0x1.8610709c83c3ep-5 ++-0x1.e659010e4489dp-7 ++-0x1.e69494ce3841fp-20 ++0x1.d8ff513fd08dfp-1 ++-0x1.fe6e319c28462p-1 ++-0x1.9d64d47733225p-3 ++0x1.c32282721051fp-2 ++0x1.eb3df7f6d191dp-1 ++0x1.8a44534c5fa47p-1 ++-0x1.4f6d93821061bp-2 ++-0x1.f52714fc5d094p-1 ++0x1.9de7e1e0dc8cbp-1 ++0x1.eeed020905613p-1 ++0x1.ec28d5dadfc7dp-2 ++0x1.aa36c26dcd467p-1 ++-0x1.8e87e6677fbfbp-2 ++0x1.ff84d1966abbdp-1 ++-0x1.f63e406386a93p-1 ++-0x1.f6203420a49e8p-1 ++-0x1.a48a93694dd80p-1 ++-0x1.61a7645eb7ec4p-1 ++0x1.e090c1a2c9b9fp-1 ++0x1.9b45d32c1533ap-1 ++-0x1.b11a761584f00p-1 ++0x1.9ad421a6de914p-1 ++0x1.79dbd61da7b2fp-3 ++-0x1.fc26a4aba22d2p-1 ++0x1.64105318b86d4p-1 ++-0x1.e9789541ac5d2p-1 ++0x1.fd9ec29f78db6p-1 ++-0x1.f14366570d3b6p-1 ++0x1.4b13d01bf21b3p-1 ++-0x1.f4eaf42e7ec78p-1 ++-0x1.339060228fa99p-5 ++-0x1.e744b298a1822p-1 ++0x1.deb6d20e46c2dp-1 ++0x1.292d24ec19bafp-3 ++-0x1.1e8a967a738a4p-1 ++0x1.dc10c61f240a2p-1 ++0x1.de2966eee1343p-1 ++0x1.e19d91e1c7907p-1 ++0x1.79c3b49ea70d1p-1 ++0x1.16e6f6035c12cp-2 ++0x1.decaf4a1bae55p-1 ++0x1.ab70f734c29e0p-1 ++-0x1.efe2c7ae66583p-1 ++-0x1.8bbb01f526908p-1 ++-0x1.aaac637a729e4p-21 ++-0x1.d8db236a8dc8dp-9 ++0x1.e36122ce4d0a1p-1 ++0x1.ea4005dd159f9p-1 ++0x1.b6a77767d4c9dp-1 ++0x1.e40c047e086a2p-1 ++-0x1.5dba61bbcf1dep-1 ++0x1.e5bc071b94585p-1 ++-0x1.f9215050b4d45p-1 ++0x1.fdafc34a31724p-1 ++0x1.869e353529f40p-1 ++-0x1.e2eda692286a9p-1 ++0x1.31642078c9c6dp-2 ++0x1.97e501e8fe7cfp-1 ++0x1.eb18e737043a5p-1 ++-0x1.e18a12334f770p-1 ++-0x1.d507b06c3df31p-18 ++-0x1.d0ec3013892e4p-3 ++-0x1.26c875185533dp-15 ++0x1.efbe6148f56fdp-1 ++0x1.c16d712b4bb1fp-3 ++0x1.8b04c70b3ddcap-1 ++-0x1.ab136560e555dp-22 ++0x1.f7af22a6b572dp-1 ++-0x1.d85926848cf29p-1 ++-0x1.ec59c307396f8p-1 ++0x1.e83fc488dacd6p-1 ++0x1.de8b34bf410c9p-1 ++-0x1.0d4466176e9fcp-1 ++0x1.29c0d4ecd2366p-2 ++-0x1.7c821349cb30fp-23 ++-0x1.f21cf62567c8ap-1 ++0x1.9475e0bee269cp-1 ++-0x1.360155ce19621p-1 ++-0x1.ab61b161880c5p-3 ++-0x1.687a92d61065ap-16 ++0x1.a07a83ec307b4p-3 ++-0x1.ced6825d25e04p-1 ++-0x1.3fd4120c4bf01p-3 ++-0x1.98615085cae70p-1 ++-0x1.565f25ad39799p-1 ++0x1.ff04d61b0df50p-1 ++0x1.3b887244ca6ebp-1 ++-0x1.faf3f337442b8p-1 ++0x1.c2857627f9c6ap-1 ++0x1.414391eae82a7p-2 ++0x1.ed4c041a3ead6p-1 ++-0x1.7720c11df55fep-3 ++-0x1.20dd07160306ap-3 ++0x1.eb79153ce9fddp-1 ++-0x1.0b7c366b28640p-1 ++0x1.0c37b2dba00aep-19 ++0x1.df2997df1e98ap-1 ++-0x1.db81e304bef8ep-2 ++0x1.d061109803210p-1 ++-0x1.f29f3377fe46bp-1 ++-0x1.9d69119b79677p-17 ++-0x1.fe18e3a9ee189p-1 ++-0x1.2ba7052c8bd80p-1 ++0x1.e241853578931p-1 ++-0x1.fb0854c5d75f0p-1 ++0x1.ee3cd20ce4f5ap-1 ++0x1.ee40d08bb49e3p-1 ++-0x1.cc9fa732730b4p-1 ++0x1.070692620b71cp-1 ++0x1.e0d2859d0d97dp-1 ++-0x1.82f763fdb686ep-1 ++-0x1.763cb2cf0a32dp-3 ++0x1.e43b37d8f0ddfp-1 ++0x1.a3880141b2dd3p-3 ++0x1.3befe215a78c6p-1 ++0x1.9d6604d4efeddp-2 ++0x1.b5a3d7eddda00p-1 ++0x1.cc7993074c20bp-1 ++0x1.aac5e5dc62767p-24 ++0x1.bed3226c9cf5ap-2 ++-0x1.efd3965c7e5acp-1 ++0x1.fe2aa46b77528p-1 ++0x1.e098e320da0bap-1 ++0x1.67e7248b818b3p-3 ++-0x1.6ad6002662fadp-2 ++0x1.decaa3bcdaa08p-1 ++-0x1.d58d16202023dp-10 ++0x1.ff00b5fcb622fp-1 ++0x1.32ef66d1351e1p-1 ++-0x1.f16585e5f84ebp-1 ++0x1.1f8845720550bp-3 ++-0x1.597ae70396752p-24 ++0x1.29d207dd78ad9p-3 ++-0x1.c50354e1919fdp-1 ++-0x1.f33b17f4530b4p-1 ++-0x1.01ede4cf1745cp-1 ++0x1.ca3f36b0aa65cp-1 ++0x1.40e9902e7c79ap-3 ++-0x1.59f3c5b673712p-1 ++0x1.916dc64eee2aap-1 ++-0x1.ef8c343a179b1p-1 ++-0x1.4a43014a489a2p-18 ++0x1.ea9994a3eea40p-1 ++0x1.7c24d44e7ad13p-1 ++0x1.f81f66a100c06p-1 ++-0x1.e7cb21c3e16e5p-1 ++-0x1.660cf02b53207p-1 ++0x1.9d1775b1ea06fp-2 ++-0x1.fb6e3107f4ab7p-1 ++0x1.ec9ed646b54a4p-1 ++0x1.eb877429ca44ep-1 ++0x1.57f90558e0cd2p-1 ++0x1.ee6127d9b9cd3p-1 ++0x1.eeace5528bcaep-1 ++0x1.abfa31533bf17p-1 ++0x1.af6d31714c4fap-3 ++0x1.1b88e568085eep-3 ++0x1.27d0012eda11fp-1 ++0x1.e4c3a00a353dcp-1 ++-0x1.a4d2513d6da08p-3 ++0x1.eac9041cf24d0p-1 ++0x1.eba880a52b2a0p-1 ++0x1.fc9815cf6cf07p-1 ++0x1.e9306397ac8d9p-1 ++0x1.b43cd65692d19p-1 ++0x1.ffed705f1a4ecp-22 ++-0x1.758b46be117efp-23 ++0x1.32f4b633ba0e9p-1 ++0x1.ebf364bf44defp-1 ++0x1.eb2c318fe1fd1p-1 ++-0x1.c4f6f0a35fd4cp-1 ++0x1.f94de7e900a23p-1 ++0x1.e040d6464605fp-1 ++-0x1.219fc52102aa7p-1 ++-0x1.453271b5e1e0cp-1 ++0x1.269653d6653a0p-10 ++0x1.a48e700ea9b1fp-1 ++-0x1.f41ec1c712c7fp-1 ++0x1.c96de70665e99p-2 ++0x1.ff20b67f593dcp-1 ++0x1.e13e27d7f0352p-1 ++0x1.e81bf743c0369p-1 ++0x1.c50ba323bc984p-5 ++0x1.2109349c356f8p-2 ++-0x1.8bdbe0b9e2d2bp-10 ++0x1.f668a1d8022d9p-1 ++-0x1.3e06e4a0baeedp-1 ++0x1.fb63f1e25d668p-1 ++-0x1.b8e1e27336860p-1 ++-0x1.f2700673bb386p-1 ++-0x1.b2daa6e18bec1p-1 ++0x1.8e8b67f0920cap-3 ++0x1.fdeba0a282ee5p-1 ++0x1.ed9061cac7a5fp-1 ++0x1.e697822f3ef41p-2 ++-0x1.a073961b21017p-3 ++0x1.eae16553c8c57p-1 ++-0x1.ef11308a723a0p-3 ++0x1.4db6f0d5fc8b1p-1 ++0x1.9db7a4e909c22p-1 ++0x1.d963f3e2377acp-1 ++-0x1.f4b2a27475355p-1 ++0x1.5ceea7934431fp-1 ++0x1.e006175a5233bp-1 ++0x1.db398369c7f83p-1 ++-0x1.6da6930d66d07p-1 ++0x1.6cc7155575699p-2 ++0x1.8958a513b1a3dp-16 ++0x1.e4d423f8e48d5p-1 ++0x1.f61e572c416f1p-1 ++-0x1.dce6b232fc21ep-1 ++-0x1.f76ac4a2a56ebp-1 ++-0x1.effa02c2a5b57p-1 ++-0x1.3277074adeefap-2 ++-0x1.f820b07829307p-1 ++-0x1.9ce743a0e44b1p-22 ++0x1.5a60c5b18ae7ep-1 ++-0x1.627064608ff5ep-1 ++-0x1.f18541418b0c8p-1 ++0x1.df5a362b58df6p-1 ++0x1.5a1c12189882bp-1 ++0x1.042eb250936bep-1 ++-0x1.1cb73699e8924p-1 ++0x1.bd81501f6c6dbp-1 ++0x1.ea461047bbbaap-1 ++-0x1.987e70cb208c9p-1 ++0x1.ebb7b667c93a9p-1 ++-0x1.e64087ec5398bp-1 ++-0x1.da4060f493507p-10 ++0x1.edf6c4bdb283ap-1 ++0x1.e56aa246ff0e4p-2 ++-0x1.5ee2870e9e6e3p-1 ++0x1.890c70d8e4854p-15 ++-0x1.9d713407fd722p-1 ++0x1.d81051269ec58p-1 ++-0x1.21a6c4b3b5c44p-1 ++-0x1.ff1743cc5a35ap-1 ++-0x1.bdd804759a629p-1 ++0x1.ecabd624ed76bp-1 ++0x1.f4fc4755c5257p-20 ++0x1.ef9f51187fe83p-1 ++-0x1.bcfe530a93051p-3 ++-0x1.04437668e59f9p-22 ++0x1.f9deb62170ec6p-1 ++-0x1.f95ff4e30111cp-1 ++0x1.b9bcd47a04014p-1 ++0x1.e986346f71ee7p-1 ++0x1.e870a1536e60dp-1 ++-0x1.f45142b039fd9p-1 ++-0x1.f9a361114e127p-1 ++0x1.a39e45adb3fcbp-1 ++0x1.eedee6a9faf61p-1 ++-0x1.2d7dd63289e16p-3 ++-0x1.ea1224bded243p-1 ++-0x1.4bdd4503c4c63p-1 ++0x1.6c88456adc480p-3 ++0x1.e2b3a4b24383cp-1 ++0x1.e5fc97f64aecbp-1 ++-0x1.1b6bb0f6cd48dp-1 ++-0x1.b303858a80ca8p-1 ++0x1.e7ab923c42554p-1 ++0x1.0a9275a4041e2p-1 ++-0x1.f8c00391024e6p-1 ++0x1.e35757a76e130p-1 ++0x1.e79240313e889p-1 ++0x1.65b7c5e770a90p-1 ++-0x1.c932d35cb0882p-1 ++0x1.6bdae68159ee5p-2 ++-0x1.a10396bb69be7p-1 ++0x1.385d508691b4ap-1 ++-0x1.879d741b2c118p-23 ++0x1.44ecc2c03843ap-1 ++-0x1.ff8f3716b5256p-3 ++-0x1.595040318030ep-3 ++-0x1.bcfdf5e4c6970p-1 ++0x1.0f3c92514126ep-1 ++0x1.3dc123067ed3fp-1 ++-0x1.ecbe16bf69bfbp-1 ++0x1.9ee9220c8f948p-2 ++0x1.dda1a2c40b3a6p-1 ++0x1.c24c85e28024fp-1 ++0x1.28b060d622339p-1 ++0x1.ef1b944c9f858p-1 ++-0x1.f476a1ba386d0p-1 ++0x1.83edf16dfff50p-1 ++0x1.e7ee358e79562p-1 ++0x1.e31ec6e0b4fc4p-1 ++0x1.dd98613b70372p-1 ++0x1.da5505c9b5082p-1 ++0x1.24f756f5e8490p-22 ++0x1.2c5d704de00e2p-3 ++0x1.e8faf051d09cbp-1 ++-0x1.ff78b2a719f69p-1 ++0x1.db133789d06a7p-1 ++0x1.66c0e08344febp-1 ++0x1.406506bfcfb11p-1 ++-0x1.55ac10a3a8641p-3 ++0x1.fce4f63c2836bp-11 ++0x1.a49c5484fe1ecp-1 ++0x1.ec7bc658a8951p-1 ++0x1.e84b3736a7b34p-1 ++0x1.ac8f6552a58dep-1 ++0x1.f42ee4d7dac9dp-1 ++0x1.3951052bb8e1fp-1 ++0x1.bec8b0e3edbb6p-1 ++0x1.33855463baf99p-1 ++-0x1.177641b2f5da9p-2 ++0x1.df40141a3b57dp-1 ++0x1.e92b22c10a9ddp-1 ++-0x1.f0bf840efa02bp-1 ++0x1.19a5c7f4ac19ap-1 ++-0x1.f06581e9738c7p-22 ++0x1.fa84d6fc1bfb4p-1 ++-0x1.ff5cc72dade88p-1 ++0x1.e0942271d057fp-1 ++0x1.02338781af33bp-3 ++0x1.696c8704c0adep-1 ++-0x1.f1687635d3527p-1 ++0x1.8fd781a156526p-1 ++0x1.fe1874b71dffap-1 ++0x1.8651325797215p-3 ++0x1.bc3c71925e5b6p-1 ++-0x1.1e9543b9189ebp-4 ++0x1.e4e8c2f4a4892p-1 ++0x1.9cec761d69c12p-1 ++0x1.b823a13640780p-1 ++0x1.1340e0318b586p-1 ++0x1.ecea93cc4e282p-1 ++0x1.381af30c8bbacp-3 ++0x1.269575fbaa2a4p-1 ++-0x1.806dd0823096dp-1 ++-0x1.e052374d36a4bp-1 ++0x1.fea3254b1eafap-3 ++0x1.2d5970ca26f6cp-1 ++-0x1.f4dea4866c50bp-1 ++0x1.f69344c9b9904p-1 ++-0x1.a3903178cc914p-1 ++0x1.ef5191f3a5593p-1 ++0x1.f5f3548da6996p-1 ++-0x1.f643440d6b06cp-1 ++-0x1.f002c7269a37ep-1 ++-0x1.fa75252a58e2dp-1 ++0x1.d9f9e3d739f44p-1 ++0x1.634732e2952fap-10 ++0x1.f218003f765f8p-1 ++0x1.606f8100c1742p-2 ++-0x1.e755f3286db4ap-1 ++0x1.a51346ad161ffp-1 ++-0x1.fb568187a36cdp-1 ++-0x1.e9fb506e00816p-1 ++0x1.ef4ba09903242p-1 ++0x1.decac67825caep-1 ++0x1.e87f025e48684p-1 ++0x1.e3f8778ca9756p-1 ++0x1.def1462172dfbp-1 ++0x1.311253501f3f2p-3 ++0x1.b47cd28626b01p-1 ++0x1.ea01327b06539p-1 ++0x1.f29325d22a5b5p-1 ++-0x1.63cce0ecc9f3fp-2 ++-0x1.cbec261c8745fp-2 ++0x1.839f62344ed35p-1 ++0x1.db5e820db1f0dp-1 ++0x1.eb10463897a41p-1 ++-0x1.01a9b60073fd1p-2 ++0x1.820c4727f0297p-1 ++0x1.defe9157b25b9p-1 ++0x1.95acf5bfa2f77p-3 ++-0x1.f829a7cd489c0p-1 ++-0x1.f78f2515a0c93p-1 ++0x1.e40934a3f3e57p-1 ++-0x1.fb0a94ad8c18dp-1 ++-0x1.8f0b53139648dp-20 ++0x1.d801c522cfcf4p-1 ++0x1.d91a30bb3e15dp-1 ++0x1.e41a80baf531bp-1 ++0x1.e96113c21b2e6p-1 ++0x1.cbb5955832906p-1 ++-0x1.faaf461b00258p-1 ++0x1.2c7b264df7e18p-2 ++0x1.cdf68750f625fp-1 ++-0x1.ab062115542b8p-2 ++0x1.cd73a32168810p-2 ++-0x1.f3f1411a81959p-1 ++0x1.57c7a2ace0a72p-1 ++0x1.efb2212f852c5p-1 ++0x1.8e0f47ea636f7p-1 ++0x1.ea6d312855164p-1 ++0x1.31a3e53d9d779p-1 ++0x1.bc55404efb12dp-19 ++-0x1.b6f9a6276a135p-1 ++-0x1.c3e361caeb9f1p-1 ++-0x1.e0eca0ecd7cb7p-1 ++0x1.f847f61015d15p-1 ++0x1.ed36e1f48a48ap-1 ++0x1.f41ca43bda5ffp-1 ++-0x1.ad50f432557fap-1 ++-0x1.114fa24a19444p-2 ++0x1.36def65bab425p-1 ++0x1.fe05623afcc36p-1 ++-0x1.ef66a308f97d2p-1 ++0x1.8d4b844dd2993p-1 ++-0x1.d6cff1d46ff9bp-9 ++-0x1.ee29a33d89217p-1 ++-0x1.f132f2992494fp-1 ++-0x1.de7153b5aad60p-3 ++0x1.d915353edaa25p-1 ++0x1.ea64823156f61p-1 ++0x1.4d3ba3c4d2e24p-1 ++0x1.ba92542786897p-1 ++-0x1.fffed63ad096dp-1 ++0x1.e97f8083149abp-1 ++0x1.b79ba1d3be769p-1 ++-0x1.eab325c5fbbe8p-1 ++-0x1.c3e3470150bafp-1 ++0x1.e3b610f2a9a12p-1 ++0x1.091a864ba6574p-3 ++-0x1.462ed634d347cp-2 ++0x1.ed90006d31696p-1 ++-0x1.c62a454b8d40bp-1 ++0x1.371a12446cb76p-2 ++0x1.eb63b3e34705ep-1 ++0x1.edf750cfdec5ap-1 ++-0x1.308fe73061dc7p-1 ++-0x1.ee05e10877512p-1 ++-0x1.d67e0577a6507p-1 ++-0x1.ed2eb7554cecap-2 ++0x1.dca2a028e0226p-1 ++0x1.d30c963d41488p-1 ++0x1.7530e7c8620bfp-1 ++0x1.d417a562c0d61p-1 ++0x1.e20e43f399e37p-1 ++0x1.ea15f4adca008p-1 ++-0x1.f3b7c47cb6dc6p-1 ++-0x1.154f81f240248p-7 ++-0x1.151356f0736d8p-1 ++0x1.f6ee472b8805fp-1 ++0x1.92518330d7f45p-1 ++-0x1.dc476211ce07dp-1 ++0x1.e848464011e2bp-1 ++-0x1.46a8919520b17p-1 ++-0x1.77fe90512eacfp-1 ++-0x1.9acbd0bea7745p-2 ++-0x1.443961a482f0fp-2 ++0x1.dc9150d6da395p-1 ++0x1.8f0b30b8722ebp-11 ++-0x1.ec2db037a82dcp-1 ++0x1.e3e7f06de29f4p-1 ++-0x1.f321806888b14p-1 ++0x1.bcc2d238d4ddbp-25 ++-0x1.b5d02551d5671p-10 ++0x1.5b65c47382c9ap-3 ++-0x1.fcbdd2b050f64p-1 ++0x1.ea5c13904e3b2p-1 ++0x1.ef36a448b7555p-1 ++0x1.dfdfd6c700acfp-1 ++0x1.4236c13576e0ep-2 ++0x1.8df8a16525f39p-3 ++0x1.e0ad97d2cf238p-1 ++-0x1.38f0542ca311ap-1 ++0x1.d87891d37859cp-1 ++0x1.e10e138b446a6p-1 ++0x1.0f92764f7b2e4p-1 ++0x1.aade166075ea0p-1 ++-0x1.902df59995e2fp-15 ++0x1.de7c758e0561ep-1 ++-0x1.bbcb739c535d8p-3 ++0x1.750fa027faf9ep-1 ++0x1.af8d62c66fb2cp-1 ++0x1.ea9ec240b76fap-1 ++0x1.ef92f02323e66p-1 ++0x1.410642b877d0fp-1 ++0x1.ecec322ab031cp-1 ++0x1.88a7042cf26e3p-1 ++0x1.d91c147875780p-1 ++-0x1.891bb78017f41p-3 ++0x1.ecbf764fb7f74p-1 ++0x1.8ae814193f661p-1 ++-0x1.9ab562e85a368p-1 ++0x1.eafad3737c504p-1 ++0x1.f172b00025f8dp-1 ++0x1.9625e4660a46ep-1 ++0x1.ff2847663862cp-23 ++-0x1.f876845608312p-1 ++0x1.f988f6376ddcep-1 ++-0x1.32096643967c8p-24 ++0x1.862f469d3b6b5p-1 ++0x1.e409002dbe096p-1 ++0x1.ebae12a190827p-1 ++-0x1.c73c104933177p-3 ++-0x1.e67b111d9643ap-1 ++0x1.e14005d42553cp-1 ++0x1.6bcdd5585b74ep-1 ++0x1.d01df07e10013p-1 ++-0x1.aa01a6ca96ca1p-1 ++0x1.9adaa0b3675d2p-1 ++0x1.abf414448c2c7p-1 ++0x1.e5c940ebf6cffp-1 ++0x1.5cf30257670ddp-1 ++-0x1.c572d1625cc9ap-1 ++0x1.c46f07973a003p-1 ++-0x1.e9edf7eef925cp-1 ++0x1.e2db71253b231p-1 ++-0x1.f18a81c759b6ep-1 ++-0x1.0484943b8972bp-14 ++0x1.e8ba541de4c3dp-1 ++0x1.e86031182f48ap-1 ++0x1.edf485b87d989p-1 ++0x1.ed7b63e2ae6e5p-1 ++0x1.441ba0eeee084p-1 ++-0x1.f157124313805p-7 ++-0x1.592b96408f745p-15 ++-0x1.aa9f35bb8710cp-3 ++0x1.dd79933eb4823p-1 ++0x1.8105f3b2d415bp-1 ++0x1.e959042778f64p-1 ++0x1.eb1923875839bp-1 ++0x1.f0f3621f3d303p-1 ++-0x1.fb9d116c1740ap-15 ++0x1.ee3e232a76cbdp-1 ++0x1.a720e17021d30p-1 ++0x1.4496d3d77e50dp-3 ++0x1.29b2708c3a747p-1 ++0x1.49f6619c13dd0p-2 ++0x1.01593434a17a8p-2 ++0x1.0c56546e3c83ep-2 ++-0x1.fd7591cf4e231p-1 ++0x1.f28e37cddaa63p-1 ++-0x1.21c025a637570p-2 ++0x1.e47fc5993f6c7p-1 ++0x1.85a2015249f9ap-1 ++0x1.ccac70b0bde88p-1 ++-0x1.b0c634676faacp-4 ++-0x1.f91d34193e0cap-1 ++0x1.ea81015237620p-1 ++0x1.e0f6a48d7e9c9p-1 ++0x1.fae08655a51a3p-1 ++0x1.4f28f1201b762p-3 ++0x1.e8e030f4ea7e4p-1 ++0x1.e1db95f200e1bp-1 ++0x1.f425e3cced4c7p-3 ++0x1.bdc8679163915p-18 ++0x1.febcf6c28536ap-1 ++0x1.92f204914b1bap-1 ++0x1.ecd8933b172edp-1 ++0x1.f0bb0482d6c17p-1 ++-0x1.1011a24690b17p-1 ++0x1.6597b5c278c94p-1 ++0x1.c03a92b120e58p-1 ++-0x1.0eed14bd5c463p-1 ++0x1.e84d0157c4875p-1 ++0x1.e0fa54716960fp-1 ++-0x1.e70102ffd26f4p-2 ++-0x1.a5029085d091bp-1 ++-0x1.ff504589e4c56p-1 ++0x1.cd7171df2e295p-3 ++-0x1.c2e6249c7296ap-21 ++0x1.96c5c059d54afp-1 ++-0x1.e6f51087203f2p-9 ++-0x1.515e3214390b1p-2 ++-0x1.e0a141c4f0b16p-1 ++0x1.eb7451be325a0p-1 ++0x1.e0d083fcb5089p-1 ++-0x1.fee190f2fc2b8p-2 ++0x1.fe9b45e910698p-1 ++0x1.a1bb4745dadf5p-1 ++-0x1.f652e1fdb6a40p-1 ++0x1.ddcf1291a5226p-1 ++-0x1.43cbc08a959f6p-3 ++0x1.dbf877fb563dcp-3 ++0x1.ca0a70766ed38p-1 ++-0x1.fb8063fd22722p-1 ++-0x1.fa4ed780ebffap-1 ++0x1.ef75b5fbc2038p-1 ++0x1.d8fad2d484f9cp-1 ++0x1.eb8ca278a8b79p-1 ++0x1.0fde2500275a5p-2 ++0x1.e71ef4f74efa5p-1 ++0x1.df0c61f2a0f01p-1 ++-0x1.bb5c7578b90a7p-1 ++-0x1.2e84858cbd9e2p-1 ++0x1.096bd4970cd0dp-22 ++-0x1.f41217509723dp-1 ++-0x1.32d10136b1f12p-1 ++0x1.4c6af75e75c32p-1 ++0x1.3fe9d75c1f312p-1 ++0x1.9ef980d30524ap-1 ++0x1.828b0390e301ap-3 ++0x1.f62692b289857p-1 ++0x1.5cb4743cbb81ep-13 ++0x1.ef86868247137p-1 ++-0x1.da44b5b4e6c6fp-1 ++0x1.dbcd94da0d8b8p-1 ++0x1.ec9c878cfb5f0p-1 ++-0x1.5f64a17e9500dp-2 ++0x1.5c75e768472b4p-2 ++-0x1.a787c4bfd3b9dp-1 ++-0x1.cca7367cafebcp-1 ++-0x1.11bc51c1a6b71p-1 ++-0x1.f6df90b887fc3p-1 ++0x1.7a9fb439b7a47p-1 ++0x1.e33c401410e8dp-1 ++0x1.fb4ee1a050156p-1 ++0x1.e89fb349c715bp-9 ++0x1.9b1db0483a855p-20 ++0x1.a913b3a187ee1p-17 ++-0x1.ef7701b74636cp-1 ++0x1.828184fbbeaa0p-2 ++0x1.f4d8e628050abp-1 ++0x1.133d81d6ae23cp-3 ++0x1.f013f7c35659bp-1 ++0x1.efd682aa7da6dp-1 ++0x1.f1dc00f5ef3a9p-1 ++0x1.96072389d627dp-1 ++0x1.ea1691abf195ep-1 ++-0x1.cca2538d384bap-5 ++0x1.e92007ba8df2ap-1 ++-0x1.e141a1fc347e7p-1 ++0x1.ed08437e94ea2p-1 ++0x1.4445e5b18f130p-1 ++0x1.f66bb10cf125cp-1 ++0x1.704f576926a3ep-1 ++-0x1.1e2b763ff1c1bp-16 ++0x1.a257b5f59a887p-1 ++0x1.ee0771d865c59p-1 ++0x1.debf16684ec06p-1 ++0x1.dbdf762ec9500p-1 ++0x1.e60b71ca4175bp-1 ++0x1.30f9a5a27b4a8p-1 ++-0x1.f34ff26c85784p-1 ++-0x1.d1b2d7ceae413p-1 ++0x1.fdcf071e072d3p-1 ++-0x1.a3f255af4ee16p-1 ++-0x1.ea5db637383c4p-20 ++0x1.e23fd346a1c24p-1 ++0x1.398d4660919b3p-1 ++-0x1.2341b61c4a232p-6 ++0x1.e7ddc42b3a4a8p-1 ++-0x1.ff0942c4470a9p-1 ++0x1.fa0f0780123aap-1 ++-0x1.56f2e58d53fc9p-1 ++0x1.37fd262f2ef5ap-1 ++0x1.e9de764260ee7p-1 ++0x1.3b0da25eac967p-18 ++0x1.e4394344a153bp-1 ++0x1.ee5d6207f7775p-1 ++0x1.e1241012fada1p-1 ++0x1.e2e61171c55e6p-1 ++-0x1.fa0e3517f47f8p-1 ++0x1.e811955ba544ap-1 ++0x1.4003e18e34c12p-23 ++0x1.f4f195748771bp-1 ++-0x1.ef0f34f9f356fp-1 ++0x1.391e008ea4619p-3 ++-0x1.bb0300053577dp-2 ++0x1.612ec16edaa00p-1 ++-0x1.53edf5aa8e452p-1 ++0x1.267ce71264f70p-1 ++-0x1.b0c102e4ded61p-1 ++0x1.b7b2671933257p-1 ++0x1.ea53f7e49d1fep-1 ++-0x1.ea6bc6967c364p-1 ++0x1.95d8a522476fap-1 ++0x1.f99470c182bf6p-1 ++-0x1.ef0df4884c963p-3 ++0x1.e6157493cd764p-1 ++-0x1.12b6e5b410e7fp-1 ++0x1.f67435d502e6dp-1 ++-0x1.f4ec823b0125dp-1 ++-0x1.f638561f1eccbp-1 ++-0x1.b967b16c72982p-21 ++-0x1.842b3414ac978p-1 ++0x1.ef15c079cf311p-1 ++0x1.1d6fb030321d5p-2 ++0x1.ea147124ef4abp-1 ++0x1.e342f70874ef2p-1 ++0x1.e7afc67c34250p-1 ++0x1.19db65ff74336p-1 ++0x1.df80158c55f1bp-1 ++0x1.542a0182909a7p-1 ++0x1.057365e07e692p-2 ++-0x1.fb0d257f569cdp-1 ++-0x1.de3c10fe462f9p-1 ++-0x1.ecf8e686be7cep-1 ++0x1.55e863f86981dp-1 ++-0x1.eb05376e22db1p-1 ++-0x1.e83e578b67404p-1 ++0x1.1d7bf26bcd34ep-2 ++-0x1.ec5af0c2ccbc9p-1 ++0x1.ddd3d27a5b4aep-1 ++-0x1.eaf4048fe077cp-1 ++0x1.00801354b719ap-21 ++0x1.3e3a6224576bap-3 ++0x1.ed89f7096981cp-1 ++-0x1.daf4c6895a475p-2 ++-0x1.27b5065556c47p-1 ++-0x1.62e816a332a1ep-1 ++0x1.c38e7517dd45fp-12 ++0x1.915a220e086dfp-1 ++0x1.dd5754e2b6f70p-1 ++0x1.d84720817bef5p-1 ++-0x1.04b965445d524p-1 ++-0x1.e882f75e4f37fp-1 ++0x1.d8e1258d3e967p-1 ++-0x1.f4ad6308371a8p-1 ++0x1.0924a114faa3bp-1 ++-0x1.ee8ea3f68169fp-1 ++-0x1.db6440c16c293p-1 ++0x1.a260a5cf0493bp-1 ++0x1.ead6a5782d24dp-1 ++0x1.e049c5ecc67fcp-1 ++-0x1.480570f907c0ap-25 ++-0x1.e6a7c54bbfa5ap-1 ++0x1.fe6ad355328e4p-1 ++0x1.e2d7666a25355p-1 ++0x1.eec3b242762cep-1 ++0x1.c85773ca329d7p-1 ++-0x1.f163118d145f0p-1 ++-0x1.f79036a3f4459p-1 ++-0x1.204f96baed60dp-3 ++0x1.f9dc71e534411p-1 ++0x1.67b372a69cd0bp-3 ++0x1.eaa614d2c63c8p-1 ++0x1.bb01a3a90cd08p-3 ++-0x1.0bc192dba3daep-1 ++0x1.a7184731a11b4p-1 ++-0x1.bfb485fa7f5f4p-16 ++-0x1.3688a0346cbf4p-2 ++-0x1.f153e2327fc20p-1 ++0x1.658b516343b5ap-1 ++0x1.edd205a535cf6p-1 ++0x1.e2e360aa13064p-1 ++-0x1.c24710eb7be22p-3 ++0x1.041a67e3e8f28p-1 ++-0x1.eb8aa64a05087p-1 ++0x1.e30cf7c07f903p-1 ++-0x1.b9c3a3088d677p-1 ++0x1.713eb1ab5e4c9p-1 ++-0x1.6ad805c841fcap-1 ++-0x1.f885a3f0e8ba8p-1 ++0x1.f46dc196d78d6p-1 ++0x1.fc84242c90e1fp-1 ++-0x1.03cb72be8da0fp-1 ++0x1.876157be34442p-1 ++0x1.df7a00f91ede0p-1 ++-0x1.7aadc22f765e8p-1 ++0x1.c49f353c0eea6p-2 ++-0x1.6942e78790b68p-1 ++0x1.f09820d53213dp-1 ++0x1.f0d7d51f16eafp-1 ++0x1.dd09f317d4844p-1 ++0x1.c37884de423eep-2 ++-0x1.d888e3c9b6736p-2 ++-0x1.0f9db3fc68bccp-5 ++0x1.b6a6c3eebea0cp-1 ++0x1.45f1f16329902p-1 ++0x1.ea8ca34a12e96p-1 ++0x1.e301b33695f69p-1 ++0x1.68a5b3e8dc41fp-1 ++-0x1.31ff6639336e0p-1 ++0x1.5a9b126abc66ap-1 ++0x1.1973b36468d97p-1 ++0x1.efe1f56bd3534p-1 ++0x1.e5ab36d2f2409p-1 ++-0x1.45d6537260c70p-3 ++-0x1.56f5410b90154p-15 ++-0x1.7d8cb3c9cb5d8p-1 ++0x1.c96a64375fd43p-1 ++0x1.deb991e8ad26ep-1 ++0x1.f2cdb2dedca59p-1 ++-0x1.aca5d6e0cebc8p-1 ++0x1.eb42940a8517bp-1 ++0x1.ae1b403368423p-1 ++0x1.ade411f3da571p-1 ++0x1.3e1116e4de263p-1 ++0x1.8973c30a0bb9cp-1 ++-0x1.156c062335d7dp-1 ++-0x1.9acbe0ee1240fp-3 ++0x1.ec00c6a3e141ep-1 ++0x1.dc4b32a234a23p-1 ++0x1.e6c20026a69cfp-1 ++-0x1.8fa041d702f22p-3 ++0x1.c5f6f61e0882cp-1 ++0x1.ca32d645bd50ap-1 ++-0x1.eebfe7785b810p-1 ++0x1.d855e4e635750p-23 ++-0x1.c4f8e0df2acbdp-3 ++-0x1.7f7681cf8b0a8p-2 ++0x1.834e43d519f57p-20 ++-0x1.e6c711f8a07a2p-1 ++0x1.37e074e9bd23fp-3 ++0x1.e07616c72f309p-1 ++0x1.eb6786e4bb963p-1 ++0x1.19099015cd289p-1 ++0x1.e1a391292b6e3p-1 ++0x1.e2db651834387p-13 ++-0x1.fe98b265f6c23p-1 ++0x1.e2bfd7dc71f91p-1 ++0x1.ee47140384e38p-1 ++-0x1.001567470f803p-2 ++0x1.05bdf1d57b74ap-3 ++-0x1.9f9bb738e7354p-2 ++-0x1.e2b5a72fffc26p-1 ++0x1.e33c52a03a341p-1 ++0x1.c210e6a7521b4p-1 ++-0x1.89280419666a0p-3 ++0x1.ef4386066c43ap-1 ++0x1.617cf4e80da72p-2 ++0x1.ca67862290507p-1 ++0x1.d2db6598cfaf0p-1 ++0x1.4c52d70f696f4p-3 ++0x1.fd31e495b8cd4p-1 ++0x1.97d8c7b4c9114p-1 ++-0x1.f0fc72689286ep-1 ++0x1.93a7216be0c5dp-2 ++0x1.d3115794c28e9p-1 ++0x1.e285e72ab6c83p-1 ++0x1.e318d24b8b39ep-1 ++-0x1.eef6d32a0b85fp-1 ++0x1.8d1c623935f00p-2 ++0x1.69f611e882192p-3 ++-0x1.815743a3562efp-1 ++-0x1.eb08c0c39511ep-1 ++0x1.c59db4bbac95fp-1 ++0x1.7d0722deb44afp-1 ++-0x1.8315d64e9546ep-1 ++0x1.9dd1600231fb9p-1 ++0x1.e2e2e02cfc885p-1 ++-0x1.10e173bc56bedp-1 ++-0x1.fef5368baa990p-1 ++-0x1.ffa8a2b9fe667p-2 ++0x1.dffc77beb4240p-1 ++0x1.eeb121fd09f87p-1 ++-0x1.e90be055f4bc5p-1 ++-0x1.f41e016289c7cp-1 ++0x1.af5152f1a61dap-26 ++-0x1.fd48f58baaff1p-1 ++-0x1.4b0f8437f1bc3p-1 ++0x1.d4cc178e13728p-1 ++0x1.ce7265a719e49p-1 ++0x1.e9eff57262b39p-1 ++-0x1.f13f718045fb6p-1 ++0x1.e6bb77d8971e1p-1 ++0x1.b551834380757p-1 ++0x1.da0f873b6aa41p-1 ++0x1.f142b0d6cd227p-1 ++0x1.e9ab41fff09b7p-1 ++0x1.942ed2f7475d2p-2 ++-0x1.bb5fe6c2388bcp-20 ++-0x1.a2e262533502fp-4 ++0x1.dd9583ec5db42p-1 ++0x1.90fad5e8a6031p-1 ++-0x1.0373e4dddeb2ap-2 ++0x1.fd2901f3c9671p-1 ++-0x1.b260a79be9a1bp-6 ++-0x1.984e45ef80148p-1 ++0x1.5356962ebfc1cp-1 ++0x1.571e352fdd0f0p-2 ++0x1.f89e41aa2fad5p-1 ++-0x1.e6a1f419a0176p-1 ++0x1.e2d58615983eap-1 ++0x1.ded7b522b64c3p-1 ++0x1.db41972b5b7e1p-1 ++0x1.1b0912987dcf2p-3 ++0x1.e1d26340eb5b3p-1 ++0x1.209d16e918bdfp-1 ++0x1.9d1bd742b6cd9p-1 ++0x1.d8ce209dfe849p-1 ++-0x1.d12fc215483dfp-9 ++-0x1.a4c0d4697fa72p-1 ++0x1.617954103f059p-2 ++0x1.3137f5baf9af4p-1 ++-0x1.507947ccbeeb1p-1 ++0x1.b292e4143ab7fp-1 ++0x1.d82640b61d4f4p-1 ++-0x1.5fe5b15734ccdp-16 ++0x1.f2d0e2931043bp-1 ++0x1.2fd917731a612p-22 ++0x1.f48e103407199p-2 ++0x1.7e2db343d2518p-6 ++0x1.49aec36586d2dp-1 ++-0x1.06ef250e87d2dp-9 ++-0x1.dce7e25ee3f06p-1 ++-0x1.f9667561ea716p-1 ++0x1.ef305027835abp-1 ++0x1.fda044b85c0c4p-1 ++0x1.e184b71badf21p-1 ++-0x1.8f7ec3e278b93p-3 ++0x1.f09ed78d95c96p-1 ++0x1.db5114278e29ap-1 ++-0x1.a56dd3341013ep-3 ++0x1.dc3843f1a56fep-1 ++0x1.2038f78b9bcc0p-2 ++-0x1.acd041b591f89p-1 ++0x1.e739901525d14p-1 ++0x1.e6ab002c0fd58p-1 ++0x1.ea88c7564fe3cp-1 ++0x1.fc9c210385ec5p-1 ++0x1.300c178b2707bp-2 ++0x1.64adc3a6fd19ap-1 ++-0x1.fd26d46627291p-1 ++-0x1.50b1823ecd041p-1 ++-0x1.0460742bc8cdbp-1 ++0x1.ee1d52dfb4db7p-1 ++-0x1.f8df26ac867ecp-1 ++-0x1.101697bd3de35p-3 ++-0x1.f08df75686ba5p-1 ++-0x1.ace67097f9affp-2 ++0x1.e8d044bdd2df4p-1 ++0x1.f567c745b44b1p-1 ++-0x1.293da15462edcp-3 ++-0x1.ff6a619be98e6p-1 ++0x1.870715d5a6b13p-3 ++-0x1.0c6132d48b23ap-1 ++0x1.bfcac730c5b46p-20 ++-0x1.eede64d01dd85p-1 ++0x1.4a0014931f1a7p-1 ++0x1.c04bc2fc8d9a7p-1 ++0x1.2ab9e2f378d0ap-3 ++0x1.5fd3677becabcp-2 ++-0x1.28cef33a72793p-1 ++-0x1.b17535ce5f5e3p-1 ++0x1.126fb704975d2p-2 ++0x1.f5e136218d473p-1 ++0x1.922b42c5e0ed7p-19 ++0x1.ace8606018cd4p-1 ++0x1.2b74811bfc23dp-2 ++-0x1.ef2a370ffe51ep-1 ++0x1.f9f6a148adee0p-1 ++0x1.f4021476db864p-1 ++0x1.95f375fe34bb5p-23 ++0x1.eca2876cca9d0p-1 ++0x1.d7351318c57d6p-20 ++-0x1.c5b4f73fa50c8p-25 ++-0x1.c94d46e4a466ap-1 ++0x1.901222b3eb03fp-1 ++-0x1.f2f094f1075f9p-1 ++-0x1.f86a7137c57dcp-1 ++-0x1.8e3c37a819136p-3 ++0x1.4ec1702690f49p-1 ++0x1.7af330368dd58p-11 ++0x1.84a1865b3e5f0p-1 ++-0x1.e4e0305c7b1bbp-1 ++0x1.ff49a7d7f6d62p-3 ++0x1.f2bad6b8e3ad9p-1 ++0x1.ff22f34c30d58p-1 ++0x1.eff9a7f819fecp-1 ++0x1.c32c91193429cp-13 ++0x1.5d40255ad5479p-2 ++-0x1.841801a2f578cp-1 ++-0x1.dbd584ff2c565p-1 ++0x1.a291c450afde5p-1 ++0x1.eae6f79c5a22bp-1 ++0x1.e6a5815c8e911p-1 ++0x1.effbb6d1ea58dp-1 ++-0x1.7b2d0222d18edp-1 ++-0x1.629942502fa18p-2 ++0x1.4d83c5fd055fap-1 ++0x1.878e4270d439cp-1 ++0x1.e9d9730db6039p-1 ++-0x1.1e06e6cea4258p-2 ++0x1.f65ff39e90426p-1 ++-0x1.cdb98479835c6p-9 ++0x1.d768f6851ecbcp-1 ++0x1.f69e2232d6a42p-1 ++0x1.ec53932232948p-1 ++0x1.f67aa7a0b8826p-1 ++-0x1.fabca4ba5ef23p-1 ++0x1.ee69c2e52baf8p-1 ++0x1.26f0054eb2e0ep-2 ++0x1.0713f52f5375ep-2 ++-0x1.cbe100e36ed62p-1 ++-0x1.40a8260114e62p-1 ++0x1.f3063795bb159p-1 ++0x1.c716b64d97f72p-1 ++0x1.8981a41813d96p-3 ++0x1.d7c1209925c7ap-1 ++-0x1.ff581104611a1p-1 ++0x1.0c85d2b6d6e9dp-1 ++-0x1.8e8714dc38c74p-20 ++-0x1.b03cb5319aa16p-1 ++0x1.d72834d33b477p-1 ++-0x1.f01b11376becdp-1 ++-0x1.415a16a005c76p-20 ++-0x1.fe90e5f9be415p-1 ++0x1.dde612d789020p-1 ++0x1.d9f3738b76c1fp-1 ++0x1.db5327bba31b5p-1 ++0x1.adc4400d2246cp-22 ++-0x1.ff88333427dbap-1 ++0x1.eb26276420df2p-1 ++-0x1.b6c7247c84ca1p-2 ++0x1.e02a848a05a70p-1 ++0x1.043b03cb8172fp-3 ++-0x1.33d676f26127ep-3 ++-0x1.7608255d04435p-3 ++0x1.04f80268e9ce1p-1 ++0x1.464bc0a199508p-1 ++0x1.29ef60c6d1649p-2 ++0x1.ee97e455401a2p-1 ++-0x1.fd9ed1b43f715p-1 ++0x1.eb715394fd91dp-1 ++0x1.d7233283a8bd9p-3 ++-0x1.1df410fa478c5p-1 ++0x1.d594f6ab26103p-3 ++0x1.a08f83fd80dc8p-1 ++-0x1.de90b76d413e4p-3 ++-0x1.6084126e687f0p-8 ++-0x1.ff9375ff924dap-1 ++0x1.eaef2277ad27bp-1 ++-0x1.567a6656d28acp-1 ++0x1.db239524e4064p-1 ++0x1.ea15917f3ccbdp-1 ++-0x1.aecd11f1ad305p-1 ++-0x1.3f3391d575ab0p-1 ++0x1.2065b112d45b7p-1 ++0x1.eefeb58f716edp-1 ++-0x1.752456499480ap-2 ++0x1.f628431ac8afbp-1 ++-0x1.d4f5807797fcdp-3 ++0x1.52b317a0f2bb4p-2 ++-0x1.36be46b7fbb08p-2 ++0x1.e57282515307ap-1 ++0x1.8cb3963d2de1dp-1 ++0x1.f86d8777ff85dp-1 ++0x1.dbec93d39559cp-1 ++0x1.ef15079437d86p-1 ++0x1.9912915e0e9d2p-1 ++0x1.eddfa64b338bcp-1 ++-0x1.05d235555bca1p-1 ++-0x1.fb398088adb40p-1 ++-0x1.8529e4f0cd31ap-6 ++-0x1.daf8854d3e5e7p-1 ++0x1.562e8760fd24dp-1 ++-0x1.2bb627405320cp-3 ++-0x1.dbbe424b49782p-1 ++0x1.db7c6724b9b5cp-1 ++-0x1.86c5e771c6e89p-1 ++0x1.eb6cc05b2299fp-1 ++0x1.cbdfe416b513ap-16 ++0x1.e80bd7a912478p-1 ++0x1.e20654791ee42p-1 ++0x1.e7c99604f72c5p-13 ++0x1.e384454b782e3p-1 ++-0x1.2f821736b5783p-1 ++0x1.ec2dc7a3f7b9ap-1 ++-0x1.f58cb69431ff8p-1 ++0x1.291eb281d5031p-2 ++-0x1.22d8d0d689c58p-2 ++0x1.edae94523b924p-1 ++-0x1.dc31f75dbd8bap-1 ++-0x1.f41750df779c1p-1 ++0x1.1dbe97dccb13ap-24 ++0x1.fb352364b9b84p-1 ++-0x1.2f5617c2cdd47p-1 ++0x1.69d035f7a7ee7p-8 ++0x1.72e2e6f704395p-8 ++0x1.f86e40ec67bd7p-1 ++-0x1.d74544791ed55p-3 ++0x1.ee79c2eaca96bp-1 ++-0x1.97f484b97f423p-1 ++0x1.ecca71ea821fbp-1 ++0x1.cb2254385c652p-1 ++-0x1.e83561b46f5e8p-1 ++0x1.bd9f3198d30dep-25 ++0x1.e9e7b30a7666fp-1 ++0x1.b768a1d09af67p-3 ++0x1.0345e3f133efep-2 ++0x1.b45fb3fc48819p-1 ++0x1.426bd7fd10932p-1 ++-0x1.57e6c01243fa0p-1 ++0x1.1f4821c5d7096p-1 ++-0x1.de19b73619e5dp-1 ++0x1.53cb05c92ecbfp-1 ++0x1.90754146fad63p-1 ++0x1.4973979c27e9cp-2 ++0x1.ae33e7c0fbf30p-4 ++0x1.e032e42a2040ep-1 ++-0x1.ea40a3cab079fp-1 ++-0x1.6907e6c0916a9p-1 ++-0x1.1c59c6555ce1ep-3 ++-0x1.12fce6ee5e120p-3 ++0x1.747724780a0a7p-1 ++-0x1.3c6f734ef61e6p-1 ++0x1.dcd584c6d27cbp-1 ++-0x1.c27d81c83efabp-1 ++0x1.d990c3dac50c1p-20 ++0x1.a3c463d5b6e67p-1 ++-0x1.0820a1102e865p-1 ++-0x1.ab2a1549ea8ebp-3 ++0x1.dcde36cbc878bp-1 ++-0x1.42374083a3e0fp-4 ++0x1.ef0c857a36fa3p-1 ++0x1.e9e3a68ecccb7p-1 ++0x1.7f05d2127fea2p-1 ++0x1.e87935312ca1ap-1 ++-0x1.eb7110ff0f66ap-1 ++-0x1.c15fb366cfcf9p-1 ++0x1.f08de63d6483ep-1 ++-0x1.c72931d050543p-6 ++0x1.1cb62361bff83p-2 ++0x1.22db1186e6583p-10 ++0x1.e862d28475fb9p-1 ++-0x1.727515872cde2p-25 ++0x1.1a80e5cb79b32p-14 ++-0x1.c48fc05bc06adp-1 ++0x1.ef6a04b724d4ap-1 ++-0x1.70ba1780348d9p-1 ++0x1.e68fd1d34efdcp-1 ++-0x1.edbeb6d147be3p-1 ++-0x1.ffb8054bd5bb2p-1 ++-0x1.205784cd6e44ap-1 ++0x1.b9eea1cf61152p-8 ++0x1.ead9f4facbad9p-1 ++0x1.41f1177f3aa4dp-3 ++0x1.1cb3c7898c6c5p-21 ++0x1.3b9562043baf3p-2 ++0x1.9a03f093bbf71p-1 ++0x1.22d245b843dc6p-1 ++0x1.fe6b7655a7c27p-1 ++-0x1.f53d46b53474cp-1 ++0x1.edc8174da0475p-1 ++0x1.453ef06515377p-1 ++-0x1.cf39e3a140966p-3 ++0x1.b3870738c9a7fp-1 ++0x1.c03ff7b9aa3ccp-1 ++0x1.d88de462de411p-1 ++0x1.907531b1ec30bp-1 ++0x1.e807c59e08986p-1 ++0x1.d01ee7e80196dp-1 ++0x1.eb29729cac7d4p-1 ++-0x1.9b6ff25e8b37bp-1 ++0x1.06cb55e19f50bp-1 ++-0x1.c969c47d61594p-2 ++0x1.2f8fd229e5a28p-1 ++0x1.ec5d65428be39p-1 ++0x1.e3f1f13dd3842p-1 ++-0x1.6fdf45f0448e4p-1 ++0x1.c693d3e0c3d93p-1 ++0x1.ec2b351c3d553p-1 ++-0x1.023bb65902175p-2 ++-0x1.e41b13bb1ae98p-1 ++0x1.ed5233df8f1b0p-1 ++0x1.d3745523a5b72p-3 ++0x1.b11183467f9f4p-1 ++0x1.f96977e343f28p-1 ++0x1.647e07d72c3ccp-1 ++-0x1.dd7b40d163147p-1 ++0x1.a955c3158f95ap-3 ++0x1.ddbbe2e244b52p-1 ++-0x1.dd9476201ab1ep-1 ++-0x1.c173b1455120cp-10 ++-0x1.4849770c21219p-1 ++-0x1.e9c224c0132f3p-1 ++-0x1.9c7115f5fa7edp-23 ++-0x1.ededb18a270f5p-1 ++-0x1.dc41f5d54e145p-1 ++0x1.f260631aa28c5p-1 ++0x1.dd80538515b09p-1 ++0x1.e45ea178c9b30p-1 ++0x1.d98ee1fe8fa72p-1 ++0x1.ec3b7502ba31bp-1 ++0x1.9202f7b61b23cp-1 ++-0x1.e90160c48172dp-1 ++0x1.029cb182129c5p-1 ++-0x1.ecf921278c665p-1 ++0x1.f1df6352de955p-19 ++0x1.e820a1d008c40p-1 ++0x1.cf1bc071e7b1dp-13 ++-0x1.a7f9c47f84b4bp-11 ++-0x1.91d2b301a130ep-6 ++0x1.eb7e233b26b9cp-1 ++0x1.5285126c10af6p-11 ++-0x1.413ff2f91c7e0p-1 ++-0x1.909622a8afce0p-9 ++0x1.91f83092eaa5bp-1 ++0x1.e9f0072632510p-1 ++-0x1.4291a2d3c6a6ep-1 ++-0x1.91a7814a1afe7p-2 ++-0x1.f2e5c1ddfca4dp-1 ++0x1.4ed7f0ccb3beap-1 ++-0x1.56758387f3eb7p-1 ++0x1.0817c57f66fd7p-1 ++0x1.92ba54b90cb1fp-1 ++0x1.8393d0a315e11p-1 ++-0x1.ebf5435363845p-1 ++-0x1.182971e71f1c4p-25 ++0x1.30bad35036ebep-1 ++0x1.e6a7c48aae965p-1 ++0x1.5c09f0643688cp-1 ++0x1.bdb701415b22ap-1 ++-0x1.80b045165e5bep-1 ++0x1.ec2a609f9c95bp-1 ++0x1.fdf1358d71fa7p-1 ++0x1.f38ae51ef650dp-1 ++0x1.c3b5220ba05abp-2 ++0x1.64e7b7d518cdap-16 ++0x1.e3172710f85acp-1 ++0x1.c3d957db61cd0p-16 ++-0x1.76789202c62c6p-10 ++0x1.b9314508fdd23p-1 ++0x1.fbc7e244da846p-1 ++-0x1.feea04702b990p-1 ++0x1.c77664b2ebec3p-1 ++0x1.eb18f40a3c0a1p-1 ++0x1.f3d57719d5a66p-1 ++0x1.a1b9e5f02c25fp-1 ++0x1.d9db75669d2e1p-1 ++0x1.85d832f631a51p-2 ++0x1.9485a38e25cb3p-1 ++-0x1.1afd8636d88a6p-4 ++0x1.05798672f5ea3p-2 ++0x1.ffe9232e1641fp-1 ++0x1.f578d77058051p-1 ++0x1.32f086b72fc47p-3 ++-0x1.f80cc6c503e0bp-1 ++0x1.f28b64ae14d36p-1 ++0x1.db3f10c932ea3p-1 ++-0x1.fcdff69481c76p-1 ++0x1.b0b1822e2d791p-1 ++0x1.e47cf5ea94794p-1 ++-0x1.edbb01a598c24p-1 ++-0x1.f2d2c4f587093p-1 ++0x1.d810f191b7661p-1 ++0x1.f93393613674ap-1 ++0x1.be82e4ac9bddbp-1 ++-0x1.0579e7d148859p-8 ++-0x1.c7f3c1fdcabf4p-3 ++0x1.efad546ed467cp-1 ++0x1.fd6a251b4821ep-1 ++0x1.0315f5c097414p-3 ++-0x1.7db404e004dd9p-1 ++-0x1.fdabb5f507142p-1 ++0x1.c64fd560d1b67p-2 ++0x1.ca0d01c21706dp-1 ++0x1.e45216887ff71p-1 ++0x1.df2ec764ef6adp-1 ++-0x1.8e65606bed199p-3 ++0x1.dbc053fc0855cp-1 ++0x1.6b8ba297a525cp-1 ++-0x1.00882585a29eep-1 ++0x1.d353f591637b8p-1 ++-0x1.79f546d33544bp-3 ++0x1.efa4e409fde87p-1 ++0x1.ee1163afd0a03p-1 ++-0x1.fad96389524bfp-1 ++0x1.e85bb560bc75dp-1 ++-0x1.f069332e76f6dp-1 ++-0x1.6fb4348faf5c4p-3 ++-0x1.ce9367ceb44dap-9 ++-0x1.f0a930040729ap-1 ++-0x1.505075bc12d92p-16 ++0x1.947d6278f2ca8p-1 ++-0x1.f086970443d28p-1 ++0x1.d025216b99be2p-5 ++0x1.dcfa56e705532p-1 ++-0x1.f30504c59eceep-1 ++0x1.dd52d7e19870ap-1 ++0x1.02ddf0359bf9fp-1 ++-0x1.4f4065a22973ap-23 ++0x1.f40f75a7770a1p-1 ++0x1.59ae8671b31e8p-26 ++-0x1.536450991d17cp-2 ++-0x1.ae0193af9d6a2p-3 ++-0x1.27ba2598fa425p-1 ++-0x1.77f897e89fff8p-5 ++0x1.eff8918d7a81cp-1 ++0x1.e8f05228d4ca1p-1 ++-0x1.7c509777a588ep-1 ++0x1.2176d0b801649p-3 ++-0x1.e69f374a699d8p-1 ++-0x1.bed374f104cadp-3 ++0x1.f3a922a74a827p-1 ++0x1.762275548f202p-1 ++-0x1.f566226c407c7p-1 ++0x1.4cdae1fead7dbp-1 ++-0x1.eb4487592a9adp-1 ++0x1.edeeb5688f291p-1 ++0x1.e99891b04ddafp-1 ++0x1.f86cf3b9e83a7p-1 ++0x1.c3f7a686c78b0p-2 ++-0x1.6150a09268c74p-1 ++-0x1.dcee02e875157p-1 ++0x1.eb1bf69818892p-1 ++-0x1.e5a480f554f3dp-16 ++0x1.84afb5f1ed3adp-1 ++-0x1.df31c5eae509fp-3 ++0x1.ff99528e27db8p-1 ++-0x1.e1a5a6243d05dp-3 ++-0x1.85fce11104791p-21 ++-0x1.fb51005dfdc02p-1 ++0x1.dcb463175cfcep-2 ++0x1.82519454bb349p-1 ++-0x1.fdcdf349a6f25p-1 ++0x1.602547dc6ecefp-24 ++0x1.bec560986a04ap-1 ++0x1.2011857db1424p-26 ++0x1.e1eec570b4a79p-1 ++-0x1.e77cb3d6aba48p-1 ++-0x1.8836556db32e5p-11 ++-0x1.e73505baf1ce0p-1 ++-0x1.e9d165420d859p-1 ++-0x1.ea73d35821c98p-1 ++-0x1.fc7083dcfce44p-1 ++0x1.4eaa72b0ad80bp-3 ++0x1.ee9b055b272f4p-1 ++-0x1.fc77850c869d8p-1 ++0x1.df2253bc59523p-23 ++0x1.ea0197e40cc09p-1 ++-0x1.e12937d9b5de6p-1 ++0x1.b78007f752b47p-1 ++-0x1.caf0a20a2e374p-3 ++0x1.403b25eaecdebp-3 ++-0x1.f09981083beb5p-1 ++0x1.1dfac77800264p-1 ++-0x1.f968b772c835fp-1 ++0x1.4183f2511d03ep-1 ++0x1.14fe334ed4841p-13 ++-0x1.ef68700ccd1ddp-1 ++0x1.495424a43a336p-1 ++0x1.f9f556f848f73p-1 ++0x1.e700764aa6a73p-1 ++0x1.c65e964229e7ap-1 ++-0x1.e91f7469d5670p-1 ++0x1.8d72537de0726p-1 ++0x1.d77df54bf42f3p-3 ++-0x1.e3f4e3f7cff28p-1 ++-0x1.980ec5ab0c67bp-1 ++0x1.82b481c2cab01p-1 ++0x1.e92fc79dc3af8p-1 ++-0x1.84edb030c6673p-1 ++0x1.134ed3adb9b89p-1 ++-0x1.5b0384147576ap-1 ++0x1.ec38f12ad09b0p-1 ++-0x1.9d3d5705b61bfp-1 ++0x1.e9a5111dca87fp-1 ++0x1.5ec077d61d074p-1 ++-0x1.8bb177f1b45d0p-1 ++0x1.026085634ea4fp-1 ++0x1.5dece01fa73aap-1 ++-0x1.f282f0325a811p-1 ++0x1.4e17a4a822867p-2 ++0x1.b710142936fc4p-1 ++-0x1.ea74f086de3c2p-1 ++-0x1.b5bb322363d88p-1 ++0x1.e01382ce9664ap-1 ++0x1.ec9d46fe101abp-1 ++0x1.e080f6a0dd5a1p-17 ++-0x1.dc4d67b50cadcp-1 ++0x1.bb0924c1b5c65p-1 ++-0x1.e4d98477aac5ep-4 ++0x1.ed52a73ea36ddp-1 ++0x1.d20927aa97a9bp-3 ++0x1.b1865059b9e39p-1 ++-0x1.b0caf4d4e58fap-22 ++0x1.f1a1076fec8e1p-13 ++0x1.6c6f93492c70fp-3 ++0x1.adf6648fd1042p-1 ++0x1.eff466a400727p-1 ++0x1.8e77870756612p-4 ++0x1.e4c511850f25dp-1 ++0x1.cced71fd52d9ap-1 ++0x1.ebb466b23c3bep-2 ++0x1.6669639648fa3p-1 ++0x1.7302146a6f168p-8 ++0x1.350056b6cb901p-2 ++-0x1.eede45da2f03ap-2 ++0x1.ac0623cd70a73p-1 ++0x1.87b2d4dcffaf9p-1 ++0x1.edaf06121f8e1p-1 ++0x1.e825a4e96f86cp-1 ++0x1.168a051460dc0p-1 ++0x1.eaa75704957d3p-1 ++-0x1.e142463188648p-1 ++0x1.d81356fe7e9b0p-1 ++0x1.e99b85f839547p-1 ++-0x1.f1296188d7fd8p-1 ++-0x1.a3b6f7aed0ad8p-1 ++0x1.6b0c23fcd3f91p-3 ++0x1.dab904f709a95p-1 ++-0x1.841256a82781ep-1 ++0x1.d26af3ab7517ep-1 ++0x1.e325a078e329bp-1 ++0x1.8aa5a22125090p-1 ++-0x1.b0fb607111e72p-3 ++0x1.e45197e7efcdbp-1 ++0x1.d9c6b1b971945p-1 ++-0x1.5fb6e7f514f55p-16 ++0x1.fa1f54af3ad94p-1 ++0x1.e8e045abf094fp-1 ++-0x1.5b9f05ea1adb3p-3 ++0x1.eee721d6726d1p-1 ++0x1.f1df37430f58ap-1 ++0x1.e58f617f2d384p-1 ++0x1.eb68943e2deb4p-1 ++0x1.dba9c1307a5c6p-1 ++-0x1.edb676b500699p-1 ++0x1.cb6e21730fca5p-8 ++-0x1.a314d11caa5dfp-1 ++-0x1.58d865bce598fp-22 ++-0x1.9da4077805769p-1 ++0x1.bca24367daca5p-3 ++0x1.408035d6251e7p-2 ++0x1.8e30509588bc3p-1 ++0x1.dac374698d877p-1 ++0x1.dc95570330076p-1 ++0x1.ed72961c6499fp-1 ++0x1.e267d33665809p-1 ++-0x1.1fd1b6af697a5p-1 ++0x1.b199976061c55p-1 ++0x1.640c203fbc506p-1 ++0x1.e67287d997f06p-2 ++-0x1.e8092359ccf4ap-1 ++0x1.479fe3a388580p-3 ++-0x1.1c9d850480123p-1 ++0x1.f6b3e32b9007ep-1 ++0x1.ee40207bb6d7ap-1 ++-0x1.3e0fd5ef49ea8p-1 ++0x1.48352432fcd1ep-5 ++-0x1.488b1538a5682p-2 ++0x1.70fc57b129bcfp-18 ++-0x1.ee0460d9eea8dp-1 ++0x1.262c4237b3aa2p-4 ++0x1.24f1f0887a167p-1 ++0x1.bc7813a548ecbp-1 ++0x1.dd3682e648173p-1 ++0x1.1a8247328b1eep-3 ++-0x1.461fb55f0c643p-1 ++0x1.e89a03c027e50p-1 ++-0x1.6445d488fb56fp-1 ++-0x1.f30720b9f9272p-1 ++0x1.10fef55d9e170p-1 ++-0x1.7e6e516a67284p-2 ++0x1.803b652c34127p-4 ++0x1.23e746d6a07b5p-1 ++-0x1.9b0893a2dbf31p-1 ++0x1.df6b52d932cacp-1 ++0x1.eba142e0d30f9p-1 ++0x1.e207a62a59fcfp-1 ++-0x1.f59ff5ac905bep-1 ++-0x1.2252f1f145275p-1 ++0x1.e99bb7a320afdp-1 ++0x1.528a81b8c8b43p-25 ++0x1.66e7a5c93cffdp-9 ++0x1.d8a270540bc22p-1 ++-0x1.8d0303f6f1f62p-3 ++-0x1.032112989c73fp-1 ++0x1.edd9f404d15d9p-1 ++-0x1.d8e2928b59a29p-1 ++0x1.e9fbd325bdd05p-1 ++-0x1.f6c115f45ea83p-1 ++0x1.9dbc024e5215bp-1 ++0x1.ea052157d8d3dp-1 ++0x1.e97b1034a0d7cp-1 ++-0x1.3868c3fb4119cp-3 ++-0x1.6547c3be6a0acp-3 ++-0x1.f0f7210f0ebc5p-1 ++0x1.dbd1b3d836677p-1 ++-0x1.87ba7548c0c70p-1 ++0x1.f32ba685b010ap-2 ++-0x1.5707a4571ae80p-19 ++-0x1.190106b7f25c8p-3 ++0x1.b1b2b37a33650p-6 ++0x1.b7da5623c2a54p-1 ++0x1.a12f204462a9dp-1 ++-0x1.8e33904e6f50ep-3 ++0x1.bac7d494af41dp-1 ++-0x1.5bd7769cc02b9p-6 ++0x1.e2549512a7f87p-1 ++0x1.a34fb7f76f669p-1 ++-0x1.fc4f82b958521p-3 ++0x1.f03885d69275dp-1 ++0x1.93c937306bc8dp-1 ++0x1.ef66f0124ea6fp-1 ++0x1.8683e2fd856ebp-1 ++-0x1.00e2e49d1662bp-1 ++-0x1.240eb5bacc34ap-15 ++0x1.f782b34dadcd6p-1 ++0x1.685494fdc570dp-16 ++0x1.f6f324645f159p-2 ++0x1.f1fc5526b9729p-1 ++0x1.941db204468a9p-1 ++-0x1.fb8797543c4b1p-1 ++-0x1.f19ce1482169bp-1 ++-0x1.e83cf6df11013p-1 ++0x1.ec0474051022dp-1 ++0x1.9b0074ea40e80p-1 ++-0x1.b110618fb5339p-1 ++0x1.e310d4b197c1dp-1 ++0x1.3e4a143f9f023p-1 ++-0x1.c3dc834396667p-24 ++0x1.72d485fe0970ap-2 ++-0x1.4792b4bea367fp-3 ++-0x1.fb6f90001c47fp-1 ++-0x1.563f503456ca4p-6 ++0x1.f49c77ef6eec4p-1 ++-0x1.f3f604ec44843p-1 ++0x1.e5b073ba13507p-1 ++0x1.dfcd37b56a082p-1 ++-0x1.ec7c15c1bc9b7p-1 ++-0x1.f3e33346bb4dfp-1 ++-0x1.70bea3753575bp-1 ++0x1.0ad654e7bcdb2p-1 ++0x1.d84772ae3d0c8p-1 ++0x1.db9382f54f801p-1 ++-0x1.3a0d506141a45p-5 ++0x1.decef09b22fd6p-1 ++0x1.e990941dd115ap-1 ++-0x1.4ac55461df70ep-1 ++0x1.caba758c29af2p-1 ++0x1.e8b807c00d6bcp-1 ++0x1.fadb16bea03d0p-1 ++0x1.7b8f62c69b8a2p-13 ++0x1.db1814c6b7c5cp-1 ++0x1.d8a437361ed5ep-1 ++0x1.f044936247105p-1 ++-0x1.f29923dbc3facp-1 ++0x1.ede3135347315p-1 ++0x1.ecb6a131593d5p-1 ++0x1.69be27f5085c2p-2 ++0x1.d87e91b7e07b7p-1 ++0x1.3e1573b76d74cp-13 ++-0x1.7110638b16bc4p-1 ++-0x1.2b60914429455p-2 ++-0x1.45e0c3984738ap-3 ++0x1.042141ca2ed6cp-18 ++0x1.384f45b294648p-1 ++0x1.feba34573e769p-1 ++-0x1.ea047532c3043p-1 ++0x1.fbe731d9f7db8p-1 ++0x1.b7b916674f33fp-1 ++0x1.fb43d2c826ee8p-1 ++0x1.df7c8777dba5ap-1 ++0x1.ed5ea12bfef39p-1 ++-0x1.638ad761f476ap-1 ++0x1.fc4bf5179e5d6p-1 ++0x1.e3b6708ecfee8p-1 ++0x1.dbce065bbf8a3p-1 ++0x1.7ce703c2bf2a6p-1 ++-0x1.ea19b32b1c2dfp-1 ++-0x1.fa1886281c79bp-1 ++0x1.40057632df635p-3 ++0x1.be3342c4dacb3p-1 ++0x1.e20274fe208a9p-1 ++-0x1.e15a87fb65354p-1 ++0x1.f9c7e2ecd680bp-13 ++0x1.e3c93361c3a97p-1 ++0x1.f0aa055bc4ec5p-1 ++0x1.1d7f011b0caa7p-1 ++0x1.27ef5716d9743p-1 ++0x1.0109b001e0b16p-1 ++0x1.06fcb4f915884p-1 ++0x1.d912e662c11fdp-1 ++0x1.f459c0e5d6307p-1 ++0x1.33b182a9dd437p-7 ++0x1.f050a642bbd28p-1 ++0x1.67dd05510a128p-1 ++0x1.f508c0df81a84p-1 ++0x1.dc24f6d5d88e9p-1 ++-0x1.1de410116c6abp-3 ++-0x1.ce8021cd33ff0p-20 ++-0x1.df8e14d8335ccp-1 ++-0x1.d944534af1d02p-1 ++-0x1.7a7641865ee08p-1 ++0x1.0a79566e358dcp-2 ++0x1.e1ddb24870183p-1 ++0x1.0be5106302396p-1 ++0x1.e84a706f6d265p-1 ++-0x1.fb54f05a586f3p-1 ++0x1.d7f7810bbad7cp-1 ++-0x1.e911418959876p-1 ++-0x1.eef2e7388b0b8p-1 ++-0x1.096cd55dea973p-2 ++0x1.e3edc46730656p-1 ++0x1.1f999553c9965p-1 ++0x1.53bff03662b79p-1 ++0x1.cc4591ffd8c8fp-1 ++0x1.32edf494b513fp-1 ++0x1.f92963d71b0a5p-1 ++0x1.ca73a41b238a2p-1 ++0x1.a08fc5e1724bfp-1 ++0x1.3e603689d203ap-1 ++-0x1.995221a7cd650p-1 ++0x1.dee8b256137cdp-1 ++-0x1.053fb553b89f8p-1 ++-0x1.496161b184764p-1 ++0x1.eb38128f82439p-1 ++-0x1.f613a094bcd5bp-1 ++0x1.d97577265ac94p-1 ++0x1.b2613742a87f2p-1 ++-0x1.9ae634697f924p-2 ++-0x1.fc2075806621dp-1 ++0x1.e0a975f696bc8p-2 ++0x1.f6f6b7b5834b8p-1 ++-0x1.fe1f228d0b462p-1 ++0x1.f70a91841af44p-1 ++0x1.e2f9c07852f70p-1 ++0x1.7273722e70f48p-2 ++0x1.db9c019d4ecbbp-11 ++-0x1.59ab151c1482cp-1 ++-0x1.c2a3b1d7f7890p-1 ++0x1.e700830d53942p-1 ++0x1.6324a18a48715p-1 ++-0x1.f8d06493cf734p-1 ++0x1.f80b9422bce4ap-6 ++-0x1.23b475322f69dp-9 ++0x1.25489233b69fep-3 ++0x1.a305e63ca5b92p-1 ++-0x1.ff6614d7db93dp-1 ++0x1.52b3468ba247fp-19 ++0x1.f631f6454296ap-1 ++-0x1.0ccec227b1aa8p-1 ++0x1.1c0a50f58ee7ep-1 ++0x1.eb1881275a5fap-1 ++0x1.e5a3c6b686c17p-1 ++-0x1.5abd34f01cc55p-25 ++# acos multiple precision fallback. ++# Implemented in __cos32 in sysdeps/ieee754/dbl-64/sincos32.c ++## name: slow ++0x1.91744378d312fp-25 ++0x1.e31933dfcae5ep-6 ++0x1.560a94c69898dp-28 ++0x1.4ede34c4c5b9cp-39 ++-0x1.b5caf13967673p-28 ++-0x1.d242039676722p-32 +diff -urN glibc-2.17-c758a686/benchtests/asinh-inputs glibc-2.17-c758a686/benchtests/asinh-inputs +--- glibc-2.17-c758a686/benchtests/asinh-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/asinh-inputs 2015-06-20 21:22:16.295458166 -0400 +@@ -0,0 +1,303 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.408fb643484cep-11 ++0x1.f0763423f1d52p-23 ++-0x1.681573418e494p4 ++-0x1.87cc25833f74bp16 ++-0x1.ad3df5eb7db54p24 ++0x1.90f147b3d0164p829 ++-0x1.60b1066c6712ep71 ++-0x1.5997c27aac9ccp332 ++-0x1.2cb3142c669a0p15 ++-0x1.ec882168157e6p191 ++0x1.43a1d0e6eae29p109 ++-0x1.2b43c388e1857p672 ++0x1.f11c07e219bafp7 ++0x1.f5efb379e3b3fp952 ++-0x1.405cf322b684cp-13 ++-0x1.fa64c4090d337p43 ++0x1.a98724f016a93p-13 ++-0x1.5743f3604a7fbp10 ++0x1.042971d37879bp-17 ++0x1.d4cda5814c00fp-2 ++0x1.ec1e878f29cf8p97 ++-0x1.6a4cd37896c5fp-24 ++0x1.da85d34b19160p-10 ++0x1.c068c277d171fp-17 ++-0x1.b3e2d1ead4160p-1 ++-0x1.ac8a62deb27c3p521 ++-0x1.e28e32ce20a25p-1 ++-0x1.e70635022c5fdp315 ++0x1.984146d8a6c69p20 ++-0x1.67cf155405aadp747 ++-0x1.a852444a7de0ep-23 ++0x1.92e4800542f83p108 ++-0x1.564ba0e9ad540p-7 ++0x1.c36c11c290063p20 ++0x1.4723d5459434cp-26 ++-0x1.43c1535cd024bp-11 ++0x1.6d46e7252da2fp388 ++0x1.756f2685e9ca9p-26 ++-0x1.72268726f4141p22 ++0x1.558480e0da8bdp15 ++0x1.ef0970332ed6fp-3 ++0x1.2015764e98ea6p481 ++-0x1.3a0f66a229b60p871 ++-0x1.c833f28187420p-25 ++-0x1.a0ea74513cffbp778 ++-0x1.d2dde734625d1p13 ++-0x1.996507c01ea97p25 ++0x1.d36f165b63b8fp880 ++0x1.445234d59e32bp-2 ++0x1.cd74423b4c4aep15 ++-0x1.c0b6631621425p-1 ++0x1.a2e0f00779702p-25 ++-0x1.fcf5c0266c2f2p-22 ++-0x1.af38a56120728p-21 ++-0x1.9ec217ea497dap1 ++0x1.57a000ceee049p800 ++0x1.6c1b6312efacfp783 ++0x1.afb5c0c4f933ap6 ++-0x1.f9267499e3327p16 ++-0x1.9b5ba5b496ae5p10 ++0x1.3975f02686229p10 ++0x1.36b913a68fe70p901 ++0x1.8946b691ecf5ap10 ++-0x1.efbb62a588bccp24 ++0x1.f3de8628048d9p-8 ++0x1.8ec222d562aa9p25 ++-0x1.ac03e6a0d863cp22 ++-0x1.6d9d94c1e0b6fp23 ++0x1.9807337060f87p-10 ++0x1.0f8045a313158p26 ++0x1.fe8cd64528951p-16 ++-0x1.51c184460cfafp-26 ++-0x1.74b0f442763c7p20 ++-0x1.d30da53c93e10p18 ++0x1.749735f182597p15 ++0x1.253da08c9c318p144 ++-0x1.2714417156ae3p693 ++-0x1.189320570f30bp26 ++-0x1.a2e120ac12626p756 ++0x1.ce724582eabcfp-24 ++0x1.30dcf0414c561p292 ++-0x1.1a1790d8a72d1p452 ++0x1.3242254b631b3p-26 ++-0x1.b5890305f1b78p11 ++0x1.019a86d2e2300p18 ++0x1.0e9cc39a3bff8p-14 ++0x1.bc8ff7e59e82ep18 ++-0x1.235a45afa3842p25 ++0x1.0b2c87979b28cp23 ++0x1.c717951ecf869p-9 ++0x1.daff104bb08a5p25 ++-0x1.b14b119b47d4ep5 ++0x1.6e8a94f758a02p802 ++0x1.7788055510c4dp23 ++0x1.6120d7e4e5d9ep498 ++0x1.1154e15c2c284p-24 ++0x1.eb28429726661p423 ++-0x1.b9faa23669003p9 ++-0x1.a615746664b00p339 ++-0x1.835384e92d59cp56 ++0x1.1fb4b0fe36aacp-3 ++-0x1.e440c3183f046p-19 ++-0x1.1e714012cae50p22 ++-0x1.1821b0014d9cep-16 ++-0x1.5de4c1e0a1bfep-24 ++-0x1.c1e5c78840e91p25 ++0x1.f0b1d4cd82236p18 ++-0x1.450ff3ad26e5bp984 ++0x1.23438314fb10bp0 ++-0x1.82be43e413126p14 ++-0x1.5c70206fd22f7p628 ++0x1.7e213160ec541p-15 ++0x1.5487358228cedp-14 ++0x1.4a163440f7c98p4 ++0x1.ad443265c6b4ap845 ++-0x1.732c509382338p-2 ++0x1.929ba224e2240p-17 ++0x1.a026b0485c0e8p12 ++-0x1.fa4e77f1b2343p-12 ++-0x1.3a2ac1c73ae50p5 ++0x1.0c4a80d41a2f7p-20 ++-0x1.1c57b37023dcep150 ++-0x1.2c1b509030e5dp26 ++-0x1.c7cdd089827cdp-26 ++0x1.3d88b121650aap8 ++-0x1.1583f2a9d2d5dp618 ++0x1.295d65809666fp111 ++-0x1.3dc8c1a73f146p-3 ++-0x1.4dc715a6ae290p999 ++-0x1.3808360307701p464 ++-0x1.adf4158880f7bp2 ++-0x1.3913104f0eea6p-16 ++0x1.8c91558dbd886p-2 ++-0x1.d67f73ef2736ap11 ++0x1.218c0592aa7fcp95 ++0x1.4c1e32e79005dp7 ++0x1.395461c5f96a6p5 ++-0x1.a311a7fbb5afap-12 ++0x1.f07b95fd415ccp9 ++-0x1.08745233a4ce8p-13 ++0x1.38f122e7f7be0p220 ++0x1.8c9c967e8e99ap-5 ++-0x1.3353e4fc6b002p987 ++0x1.945a20aa092e2p4 ++0x1.a7a935f93958ap22 ++-0x1.946865aa1c43cp-20 ++0x1.001d955d8a436p344 ++-0x1.5146c4a1225eep-22 ++0x1.ffab14f637eaap733 ++-0x1.3d50819d9de92p-8 ++0x1.84a7b4b80f227p4 ++0x1.73af93193478dp-6 ++0x1.3ac9b75c613bdp160 ++0x1.dafd9764a705fp13 ++0x1.91bc310a7648ep243 ++-0x1.531fa4a4bac3ap713 ++0x1.95c32605e6c59p20 ++-0x1.012141d71b636p-2 ++-0x1.eb4540a49b927p20 ++0x1.9c4716594b306p-24 ++-0x1.242df1aa8bf7ep642 ++-0x1.2d1fc7cf19d2ap-27 ++0x1.161fd6fd320d5p745 ++-0x1.3aaa34f975620p811 ++0x1.9e11325b1c3c4p22 ++-0x1.a838b07a6641ap5 ++0x1.8b1a0407ae636p7 ++-0x1.eb717004808e1p469 ++-0x1.d166757807df4p-6 ++0x1.2a57014d8c24bp317 ++-0x1.5ea093bc15910p468 ++-0x1.2545b7ec8b35fp-3 ++-0x1.e47ca00d1f14ep929 ++0x1.af09542db1b29p-18 ++-0x1.8d4bc4f005536p6 ++-0x1.8d564435d4d3fp-9 ++0x1.993a6363227e2p12 ++0x1.bec162f84a16cp13 ++0x1.f0a22293c4ecbp852 ++0x1.9eb0b40303dcap843 ++-0x1.0cdae1dc93ed0p22 ++0x1.21efa25110e19p12 ++-0x1.cf1531a43c397p144 ++-0x1.a043f6a911bdep-16 ++0x1.816c4063e718ap-15 ++0x1.e23b95950e47dp-21 ++0x1.a0830483382afp2 ++-0x1.52e49239a95d4p957 ++0x1.f73a3049f9d76p16 ++-0x1.1304063a4fbe5p316 ++0x1.f5b95104bb64dp320 ++0x1.661d765a50087p13 ++0x1.7bb5671e2bfcap719 ++0x1.3e14e736580b3p-20 ++-0x1.11340035e5609p-25 ++0x1.c4d527df0d553p762 ++-0x1.731bc7cf3026ap7 ++-0x1.079c1776f403fp965 ++0x1.e6879000598aep-28 ++-0x1.d3bee1e831937p25 ++0x1.c3b5f0096df0dp24 ++0x1.667d70b10ce7ep-6 ++0x1.c780d2406b7d1p-26 ++-0x1.df8fd3fe95d12p27 ++0x1.89494217ed887p204 ++-0x1.ea94d70c825d3p764 ++-0x1.04366739a80cbp11 ++0x1.75f1269063e4dp5 ++0x1.0a46e3262c2b8p20 ++-0x1.92c337d25b414p-4 ++0x1.5c2cb3414299cp154 ++0x1.07f7c34023735p881 ++0x1.c64b8297569c4p207 ++0x1.13f4d3bbd6417p8 ++0x1.bde9c42ffd9ecp-15 ++0x1.9e07054aa7309p743 ++-0x1.dd8c11c0073a4p-16 ++-0x1.e04d9283ac8d4p20 ++-0x1.c0f2e29b30840p10 ++0x1.55a4c648ebcc2p378 ++-0x1.7b0c92c6d8687p658 ++-0x1.ed8bb5ef46109p24 ++0x1.5cc2904baa4d2p-18 ++-0x1.b688c6944fa1dp-3 ++-0x1.2330768204f78p754 ++0x1.650441a7059bdp554 ++-0x1.0d1c66b57d36bp493 ++-0x1.54e35714807acp368 ++-0x1.6165d7bebf894p776 ++0x1.7e0ba7c987b9ep7 ++0x1.d139574e3913ep168 ++-0x1.40cc4145ea64ep19 ++0x1.0db7e5339af44p-8 ++-0x1.87410240fe22cp-9 ++-0x1.d0f46605d4a27p18 ++0x1.d1e8b19cca04dp-19 ++0x1.979981827668ap-21 ++0x1.2576745f4cca6p22 ++-0x1.1f02e2c0c288dp14 ++-0x1.77bab17202acap-13 ++0x1.25c5071d2dc6ep8 ++-0x1.306185b351fdap26 ++-0x1.ad6e853661ee0p587 ++0x1.f389b34d6b10fp-13 ++0x1.08fa931bd21f5p10 ++-0x1.b65bf00b921e8p-24 ++-0x1.cbb5f173385aep82 ++0x1.a32cd47340669p2 ++-0x1.a83fd05f605e6p-25 ++0x1.8184a3fcc1ac3p942 ++0x1.61c9644526617p809 ++0x1.b12c01289b0c4p15 ++-0x1.16a4a50f1192bp-17 ++-0x1.5658b26bd2888p-9 ++-0x1.8c5563528e33bp-14 ++-0x1.fd7e32bd8a9adp-23 ++-0x1.1106a6a425747p-18 ++0x1.98109155dd7bfp21 ++0x1.dbd635362ec6bp6 ++0x1.4a1600b2e95dbp880 ++-0x1.2fd6819d3d81cp361 ++-0x1.28f5b629029b5p12 ++0x1.64c6a3d5a0867p304 ++0x1.97ae606371057p22 ++-0x1.d61a76409f8f9p-25 ++0x1.a4c67223582ffp-27 ++0x1.b569919b79b6fp214 ++0x1.1bf0416ef51a4p-28 ++-0x1.1b9502079e873p-25 ++-0x1.a94006dd19303p355 ++-0x1.78bd67abffa91p20 ++0x1.96d320a0153bap383 ++0x1.f82770adf361dp19 ++0x1.ee0725a2dbe84p-28 ++0x1.93d4c19692fbfp80 ++0x1.d69c251aa0003p-3 ++-0x1.36c310f2a5894p-26 ++-0x1.7bbce527b5784p19 ++0x1.5a90f2032fb5ap-14 ++-0x1.194fe079c05eep1002 ++0x1.2e9a406645b9bp609 ++-0x1.c566e4a419660p-14 ++0x1.f917868895288p872 ++0x1.a966a17972ca9p601 ++-0x1.6d5eb4970b882p-20 ++0x1.c1a0d0ee96f75p27 ++0x1.958fd1185d839p-24 ++-0x1.c738b5fffeeb2p4 ++0x1.91bf33cdb6804p710 ++-0x1.66e0a7e4034dbp224 ++-0x1.dd6e42f5992c4p667 ++-0x1.6e17000848200p951 ++-0x1.f625958e05264p-1 ++-0x1.63e025fbcdcacp442 ++0x1.c5fb927d2cb09p8 ++-0x1.d7e514672b2ddp987 ++0x1.0eec25d2a59ccp27 ++0x1.342f35eabf622p707 ++-0x1.6ffad140301c8p609 ++-0x1.5b10b0ca4ea9dp-21 +diff -urN glibc-2.17-c758a686/benchtests/asin-inputs glibc-2.17-c758a686/benchtests/asin-inputs +--- glibc-2.17-c758a686/benchtests/asin-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/asin-inputs 2015-06-20 21:22:16.296458135 -0400 +@@ -0,0 +1,2511 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.350fc6069df8ap-1 ++-0x1.eee2112c4876bp-1 ++-0x1.236b62ec50852p-1 ++0x1.edc5c63489e51p-1 ++-0x1.fd62800520adfp-1 ++0x1.d475f0f7403afp-1 ++0x1.e90832724b53cp-1 ++0x1.f609c0391a573p-14 ++-0x1.feea04702b990p-1 ++0x1.e8d6535b0d1c2p-1 ++-0x1.9c7115f5fa7edp-23 ++0x1.08d826c7ee854p-1 ++0x1.e8e045abf094fp-1 ++-0x1.5278029b07e33p-3 ++-0x1.ea9383079d41fp-1 ++-0x1.f4e3046089560p-1 ++-0x1.fb398088adb40p-1 ++-0x1.3e3c739c48dc4p-1 ++0x1.7817337fddb7bp-3 ++0x1.7dd391d9fc392p-3 ++0x1.41afe6440736cp-1 ++0x1.bfb881b8085a3p-1 ++-0x1.e6707556b55cdp-1 ++0x1.db3e67625fe65p-1 ++-0x1.1bbd53433ed31p-1 ++0x1.6188f44707072p-1 ++-0x1.75a356a8a9292p-5 ++-0x1.ddb0166dd02a0p-1 ++0x1.e50b5048cb701p-1 ++-0x1.f8ad822c7b0e3p-1 ++0x1.9800b2fed7f04p-1 ++0x1.b1dc245081b6cp-1 ++-0x1.f72481a2b0f3ap-1 ++0x1.597d37e0d6f70p-21 ++0x1.ef40e79b3e65ap-1 ++-0x1.5ba123fb3ff91p-1 ++0x1.45bfc165da8f7p-1 ++0x1.ccac70b0bde88p-1 ++-0x1.f41a414f7827cp-1 ++0x1.9b875417727f6p-1 ++-0x1.c62a454b8d40bp-1 ++-0x1.e0a141c4f0b16p-1 ++0x1.4264601195208p-2 ++-0x1.46119179eb783p-1 ++-0x1.dfc3024659454p-1 ++-0x1.e14ee796afcc8p-1 ++-0x1.e99e96ab82107p-1 ++0x1.e234b67ec84f9p-1 ++0x1.d53303c005425p-16 ++0x1.ed5b0764a14a2p-1 ++0x1.b5e0c3ea9c8e9p-1 ++-0x1.db7d6214c24c6p-1 ++0x1.85d832f631a51p-2 ++-0x1.0be2d5dd39df0p-2 ++-0x1.9ba4068536d4ep-1 ++0x1.e3b6708ecfee8p-1 ++0x1.f81a9367f49ecp-1 ++-0x1.e4347223f7a7bp-1 ++0x1.a8d8b60a820e6p-2 ++-0x1.ec157180be1bdp-1 ++-0x1.eb95b087e8c43p-1 ++-0x1.6bdd166779c0bp-1 ++0x1.8bb3345d66b47p-1 ++-0x1.e02f643898ecap-1 ++-0x1.ab494400a4aabp-1 ++-0x1.01f7d442b79e4p-3 ++0x1.ea5ab67fbbf14p-1 ++0x1.f603237a71369p-3 ++0x1.f4a57127c7a0cp-1 ++0x1.69a0a717bd007p-2 ++-0x1.64fb05d3406f4p-1 ++-0x1.a6a73323151a3p-1 ++-0x1.22fcf3cc1a298p-1 ++-0x1.d166868f2b02fp-3 ++0x1.350857bbe150fp-3 ++0x1.ea03400cda450p-1 ++0x1.934551bfdd4f7p-1 ++0x1.a1bf13ff7e529p-1 ++0x1.40e3e60b110dcp-1 ++0x1.ebf2d1787c1b0p-1 ++0x1.bf44e6858ccc2p-1 ++0x1.efb2212f852c5p-1 ++0x1.e4bcf61e9db8ep-1 ++-0x1.f67e4278236dbp-1 ++0x1.72e2e6f704395p-8 ++0x1.eb18e737043a5p-1 ++0x1.c11e3263f847dp-19 ++0x1.6c8dc764c7ce3p-1 ++0x1.3a30f3a82e677p-2 ++0x1.5d3554f6157efp-3 ++0x1.d7e135698a916p-16 ++-0x1.9a0b900abb552p-1 ++-0x1.db02f20dbc26bp-13 ++0x1.dbf69357aebd4p-1 ++0x1.1c15c1b6076dbp-1 ++-0x1.98e8e522e4a82p-23 ++-0x1.60da4694b88e1p-1 ++-0x1.e82085e53dbf0p-1 ++-0x1.0cce4159c974dp-1 ++-0x1.edebc49f4f3bcp-1 ++-0x1.d5d0b54aec8f3p-3 ++-0x1.b6c7247c84ca1p-2 ++0x1.566d76162c4a2p-1 ++0x1.1f8126af6a5eep-1 ++-0x1.4042c01dfeb13p-1 ++0x1.3745936ce6406p-2 ++0x1.e845447d64568p-1 ++0x1.e9e5d6a4f999ep-1 ++-0x1.881fb480c1717p-2 ++-0x1.632ec650a0086p-1 ++0x1.ea79105af3018p-1 ++-0x1.e87f8637d44ffp-1 ++0x1.2038f78b9bcc0p-2 ++0x1.888731b818bb9p-1 ++0x1.247cb5abaf830p-1 ++0x1.71d2a5d08bb38p-3 ++-0x1.30f5d4f0d5da3p-1 ++0x1.e8eee13ebc573p-1 ++0x1.35a443a6ef606p-22 ++0x1.1f4110dbc1d7cp-1 ++0x1.ab85b5da29994p-1 ++-0x1.080f952236c35p-1 ++-0x1.2b5b02e6cc1b2p-3 ++0x1.ac830678d8c8ep-4 ++0x1.0ba5029d5c201p-1 ++-0x1.2b3e149bb0426p-2 ++0x1.eaa744fd96fbap-1 ++-0x1.ebf5435363845p-1 ++-0x1.f47ea66f3af8ap-19 ++0x1.e9c7d49d082bfp-1 ++0x1.ea64823156f61p-1 ++0x1.ea9222fcef492p-1 ++-0x1.38ca90ff41214p-3 ++0x1.98b000eb73a71p-1 ++-0x1.3fb91174bf8cep-1 ++0x1.6831750c7d576p-8 ++-0x1.e6c711f8a07a2p-1 ++-0x1.e10a8025fd5c2p-1 ++0x1.df7c8777dba5ap-1 ++-0x1.6c92c2bf14b20p-11 ++0x1.c2b9937c51413p-10 ++0x1.ed9a717edd7eap-1 ++0x1.26cb23fb114cep-3 ++0x1.a1dd30e8d133ap-1 ++-0x1.596e3118407aap-1 ++-0x1.815f557e4dd72p-1 ++0x1.91d3b66fca3a2p-1 ++0x1.aee2069bb58c2p-1 ++0x1.410da160d3759p-6 ++-0x1.efd3965c7e5acp-1 ++0x1.ebcc105c3c99dp-1 ++0x1.f9c7e2ecd680bp-13 ++-0x1.0d0876f871020p-1 ++-0x1.1cb73699e8924p-1 ++-0x1.f33b17f4530b4p-1 ++-0x1.cd90d53a85604p-24 ++-0x1.e7b7065c2a56bp-1 ++0x1.4325b7a1b9323p-2 ++-0x1.3007019386da4p-5 ++-0x1.2afe01c77967ap-13 ++-0x1.dd2f071cce027p-1 ++0x1.79dbd61da7b2fp-3 ++0x1.90a0030825b71p-1 ++-0x1.3b898257384cap-1 ++-0x1.5c13731da33bap-2 ++-0x1.df2c8655fc70dp-1 ++0x1.1dbe97dccb13ap-24 ++-0x1.fad96389524bfp-1 ++0x1.ddccc6b661857p-2 ++-0x1.fb6fb5159af3ep-1 ++0x1.d94283b31661cp-1 ++-0x1.a08b373392dc9p-1 ++0x1.bb7ec42dcb619p-2 ++-0x1.f450159e992b8p-1 ++0x1.6959f4fae20f8p-24 ++0x1.36f464d433610p-1 ++-0x1.c2cc227b47f2bp-1 ++-0x1.3eb9f3e9ab4fep-1 ++0x1.655d872a08e7bp-1 ++0x1.426bd7fd10932p-1 ++-0x1.bd54d6b8bf754p-25 ++-0x1.ca48c150acb42p-1 ++0x1.fba5275cb7d91p-1 ++-0x1.de01b625f1851p-3 ++0x1.ed715043085c5p-1 ++-0x1.e4bed6f91c84bp-1 ++-0x1.0c6132d48b23ap-1 ++-0x1.8740844edfccfp-1 ++-0x1.f5ea24dfceaccp-1 ++-0x1.4e1ea0cb718b9p-10 ++-0x1.e2e3f55bb23a1p-1 ++-0x1.ef8592238558ap-1 ++0x1.ba09c237c2a98p-1 ++-0x1.1c02e1ae8e614p-3 ++-0x1.e3480667a3c1dp-1 ++0x1.e098e320da0bap-1 ++-0x1.020e63d1fb6b3p-10 ++0x1.156314d8b8b9ep-1 ++-0x1.a6d562a0b9b68p-1 ++-0x1.a556923b876e4p-1 ++-0x1.005624a6a1606p-2 ++-0x1.4515b4c2b21dap-1 ++-0x1.00882585a29eep-1 ++-0x1.4e97477367b64p-1 ++0x1.e56aa246ff0e4p-2 ++0x1.f69774c91b3a3p-1 ++-0x1.edbeb6d147be3p-1 ++-0x1.d044d435326e6p-1 ++0x1.9dd6d688e8b6ap-1 ++0x1.8832042b08d37p-1 ++-0x1.e755f3286db4ap-1 ++-0x1.7741b1eae9cc5p-1 ++-0x1.ec4f82e92c41cp-1 ++0x1.c470754b52d70p-3 ++-0x1.cdf6e43174ac0p-3 ++0x1.b54d76dc019edp-1 ++0x1.de1511c382622p-1 ++-0x1.1b6bb0f6cd48dp-1 ++0x1.f8f3a7b3d26dbp-10 ++-0x1.e8a697e00810dp-1 ++0x1.029cb182129c5p-1 ++-0x1.82fb23737c09ap-1 ++-0x1.ba3f8283bda3cp-1 ++0x1.32ef66d1351e1p-1 ++-0x1.ff0942c4470a9p-1 ++0x1.e861824f0b0c5p-1 ++0x1.0ad654e7bcdb2p-1 ++0x1.94bf67e731b1dp-21 ++-0x1.ce92262e12415p-3 ++-0x1.b11a761584f00p-1 ++-0x1.ee0375698a186p-1 ++0x1.72968114620fbp-3 ++0x1.38a8e30dd439dp-2 ++0x1.ef7a104666151p-1 ++0x1.1b8030b9ef132p-1 ++0x1.e52ab2d0668d7p-1 ++-0x1.00e2e49d1662bp-1 ++0x1.7aa0818bb671bp-23 ++-0x1.ecf921278c665p-1 ++0x1.e53b304fb4d06p-3 ++0x1.3748859f74cebp-1 ++-0x1.e96cd6cb3a5dap-1 ++-0x1.eadbe1b00f3bap-1 ++0x1.34b8b20a231ebp-1 ++-0x1.a133128a2cac6p-1 ++0x1.f0ffe198f98f8p-3 ++-0x1.a978c66c2b77ep-21 ++0x1.e0afd4eddd684p-1 ++-0x1.eb3b238d0737ap-1 ++-0x1.e514d20443604p-1 ++-0x1.9d64d47733225p-3 ++-0x1.e589d06cb88d4p-1 ++-0x1.360155ce19621p-1 ++0x1.db3d40b252ac3p-1 ++0x1.1fbe750678f55p-1 ++0x1.033e6517daa6fp-5 ++-0x1.ed55067dcc2e0p-2 ++0x1.df2253bc59523p-23 ++-0x1.879d741b2c118p-23 ++0x1.b47fc608b2e66p-1 ++0x1.d74ca166c7f3bp-1 ++0x1.f5f1256f888b1p-1 ++-0x1.e06af0ec49382p-14 ++-0x1.e97461cc47dabp-1 ++-0x1.e6fe5447590afp-1 ++-0x1.e86c3331f93a8p-1 ++-0x1.aacae317ef936p-1 ++0x1.b41644690944cp-1 ++-0x1.8209c34d990bap-1 ++0x1.712d01d18f1acp-1 ++0x1.ed0c5662218c3p-1 ++0x1.90d8e69b9ce07p-1 ++-0x1.a7b9e784d9434p-16 ++0x1.f91c375372b6fp-1 ++-0x1.bf83e21f654b3p-1 ++-0x1.e38cc36ff8c63p-1 ++-0x1.842b3414ac978p-1 ++0x1.161e221d66041p-2 ++-0x1.e9a1529dfa710p-1 ++0x1.164f53c3dbd36p-1 ++-0x1.e2a192784167ap-1 ++0x1.d2f31136d5558p-1 ++-0x1.0cad003c37274p-22 ++-0x1.e402a7e83b556p-1 ++0x1.d0ee108472a16p-1 ++-0x1.0eb530c4ce24ap-13 ++-0x1.ef29f4bd04e93p-1 ++0x1.dc65a4f6e740cp-1 ++-0x1.97d975a6ad4f1p-1 ++-0x1.b427d0ab69502p-2 ++-0x1.f84bc3e23afa0p-1 ++-0x1.eada1177b2a78p-1 ++0x1.f9f556f848f73p-1 ++0x1.5da9b1ed0a67dp-2 ++-0x1.b09c16fdb0e04p-1 ++0x1.8099017d801c4p-1 ++-0x1.86a880766a1c9p-1 ++-0x1.303886d1999d3p-2 ++-0x1.3b32d4601049dp-2 ++0x1.9af5d2ec8ebd9p-1 ++0x1.7b7961500158ap-3 ++-0x1.850fc657a7c8dp-1 ++-0x1.679055ba9585fp-2 ++-0x1.a334d05fa6dd2p-1 ++0x1.54edc38ae367fp-1 ++-0x1.149aa666c3c46p-2 ++0x1.db29728be3d13p-1 ++0x1.ef2d366fb9622p-1 ++0x1.85d2c6d29e956p-1 ++0x1.6cc7155575699p-2 ++-0x1.070fb3b78d7bap-13 ++0x1.b996c3cc0af1dp-1 ++-0x1.ecd953aeda13ap-1 ++0x1.4b4da5a783ab2p-1 ++-0x1.da0f94397e1efp-1 ++-0x1.eebfe7785b810p-1 ++0x1.bbbd81413465ap-2 ++-0x1.db37b245824d8p-2 ++0x1.b18707b322819p-6 ++-0x1.63aaf1836f8f5p-4 ++-0x1.73b5c0ef358ffp-1 ++-0x1.f3f5449170a5dp-1 ++0x1.679742e395bb2p-3 ++0x1.0f5d16ce3edabp-12 ++0x1.6868a3065fa6ap-1 ++0x1.e09861e83936cp-1 ++0x1.426c2703c1edbp-2 ++-0x1.784ef6124eac0p-10 ++0x1.f4da573b55ec2p-1 ++-0x1.1250820739879p-1 ++-0x1.926f219c2ebc7p-1 ++-0x1.b03cb5319aa16p-1 ++-0x1.432597af65dc0p-1 ++0x1.f2ef13107c805p-1 ++-0x1.debb0319481e9p-1 ++-0x1.e6c9b767c2e47p-1 ++-0x1.1cfef6b1b5391p-3 ++0x1.a3495200a739dp-1 ++0x1.bb7d031207cbcp-1 ++-0x1.a1e1472875de1p-1 ++-0x1.fef5368baa990p-1 ++-0x1.ffa8a2b9fe667p-2 ++-0x1.db17773676353p-1 ++-0x1.7744f61c58e3dp-2 ++0x1.94efe0d3de07ep-2 ++0x1.d28cd2f0b7253p-1 ++0x1.71ec10c132d7dp-1 ++0x1.eec3c508f7debp-1 ++-0x1.84c3358f28de2p-1 ++-0x1.e88bb44ebcca7p-1 ++0x1.c8dfe2e844f26p-1 ++-0x1.5764f1562f46cp-1 ++0x1.dd7fc52e06795p-1 ++0x1.ead0e0dd735c1p-2 ++-0x1.d9c472df196e8p-1 ++0x1.47397541dfafap-1 ++-0x1.efe2c7ae66583p-1 ++0x1.f39bc1d029169p-1 ++0x1.388e371209c65p-1 ++-0x1.cf7594c4759eep-19 ++0x1.93ba85eda890cp-2 ++0x1.ef7e57c04e5e5p-21 ++0x1.3a13625122b61p-1 ++0x1.f03355e0191c2p-1 ++-0x1.eaa0b7cbc4b05p-1 ++0x1.dc64653df1bc8p-1 ++-0x1.da0274b24d4e5p-1 ++0x1.1ef635c892de4p-1 ++0x1.7985928fa8ea5p-2 ++0x1.e8af54cc7a4a1p-1 ++-0x1.4ecfd3add4ca1p-1 ++0x1.edae154f725f1p-1 ++-0x1.f841c459354cfp-1 ++0x1.640c203fbc506p-1 ++0x1.e1334385061fbp-1 ++-0x1.e4af910db6fb1p-1 ++0x1.eef8e75eeff24p-1 ++0x1.52b3468ba247fp-19 ++-0x1.c3007317cdb73p-1 ++0x1.793397c5de6cfp-1 ++-0x1.56f0f40ef4f93p-5 ++0x1.7137163d0b95cp-26 ++0x1.d97632e6c0216p-1 ++-0x1.58f200ed16778p-1 ++-0x1.e333144686ce6p-1 ++0x1.ecfff5d1ed4fcp-1 ++-0x1.bbcb739c535d8p-3 ++-0x1.b83b54ffc1ce3p-1 ++-0x1.c5b4f73fa50c8p-25 ++-0x1.f0dcf6647d4a6p-17 ++-0x1.e2a0b2142f471p-1 ++-0x1.6811368ab0abbp-1 ++-0x1.dc98c564661f8p-2 ++-0x1.51a64736cca11p-1 ++0x1.a87ec3c5f01d2p-2 ++-0x1.13c43714b5577p-4 ++0x1.ecb79537e7c0bp-1 ++0x1.8ad66704aa830p-1 ++0x1.8b81a17344821p-3 ++0x1.fbea24d5ecac7p-1 ++-0x1.d5b456504afabp-1 ++-0x1.68a3377a06206p-1 ++-0x1.e52744bcbb1bfp-2 ++0x1.968042aade389p-1 ++0x1.e02467b79461bp-22 ++-0x1.effa02c2a5b57p-1 ++0x1.6148d164ff733p-3 ++0x1.a257b5f59a887p-1 ++-0x1.ecd6e096725c1p-1 ++0x1.4dcd868b1c423p-1 ++0x1.b518559ba2afep-1 ++-0x1.fd36e5f6ae177p-17 ++0x1.7ab1d7104d182p-18 ++-0x1.a0b161ecebb24p-24 ++0x1.eaef2277ad27bp-1 ++0x1.5537a12ead14fp-1 ++-0x1.a353d51793c9ep-1 ++0x1.d974c464f7ce7p-1 ++-0x1.e9d4a5abc7463p-1 ++0x1.8dfc202611058p-8 ++0x1.49c49777c6afcp-1 ++0x1.f8be91c860c1ep-1 ++-0x1.744184b2f352fp-3 ++0x1.4f7741d4eac81p-1 ++0x1.fbcca55ea9e6ap-1 ++-0x1.e859d3e460e92p-1 ++0x1.5d39a31f530ddp-3 ++-0x1.99da728aaed87p-1 ++-0x1.c773d52b04af3p-3 ++-0x1.27fc667b6fe57p-2 ++-0x1.ee4664ab8f311p-1 ++-0x1.240eb5bacc34ap-15 ++0x1.aab10790e80c0p-1 ++-0x1.1c32437314611p-1 ++-0x1.e3aae42688852p-1 ++-0x1.2b97b6959b92ap-1 ++-0x1.124df14d190d5p-22 ++0x1.d29df3ade00f8p-21 ++-0x1.e70102ffd26f4p-2 ++0x1.c9846775a72c1p-3 ++0x1.2ee67226d5529p-1 ++-0x1.d84381008f610p-1 ++0x1.fae6228180a55p-1 ++-0x1.d1cb30475aba6p-1 ++0x1.475825caac544p-3 ++0x1.e2d180d75310fp-1 ++0x1.8860226237168p-1 ++-0x1.bdb8f33f2142bp-6 ++-0x1.aecd11f1ad305p-1 ++-0x1.50e857e4f8090p-1 ++0x1.09a7b4c454c6ap-1 ++0x1.33a1b5c1f5142p-2 ++-0x1.d473c0c10260ap-1 ++-0x1.e6bcc76ef1341p-8 ++0x1.e9a025b19d4e7p-1 ++-0x1.e61c564b19c20p-1 ++0x1.b1c890371859cp-1 ++-0x1.e9de02e7fa0f7p-1 ++0x1.8eae41c2d6d3bp-1 ++-0x1.a043635f96fd5p-1 ++-0x1.18077176e1632p-24 ++0x1.7063d30f52d4dp-1 ++0x1.e82d46287af59p-1 ++0x1.e77a63eb49c28p-1 ++-0x1.2e923371f4df7p-1 ++0x1.32f392b11aa13p-2 ++0x1.cf48a104a230ap-1 ++-0x1.ffb8054bd5bb2p-1 ++0x1.d961a7444a368p-1 ++-0x1.2908136966a6ep-1 ++-0x1.e8e5f46caed20p-1 ++-0x1.cca7367cafebcp-1 ++0x1.8a7d3113e9871p-1 ++-0x1.9c20d073da00dp-1 ++0x1.685602f47ee38p-17 ++0x1.dbe65032e6aafp-1 ++0x1.e39cc443d68bep-1 ++0x1.ef75b5fbc2038p-1 ++0x1.6fd3f20dabcdep-3 ++0x1.ef2e5742cbc3bp-1 ++-0x1.a139a4f96363fp-1 ++-0x1.f936e3257b29bp-1 ++-0x1.e83e578b67404p-1 ++0x1.809f14efba3abp-1 ++0x1.ef0cc05585683p-1 ++-0x1.e0ab6532e03e6p-1 ++0x1.e825a4e96f86cp-1 ++0x1.944c53b6fcba2p-24 ++-0x1.eef7764fb6703p-1 ++0x1.dbd546810ad04p-1 ++-0x1.ed82202786af0p-1 ++-0x1.e744b298a1822p-1 ++-0x1.f66403b0db0f6p-1 ++0x1.b823a13640780p-1 ++-0x1.8fd743dba9526p-1 ++-0x1.6ad6002662fadp-2 ++0x1.af29d1ff6c1dap-2 ++0x1.a40a30c84d9d2p-1 ++-0x1.eef1466de9bbcp-1 ++-0x1.ea451649dac69p-1 ++-0x1.be12773f273cdp-10 ++-0x1.2ea1f2cfba778p-22 ++-0x1.ed2eb7554cecap-2 ++0x1.5604a6ebad5aap-3 ++-0x1.dcb4e5d23da48p-1 ++-0x1.e0e2d4e18e11fp-1 ++0x1.7cbf026e8d176p-1 ++-0x1.e92df6fb8cb14p-1 ++-0x1.e0f877f179d56p-1 ++-0x1.0460742bc8cdbp-1 ++0x1.f9c6e1a503f35p-1 ++-0x1.de3ca0ef987b7p-1 ++0x1.ee2a61e036810p-1 ++0x1.eb29729cac7d4p-1 ++-0x1.dc41f5d54e145p-1 ++-0x1.ee27548fb036dp-1 ++0x1.8676b01d07ce0p-1 ++-0x1.9eb434f5e23dfp-10 ++0x1.95688374a65cep-1 ++0x1.d8b331ab26940p-1 ++-0x1.ec5af0c2ccbc9p-1 ++0x1.bca24367daca5p-3 ++0x1.4c5f30d4e8c83p-1 ++-0x1.990c52576b03bp-1 ++0x1.279527d6f3123p-2 ++0x1.e7d10654db7cfp-1 ++0x1.afabd749d11aap-1 ++-0x1.e54870e856fc8p-1 ++-0x1.a9b6e450b1736p-3 ++-0x1.e4b0c74cbee31p-1 ++-0x1.77a9538ce58c8p-10 ++0x1.aab3b79abd652p-22 ++0x1.efdfd56aee773p-1 ++0x1.1dfac77800264p-1 ++-0x1.f5e7d3b5fa6b2p-1 ++0x1.569077a89293cp-9 ++-0x1.f086970443d28p-1 ++-0x1.1e2b763ff1c1bp-16 ++0x1.fa84d6fc1bfb4p-1 ++0x1.fbf321159facbp-1 ++-0x1.56f5410b90154p-15 ++0x1.ec2962b60792cp-1 ++0x1.82723136c1041p-1 ++0x1.66ec3602d5c0ep-2 ++0x1.6006c4b0268aap-1 ++0x1.db8e205953140p-1 ++-0x1.6f4ec45af7480p-1 ++0x1.713b02f6a04eap-26 ++-0x1.63b1454647238p-1 ++-0x1.f2d2c4f587093p-1 ++0x1.dbec93d39559cp-1 ++0x1.f59e8219eeb3dp-2 ++-0x1.973c3291c4d50p-1 ++0x1.30a10510388bap-1 ++0x1.f1f61783e79d0p-23 ++-0x1.c101b1037e3f5p-1 ++0x1.d257940a5137fp-3 ++-0x1.f470523c426b8p-1 ++0x1.0c37b2dba00aep-19 ++-0x1.ebcbb7d352b98p-1 ++-0x1.f45c0719f0ef0p-3 ++-0x1.9fa667856a81ep-1 ++-0x1.3706e59f06a0cp-1 ++0x1.e87165a85bf00p-1 ++0x1.d9f9e3d739f44p-1 ++-0x1.e26fb2a17aaa7p-1 ++0x1.0be6a11da1596p-1 ++0x1.f8d1b326b2ed1p-1 ++-0x1.ee19b06500228p-1 ++-0x1.e40de71a02d0dp-1 ++0x1.98bc15dbd69bcp-1 ++-0x1.eb16f70b61cccp-1 ++0x1.93a7216be0c5dp-2 ++-0x1.8bdbe0b9e2d2bp-10 ++0x1.ff0fa32b3accap-1 ++0x1.e7b000c9475a2p-1 ++0x1.e4c7b30bac6b0p-1 ++0x1.e82ba33a4ce9dp-1 ++0x1.db41972b5b7e1p-1 ++0x1.e2fab75688c77p-1 ++-0x1.d674412d314f7p-1 ++-0x1.a05a64a3c376cp-16 ++0x1.d57127f394c23p-1 ++-0x1.8bb3428cca392p-1 ++0x1.66540667f4775p-3 ++0x1.df8192132032ep-1 ++0x1.16be46faa5fd0p-1 ++-0x1.8f5d4684f487ap-1 ++-0x1.515e3214390b1p-2 ++-0x1.e9c224c0132f3p-1 ++-0x1.4792b4bea367fp-3 ++0x1.f683c622269b9p-1 ++-0x1.fd61a56639941p-1 ++-0x1.edb8f5b456c1ep-1 ++-0x1.1227a7cbdc567p-1 ++-0x1.daf8854d3e5e7p-1 ++0x1.aee25650abb06p-1 ++-0x1.513f8376de706p-1 ++-0x1.a96f12a5be2cdp-1 ++0x1.ec7da7eb5220ep-1 ++0x1.a010e6eeba432p-1 ++-0x1.e73721ebf9720p-1 ++0x1.d827e42f715f6p-1 ++0x1.53cad6d41476cp-2 ++-0x1.5921d3708a0c3p-1 ++-0x1.c05b22303587cp-1 ++-0x1.97f484b97f423p-1 ++-0x1.2b4492bd73b64p-15 ++-0x1.eb0e768cad7c1p-1 ++-0x1.fe0c97242979ap-1 ++-0x1.ec354776dd3bbp-1 ++0x1.cf0d270e371f6p-1 ++0x1.66e7a5c93cffdp-9 ++0x1.fd0d826c5a1d9p-1 ++0x1.afbca363725d1p-1 ++-0x1.d77251ee3df8ap-1 ++0x1.1692a2cdd5549p-3 ++0x1.6e88143883032p-1 ++-0x1.f41ec1c712c7fp-1 ++-0x1.a6386135c889ap-1 ++0x1.de45269a5dce2p-1 ++0x1.c6a6b4f8f837ep-24 ++0x1.33d06466c6b9bp-1 ++-0x1.860fd51abe700p-1 ++0x1.fbd696b6938a5p-3 ++-0x1.e83e45de922aep-1 ++0x1.ec4e74a3a5175p-1 ++-0x1.7a9f95d8c3a13p-1 ++0x1.3cd2b0e0024b4p-2 ++0x1.c5b6f70209b78p-5 ++0x1.e5b073ba13507p-1 ++0x1.c5914768121eap-1 ++0x1.9e87f2c6f8986p-1 ++-0x1.835ef3aca7e57p-1 ++-0x1.dc7de37754abap-1 ++-0x1.8635367864672p-1 ++0x1.d6fcd19613123p-1 ++0x1.713322dda040ap-26 ++0x1.b301916b3e546p-1 ++-0x1.5907373541318p-1 ++0x1.b67804eb47f52p-1 ++-0x1.01d6c56bc4577p-1 ++-0x1.268026d7131f6p-1 ++-0x1.8a2f305b13ed1p-2 ++-0x1.b110618fb5339p-1 ++0x1.1e2ec7a7b3ffbp-1 ++-0x1.eeac0378d3c2dp-1 ++-0x1.a8d514f3e4860p-18 ++-0x1.3c73f2a282f70p-1 ++0x1.4b69664a697c8p-1 ++-0x1.5ac3218682dafp-9 ++0x1.d9d2a5d6d0097p-1 ++0x1.ea88c7564fe3cp-1 ++-0x1.01b182a357b89p-1 ++0x1.ef3d33758c65cp-1 ++0x1.755957a759d6bp-1 ++0x1.dc5b74cf50867p-1 ++-0x1.173f6772617c0p-21 ++0x1.edbf80f8c492cp-1 ++0x1.d53f03f943012p-1 ++0x1.8a3cb07f33bafp-3 ++0x1.03af809e77795p-2 ++-0x1.eaeaa63245741p-1 ++-0x1.f97c70509940cp-2 ++0x1.da0741692c059p-1 ++0x1.ade411f3da571p-1 ++-0x1.b2a12164a95c7p-3 ++-0x1.8fa041d702f22p-3 ++-0x1.97f1b066c701bp-3 ++0x1.b707763754484p-3 ++0x1.e499e4e2ad8e9p-1 ++0x1.311253501f3f2p-3 ++0x1.259d37e26150cp-1 ++-0x1.dfb6e365f91ecp-1 ++-0x1.aa22065b8f2c3p-1 ++-0x1.da1ff0b273cd7p-3 ++0x1.be2cb0d8c5b44p-1 ++-0x1.3439a53555121p-2 ++-0x1.e210555e48210p-1 ++-0x1.d85926848cf29p-1 ++-0x1.e9a0822672116p-1 ++-0x1.aa5ad517117bep-2 ++-0x1.8f0b53139648dp-20 ++-0x1.f86a7137c57dcp-1 ++0x1.bb51b4278652ep-3 ++0x1.0e4d9562788afp-1 ++0x1.7ce703c2bf2a6p-1 ++-0x1.059cc53835908p-10 ++0x1.89b894e0e9e37p-1 ++0x1.9d6604d4efeddp-2 ++0x1.aa6bf1e6b5ff3p-1 ++0x1.d053b71612732p-1 ++0x1.c58290a57b35bp-2 ++-0x1.e79c23c2f87cbp-1 ++-0x1.ef28737769e8cp-1 ++0x1.e1bf0284f90b9p-15 ++0x1.b8c1328d43f30p-1 ++0x1.ff61460c87dbbp-1 ++-0x1.ea06f3c18052fp-1 ++-0x1.929a25bc4e316p-1 ++-0x1.462ed634d347cp-2 ++-0x1.f89887250e6fcp-1 ++-0x1.bc99a3c89c1e3p-22 ++0x1.5c75e768472b4p-2 ++0x1.8f6fa012e2770p-1 ++0x1.f7af22a6b572dp-1 ++-0x1.3f54f252e3acdp-2 ++-0x1.ed3fa609dbee7p-1 ++0x1.dfbca7880638fp-1 ++0x1.3e1116e4de263p-1 ++0x1.dc6a025cdf557p-1 ++-0x1.8bfbe75d98041p-1 ++0x1.e9e2b495fa2c1p-1 ++-0x1.2642422821515p-1 ++0x1.edfca7dddb0f9p-1 ++-0x1.ee8ea3f68169fp-1 ++0x1.ad17b2686c65fp-1 ++-0x1.c4f6f0a35fd4cp-1 ++-0x1.ef6f43ea3e075p-1 ++0x1.4f28f1201b762p-3 ++-0x1.ef68700ccd1ddp-1 ++-0x1.d63ec71b1db72p-1 ++0x1.eece451c9800bp-1 ++-0x1.e374023473851p-1 ++-0x1.dae080dc56bf7p-1 ++-0x1.f41933cd4db1ep-1 ++0x1.8df8a16525f39p-3 ++0x1.f5c64629537c0p-3 ++-0x1.74e212eb04e5ap-1 ++-0x1.c78c50a1f0152p-1 ++0x1.ec1a10580c98bp-1 ++0x1.aadfa2e96b6e0p-3 ++0x1.9c1383ae4954fp-1 ++0x1.dfb2223aa208cp-1 ++-0x1.cfffa4412b604p-3 ++0x1.cee130d0b5a2bp-3 ++-0x1.e307d799961afp-1 ++0x1.fe1874b71dffap-1 ++-0x1.f0dd20e110586p-1 ++-0x1.e6f124bc80f9bp-3 ++0x1.a84f50096564fp-1 ++-0x1.eb54d7123b641p-1 ++0x1.dde4d0a43d6ccp-1 ++0x1.460c714b7fc02p-1 ++-0x1.eb14401a251dfp-1 ++-0x1.6d6c5532e2cd9p-21 ++-0x1.b0c634676faacp-4 ++-0x1.ab062115542b8p-2 ++-0x1.12c3e674c7017p-3 ++0x1.f2f2a467a4711p-1 ++-0x1.b410a265bf2edp-1 ++-0x1.e142463188648p-1 ++-0x1.1e06e6cea4258p-2 ++0x1.60e380d477367p-2 ++0x1.ecabd7e786fccp-1 ++-0x1.ea047532c3043p-1 ++-0x1.e64087ec5398bp-1 ++-0x1.8192b282dc78ap-3 ++0x1.bc3be459c0118p-2 ++0x1.e848464011e2bp-1 ++-0x1.1635a3dbd5aaep-3 ++-0x1.f027619f4ec1cp-1 ++-0x1.cc5b228bab092p-2 ++-0x1.54c7045181291p-1 ++-0x1.d878651499cdcp-1 ++-0x1.2c92931e89713p-1 ++0x1.eea2d2cca4e34p-1 ++0x1.5cb4743cbb81ep-13 ++0x1.4e17a4a822867p-2 ++-0x1.dbb357be5deebp-1 ++0x1.e59516797b352p-1 ++0x1.db51b6a627095p-1 ++-0x1.60c746f7d0703p-1 ++-0x1.ea37c48f25f9dp-1 ++-0x1.7ac0566338086p-2 ++-0x1.baf382671db8ap-1 ++-0x1.27b5065556c47p-1 ++0x1.dc8714f787413p-1 ++-0x1.51c9858d1404ap-1 ++-0x1.72de44d96ac46p-26 ++0x1.f425e3cced4c7p-3 ++-0x1.687a92d61065ap-16 ++0x1.f524140aa4f9fp-1 ++-0x1.e23a916eb0f6cp-13 ++-0x1.d99af531c1d7dp-1 ++0x1.33fc239565e36p-15 ++-0x1.77fe57818f84dp-8 ++0x1.e2f6076e57cc4p-1 ++-0x1.e97d25cf4a4c9p-1 ++-0x1.ced6825d25e04p-1 ++-0x1.e6a1f419a0176p-1 ++0x1.a8ad7301a9c3bp-20 ++-0x1.c6256777394b3p-1 ++-0x1.15deb4ca612fep-2 ++-0x1.1fd1b6af697a5p-1 ++-0x1.e9ad92c7a5f42p-1 ++-0x1.ee43843342288p-1 ++-0x1.3c312578414bdp-3 ++0x1.ec27f19113a4dp-1 ++-0x1.9ccbd7e827a55p-3 ++0x1.efe3727b0e23ap-1 ++-0x1.acfd7757af602p-1 ++-0x1.841256a82781ep-1 ++-0x1.dea3e5358e22ep-1 ++0x1.7a5d14b31d63cp-1 ++0x1.b45264dd5b6ccp-1 ++0x1.a955c3158f95ap-3 ++0x1.5a2a14a8001cap-1 ++0x1.d80407959de45p-1 ++-0x1.e63ba4f3d8c3ep-1 ++0x1.83edf16dfff50p-1 ++0x1.b747536ef6e0ap-2 ++-0x1.db91b03d5de78p-1 ++-0x1.04e9366e2d6bdp-1 ++0x1.868a14adc5d9ap-2 ++0x1.e004440ae8f05p-1 ++0x1.b892e7a52e191p-1 ++-0x1.a31672a711e3bp-3 ++0x1.f1a246788caa4p-1 ++0x1.2712839082804p-1 ++-0x1.e15a87fb65354p-1 ++0x1.c8b2f2a807b30p-1 ++-0x1.4604a175e993ap-24 ++0x1.ebfed39cc2c8bp-1 ++0x1.46b9055c4ca9fp-1 ++0x1.306ca7dee4864p-2 ++-0x1.54b193e5a6106p-1 ++0x1.d915353edaa25p-1 ++-0x1.559071a09ac62p-1 ++-0x1.dfd05503dd9c9p-1 ++0x1.6372147e80a9bp-2 ++0x1.1d6c4659b2302p-15 ++-0x1.51678029a9639p-1 ++-0x1.93c504552cc8ap-1 ++0x1.500db1270ff22p-1 ++-0x1.a84a143781395p-2 ++-0x1.e0eef33df7060p-1 ++0x1.a5b9342b2a503p-1 ++-0x1.7e31e007182c1p-23 ++-0x1.cbe100e36ed62p-1 ++-0x1.e91f7469d5670p-1 ++0x1.eb0711bcb2188p-1 ++-0x1.d9e340faf4907p-1 ++-0x1.d3eaf468140d5p-1 ++-0x1.f046a692dfbe5p-1 ++0x1.eef541125402cp-1 ++0x1.164721f247577p-1 ++-0x1.948565494d763p-2 ++-0x1.88826288be33dp-13 ++0x1.e66022a174720p-1 ++-0x1.74bb306267089p-1 ++0x1.0e806680dde9bp-19 ++-0x1.36bf209f8d75ap-1 ++-0x1.fdb1502db4889p-1 ++-0x1.dc58a3a509822p-3 ++-0x1.ff1285390535cp-1 ++0x1.e697822f3ef41p-2 ++0x1.f0b895823caf7p-1 ++0x1.ee8a003f19352p-1 ++0x1.86cef6dc903e7p-1 ++-0x1.b06d1232385aep-1 ++0x1.f7415347bb40bp-1 ++-0x1.1849f3c6d3a7fp-24 ++0x1.d8bb0536d10cbp-1 ++-0x1.7134b61c665cap-26 ++-0x1.63c4664215f4dp-1 ++-0x1.4af2b05df7423p-3 ++-0x1.ec83e4b62417bp-1 ++-0x1.ea94d7a68205ap-1 ++-0x1.758b46be117efp-23 ++-0x1.e67b111d9643ap-1 ++0x1.c7fba1185bbb7p-1 ++0x1.3ee093dfa7bc7p-9 ++0x1.761e6712c456dp-1 ++-0x1.4147f16c16ab0p-1 ++0x1.a19ce52b4f906p-1 ++-0x1.480570f907c0ap-25 ++0x1.9b1db0483a855p-20 ++0x1.e1ef409647a27p-3 ++0x1.4c8792308f4c7p-3 ++0x1.11dc218d362eap-3 ++-0x1.ee64f1975f7e6p-1 ++-0x1.2693204eaf09bp-1 ++0x1.834e43d519f57p-20 ++-0x1.f321806888b14p-1 ++-0x1.912d845baba7cp-1 ++0x1.f0d7d51f16eafp-1 ++-0x1.98615085cae70p-1 ++-0x1.3254856940809p-1 ++0x1.f5e36613814c9p-1 ++0x1.f43be6f8db5a1p-2 ++-0x1.d999f12e66f25p-1 ++0x1.795a0759e9a8dp-1 ++-0x1.731ba13d1957bp-26 ++0x1.df2806ba55640p-1 ++0x1.93b6b433d212dp-8 ++-0x1.de2d26a9b9821p-1 ++-0x1.c253e67cccb47p-23 ++0x1.d896e2d45c8e1p-1 ++-0x1.e9d165420d859p-1 ++-0x1.7ed393dd2a80ep-3 ++-0x1.72e6237bb4f8dp-1 ++-0x1.77dcd46971c3fp-1 ++-0x1.0f7294284d3d2p-1 ++-0x1.ee0460d9eea8dp-1 ++0x1.f593219765d24p-1 ++0x1.ef4575e02694ep-1 ++-0x1.88ed60dd3430cp-1 ++0x1.e83fc488dacd6p-1 ++-0x1.f6b1f794f743fp-1 ++-0x1.f6fad097104e4p-1 ++0x1.f578d77058051p-1 ++-0x1.ead825875d99ap-1 ++0x1.e47714a63f73ap-1 ++-0x1.faf0f514a94b4p-1 ++0x1.67c2f0fa8047bp-1 ++0x1.eafad3737c504p-1 ++0x1.dd79933eb4823p-1 ++-0x1.d8e09754f9b03p-1 ++-0x1.622a31c8a4a1dp-1 ++-0x1.c3658532b752dp-17 ++0x1.4653f0b895ddep-1 ++0x1.4b7f774a00827p-1 ++0x1.5671004a1fee4p-1 ++0x1.ed1eb4107075cp-1 ++-0x1.e91e34b9e7e08p-1 ++-0x1.40a8260114e62p-1 ++0x1.fcd51406408b5p-1 ++-0x1.b41136108fbfcp-3 ++-0x1.ea510117fd3ecp-1 ++0x1.9875d57574880p-1 ++0x1.8e6821b32b65bp-1 ++0x1.7b7895c4df3f3p-3 ++-0x1.0f9652222f8e9p-1 ++-0x1.e20bc23074b3bp-1 ++0x1.71c19505b627cp-1 ++-0x1.50acd256c1190p-9 ++-0x1.f88e41f893405p-1 ++0x1.04c507eebef8dp-2 ++-0x1.088452ad3c759p-1 ++0x1.087d627cadb98p-10 ++0x1.9dd3f239428bep-1 ++-0x1.ac5f04341a72fp-1 ++-0x1.df87628ca53cfp-1 ++0x1.d963f3e2377acp-1 ++-0x1.bc583247a7cb5p-3 ++-0x1.19bbe7224c70bp-1 ++0x1.e51196492219ap-1 ++0x1.f8be8469e0f90p-1 ++-0x1.9d7b07a7045cfp-1 ++0x1.7f288239bc808p-6 ++-0x1.f06ed4e303e99p-1 ++-0x1.edb676b500699p-1 ++-0x1.11c8041a56a40p-1 ++-0x1.8fa0020067b9ap-1 ++-0x1.e38a3096c29f9p-1 ++0x1.8bd9a2320c1eap-3 ++0x1.ec3a1130d87e6p-1 ++-0x1.f041e6d4d3221p-1 ++-0x1.ec3ed491bab06p-1 ++-0x1.e82ed1f92fb3dp-1 ++0x1.d97577265ac94p-1 ++0x1.e0dc4301d27ffp-1 ++-0x1.3c6f734ef61e6p-1 ++0x1.d481020b94331p-1 ++-0x1.084e305313b99p-17 ++-0x1.e379862ec0fddp-1 ++0x1.c59db4bbac95fp-1 ++-0x1.d65bd11324f1bp-1 ++-0x1.c59a52083041ep-3 ++-0x1.f7db5704a4985p-1 ++-0x1.e962d3ae18889p-2 ++-0x1.53c9205e774e8p-1 ++-0x1.e911418959876p-1 ++-0x1.eede64d01dd85p-1 ++-0x1.567a6656d28acp-1 ++-0x1.e6aa85d031c63p-1 ++-0x1.eb05376e22db1p-1 ++-0x1.7f6913662676cp-1 ++-0x1.495606dbbbe93p-7 ++-0x1.ec3000dc4aabap-1 ++0x1.ec4706c41bd83p-16 ++-0x1.e6a7c54bbfa5ap-1 ++-0x1.7a7641865ee08p-1 ++0x1.b53be3ce487cbp-1 ++0x1.40e9902e7c79ap-3 ++-0x1.eb3282a56efc8p-1 ++-0x1.dc476211ce07dp-1 ++0x1.fbb577823c6b2p-1 ++0x1.db89870b0b16dp-1 ++-0x1.efa8f6daf9d6ep-1 ++0x1.decb623f19c20p-1 ++0x1.34c3170fae6e6p-1 ++-0x1.eb66f41c573b3p-1 ++-0x1.42fa605e3ab02p-18 ++0x1.62f563b214a71p-1 ++-0x1.ebfe83dfbd7bfp-1 ++-0x1.d8320749306c8p-16 ++0x1.096bd4970cd0dp-22 ++-0x1.34db46c5d25f9p-1 ++-0x1.e584302e3a118p-1 ++0x1.279d83bbed431p-3 ++0x1.e267d33665809p-1 ++0x1.e7dfa379e70a6p-7 ++-0x1.db6095b37c495p-1 ++0x1.e8fc0548a8effp-1 ++0x1.df80158c55f1bp-1 ++0x1.085252cff6318p-2 ++0x1.e8b2a51a22aedp-1 ++-0x1.6c2551b909220p-1 ++-0x1.6b160460a6dafp-1 ++-0x1.ab45345443095p-1 ++-0x1.6deca2af052c9p-3 ++0x1.837e7496593b3p-1 ++-0x1.bf1280b399b44p-3 ++-0x1.846896e4714edp-1 ++0x1.a87ef4867a7b7p-20 ++-0x1.ebcf01f1f9c05p-1 ++0x1.ee9f7221b6d23p-1 ++0x1.f218003f765f8p-1 ++-0x1.dee46627c2030p-1 ++0x1.eff7e643f253bp-1 ++-0x1.3e07f3ef0c1aep-3 ++-0x1.7c2b31f076e73p-11 ++-0x1.806c918e71aeep-1 ++0x1.0db187d31341cp-2 ++0x1.8a44534c5fa47p-1 ++-0x1.dbd3606da38ebp-1 ++0x1.4c41a22828d0ap-1 ++-0x1.9eb9358ded573p-3 ++0x1.e080f6a0dd5a1p-17 ++-0x1.edc7b0c6d7c61p-1 ++0x1.1672e0cfb0ae6p-1 ++0x1.bcc2d238d4ddbp-25 ++0x1.ef15079437d86p-1 ++-0x1.e8c624ef9c950p-1 ++0x1.8543e62f380d5p-3 ++0x1.fef15658b7b3dp-17 ++0x1.fdaef64e92ad5p-1 ++-0x1.ed9495fb211ccp-1 ++0x1.66b7a3a5f4bbcp-2 ++-0x1.e4b4d29f62b3ep-1 ++-0x1.af4687b7a9dd1p-1 ++-0x1.1b8575ec2f1bcp-3 ++0x1.719ad2699f7f4p-1 ++-0x1.2ae4206794c97p-2 ++-0x1.f697d28a52766p-1 ++-0x1.4de5a4d1044b1p-1 ++-0x1.e859b3f551706p-1 ++-0x1.995221a7cd650p-1 ++0x1.5b44a5441ff42p-1 ++0x1.b40b1223b8731p-1 ++0x1.f41ca43bda5ffp-1 ++-0x1.d64953db536f6p-1 ++0x1.f237a08dabbebp-8 ++0x1.2ab9e2f378d0ap-3 ++0x1.748f13fdb7757p-1 ++-0x1.85fce11104791p-21 ++0x1.e8fb12ed42b85p-1 ++-0x1.b9be13f0400a5p-3 ++0x1.5cf593bcc75fap-1 ++0x1.e62c06763ca98p-1 ++-0x1.ef83347913d46p-1 ++0x1.8cd87241429ddp-1 ++0x1.ed52a73ea36ddp-1 ++0x1.eb1fb7b4361a5p-1 ++0x1.659040150dccep-1 ++-0x1.e84f02088580bp-1 ++-0x1.31efb599b0c90p-1 ++-0x1.3d71f7cc5cbb8p-14 ++-0x1.a7947303093c0p-2 ++0x1.d9d164d5dd4b4p-1 ++-0x1.a6a84397e3686p-1 ++-0x1.dbfc05a512685p-1 ++-0x1.5b0384147576ap-1 ++0x1.24925361ccdf7p-1 ++-0x1.ff78b2a719f69p-1 ++0x1.ed23979169478p-1 ++-0x1.aca5d6e0cebc8p-1 ++-0x1.ef3d97ca40548p-1 ++0x1.b18ed204df0bep-1 ++-0x1.8bb177f1b45d0p-1 ++0x1.eea5d7d2221dap-1 ++0x1.7f86226cc352bp-7 ++-0x1.e8690599a1b6bp-1 ++0x1.c62b97c2b228ap-3 ++-0x1.a1283741d2ae6p-2 ++-0x1.36bf72bd2813ep-1 ++0x1.02ff0102590a7p-1 ++0x1.81aef093e519fp-1 ++-0x1.e5788391286c7p-1 ++-0x1.373103fbf2dbbp-26 ++0x1.34e2d1a2d3f9bp-6 ++-0x1.f8d06493cf734p-1 ++-0x1.c24710eb7be22p-3 ++0x1.d2db6598cfaf0p-1 ++-0x1.da7e74a47298fp-1 ++-0x1.9af47030895e7p-12 ++-0x1.891952e265231p-1 ++-0x1.092645a64f8d3p-20 ++0x1.4f75862316ad1p-25 ++-0x1.fe90e5f9be415p-1 ++0x1.fb4ee1a050156p-1 ++-0x1.ec39744c1f0c8p-1 ++0x1.ba15c60d9db6fp-1 ++-0x1.87a6e44eaf473p-14 ++-0x1.346b35da45de2p-1 ++0x1.8db9c701a763cp-25 ++-0x1.db34b430e32a8p-2 ++-0x1.629942502fa18p-2 ++-0x1.e413c088c0673p-1 ++-0x1.1f6e31af5699fp-1 ++-0x1.ed7495c0fc882p-1 ++0x1.abee977c43f44p-1 ++-0x1.66cc97e31eaf9p-1 ++-0x1.e215564a14206p-1 ++-0x1.2c8ac0b1cee68p-6 ++0x1.d44c706157084p-1 ++0x1.60e11610c7ee0p-1 ++-0x1.30bba0afa8fb3p-1 ++0x1.bee52516c6958p-2 ++0x1.704ea3b5ecd74p-1 ++0x1.9e8346c8dd9e3p-1 ++-0x1.8d20a7a73971bp-1 ++-0x1.fee190f2fc2b8p-2 ++0x1.2412133b85638p-1 ++0x1.e12c42ed2cf35p-1 ++0x1.ab2c11f181602p-1 ++-0x1.3792d18b82986p-2 ++0x1.8201c2f453059p-1 ++-0x1.a787c4bfd3b9dp-1 ++-0x1.21cfc16c9dd00p-15 ++-0x1.fe18e3a9ee189p-1 ++-0x1.e0a0474a78619p-2 ++-0x1.f2b9635cc6607p-1 ++-0x1.ead0a07de749ep-1 ++-0x1.51be7174fb83ep-1 ++0x1.ce044606c1030p-1 ++-0x1.7ea081641e5c0p-1 ++-0x1.a3b065b4875e9p-1 ++-0x1.dfdae0cbe44cdp-1 ++-0x1.ed7ef264fedb8p-1 ++-0x1.ef5091c5626a8p-1 ++-0x1.dc56039dc4ef6p-1 ++-0x1.495862db7188cp-18 ++0x1.f702c7007d0f8p-1 ++0x1.af0a752686e3dp-3 ++0x1.e30a96a56e0a2p-1 ++-0x1.9e27251b3702fp-13 ++0x1.d09934bc80099p-1 ++0x1.0e94e36bb88f6p-2 ++0x1.e6ddf06e94dd2p-1 ++-0x1.07c16329a6368p-1 ++-0x1.ba2ae6c81ef86p-19 ++-0x1.0c0a94e27bcffp-1 ++0x1.dd58042e78413p-1 ++-0x1.e659010e4489dp-7 ++0x1.0214d6e90f72ap-1 ++-0x1.cf4586cf33876p-2 ++-0x1.b70207125cf48p-1 ++-0x1.df4870eb61dfap-2 ++-0x1.f57f5552ab569p-1 ++0x1.dfcf57952b0f5p-1 ++-0x1.e8c51781e0f5ap-1 ++-0x1.e482f48b7b06fp-1 ++0x1.ebaf12ac1ca9ep-1 ++0x1.e737501a3ae33p-2 ++0x1.ecd747e9c09c1p-1 ++0x1.e862d221950bfp-1 ++-0x1.11bc51c1a6b71p-1 ++-0x1.8b32c03c1f3fep-1 ++-0x1.45d6537260c70p-3 ++-0x1.eab7a154b753bp-1 ++0x1.dc3de7d2fc8d2p-1 ++0x1.ebba47c789bf9p-1 ++0x1.e9ecf3956d1f2p-1 ++-0x1.b9b423bd8562fp-16 ++0x1.ea80b59543ec4p-1 ++-0x1.4c94d139f13e8p-1 ++-0x1.6e83b5a2a8fe5p-19 ++0x1.e543336eb0ac0p-1 ++0x1.e1ebe4a9d8a89p-1 ++0x1.ed72033a5db2ap-1 ++-0x1.e266b288cfc87p-1 ++0x1.027c5616cc343p-1 ++-0x1.e35a95def4819p-1 ++-0x1.413b8018c5b35p-1 ++0x1.25c3a3e3119f1p-1 ++0x1.29429685f155dp-1 ++-0x1.daec27668718ap-1 ++0x1.066c27f6a6cfep-1 ++-0x1.ece86688b8215p-1 ++0x1.e7fb31fd3c964p-1 ++-0x1.7208a0ee99588p-18 ++0x1.e55e406d573cap-1 ++0x1.e8af41ef26febp-1 ++0x1.371c35f823ee3p-1 ++0x1.d17522ea5e064p-1 ++-0x1.7accc66f1a867p-1 ++0x1.1b88e568085eep-3 ++0x1.efa964a3049c3p-1 ++0x1.0ae4753a5c894p-13 ++-0x1.e5dc4522b9124p-1 ++-0x1.eea0521dad0ebp-4 ++0x1.852e91bce0883p-1 ++-0x1.dd70c04d30a3ap-1 ++-0x1.10e344fda4288p-3 ++0x1.f8ed93cccdd32p-1 ++-0x1.9b2a127bc4877p-1 ++-0x1.3ae99644caf6fp-2 ++0x1.2011857db1424p-26 ++-0x1.e901933e634b8p-1 ++0x1.c426411a0bd0ep-1 ++0x1.a5edb0220c08ep-1 ++-0x1.effdf2686cde6p-1 ++0x1.c32c91193429cp-13 ++-0x1.51f3b17d298a4p-1 ++-0x1.7f189788a9871p-1 ++-0x1.6df8f3b40a7d7p-20 ++-0x1.cc9fa732730b4p-1 ++-0x1.e800e2c46ef54p-1 ++-0x1.0036b44e98fb9p-1 ++0x1.545021fa9de9cp-1 ++-0x1.dbd584ff2c565p-1 ++0x1.f4ea010d09590p-1 ++0x1.0838d097bf35fp-2 ++-0x1.a1da024b0b5d7p-8 ++0x1.e8d72663b3bb6p-1 ++0x1.bd21611d957b4p-1 ++-0x1.e632b5939513cp-1 ++0x1.ef5182ea9b9f9p-1 ++0x1.1f999553c9965p-1 ++-0x1.b47b81b50fe30p-2 ++-0x1.ec1d2221cef9fp-1 ++-0x1.ff88333427dbap-1 ++-0x1.f9b0f160d4715p-1 ++0x1.000f60ec89995p-2 ++0x1.03ce907b337a2p-7 ++-0x1.a63a42293fa26p-3 ++0x1.292904fec9be4p-1 ++0x1.820c4727f0297p-1 ++-0x1.ee77e35aa0adep-1 ++-0x1.ecc08254e2ca3p-2 ++0x1.f5e2939c7c8abp-1 ++0x1.fe103302da0f0p-1 ++-0x1.ee18039175978p-1 ++-0x1.d7c305801dc47p-6 ++-0x1.f7bb55bddabc2p-1 ++-0x1.f3f604ec44843p-1 ++-0x1.6fbae21dcab06p-1 ++-0x1.f613a094bcd5bp-1 ++-0x1.9b44300f94ca8p-1 ++0x1.ebb413b8af6a7p-1 ++0x1.8ff5319a0c60fp-1 ++0x1.21f49780f87b2p-1 ++0x1.edc3445e3d359p-2 ++0x1.be0ce0e44a018p-3 ++-0x1.ee9ef2f6c17b3p-2 ++-0x1.c27d81c83efabp-1 ++0x1.ac8f6552a58dep-1 ++0x1.711ce469b9c2cp-8 ++0x1.fa3c9399c63afp-1 ++-0x1.432c76363edb9p-2 ++0x1.ea3e827115c9dp-1 ++-0x1.ea73d35821c98p-1 ++0x1.bf34426cf512cp-1 ++-0x1.1445f5830a831p-21 ++-0x1.ee29a33d89217p-1 ++0x1.8ccbb1dcc318bp-1 ++0x1.25b4539e355fdp-1 ++0x1.d9f2a66cb195ap-1 ++0x1.1d3cb7d6c6a5ap-1 ++0x1.b1b470d44d8e1p-1 ++0x1.a8b3a413894e6p-10 ++0x1.e85bb560bc75dp-1 ++0x1.5f70e6661a987p-3 ++-0x1.e607b65d13651p-1 ++-0x1.7133562954a55p-26 ++0x1.e8d044bdd2df4p-1 ++-0x1.6d61c0b3f3e7ap-1 ++0x1.b036d56c1ea88p-1 ++0x1.db9765d455c4cp-1 ++-0x1.d67e0577a6507p-1 ++0x1.1149b4f4323d5p-1 ++-0x1.61dc625616ea4p-1 ++0x1.e7e686da575a0p-1 ++0x1.1f8845720550bp-3 ++0x1.181681ffa6887p-1 ++-0x1.f9a361114e127p-1 ++-0x1.2daf678a502f3p-1 ++0x1.e9d467bd4f063p-1 ++0x1.6bdae68159ee5p-2 ++0x1.31f72092e0a01p-3 ++-0x1.0257216dc5462p-1 ++0x1.a3eba171994e9p-1 ++-0x1.76ca124cf6f47p-3 ++0x1.edaef15ec1849p-23 ++-0x1.55ac10a3a8641p-3 ++-0x1.c41062b424a37p-1 ++-0x1.d92890d75b595p-1 ++0x1.dcfb53f8d12a7p-1 ++-0x1.e282c640ea6f9p-1 ++0x1.d213669b363a3p-1 ++-0x1.e38275a589425p-1 ++-0x1.8ae0d1a8a37fbp-1 ++0x1.2e4ef4f93f824p-1 ++-0x1.e41b13bb1ae98p-1 ++0x1.086eb6e0f5f9bp-1 ++-0x1.e5a480f554f3dp-16 ++0x1.247007cd3459dp-9 ++0x1.126fb704975d2p-2 ++0x1.ead2c179b0748p-1 ++0x1.e2a9b69b414cfp-1 ++0x1.dd5754e2b6f70p-1 ++-0x1.aa3c46accda7bp-1 ++-0x1.eac543bc70794p-1 ++-0x1.3e5ed5df8f9b3p-3 ++0x1.c87902a9dc843p-2 ++-0x1.7488404424d8fp-1 ++0x1.0a0993e0464fep-1 ++0x1.ec89e597c1fb8p-1 ++0x1.ff68c644002e1p-1 ++-0x1.57e6c01243fa0p-1 ++0x1.e6e2b58850fbcp-1 ++-0x1.ee92e612cb066p-1 ++0x1.e3f070eec2596p-1 ++0x1.a3a1677955b56p-1 ++-0x1.bcc7e5fa33d67p-1 ++0x1.594fe3ac79583p-1 ++0x1.50ec000b8e4acp-3 ++-0x1.f9295717cfd6fp-1 ++0x1.ef55f3c40b195p-1 ++-0x1.fb0bc0bcae0e5p-1 ++0x1.ef1e83db4a781p-1 ++-0x1.e24192e4c76d5p-1 ++-0x1.b008d5aeca3d0p-1 ++0x1.e8f7b7904e38ap-1 ++-0x1.ee3126a0a120bp-1 ++-0x1.261cb76f274a4p-1 ++-0x1.e693d2d796ecap-3 ++-0x1.ddbba60a316aap-1 ++-0x1.f79761f4b586fp-10 ++-0x1.ea326681d6327p-1 ++-0x1.30688704ba934p-13 ++-0x1.e7cb21c3e16e5p-1 ++0x1.587605ae10952p-1 ++-0x1.e19505b39f2c0p-1 ++-0x1.e18a12334f770p-1 ++-0x1.0837757b9d39dp-2 ++0x1.d5a6b0de0792ap-3 ++0x1.f99470c182bf6p-1 ++0x1.ed070744db724p-1 ++-0x1.73b2737edc5c7p-26 ++0x1.b936968f91883p-3 ++-0x1.ea40a3cab079fp-1 ++0x1.38e266cf4e67bp-23 ++0x1.eef1a663ee7c0p-1 ++-0x1.b714f5eded91ep-1 ++0x1.dbc6676e6b672p-1 ++0x1.eb6416d4263a2p-1 ++-0x1.cd5f86a8d0aa0p-1 ++0x1.6f9df5f49001bp-2 ++-0x1.6c0f802e7de00p-1 ++-0x1.171c4382a49b5p-1 ++-0x1.6b40229004e64p-1 ++-0x1.9b6996025da1cp-1 ++-0x1.efbc035d5241cp-1 ++-0x1.8d6cd1d2f1d24p-2 ++0x1.387816b7132c2p-15 ++-0x1.222651699e523p-1 ++0x1.3b2d21d75094ap-2 ++0x1.e81bf743c0369p-1 ++0x1.ee2044b7efb74p-1 ++-0x1.ff5cc72dade88p-1 ++-0x1.c932d35cb0882p-1 ++-0x1.e12937d9b5de6p-1 ++-0x1.bb5fe6c2388bcp-20 ++0x1.e2f9c07852f70p-1 ++0x1.389e508c2d4a1p-3 ++0x1.4e0e70421f589p-3 ++0x1.cc1262f95c14cp-1 ++0x1.fc9c210385ec5p-1 ++0x1.9984459a46260p-1 ++0x1.e4e8c2f4a4892p-1 ++0x1.e37f56ad5d374p-1 ++-0x1.d604e43246f1ap-1 ++0x1.dd2cb52e3f946p-1 ++-0x1.ad5ce2c9a061dp-2 ++-0x1.e304f24cdfffbp-1 ++0x1.06c562663d3d5p-1 ++-0x1.80d703d704546p-1 ++0x1.24f756f5e8490p-22 ++0x1.ef88e7a892892p-1 ++-0x1.8acf064a612ebp-11 ++0x1.f85ef0fd21f0bp-1 ++-0x1.f2d7b573896eep-1 ++-0x1.c41b9411e2424p-1 ++-0x1.0eed14bd5c463p-1 ++-0x1.ecf8e686be7cep-1 ++-0x1.965f75ff798a9p-1 ++0x1.6411e12b18fc4p-1 ++-0x1.11af90316a631p-9 ++-0x1.da5f66b16e89ep-1 ++0x1.085d72e4cc8a6p-1 ++-0x1.dd2c9123047c4p-1 ++0x1.ead1c7993f167p-2 ++0x1.d9b8b3488e2c9p-1 ++0x1.e3ba8654faf94p-1 ++0x1.b12e97910d2fbp-3 ++0x1.8ca403a109b30p-3 ++-0x1.e5f2937058787p-1 ++0x1.1a16c20b59c20p-8 ++-0x1.11098610b5ed6p-16 ++0x1.892e670d4f005p-1 ++-0x1.2648b2df313ccp-1 ++-0x1.dfc21746825a5p-1 ++-0x1.4f866516769a4p-1 ++-0x1.e913c2d94e14ep-12 ++0x1.50e5c3abd6b3ep-1 ++0x1.ddb931972f706p-1 ++0x1.66d50185eedb5p-2 ++0x1.178457d5f3122p-1 ++0x1.0a089692fa9d6p-1 ++0x1.53e8b3a99a9ffp-21 ++0x1.faccb45f4e2f8p-3 ++0x1.0fba936e6a028p-2 ++-0x1.b6f9a6276a135p-1 ++0x1.67cbb33515663p-6 ++0x1.3ac2c7ff47442p-1 ++0x1.fd2901f3c9671p-1 ++0x1.a95ba191e3d37p-20 ++0x1.ecfdc74673b2ep-1 ++0x1.e33344b0b2b7dp-1 ++0x1.d6b6c30ea8c56p-2 ++-0x1.3e18951be4c2ap-10 ++0x1.06544747d23b7p-1 ++-0x1.6530f1b557057p-1 ++-0x1.e141a1fc347e7p-1 ++-0x1.c209253da05dfp-1 ++-0x1.5abd34f01cc55p-25 ++0x1.da55f059b4805p-1 ++0x1.b15ad1f0f8186p-1 ++-0x1.e2f6324aebb6cp-1 ++0x1.e6cf20c6b3bd3p-1 ++-0x1.d9f586a99ac1dp-1 ++-0x1.ea5db6c802980p-1 ++-0x1.eef205ef8bf9cp-1 ++-0x1.e77cb3d6aba48p-1 ++-0x1.efb0238767d34p-1 ++0x1.eac576f6fcc93p-1 ++-0x1.9d69119b79677p-17 ++0x1.95acf5bfa2f77p-3 ++-0x1.551e1792426dap-1 ++-0x1.dbe0e257f280cp-1 ++-0x1.f69220aac2bb2p-1 ++0x1.57b2160efdbf5p-2 ++0x1.e58de281a1a07p-1 ++0x1.084020b03e4d2p-6 ++0x1.d87e91b7e07b7p-1 ++-0x1.99cda400ce3b7p-2 ++-0x1.e362932c8c92fp-1 ++-0x1.da4995d5cee72p-1 ++0x1.87b2d4dcffaf9p-1 ++0x1.3ea5128eaaf2dp-1 ++-0x1.5faae7d3bcf38p-1 ++0x1.3aec5799bb1d9p-19 ++-0x1.ec3797b899976p-1 ++0x1.8aefc30a2949bp-1 ++0x1.bd62a0a521e27p-2 ++-0x1.ab7df36836c3fp-1 ++0x1.91ab544ac879fp-2 ++0x1.f80f9015de12ep-1 ++0x1.aa572325d6916p-1 ++0x1.efb673b18111ap-1 ++-0x1.dbb4625b1b6d4p-1 ++0x1.ddbbe2e244b52p-1 ++-0x1.f79ea4af0ff39p-1 ++-0x1.c16b5501eff50p-1 ++0x1.ea4315c9c663fp-1 ++0x1.ade22053744afp-1 ++-0x1.e4b1a6febdb21p-1 ++0x1.ec9464048b26cp-1 ++0x1.e3c1e7f51cf59p-3 ++-0x1.dc8fa6420fb87p-1 ++-0x1.f052a40d8e48bp-1 ++0x1.cb7bf6c1858f8p-17 ++0x1.e4fbf10139e0ap-1 ++-0x1.df2192fe7f98dp-1 ++-0x1.062da16c62ccep-1 ++0x1.0dca9008fbcebp-2 ++-0x1.0fd4c304627a5p-11 ++-0x1.f7ad343c1ffafp-1 ++-0x1.3de2247c0ac76p-1 ++0x1.a8f991857abcfp-3 ++0x1.b42d56efb9226p-1 ++0x1.410fc200873e5p-1 ++0x1.b2a8837671aa6p-1 ++0x1.adf61664fadc1p-1 ++-0x1.858b722a5427bp-1 ++-0x1.e20ac139c6d90p-1 ++0x1.ec4a72202abfbp-1 ++-0x1.bf067665f434dp-3 ++0x1.b78865ebf7179p-1 ++-0x1.0634566d8abcep-1 ++-0x1.e6a6172392825p-3 ++-0x1.e6fc2655bf4fep-1 ++-0x1.e543e6d75248fp-1 ++-0x1.e88fc53e3e4b0p-1 ++-0x1.eb40e4f889a53p-1 ++0x1.e79ef6eba9adbp-3 ++-0x1.96df34af5a088p-21 ++0x1.65efb1356114ap-3 ++-0x1.8d4e57db12a07p-3 ++-0x1.5d616093177aap-1 ++0x1.df0754bc48a37p-1 ++0x1.d025216b99be2p-5 ++0x1.e739901525d14p-1 ++0x1.e8d122ec89b8ap-1 ++0x1.e8c93262e04f1p-1 ++0x1.ffd00163380e1p-1 ++0x1.95d3428efb513p-1 ++0x1.ea9674065a5c0p-1 ++0x1.44b2453851f94p-1 ++0x1.f42ee4d7dac9dp-1 ++-0x1.e976c2fccc26ap-1 ++-0x1.27ba2598fa425p-1 ++-0x1.817945ade05b6p-1 ++-0x1.6d6582d27a94ep-3 ++0x1.ea59d39e18322p-1 ++0x1.2c7d24a2d4e9dp-2 ++0x1.f44e04251a793p-1 ++-0x1.3778036172b36p-2 ++0x1.eed61776e402fp-1 ++-0x1.799ba18a53c8bp-1 ++-0x1.6fb4348faf5c4p-3 ++0x1.ddc2869dc18a5p-1 ++-0x1.e343665d40ccap-1 ++-0x1.3f73605325ab0p-3 ++-0x1.3ba0f05c1755fp-1 ++0x1.ed92048ac9d47p-1 ++-0x1.e1a5a6243d05dp-3 ++0x1.e4fd73980b5e1p-1 ++0x1.33b9002a95e7ep-2 ++0x1.ecba4619d36bcp-1 ++0x1.6a7a22a449e86p-1 ++-0x1.a2bb4749faabep-3 ++0x1.8248f68a7e1ffp-1 ++-0x1.e21ad7da85c70p-1 ++-0x1.dd8e86ce2c248p-1 ++0x1.5d40255ad5479p-2 ++0x1.a5fa20bad74b8p-1 ++-0x1.f99406b4197a3p-1 ++0x1.d2f1b785de5d5p-1 ++-0x1.e2d534c706c26p-18 ++0x1.aeb5736c743fbp-2 ++0x1.dfc7324805273p-1 ++-0x1.2d2db09cc6e86p-21 ++0x1.edae94523b924p-1 ++-0x1.dc31f75dbd8bap-1 ++-0x1.dce536216941cp-1 ++0x1.a96985facec4bp-1 ++-0x1.e5ce57ae15fa4p-1 ++-0x1.dbd6a23f8b933p-1 ++0x1.8d6b062af3681p-2 ++-0x1.2590214dd2a24p-3 ++0x1.d0f7e414c0f7bp-1 ++0x1.eec205a0f3bfcp-1 ++-0x1.5cf1a0c8c1ccdp-2 ++0x1.ca9b05da55e1dp-3 ++0x1.e7078679d9affp-1 ++-0x1.dee200a7c99b0p-1 ++-0x1.aea74698a65c1p-3 ++-0x1.eef2e7388b0b8p-1 ++0x1.9475e0bee269cp-1 ++0x1.e8ede2eca6ebcp-1 ++-0x1.3a3f5430a9d73p-1 ++-0x1.da99616adbb35p-1 ++0x1.40a287e0245c7p-1 ++-0x1.db6f1755478ccp-1 ++0x1.4b37359e5a442p-1 ++-0x1.fabca4ba5ef23p-1 ++0x1.bdb701415b22ap-1 ++0x1.ece78508bb8c1p-1 ++0x1.4a0d37fdc5a79p-16 ++0x1.d81ca025d90bcp-1 ++0x1.eacf140a099a8p-1 ++0x1.ec31331b47ad9p-1 ++0x1.ffd881703db66p-1 ++-0x1.2f5617c2cdd47p-1 ++-0x1.de2e87858ebd7p-1 ++-0x1.3fc366eb32e48p-1 ++0x1.da5505c9b5082p-1 ++-0x1.c13e200d12a13p-1 ++-0x1.eb29615918644p-1 ++-0x1.530e61ff0420fp-21 ++-0x1.e904b6785c98cp-1 ++0x1.dd8612e5b6eb4p-1 ++-0x1.339060228fa99p-5 ++-0x1.3b19c402e1ab5p-1 ++-0x1.3af4f28b24131p-1 ++0x1.fdcf071e072d3p-1 ++0x1.a02143cfecad9p-1 ++-0x1.a33832573766ep-8 ++0x1.f013574be1027p-1 ++0x1.6bbb23e29bd56p-2 ++0x1.c2e0b4f123c1dp-19 ++0x1.0bd860a759addp-1 ++-0x1.ea778377c1e47p-1 ++-0x1.e415749cde067p-1 ++-0x1.f0a930040729ap-1 ++0x1.f0e804039007cp-1 ++-0x1.dc12b607e76dap-1 ++-0x1.3a0d506141a45p-5 ++-0x1.bc3fa1c91bbc5p-2 ++-0x1.61f91720d48f9p-2 ++-0x1.b682b0abe4889p-2 ++0x1.e2ecf4b017e0dp-1 ++0x1.161d419e7dff1p-3 ++-0x1.daf7532488e10p-1 ++-0x1.c80936da67635p-1 ++-0x1.f79a56103c6bcp-1 ++-0x1.ea6bc6967c364p-1 ++0x1.eb55c5889afdap-1 ++0x1.31373491f9fd9p-1 ++0x1.80eaa23a91ec2p-1 ++-0x1.fd9ed1b43f715p-1 ++-0x1.02c3e70019c89p-1 ++0x1.daa6242404908p-3 ++0x1.e8a1b27cb8dd3p-1 ++0x1.caa1a29c0a137p-3 ++0x1.e925463516258p-1 ++0x1.dfb4b65646ab3p-1 ++-0x1.4c1900363e38bp-3 ++-0x1.ea072277e9de6p-1 ++0x1.eb1bf69818892p-1 ++-0x1.c7891601871cfp-1 ++-0x1.e9c811e32475fp-1 ++0x1.09ffc56919a5dp-8 ++-0x1.1afd8636d88a6p-4 ++-0x1.d5faa18bb319cp-24 ++-0x1.5a73f23f4d005p-3 ++-0x1.f12a419b4a7e1p-1 ++-0x1.f3f813fc62e9ap-1 ++0x1.882457f6307dfp-3 ++0x1.cc79d0b17437bp-3 ++0x1.f849007c8fc5bp-1 ++-0x1.582d615ec34e3p-1 ++0x1.406506bfcfb11p-1 ++0x1.b6a6c3eebea0cp-1 ++-0x1.e88b2722a8806p-1 ++0x1.31b3642d568c4p-2 ++-0x1.b5ca91453fe3fp-1 ++0x1.3137f5baf9af4p-1 ++-0x1.ebd6465bc4b63p-1 ++-0x1.a49977d4938ccp-1 ++0x1.e71ef4f74efa5p-1 ++-0x1.7992140ccce3ep-3 ++0x1.e2d9f4354faf7p-1 ++-0x1.a282a4f738fe1p-2 ++-0x1.864a6783972d3p-1 ++0x1.ba4587f6ddfafp-1 ++-0x1.b9dc1365a48d6p-1 ++0x1.9b24d0442a8bdp-1 ++0x1.de51365f22198p-10 ++0x1.4b5e2197433cdp-2 ++0x1.be54761e95348p-1 ++-0x1.fb51005dfdc02p-1 ++-0x1.fa7fb41bdf4ecp-1 ++-0x1.da30d147aa840p-1 ++0x1.a0b8a727a25c6p-1 ++0x1.f298d21034624p-17 ++0x1.e9cfa7a7fd217p-1 ++-0x1.f4e8b5ec98f6cp-20 ++0x1.7302146a6f168p-8 ++0x1.5799928b1b254p-1 ++0x1.d704c60ab009dp-1 ++-0x1.9681e2cf54b70p-1 ++-0x1.e48e4276acf60p-1 ++-0x1.edd8a455629a7p-1 ++-0x1.f37d96501f78bp-3 ++-0x1.b7a5b13013786p-3 ++-0x1.e960c36a66790p-1 ++0x1.b63de6d713d58p-1 ++0x1.e47cf5ea94794p-1 ++0x1.ff99528e27db8p-1 ++0x1.6c20d6e995703p-20 ++0x1.dd82403aa55b3p-1 ++-0x1.bdf2b69afaaa0p-19 ++0x1.debfb38f72c41p-1 ++-0x1.caf0a20a2e374p-3 ++-0x1.c786d16c31b03p-1 ++-0x1.be5512ecf8b31p-2 ++0x1.eb74f08f7bea6p-1 ++0x1.41f8565f967afp-1 ++-0x1.df40e5c3806e3p-1 ++0x1.915a220e086dfp-1 ++-0x1.eab325c5fbbe8p-1 ++-0x1.811ee0ee26a13p-5 ++-0x1.deea07f1077cdp-1 ++-0x1.a4b6326d457f6p-21 ++0x1.29b2708c3a747p-1 ++0x1.c0d8d07a22f7fp-3 ++-0x1.56bf84f095b88p-2 ++0x1.d8e426b246e44p-1 ++-0x1.621014d0872dcp-1 ++0x1.7307e45a9bfb6p-5 ++0x1.dde4a27afa00ap-7 ++0x1.dbce065bbf8a3p-1 ++0x1.e1207083bb09fp-1 ++0x1.1daa53018212fp-1 ++-0x1.496161b184764p-1 ++0x1.be4077f0a12bep-23 ++-0x1.ba4832d143c1ap-1 ++0x1.eae16553c8c57p-1 ++-0x1.dcd236d0485fbp-1 ++-0x1.e2b5a72fffc26p-1 ++0x1.eb42940a8517bp-1 ++-0x1.e06e527c5ae19p-14 ++0x1.ae15b592e3128p-1 ++-0x1.ca92520c405e5p-2 ++0x1.7db9b3fa53090p-1 ++0x1.64105318b86d4p-1 ++-0x1.ed5ce02997ae3p-1 ++-0x1.30fbb21b54296p-12 ++0x1.bc360678ba681p-7 ++0x1.e5d335374c24cp-1 ++-0x1.e0749468e2cc8p-1 ++-0x1.ee3570ed32c54p-2 ++-0x1.3a8df06a429efp-2 ++-0x1.ce3772c129db8p-13 ++0x1.15ba83dfe3904p-3 ++0x1.08f5e344993d5p-1 ++-0x1.ed8e061bb76b0p-3 ++0x1.f8ffe57a8dde1p-1 ++0x1.e66a85eaf4ee0p-1 ++-0x1.fea40127cc2f2p-1 ++0x1.f2aab1284b4b0p-1 ++-0x1.cc03e1478de39p-4 ++-0x1.e912d49635d92p-1 ++-0x1.f1687635d3527p-1 ++-0x1.627064608ff5ep-1 ++-0x1.eb5a8287935edp-1 ++-0x1.1857a62740addp-1 ++0x1.5b65c47382c9ap-3 ++0x1.ecb1a4e85bbefp-1 ++-0x1.a7fea62a8476fp-3 ++0x1.ccdc351ffc956p-19 ++0x1.f8d674c4fbe5fp-3 ++-0x1.fa49b4283ce9ap-1 ++-0x1.ed8ea55dfb46cp-1 ++0x1.c552618b4fd1ap-1 ++-0x1.b9fbf215a6137p-3 ++0x1.edea1355a361cp-1 ++0x1.ba92542786897p-1 ++-0x1.a7307747e4eedp-1 ++-0x1.41cb43cc57a37p-1 ++0x1.ffe9232e1641fp-1 ++0x1.556ed63589177p-12 ++-0x1.cd6f16bc335c9p-1 ++-0x1.f2b6338523771p-2 ++0x1.db2795c5314edp-1 ++-0x1.de2267c10bed6p-1 ++0x1.ea9e158ead810p-1 ++0x1.bec560986a04ap-1 ++0x1.ef3db6de27565p-1 ++-0x1.3393b6059cb76p-23 ++0x1.b980f402882acp-3 ++-0x1.e259b369989a0p-14 ++-0x1.ff6ac3ef8dac8p-1 ++0x1.7e5081826dfc6p-1 ++-0x1.0c6c55fecc746p-1 ++0x1.ef97766ebf4d8p-1 ++-0x1.ddae26391e016p-1 ++0x1.fc6cf6ab5b808p-1 ++0x1.dc2b369f4fb97p-1 ++0x1.3e0cd4bcc78f9p-2 ++-0x1.0e4bb0b067b5bp-1 ++0x1.b79ba1d3be769p-1 ++-0x1.ea50436bfcdb0p-1 ++-0x1.fa0d71fd79cc3p-1 ++0x1.3dc4e295f1f30p-1 ++-0x1.703d419656c71p-1 ++-0x1.fa7f5390f9fbcp-1 ++-0x1.e70a30da2cfa1p-1 ++-0x1.fdabb5f507142p-1 ++0x1.f64dc541cc1fap-1 ++0x1.eb319784bca19p-1 ++-0x1.f3bc56a59b92fp-1 ++-0x1.b8a0d2c98b8e0p-1 ++0x1.425107976f0d2p-20 ++0x1.4ad290cb36082p-3 ++-0x1.b5bb322363d88p-1 ++-0x1.e7ce322063c1ep-1 ++-0x1.c48fc05bc06adp-1 ++-0x1.e74004feba25dp-1 ++0x1.19099015cd289p-1 ++0x1.9df0943df0ed7p-1 ++-0x1.a337f087e6047p-1 ++-0x1.7d8cb3c9cb5d8p-1 ++0x1.11a6b0c515920p-1 ++0x1.c693d3e0c3d93p-1 ++0x1.f141608e6aec1p-1 ++0x1.a9bde0091b760p-1 ++0x1.c93a76be71d45p-1 ++0x1.d7597098112a3p-1 ++0x1.edf6c4bdb283ap-1 ++-0x1.205784cd6e44ap-1 ++-0x1.a0d5f18128988p-2 ++-0x1.e40666614e59fp-25 ++0x1.121bf667b781ap-1 ++-0x1.668da74298814p-7 ++-0x1.616fc1a66c4d6p-1 ++-0x1.ee112212f8aa0p-1 ++-0x1.ed6ef73d531a4p-1 ++-0x1.c15fb366cfcf9p-1 ++-0x1.efffe322b6ac1p-1 ++0x1.96c5c059d54afp-1 ++0x1.e4e1454ecf85dp-1 ++0x1.db2913c8fc219p-1 ++-0x1.7f66a643bfb7ep-1 ++-0x1.27f944d4ad8d6p-1 ++-0x1.6426726aee6cfp-1 ++0x1.d9c0506986f5ap-1 ++-0x1.eeaad7939baecp-1 ++0x1.bd5a077c9fc90p-1 ++-0x1.38a69239f073cp-1 ++-0x1.f932f26d539d5p-1 ++-0x1.b260a79be9a1bp-6 ++0x1.ef9f51187fe83p-1 ++-0x1.dce6b232fc21ep-1 ++0x1.ee14f4ba14235p-1 ++0x1.eb85a30d4a2e5p-1 ++0x1.b11031019577cp-2 ++0x1.b58be17f9d847p-2 ++-0x1.d9cbe370eb0ecp-1 ++-0x1.d517b3ce2b655p-1 ++-0x1.ec41e5fb51583p-1 ++0x1.8df301a855975p-25 ++-0x1.e889435c34b7dp-19 ++-0x1.134640672cf7ap-2 ++0x1.49ae67009c731p-3 ++0x1.e80a234204ccep-1 ++-0x1.eb9c151577abap-1 ++0x1.f0b6320c75315p-1 ++0x1.b8ccb51a3d918p-1 ++-0x1.98e3649200763p-1 ++-0x1.dbe723ecfc7f0p-1 ++-0x1.db9dd79228607p-1 ++-0x1.dcb17195a4c60p-1 ++0x1.dce077ee88b26p-1 ++0x1.c85742cc49d4ep-1 ++-0x1.815743a3562efp-1 ++-0x1.dc9450089dc1dp-1 ++0x1.5e56a1bca2c1ep-1 ++-0x1.5e48b383d64fbp-1 ++-0x1.de4c64b5bc273p-1 ++-0x1.f2700673bb386p-1 ++-0x1.c1301186b73c3p-18 ++-0x1.b17535ce5f5e3p-1 ++0x1.400e032ed6125p-3 ++-0x1.128c733eb080ap-1 ++-0x1.9cf7f3c30c74fp-1 ++0x1.dc24f6d5d88e9p-1 ++0x1.f78a43cc77de0p-1 ++0x1.543a72675a6aap-1 ++-0x1.45dd4628eecd9p-24 ++0x1.fffd225b95d9fp-1 ++-0x1.363de4b85c86dp-3 ++-0x1.db6440c16c293p-1 ++-0x1.e09c81e7a33a5p-1 ++-0x1.af90f6124102cp-1 ++0x1.b4106515dc5c5p-2 ++-0x1.daa2769ff6e50p-2 ++0x1.002e426741e10p-2 ++-0x1.ee228647b7dbap-1 ++-0x1.22ec95cf2a12dp-1 ++-0x1.e93e916c943dbp-1 ++-0x1.14b932254ccd8p-9 ++-0x1.909622a8afce0p-9 ++-0x1.b5b5e40f69460p-1 ++-0x1.0b42e197effbap-1 ++0x1.3bdc443663478p-1 ++0x1.fb7b75d00f267p-1 ++-0x1.f06581e9738c7p-22 ++0x1.bcb3805a8b0acp-1 ++-0x1.9b6ff25e8b37bp-1 ++0x1.f9cb94e42bc3dp-1 ++0x1.ecd805ed64887p-1 ++-0x1.a65c4560a2138p-2 ++-0x1.56dff1b743c85p-1 ++0x1.e5298138fd89cp-1 ++-0x1.156c062335d7dp-1 ++0x1.df59064910717p-1 ++0x1.af0516501c6d6p-1 ++0x1.d2dbb56e8dd5fp-3 ++0x1.d0b523fc1ceb1p-1 ++0x1.bcf543a18c01fp-1 ++-0x1.709413363b142p-26 ++-0x1.f8c00391024e6p-1 ++0x1.5aa701b2476b0p-1 ++0x1.44865784caf4ap-8 ++0x1.e998073d61296p-1 ++0x1.8eb830a476bb7p-1 ++0x1.ff036620f55bbp-1 ++-0x1.f64585ccfeb6dp-1 ++0x1.ae9611b635f6ep-1 ++-0x1.24d9e5b7dfc26p-12 ++0x1.9a25d27526795p-1 ++-0x1.ec0cf6bf16995p-1 ++-0x1.5f64a17e9500dp-2 ++-0x1.ef0f34f9f356fp-1 ++0x1.974b13f3e4673p-5 ++0x1.09de90f53b65ep-1 ++-0x1.e1b0771809c44p-1 ++-0x1.0b7c366b28640p-1 ++-0x1.4e93f479a0cc6p-1 ++0x1.cd2b95c2df3d4p-1 ++0x1.dd556108d9ee4p-1 ++0x1.d9c6a408e180ap-1 ++-0x1.852ba5ea09204p-2 ++-0x1.6a318265b0ce0p-1 ++0x1.8187a65639248p-3 ++0x1.bed3226c9cf5ap-2 ++-0x1.bf96c5540152cp-1 ++-0x1.1c9d850480123p-1 ++0x1.d8a65092223e5p-1 ++0x1.52c841c5f3d66p-1 ++0x1.0498d6413da66p-1 ++0x1.dac374698d877p-1 ++-0x1.fc1bd618e87e8p-2 ++0x1.ebe4c1cec3060p-1 ++0x1.983b20ca0cd67p-1 ++0x1.ec96e031167b4p-1 ++0x1.ea4ee28054fa3p-1 ++0x1.edae74719dd10p-1 ++-0x1.6162424ab4689p-1 ++0x1.d9e3a0d3c4a69p-1 ++0x1.f8cc86f846007p-19 ++-0x1.f48764fc3cc92p-1 ++0x1.ec5d65428be39p-1 ++0x1.ebbdc16a6c83cp-1 ++0x1.f4021476db864p-1 ++-0x1.e537b490c8ebbp-1 ++0x1.1a8247328b1eep-3 ++0x1.ded3e00b45be7p-1 ++-0x1.12fce6ee5e120p-3 ++0x1.e8faf051d09cbp-1 ++0x1.67c444811ab4dp-3 ++-0x1.20b4a1a53c3d5p-1 ++0x1.71a901abd5ee1p-3 ++0x1.32e467615008ep-22 ++-0x1.ea1224bded243p-1 ++0x1.de9582df5c7f5p-1 ++-0x1.b8e1e27336860p-1 ++0x1.ec8561690ba28p-1 ++-0x1.daee03fa90d5cp-1 ++-0x1.3a3bc41b1b0fcp-2 ++0x1.e38b32f89a15fp-1 ++0x1.2a7a67c6a7f5fp-1 ++0x1.ad2e378f343e2p-14 ++-0x1.755da68905d10p-1 ++0x1.79c3b49ea70d1p-1 ++-0x1.8a29b0ff7fef3p-3 ++0x1.e6e791aad1f3ap-1 ++0x1.67b372a69cd0bp-3 ++0x1.f3d57719d5a66p-1 ++0x1.c96a64375fd43p-1 ++-0x1.eb6f12c7214f3p-1 ++0x1.7c2a71b780eadp-1 ++-0x1.ebcbf2f5b7eb8p-1 ++0x1.9c2ac06be1e36p-1 ++0x1.47b60350a0542p-1 ++-0x1.e81352ef49d80p-1 ++0x1.e2fde24e7441dp-1 ++-0x1.cfc297f098209p-1 ++-0x1.9f3a958bc4d8dp-9 ++-0x1.ebed30f465969p-1 ++0x1.851581e8ee5f8p-8 ++0x1.b29d24839a5c2p-1 ++-0x1.d996e18e1756fp-1 ++-0x1.e945641fd4421p-1 ++-0x1.7567a1368f83dp-20 ++0x1.eda764a20b53bp-1 ++-0x1.d90ed36b67dd1p-1 ++-0x1.1721b193cb808p-1 ++-0x1.1aa794570d691p-3 ++-0x1.486275b31eff1p-1 ++-0x1.7932031d98446p-3 ++0x1.082044740fb11p-1 ++-0x1.bc5005352d983p-1 ++-0x1.9e34b40c77bdbp-1 ++0x1.f8960738dba77p-3 ++0x1.0d8d44f6a38b9p-1 ++-0x1.ef2a370ffe51ep-1 ++-0x1.885af3b2b9117p-1 ++0x1.ab5dd30d3b0d9p-1 ++0x1.658572e828c0dp-3 ++0x1.00801354b719ap-21 ++0x1.ead7729f447e2p-1 ++0x1.73fe964bcb9b8p-26 ++-0x1.eb9e2463b8a3ap-1 ++0x1.dcc7f49496bbbp-1 ++0x1.e322464ccedbcp-1 ++-0x1.f3f1411a81959p-1 ++-0x1.b806d3a207c7fp-2 ++-0x1.9e3cf02520c9bp-1 ++-0x1.a3903178cc914p-1 ++-0x1.9157d3c02c3b2p-1 ++-0x1.a828f2fd070e9p-1 ++-0x1.dfe122ce59486p-1 ++-0x1.e0c5f12e4aee9p-1 ++-0x1.096d23efa8b4cp-1 ++-0x1.eeb2b02957428p-1 ++0x1.9bd135009e628p-1 ++0x1.dcfa56e705532p-1 ++-0x1.dcc733e36743ap-1 ++-0x1.f13ac5b2f066dp-1 ++-0x1.ee5a97d9a8b48p-1 ++-0x1.2421b26321192p-3 ++0x1.4bdfb654355fap-1 ++0x1.e9ab41fff09b7p-1 ++0x1.6c39f77452a13p-2 ++0x1.f2d9a4e18b93ep-1 ++0x1.f588f66b070a4p-1 ++0x1.c0b604407eb47p-1 ++0x1.907b33485084dp-1 ++0x1.e58d17977d4c7p-1 ++-0x1.e9c1b44e07fecp-1 ++0x1.5978b562d5348p-2 ++0x1.f69e2232d6a42p-1 ++-0x1.ea1b37e291f39p-1 ++0x1.a9c704aff0411p-1 ++0x1.0f4422ec03b3ap-1 ++0x1.0c01d7eb6c807p-1 ++-0x1.e24961f09bb8fp-1 ++-0x1.6ad805c841fcap-1 ++-0x1.f30f95a858a13p-1 ++-0x1.7509a50c46facp-13 ++0x1.0a4725eca19ecp-1 ++0x1.f041143af7d9cp-2 ++0x1.c39ee2c592617p-3 ++-0x1.b389464f1c401p-1 ++-0x1.eeb6a2abaa396p-1 ++-0x1.26b3228cfdb15p-1 ++-0x1.f7553430f26b9p-1 ++-0x1.fbb1f12faf4e4p-1 ++0x1.97b404be9b207p-3 ++-0x1.6b2935d76744bp-1 ++0x1.ee2bd4e26496ap-1 ++0x1.69d035f7a7ee7p-8 ++-0x1.5adfd2a30ceadp-1 ++0x1.81131610d528cp-2 ++0x1.81f87126313b8p-1 ++-0x1.7cb4d0d3ae749p-1 ++0x1.00a5000f3784dp-1 ++-0x1.ec020225e8d1ap-1 ++-0x1.dcfbc732dc4ccp-1 ++-0x1.f54ad24e2bdd7p-2 ++0x1.eb4c931e3f233p-1 ++0x1.ef6013aa5bd6dp-1 ++-0x1.ec4fc7eb42446p-1 ++-0x1.963eb08b090e2p-1 ++0x1.eb5787014c22cp-1 ++-0x1.c474572d53337p-1 ++-0x1.7e09139513a33p-26 ++-0x1.f9340275d9995p-1 ++-0x1.edcf16351be04p-1 ++-0x1.7d78a4e9dc91bp-1 ++-0x1.1e30752523e09p-2 ++0x1.dc4b32a234a23p-1 ++-0x1.edbb01a598c24p-1 ++0x1.6367c4f49a449p-1 ++0x1.eb1db52a22a45p-1 ++0x1.e8eba118b0a26p-1 ++-0x1.ce8021cd33ff0p-20 ++0x1.f988f6376ddcep-1 ++0x1.eabac25c2fc1ep-2 ++-0x1.e132c034f9071p-1 ++0x1.bda2b45f18ea7p-2 ++-0x1.eeab70c49e827p-1 ++0x1.d85d41c05db82p-1 ++0x1.e4003425db812p-16 ++-0x1.753ca74c55212p-3 ++0x1.98ee323f505cep-1 ++0x1.e95be276dd667p-1 ++0x1.2287403404baep-1 ++0x1.0ed8c38a3bdcep-2 ++0x1.c82792be9bbadp-1 ++-0x1.38a9d3998d79ap-1 ++0x1.e805f6d3a6c5dp-1 ++-0x1.32ebc7c55a58ep-1 ++-0x1.048b622297845p-13 ++-0x1.efb5c6983ac39p-1 ++-0x1.415a16a005c76p-20 ++-0x1.eb8aa64a05087p-1 ++0x1.a18684e94695ap-14 ++0x1.de2666acb5762p-1 ++0x1.0a79566e358dcp-2 ++-0x1.f282f0325a811p-1 ++-0x1.3f08a31b67052p-6 ++0x1.3a747651ea759p-1 ++0x1.8c22845eca245p-2 ++0x1.c1aed42df3035p-3 ++-0x1.a01057abedfe5p-1 ++-0x1.eb57d2b4d4247p-1 ++0x1.27a880bdbfcbfp-1 ++0x1.d51cd22b5b6cap-1 ++0x1.c96de70665e99p-2 ++-0x1.afeb916e3177fp-21 ++0x1.8e00d6126d657p-2 ++0x1.799d63f173a45p-1 ++-0x1.cd29463be0ee8p-1 ++-0x1.4f47a58e04b54p-1 ++0x1.ea2f35262d1a7p-1 ++-0x1.279997c5505d9p-1 ++0x1.fbe731d9f7db8p-1 ++-0x1.60d116a6cc97fp-1 ++0x1.e9d9730db6039p-1 ++-0x1.78fc83b456074p-2 ++-0x1.03c0045400546p-1 ++-0x1.f29f3377fe46bp-1 ++-0x1.33d676f26127ep-3 ++-0x1.efdd474021500p-1 ++-0x1.bab9f2ecd85b4p-6 ++0x1.c628a3529714fp-3 ++0x1.e36ae1b514d1bp-1 ++-0x1.db1e13827a88ap-1 ++0x1.dbf1b775cf9d2p-1 ++0x1.57a975b3f7f83p-2 ++0x1.1deb94df7dd48p-2 ++-0x1.8f4e44c99669ap-1 ++0x1.4ed720c5a163ap-1 ++-0x1.db81e304bef8ep-2 ++0x1.de5485ca4d9dfp-1 ++0x1.db26f3b39fe6bp-1 ++0x1.6c88456adc480p-3 ++0x1.c5a8961391ccfp-1 ++-0x1.b78ea5581fef3p-24 ++-0x1.6547c3be6a0acp-3 ++0x1.e19d1283e35b5p-1 ++0x1.e80e54a58d337p-1 ++-0x1.449b6754bba00p-11 ++0x1.e41026d50deabp-1 ++-0x1.1844f685c97cap-1 ++0x1.efa0e345c59b0p-1 ++0x1.3121f641ffbd3p-10 ++0x1.edb070c60119ap-1 ++0x1.a52c94e4dfaa9p-23 ++0x1.e5fc97f64aecbp-1 ++-0x1.f652e1fdb6a40p-1 ++-0x1.fc21417ad3694p-1 ++0x1.750fa027faf9ep-1 ++-0x1.9260f684b0d63p-3 ++0x1.e896c4a4401bcp-1 ++-0x1.7e6e516a67284p-2 ++0x1.8c32f1a45f352p-3 ++0x1.366796f5b5a00p-1 ++-0x1.763cb2cf0a32dp-3 ++-0x1.ad50f432557fap-1 ++0x1.f220a525222a6p-1 ++-0x1.e2d4f63884af4p-3 ++0x1.7796f74179cbap-1 ++-0x1.cd55d3c51d8fep-1 ++-0x1.e221669031d28p-1 ++-0x1.eeffa2c5a9c49p-1 ++0x1.ecf741dda7320p-1 ++0x1.a2a1569ae5d32p-1 ++-0x1.e680d5195362ep-1 ++-0x1.f83452138ebc1p-1 ++0x1.30e2369a99e1bp-3 ++-0x1.1a18425ff66a7p-1 ++0x1.eb7451be325a0p-1 ++-0x1.cd4ba71c2a541p-1 ++-0x1.dc4f109832464p-1 ++-0x1.eb97e24e4691ap-21 ++0x1.718a40fa573d8p-3 ++0x1.df0c61f2a0f01p-1 ++-0x1.ab0051b1239f5p-1 ++0x1.070692620b71cp-1 ++-0x1.b3cea41f5ebbfp-22 ++0x1.fa09813a0f08cp-1 ++-0x1.0e9b76f265fe9p-3 ++-0x1.dceb234e0d00cp-1 ++-0x1.8836556db32e5p-11 ++0x1.47d5509f852b6p-2 ++0x1.bb4174dfebc1ep-1 ++0x1.83be00af14ad6p-10 ++-0x1.9a44d54a49874p-1 ++-0x1.903962db8447ep-1 ++-0x1.ac0763a2833a8p-1 ++-0x1.c09d42b039fa3p-1 ++0x1.e2fec0234b979p-1 ++-0x1.e3f2b40c3e54cp-2 ++0x1.dd6694410bcf0p-1 ++-0x1.032c51b1d2105p-1 ++-0x1.d80bd4a4cf64ap-1 ++0x1.f89e41aa2fad5p-1 ++-0x1.daf4c6895a475p-2 ++-0x1.0579e7d148859p-8 ++0x1.e318d24b8b39ep-1 ++-0x1.91d2b301a130ep-6 ++-0x1.d8d40797b1ffap-1 ++-0x1.3ee1c1db473d2p-2 ++-0x1.45ebc3d70bdd6p-24 ++-0x1.6a73670891036p-1 ++-0x1.dd2d72e85c929p-1 ++-0x1.c572d1625cc9ap-1 ++-0x1.9007645684de8p-1 ++-0x1.982b1646a3406p-2 ++-0x1.e8dee29e55a00p-1 ++-0x1.867e95cfae0a8p-1 ++-0x1.57b0e23b39e09p-1 ++0x1.04807172fbb6fp-1 ++-0x1.70bea3753575bp-1 ++-0x1.cc28a3c0fb5ffp-3 ++-0x1.0663157daee85p-3 ++0x1.d83d9616cffd1p-1 ++0x1.d56357592f5acp-2 ++0x1.e006175a5233bp-1 ++0x1.ded7b522b64c3p-1 ++0x1.f11a872f5d26ep-1 ++-0x1.e3a22384a6de8p-1 ++-0x1.e8316413e3ebdp-1 ++-0x1.0da5059829177p-2 ++0x1.f67aa7a0b8826p-1 ++0x1.eb8604ab96d0bp-1 ++-0x1.c1ccb6174f89dp-1 ++-0x1.834806f8654c9p-1 ++-0x1.ef7701b74636cp-1 ++-0x1.e6fc661a4e39bp-1 ++0x1.dd3682e648173p-1 ++-0x1.7e27e712723ddp-1 ++0x1.e12486db8dca7p-6 ++-0x1.a7f9c47f84b4bp-11 ++0x1.e5dd42f5422e1p-1 ++-0x1.7f1a6320cfa79p-1 ++0x1.eb14a509edab1p-1 ++-0x1.b39b65fdaaaf4p-2 ++0x1.edf1a44e79d77p-1 ++-0x1.16c4316ff435cp-12 ++-0x1.eb0e3015adc06p-1 ++0x1.cf1bc071e7b1dp-13 ++-0x1.dacfb650325cfp-1 ++-0x1.3868c3fb4119cp-3 ++-0x1.c2a3b1d7f7890p-1 ++-0x1.e64092b0d86f7p-1 ++-0x1.53ca0177e6f37p-1 ++-0x1.4ea952cfb8453p-25 ++-0x1.e84792001e697p-1 ++0x1.ef23215f6de12p-1 ++-0x1.2152c36f9028dp-1 ++0x1.9a5905b3dd7bep-1 ++0x1.db5e820db1f0dp-1 ++0x1.2dd320b0909e6p-3 ++-0x1.027577673d37dp-1 ++0x1.e4909407d6b04p-1 ++0x1.527324f607a26p-17 ++-0x1.ed9414384d45ep-1 ++-0x1.7c4f407d91487p-8 ++-0x1.eb3f971bcf807p-1 ++0x1.d0dc12f7b7649p-18 ++0x1.4dcbd35bad403p-1 ++0x1.15ad81b482de6p-1 ++0x1.e8f0874ac9593p-1 ++-0x1.cec574569cb1bp-1 ++0x1.ebb2d275b5529p-1 ++-0x1.035e76eeac96dp-21 ++0x1.eb1e73025e051p-1 ++0x1.82b481c2cab01p-1 ++0x1.f4d8e628050abp-1 ++-0x1.4bc9841532205p-1 ++-0x1.a03cd248fa8dbp-3 ++-0x1.34a3238e9e3b0p-14 ++-0x1.442444137aebep-1 ++-0x1.17d6571c1eb38p-9 ++-0x1.ed8e345382564p-1 ++-0x1.8f2122c52c06bp-1 ++-0x1.2e84858cbd9e2p-1 ++0x1.ed5ea12bfef39p-1 ++0x1.e255d16fe29c9p-1 ++-0x1.e7c0a4791e7d1p-1 ++0x1.ea9ef4d1cf987p-1 ++0x1.bf8761b110b5bp-1 ++-0x1.d8ffa13349771p-1 ++-0x1.0dd222acc160ap-1 ++0x1.828184fbbeaa0p-2 ++-0x1.ff5bd6a9242abp-1 ++0x1.d91a30bb3e15dp-1 ++0x1.c38e7517dd45fp-12 ++-0x1.0caa231ede96dp-3 ++0x1.bf75f1da5b9f4p-3 ++0x1.07c4f43f44017p-1 ++0x1.d97165152ffeep-1 ++0x1.f565d33b8ac0fp-1 ++-0x1.9e2736ae6b655p-13 ++-0x1.12528787f6e56p-1 ++0x1.1b0912987dcf2p-3 ++-0x1.59f3c5b673712p-1 ++-0x1.bde56690f6eccp-1 ++0x1.d28502cfb2092p-5 ++0x1.ddc5738e8f925p-1 ++-0x1.7b2d0222d18edp-1 ++0x1.495424a43a336p-1 ++-0x1.bbee92a22bc1dp-1 ++-0x1.e8092359ccf4ap-1 ++0x1.d986b716394bap-1 ++-0x1.348db24936e14p-1 ++-0x1.2c3e37771fce2p-1 ++0x1.813c34a44eb1ap-14 ++-0x1.dfcb1799d0b1ep-1 ++-0x1.148f93639ab8ap-1 ++0x1.e9d8e507b6b7dp-1 ++0x1.adc4400d2246cp-22 ++-0x1.f9941587a0f90p-1 ++-0x1.0763c2612613cp-8 ++-0x1.ec59c307396f8p-1 ++0x1.f8e25686998acp-1 ++-0x1.d1b2d7ceae413p-1 ++-0x1.15af64d6bc1c9p-17 ++-0x1.4f4065a22973ap-23 ++-0x1.eb6ea004c88a2p-1 ++-0x1.b2daa6e18bec1p-1 ++-0x1.f95c5323bece4p-2 ++0x1.e1d682232cc70p-1 ++0x1.ecec70e666347p-1 ++-0x1.d0e1b0d47cce6p-1 ++-0x1.ef7c05da00ccbp-1 ++0x1.8f83f2b021978p-1 ++-0x1.18204301e710fp-3 ++0x1.eac881dd6e573p-1 ++0x1.46f83671cca25p-1 ++0x1.e30cf7c07f903p-1 ++-0x1.eba9678c3f1c2p-1 ++0x1.e64eb73adb2c1p-1 ++0x1.bd81501f6c6dbp-1 ++0x1.6c6bd2dd525cdp-1 ++0x1.205b7320c006cp-4 ++0x1.ff04d61b0df50p-1 ++-0x1.eeff51ab9dd14p-1 ++-0x1.948a52ed5c31bp-5 ++-0x1.e1c5c6487033bp-1 ++-0x1.e217c080561c1p-1 ++-0x1.3248c214e0d26p-3 ++0x1.ed0872a63647dp-1 ++0x1.e851875a532ddp-1 ++0x1.e7ab52befacc0p-1 ++-0x1.259fe08399b90p-3 ++-0x1.ededb18a270f5p-1 ++0x1.70704180d156ap-1 ++0x1.9f8db14d87da8p-1 ++0x1.e86395d65171ap-1 ++-0x1.b845d7262e0bap-3 ++0x1.4183f2511d03ep-1 ++0x1.61a7f6c5ef7d1p-22 ++-0x1.0bf534b51583ap-2 ++-0x1.ebfb153952f46p-1 ++-0x1.f432a5c40b5aep-1 ++0x1.de1315467998fp-1 ++0x1.043b03cb8172fp-3 ++0x1.ef435338a09fbp-1 ++-0x1.e3682482abf80p-2 ++0x1.8cb1a630bb9c2p-1 ++0x1.2118379e034c2p-19 ++0x1.f7d1a7b4d3511p-2 ++-0x1.befed649c5772p-1 ++-0x1.ea5613210aa70p-1 ++-0x1.5b9f05ea1adb3p-3 ++0x1.da3dc7fb7e865p-1 ++-0x1.56f2e58d53fc9p-1 ++-0x1.a4c0d4697fa72p-1 ++-0x1.4fe86735879b5p-25 ++-0x1.dbe9a120dc24dp-1 ++0x1.7e1f516ae8558p-1 ++-0x1.0ccec227b1aa8p-1 ++0x1.5a21f14dfa7b0p-1 ++-0x1.98c8e5b444e4dp-1 ++-0x1.a390457106bfbp-1 ++0x1.7834478f6c2ccp-1 ++-0x1.d355d23d9f129p-1 ++-0x1.dfbdc0246898dp-1 ++0x1.0de5e5de3ee03p-23 ++-0x1.48701720e6bd6p-3 ++0x1.da1b02240fa23p-1 ++-0x1.ff76554d1cd62p-1 ++0x1.5cf30257670ddp-1 ++0x1.f37672c4384dap-1 ++-0x1.20811778def78p-14 ++-0x1.ea363656402fcp-1 ++0x1.ef8c5245acfe3p-1 ++-0x1.d9bcb4e8d3e79p-1 ++-0x1.1372f51c095bep-1 ++-0x1.e6d7e64d3a2a2p-1 ++0x1.8d887665a4aa4p-12 ++-0x1.543b1625c6f47p-3 ++0x1.e2cfd418793d3p-1 ++0x1.e2365579a754ep-1 ++-0x1.806dd0823096dp-1 ++0x1.057365e07e692p-2 ++0x1.e13e27d7f0352p-1 ++-0x1.e170f02eef343p-1 ++-0x1.8a8b96c57e126p-1 ++0x1.300c178b2707bp-2 ++0x1.84277430fd97ep-2 ++0x1.ebace7e63c155p-1 ++0x1.7e2db343d2518p-6 ++-0x1.f53d46b53474cp-1 ++0x1.c0e313323e560p-14 ++-0x1.445786093a311p-1 ++-0x1.a073961b21017p-3 ++0x1.eb2c92dd8595ap-1 ++-0x1.dfd9b023c2058p-1 ++-0x1.9cc0608e5c256p-3 ++-0x1.1e8a967a738a4p-1 ++0x1.df31c544e9d67p-1 ++0x1.d2fad1936930ep-1 ++0x1.d8d4c3d683cd2p-1 ++0x1.e8712202731adp-1 ++-0x1.ea4834441eb39p-1 ++0x1.eda472e60d745p-1 ++0x1.e25ac2048fb9ap-1 ++0x1.4a70d01fd57a4p-1 ++-0x1.1c3704a91d838p-1 ++-0x1.df8e14d8335ccp-1 ++-0x1.e95d04451bcd5p-1 ++-0x1.ea74f086de3c2p-1 ++0x1.dda9e26e84162p-1 ++0x1.74f4f4a9a7630p-1 ++-0x1.bb4fb52218d17p-1 ++0x1.4f6f80226f31ap-1 ++-0x1.684814485308cp-3 ++0x1.7fc4e1d16dcf5p-1 ++-0x1.fe6bd006411a7p-1 ++-0x1.e0f5e654664e4p-1 ++0x1.4dd366975a5b3p-2 ++0x1.d94e10f7f2ec8p-1 ++0x1.d8c8d21926f4cp-1 ++0x1.571e352fdd0f0p-2 ++0x1.ea0f558903c1ap-1 ++0x1.f6c9d5f09ac9ep-2 ++0x1.a3c463d5b6e67p-1 ++0x1.48352432fcd1ep-5 ++0x1.bda1811e8c6b1p-14 ++-0x1.ee04d3c3f2263p-1 ++0x1.e58f617f2d384p-1 ++0x1.8e41e2bcbf28ep-3 ++0x1.191df1d6a15d8p-1 ++0x1.b0c6938c36b0ap-1 ++-0x1.d944534af1d02p-1 ++0x1.31642078c9c6dp-2 ++-0x1.841801a2f578cp-1 ++0x1.ebbb1323e8b84p-1 ++0x1.e12481b18bc72p-1 ++0x1.fa64112d9b7bdp-1 ++0x1.682c32ff96a0fp-1 ++0x1.31dd87a025af2p-1 ++0x1.df5f54d95cc0dp-1 ++0x1.4b9ce3268e639p-2 ++0x1.c206d0139362fp-1 ++0x1.e3a8a24e59ea9p-13 ++0x1.dfd890e7db3d1p-9 ++-0x1.bb5997a01dc09p-1 ++-0x1.9da2876b31f04p-1 ++-0x1.205fe30c96672p-1 ++0x1.fa4b1032a01ecp-1 ++0x1.e2db71253b231p-1 ++-0x1.5cd7b6880daedp-3 ++-0x1.dd712109d9432p-1 ++-0x1.f4c2f4098a73bp-3 ++-0x1.df4df687c5149p-1 ++0x1.a7184731a11b4p-1 ++-0x1.b717a69cb0326p-1 ++0x1.eedaa2dbb184cp-1 ++-0x1.fb6f90001c47fp-1 ++-0x1.4141539f32f56p-1 ++-0x1.9da4077805769p-1 ++-0x1.ab8c92a8ec751p-1 ++-0x1.fb9d60929751ep-1 ++-0x1.e1f9e6fd5632ap-1 ++-0x1.ef20c3a53e72fp-1 ++0x1.3a55c400f2026p-1 ++0x1.bc55404efb12dp-19 ++0x1.82c2a5d140048p-2 ++0x1.f613e22df463bp-1 ++0x1.2c6291d7f2ad7p-2 ++0x1.2319304ed36b5p-1 ++0x1.ef526669efbebp-1 ++-0x1.b3dec74769b6fp-1 ++-0x1.7fa021510350ep-1 ++-0x1.c22a90b77021ap-24 ++-0x1.e89606e911505p-1 ++-0x1.ee05e10877512p-1 ++-0x1.a748b03895981p-1 ++0x1.db4745b9604cdp-1 ++0x1.0eab126351bb9p-3 ++0x1.2b74811bfc23dp-2 ++-0x1.425187f18c762p-18 ++0x1.afbbc6e1f9f84p-1 ++-0x1.e8ac5756ef915p-1 ++-0x1.0f9400d75348bp-16 ++0x1.916dc64eee2aap-1 ++# asin multiple precision fallback path ++# Implemented in __sin32 in sysdeps/ieee754/dbl-64/sincos32.c ++## name: slow ++0x1.c88b2415431cbp-23 ++0x1.84a360ccf288dp-20 ++0x1.7eff5496b7ed2p-21 ++0x1.4360a7a7b5c14p-23 ++0x1.71374498ed714p-26 +diff -urN glibc-2.17-c758a686/benchtests/atanh-inputs glibc-2.17-c758a686/benchtests/atanh-inputs +--- glibc-2.17-c758a686/benchtests/atanh-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/atanh-inputs 2015-06-20 21:22:16.296458135 -0400 +@@ -0,0 +1,203 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.5a2730bacd94ap-1 ++-0x1.b57eb40fc048ep-21 ++-0x1.c0b185fb450e2p-17 ++-0x1.bd6e1642bb727p-1 ++-0x1.4cfdd35756bc5p-10 ++0x1.aadb5767b3ae4p-1 ++0x1.827ab42a1416dp-1 ++0x1.6d4e56dd0ff53p-14 ++0x1.667d8313f78d2p-1 ++0x1.672230c640ef3p-1 ++-0x1.35ec261f6be52p-19 ++0x1.9cf3279d8ff3ep-21 ++-0x1.a60896128036fp-1 ++0x1.ad5067d5aa573p-1 ++-0x1.8a4421ee0d23ap-1 ++0x1.aba153a252f9bp-14 ++-0x1.2498611880effp-1 ++-0x1.aa2c423f024dep-26 ++-0x1.43d972a3632b8p-1 ++0x1.12d690cf283ebp-25 ++-0x1.eec6a3a873b98p-1 ++-0x1.987b43a58457ap-21 ++0x1.96a646ec9ba90p-11 ++0x1.b961f358d8f43p-3 ++-0x1.51d594fababdep-1 ++-0x1.72a777e07e732p-8 ++-0x1.21fcd11e4d773p-1 ++-0x1.094ea21018a32p-1 ++-0x1.79ea722d33e33p-9 ++0x1.c63fc48261538p-5 ++0x1.b1c0b7e618a20p-3 ++-0x1.9957f1ba37225p-19 ++-0x1.ecc6037c6538ap-21 ++0x1.7e0bc46e556bcp-1 ++0x1.4e7cd59b97811p-22 ++-0x1.6b2773f7bf9c1p-27 ++0x1.db9e07d2c1d81p-1 ++0x1.293835cf8c06bp-1 ++0x1.f59e8473488f7p-1 ++0x1.094c253414b65p-22 ++-0x1.922cb3b58f124p-3 ++0x1.8a9b4773d8067p-1 ++0x1.59e1848e51b3fp-1 ++-0x1.77eb61d6b55b3p-1 ++0x1.63e245bf37393p-1 ++-0x1.8adb670e973d8p-1 ++-0x1.c34f8232a8efap-1 ++0x1.83f2e5bd4e680p-25 ++-0x1.6b8d336fb28b2p-1 ++-0x1.f50ce1076f808p-23 ++0x1.ceb5a49139809p-19 ++-0x1.3d0616e8d067dp-11 ++-0x1.5ff057a79950ap-1 ++0x1.263f96335fa00p-25 ++0x1.5d5fa0d6d5003p-9 ++-0x1.5070a3937a84bp-7 ++-0x1.299707cfa0a5ap-5 ++-0x1.64f623f5a4713p-3 ++0x1.2bc994ee38c37p-3 ++-0x1.e27d9435b978ap-1 ++0x1.8092d58d5c790p-21 ++-0x1.9c31372efb7c2p-25 ++-0x1.b3e4409bf591ap-11 ++-0x1.fc9e4603f0a42p-16 ++0x1.7d4f167842e1ep-1 ++0x1.d220d2dea0517p-25 ++-0x1.f327d6a043438p-9 ++0x1.0fbf54939b136p-16 ++-0x1.9d4c17b3aa3e3p-18 ++-0x1.6ab736c8be0aep-5 ++0x1.ecff81aec235cp-1 ++-0x1.102122d6bf984p-1 ++-0x1.44a7f0d39a7cbp-18 ++0x1.369d17b6b92d9p-1 ++0x1.2c1ec48113977p-1 ++0x1.b2a4a2cd6ddbfp-1 ++0x1.1aa8449c2cce7p-18 ++-0x1.2083e1015b457p-1 ++-0x1.1589761b30c7bp-1 ++0x1.e3c782bba8f90p-1 ++-0x1.e08b0317d404dp-1 ++0x1.290f1622d1939p-8 ++0x1.7edf2261fcf95p-1 ++-0x1.521241688012fp-2 ++-0x1.0307d4e8caa52p-18 ++-0x1.ccb366715602cp-1 ++-0x1.95aa45bfdf88bp-1 ++0x1.83b6d2241735cp-13 ++0x1.4977776659f91p-21 ++0x1.265e670e3a504p-1 ++0x1.857de2b5f1f7cp-1 ++-0x1.6e69d509bec68p-24 ++0x1.d4f0109417b1ap-1 ++0x1.9ab2842033f1fp-15 ++-0x1.17d9b0f3c22a2p-1 ++0x1.75a321c41a6b0p-1 ++0x1.53a5d3faa91ffp-1 ++-0x1.618c00bcdbb72p-1 ++0x1.e99bd19956904p-1 ++-0x1.89c34195ab10dp-21 ++-0x1.82b1234ed4accp-21 ++0x1.6b0486d8d09fbp-1 ++-0x1.4259822aefa37p-1 ++-0x1.ecfff733e7bb3p-2 ++-0x1.90eac37875516p-1 ++-0x1.ba38b666e3abap-6 ++0x1.1ebbb6284200ap-22 ++0x1.6c2ee1790a8b6p-1 ++-0x1.0c2d8105dd990p-1 ++-0x1.6d7264d3662ffp-1 ++-0x1.43fe90e13fc36p-4 ++0x1.46eb6152db91dp-10 ++0x1.e4e26333b349ep-4 ++-0x1.96ef543f5383cp-1 ++0x1.47dca56a5b223p-1 ++0x1.08ea668aed516p-4 ++0x1.ef8f3428ca661p-6 ++0x1.5b2b8480c515fp-10 ++-0x1.2762d191e5fa5p-1 ++0x1.508d56e0f5ca9p-1 ++-0x1.2f616558f0888p-24 ++0x1.0260d42d27c09p-11 ++-0x1.0988f69b99e16p-1 ++-0x1.d35697fcfb7b6p-14 ++0x1.ffaf01135dec7p-1 ++0x1.0afa01afd6afep-1 ++0x1.c7cbb635b5af3p-6 ++-0x1.23eb629a0abe4p-1 ++-0x1.b87e61aeac49bp-1 ++0x1.1646f4a28d191p-18 ++0x1.4cd3a045b9783p-1 ++-0x1.5c7a8599ffe9ap-14 ++-0x1.9457a34399b4ap-1 ++0x1.a154f6f6548e8p-1 ++0x1.ba8ad1105bb80p-6 ++0x1.af9176505fbeep-1 ++-0x1.430563677bff8p-8 ++0x1.a2a2d2a0778c3p-1 ++0x1.df4c731f44b97p-1 ++-0x1.d049e60c0ecd3p-23 ++-0x1.325e341d79998p-1 ++0x1.3da4954669e1fp-27 ++-0x1.88d501c9b4a1bp-8 ++0x1.f41c064c0c9bdp-1 ++-0x1.2e7715356184dp-16 ++-0x1.ab8a55eb84adfp-1 ++-0x1.b5e7918f752d5p-1 ++-0x1.c958c1faf2e05p-12 ++-0x1.0a0b95fda6377p-1 ++0x1.b05f4635c8e79p-1 ++0x1.a216642c8c3c6p-8 ++0x1.3049c686e99b7p-27 ++0x1.e5ea44ec320c1p-1 ++-0x1.884175facb7a0p-5 ++0x1.45aa62e647503p-13 ++-0x1.634bc7ff5c615p-1 ++0x1.b68125750b075p-9 ++-0x1.97abf0534746cp-15 ++0x1.f687e58a3b36ap-5 ++-0x1.1040e1ed1d1e7p-25 ++-0x1.6ba8e7fc4221fp-10 ++0x1.16e38001e0edbp-1 ++0x1.df2ad20740b3dp-26 ++-0x1.8e1172ae8c333p-1 ++-0x1.b22640bb7e540p-19 ++-0x1.fa5552ca0ed82p-13 ++-0x1.e8ad873f75a2dp-1 ++0x1.c91491a1a5938p-26 ++-0x1.4ec4473b27d56p-1 ++0x1.5f1862dba68cbp-1 ++-0x1.dce0e6290bc85p-1 ++0x1.fa68d22f5773bp-1 ++-0x1.919486a495542p-1 ++0x1.d303d564c000fp-1 ++-0x1.afff55716fe0bp-23 ++0x1.28b7d3631da7ap-16 ++0x1.9ca493208bbdep-1 ++-0x1.542a05a6b369fp-1 ++-0x1.f7e79460fc57ep-7 ++0x1.bb029019558b5p-15 ++0x1.bba002729f3d6p-1 ++0x1.1ada3533fa957p-1 ++-0x1.896d956b5743fp-21 ++-0x1.3a30147e08f69p-1 ++0x1.25644490a1259p-14 ++-0x1.4ef3744b5e468p-4 ++0x1.04dac7a84b2d7p-1 ++0x1.d46464683c4f8p-1 ++0x1.9c4674b85fc58p-9 ++-0x1.da6bd2cb0a530p-1 ++-0x1.eb2076f05f6f8p-1 ++0x1.4aeba21a72c73p-11 ++0x1.af7910337420fp-6 ++0x1.04ad609a3e62bp-1 ++0x1.eafe16a4433afp-1 ++0x1.1c65e51ff0cacp-1 ++-0x1.4eb61140c3e34p-1 ++-0x1.693d851f3cfeep-10 ++0x1.254d73366914dp-2 ++-0x1.ff34f15f5e3e6p-3 +diff -urN glibc-2.17-c758a686/benchtests/atan-inputs glibc-2.17-c758a686/benchtests/atan-inputs +--- glibc-2.17-c758a686/benchtests/atan-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/atan-inputs 2015-06-20 21:22:16.296458135 -0400 +@@ -0,0 +1,809 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.642175414a222p-3 ++0x1.32f96343ff094p47 ++0x1.63961340f55e3p-4 ++-0x1.404c80c42d2d7p3 ++0x1.ff0297a7f4cf9p-4 ++-0x1.3514d0a630343p2 ++-0x1.9cd792d24de9cp-13 ++0x1.48de0536fa639p-26 ++0x1.df679233e616cp3 ++-0x1.3672036e3b5dbp46 ++-0x1.a6af31fe26a67p1 ++-0x1.601447d82000cp-23 ++0x1.6978a3d8cdd0cp34 ++-0x1.bcf7074f6ad00p-20 ++0x1.4560113d34322p1 ++-0x1.88e3f71039a4bp-4 ++0x1.016652052d70ep6 ++0x1.4eeee5387c40fp-11 ++0x1.1a93e2edc9a70p-1 ++0x1.2a86a6b000b1bp19 ++0x1.b550a52791570p19 ++0x1.4f55e0fd66533p6 ++0x1.179893d68a175p0 ++0x1.c587a48440d49p18 ++0x1.c4d736b34755ep41 ++-0x1.0b00d1e309baap15 ++0x1.d3ddd7a4105b8p-17 ++0x1.907795ee90c71p1 ++0x1.1c0ee51bf3fbbp-26 ++0x1.6e21857f657b5p-3 ++0x1.522870681be34p0 ++-0x1.47fc357b48019p2 ++-0x1.fc80d2478d003p44 ++0x1.6b6af109c6d11p-2 ++-0x1.557b744e3f2b2p-2 ++-0x1.c0bd72f9dcc6fp-3 ++-0x1.5dad543b37a02p2 ++-0x1.d95b35b36eadep38 ++0x1.645042fa42207p-2 ++-0x1.139444200b144p1 ++-0x1.28a691f56455fp-24 ++0x1.d97ff36594800p-2 ++-0x1.c46e817205691p-1 ++0x1.189121c162006p-21 ++0x1.b22526da1b4b3p-25 ++0x1.89097738a1f84p23 ++-0x1.3de8b3a71241ep-4 ++0x1.d539d73aa3a6bp4 ++0x1.9f3aa3d8be109p-8 ++-0x1.28df31604ae5fp-2 ++-0x1.a5ba03c7f21c6p39 ++-0x1.0aa65539c9639p44 ++-0x1.596756edc8d29p-1 ++0x1.bf89523d6d9a8p18 ++0x1.245712c9030a1p-9 ++-0x1.e70de078fe520p-3 ++0x1.0a6a653edc9c8p-1 ++0x1.cc69116b071cdp-2 ++0x1.2f24c0cf8fcb2p-16 ++0x1.ed2ac30efc4e7p41 ++-0x1.db4970624d850p-4 ++-0x1.bb1260bff835cp-4 ++0x1.d685f1157cf4ap-4 ++-0x1.27241256d29b8p1 ++0x1.ec5380eff6d2ap-3 ++-0x1.fd7d8132290bep-1 ++0x1.228426a24d54dp-17 ++0x1.2ea847880a2cdp39 ++-0x1.89a5c5d485ab4p3 ++-0x1.fbd930c90d22cp3 ++-0x1.86674787bedeap3 ++0x1.ab27809f97987p1 ++0x1.c17c653258848p2 ++0x1.a3f615b4aa2afp-4 ++-0x1.e8bff4a769203p46 ++0x1.2fbb90ef75a25p-4 ++0x1.d9d246c3e5da7p10 ++0x1.1adf65737ce63p2 ++-0x1.4bbf56383d2c4p-20 ++0x1.1bc9009943672p2 ++-0x1.84cd8442450bcp24 ++-0x1.05cbc2307bc60p0 ++0x1.b18fc1de83969p-2 ++-0x1.a63bf1a32c82cp-26 ++0x1.08e7e57369c93p4 ++0x1.97e8f20d0a9f8p33 ++0x1.1358340c23f9dp-13 ++-0x1.f3a987156a953p-15 ++0x1.cc4fe36fcebc5p-3 ++0x1.d858d5bee5222p-2 ++0x1.8911076ba1dfep-5 ++0x1.5ab4754566467p1 ++0x1.854547561eabbp1 ++-0x1.830ce306fc8c4p-13 ++0x1.b181a4ed4c25ep-19 ++0x1.f77112499c880p30 ++-0x1.5124040e757ddp43 ++0x1.751c061e72f3dp-1 ++0x1.b88d87c4c86b2p-8 ++0x1.52c5b76c6ef89p-10 ++0x1.e89130ee99ce5p-4 ++0x1.2a2ed7a0b1956p-1 ++-0x1.47b533d254eb8p3 ++0x1.b4d0b69a8f4a8p-24 ++0x1.8316a4af1bf68p-18 ++-0x1.9e1ef1ccdd020p15 ++-0x1.88bde5f29b2d9p3 ++-0x1.365034bff4761p0 ++0x1.7e40940c2d5adp-17 ++-0x1.2c37625bfd76dp-18 ++0x1.707642d37610fp0 ++-0x1.afd1d0135cf31p3 ++-0x1.4b0d1755bbf42p-11 ++0x1.c4ed75b07c727p0 ++-0x1.5e2db71616c7ap1 ++0x1.050223b1cd624p3 ++-0x1.3b3db4aa80820p-10 ++0x1.5ccb8047d5d1ap12 ++0x1.175282b52f29cp0 ++0x1.aabc424c47eafp9 ++-0x1.1a90445a04e18p0 ++0x1.3da941dc72acdp2 ++0x1.501726cf3e259p-12 ++-0x1.1b3006e74e325p4 ++-0x1.ad42977bf9a2bp-1 ++0x1.73d0e25d9335ap-3 ++0x1.0a514560b1915p-4 ++0x1.9b955619c595bp-3 ++0x1.c1bde2d25803bp-2 ++-0x1.c9c450db85015p-24 ++-0x1.b93f27a390fc9p-3 ++0x1.394074cfa62d3p1 ++0x1.815072f52a2e6p0 ++0x1.1e52d6ee6069fp-1 ++0x1.1f90737198ea5p-19 ++0x1.13341218923f7p-23 ++0x1.348b0774c87ffp2 ++0x1.d2580731da42cp2 ++0x1.87b5a06e57762p-5 ++0x1.b40fd58aea62ap0 ++0x1.9cd365175d628p28 ++-0x1.4094703aac68bp-24 ++0x1.56af03795574fp21 ++-0x1.e189800006571p-26 ++-0x1.9dfb51f7b789cp47 ++0x1.9bc2e73963ca7p11 ++0x1.b5a1c0632322cp0 ++0x1.205e5539779c2p51 ++-0x1.6c47a5b0217f6p2 ++0x1.791cd37782384p-2 ++0x1.231d31372c140p1 ++0x1.91e2d31efbcaap-3 ++0x1.34fa969626571p30 ++-0x1.6bc04360963b5p-11 ++0x1.8add0065da1d5p-4 ++-0x1.d346e1877a7fdp-2 ++-0x1.725697ff5c03dp1 ++0x1.a8e2a686fd172p-1 ++-0x1.8bd725c48f410p3 ++-0x1.3b0537b22c0bbp-1 ++-0x1.2c0db2781aad0p28 ++0x1.4c6a110727b7fp-16 ++0x1.b8d171996cbe1p0 ++0x1.e6c6d70c497a0p19 ++-0x1.15a9f10771286p2 ++-0x1.c30f24893d7a3p-3 ++-0x1.d73aa26a08a23p38 ++-0x1.58b7549a93d13p-4 ++0x1.169012651035fp1 ++0x1.197ee4c04ae17p25 ++0x1.3fba00276eae3p1 ++0x1.941d03c4bf6a6p-4 ++0x1.7f21c64e2abb7p-2 ++0x1.7581d56332d79p0 ++0x1.971980a7e2435p27 ++-0x1.e44690996dde4p-8 ++-0x1.3133113da7775p-20 ++0x1.31d201884c815p30 ++0x1.1f46672b184b2p-20 ++-0x1.bbbc31b0259d6p7 ++-0x1.ff6f625bf7eadp-1 ++-0x1.3dd6a5e841573p-1 ++-0x1.294b2242985c5p-5 ++0x1.80c6d17d3b82ep41 ++0x1.66a703915eafdp-4 ++0x1.c16431985801dp28 ++-0x1.66cc363cc169cp-13 ++-0x1.445ac6d7de615p29 ++-0x1.78d803eac6a4fp-17 ++0x1.7d17f2f5981bdp-4 ++-0x1.be3452bcdc974p28 ++0x1.83dff4dfc4757p42 ++0x1.451781735f844p14 ++-0x1.4dab41db1c970p3 ++0x1.3373037f37040p2 ++0x1.20f7623057a1cp-4 ++0x1.b74c37f7006cfp36 ++0x1.6d17f13894ea6p-8 ++-0x1.9084f58ffff58p1 ++-0x1.c57ef7f9833e1p-3 ++-0x1.943ce31bfd282p-26 ++-0x1.75a42576fe1cdp1 ++0x1.ff0257a993250p2 ++-0x1.63ef308e427d4p0 ++0x1.de26003f5ba7ep16 ++0x1.15333549fa76fp29 ++0x1.66bfb50c269e7p0 ++0x1.a49604cc4d7f9p-4 ++-0x1.15003315471d9p-4 ++-0x1.38bed20a51ff5p-9 ++0x1.7d97f5b7805ddp-19 ++-0x1.7a3244a0e1b3ep-2 ++0x1.ed0681d4ee226p50 ++-0x1.15a691a22afc6p-4 ++-0x1.d2c15149a171cp48 ++-0x1.d395408686509p1 ++0x1.d121d5a063487p-27 ++-0x1.159dc08e6bae4p-18 ++0x1.835914ed4ac69p46 ++-0x1.f45bc1593e631p-2 ++-0x1.abaf42742e1aep0 ++0x1.f67cc57a82279p22 ++-0x1.3cdc56ba8ad80p0 ++-0x1.5a8f042e5c06dp-4 ++0x1.306774727b9c8p-5 ++-0x1.0f21118d78a86p1 ++-0x1.abbcc62ae1185p-17 ++-0x1.ff75940794858p3 ++-0x1.6048b6174f2dap-3 ++-0x1.84f4968e9a1a0p3 ++-0x1.ecc9025c45c61p-9 ++0x1.d9cd03dc0d910p-18 ++0x1.cd846319c00c5p-3 ++0x1.6366066bd94a6p3 ++-0x1.8ebc74865b7b3p1 ++-0x1.b87c63e47576cp-3 ++0x1.c45cb0d4685f5p-3 ++-0x1.e702b4a6029fcp35 ++0x1.fc6300b9b675ap3 ++-0x1.3f43a795e244ep0 ++-0x1.f1cd009ef1604p3 ++-0x1.d2fbd2cc79418p11 ++0x1.907fd4f15d9d3p-10 ++0x1.a371220d3cd1ep43 ++0x1.df8544d34e26dp26 ++0x1.acb3279e8da17p-18 ++0x1.b1ea21e59afd9p-4 ++-0x1.e0dff1828b454p-4 ++0x1.ef38b267b4663p39 ++-0x1.baba241cd2232p-13 ++0x1.4fe7c7cd05a69p46 ++-0x1.988073a34d2c8p29 ++0x1.7599e0ac9a522p-8 ++0x1.251b26c85badap52 ++-0x1.a27c560a7da35p0 ++-0x1.f091c7c2304a2p17 ++-0x1.d0e1114b97abfp-13 ++0x1.33ee35cf8c72ap1 ++-0x1.e714e1fed73c4p-2 ++0x1.1292e4e843885p-3 ++-0x1.03fcc540c9867p22 ++0x1.a53c8268c5213p-2 ++-0x1.f16e3196353c0p-20 ++0x1.e88a97bf39b0cp14 ++0x1.4f00111aae17fp13 ++-0x1.388bf2c171982p-1 ++0x1.0f70b2319de14p-3 ++0x1.e95a75a9609e3p-1 ++-0x1.1047552b4d153p2 ++0x1.091e73082965cp0 ++0x1.2560a7de1090ep-26 ++0x1.b7fde3097d182p-20 ++0x1.c7f115eabfdedp-4 ++-0x1.e99523e282a43p40 ++-0x1.960706b024814p-3 ++0x1.6ca4d098808a9p41 ++-0x1.782a50dd85179p50 ++-0x1.26e3c42a5f2d2p1 ++0x1.ca282036f2b8cp-10 ++0x1.87d031409e3e4p-17 ++0x1.a80f97461a0f4p-3 ++0x1.66ed5379b1601p45 ++-0x1.081bb51f6296ep21 ++-0x1.a51801c3b0ab4p-3 ++-0x1.f9af91b1e0eacp-4 ++0x1.f59650108c48fp1 ++0x1.085c309bbe310p0 ++-0x1.b9fea5e346036p1 ++-0x1.453542b905ad4p24 ++-0x1.e66c14b55c117p1 ++-0x1.90a6830407ac7p40 ++0x1.9bc93234caf93p26 ++0x1.4b94104f5f41ap-3 ++-0x1.c7b564e75a382p50 ++-0x1.c2b250afb59e8p13 ++-0x1.bfb283faeefbfp2 ++-0x1.173235dbdbca5p-10 ++-0x1.ac62c7b5e878bp-4 ++-0x1.c2a9461c28ecdp-17 ++0x1.1e1bf4bfee9b2p1 ++-0x1.c6a1a78876ab6p0 ++-0x1.e6fb5111565c8p3 ++-0x1.8932b58866bcfp-19 ++0x1.6407a070f3a3fp12 ++0x1.87a1b1adaed03p-4 ++0x1.e5ebf4ac465b1p-4 ++-0x1.f8d5e0b5c2957p20 ++0x1.42836589a8c0dp31 ++-0x1.d1ad755010ed1p-4 ++0x1.3d1f16896735ep-1 ++0x1.fdaba0fd40c7cp31 ++0x1.3311135efe06dp-3 ++0x1.b5dc02c3070d2p-2 ++-0x1.04d741eec5058p-23 ++0x1.a80bc579c9a9bp3 ++0x1.4766230792559p1 ++-0x1.a5cbe4d7cc609p-3 ++-0x1.ba1d23d80c32fp-11 ++-0x1.daaf8434d9034p-13 ++-0x1.c65d358dac3fep-11 ++-0x1.3f4da10042b42p2 ++0x1.262fa4579b063p-7 ++0x1.914e60ffdbed8p-4 ++-0x1.efac261144868p-9 ++0x1.ce397251fa408p-4 ++0x1.be05d28ca250ap-11 ++-0x1.7479b7fa984ddp-3 ++-0x1.ac20c42062d2fp2 ++0x1.9a487118946dap-4 ++0x1.2a124744f9fa4p47 ++0x1.b1981261f9020p-1 ++0x1.fbf7179ce5846p-2 ++0x1.22fbd75358604p-23 ++0x1.b1b2a4bcce5acp34 ++0x1.84e62689c678dp-19 ++-0x1.0b3bf5d136f5fp-25 ++0x1.f93ce18d93227p-15 ++0x1.bbd3b6a42bc58p-22 ++-0x1.47b315f8194ebp27 ++-0x1.827896462fb0cp-18 ++0x1.2947c23116c19p-2 ++0x1.3466e4652adedp1 ++-0x1.23c2a01c6daddp-11 ++-0x1.5831b4a29e94ep-2 ++0x1.4a7fb41fb32ccp-24 ++0x1.77544628d33f4p2 ++0x1.40a5220c05f84p43 ++-0x1.859503fac777cp-1 ++0x1.629111fdc02f9p49 ++0x1.f72960081155dp-24 ++0x1.100cb00f41850p0 ++-0x1.1280f391f830bp8 ++-0x1.2e93552200855p1 ++-0x1.4621063cd9ecdp-12 ++0x1.1c4111533addep-25 ++-0x1.569560309d6bbp-22 ++-0x1.7a8124168d622p3 ++0x1.17fba47954943p-4 ++0x1.0672546df1e40p-4 ++0x1.3157a7fbb3b2ap2 ++0x1.a82f370a40ce4p2 ++-0x1.a8fac6ce90f3cp1 ++0x1.0f28d09b57a07p0 ++0x1.da30a55a75636p2 ++-0x1.4a8a0783b2ccdp-3 ++-0x1.79e674173ab88p-1 ++0x1.c89b61641fceep31 ++-0x1.0f8107e6388fbp3 ++-0x1.f720f120f5f1fp-22 ++0x1.144b44598ac02p-4 ++-0x1.ceb152c076922p-3 ++-0x1.4b12e43d683a4p0 ++0x1.c0ae8156c4455p-3 ++0x1.85c10724ee68cp-3 ++0x1.3c4635592b9ffp-3 ++-0x1.d59892bee5390p-4 ++-0x1.cd1280ceab8c4p-3 ++0x1.b622b71aa922bp8 ++-0x1.2795c18e21649p-15 ++-0x1.639d32c619c4bp-19 ++-0x1.e8f917ef054dfp-8 ++0x1.c9eca4e44a7b1p1 ++0x1.be86276e10fa9p3 ++0x1.750cd40dd63b8p-24 ++-0x1.033ab125bb64ep-18 ++-0x1.9679b2912fcecp-4 ++0x1.f7b3a1afd048dp-23 ++-0x1.9f2863bcb1fd6p1 ++0x1.c7fed1051dcb2p4 ++0x1.c23ec470a9239p-7 ++-0x1.1e5006f62ba49p1 ++-0x1.0d9f216fea290p3 ++0x1.bd8340ad169bap46 ++0x1.dac8831aa29d9p3 ++0x1.7c191598763c2p1 ++-0x1.121aa313ac95bp33 ++-0x1.b0996534e93cep-2 ++-0x1.6c8353699c9c6p-1 ++-0x1.5df8208f06792p3 ++-0x1.4657113ffa73fp28 ++0x1.48a901159abe7p0 ++0x1.70e4b3448f927p50 ++-0x1.e120d621edccap-4 ++-0x1.4f2900d44caa5p1 ++-0x1.848165627b209p-5 ++-0x1.4cd082b565a11p-16 ++-0x1.d9d2d7967af18p-1 ++-0x1.222be1230bd8dp0 ++-0x1.361e6586e20d9p16 ++-0x1.3ddd364c29946p-19 ++0x1.3ee601f53dafap-18 ++0x1.e37ab68eb3013p45 ++-0x1.0b8a978bd97b9p2 ++-0x1.9589707e8a6ddp-20 ++0x1.b7ca368b81375p-4 ++0x1.2a7b114a80983p0 ++-0x1.8c0fd1048891ep-4 ++0x1.c32454b620d43p-26 ++0x1.853192a0e3bbbp-14 ++0x1.172b96d182f82p-2 ++0x1.4156741896c30p-3 ++-0x1.dd08573a1dc08p-3 ++-0x1.f112f2dfd0c38p23 ++0x1.f07ef18d186acp-9 ++0x1.b0b643dc8187bp-2 ++0x1.edf9044a400ccp-26 ++-0x1.420ee09a253bbp-16 ++-0x1.ce5f43fa6c0e8p0 ++-0x1.b49ed6fe33c01p-2 ++0x1.bc1e67b736d93p27 ++0x1.18f252a5a70f2p-1 ++0x1.3bd3528a6b5c3p-25 ++0x1.042f039297e45p0 ++0x1.890e26c77777ap2 ++0x1.ec331761880b9p39 ++-0x1.12aec65364402p2 ++-0x1.b09600801c6c9p7 ++0x1.4c14331304537p36 ++-0x1.366b32ae15936p-9 ++-0x1.d04011bd2f923p-27 ++-0x1.bb73e632734cap51 ++-0x1.22df928d0db2bp14 ++-0x1.84d2c65e8a597p-4 ++-0x1.248ce4d82f9e1p-3 ++-0x1.a89a16ab8fc98p41 ++-0x1.22061604a7bbep-1 ++-0x1.9b7790ad6cfcap37 ++0x1.e146126a58363p-20 ++0x1.8bf9d0bee4587p-6 ++-0x1.74eec1eb48a38p18 ++-0x1.1eca65e42c0e2p-24 ++-0x1.5f6e27219b443p5 ++-0x1.95f64657f34b0p1 ++-0x1.ad0923f0c8747p-14 ++-0x1.71b7472c93381p2 ++-0x1.e88ec0fa2b8e2p40 ++0x1.0efad07b1325cp-2 ++-0x1.d614b725644c2p-11 ++-0x1.87f104d664989p-4 ++0x1.db8bf75a3dabcp25 ++0x1.18a07441e9358p-3 ++0x1.c52552071ba9dp2 ++0x1.4eee532e1cf42p-2 ++-0x1.acd7a7d0cb2d2p49 ++-0x1.efdbb63ba4cd9p3 ++-0x1.c0dbd4011e3dbp14 ++0x1.a8b9053cd4ae7p-26 ++0x1.950f208f9f314p-3 ++0x1.62bc1534e8779p1 ++0x1.ec8712224e21dp5 ++-0x1.dcf2f55094df3p-4 ++-0x1.13a10025de14cp1 ++-0x1.275ce549521b9p-1 ++-0x1.2d3995ba1b17bp-5 ++-0x1.a76630717c0c6p3 ++-0x1.b2ec655611d3ep38 ++-0x1.9bd4a62004f97p-20 ++-0x1.49dcb6df53770p1 ++-0x1.2b34c0811030cp-3 ++0x1.99ee70ec910aap-21 ++0x1.35b201aa1e70bp-3 ++-0x1.92a3000ee8dd4p-2 ++-0x1.d69d60b48249fp3 ++0x1.eee73555cf4d5p-3 ++-0x1.07de748dacd3ap12 ++-0x1.a8ea7383f8f09p8 ++-0x1.eca3120c1f7cep1 ++-0x1.8b4b26d9f4eabp51 ++0x1.167433f50737ep-23 ++0x1.585657c46c25ap-20 ++0x1.0e0447b473e54p2 ++0x1.b28d209b03f59p-4 ++0x1.9a8d34b2b2855p-25 ++0x1.948ac6afc0f37p3 ++-0x1.563cf374c073fp-4 ++0x1.fa49e687bce32p42 ++0x1.c42c2624133c2p48 ++-0x1.001e573a69113p2 ++-0x1.4dfb17453411bp-3 ++-0x1.d9b9b553ab45fp23 ++0x1.55496452db316p3 ++-0x1.8420d7f1ac33ep3 ++-0x1.ac7cd42b0f63ep2 ++0x1.ce2970c35394cp2 ++-0x1.de2ce25feb1e3p-16 ++0x1.4fe2152fd9407p-2 ++0x1.4d4233d0400d2p1 ++0x1.f4c640fdd48b2p-10 ++0x1.1512c1316465ap37 ++0x1.b584b29dc1d4bp22 ++-0x1.695e973f8db94p-1 ++0x1.7373d677b7679p24 ++0x1.f899a57b746b9p-22 ++-0x1.f5ad761b38217p0 ++0x1.daf950a02a029p1 ++0x1.a9c47461369bcp-7 ++0x1.a66902e961fe5p-2 ++-0x1.f6bc5292eadcep2 ++-0x1.0377673b5656cp20 ++-0x1.269297562701dp-4 ++0x1.13d1e1e922a15p3 ++-0x1.ddf1d5cfbfb4dp-20 ++0x1.6c21328fa2eacp0 ++0x1.953fe3186fbacp0 ++-0x1.2ed5d49aee19cp-15 ++-0x1.d3e9f10d61fa8p-4 ++0x1.5315517278bffp-4 ++-0x1.aeeb36df95b57p26 ++0x1.9f55b3bd1d398p2 ++0x1.894151536709bp3 ++-0x1.93a3d5c645e3fp22 ++-0x1.37803538f3548p43 ++-0x1.d5dde10bc588fp-23 ++0x1.f145117569f10p4 ++-0x1.ca23009d83541p0 ++-0x1.fc4063d4a4afep23 ++-0x1.ec88c7edb5ae2p-6 ++-0x1.2d5973fcaa823p-21 ++0x1.437a141589287p2 ++-0x1.9104e694ef44ap-2 ++-0x1.b70572032d576p-7 ++0x1.d10452e3eae69p2 ++0x1.2874b443d01bcp0 ++0x1.fa66d12189a72p20 ++-0x1.303e443c556d3p46 ++0x1.4b5d557e8fe56p44 ++0x1.602bb4e791b87p-20 ++-0x1.158f81cbcb150p-3 ++-0x1.36a3939175212p3 ++-0x1.826092fe525c4p-19 ++-0x1.a72da4879bcb1p-26 ++0x1.839626b74c51ap-1 ++-0x1.bd2da6527d628p5 ++0x1.3257e0dc99c46p-23 ++-0x1.b3ebe0c2317c6p3 ++0x1.1164968b6d3d2p-4 ++0x1.bd5404092a649p30 ++-0x1.dd0e00246fdf1p-3 ++-0x1.4167e56920aa2p6 ++-0x1.b035570fa59c8p-1 ++0x1.7853f4cf90bbcp15 ++0x1.bc20a74a4c2dbp-18 ++0x1.0e3ee3d24bf54p3 ++-0x1.95aab56378e9cp45 ++-0x1.4930a7aa51e8dp1 ++0x1.ea77407c9a5f1p-1 ++0x1.4fac93644de62p-3 ++0x1.a2ed87cc0f417p43 ++0x1.14d2d0a33df56p2 ++-0x1.3473f6f77b6c5p11 ++0x1.b647101dc4177p3 ++-0x1.4e0b92acc66bfp23 ++0x1.2a3797d36ee30p-4 ++0x1.ce10973c013ebp-14 ++0x1.b6cef57406772p2 ++-0x1.326762c9ea656p-22 ++0x1.56473079b28aap24 ++-0x1.46f3d42d9a8dap-11 ++-0x1.6d4e52e373151p-7 ++0x1.622a0570fc4abp11 ++-0x1.7e0bb32e21466p-6 ++0x1.55a1a3d809d3ep1 ++-0x1.d7492480e11f5p32 ++0x1.835730d6b3ef6p-18 ++0x1.2d9cf79f070e8p-9 ++-0x1.6cee95c1d9445p26 ++0x1.45c58441f2822p-3 ++0x1.2f01d75200b30p21 ++-0x1.014c5172af434p0 ++0x1.9d96552d416d8p3 ++0x1.f878a3fc8f55fp-3 ++0x1.1206f1aa29231p1 ++0x1.998bc480cbf5dp-3 ++0x1.2160c0ab74e78p41 ++0x1.66cce4923857ap-6 ++-0x1.47bf27bfba3adp-3 ++-0x1.88b9442658583p-13 ++0x1.baf0076743831p2 ++-0x1.d7a664adbb965p-22 ++0x1.8bfbf37ef0c90p22 ++-0x1.a2b137086be2cp9 ++0x1.b8fa2667197acp29 ++0x1.2e9ee649d720ap-2 ++0x1.fd42f19ae5dfdp-15 ++0x1.b4c7c70a22018p38 ++0x1.6fee027ca714ap-18 ++0x1.b986a428fdeebp-9 ++-0x1.f63c6744cafc4p-7 ++-0x1.860b9508a01c2p-4 ++0x1.c9dbe26d13605p-7 ++-0x1.e5af65a0da055p-4 ++0x1.2f48357a95e60p-3 ++0x1.afac3209945f4p-11 ++0x1.e24230fc8430fp-1 ++0x1.555f1605043d9p40 ++-0x1.42c7b6d8c6b89p-4 ++0x1.f5e416fab1768p24 ++0x1.4379506da570ep10 ++-0x1.c38b2527d3a6ap0 ++-0x1.ecf007e1a6728p-3 ++0x1.636eb2220b2c2p-18 ++0x1.7609e702937b8p2 ++0x1.2db5d31780fa5p3 ++-0x1.221c240b15183p-3 ++0x1.084b249033af8p-19 ++-0x1.69c8f54230d4cp2 ++-0x1.5458a621ac511p0 ++0x1.c8b53281fbad0p-15 ++0x1.0c8ac2d6bf8cep-22 ++-0x1.28b804bea1e7fp3 ++0x1.919d64a75bf39p-9 ++0x1.4c0b078f754a4p-1 ++-0x1.dd7405983ab97p-20 ++0x1.ba2103a39b033p19 ++-0x1.b21fc106586d2p0 ++0x1.eacb558bbd5dap1 ++-0x1.058304cdc51f1p-2 ++-0x1.e530d67d5c413p15 ++0x1.9efc141496268p-21 ++0x1.9e43436405397p-2 ++0x1.d6c5d5f5dcc9fp-22 ++0x1.2f0540658e814p1 ++0x1.89ea31cb96062p1 ++0x1.c9d690079576dp-7 ++0x1.9b1ef5b23f047p-2 ++-0x1.c1e61429c45fbp43 ++0x1.248b34f22e7e1p-26 ++0x1.0dc2918fd3196p-15 ++0x1.a17a2260c8d58p18 ++-0x1.a088140ade389p19 ++0x1.8b92c2168e33fp40 ++0x1.69ab67a22bbbcp0 ++-0x1.343232b010a37p-17 ++-0x1.0c4932248f574p0 ++-0x1.2bdc378a38991p-2 ++0x1.2d563370110dap-12 ++0x1.a27134171f37dp-4 ++0x1.fa63324eb71a3p26 ++0x1.6f50c55b7950ep-21 ++-0x1.0486e73eca0d8p45 ++-0x1.fa20f7947f447p-3 ++0x1.0439c6fe1a62ep2 ++0x1.4e5d366349911p2 ++0x1.985933b0a27d6p-2 ++0x1.bf592781e0417p-4 ++0x1.bd39f070daca3p-4 ++0x1.0130b7296f20dp0 ++-0x1.299cc68ec2149p2 ++-0x1.6d9fc7a6e0946p0 ++0x1.b42110fb94ad0p31 ++0x1.b59970f83df8ep1 ++0x1.c4083529ddeb8p38 ++0x1.ac3bb44cafe59p1 ++0x1.6d66733b81b71p-11 ++0x1.20beb78f7ceeep-16 ++0x1.d285f704a02d5p-4 ++0x1.bf37a3dc305b1p37 ++-0x1.8852a20307706p1 ++0x1.8129a11b33c67p31 ++0x1.1b31565ac4d26p38 ++0x1.efe3d79df1a25p0 ++-0x1.df4fc61097087p34 ++-0x1.801e6310f70c4p1 ++0x1.de7fc178da718p1 ++0x1.82cd96b74c33bp-3 ++0x1.14ce177c73acbp2 ++-0x1.b8bfa6f20bf6cp-4 ++0x1.04ff06087395bp-9 ++-0x1.8327b171d58abp-4 ++-0x1.8cabe7b5327bap-3 ++-0x1.82c492035cf5bp24 ++-0x1.d85a267d87555p-24 ++-0x1.efdc44b7fb121p24 ++0x1.ea99c6cf2fd74p-17 ++0x1.3fb6671f607b1p1 ++0x1.97dce09249de2p-3 ++-0x1.9dc4f0331f52cp43 ++0x1.ea7d727d27334p41 ++-0x1.ec9d516a85c75p-25 ++-0x1.bb2176abaedd1p-3 ++-0x1.71eeb273dd3adp-15 ++-0x1.7be385146ccdep25 ++0x1.c1f987ad8af62p-6 ++0x1.2159279f1c89ap2 ++-0x1.4805b43babc89p-17 ++-0x1.c16834d0d845ap-20 ++0x1.c52f537caeb0ep10 ++0x1.14d5e5a6c66f8p52 ++0x1.2f929423ad32fp0 ++0x1.e9ce62b513428p-4 ++-0x1.8a14f3724eb37p32 ++0x1.64013151734fdp3 ++-0x1.9090f39f49889p23 ++0x1.be6b47a137a52p-12 ++0x1.59a42749fd7c3p1 ++0x1.8603f544b0976p-15 ++-0x1.4d2ba3dfaeb93p-2 ++-0x1.7d770619d5bc3p12 ++0x1.edfb87aaee9b1p1 ++-0x1.f23d94e870be7p-4 ++-0x1.21500514f25d3p41 ++0x1.cb8712f937eedp-15 ++0x1.fb47c7a69d8a4p-24 ++0x1.f1c904cd2e471p-12 ++-0x1.31e6e3b7073f8p0 ++-0x1.facd32a72c5a8p2 ++-0x1.9823a41a9780ap-3 ++0x1.3db1f5e2a9a51p51 ++0x1.6344057f1cca6p-1 ++-0x1.8be6128041ebfp-13 ++0x1.6f07c272d7fe9p38 ++-0x1.fd48060bf89bfp-5 ++-0x1.82eb1727ca16ep-2 ++0x1.26e0a24f2ec11p-18 ++-0x1.74a1c0cb9d677p-14 ++-0x1.bb0c36f1bb121p0 ++-0x1.56a4873461187p1 ++-0x1.d01e65e325d8dp2 ++-0x1.5250308bc28a5p36 ++-0x1.83c6f31f2de0fp-24 ++-0x1.41ae76e29ab40p1 ++-0x1.d738a56bac094p1 ++0x1.1a5247926ba82p-14 ++0x1.d703938b24ac4p-22 ++-0x1.cc5566621df4fp-4 ++-0x1.4144e3f175873p-4 ++0x1.a41e208bd59c2p-4 ++-0x1.8588a53e4e022p8 ++0x1.cf4331e97df52p-27 ++-0x1.d70843f5b2a7bp-8 ++-0x1.b1a912cdf744ep-3 ++0x1.ad44072bba2efp-15 ++-0x1.735cf794885b0p25 ++-0x1.94d98257a7443p-4 ++-0x1.61dac14e8c1f2p1 ++0x1.f71585bdc20e7p-20 ++-0x1.3338f2e1ebed7p-2 ++-0x1.044ab29dd3fd8p-1 ++0x1.b230868e79405p-25 ++0x1.c3539439a1ce3p15 ++-0x1.2998d58d65498p-4 ++0x1.7273d75dd90f5p0 ++-0x1.6214d3e6a209fp32 ++-0x1.3b2aa66ea6fd8p-3 ++-0x1.6cc910ca7817ap-4 ++-0x1.1194f4be56f5bp28 ++-0x1.6dc3114d423c9p2 ++-0x1.b447e098a3c6fp18 ++-0x1.705865523468cp15 ++-0x1.8e6752f060479p38 ++-0x1.ebe665ab9b23ap3 ++0x1.df6ee1073afd0p32 ++-0x1.35ce11e0f4a42p5 ++0x1.7c26f0a48edd9p-3 ++0x1.af1996c678e0dp28 ++0x1.c4ea4704b4de2p2 ++0x1.697b37d6b070dp19 ++0x1.49fa574ba1eccp52 ++-0x1.695ee7cc1ce8ep48 ++-0x1.169c757dd823dp-23 ++0x1.207273ac379a1p-4 ++0x1.7c2dc5c85d916p23 ++0x1.fe02e67c4ccbfp-24 ++0x1.accc401e13286p49 ++-0x1.af3426c709c78p-18 ++-0x1.ab2ca07faba33p-4 ++0x1.aeaaf4f90a9c1p-4 ++-0x1.84f781f4efe2cp-9 ++-0x1.d885871aa2240p-9 ++-0x1.a618720ac58c4p-22 ++-0x1.9b995257a7ee5p-6 ++-0x1.f68b46a30839ep-18 ++0x1.e1443653f9257p3 ++0x1.ce1a94d5c772cp-22 ++0x1.b24255d0a3ce2p38 ++0x1.2eaa6690d786ep2 ++0x1.b5bb45a608da6p0 ++-0x1.ead7509b0d69ep26 ++0x1.86fa30e0b406ep3 ++-0x1.acd451c3cb8b6p49 ++# atan slow path with 144bit precision ++# Implemented in sysdeps/ieee754/dbl-64/mpatan.c ++## name: 144bits ++0x1.000000c5cba87p0 ++0x1.000001883003bp0 ++0x1.00000dfb2b675p0 +diff -urN glibc-2.17-c758a686/benchtests/bench-bcopy.c glibc-2.17-c758a686/benchtests/bench-bcopy.c +--- glibc-2.17-c758a686/benchtests/bench-bcopy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-bcopy.c 2015-06-20 21:22:16.296458135 -0400 +@@ -0,0 +1,20 @@ ++/* Measure bcopy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_BCOPY ++#include "bench-memmove.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-bzero.c glibc-2.17-c758a686/benchtests/bench-bzero.c +--- glibc-2.17-c758a686/benchtests/bench-bzero.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-bzero.c 2015-06-20 21:22:16.296458135 -0400 +@@ -0,0 +1,19 @@ ++/* Measure bzero functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++#define TEST_BZERO ++#include "bench-memset.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-malloc-thread.c glibc-2.17-c758a686/benchtests/bench-malloc-thread.c +--- glibc-2.17-c758a686/benchtests/bench-malloc-thread.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-malloc-thread.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,302 @@ ++/* Benchmark malloc and free functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <errno.h> ++#include <math.h> ++#include <pthread.h> ++#include <signal.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <sys/time.h> ++#include <sys/resource.h> ++#include <unistd.h> ++ ++#include "bench-timing.h" ++#include "json-lib.h" ++ ++/* Benchmark duration in seconds. */ ++#define BENCHMARK_DURATION 60 ++#define RAND_SEED 88 ++ ++#ifndef NUM_THREADS ++# define NUM_THREADS 1 ++#endif ++ ++/* Maximum memory that can be allocated at any one time is: ++ ++ NUM_THREADS * WORKING_SET_SIZE * MAX_ALLOCATION_SIZE ++ ++ However due to the distribution of the random block sizes ++ the typical amount allocated will be much smaller. */ ++#define WORKING_SET_SIZE 1024 ++ ++#define MIN_ALLOCATION_SIZE 4 ++#define MAX_ALLOCATION_SIZE 32768 ++ ++/* Get a random block size with an inverse square distribution. */ ++static unsigned int ++get_block_size (unsigned int rand_data) ++{ ++ /* Inverse square. */ ++ const float exponent = -2; ++ /* Minimum value of distribution. */ ++ const float dist_min = MIN_ALLOCATION_SIZE; ++ /* Maximum value of distribution. */ ++ const float dist_max = MAX_ALLOCATION_SIZE; ++ ++ float min_pow = powf (dist_min, exponent + 1); ++ float max_pow = powf (dist_max, exponent + 1); ++ ++ float r = (float) rand_data / RAND_MAX; ++ ++ return (unsigned int) powf ((max_pow - min_pow) * r + min_pow, ++ 1 / (exponent + 1)); ++} ++ ++#define NUM_BLOCK_SIZES 8000 ++#define NUM_OFFSETS ((WORKING_SET_SIZE) * 4) ++ ++static unsigned int random_block_sizes[NUM_BLOCK_SIZES]; ++static unsigned int random_offsets[NUM_OFFSETS]; ++ ++static void ++init_random_values (void) ++{ ++ for (size_t i = 0; i < NUM_BLOCK_SIZES; i++) ++ random_block_sizes[i] = get_block_size (rand ()); ++ ++ for (size_t i = 0; i < NUM_OFFSETS; i++) ++ random_offsets[i] = rand () % WORKING_SET_SIZE; ++} ++ ++static unsigned int ++get_random_block_size (unsigned int *state) ++{ ++ unsigned int idx = *state; ++ ++ if (idx >= NUM_BLOCK_SIZES - 1) ++ idx = 0; ++ else ++ idx++; ++ ++ *state = idx; ++ ++ return random_block_sizes[idx]; ++} ++ ++static unsigned int ++get_random_offset (unsigned int *state) ++{ ++ unsigned int idx = *state; ++ ++ if (idx >= NUM_OFFSETS - 1) ++ idx = 0; ++ else ++ idx++; ++ ++ *state = idx; ++ ++ return random_offsets[idx]; ++} ++ ++static volatile bool timeout; ++ ++static void ++alarm_handler (int signum) ++{ ++ timeout = true; ++} ++ ++/* Allocate and free blocks in a random order. */ ++static size_t ++malloc_benchmark_loop (void **ptr_arr) ++{ ++ unsigned int offset_state = 0, block_state = 0; ++ size_t iters = 0; ++ ++ while (!timeout) ++ { ++ unsigned int next_idx = get_random_offset (&offset_state); ++ unsigned int next_block = get_random_block_size (&block_state); ++ ++ free (ptr_arr[next_idx]); ++ ++ ptr_arr[next_idx] = malloc (next_block); ++ ++ iters++; ++ } ++ ++ return iters; ++} ++ ++struct thread_args ++{ ++ size_t iters; ++ void **working_set; ++ timing_t elapsed; ++}; ++ ++static void * ++benchmark_thread (void *arg) ++{ ++ struct thread_args *args = (struct thread_args *) arg; ++ size_t iters; ++ void *thread_set = args->working_set; ++ timing_t start, stop; ++ ++ TIMING_NOW (start); ++ iters = malloc_benchmark_loop (thread_set); ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (args->elapsed, start, stop); ++ args->iters = iters; ++ ++ return NULL; ++} ++ ++static timing_t ++do_benchmark (size_t num_threads, size_t *iters) ++{ ++ timing_t elapsed = 0; ++ ++ if (num_threads == 1) ++ { ++ timing_t start, stop; ++ void *working_set[WORKING_SET_SIZE]; ++ ++ memset (working_set, 0, sizeof (working_set)); ++ ++ TIMING_NOW (start); ++ *iters = malloc_benchmark_loop (working_set); ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (elapsed, start, stop); ++ } ++ else ++ { ++ struct thread_args args[num_threads]; ++ void *working_set[num_threads][WORKING_SET_SIZE]; ++ pthread_t threads[num_threads]; ++ ++ memset (working_set, 0, sizeof (working_set)); ++ ++ *iters = 0; ++ ++ for (size_t i = 0; i < num_threads; i++) ++ { ++ args[i].working_set = working_set[i]; ++ pthread_create(&threads[i], NULL, benchmark_thread, &args[i]); ++ } ++ ++ for (size_t i = 0; i < num_threads; i++) ++ { ++ pthread_join(threads[i], NULL); ++ TIMING_ACCUM (elapsed, args[i].elapsed); ++ *iters += args[i].iters; ++ } ++ } ++ return elapsed; ++} ++ ++static void usage(const char *name) ++{ ++ fprintf (stderr, "%s: <num_threads>\n", name); ++ exit (1); ++} ++ ++int ++main (int argc, char **argv) ++{ ++ timing_t cur; ++ size_t iters = 0, num_threads = 1; ++ unsigned long res; ++ json_ctx_t json_ctx; ++ double d_total_s, d_total_i; ++ struct sigaction act; ++ ++ if (argc == 1) ++ num_threads = 1; ++ else if (argc == 2) ++ { ++ long ret; ++ ++ errno = 0; ++ ret = strtol(argv[1], NULL, 10); ++ ++ if (errno || ret == 0) ++ usage(argv[0]); ++ ++ num_threads = ret; ++ } ++ else ++ usage(argv[0]); ++ ++ init_random_values (); ++ ++ json_init (&json_ctx, 0, stdout); ++ ++ json_document_begin (&json_ctx); ++ ++ json_attr_string (&json_ctx, "timing_type", TIMING_TYPE); ++ ++ json_attr_object_begin (&json_ctx, "functions"); ++ ++ json_attr_object_begin (&json_ctx, "malloc"); ++ ++ json_attr_object_begin (&json_ctx, ""); ++ ++ TIMING_INIT (res); ++ ++ (void) res; ++ ++ memset (&act, 0, sizeof (act)); ++ act.sa_handler = &alarm_handler; ++ ++ sigaction (SIGALRM, &act, NULL); ++ ++ alarm (BENCHMARK_DURATION); ++ ++ cur = do_benchmark (num_threads, &iters); ++ ++ struct rusage usage; ++ getrusage(RUSAGE_SELF, &usage); ++ ++ d_total_s = cur; ++ d_total_i = iters; ++ ++ json_attr_double (&json_ctx, "duration", d_total_s); ++ json_attr_double (&json_ctx, "iterations", d_total_i); ++ json_attr_double (&json_ctx, "time_per_iteration", d_total_s / d_total_i); ++ json_attr_double (&json_ctx, "max_rss", usage.ru_maxrss); ++ ++ json_attr_double (&json_ctx, "threads", num_threads); ++ json_attr_double (&json_ctx, "min_size", MIN_ALLOCATION_SIZE); ++ json_attr_double (&json_ctx, "max_size", MAX_ALLOCATION_SIZE); ++ json_attr_double (&json_ctx, "random_seed", RAND_SEED); ++ ++ json_attr_object_end (&json_ctx); ++ ++ json_attr_object_end (&json_ctx); ++ ++ json_attr_object_end (&json_ctx); ++ ++ json_document_end (&json_ctx); ++ ++ return 0; ++} +diff -urN glibc-2.17-c758a686/benchtests/bench-memccpy.c glibc-2.17-c758a686/benchtests/bench-memccpy.c +--- glibc-2.17-c758a686/benchtests/bench-memccpy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memccpy.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,163 @@ ++/* Measure memccpy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "memccpy" ++#include "bench-string.h" ++ ++void *simple_memccpy (void *, const void *, int, size_t); ++void *stupid_memccpy (void *, const void *, int, size_t); ++ ++IMPL (stupid_memccpy, 0) ++IMPL (simple_memccpy, 0) ++IMPL (memccpy, 1) ++ ++void * ++simple_memccpy (void *dst, const void *src, int c, size_t n) ++{ ++ const char *s = src; ++ char *d = dst; ++ ++ while (n-- > 0) ++ if ((*d++ = *s++) == (char) c) ++ return d; ++ ++ return NULL; ++} ++ ++void * ++stupid_memccpy (void *dst, const void *src, int c, size_t n) ++{ ++ void *p = memchr (src, c, n); ++ ++ if (p != NULL) ++ return mempcpy (dst, src, p - src + 1); ++ ++ memcpy (dst, src, n); ++ return NULL; ++} ++ ++typedef void *(*proto_t) (void *, const void *, int c, size_t); ++ ++static void ++do_one_test (impl_t *impl, void *dst, const void *src, int c, size_t len, ++ size_t n) ++{ ++ void *expect = len > n ? NULL : (char *) dst + len; ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (CALL (impl, dst, src, c, n) != expect) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ CALL (impl, dst, src, c, n), expect); ++ ret = 1; ++ return; ++ } ++ ++ if (memcmp (dst, src, len > n ? n : len) != 0) ++ { ++ error (0, 0, "Wrong result in function %s", impl->name); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, dst, src, c, n); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, int c, size_t len, size_t n, ++ int max_char) ++{ ++ size_t i; ++ char *s1, *s2; ++ ++ align1 &= 7; ++ if (align1 + len >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0; i < len - 1; ++i) ++ { ++ s1[i] = 32 + 23 * i % (max_char - 32); ++ if (s1[i] == (char) c) ++ --s1[i]; ++ } ++ s1[len - 1] = c; ++ for (i = len; i + align1 < page_size && i < len + 64; ++i) ++ s1[i] = 32 + 32 * i % (max_char - 32); ++ ++ printf ("Length %4zd, n %4zd, char %d, alignment %2zd/%2zd:", len, n, c, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s2, s1, c, len, n); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%28s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, i, 12, 16, 16, 127); ++ do_test (i, i, 23, 16, 16, 255); ++ do_test (i, 2 * i, 28, 16, 16, 127); ++ do_test (2 * i, i, 31, 16, 16, 255); ++ do_test (8 - i, 2 * i, 1, 1 << i, 2 << i, 127); ++ do_test (2 * i, 8 - i, 17, 2 << i, 1 << i, 127); ++ do_test (8 - i, 2 * i, 0, 1 << i, 2 << i, 255); ++ do_test (2 * i, 8 - i, i, 2 << i, 1 << i, 255); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, i, 4 << i, 8 << i, 127); ++ do_test (0, 0, i, 16 << i, 8 << i, 127); ++ do_test (8 - i, 2 * i, i, 4 << i, 8 << i, 127); ++ do_test (8 - i, 2 * i, i, 16 << i, 8 << i, 127); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-memchr.c glibc-2.17-c758a686/benchtests/bench-memchr.c +--- glibc-2.17-c758a686/benchtests/bench-memchr.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memchr.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,133 @@ ++/* Measure memchr functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef USE_AS_MEMRCHR ++# define TEST_MAIN ++# define TEST_NAME "memchr" ++# include "bench-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) ++{ ++ while (n--) ++ if (*s++ == (char) c) ++ return (char *) s - 1; ++ return NULL; ++} ++#endif ++ ++static void ++do_one_test (impl_t *impl, const char *s, int c, size_t n, char *exp_res) ++{ ++ char *res = CALL (impl, s, c, n); ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (res != exp_res) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ res, exp_res); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s, c, n); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t pos, size_t len, int seek_char) ++{ ++ size_t i; ++ char *result; ++ ++ align &= 7; ++ if (align + len >= page_size) ++ return; ++ ++ 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; ++ } ++ buf1[align + len] = 0; ++ ++ if (pos < len) ++ { ++ buf1[align + pos] = seek_char; ++ buf1[align + len] = -seek_char; ++ result = (char *) (buf1 + align + pos); ++ } ++ else ++ { ++ result = NULL; ++ buf1[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); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%20s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 16 << i, 2048, 23); ++ do_test (i, 64, 256, 23); ++ do_test (0, 16 << i, 2048, 0); ++ do_test (i, 64, 256, 0); ++ } ++ for (i = 1; i < 32; ++i) ++ { ++ do_test (0, i, i + 1, 23); ++ do_test (0, i, i + 1, 0); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-memcmp.c glibc-2.17-c758a686/benchtests/bench-memcmp.c +--- glibc-2.17-c758a686/benchtests/bench-memcmp.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memcmp.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,177 @@ ++/* Measure memcmp functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#ifdef WIDE ++# define TEST_NAME "wmemcmp" ++#else ++# define TEST_NAME "memcmp" ++#endif ++#include "bench-string.h" ++#ifdef WIDE ++# include <inttypes.h> ++# include <wchar.h> ++ ++# define MEMCMP wmemcmp ++# define MEMCPY wmemcpy ++# define SIMPLE_MEMCMP simple_wmemcmp ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define CHARBYTES 4 ++# define CHAR__MIN WCHAR_MIN ++# define CHAR__MAX WCHAR_MAX ++int ++simple_wmemcmp (const wchar_t *s1, const wchar_t *s2, size_t n) ++{ ++ int ret = 0; ++ /* Warning! ++ wmemcmp has to use SIGNED comparison for elements. ++ memcmp has to use UNSIGNED comparison for elemnts. ++ */ ++ while (n-- && (ret = *s1 < *s2 ? -1 : *s1 == *s2 ? 0 : 1) == 0) {s1++; s2++;} ++ return ret; ++} ++#else ++# include <limits.h> ++ ++# define MEMCMP memcmp ++# define MEMCPY memcpy ++# define SIMPLE_MEMCMP simple_memcmp ++# define CHAR char ++# define MAX_CHAR 255 ++# define UCHAR unsigned char ++# define CHARBYTES 1 ++# define CHAR__MIN CHAR_MIN ++# define CHAR__MAX CHAR_MAX ++ ++int ++simple_memcmp (const char *s1, const char *s2, size_t n) ++{ ++ int ret = 0; ++ ++ while (n-- && (ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) == 0); ++ return ret; ++} ++#endif ++ ++typedef int (*proto_t) (const CHAR *, const CHAR *, size_t); ++ ++IMPL (SIMPLE_MEMCMP, 0) ++IMPL (MEMCMP, 1) ++ ++static void ++do_one_test (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t len, ++ int exp_result) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2, len); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, int exp_result) ++{ ++ size_t i; ++ CHAR *s1, *s2; ++ ++ if (len == 0) ++ return; ++ ++ align1 &= 63; ++ if (align1 + (len + 1) * CHARBYTES >= page_size) ++ return; ++ ++ align2 &= 63; ++ if (align2 + (len + 1) * CHARBYTES >= page_size) ++ return; ++ ++ s1 = (CHAR *) (buf1 + align1); ++ s2 = (CHAR *) (buf2 + align2); ++ ++ for (i = 0; i < len; i++) ++ s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % CHAR__MAX; ++ ++ s1[len] = align1; ++ s2[len] = align2; ++ s2[len - 1] -= exp_result; ++ ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, len, exp_result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 16; ++i) ++ { ++ do_test (i * CHARBYTES, i * CHARBYTES, i, 0); ++ do_test (i * CHARBYTES, i * CHARBYTES, i, 1); ++ do_test (i * CHARBYTES, i * CHARBYTES, i, -1); ++ } ++ ++ for (i = 0; i < 16; ++i) ++ { ++ do_test (0, 0, i, 0); ++ do_test (0, 0, i, 1); ++ do_test (0, 0, i, -1); ++ } ++ ++ for (i = 1; i < 10; ++i) ++ { ++ do_test (0, 0, 2 << i, 0); ++ do_test (0, 0, 2 << i, 1); ++ do_test (0, 0, 2 << i, -1); ++ do_test (0, 0, 16 << i, 0); ++ do_test ((8 - i) * CHARBYTES, (2 * i) * CHARBYTES, 16 << i, 0); ++ do_test (0, 0, 16 << i, 1); ++ do_test (0, 0, 16 << i, -1); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i * CHARBYTES, 2 * (i * CHARBYTES), 8 << i, 0); ++ do_test (i * CHARBYTES, 2 * (i * CHARBYTES), 8 << i, 1); ++ do_test (i * CHARBYTES, 2 * (i * CHARBYTES), 8 << i, -1); ++ } ++ ++ return ret; ++} ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-memcpy.c glibc-2.17-c758a686/benchtests/bench-memcpy.c +--- glibc-2.17-c758a686/benchtests/bench-memcpy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memcpy.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,157 @@ ++/* Measure memcpy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef MEMCPY_RESULT ++# define MEMCPY_RESULT(dst, len) dst ++# define MIN_PAGE_SIZE 131072 ++# define TEST_MAIN ++# define TEST_NAME "memcpy" ++# include "bench-string.h" ++ ++char *simple_memcpy (char *, const char *, size_t); ++char *builtin_memcpy (char *, const char *, size_t); ++ ++IMPL (simple_memcpy, 0) ++IMPL (builtin_memcpy, 0) ++IMPL (memcpy, 1) ++ ++char * ++simple_memcpy (char *dst, const char *src, size_t n) ++{ ++ char *ret = dst; ++ while (n--) ++ *dst++ = *src++; ++ return ret; ++} ++ ++char * ++builtin_memcpy (char *dst, const char *src, size_t n) ++{ ++ return __builtin_memcpy (dst, src, n); ++} ++#endif ++ ++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 i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (CALL (impl, dst, src, len) != MEMCPY_RESULT (dst, len)) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ CALL (impl, dst, src, len), MEMCPY_RESULT (dst, len)); ++ ret = 1; ++ return; ++ } ++ ++ if (memcmp (dst, src, len) != 0) ++ { ++ error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"", ++ impl->name, dst, src); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, dst, src, len); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len) ++{ ++ size_t i, j; ++ char *s1, *s2; ++ ++ align1 &= 63; ++ if (align1 + len >= page_size) ++ return; ++ ++ align2 &= 63; ++ if (align2 + len >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0, j = 1; i < len; i++, j += 23) ++ s1[i] = j; ++ ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s2, s1, len); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 0; i < 18; ++i) ++ { ++ do_test (0, 0, 1 << i); ++ do_test (i, 0, 1 << i); ++ do_test (0, i, 1 << i); ++ do_test (i, i, 1 << i); ++ } ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, 0, i); ++ do_test (i, 0, i); ++ do_test (0, i, i); ++ do_test (i, i, i); ++ } ++ ++ for (i = 3; i < 32; ++i) ++ { ++ if ((i & (i - 1)) == 0) ++ continue; ++ do_test (0, 0, 16 * i); ++ do_test (i, 0, 16 * i); ++ do_test (0, i, 16 * i); ++ do_test (i, i, 16 * i); ++ } ++ ++ do_test (0, 0, getpagesize ()); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-memmem.c glibc-2.17-c758a686/benchtests/bench-memmem.c +--- glibc-2.17-c758a686/benchtests/bench-memmem.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memmem.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,164 @@ ++/* Measure memmem functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "memmem" ++#define BUF1PAGES 20 ++#define ITERATIONS 500 ++#include "bench-string.h" ++ ++typedef char *(*proto_t) (const void *, size_t, const void *, size_t); ++void *simple_memmem (const void *, size_t, const void *, size_t); ++ ++IMPL (simple_memmem, 0) ++IMPL (memmem, 1) ++ ++void * ++simple_memmem (const void *haystack, size_t haystack_len, const void *needle, ++ size_t needle_len) ++{ ++ const char *begin; ++ const char *const last_possible ++ = (const char *) haystack + haystack_len - needle_len; ++ ++ if (needle_len == 0) ++ /* The first occurrence of the empty string is deemed to occur at ++ the beginning of the string. */ ++ return (void *) haystack; ++ ++ /* Sanity check, otherwise the loop might search through the whole ++ memory. */ ++ if (__glibc_unlikely (haystack_len < needle_len)) ++ return NULL; ++ ++ for (begin = (const char *) haystack; begin <= last_possible; ++begin) ++ if (begin[0] == ((const char *) needle)[0] && ++ !memcmp ((const void *) &begin[1], ++ (const void *) ((const char *) needle + 1), ++ needle_len - 1)) ++ return (void *) begin; ++ ++ return NULL; ++} ++ ++static void ++do_one_test (impl_t *impl, const void *haystack, size_t haystack_len, ++ const void *needle, size_t needle_len, const void *expected) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, haystack, haystack_len, needle, needle_len); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (const char *str, size_t len, size_t idx) ++{ ++ char tmpbuf[len]; ++ ++ memcpy (tmpbuf, buf1 + idx, len); ++ memcpy (buf1 + idx, str, len); ++ ++ printf ("String %s, offset %zd:", str, idx); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx); ++ ++ memcpy (buf1 + idx, tmpbuf, len); ++ ++ putchar ('\n'); ++} ++ ++static void ++do_random_tests (void) ++{ ++ for (size_t n = 0; n < ITERATIONS; ++n) ++ { ++ char tmpbuf[32]; ++ ++ size_t shift = random () % 11; ++ size_t rel = random () % ((2 << (shift + 1)) * 64); ++ size_t idx = MIN ((2 << shift) * 64 + rel, BUF1PAGES * page_size - 2); ++ size_t len = random () % (sizeof (tmpbuf) - 1) + 1; ++ len = MIN (len, BUF1PAGES * page_size - idx - 1); ++ memcpy (tmpbuf, buf1 + idx, len); ++ for (size_t i = random () % len / 2 + 1; i > 0; --i) ++ { ++ size_t off = random () % len; ++ char ch = '0' + random () % 10; ++ ++ buf1[idx + off] = ch; ++ } ++ ++ printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len, ++ buf1 + idx); ++ ++ putchar ('\n'); ++ ++ memcpy (buf1 + idx, tmpbuf, len); ++ } ++} ++ ++static const char *const strs[] = ++ { ++ "00000", "00112233", "0123456789", "0000111100001111", ++ "00000111110000022222", "012345678901234567890", ++ "abc0", "aaaa0", "abcabc0" ++ }; ++ ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 0; i < BUF1PAGES * page_size; ++i) ++ buf1[i] = 60 + random () % 32; ++ ++ for (i = 0; i < sizeof (strs) / sizeof (strs[0]); ++i) ++ for (size_t j = 0; j < 120; j += 7) ++ { ++ size_t len = strlen (strs[i]); ++ ++ do_test (strs[i], len, j); ++ } ++ ++ do_random_tests (); ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-memmove.c glibc-2.17-c758a686/benchtests/bench-memmove.c +--- glibc-2.17-c758a686/benchtests/bench-memmove.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memmove.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,182 @@ ++/* Measure memmove functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#ifdef TEST_BCOPY ++# define TEST_NAME "bcopy" ++#else ++# define TEST_NAME "memmove" ++#endif ++#include "bench-string.h" ++ ++char *simple_memmove (char *, const char *, size_t); ++ ++#ifdef TEST_BCOPY ++typedef void (*proto_t) (const char *, char *, size_t); ++void simple_bcopy (const char *, char *, size_t); ++ ++IMPL (simple_bcopy, 0) ++IMPL (bcopy, 1) ++ ++void ++simple_bcopy (const char *src, char *dst, size_t n) ++{ ++ simple_memmove (dst, src, n); ++} ++#else ++typedef char *(*proto_t) (char *, const char *, size_t); ++ ++IMPL (simple_memmove, 0) ++IMPL (memmove, 1) ++#endif ++ ++char * ++inhibit_loop_to_libcall ++simple_memmove (char *dst, const char *src, size_t n) ++{ ++ char *ret = dst; ++ if (src < dst) ++ { ++ dst += n; ++ src += n; ++ while (n--) ++ *--dst = *--src; ++ } ++ else ++ while (n--) ++ *dst++ = *src++; ++ return ret; ++} ++ ++static void ++do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src, ++ size_t len) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ memcpy (src, orig_src, len); ++#ifdef TEST_BCOPY ++ CALL (impl, src, dst, len); ++#else ++ char *res; ++ ++ res = CALL (impl, dst, src, len); ++ if (res != dst) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ res, dst); ++ ret = 1; ++ return; ++ } ++#endif ++ ++ if (memcmp (dst, orig_src, len) != 0) ++ { ++ error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"", ++ impl->name, dst, src); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++#ifdef TEST_BCOPY ++ CALL (impl, src, dst, len); ++#else ++ CALL (impl, dst, src, len); ++#endif ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len) ++{ ++ size_t i, j; ++ char *s1, *s2; ++ ++ align1 &= 63; ++ if (align1 + len >= page_size) ++ return; ++ ++ align2 &= 63; ++ if (align2 + len >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0, j = 1; i < len; i++, j += 23) ++ s1[i] = j; ++ ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s2, (char *) (buf2 + align1), s1, len); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 0; i < 14; ++i) ++ { ++ do_test (0, 32, 1 << i); ++ do_test (32, 0, 1 << i); ++ do_test (0, i, 1 << i); ++ do_test (i, 0, 1 << i); ++ } ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, 32, i); ++ do_test (32, 0, i); ++ do_test (0, i, i); ++ do_test (i, 0, i); ++ } ++ ++ for (i = 3; i < 32; ++i) ++ { ++ if ((i & (i - 1)) == 0) ++ continue; ++ do_test (0, 32, 16 * i); ++ do_test (32, 0, 16 * i); ++ do_test (0, i, 16 * i); ++ do_test (i, 0, 16 * i); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-mempcpy.c glibc-2.17-c758a686/benchtests/bench-mempcpy.c +--- glibc-2.17-c758a686/benchtests/bench-mempcpy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-mempcpy.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,37 @@ ++/* Measure mempcpy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define MEMCPY_RESULT(dst, len) (dst) + (len) ++#define TEST_MAIN ++#define TEST_NAME "mempcpy" ++#include "bench-string.h" ++ ++char *simple_mempcpy (char *, const char *, size_t); ++ ++IMPL (simple_mempcpy, 0) ++IMPL (mempcpy, 1) ++ ++char * ++simple_mempcpy (char *dst, const char *src, size_t n) ++{ ++ while (n--) ++ *dst++ = *src++; ++ return dst; ++} ++ ++#include "bench-memcpy.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-memrchr.c glibc-2.17-c758a686/benchtests/bench-memrchr.c +--- glibc-2.17-c758a686/benchtests/bench-memrchr.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memrchr.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,40 @@ ++/* Measure memrchr functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "memrchr" ++#include "bench-string.h" ++ ++typedef char *(*proto_t) (const char *, int, size_t); ++char *simple_memrchr (const char *, int, size_t); ++ ++IMPL (simple_memrchr, 0) ++IMPL (memrchr, 1) ++ ++char * ++simple_memrchr (const char *s, int c, size_t n) ++{ ++ s = s + n; ++ while (n--) ++ if (*--s == (char) c) ++ return (char *) s; ++ return NULL; ++} ++ ++#define USE_AS_MEMRCHR ++#include "bench-memchr.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-memset.c glibc-2.17-c758a686/benchtests/bench-memset.c +--- glibc-2.17-c758a686/benchtests/bench-memset.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-memset.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,167 @@ ++/* Measure memset functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#ifdef TEST_BZERO ++# define TEST_NAME "bzero" ++#else ++# define TEST_NAME "memset" ++#endif ++#define MIN_PAGE_SIZE 131072 ++#include "bench-string.h" ++ ++char *simple_memset (char *, int, size_t); ++ ++#ifdef TEST_BZERO ++typedef void (*proto_t) (char *, size_t); ++void simple_bzero (char *, size_t); ++void builtin_bzero (char *, size_t); ++ ++IMPL (simple_bzero, 0) ++IMPL (builtin_bzero, 0) ++IMPL (bzero, 1) ++ ++void ++simple_bzero (char *s, size_t n) ++{ ++ simple_memset (s, 0, n); ++} ++ ++void ++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); ++ ++IMPL (simple_memset, 0) ++IMPL (builtin_memset, 0) ++IMPL (memset, 1) ++ ++char * ++builtin_memset (char *s, int c, size_t n) ++{ ++ return __builtin_memset (s, c, n); ++} ++#endif ++ ++char * ++inhibit_loop_to_libcall ++simple_memset (char *s, int c, size_t 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) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ 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); ++ if (res != s ++ || simple_memset (tstbuf, c, n) != tstbuf ++ || memcmp (s, tstbuf, n) != 0) ++#endif ++ { ++ error (0, 0, "Wrong result in function %s", impl->name); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++#ifdef TEST_BZERO ++ CALL (impl, s, n); ++#else ++ CALL (impl, s, c, n); ++#endif ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, int c, size_t len) ++{ ++ align &= 7; ++ if (align + len > 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); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ int c = 0; ++ ++ test_init (); ++ ++ printf ("%24s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++#ifndef TEST_BZERO ++ for (c = -65; c <= 130; c += 65) ++#endif ++ { ++ for (i = 0; i < 18; ++i) ++ do_test (0, c, 1 << i); ++ for (i = 1; i < 32; ++i) ++ { ++ do_test (i, c, i); ++ if (i & (i - 1)) ++ do_test (0, c, i); ++ } ++ for (i = 32; i < 512; i+=32) ++ { ++ do_test (0, c, i); ++ do_test (i, c, i); ++ } ++ do_test (1, c, 14); ++ do_test (3, c, 1024); ++ do_test (4, c, 64); ++ do_test (2, c, 25); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-rawmemchr.c glibc-2.17-c758a686/benchtests/bench-rawmemchr.c +--- glibc-2.17-c758a686/benchtests/bench-rawmemchr.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-rawmemchr.c 2015-06-20 21:22:16.297458105 -0400 +@@ -0,0 +1,126 @@ ++/* Measure memchr functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <assert.h> ++ ++#define TEST_MAIN ++#define TEST_NAME "rawmemchr" ++#include "bench-string.h" ++ ++typedef char *(*proto_t) (const char *, int); ++char *simple_rawmemchr (const char *, int); ++ ++IMPL (simple_rawmemchr, 0) ++IMPL (rawmemchr, 1) ++ ++char * ++simple_rawmemchr (const char *s, int c) ++{ ++ while (1) ++ if (*s++ == (char) c) ++ return (char *) s - 1; ++ return NULL; ++} ++ ++static void ++do_one_test (impl_t *impl, const char *s, int c, char *exp_res) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ char *res = CALL (impl, s, c); ++ if (res != exp_res) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ res, exp_res); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s, c); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t pos, size_t len, int seek_char) ++{ ++ size_t i; ++ char *result; ++ ++ align &= 7; ++ if (align + len >= page_size) ++ return; ++ ++ 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; ++ } ++ buf1[align + len] = 0; ++ ++ assert (pos < len); ++ ++ buf1[align + pos] = seek_char; ++ buf1[align + len] = -seek_char; ++ result = (char *) (buf1 + align + pos); ++ ++ printf ("Length %4zd, alignment %2zd:", pos, align); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, (char *) (buf1 + align), seek_char, result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%20s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 7; ++i) ++ { ++ do_test (0, 16 << i, 2048, 23); ++ do_test (i, 64, 256, 23); ++ do_test (0, 16 << i, 2048, 0); ++ do_test (i, 64, 256, 0); ++ } ++ for (i = 1; i < 32; ++i) ++ { ++ do_test (0, i, i + 1, 23); ++ do_test (0, i, i + 1, 0); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-skeleton.c glibc-2.17-c758a686/benchtests/bench-skeleton.c +--- glibc-2.17-c758a686/benchtests/bench-skeleton.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-skeleton.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,154 @@ ++/* Skeleton for benchmark programs. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <string.h> ++#include <stdint.h> ++#include <stdbool.h> ++#include <stdio.h> ++#include <time.h> ++#include <inttypes.h> ++#include "bench-timing.h" ++#include "json-lib.h" ++ ++volatile unsigned int dontoptimize = 0; ++ ++void ++startup (void) ++{ ++ /* This loop should cause CPU to switch to maximal freqency. ++ This makes subsequent measurement more accurate. We need a side effect ++ to prevent the loop being deleted by compiler. ++ This should be enough to cause CPU to speed up and it is simpler than ++ running loop for constant time. This is used when user does not have root ++ access to set a constant freqency. */ ++ for (int k = 0; k < 10000000; k++) ++ dontoptimize += 23 * dontoptimize + 2; ++} ++ ++#define TIMESPEC_AFTER(a, b) \ ++ (((a).tv_sec == (b).tv_sec) ? \ ++ ((a).tv_nsec > (b).tv_nsec) : \ ++ ((a).tv_sec > (b).tv_sec)) ++int ++main (int argc, char **argv) ++{ ++ unsigned long i, k; ++ struct timespec runtime; ++ timing_t start, end; ++ bool detailed = false; ++ json_ctx_t json_ctx; ++ ++ if (argc == 2 && !strcmp (argv[1], "-d")) ++ detailed = true; ++ ++ startup(); ++ ++ memset (&runtime, 0, sizeof (runtime)); ++ ++ unsigned long iters, res; ++ ++#ifdef BENCH_INIT ++ BENCH_INIT (); ++#endif ++ TIMING_INIT (res); ++ ++ iters = 1000 * res; ++ ++ json_init (&json_ctx, 2, stdout); ++ ++ /* Begin function. */ ++ json_attr_object_begin (&json_ctx, FUNCNAME); ++ ++ for (int v = 0; v < NUM_VARIANTS; v++) ++ { ++ /* Run for approximately DURATION seconds. */ ++ clock_gettime (CLOCK_MONOTONIC_RAW, &runtime); ++ runtime.tv_sec += DURATION; ++ ++ double d_total_i = 0; ++ timing_t total = 0, max = 0, min = 0x7fffffffffffffff; ++ int64_t c = 0; ++ while (1) ++ { ++ for (i = 0; i < NUM_SAMPLES (v); i++) ++ { ++ uint64_t cur; ++ TIMING_NOW (start); ++ for (k = 0; k < iters; k++) ++ BENCH_FUNC (v, i); ++ TIMING_NOW (end); ++ ++ TIMING_DIFF (cur, start, end); ++ ++ if (cur > max) ++ max = cur; ++ ++ if (cur < min) ++ min = cur; ++ ++ TIMING_ACCUM (total, cur); ++ /* Accumulate timings for the value. In the end we will divide ++ by the total iterations. */ ++ RESULT_ACCUM (cur, v, i, c * iters, (c + 1) * iters); ++ ++ d_total_i += iters; ++ } ++ c++; ++ struct timespec curtime; ++ ++ memset (&curtime, 0, sizeof (curtime)); ++ clock_gettime (CLOCK_MONOTONIC_RAW, &curtime); ++ if (TIMESPEC_AFTER (curtime, runtime)) ++ goto done; ++ } ++ ++ double d_total_s; ++ double d_iters; ++ ++ done: ++ d_total_s = total; ++ d_iters = iters; ++ ++ /* Begin variant. */ ++ json_attr_object_begin (&json_ctx, VARIANT (v)); ++ ++ json_attr_double (&json_ctx, "duration", d_total_s); ++ json_attr_double (&json_ctx, "iterations", d_total_i); ++ json_attr_double (&json_ctx, "max", max / d_iters); ++ json_attr_double (&json_ctx, "min", min / d_iters); ++ json_attr_double (&json_ctx, "mean", d_total_s / d_total_i); ++ ++ if (detailed) ++ { ++ json_array_begin (&json_ctx, "timings"); ++ ++ for (int i = 0; i < NUM_SAMPLES (v); i++) ++ json_element_double (&json_ctx, RESULT (v, i)); ++ ++ json_array_end (&json_ctx); ++ } ++ ++ /* End variant. */ ++ json_attr_object_end (&json_ctx); ++ } ++ ++ /* End function. */ ++ json_attr_object_end (&json_ctx); ++ ++ return 0; ++} +diff -urN glibc-2.17-c758a686/benchtests/bench-stpcpy.c glibc-2.17-c758a686/benchtests/bench-stpcpy.c +--- glibc-2.17-c758a686/benchtests/bench-stpcpy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-stpcpy.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,36 @@ ++/* Measure stpcpy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define STRCPY_RESULT(dst, len) ((dst) + (len)) ++#define TEST_MAIN ++#define TEST_NAME "stpcpy" ++#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) ++{ ++ while ((*dst++ = *src++) != '\0'); ++ return dst - 1; ++} ++ ++#include "bench-strcpy.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-stpcpy_chk.c glibc-2.17-c758a686/benchtests/bench-stpcpy_chk.c +--- glibc-2.17-c758a686/benchtests/bench-stpcpy_chk.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-stpcpy_chk.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,45 @@ ++/* Measure stpcpy checking functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define STRCPY_RESULT(dst, len) ((dst) + (len)) ++#define TEST_MAIN ++#define TEST_NAME "stpcpy_chk" ++#include "bench-string.h" ++ ++extern void __attribute__ ((noreturn)) __chk_fail (void); ++char *simple_stpcpy_chk (char *, const char *, size_t); ++extern char *normal_stpcpy (char *, const char *, size_t) ++ __asm ("stpcpy"); ++extern char *__stpcpy_chk (char *, const char *, size_t); ++ ++IMPL (simple_stpcpy_chk, 0) ++IMPL (normal_stpcpy, 1) ++IMPL (__stpcpy_chk, 2) ++ ++char * ++simple_stpcpy_chk (char *dst, const char *src, size_t len) ++{ ++ if (! len) ++ __chk_fail (); ++ while ((*dst++ = *src++) != '\0') ++ if (--len == 0) ++ __chk_fail (); ++ return dst - 1; ++} ++ ++#include "bench-strcpy_chk.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-stpncpy.c glibc-2.17-c758a686/benchtests/bench-stpncpy.c +--- glibc-2.17-c758a686/benchtests/bench-stpncpy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-stpncpy.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,59 @@ ++/* Measure stpncpy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define STRNCPY_RESULT(dst, len, n) ((dst) + ((len) > (n) ? (n) : (len))) ++#define TEST_MAIN ++#define TEST_NAME "stpncpy" ++#include "bench-string.h" ++ ++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) ++ ++char * ++simple_stpncpy (char *dst, const char *src, size_t n) ++{ ++ while (n--) ++ if ((*dst++ = *src++) == '\0') ++ { ++ size_t i; ++ ++ for (i = 0; i < n; ++i) ++ dst[i] = '\0'; ++ return dst - 1; ++ } ++ return dst; ++} ++ ++char * ++stupid_stpncpy (char *dst, const char *src, size_t n) ++{ ++ size_t nc = strnlen (src, n); ++ size_t i; ++ ++ for (i = 0; i < nc; ++i) ++ dst[i] = src[i]; ++ for (; i < n; ++i) ++ dst[i] = '\0'; ++ return dst + nc; ++} ++ ++#include "bench-strncpy.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strcasecmp.c glibc-2.17-c758a686/benchtests/bench-strcasecmp.c +--- glibc-2.17-c758a686/benchtests/bench-strcasecmp.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strcasecmp.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,176 @@ ++/* Measure strcasecmp functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <ctype.h> ++#define TEST_MAIN ++#define TEST_NAME "strcasecmp" ++#include "bench-string.h" ++ ++typedef int (*proto_t) (const char *, const char *); ++static int simple_strcasecmp (const char *, const char *); ++static int stupid_strcasecmp (const char *, const char *); ++ ++IMPL (stupid_strcasecmp, 0) ++IMPL (simple_strcasecmp, 0) ++IMPL (strcasecmp, 1) ++ ++static int ++simple_strcasecmp (const char *s1, const char *s2) ++{ ++ int ret; ++ ++ while ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) == 0 ++ && *s1++) ++ ++s2; ++ return ret; ++} ++ ++static int ++stupid_strcasecmp (const char *s1, const char *s2) ++{ ++ size_t ns1 = strlen (s1) + 1, ns2 = strlen (s2) + 1; ++ size_t n = ns1 < ns2 ? ns1 : ns2; ++ int ret = 0; ++ ++ while (n--) ++ { ++ if ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) != 0) ++ break; ++ ++s1; ++ ++s2; ++ } ++ return ret; ++} ++ ++static void ++do_one_test (impl_t *impl, const char *s1, const char *s2, int exp_result) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ int result = CALL (impl, s1, s2); ++ if ((exp_result == 0 && result != 0) ++ || (exp_result < 0 && result >= 0) ++ || (exp_result > 0 && result <= 0)) ++ { ++ error (0, 0, "Wrong result in function %s %d %d", impl->name, ++ result, exp_result); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, int max_char, ++ int exp_result) ++{ ++ size_t i; ++ char *s1, *s2; ++ ++ if (len == 0) ++ return; ++ ++ align1 &= 7; ++ if (align1 + len + 1 >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len + 1 >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0; i < len; i++) ++ { ++ s1[i] = toupper (1 + 23 * i % max_char); ++ s2[i] = tolower (s1[i]); ++ } ++ ++ s1[len] = s2[len] = 0; ++ s1[len + 1] = 23; ++ s2[len + 1] = 24 + exp_result; ++ if ((s2[len - 1] == 'z' && exp_result == -1) ++ || (s2[len - 1] == 'a' && exp_result == 1)) ++ s1[len - 1] += exp_result; ++ else ++ s2[len - 1] -= exp_result; ++ ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, exp_result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 16; ++i) ++ { ++ do_test (i, i, i, 127, 0); ++ do_test (i, i, i, 127, 1); ++ do_test (i, i, i, 127, -1); ++ } ++ ++ for (i = 1; i < 10; ++i) ++ { ++ do_test (0, 0, 2 << i, 127, 0); ++ do_test (0, 0, 2 << i, 254, 0); ++ do_test (0, 0, 2 << i, 127, 1); ++ do_test (0, 0, 2 << i, 254, 1); ++ do_test (0, 0, 2 << i, 127, -1); ++ do_test (0, 0, 2 << i, 254, -1); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, 8 << i, 127, 0); ++ do_test (2 * i, i, 8 << i, 254, 0); ++ do_test (i, 2 * i, 8 << i, 127, 1); ++ do_test (2 * i, i, 8 << i, 254, 1); ++ do_test (i, 2 * i, 8 << i, 127, -1); ++ do_test (2 * i, i, 8 << i, 254, -1); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strcasestr.c glibc-2.17-c758a686/benchtests/bench-strcasestr.c +--- glibc-2.17-c758a686/benchtests/bench-strcasestr.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strcasestr.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,180 @@ ++/* Measure strcasestr functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strcasestr" ++#include "bench-string.h" ++ ++ ++#define STRCASESTR simple_strcasestr ++#define NO_ALIAS ++#define __strncasecmp strncasecmp ++#include "../string/strcasestr.c" ++ ++ ++static char * ++stupid_strcasestr (const char *s1, const char *s2) ++{ ++ ssize_t s1len = strlen (s1); ++ ssize_t s2len = strlen (s2); ++ ++ if (s2len > s1len) ++ return NULL; ++ ++ for (ssize_t i = 0; i <= s1len - s2len; ++i) ++ { ++ size_t j; ++ for (j = 0; j < s2len; ++j) ++ if (tolower (s1[i + j]) != tolower (s2[j])) ++ break; ++ if (j == s2len) ++ return (char *) s1 + i; ++ } ++ ++ return NULL; ++} ++ ++ ++typedef char *(*proto_t) (const char *, const char *); ++ ++IMPL (stupid_strcasestr, 0) ++IMPL (simple_strcasestr, 0) ++IMPL (strcasestr, 1) ++ ++ ++static void ++do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++ ++static void ++do_test (size_t align1, size_t align2, size_t len1, size_t len2, ++ int fail) ++{ ++ char *s1 = (char *) (buf1 + align1); ++ char *s2 = (char *) (buf2 + align2); ++ ++ static const char d[] = "1234567890abcxyz"; ++#define dl (sizeof (d) - 1) ++ char *ss2 = s2; ++ for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ ss2 = mempcpy (ss2, d, t); ++ } ++ s2[len2] = '\0'; ++ ++ if (fail) ++ { ++ char *ss1 = s1; ++ for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ memcpy (ss1, d, t); ++ ++ss1[len2 > 7 ? 7 : len2 - 1]; ++ ss1 += t; ++ } ++ } ++ else ++ { ++ memset (s1, '0', len1); ++ for (size_t i = 0; i < len2; ++i) ++ s1[len1 - len2 + i] = toupper (s2[i]); ++ } ++ s1[len1] = '\0'; ++ ++ printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", ++ len1, len2, align1, align2, fail ? "fail" : "found"); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); ++ ++ putchar ('\n'); ++} ++ ++static int ++test_main (void) ++{ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (size_t klen = 2; klen < 32; ++klen) ++ for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) ++ { ++ do_test (0, 0, hlen, klen, 0); ++ do_test (0, 0, hlen, klen, 1); ++ do_test (0, 3, hlen, klen, 0); ++ do_test (0, 3, hlen, klen, 1); ++ do_test (0, 9, hlen, klen, 0); ++ do_test (0, 9, hlen, klen, 1); ++ do_test (0, 15, hlen, klen, 0); ++ do_test (0, 15, hlen, klen, 1); ++ ++ do_test (3, 0, hlen, klen, 0); ++ do_test (3, 0, hlen, klen, 1); ++ do_test (3, 3, hlen, klen, 0); ++ do_test (3, 3, hlen, klen, 1); ++ do_test (3, 9, hlen, klen, 0); ++ do_test (3, 9, hlen, klen, 1); ++ do_test (3, 15, hlen, klen, 0); ++ do_test (3, 15, hlen, klen, 1); ++ ++ do_test (9, 0, hlen, klen, 0); ++ do_test (9, 0, hlen, klen, 1); ++ do_test (9, 3, hlen, klen, 0); ++ do_test (9, 3, hlen, klen, 1); ++ do_test (9, 9, hlen, klen, 0); ++ do_test (9, 9, hlen, klen, 1); ++ do_test (9, 15, hlen, klen, 0); ++ do_test (9, 15, hlen, klen, 1); ++ ++ do_test (15, 0, hlen, klen, 0); ++ do_test (15, 0, hlen, klen, 1); ++ do_test (15, 3, hlen, klen, 0); ++ do_test (15, 3, hlen, klen, 1); ++ do_test (15, 9, hlen, klen, 0); ++ do_test (15, 9, hlen, klen, 1); ++ do_test (15, 15, hlen, klen, 0); ++ do_test (15, 15, hlen, klen, 1); ++ } ++ ++ do_test (0, 0, page_size - 1, 16, 0); ++ do_test (0, 0, page_size - 1, 16, 1); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strcat.c glibc-2.17-c758a686/benchtests/bench-strcat.c +--- glibc-2.17-c758a686/benchtests/bench-strcat.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strcat.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,148 @@ ++/* Measure strcat functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strcat" ++#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) ++{ ++ char *ret = dst; ++ while (*dst++ != '\0'); ++ --dst; ++ while ((*dst++ = *src++) != '\0'); ++ return ret; ++} ++ ++static void ++do_one_test (impl_t *impl, char *dst, const char *src) ++{ ++ size_t k = strlen (dst), i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (CALL (impl, dst, src) != dst) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ CALL (impl, dst, src), dst); ++ ret = 1; ++ return; ++ } ++ ++ if (strcmp (dst + k, src) != 0) ++ { ++ error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"", ++ impl->name, dst, src); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ dst[k] = '\0'; ++ CALL (impl, dst, src); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++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; ++ ++ align1 &= 7; ++ if (align1 + len1 >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len1 + len2 >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0; i < len1; ++i) ++ s1[i] = 32 + 23 * i % (max_char - 32); ++ s1[len1] = '\0'; ++ ++ for (i = 0; i < len2; i++) ++ s2[i] = 32 + 23 * i % (max_char - 32); ++ ++ printf ("Length %4zd/%4zd, alignment %2zd/%2zd:", len1, len2, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ { ++ s2[len2] = '\0'; ++ do_one_test (impl, s2, s1); ++ } ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%28s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ 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); ++ } ++ ++ 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); ++ } ++ ++ 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); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strchr.c glibc-2.17-c758a686/benchtests/bench-strchr.c +--- glibc-2.17-c758a686/benchtests/bench-strchr.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strchr.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,200 @@ ++/* Measure STRCHR functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#ifndef WIDE ++# ifdef USE_FOR_STRCHRNUL ++# define TEST_NAME "strchrnul" ++# else ++# define TEST_NAME "strchr" ++# endif ++#else ++# define TEST_NAME "wcschr" ++#endif ++#include "bench-string.h" ++ ++#ifndef WIDE ++# ifdef USE_FOR_STRCHRNUL ++# define STRCHR strchrnul ++# define stupid_STRCHR stupid_STRCHRNUL ++# define simple_STRCHR simple_STRCHRNUL ++# else ++# define STRCHR strchr ++# endif ++# define STRLEN strlen ++# define CHAR char ++# define BIG_CHAR CHAR_MAX ++# define MIDDLE_CHAR 127 ++# define SMALL_CHAR 23 ++# define UCHAR unsigned char ++#else ++# include <wchar.h> ++# define STRCHR wcschr ++# 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 ++ ++#ifdef USE_FOR_STRCHRNUL ++# define NULLRET(endptr) endptr ++#else ++# define NULLRET(endptr) NULL ++#endif ++ ++ ++typedef CHAR *(*proto_t) (const CHAR *, int); ++ ++CHAR * ++simple_STRCHR (const CHAR *s, int c) ++{ ++ for (; *s != (CHAR) c; ++s) ++ if (*s == '\0') ++ return NULLRET ((CHAR *) s); ++ return (CHAR *) s; ++} ++ ++CHAR * ++stupid_STRCHR (const CHAR *s, int c) ++{ ++ size_t n = STRLEN (s) + 1; ++ ++ while (n--) ++ if (*s++ == (CHAR) c) ++ return (CHAR *) s - 1; ++ return NULLRET ((CHAR *) s - 1); ++} ++ ++IMPL (stupid_STRCHR, 0) ++IMPL (simple_STRCHR, 0) ++IMPL (STRCHR, 1) ++ ++static void ++do_one_test (impl_t *impl, const CHAR *s, int c, const CHAR *exp_res) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s, c); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t pos, size_t len, int seek_char, int max_char) ++/* For wcschr: align here means align not in bytes, ++ but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) ++ len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ ++{ ++ size_t i; ++ CHAR *result; ++ CHAR *buf = (CHAR *) buf1; ++ align &= 15; ++ if ((align + len) * sizeof (CHAR) >= page_size) ++ return; ++ ++ for (i = 0; i < len; ++i) ++ { ++ buf[align + i] = 32 + 23 * i % max_char; ++ if (buf[align + i] == seek_char) ++ buf[align + i] = seek_char + 1; ++ else if (buf[align + i] == 0) ++ buf[align + i] = 1; ++ } ++ buf[align + len] = 0; ++ ++ if (pos < len) ++ { ++ buf[align + pos] = seek_char; ++ result = buf + align + pos; ++ } ++ else if (seek_char == 0) ++ result = buf + align + len; ++ else ++ result = NULLRET (buf + align + len); ++ ++ printf ("Length %4zd, alignment in bytes %2zd:", ++ pos, align * sizeof (CHAR)); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, buf + align, seek_char, result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%20s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 16 << i, 2048, SMALL_CHAR, MIDDLE_CHAR); ++ do_test (i, 16 << i, 2048, SMALL_CHAR, MIDDLE_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 64, 256, SMALL_CHAR, MIDDLE_CHAR); ++ do_test (i, 64, 256, SMALL_CHAR, BIG_CHAR); ++ } ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, i, i + 1, SMALL_CHAR, MIDDLE_CHAR); ++ do_test (0, i, i + 1, SMALL_CHAR, BIG_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 16 << i, 2048, 0, MIDDLE_CHAR); ++ do_test (i, 16 << i, 2048, 0, MIDDLE_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 64, 256, 0, MIDDLE_CHAR); ++ do_test (i, 64, 256, 0, BIG_CHAR); ++ } ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, i, i + 1, 0, MIDDLE_CHAR); ++ do_test (0, i, i + 1, 0, BIG_CHAR); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strchrnul.c glibc-2.17-c758a686/benchtests/bench-strchrnul.c +--- glibc-2.17-c758a686/benchtests/bench-strchrnul.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strchrnul.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,20 @@ ++/* Measure strchrnul function. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define USE_FOR_STRCHRNUL 1 ++#include "bench-strchr.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strcmp.c glibc-2.17-c758a686/benchtests/bench-strcmp.c +--- glibc-2.17-c758a686/benchtests/bench-strcmp.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strcmp.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,241 @@ ++/* Measure strcmp and wcscmp functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#ifdef WIDE ++# define TEST_NAME "wcscmp" ++#else ++# define TEST_NAME "strcmp" ++#endif ++#include "bench-string.h" ++ ++#ifdef WIDE ++# include <wchar.h> ++ ++# define L(str) L##str ++# define STRCMP wcscmp ++# define STRCPY wcscpy ++# define STRLEN wcslen ++# define MEMCPY wmemcpy ++# define SIMPLE_STRCMP simple_wcscmp ++# define STUPID_STRCMP stupid_wcscmp ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define CHARBYTES 4 ++# define CHARBYTESLOG 2 ++# define CHARALIGN __alignof__ (CHAR) ++# define MIDCHAR 0x7fffffff ++# define LARGECHAR 0xfffffffe ++# define CHAR__MAX WCHAR_MAX ++# define CHAR__MIN WCHAR_MIN ++ ++/* Wcscmp uses signed semantics for comparison, not unsigned */ ++/* Avoid using substraction since possible overflow */ ++ ++int ++simple_wcscmp (const wchar_t *s1, const wchar_t *s2) ++{ ++ wchar_t c1, c2; ++ do ++ { ++ c1 = *s1++; ++ c2 = *s2++; ++ if (c2 == L'\0') ++ return c1 - c2; ++ } ++ while (c1 == c2); ++ ++ return c1 < c2 ? -1 : 1; ++} ++ ++int ++stupid_wcscmp (const wchar_t *s1, const wchar_t *s2) ++{ ++ size_t ns1 = wcslen (s1) + 1; ++ size_t ns2 = wcslen (s2) + 1; ++ size_t n = ns1 < ns2 ? ns1 : ns2; ++ int ret = 0; ++ ++ wchar_t c1, c2; ++ ++ while (n--) { ++ c1 = *s1++; ++ c2 = *s2++; ++ if ((ret = c1 < c2 ? -1 : c1 == c2 ? 0 : 1) != 0) ++ break; ++ } ++ return ret; ++} ++ ++#else ++# include <limits.h> ++ ++# define L(str) str ++# define STRCMP strcmp ++# define STRCPY strcpy ++# define STRLEN strlen ++# define MEMCPY memcpy ++# define SIMPLE_STRCMP simple_strcmp ++# define STUPID_STRCMP stupid_strcmp ++# define CHAR char ++# define UCHAR unsigned char ++# define CHARBYTES 1 ++# define CHARBYTESLOG 0 ++# define CHARALIGN 1 ++# define MIDCHAR 0x7f ++# define LARGECHAR 0xfe ++# define CHAR__MAX CHAR_MAX ++# define CHAR__MIN CHAR_MIN ++ ++/* Strcmp uses unsigned semantics for comparison. */ ++int ++simple_strcmp (const char *s1, const char *s2) ++{ ++ int ret; ++ ++ while ((ret = *(unsigned char *) s1 - *(unsigned char*) s2++) == 0 && *s1++); ++ return ret; ++} ++ ++int ++stupid_strcmp (const char *s1, const char *s2) ++{ ++ size_t ns1 = strlen (s1) + 1; ++ size_t ns2 = strlen (s2) + 1; ++ size_t n = ns1 < ns2 ? ns1 : ns2; ++ int ret = 0; ++ ++ while (n--) ++ if ((ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) != 0) ++ break; ++ return ret; ++} ++#endif ++ ++typedef int (*proto_t) (const CHAR *, const CHAR *); ++ ++IMPL (STUPID_STRCMP, 1) ++IMPL (SIMPLE_STRCMP, 1) ++IMPL (STRCMP, 1) ++ ++static void ++do_one_test (impl_t *impl, ++ const CHAR *s1, const CHAR *s2, ++ int exp_result) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, int max_char, ++ int exp_result) ++{ ++ size_t i; ++ ++ CHAR *s1, *s2; ++ ++ if (len == 0) ++ return; ++ ++ align1 &= 63; ++ if (align1 + (len + 1) * CHARBYTES >= page_size) ++ return; ++ ++ align2 &= 63; ++ if (align2 + (len + 1) * CHARBYTES >= page_size) ++ return; ++ ++ /* Put them close to the end of page. */ ++ i = align1 + CHARBYTES * (len + 2); ++ s1 = (CHAR *) (buf1 + ((page_size - i) / 16 * 16) + align1); ++ i = align2 + CHARBYTES * (len + 2); ++ s2 = (CHAR *) (buf2 + ((page_size - i) / 16 * 16) + align2); ++ ++ for (i = 0; i < len; i++) ++ s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % max_char; ++ ++ s1[len] = s2[len] = 0; ++ s1[len + 1] = 23; ++ s2[len + 1] = 24 + exp_result; ++ s2[len - 1] -= exp_result; ++ ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, exp_result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 32; ++i) ++ { ++ do_test (CHARBYTES * i, CHARBYTES * i, i, MIDCHAR, 0); ++ do_test (CHARBYTES * i, CHARBYTES * i, i, MIDCHAR, 1); ++ do_test (CHARBYTES * i, CHARBYTES * i, i, MIDCHAR, -1); ++ } ++ ++ for (i = 1; i < 10 + CHARBYTESLOG; ++i) ++ { ++ do_test (0, 0, 2 << i, MIDCHAR, 0); ++ do_test (0, 0, 2 << i, LARGECHAR, 0); ++ do_test (0, 0, 2 << i, MIDCHAR, 1); ++ do_test (0, 0, 2 << i, LARGECHAR, 1); ++ do_test (0, 0, 2 << i, MIDCHAR, -1); ++ do_test (0, 0, 2 << i, LARGECHAR, -1); ++ do_test (0, CHARBYTES * i, 2 << i, MIDCHAR, 1); ++ do_test (CHARBYTES * i, CHARBYTES * (i + 1), 2 << i, LARGECHAR, 1); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (CHARBYTES * i, 2 * CHARBYTES * i, 8 << i, MIDCHAR, 0); ++ do_test (2 * CHARBYTES * i, CHARBYTES * i, 8 << i, LARGECHAR, 0); ++ do_test (CHARBYTES * i, 2 * CHARBYTES * i, 8 << i, MIDCHAR, 1); ++ do_test (2 * CHARBYTES * i, CHARBYTES * i, 8 << i, LARGECHAR, 1); ++ do_test (CHARBYTES * i, 2 * CHARBYTES * i, 8 << i, MIDCHAR, -1); ++ do_test (2 * CHARBYTES * i, CHARBYTES * i, 8 << i, LARGECHAR, -1); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strcpy.c glibc-2.17-c758a686/benchtests/bench-strcpy.c +--- glibc-2.17-c758a686/benchtests/bench-strcpy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strcpy.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,193 @@ ++/* Measure strcpy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifdef WIDE ++# include <wchar.h> ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define sfmt "ls" ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++# define STRCMP wcscmp ++# define MEMCMP wmemcmp ++# define MEMSET wmemset ++#else ++# define CHAR char ++# define UCHAR unsigned char ++# define sfmt "s" ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++# define STRCMP strcmp ++# define MEMCMP memcmp ++# define MEMSET memset ++#endif ++ ++#ifndef STRCPY_RESULT ++# define STRCPY_RESULT(dst, len) dst ++# define TEST_MAIN ++# ifndef WIDE ++# define TEST_NAME "strcpy" ++# else ++# define TEST_NAME "wcscpy" ++# endif ++# include "bench-string.h" ++# ifndef WIDE ++# define SIMPLE_STRCPY simple_strcpy ++# define STRCPY strcpy ++# else ++# define SIMPLE_STRCPY simple_wcscpy ++# define STRCPY wcscpy ++# endif ++ ++CHAR *SIMPLE_STRCPY (CHAR *, const CHAR *); ++ ++IMPL (SIMPLE_STRCPY, 0) ++IMPL (STRCPY, 1) ++ ++CHAR * ++SIMPLE_STRCPY (CHAR *dst, const CHAR *src) ++{ ++ CHAR *ret = dst; ++ while ((*dst++ = *src++) != '\0'); ++ return ret; ++} ++#endif ++ ++typedef CHAR *(*proto_t) (CHAR *, const CHAR *); ++ ++static void ++do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, ++ size_t len __attribute__((unused))) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (CALL (impl, dst, src) != STRCPY_RESULT (dst, len)) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ CALL (impl, dst, src), STRCPY_RESULT (dst, len)); ++ ret = 1; ++ return; ++ } ++ ++ if (STRCMP (dst, src) != 0) ++ { ++ error (0, 0, ++ "Wrong result in function %s dst \"%" sfmt "\" src \"%" sfmt "\"", ++ impl->name, dst, src); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, dst, src); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, int max_char) ++{ ++ size_t i; ++ CHAR *s1, *s2; ++/* For wcscpy: align1 and align2 here mean alignment not in bytes, ++ but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) ++ len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ ++ align1 &= 7; ++ if ((align1 + len) * sizeof(CHAR) >= page_size) ++ return; ++ ++ align2 &= 7; ++ if ((align2 + len) * sizeof(CHAR) >= page_size) ++ return; ++ ++ 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; ++ ++ printf ("Length %4zd, alignments in bytes %2zd/%2zd:", len, align1 * sizeof(CHAR), align2 * sizeof(CHAR)); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s2, s1, len); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 0; i < 16; ++i) ++ { ++ do_test (0, 0, i, SMALL_CHAR); ++ do_test (0, 0, i, BIG_CHAR); ++ do_test (0, i, i, SMALL_CHAR); ++ do_test (i, 0, i, BIG_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, SMALL_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, 8 << i, SMALL_CHAR); ++ do_test (2 * i, i, 8 << i, BIG_CHAR); ++ do_test (i, i, 8 << i, SMALL_CHAR); ++ do_test (i, i, 8 << i, BIG_CHAR); ++ } ++ ++ for (i = 16; i <= 512; i+=4) ++ { ++ do_test (0, 4, i, SMALL_CHAR); ++ do_test (4, 0, i, BIG_CHAR); ++ do_test (4, 4, i, SMALL_CHAR); ++ do_test (2, 2, i, BIG_CHAR); ++ do_test (2, 6, i, SMALL_CHAR); ++ do_test (6, 2, i, BIG_CHAR); ++ do_test (1, 7, i, SMALL_CHAR); ++ do_test (7, 1, i, BIG_CHAR); ++ do_test (3, 4, i, SMALL_CHAR); ++ do_test (4, 3, i, BIG_CHAR); ++ do_test (5, 7, i, SMALL_CHAR); ++ do_test (7, 5, i, SMALL_CHAR); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strcpy_chk.c glibc-2.17-c758a686/benchtests/bench-strcpy_chk.c +--- glibc-2.17-c758a686/benchtests/bench-strcpy_chk.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strcpy_chk.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,243 @@ ++/* Measure __strcpy_chk functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef STRCPY_RESULT ++# define STRCPY_RESULT(dst, len) dst ++# define TEST_MAIN ++# define TEST_NAME "strcpy_chk" ++# include "bench-string.h" ++ ++/* This test case implicitly tests the availability of the __chk_fail ++ symbol, which is part of the public ABI and may be used ++ externally. */ ++extern void __attribute__ ((noreturn)) __chk_fail (void); ++char *simple_strcpy_chk (char *, const char *, size_t); ++extern char *normal_strcpy (char *, const char *, size_t) ++ __asm ("strcpy"); ++extern char *__strcpy_chk (char *, const char *, size_t); ++ ++IMPL (simple_strcpy_chk, 0) ++IMPL (normal_strcpy, 1) ++IMPL (__strcpy_chk, 2) ++ ++char * ++simple_strcpy_chk (char *dst, const char *src, size_t len) ++{ ++ char *ret = dst; ++ if (! len) ++ __chk_fail (); ++ while ((*dst++ = *src++) != '\0') ++ if (--len == 0) ++ __chk_fail (); ++ return ret; ++} ++#endif ++ ++#include <fcntl.h> ++#include <paths.h> ++#include <setjmp.h> ++#include <signal.h> ++ ++static int test_main (void); ++#include "../test-skeleton.c" ++ ++volatile int chk_fail_ok; ++jmp_buf chk_fail_buf; ++ ++static void ++handler (int sig) ++{ ++ if (chk_fail_ok) ++ { ++ chk_fail_ok = 0; ++ longjmp (chk_fail_buf, 1); ++ } ++ else ++ _exit (127); ++} ++ ++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 dlen) ++{ ++ char *res; ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (dlen <= len) ++ { ++ if (impl->test == 1) ++ return; ++ ++ chk_fail_ok = 1; ++ if (setjmp (chk_fail_buf) == 0) ++ { ++ res = CALL (impl, dst, src, dlen); ++ printf ("*** Function %s (%zd; %zd) did not __chk_fail\n", ++ impl->name, len, dlen); ++ chk_fail_ok = 0; ++ ret = 1; ++ } ++ return; ++ } ++ else ++ res = CALL (impl, dst, src, dlen); ++ ++ if (res != STRCPY_RESULT (dst, len)) ++ { ++ printf ("Wrong result in function %s %p %p\n", impl->name, ++ res, STRCPY_RESULT (dst, len)); ++ ret = 1; ++ return; ++ } ++ ++ if (strcmp (dst, src) != 0) ++ { ++ printf ("Wrong result in function %s dst \"%s\" src \"%s\"\n", ++ impl->name, dst, src); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, dst, src, dlen); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, size_t dlen, int max_char) ++{ ++ size_t i; ++ char *s1, *s2; ++ ++ align1 &= 7; ++ if (align1 + len >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len >= page_size) ++ return; ++ ++ 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; ++ ++ if (dlen > len) ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s2, s1, len, dlen); ++ ++ if (dlen > len) ++ putchar ('\n'); ++} ++ ++static int ++test_main (void) ++{ ++ size_t i; ++ ++ set_fortify_handler (handler); ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 0; i < 16; ++i) ++ { ++ do_test (0, 0, i, i + 1, 127); ++ do_test (0, 0, i, i + 1, 255); ++ do_test (0, i, i, i + 1, 127); ++ do_test (i, 0, i, i + 1, 255); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, 8 << i, (8 << i) + 1, 127); ++ do_test (8 - i, 2 * i, (8 << i), (8 << i) + 1, 127); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, (8 << i), (8 << i) + 1, 127); ++ do_test (2 * i, i, (8 << i), (8 << i) + 1, 255); ++ do_test (i, i, (8 << i), (8 << i) + 1, 127); ++ do_test (i, i, (8 << i), (8 << i) + 1, 255); ++ } ++ ++ for (i = 0; i < 16; ++i) ++ { ++ do_test (0, 0, i, i + 256, 127); ++ do_test (0, 0, i, i + 256, 255); ++ do_test (0, i, i, i + 256, 127); ++ do_test (i, 0, i, i + 256, 255); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, 8 << i, (8 << i) + 256, 127); ++ do_test (8 - i, 2 * i, (8 << i), (8 << i) + 256, 127); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, (8 << i), (8 << i) + 256, 127); ++ do_test (2 * i, i, (8 << i), (8 << i) + 256, 255); ++ do_test (i, i, (8 << i), (8 << i) + 256, 127); ++ do_test (i, i, (8 << i), (8 << i) + 256, 255); ++ } ++ ++ for (i = 0; i < 16; ++i) ++ { ++ do_test (0, 0, i, i, 127); ++ do_test (0, 0, i, i + 2, 255); ++ do_test (0, i, i, i + 3, 127); ++ do_test (i, 0, i, i + 4, 255); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, 8 << i, (8 << i) - 15, 127); ++ do_test (8 - i, 2 * i, (8 << i), (8 << i) + 5, 127); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, (8 << i), (8 << i) + i, 127); ++ do_test (2 * i, i, (8 << i), (8 << i) + (i - 1), 255); ++ do_test (i, i, (8 << i), (8 << i) + i + 2, 127); ++ do_test (i, i, (8 << i), (8 << i) + i + 3, 255); ++ } ++ ++ return 0; ++} +diff -urN glibc-2.17-c758a686/benchtests/bench-strcspn.c glibc-2.17-c758a686/benchtests/bench-strcspn.c +--- glibc-2.17-c758a686/benchtests/bench-strcspn.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strcspn.c 2015-06-20 21:22:16.298458075 -0400 +@@ -0,0 +1,59 @@ ++/* Measure strcspn functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define STRPBRK_RESULT(s, pos) (pos) ++#define RES_TYPE size_t ++#define TEST_MAIN ++#define TEST_NAME "strcspn" ++#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 *); ++ ++IMPL (stupid_strcspn, 0) ++IMPL (simple_strcspn, 0) ++IMPL (strcspn, 1) ++ ++size_t ++simple_strcspn (const char *s, const char *rej) ++{ ++ const char *r, *str = s; ++ char c; ++ ++ while ((c = *s++) != '\0') ++ for (r = rej; *r != '\0'; ++r) ++ if (*r == c) ++ return s - str - 1; ++ return s - str - 1; ++} ++ ++size_t ++stupid_strcspn (const char *s, const char *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 i; ++ return i; ++} ++ ++#include "bench-strpbrk.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-string.h glibc-2.17-c758a686/benchtests/bench-string.h +--- glibc-2.17-c758a686/benchtests/bench-string.h 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-string.h 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,201 @@ ++/* Measure string and memory functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <sys/cdefs.h> ++ ++typedef struct ++{ ++ const char *name; ++ void (*fn) (void); ++ long test; ++} impl_t; ++extern impl_t __start_impls[], __stop_impls[]; ++ ++#define IMPL(name, test) \ ++ impl_t tst_ ## name \ ++ __attribute__ ((section ("impls"), aligned (sizeof (void *)))) \ ++ = { __STRING (name), (void (*) (void))name, test }; ++ ++#ifdef TEST_MAIN ++ ++# ifndef _GNU_SOURCE ++# define _GNU_SOURCE ++# endif ++ ++# undef __USE_STRING_INLINES ++ ++# include <stdio.h> ++# include <stdlib.h> ++# include <string.h> ++# include <sys/mman.h> ++# include <sys/param.h> ++# include <unistd.h> ++# include <fcntl.h> ++# include <error.h> ++# include <errno.h> ++# include <time.h> ++# include <ifunc-impl-list.h> ++# define GL(x) _##x ++# define GLRO(x) _##x ++# include "bench-timing.h" ++ ++ ++# define TEST_FUNCTION test_main () ++# define TIMEOUT (4 * 60) ++# define OPT_ITERATIONS 10000 ++# define OPT_RANDOM 10001 ++# define OPT_SEED 10002 ++ ++# define INNER_LOOP_ITERS 64 ++ ++unsigned char *buf1, *buf2; ++int ret, do_srandom; ++unsigned int seed; ++size_t page_size; ++ ++# ifndef ITERATIONS ++size_t iterations = 100000; ++# define ITERATIONS_OPTIONS \ ++ { "iterations", required_argument, NULL, OPT_ITERATIONS }, ++# define ITERATIONS_PROCESS \ ++ case OPT_ITERATIONS: \ ++ iterations = strtoul (optarg, NULL, 0); \ ++ break; ++# define ITERATIONS iterations ++# else ++# define ITERATIONS_OPTIONS ++# define ITERATIONS_PROCESS ++# endif ++ ++# define CMDLINE_OPTIONS ITERATIONS_OPTIONS \ ++ { "random", no_argument, NULL, OPT_RANDOM }, \ ++ { "seed", required_argument, NULL, OPT_SEED }, ++# define CMDLINE_PROCESS ITERATIONS_PROCESS \ ++ case OPT_RANDOM: \ ++ { \ ++ int fdr = open ("/dev/urandom", O_RDONLY); \ ++ \ ++ if (fdr < 0 || read (fdr, &seed, sizeof(seed)) != sizeof (seed)) \ ++ seed = time (NULL); \ ++ if (fdr >= 0) \ ++ close (fdr); \ ++ do_srandom = 1; \ ++ break; \ ++ } \ ++ \ ++ case OPT_SEED: \ ++ seed = strtoul (optarg, NULL, 0); \ ++ do_srandom = 1; \ ++ break; ++ ++# define CALL(impl, ...) \ ++ (* (proto_t) (impl)->fn) (__VA_ARGS__) ++ ++# ifdef TEST_NAME ++/* Increase size of FUNC_LIST if assert is triggered at run-time. */ ++static struct libc_ifunc_impl func_list[32]; ++static int func_count; ++static int impl_count = -1; ++static impl_t *impl_array; ++ ++# define FOR_EACH_IMPL(impl, notall) \ ++ impl_t *impl; \ ++ int count; \ ++ if (impl_count == -1) \ ++ { \ ++ impl_count = 0; \ ++ if (func_count != 0) \ ++ { \ ++ int f; \ ++ impl_t *skip = NULL, *a; \ ++ for (impl = __start_impls; impl < __stop_impls; ++impl) \ ++ if (strcmp (impl->name, TEST_NAME) == 0) \ ++ skip = impl; \ ++ else \ ++ impl_count++; \ ++ a = impl_array = malloc ((impl_count + func_count) * \ ++ sizeof (impl_t)); \ ++ for (impl = __start_impls; impl < __stop_impls; ++impl) \ ++ if (impl != skip) \ ++ *a++ = *impl; \ ++ for (f = 0; f < func_count; f++) \ ++ if (func_list[f].usable) \ ++ { \ ++ a->name = func_list[f].name; \ ++ a->fn = func_list[f].fn; \ ++ a->test = 1; \ ++ a++; \ ++ } \ ++ impl_count = a - impl_array; \ ++ } \ ++ else \ ++ { \ ++ impl_count = __stop_impls - __start_impls; \ ++ impl_array = __start_impls; \ ++ } \ ++ } \ ++ impl = impl_array; \ ++ for (count = 0; count < impl_count; ++count, ++impl) \ ++ if (!notall || impl->test) ++# else /* !TEST_NAME */ ++# define FOR_EACH_IMPL(impl, notall) \ ++ for (impl_t *impl = __start_impls; impl < __stop_impls; ++impl) \ ++ if (!notall || impl->test) ++# endif /* !TEST_NAME */ ++ ++# ifndef BUF1PAGES ++# define BUF1PAGES 1 ++# endif ++ ++static void ++test_init (void) ++{ ++# ifdef TEST_NAME ++ func_count = __libc_ifunc_impl_list (TEST_NAME, func_list, ++ (sizeof func_list ++ / sizeof func_list[0])); ++# endif ++ ++ page_size = 2 * getpagesize (); ++# ifdef MIN_PAGE_SIZE ++ if (page_size < MIN_PAGE_SIZE) ++ page_size = MIN_PAGE_SIZE; ++# endif ++ buf1 = mmap (0, (BUF1PAGES + 1) * page_size, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANON, -1, 0); ++ if (buf1 == MAP_FAILED) ++ error (EXIT_FAILURE, errno, "mmap failed"); ++ if (mprotect (buf1 + BUF1PAGES * page_size, page_size, PROT_NONE)) ++ error (EXIT_FAILURE, errno, "mprotect failed"); ++ buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANON, -1, 0); ++ if (buf2 == MAP_FAILED) ++ error (EXIT_FAILURE, errno, "mmap failed"); ++ if (mprotect (buf2 + page_size, page_size, PROT_NONE)) ++ error (EXIT_FAILURE, errno, "mprotect failed"); ++ if (do_srandom) ++ { ++ printf ("Setting seed to 0x%x\n", seed); ++ srandom (seed); ++ } ++ ++ memset (buf1, 0xa5, BUF1PAGES * page_size); ++ memset (buf2, 0x5a, page_size); ++} ++ ++#endif /* TEST_MAIN */ +diff -urN glibc-2.17-c758a686/benchtests/bench-strlen.c glibc-2.17-c758a686/benchtests/bench-strlen.c +--- glibc-2.17-c758a686/benchtests/bench-strlen.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strlen.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,142 @@ ++/* Measure STRLEN functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#ifndef WIDE ++# define TEST_NAME "strlen" ++#else ++# define TEST_NAME "wcslen" ++#endif ++#include "bench-string.h" ++ ++#ifndef WIDE ++# define STRLEN strlen ++# define CHAR char ++# define MAX_CHAR CHAR_MAX ++#else ++# include <wchar.h> ++# define STRLEN wcslen ++# define CHAR wchar_t ++# define MAX_CHAR WCHAR_MAX ++#endif ++ ++typedef size_t (*proto_t) (const CHAR *); ++ ++size_t ++simple_STRLEN (const CHAR *s) ++{ ++ const CHAR *p; ++ ++ for (p = s; *p; ++p); ++ return p - s; ++} ++ ++#ifndef WIDE ++size_t ++builtin_strlen (const CHAR *p) ++{ ++ return __builtin_strlen (p); ++} ++IMPL (builtin_strlen, 0) ++#endif ++ ++IMPL (simple_STRLEN, 0) ++IMPL (STRLEN, 1) ++ ++ ++static void ++do_one_test (impl_t *impl, const CHAR *s, size_t exp_len) ++{ ++ size_t len = CALL (impl, s), i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (len != exp_len) ++ { ++ error (0, 0, "Wrong result in function %s %zd %zd", impl->name, ++ len, exp_len); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t len) ++{ ++ size_t i; ++ ++ align &= 63; ++ if (align + sizeof(CHAR) * len >= page_size) ++ return; ++ ++ CHAR *buf = (CHAR *) (buf1); ++ ++ for (i = 0; i < len; ++i) ++ buf[align + i] = 1 + 11111 * i % MAX_CHAR; ++ buf[align + len] = 0; ++ ++ printf ("Length %4zd, alignment %2zd:", len, align); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, (CHAR *) (buf + align), len); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%20s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ /* Checking with only 4 * N alignments for wcslen, other alignments are wrong for wchar_t type arrays*/ ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (sizeof(CHAR) * i, i); ++ do_test (0, i); ++ } ++ ++ for (i = 2; i <= 12; ++i) ++ { ++ do_test (0, 1 << i); ++ do_test (sizeof(CHAR) * 7, 1 << i); ++ do_test (sizeof(CHAR) * i, 1 << i); ++ do_test (sizeof(CHAR) * i, (size_t)((1 << i) / 1.5)); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strncasecmp.c glibc-2.17-c758a686/benchtests/bench-strncasecmp.c +--- glibc-2.17-c758a686/benchtests/bench-strncasecmp.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strncasecmp.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,207 @@ ++/* Measure strncasecmp functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <ctype.h> ++#define TEST_MAIN ++#define TEST_NAME "strncasecmp" ++#include "bench-string.h" ++ ++typedef int (*proto_t) (const char *, const char *, size_t); ++static int simple_strncasecmp (const char *, const char *, size_t); ++static int stupid_strncasecmp (const char *, const char *, size_t); ++ ++IMPL (stupid_strncasecmp, 0) ++IMPL (simple_strncasecmp, 0) ++IMPL (strncasecmp, 1) ++ ++static int ++simple_strncasecmp (const char *s1, const char *s2, size_t n) ++{ ++ int ret; ++ ++ if (n == 0) ++ return 0; ++ ++ while ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) == 0 ++ && *s1++) ++ { ++ if (--n == 0) ++ return 0; ++ ++s2; ++ } ++ return ret; ++} ++ ++static int ++stupid_strncasecmp (const char *s1, const char *s2, size_t max) ++{ ++ size_t ns1 = strlen (s1) + 1; ++ size_t ns2 = strlen (s2) + 1; ++ size_t n = ns1 < ns2 ? ns1 : ns2; ++ if (n > max) ++ n = max; ++ int ret = 0; ++ ++ while (n--) ++ { ++ if ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) != 0) ++ break; ++ ++s1; ++ ++s2; ++ } ++ return ret; ++} ++ ++static void ++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; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2, n); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t n, size_t len, int max_char, ++ int exp_result) ++{ ++ size_t i; ++ char *s1, *s2; ++ ++ if (len == 0) ++ return; ++ ++ align1 &= 7; ++ if (align1 + len + 1 >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len + 1 >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0; i < len; i++) ++ { ++ s1[i] = toupper (1 + 23 * i % max_char); ++ s2[i] = tolower (s1[i]); ++ } ++ ++ s1[len] = s2[len] = 0; ++ s1[len + 1] = 23; ++ s2[len + 1] = 24 + exp_result; ++ if ((s2[len - 1] == 'z' && exp_result == -1) ++ || (s2[len - 1] == 'a' && exp_result == 1)) ++ s1[len - 1] += exp_result; ++ else ++ s2[len - 1] -= exp_result; ++ ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, n, exp_result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 16; ++i) ++ { ++ do_test (i, i, i - 1, i, 127, 0); ++ ++ do_test (i, i, i, i, 127, 0); ++ do_test (i, i, i, i, 127, 1); ++ do_test (i, i, i, i, 127, -1); ++ ++ do_test (i, i, i + 1, i, 127, 0); ++ do_test (i, i, i + 1, i, 127, 1); ++ do_test (i, i, i + 1, i, 127, -1); ++ } ++ ++ for (i = 1; i < 10; ++i) ++ { ++ do_test (0, 0, (2 << i) - 1, 2 << i, 127, 0); ++ do_test (0, 0, 2 << i, 2 << i, 254, 0); ++ do_test (0, 0, (2 << i) + 1, 2 << i, 127, 0); ++ ++ do_test (0, 0, (2 << i) + 1, 2 << i, 254, 0); ++ ++ do_test (0, 0, 2 << i, 2 << i, 127, 1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 127, 1); ++ ++ do_test (0, 0, 2 << i, 2 << i, 254, 1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 254, 1); ++ ++ do_test (0, 0, 2 << i, 2 << i, 127, -1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 127, -1); ++ ++ do_test (0, 0, 2 << i, 2 << i, 254, -1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 254, -1); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, (8 << i) - 1, 8 << i, 127, 0); ++ do_test (i, 2 * i, 8 << i, 8 << i, 127, 0); ++ do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, 0); ++ ++ do_test (2 * i, i, (8 << i) - 1, 8 << i, 254, 0); ++ do_test (2 * i, i, 8 << i, 8 << i, 254, 0); ++ do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, 0); ++ ++ do_test (i, 2 * i, 8 << i, 8 << i, 127, 1); ++ do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, 1); ++ ++ do_test (2 * i, i, 8 << i, 8 << i, 254, 1); ++ do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, 1); ++ ++ do_test (i, 2 * i, 8 << i, 8 << i, 127, -1); ++ do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, -1); ++ ++ do_test (2 * i, i, 8 << i, 8 << i, 254, -1); ++ do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, -1); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strncat.c glibc-2.17-c758a686/benchtests/bench-strncat.c +--- glibc-2.17-c758a686/benchtests/bench-strncat.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strncat.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,162 @@ ++/* Measure strncat functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strncat" ++#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) ++{ ++ char *ret = dst; ++ while (*dst++ != '\0'); ++ --dst; ++ while (n--) ++ 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) ++{ ++ size_t k = strlen (dst), i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (CALL (impl, dst, src, n) != dst) ++ { ++ error (0, 0, "Wrong result in function %s %p != %p", impl->name, ++ CALL (impl, dst, src, n), dst); ++ ret = 1; ++ return; ++ } ++ ++ 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", ++ impl->name); ++ ret = 1; ++ return; ++ } ++ if (n < len && dst[k + n] != '\0') ++ { ++ error (0, 0, "There is no zero in the end of output string in %s", ++ impl->name); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ dst[k] = '\0'; ++ CALL (impl, dst, src, n); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++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; ++ ++ align1 &= 7; ++ if (align1 + len1 >= page_size) ++ return; ++ if (align1 + n > page_size) ++ return; ++ align2 &= 7; ++ if (align2 + len1 + len2 >= page_size) ++ return; ++ if (align2 + len1 + n > page_size) ++ return; ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0; i < len1; ++i) ++ s1[i] = 32 + 23 * i % (max_char - 32); ++ s1[len1] = '\0'; ++ ++ for (i = 0; i < len2; i++) ++ s2[i] = 32 + 23 * i % (max_char - 32); ++ ++ printf ("Length %4zd/%4zd, alignment %2zd/%2zd, N %4zd:", ++ len1, len2, align1, align2, n); ++ ++ FOR_EACH_IMPL (impl, 0) ++ { ++ s2[len2] = '\0'; ++ do_one_test (impl, s2, s1, n); ++ } ++ ++ putchar ('\n'); ++} ++ ++int ++main (void) ++{ ++ size_t i, n; ++ ++ test_init (); ++ ++ printf ("%28s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ 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); ++ ++ 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); ++ } ++ ++ 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); ++ } ++ } ++ ++ return ret; ++} +diff -urN glibc-2.17-c758a686/benchtests/bench-strncmp.c glibc-2.17-c758a686/benchtests/bench-strncmp.c +--- glibc-2.17-c758a686/benchtests/bench-strncmp.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strncmp.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,239 @@ ++/* Measure strncmp functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strncmp" ++#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); ++ ++IMPL (stupid_strncmp, 0) ++IMPL (simple_strncmp, 0) ++IMPL (strncmp, 1) ++ ++int ++simple_strncmp (const char *s1, const char *s2, size_t n) ++{ ++ int ret = 0; ++ ++ while (n-- && (ret = *(unsigned char *) s1 - * (unsigned char *) s2++) == 0 ++ && *s1++); ++ return ret; ++} ++ ++int ++stupid_strncmp (const char *s1, const char *s2, size_t n) ++{ ++ size_t ns1 = strnlen (s1, n) + 1, ns2 = strnlen (s2, n) + 1; ++ int ret = 0; ++ ++ n = ns1 < n ? ns1 : n; ++ n = ns2 < n ? ns2 : n; ++ while (n-- && (ret = *(unsigned char *) s1++ - * (unsigned char *) s2++) == 0); ++ return ret; ++} ++ ++static void ++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; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2, n); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++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; ++ ++ if (n == 0) ++ { ++ s1 = (char*)(buf1 + page_size); ++ s2 = (char*)(buf2 + page_size); ++ printf ("Length %4zd/%4zd:", len, n); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, n, 0); ++ ++ putchar ('\n'); ++ ++ return; ++ } ++ ++ align1 &= 15; ++ align2 &= 15; ++ align_n = (page_size - n) & 15; ++ ++ s1 = (char*)(buf1 + page_size - n); ++ s2 = (char*)(buf2 + page_size - n); ++ ++ if (align1 < align_n) ++ s1 -= (align_n - align1); ++ ++ if (align2 < align_n) ++ s2 -= (align_n - align2); ++ ++ for (i = 0; i < n; i++) ++ s1[i] = s2[i] = 1 + 23 * i % max_char; ++ ++ if (len < n) ++ { ++ s1[len] = 0; ++ s2[len] = 0; ++ if (exp_result < 0) ++ s2[len] = 32; ++ else if (exp_result > 0) ++ s1[len] = 64; ++ } ++ ++ printf ("Length %4zd/%4zd, alignment %2zd/%2zd:", len, n, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, n, exp_result); ++ ++ putchar ('\n'); ++} ++ ++static void ++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; ++ ++ if (n == 0) ++ return; ++ ++ align1 &= 7; ++ if (align1 + n + 1 >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + n + 1 >= page_size) ++ return; ++ ++ s1 = (char*)(buf1 + align1); ++ s2 = (char*)(buf2 + align2); ++ ++ for (i = 0; i < n; i++) ++ s1[i] = s2[i] = 1 + 23 * i % max_char; ++ ++ s1[n] = 24 + exp_result; ++ s2[n] = 23; ++ s1[len] = 0; ++ s2[len] = 0; ++ if (exp_result < 0) ++ s2[len] = 32; ++ else if (exp_result > 0) ++ s1[len] = 64; ++ if (len >= n) ++ s2[n - 1] -= exp_result; ++ ++ 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); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i =0; i < 16; ++i) ++ { ++ do_test (0, 0, 8, i, 127, 0); ++ do_test (0, 0, 8, i, 127, -1); ++ do_test (0, 0, 8, i, 127, 1); ++ do_test (i, i, 8, i, 127, 0); ++ do_test (i, i, 8, i, 127, 1); ++ do_test (i, i, 8, i, 127, -1); ++ do_test (i, 2 * i, 8, i, 127, 0); ++ do_test (2 * i, i, 8, i, 127, 1); ++ do_test (i, 3 * i, 8, i, 127, -1); ++ do_test (0, 0, 8, i, 255, 0); ++ do_test (0, 0, 8, i, 255, -1); ++ do_test (0, 0, 8, i, 255, 1); ++ do_test (i, i, 8, i, 255, 0); ++ do_test (i, i, 8, i, 255, 1); ++ do_test (i, i, 8, i, 255, -1); ++ do_test (i, 2 * i, 8, i, 255, 0); ++ do_test (2 * i, i, 8, i, 255, 1); ++ do_test (i, 3 * i, 8, i, 255, -1); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, 8 << i, 16 << i, 127, 0); ++ do_test (0, 0, 8 << i, 16 << i, 127, 1); ++ do_test (0, 0, 8 << i, 16 << i, 127, -1); ++ do_test (0, 0, 8 << i, 16 << i, 255, 0); ++ do_test (0, 0, 8 << i, 16 << i, 255, 1); ++ do_test (0, 0, 8 << i, 16 << i, 255, -1); ++ do_test (8 - i, 2 * i, 8 << i, 16 << i, 127, 0); ++ do_test (8 - i, 2 * i, 8 << i, 16 << i, 127, 1); ++ do_test (2 * i, i, 8 << i, 16 << i, 255, 0); ++ do_test (2 * i, i, 8 << i, 16 << i, 255, 1); ++ } ++ ++ do_test_limit (0, 0, 0, 0, 127, 0); ++ do_test_limit (4, 0, 21, 20, 127, 0); ++ do_test_limit (0, 4, 21, 20, 127, 0); ++ do_test_limit (8, 0, 25, 24, 127, 0); ++ do_test_limit (0, 8, 25, 24, 127, 0); ++ ++ for (i = 0; i < 8; ++i) ++ { ++ do_test_limit (0, 0, 17 - i, 16 - i, 127, 0); ++ do_test_limit (0, 0, 17 - i, 16 - i, 255, 0); ++ do_test_limit (0, 0, 15 - i, 16 - i, 127, 0); ++ do_test_limit (0, 0, 15 - i, 16 - i, 127, 1); ++ do_test_limit (0, 0, 15 - i, 16 - i, 127, -1); ++ do_test_limit (0, 0, 15 - i, 16 - i, 255, 0); ++ do_test_limit (0, 0, 15 - i, 16 - i, 255, 1); ++ do_test_limit (0, 0, 15 - i, 16 - i, 255, -1); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strncpy.c glibc-2.17-c758a686/benchtests/bench-strncpy.c +--- glibc-2.17-c758a686/benchtests/bench-strncpy.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strncpy.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,174 @@ ++/* Measure strncpy functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef STRNCPY_RESULT ++# define STRNCPY_RESULT(dst, len, n) dst ++# define TEST_MAIN ++# define TEST_NAME "strncpy" ++# 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) ++{ ++ char *ret = dst; ++ while (n--) ++ if ((*dst++ = *src++) == '\0') ++ { ++ while (n--) ++ *dst++ = '\0'; ++ return ret; ++ } ++ return ret; ++} ++ ++char * ++stupid_strncpy (char *dst, const char *src, size_t n) ++{ ++ size_t nc = strnlen (src, n); ++ size_t i; ++ ++ for (i = 0; i < nc; ++i) ++ dst[i] = src[i]; ++ for (; i < n; ++i) ++ dst[i] = '\0'; ++ return dst; ++} ++#endif ++ ++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) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (CALL (impl, dst, src, n) != STRNCPY_RESULT (dst, len, n)) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ CALL (impl, dst, src, n), dst); ++ ret = 1; ++ return; ++ } ++ ++ if (memcmp (dst, src, len > n ? n : len) != 0) ++ { ++ error (0, 0, "Wrong result in function %s", impl->name); ++ ret = 1; ++ return; ++ } ++ ++ if (n > len) ++ { ++ size_t i; ++ ++ for (i = len; i < n; ++i) ++ if (dst [i] != '\0') ++ { ++ error (0, 0, "Wrong result in function %s", impl->name); ++ ret = 1; ++ return; ++ } ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, dst, src, n); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++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; ++ ++ align1 &= 7; ++ if (align1 + len >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len >= page_size) ++ return; ++ ++ 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) ++ s1[i] = 32 + 32 * i % (max_char - 32); ++ ++ printf ("Length %4zd, n %4zd, alignment %2zd/%2zd:", len, n, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s2, s1, len, n); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%28s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ 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); ++ } ++ ++ 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); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strnlen.c glibc-2.17-c758a686/benchtests/bench-strnlen.c +--- glibc-2.17-c758a686/benchtests/bench-strnlen.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strnlen.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,132 @@ ++/* Measure strlen functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strnlen" ++#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) ++ ++size_t ++simple_strnlen (const char *s, size_t maxlen) ++{ ++ size_t i; ++ ++ for (i = 0; i < maxlen && s[i]; ++i); ++ return i; ++} ++ ++static void ++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; ++ ++ if (len != exp_len) ++ { ++ error (0, 0, "Wrong result in function %s %zd %zd", impl->name, ++ len, exp_len); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s, maxlen); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t len, size_t maxlen, int max_char) ++{ ++ size_t i; ++ ++ align &= 7; ++ if (align + len >= page_size) ++ return; ++ ++ for (i = 0; i < len; ++i) ++ buf1[align + i] = 1 + 7 * i % max_char; ++ buf1[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)); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%20s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ 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); ++ } ++ ++ 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); ++ } ++ ++ for (i = 2; i <= 10; ++i) ++ { ++ do_test (0, 1 << i, 5000, 127); ++ do_test (1, 1 << i, 5000, 127); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ do_test (0, i, 5000, 255); ++ ++ for (i = 1; i < 8; ++i) ++ do_test (i, i, 5000, 255); ++ ++ for (i = 2; i <= 10; ++i) ++ { ++ do_test (0, 1 << i, 5000, 255); ++ do_test (1, 1 << i, 5000, 255); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strpbrk.c glibc-2.17-c758a686/benchtests/bench-strpbrk.c +--- glibc-2.17-c758a686/benchtests/bench-strpbrk.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strpbrk.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,176 @@ ++/* Measure strpbrk functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef STRPBRK_RESULT ++# define STRPBRK_RESULT(s, pos) ((s)[(pos)] ? (s) + (pos) : NULL) ++# define RES_TYPE char * ++# define TEST_MAIN ++# define TEST_NAME "strpbrk" ++# 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) ++{ ++ const char *r; ++ char c; ++ ++ while ((c = *s++) != '\0') ++ for (r = rej; *r != '\0'; ++r) ++ if (*r == c) ++ return (char *) s - 1; ++ return NULL; ++} ++ ++char * ++stupid_strpbrk (const char *s, const char *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 NULL; ++} ++#endif ++ ++static void ++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; ++ timing_t start, stop, cur; ++ ++ if (res != exp_res) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ (void *) res, (void *) exp_res); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s, rej); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t pos, size_t len) ++{ ++ size_t i; ++ int c; ++ RES_TYPE result; ++ char *rej, *s; ++ ++ align &= 7; ++ if (align + pos + 10 >= page_size || len > 240) ++ return; ++ ++ rej = (char *) (buf2 + (random () & 255)); ++ s = (char *) (buf1 + align); ++ ++ for (i = 0; i < len; ++i) ++ { ++ rej[i] = random () & 255; ++ if (!rej[i]) ++ rej[i] = random () & 255; ++ if (!rej[i]) ++ rej[i] = 1 + (random () & 127); ++ } ++ rej[len] = '\0'; ++ for (c = 1; c <= 255; ++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 () & 255; ++ if (strchr (rej, s[i])) ++ s[i] = c; ++ } ++ } ++ s[pos] = rej[random () % (len + 1)]; ++ if (s[pos]) ++ { ++ for (i = pos + 1; i < pos + 10; ++i) ++ s[i] = random () & 255; ++ s[i] = '\0'; ++ } ++ result = STRPBRK_RESULT (s, pos); ++ ++ printf ("Length %4zd, alignment %2zd, rej len %2zd:", pos, align, len); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s, rej, result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%32s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, 512, i); ++ do_test (i, 512, i); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 16 << i, 4); ++ do_test (i, 16 << i, 4); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ do_test (i, 64, 10); ++ ++ for (i = 0; i < 64; ++i) ++ do_test (0, i, 6); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strrchr.c glibc-2.17-c758a686/benchtests/bench-strrchr.c +--- glibc-2.17-c758a686/benchtests/bench-strrchr.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strrchr.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,184 @@ ++/* Measure STRCHR functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#ifdef WIDE ++# define TEST_NAME "wcsrchr" ++#else ++# define TEST_NAME "strrchr" ++#endif ++#include "bench-string.h" ++ ++#ifdef WIDE ++# include <wchar.h> ++# define SIMPLE_STRRCHR simple_wcsrchr ++# define STRRCHR wcsrchr ++# define CHAR wchar_t ++# define UCHAR wchar_t ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++#else ++# define SIMPLE_STRRCHR simple_strrchr ++# define STRRCHR strrchr ++# define CHAR char ++# define UCHAR unsigned char ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++#endif ++ ++typedef CHAR *(*proto_t) (const CHAR *, int); ++CHAR *SIMPLE_STRRCHR (const CHAR *, int); ++ ++IMPL (SIMPLE_STRRCHR, 0) ++IMPL (STRRCHR, 1) ++ ++CHAR * ++SIMPLE_STRRCHR (const CHAR *s, int c) ++{ ++ const CHAR *ret = NULL; ++ ++ for (; *s != '\0'; ++s) ++ if (*s == (CHAR) c) ++ ret = s; ++ ++ return (CHAR *) (c == '\0' ? s : ret); ++} ++ ++static void ++do_one_test (impl_t *impl, const CHAR *s, int c, CHAR *exp_res) ++{ ++ CHAR *res = CALL (impl, s, c); ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ if (res != exp_res) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ res, exp_res); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s, c); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t pos, size_t len, int seek_char, int max_char) ++/* For wcsrchr: align here means align not in bytes, ++ but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) ++ len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ ++{ ++ size_t i; ++ CHAR *result; ++ CHAR *buf = (CHAR *) buf1; ++ ++ align &= 7; ++ if ((align + len) * sizeof (CHAR) >= page_size) ++ return; ++ ++ for (i = 0; i < len; ++i) ++ { ++ buf[align + i] = (random () * random ()) & max_char; ++ if (!buf[align + i]) ++ buf[align + i] = (random () * random ()) & max_char; ++ if (!buf[align + i]) ++ buf[align + i] = 1; ++ if ((i > pos || pos >= len) && buf[align + i] == seek_char) ++ buf[align + i] = seek_char + 10 + (random () & 15); ++ } ++ buf[align + len] = 0; ++ ++ if (pos < len) ++ { ++ buf[align + pos] = seek_char; ++ result = (CHAR *) (buf + align + pos); ++ } ++ else if (seek_char == 0) ++ result = (CHAR *) (buf + align + len); ++ else ++ result = NULL; ++ ++ printf ("Length %4zd, alignment in bytes %2zd:", len, align * sizeof (CHAR)); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, (CHAR *) (buf + align), seek_char, result); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%20s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 16 << i, 2048, 23, SMALL_CHAR); ++ do_test (i, 16 << i, 2048, 23, SMALL_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 64, 256, 23, SMALL_CHAR); ++ do_test (i, 64, 256, 23, BIG_CHAR); ++ } ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, i, i + 1, 23, SMALL_CHAR); ++ do_test (0, i, i + 1, 23, BIG_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 16 << i, 2048, 0, SMALL_CHAR); ++ do_test (i, 16 << i, 2048, 0, SMALL_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 64, 256, 0, SMALL_CHAR); ++ do_test (i, 64, 256, 0, BIG_CHAR); ++ } ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, i, i + 1, 0, SMALL_CHAR); ++ do_test (0, i, i + 1, 0, BIG_CHAR); ++ } ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strsep.c glibc-2.17-c758a686/benchtests/bench-strsep.c +--- glibc-2.17-c758a686/benchtests/bench-strsep.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strsep.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,174 @@ ++/* Measure strsep functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strsep" ++#include "bench-string.h" ++ ++char * ++simple_strsep (char **s1, char *s2) ++{ ++ char *begin; ++ char *s; ++ size_t j = 0; ++ ++ begin = *s1; ++ s = begin; ++ if (begin == NULL) ++ return NULL; ++ ssize_t s2len = strlen (s2); ++ while (*s) ++ { ++ for (j = 0; j < s2len; j++) ++ { ++ if (*s == s2[j]) ++ { ++ s[0] = '\0'; ++ *s1 = s + 1; ++ return begin; ++ } ++ } ++ s++; ++ } ++ *s1 = NULL; ++ return begin; ++} ++ ++typedef char *(*proto_t) (const char **, const char *); ++ ++IMPL (simple_strsep, 0) ++IMPL (strsep, 1) ++ ++static void ++do_one_test (impl_t * impl, const char *s1, const char *s2) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, &s1, s2); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail) ++{ ++ char *s2 = (char *) (buf2 + align2); ++ static const char d[] = "1234567890abcdef"; ++#define dl (sizeof (d) - 1) ++ char *ss2 = s2; ++ for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ ss2 = mempcpy (ss2, d, t); ++ } ++ s2[len2] = '\0'; ++ ++ printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", ++ len1, len2, align1, align2, fail ? "fail" : "found"); ++ ++ FOR_EACH_IMPL (impl, 0) ++ { ++ char *s1 = (char *) (buf1 + align1); ++ if (fail) ++ { ++ char *ss1 = s1; ++ for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ memcpy (ss1, d, t); ++ ++ss1[len2 > 7 ? 7 : len2 - 1]; ++ ss1 += t; ++ } ++ } ++ else ++ { ++ memset (s1, '0', len1); ++ memcpy (s1 + (len1 - len2) - 2, s2, len2); ++ if ((len1 / len2) > 4) ++ memcpy (s1 + (len1 - len2) - (3 * len2), s2, len2); ++ } ++ s1[len1] = '\0'; ++ do_one_test (impl, s1, s2); ++ } ++ putchar ('\n'); ++} ++ ++static int ++test_main (void) ++{ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (size_t klen = 2; klen < 32; ++klen) ++ for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) ++ { ++ do_test (0, 0, hlen, klen, 0); ++ do_test (0, 0, hlen, klen, 1); ++ do_test (0, 3, hlen, klen, 0); ++ do_test (0, 3, hlen, klen, 1); ++ do_test (0, 9, hlen, klen, 0); ++ do_test (0, 9, hlen, klen, 1); ++ do_test (0, 15, hlen, klen, 0); ++ do_test (0, 15, hlen, klen, 1); ++ ++ do_test (3, 0, hlen, klen, 0); ++ do_test (3, 0, hlen, klen, 1); ++ do_test (3, 3, hlen, klen, 0); ++ do_test (3, 3, hlen, klen, 1); ++ do_test (3, 9, hlen, klen, 0); ++ do_test (3, 9, hlen, klen, 1); ++ do_test (3, 15, hlen, klen, 0); ++ do_test (3, 15, hlen, klen, 1); ++ ++ do_test (9, 0, hlen, klen, 0); ++ do_test (9, 0, hlen, klen, 1); ++ do_test (9, 3, hlen, klen, 0); ++ do_test (9, 3, hlen, klen, 1); ++ do_test (9, 9, hlen, klen, 0); ++ do_test (9, 9, hlen, klen, 1); ++ do_test (9, 15, hlen, klen, 0); ++ do_test (9, 15, hlen, klen, 1); ++ ++ do_test (15, 0, hlen, klen, 0); ++ do_test (15, 0, hlen, klen, 1); ++ do_test (15, 3, hlen, klen, 0); ++ do_test (15, 3, hlen, klen, 1); ++ do_test (15, 9, hlen, klen, 0); ++ do_test (15, 9, hlen, klen, 1); ++ do_test (15, 15, hlen, klen, 0); ++ do_test (15, 15, hlen, klen, 1); ++ } ++ do_test (0, 0, page_size - 1, 16, 0); ++ do_test (0, 0, page_size - 1, 16, 1); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strspn.c glibc-2.17-c758a686/benchtests/bench-strspn.c +--- glibc-2.17-c758a686/benchtests/bench-strspn.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strspn.c 2015-06-20 21:22:16.299458044 -0400 +@@ -0,0 +1,167 @@ ++/* Measure strspn functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strspn" ++#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) ++ ++size_t ++simple_strspn (const char *s, const char *acc) ++{ ++ const char *r, *str = s; ++ char c; ++ ++ while ((c = *s++) != '\0') ++ { ++ for (r = acc; *r != '\0'; ++r) ++ if (*r == c) ++ break; ++ if (*r == '\0') ++ return s - str - 1; ++ } ++ return s - str - 1; ++} ++ ++size_t ++stupid_strspn (const char *s, const char *acc) ++{ ++ size_t ns = strlen (s), nacc = strlen (acc); ++ size_t i, j; ++ ++ for (i = 0; i < ns; ++i) ++ { ++ for (j = 0; j < nacc; ++j) ++ if (s[i] == acc[j]) ++ break; ++ if (j == nacc) ++ return i; ++ } ++ return i; ++} ++ ++static void ++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; ++ ++ if (res != exp_res) ++ { ++ error (0, 0, "Wrong result in function %s %p %p", impl->name, ++ (void *) res, (void *) exp_res); ++ ret = 1; ++ return; ++ } ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s, acc); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++static void ++do_test (size_t align, size_t pos, size_t len) ++{ ++ size_t i; ++ char *acc, *s; ++ ++ align &= 7; ++ if (align + pos + 10 >= page_size || len > 240 || ! len) ++ return; ++ ++ acc = (char *) (buf2 + (random () & 255)); ++ s = (char *) (buf1 + align); ++ ++ for (i = 0; i < len; ++i) ++ { ++ acc[i] = random () & 255; ++ if (!acc[i]) ++ acc[i] = random () & 255; ++ if (!acc[i]) ++ acc[i] = 1 + (random () & 127); ++ } ++ 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] = '\0'; ++ else ++ { ++ for (i = pos + 1; i < pos + 10; ++i) ++ s[i] = random () & 255; ++ s[i] = '\0'; ++ } ++ ++ printf ("Length %4zd, alignment %2zd, acc len %2zd:", pos, align, len); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s, acc, pos); ++ ++ putchar ('\n'); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%32s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 0; i < 32; ++i) ++ { ++ do_test (0, 512, i); ++ do_test (i, 512, i); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 16 << i, 4); ++ do_test (i, 16 << i, 4); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ do_test (i, 64, 10); ++ ++ for (i = 0; i < 64; ++i) ++ do_test (0, i, 6); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strstr.c glibc-2.17-c758a686/benchtests/bench-strstr.c +--- glibc-2.17-c758a686/benchtests/bench-strstr.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strstr.c 2015-06-20 21:22:16.300458014 -0400 +@@ -0,0 +1,177 @@ ++/* Measure strstr functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strstr" ++#include "bench-string.h" ++ ++ ++#define STRSTR simple_strstr ++#include "../string/strstr.c" ++ ++ ++static char * ++stupid_strstr (const char *s1, const char *s2) ++{ ++ ssize_t s1len = strlen (s1); ++ ssize_t s2len = strlen (s2); ++ ++ if (s2len > s1len) ++ return NULL; ++ ++ for (ssize_t i = 0; i <= s1len - s2len; ++i) ++ { ++ size_t j; ++ for (j = 0; j < s2len; ++j) ++ if (s1[i + j] != s2[j]) ++ break; ++ if (j == s2len) ++ return (char *) s1 + i; ++ } ++ ++ return NULL; ++} ++ ++ ++typedef char *(*proto_t) (const char *, const char *); ++ ++IMPL (stupid_strstr, 0) ++IMPL (simple_strstr, 0) ++IMPL (strstr, 1) ++ ++ ++static void ++do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++} ++ ++ ++static void ++do_test (size_t align1, size_t align2, size_t len1, size_t len2, ++ int fail) ++{ ++ char *s1 = (char *) (buf1 + align1); ++ char *s2 = (char *) (buf2 + align2); ++ ++ static const char d[] = "1234567890abcdef"; ++#define dl (sizeof (d) - 1) ++ char *ss2 = s2; ++ for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ ss2 = mempcpy (ss2, d, t); ++ } ++ s2[len2] = '\0'; ++ ++ if (fail) ++ { ++ char *ss1 = s1; ++ for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ memcpy (ss1, d, t); ++ ++ss1[len2 > 7 ? 7 : len2 - 1]; ++ ss1 += t; ++ } ++ } ++ else ++ { ++ memset (s1, '0', len1); ++ memcpy (s1 + len1 - len2, s2, len2); ++ } ++ s1[len1] = '\0'; ++ ++ printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", ++ len1, len2, align1, align2, fail ? "fail" : "found"); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); ++ ++ putchar ('\n'); ++} ++ ++static int ++test_main (void) ++{ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (size_t klen = 2; klen < 32; ++klen) ++ for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) ++ { ++ do_test (0, 0, hlen, klen, 0); ++ do_test (0, 0, hlen, klen, 1); ++ do_test (0, 3, hlen, klen, 0); ++ do_test (0, 3, hlen, klen, 1); ++ do_test (0, 9, hlen, klen, 0); ++ do_test (0, 9, hlen, klen, 1); ++ do_test (0, 15, hlen, klen, 0); ++ do_test (0, 15, hlen, klen, 1); ++ ++ do_test (3, 0, hlen, klen, 0); ++ do_test (3, 0, hlen, klen, 1); ++ do_test (3, 3, hlen, klen, 0); ++ do_test (3, 3, hlen, klen, 1); ++ do_test (3, 9, hlen, klen, 0); ++ do_test (3, 9, hlen, klen, 1); ++ do_test (3, 15, hlen, klen, 0); ++ do_test (3, 15, hlen, klen, 1); ++ ++ do_test (9, 0, hlen, klen, 0); ++ do_test (9, 0, hlen, klen, 1); ++ do_test (9, 3, hlen, klen, 0); ++ do_test (9, 3, hlen, klen, 1); ++ do_test (9, 9, hlen, klen, 0); ++ do_test (9, 9, hlen, klen, 1); ++ do_test (9, 15, hlen, klen, 0); ++ do_test (9, 15, hlen, klen, 1); ++ ++ do_test (15, 0, hlen, klen, 0); ++ do_test (15, 0, hlen, klen, 1); ++ do_test (15, 3, hlen, klen, 0); ++ do_test (15, 3, hlen, klen, 1); ++ do_test (15, 9, hlen, klen, 0); ++ do_test (15, 9, hlen, klen, 1); ++ do_test (15, 15, hlen, klen, 0); ++ do_test (15, 15, hlen, klen, 1); ++ } ++ ++ do_test (0, 0, page_size - 1, 16, 0); ++ do_test (0, 0, page_size - 1, 16, 1); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strtod.c glibc-2.17-c758a686/benchtests/bench-strtod.c +--- glibc-2.17-c758a686/benchtests/bench-strtod.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strtod.c 2015-06-20 21:22:16.300458014 -0400 +@@ -0,0 +1,120 @@ ++/* Measure strtod implementation. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strtod" ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include "bench-timing.h" ++ ++#undef INNER_LOOP_ITERS ++#define INNER_LOOP_ITERS 65536 ++ ++static const char *inputs[] = ++{ ++ "1e308", ++ "100000000e300", ++ "0x1p1023", ++ "0x1000p1011", ++ "0x1p1020", ++ "0x0.00001p1040" "1e-307", ++ "0.000001e-301", ++ "0.0000001e-300", ++ "0.00000001e-299", ++ "1000000e-313", ++ "10000000e-314", ++ "100000000e-315", ++ "0x1p-1021", ++ "0x1000p-1033", ++ "0x10000p-1037", ++ "0x0.001p-1009", ++ "0x0.0001p-1005", ++ "12.345", ++ "12.345e19", ++ "-.1e+9", ++ ".125", ++ "1e20", ++ "0e-19", ++ "4\00012", ++ "5.9e-76", ++ "0x1.4p+3", ++ "0xAp0", ++ "0x0Ap0", ++ "0x0A", ++ "0xA0", ++ "0x0.A0p8", ++ "0x0.50p9", ++ "0x0.28p10", ++ "0x0.14p11", ++ "0x0.0A0p12", ++ "0x0.050p13", ++ "0x0.028p14", ++ "0x0.014p15", ++ "0x00.00A0p16", ++ "0x00.0050p17", ++ "0x00.0028p18", ++ "0x00.0014p19", ++ "0x1p-1023", ++ "0x0.8p-1022", ++ "Inf", ++ "-Inf", ++ "+InFiNiTy", ++ "0x80000Ap-23", ++ "1e-324", ++ "0x100000000000008p0", ++ "0x100000000000008.p0", ++ "0x100000000000008.00p0", ++ "0x10000000000000800p0", ++ "0x10000000000000801p0", ++ NULL ++}; ++ ++int ++do_bench (void) ++{ ++ const size_t iters = INNER_LOOP_ITERS; ++ timing_t res __attribute__ ((unused)); ++ ++ TIMING_INIT (res); ++ ++ for (size_t i = 0; inputs[i] != NULL; ++i) ++ { ++ char *ep; ++ timing_t start, stop, cur; ++ ++ printf ("Input %-24s:", inputs[i]); ++ TIMING_NOW (start); ++ for (size_t j = 0; j < iters; ++j) ++ strtod (inputs[i], &ep); ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++ putchar ('\n'); ++ } ++ ++ return 0; ++} ++ ++#define TEST_FUNCTION do_bench () ++ ++/* On slower platforms this test needs more than the default 2 seconds. */ ++#define TIMEOUT 10 ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-strtok.c glibc-2.17-c758a686/benchtests/bench-strtok.c +--- glibc-2.17-c758a686/benchtests/bench-strtok.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-strtok.c 2015-06-20 21:22:16.300458014 -0400 +@@ -0,0 +1,152 @@ ++/* Measure strtok functions. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define TEST_MAIN ++#define TEST_NAME "strtok" ++#include "bench-string.h" ++ ++#define STRTOK strtok_string ++#include <string/strtok.c> ++ ++ ++typedef char *(*proto_t) (const char *, const char *); ++ ++IMPL (strtok_string, 0) ++IMPL (strtok, 1) ++ ++static void ++do_one_test (impl_t * impl, const char *s1, const char *s2) ++{ ++ size_t i, iters = INNER_LOOP_ITERS; ++ timing_t start, stop, cur; ++ TIMING_NOW (start); ++ for (i = 0; i < iters; ++i) ++ { ++ CALL (impl, s1, s2); ++ CALL (impl, NULL, s2); ++ CALL (impl, NULL, s2); ++ } ++ TIMING_NOW (stop); ++ ++ TIMING_DIFF (cur, start, stop); ++ ++ TIMING_PRINT_MEAN ((double) cur, (double) iters); ++ ++} ++ ++ ++static void ++do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail) ++{ ++ char *s2 = (char *) (buf2 + align2); ++ static const char d[] = "1234567890abcdef"; ++#define dl (sizeof (d) - 1) ++ char *ss2 = s2; ++ for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ ss2 = mempcpy (ss2, d, t); ++ } ++ s2[len2] = '\0'; ++ ++ printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", ++ len1, len2, align1, align2, fail ? "fail" : "found"); ++ ++ FOR_EACH_IMPL (impl, 0) ++ { ++ char *s1 = (char *) (buf1 + align1); ++ if (fail) ++ { ++ char *ss1 = s1; ++ for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ memcpy (ss1, d, t); ++ ++ss1[len2 > 7 ? 7 : len2 - 1]; ++ ss1 += t; ++ } ++ } ++ else ++ { ++ memset (s1, '0', len1); ++ memcpy (s1 + (len1 - len2) - 2, s2, len2); ++ if ((len1 / len2) > 4) ++ memcpy (s1 + (len1 - len2) - (3 * len2), s2, len2); ++ } ++ s1[len1] = '\0'; ++ do_one_test (impl, s1, s2); ++ } ++ putchar ('\n'); ++} ++ ++static int ++test_main (void) ++{ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (size_t klen = 2; klen < 32; ++klen) ++ for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) ++ { ++ do_test (0, 0, hlen, klen, 0); ++ do_test (0, 0, hlen, klen, 1); ++ do_test (0, 3, hlen, klen, 0); ++ do_test (0, 3, hlen, klen, 1); ++ do_test (0, 9, hlen, klen, 0); ++ do_test (0, 9, hlen, klen, 1); ++ do_test (0, 15, hlen, klen, 0); ++ do_test (0, 15, hlen, klen, 1); ++ ++ do_test (3, 0, hlen, klen, 0); ++ do_test (3, 0, hlen, klen, 1); ++ do_test (3, 3, hlen, klen, 0); ++ do_test (3, 3, hlen, klen, 1); ++ do_test (3, 9, hlen, klen, 0); ++ do_test (3, 9, hlen, klen, 1); ++ do_test (3, 15, hlen, klen, 0); ++ do_test (3, 15, hlen, klen, 1); ++ ++ do_test (9, 0, hlen, klen, 0); ++ do_test (9, 0, hlen, klen, 1); ++ do_test (9, 3, hlen, klen, 0); ++ do_test (9, 3, hlen, klen, 1); ++ do_test (9, 9, hlen, klen, 0); ++ do_test (9, 9, hlen, klen, 1); ++ do_test (9, 15, hlen, klen, 0); ++ do_test (9, 15, hlen, klen, 1); ++ ++ do_test (15, 0, hlen, klen, 0); ++ do_test (15, 0, hlen, klen, 1); ++ do_test (15, 3, hlen, klen, 0); ++ do_test (15, 3, hlen, klen, 1); ++ do_test (15, 9, hlen, klen, 0); ++ do_test (15, 9, hlen, klen, 1); ++ do_test (15, 15, hlen, klen, 0); ++ do_test (15, 15, hlen, klen, 1); ++ } ++ do_test (0, 0, page_size - 1, 16, 0); ++ do_test (0, 0, page_size - 1, 16, 1); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/benchtests/bench-timing.h glibc-2.17-c758a686/benchtests/bench-timing.h +--- glibc-2.17-c758a686/benchtests/bench-timing.h 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-timing.h 2015-06-20 21:22:16.300458014 -0400 +@@ -0,0 +1,64 @@ ++/* Define timing macros. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <hp-timing.h> ++#include <stdint.h> ++ ++#if HP_TIMING_AVAIL && !defined USE_CLOCK_GETTIME ++# define GL(x) _##x ++# define GLRO(x) _##x ++typedef hp_timing_t timing_t; ++ ++# define TIMING_TYPE "hp_timing" ++ ++# define TIMING_INIT(res) ({ (res) = 1; }) ++ ++# define TIMING_NOW(var) HP_TIMING_NOW (var) ++# define TIMING_DIFF(diff, start, end) HP_TIMING_DIFF ((diff), (start), (end)) ++# define TIMING_ACCUM(sum, diff) HP_TIMING_ACCUM_NT ((sum), (diff)) ++ ++#else ++ ++#include <time.h> ++typedef uint64_t timing_t; ++ ++# define TIMING_TYPE "clock_gettime" ++ ++/* Measure the resolution of the clock so we can scale the number of ++ benchmark iterations by this value. */ ++# define TIMING_INIT(res) \ ++({ \ ++ struct timespec start; \ ++ clock_getres (CLOCK_PROCESS_CPUTIME_ID, &start); \ ++ (res) = start.tv_nsec; \ ++}) ++ ++# define TIMING_NOW(var) \ ++({ \ ++ struct timespec tv; \ ++ clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &tv); \ ++ (var) = (uint64_t) (tv.tv_nsec + (uint64_t) 1000000000 * tv.tv_sec); \ ++}) ++ ++# define TIMING_DIFF(diff, start, end) (diff) = (end) - (start) ++# define TIMING_ACCUM(sum, diff) (sum) += (diff) ++ ++#endif ++ ++#define TIMING_PRINT_MEAN(d_total_s, d_iters) \ ++ printf ("\t%g", (d_total_s) / (d_iters)) +diff -urN glibc-2.17-c758a686/benchtests/bench-timing-type.c glibc-2.17-c758a686/benchtests/bench-timing-type.c +--- glibc-2.17-c758a686/benchtests/bench-timing-type.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/bench-timing-type.c 2015-06-20 21:22:16.300458014 -0400 +@@ -0,0 +1,27 @@ ++/* Print out the timing type used by the benchmark run. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include "bench-timing.h" ++#include <stdio.h> ++ ++int ++main (int argc, char **argv) ++{ ++ puts (TIMING_TYPE); ++ return 0; ++} +diff -urN glibc-2.17-c758a686/benchtests/cosh-inputs glibc-2.17-c758a686/benchtests/cosh-inputs +--- glibc-2.17-c758a686/benchtests/cosh-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/cosh-inputs 2015-06-20 21:22:16.300458014 -0400 +@@ -0,0 +1,403 @@ ++## args: double ++## ret: double ++## includes: math.h ++-0x1.630fb3c419c60p9 ++0x1.631844f7a96d0p9 ++-0x1.f56fa7db86bf4p5 ++-0x1.631675fa3bc04p9 ++0x1.1946f04588844p-371 ++-0x1.62fac5eb878c6p9 ++0x1.c2f1e6340f9acp-1 ++0x1.38d5f6796e1c6p-172 ++0x1.652cb53670db0p6 ++0x1.bab6037e306ecp4 ++-0x1.d6cc6557b9fe1p-224 ++0x1.2a4a35f11dc8bp-1 ++0x1.7acdf3096f467p-2 ++0x1.62ea1202d9816p9 ++-0x1.ab3a9254e8794p5 ++-0x1.7581c71bf2925p3 ++0x1.6335078d8f6f1p9 ++-0x1.562ea1c51f0f0p7 ++-0x1.5ad3171705e85p2 ++-0x1.a28481bf5abc7p6 ++-0x1.07f19394102cap-155 ++0x1.714f115ded7edp-395 ++-0x1.e3b4e57228498p-226 ++0x1.62ecb5c679f45p9 ++0x1.f5ef70c4d6fe3p-947 ++0x1.07c7d5461c4c1p2 ++0x1.230e2092aaa0ep5 ++0x1.62edf5f8ef2d6p9 ++0x1.633c66e5307e9p9 ++-0x1.ca74063b21508p1 ++-0x1.4517c5d83e40fp-1 ++-0x1.3d480025e3245p7 ++0x1.6307c4b105e8bp9 ++0x1.dac293f73d850p5 ++0x1.ddc3c42ec39bap6 ++0x1.df804326360d0p4 ++-0x1.a729d2ed077a7p8 ++0x1.62e6b6e528603p9 ++0x1.630252d0050e1p9 ++-0x1.d9e2923618018p-312 ++-0x1.da7d05daf1653p-360 ++0x1.632b742e1d0c9p9 ++-0x1.62fdf19fea01cp9 ++0x1.6328531b0a130p9 ++0x1.626da3cbd279bp-65 ++0x1.632cc11415f53p9 ++0x1.99320680205a9p-799 ++-0x1.3a7903b952ff1p-83 ++-0x1.895200d5fefb6p-119 ++-0x1.c26a3720198fcp2 ++-0x1.9fa0e43bb03e6p-2 ++0x1.62e6378477ec7p9 ++-0x1.5a5f3792646e9p-860 ++0x1.1080911dae7d0p-1013 ++0x1.6304f3ed14c82p9 ++0x1.6337149eda940p9 ++0x1.62ec21c319df7p9 ++-0x1.239ff60f28877p6 ++0x1.dec232d4b4a3fp-2 ++-0x1.6655b35bcb861p-951 ++0x1.6322f270f7ff5p9 ++0x1.62e67590a0733p9 ++-0x1.3bd6d2de5b059p-627 ++-0x1.4d2140c9727ddp8 ++0x1.6316835c7cf05p9 ++-0x1.150951ee1275fp0 ++-0x1.8c4344a80043fp-2 ++-0x1.633196bcef4aap9 ++0x1.af57d51a27e27p-747 ++-0x1.7f4191bd896cbp-2 ++-0x1.88703361b4ad5p3 ++0x1.24aa7790e8d36p2 ++-0x1.62faa7a46d17bp9 ++-0x1.9a47f1cda4652p3 ++-0x1.6315b48bf51f2p9 ++-0x1.141d54326d8a1p7 ++0x1.23ffc38155c52p-233 ++-0x1.57b2662e0cbc1p2 ++-0x1.1929f6abc031bp8 ++-0x1.590710edec44dp-817 ++0x1.94c7749a2b80cp-457 ++-0x1.87d6401ddca88p-676 ++-0x1.81cfd513f4ab9p-623 ++-0x1.69fad03b43d66p-700 ++0x1.79300023a52c8p0 ++-0x1.ba2396d33e90cp8 ++-0x1.63057386325ebp9 ++-0x1.728176d7c18f0p-24 ++-0x1.c69e923a07adcp6 ++-0x1.e07082cab8c82p-573 ++0x1.632b31037059ap9 ++-0x1.6336976d5e8adp9 ++0x1.b6cf07dd00ddep-140 ++-0x1.633c1105ee490p9 ++-0x1.1284f1b6941f8p1 ++-0x1.6c8b7360c8e61p0 ++0x1.6d20f44123714p7 ++0x1.cc4af059aa66ap8 ++-0x1.8a2a250959686p-57 ++0x1.f02ac609a5cc1p-87 ++-0x1.a754215ca985dp-2 ++0x1.2825d1de625c8p6 ++0x1.3c1dd34b185a1p6 ++0x1.5486c13874548p-359 ++-0x1.6c62d6c0af55fp6 ++0x1.5947c680bd235p1 ++-0x1.d1ecf009b1e3ap8 ++0x1.d6c6f6b983d6cp7 ++-0x1.d3c651d1da802p0 ++0x1.248074c8c7fd2p1 ++0x1.630c71268199ap9 ++0x1.22379013a9834p-349 ++0x1.6387b36f3b875p8 ++-0x1.632dc46b7230cp9 ++-0x1.216292f12973ap-436 ++0x1.0223b02b8d96bp-459 ++0x1.4512d30165887p1 ++0x1.2762305f5efcbp0 ++-0x1.8982d0e78510bp-802 ++0x1.8713c2f7dd25ap-6 ++0x1.f690a6c3716cbp-3 ++0x1.afe4e13938837p-689 ++0x1.62ff7470df95dp9 ++-0x1.66b997e7d1793p3 ++0x1.aa64953830f35p-1 ++-0x1.05cbb323669c8p7 ++0x1.df98b1662cf01p8 ++-0x1.84acb4c33fff9p1 ++-0x1.75d6f3839dffbp2 ++0x1.6302c49c75ac4p9 ++0x1.54c5f63777d5ap0 ++-0x1.5329b46ad494ep8 ++0x1.62f1d7dc4e8bfp9 ++0x1.5e2af7dfe1034p9 ++0x1.46b0f34a60c14p-276 ++0x1.6302b7464cd16p9 ++0x1.6acba1328de25p-2 ++0x1.214126ebc9ba2p0 ++-0x1.c6abd4778861bp3 ++0x1.62ee439267fe4p9 ++-0x1.019e020b2eed3p-918 ++0x1.67c174b511e76p-194 ++-0x1.a61b930d87e17p-197 ++0x1.6326673bf0ee0p9 ++0x1.62fb546601bb5p9 ++-0x1.630397a6b37e0p9 ++-0x1.487513da26b06p5 ++-0x1.026fa5d7b42fcp-1 ++0x1.a585d6604b0b1p-686 ++0x1.f9dfc189a7a8dp-2 ++-0x1.68c8d3ca045f0p0 ++0x1.0de7b0af3eca8p-424 ++0x1.9bceb245013d8p-1 ++-0x1.b47a67fa0f535p-238 ++0x1.31a6458858034p7 ++-0x1.0baf3575dd3b1p-968 ++0x1.5d07807c20bb9p1 ++0x1.eb7555bb47463p5 ++0x1.6300e31dc8554p9 ++0x1.56bd211140702p-963 ++-0x1.62fc3361285d3p9 ++0x1.6329f34ef70a1p9 ++0x1.3b63d61257d13p4 ++0x1.861950f440148p-1 ++0x1.a37ad4ec1d969p-346 ++-0x1.632b611f08364p9 ++-0x1.52594428d68c5p1 ++-0x1.6323360b63d60p9 ++-0x1.cbeb65785a18cp3 ++-0x1.35d973c1b14fbp1 ++-0x1.dd4d80673e7d0p-159 ++0x1.1610c328054c1p-749 ++0x1.d69ba47595c68p3 ++-0x1.21c707e50660dp4 ++-0x1.0608868eedbc7p-439 ++0x1.633cd176d9771p9 ++-0x1.fb2f329c0bb96p6 ++0x1.b7ed468fb04f9p-2 ++-0x1.23f9c5b9b41c5p6 ++-0x1.9629f1520f28bp-230 ++-0x1.6303c0b5329e9p9 ++0x1.0738a10cb2383p6 ++0x1.6949236f0fb13p0 ++0x1.9356878778911p4 ++0x1.6318527f69db0p9 ++-0x1.915ff68d55569p5 ++-0x1.3c0e136ebb1d3p8 ++0x1.21c663cb76efbp-712 ++0x1.631510cd8cc49p9 ++-0x1.8a9232ce1ce75p-685 ++-0x1.62e9313aabeb2p9 ++-0x1.160a431da0f5ep-1 ++-0x1.50420407b4980p-540 ++0x1.3db012d4e554dp5 ++0x1.07fe346846679p2 ++0x1.e7b8c3d24cd12p-603 ++0x1.6e9e4075373bbp-2 ++0x1.99e534ba6b8c9p1 ++-0x1.ac4ea356f7e7ap-1 ++0x1.26d654fd77e51p-126 ++0x1.630a6325d4276p9 ++0x1.63018139cc344p9 ++0x1.62f446bf431b8p9 ++-0x1.62fa736043269p9 ++0x1.62f6f6ca932f5p9 ++-0x1.db3ff2317460fp-401 ++0x1.182092617c182p-902 ++-0x1.633510495d169p9 ++0x1.07f565702a6dbp-1 ++-0x1.62f3821bac3f3p9 ++-0x1.de739010d6091p7 ++-0x1.f6a97309476d8p6 ++-0x1.92e537f3ea327p-2 ++0x1.630181fc28954p9 ++-0x1.baead70b0c2bap4 ++0x1.6329675608d9fp9 ++0x1.631ca21fe1f5ap9 ++0x1.12e5e651f43bep0 ++0x1.5c1404cdf4b6dp-653 ++-0x1.6327e1c51ff78p9 ++-0x1.8b5c643c1f677p-1 ++0x1.f017e3196ac82p3 ++-0x1.320c539d2690cp8 ++0x1.3232266740c50p1 ++-0x1.9fb7342efeec0p-903 ++0x1.65f6b5e818e38p2 ++0x1.f608f27517700p-132 ++-0x1.6701731068abfp-476 ++0x1.62f873b46c417p9 ++-0x1.10ab76257be04p-134 ++-0x1.71aa41f376409p3 ++0x1.aa3c546601d68p6 ++0x1.330af2c1875b4p-584 ++0x1.467a936424936p8 ++0x1.402ca060e1497p8 ++0x1.8195955afb315p7 ++0x1.e422c06fda329p-252 ++-0x1.9725c1ddcc807p5 ++-0x1.0a669663e4824p1 ++0x1.da54851488f44p-650 ++-0x1.2bf936af0bb54p4 ++0x1.c7b7361a9d625p5 ++0x1.fbafe37560e23p0 ++0x1.32a202fb0895dp7 ++0x1.8507b472339c2p3 ++-0x1.b0498135f2cf1p-40 ++-0x1.34b9e14e1af56p5 ++-0x1.6316075c46ee9p9 ++-0x1.d96f3088164d1p-771 ++0x1.64ec801c7fc0cp1 ++-0x1.6330b03f5aa48p9 ++0x1.8752740d1aff0p2 ++-0x1.b276e5fc0915ap8 ++0x1.3fcdd73dbc27ep-603 ++-0x1.09774517f3944p7 ++-0x1.6319f733c541fp9 ++-0x1.7019f600db82cp7 ++-0x1.6317b78869f21p9 ++0x1.903ff6c315937p-2 ++0x1.fcd75555d1bf5p2 ++0x1.a552c2076a2c0p4 ++0x1.92c1858903f0ap-668 ++-0x1.c91a744e3a0b7p-1 ++-0x1.596c614756426p-305 ++-0x1.cc5644d829eacp-167 ++-0x1.bc96e1aaf042bp0 ++0x1.6337b63365473p9 ++-0x1.ca384346f16a9p8 ++0x1.465d81dad540ep7 ++0x1.632396c691df1p9 ++-0x1.5695b6e7fcd02p6 ++-0x1.f9a446420cdc7p3 ++0x1.f0ad831c3abb4p-46 ++-0x1.ce3bf20083050p8 ++0x1.0b72226f94781p3 ++0x1.2f75110873a31p8 ++0x1.3877f0875dea2p5 ++0x1.632045a8a7ef9p9 ++0x1.62f1877c1501ep9 ++0x1.6310e758dfd28p9 ++0x1.630e01d39d028p9 ++0x1.62f23680e783cp9 ++0x1.83f8e51d82968p6 ++0x1.7e0aa46083883p-2 ++0x1.00e73296682cap7 ++0x1.e333e66e5016ep-1 ++0x1.62f9213f8bc1fp9 ++-0x1.1043c4ca951fbp-23 ++-0x1.231e514c403e4p2 ++0x1.493644a3cb32cp9 ++0x1.6303738c05d04p9 ++0x1.6336a46b6c9bap9 ++0x1.9d2f87fc603f4p5 ++-0x1.633a822e16e6fp9 ++-0x1.62f55568a253dp9 ++-0x1.1262a6a8b160cp-166 ++0x1.ee36b15df2fc4p7 ++-0x1.761b008109568p-95 ++-0x1.62eff1edf3d60p9 ++0x1.aeceb373ec08dp5 ++0x1.1f00608d6c2abp-663 ++0x1.691f4114ddb68p1 ++0x1.3e57e666e2e04p3 ++-0x1.d897a0d2877f2p3 ++-0x1.2cd5b784df531p-548 ++0x1.dde5178b689c3p5 ++-0x1.9a5ff5ea279f8p6 ++0x1.434c61151b76bp-266 ++-0x1.ebd04328781a7p-781 ++-0x1.a7a0d286d7cc0p0 ++-0x1.7cd5764bf11ffp7 ++-0x1.632432d0e9e8fp9 ++-0x1.62e861c33ae29p9 ++0x1.fe89236cc6a12p-1 ++-0x1.daa2368bfcef6p-410 ++-0x1.a69a66dbd2ea1p8 ++0x1.91b5b4560bceap3 ++-0x1.0d2823f9d0f72p3 ++-0x1.630ef52917607p9 ++-0x1.2a2bb2e417439p6 ++0x1.cfd2c4878fd4ep6 ++-0x1.e6ef0724cf5d8p-2 ++-0x1.d3e823224ebe4p8 ++-0x1.79d546d7ccac5p-130 ++-0x1.632752aab262cp9 ++-0x1.98df07527c0bbp8 ++0x1.6312d35913b55p9 ++0x1.600ef62445c5ep4 ++-0x1.62e93642f1118p9 ++0x1.d0378703154bap3 ++-0x1.a3c9c5aedad89p-819 ++0x1.9150c46f64e72p-59 ++-0x1.631537abd1539p9 ++0x1.4eb503a5e519cp6 ++-0x1.c276053dd303bp-733 ++-0x1.f9d4144b54ba6p1 ++0x1.d0d367337f7f6p1 ++0x1.2b2582d457cd0p6 ++-0x1.8c1a422a7d8b8p4 ++-0x1.633754b36f51ap9 ++-0x1.62f596dff99e7p9 ++0x1.d63fe6b5c7c89p7 ++-0x1.6300b68646dc7p9 ++-0x1.630544284f262p9 ++-0x1.2a94d776d7790p3 ++0x1.33e954a4d5c5fp-916 ++0x1.25e337d99f414p-965 ++-0x1.06277554e7c06p-460 ++0x1.883ee57d70e7dp-31 ++0x1.bb0de68e6b79bp-2 ++0x1.62f667f0092adp9 ++-0x1.496ec324e967fp5 ++-0x1.9d6b07d830151p-355 ++0x1.666da5675e27fp1 ++-0x1.f7cdd2a74fc06p1 ++-0x1.2cdd0674e4abfp7 ++-0x1.0d6877109150dp-846 ++-0x1.cf43b2546254bp-1 ++0x1.0078e7f84d8d8p6 ++0x1.62ef2138efd07p9 ++0x1.b6e1c50cdb9d1p-553 ++0x1.90eb01a683bc0p-2 ++0x1.ea80c14d17262p4 ++0x1.e3928304b1b20p7 ++-0x1.5fc8a731a1822p-692 ++-0x1.1de0320fc0737p9 ++-0x1.b07147eb43dd0p4 ++0x1.62fa155e6e26ep9 ++0x1.213554dad3888p9 ++-0x1.66e894b6d218cp6 ++-0x1.7b67d6318a255p7 ++-0x1.1b005777a51cdp7 ++0x1.62e9f2b4a0744p9 ++0x1.d181a480e6c92p-478 ++-0x1.fe14d1c964b0dp-493 ++-0x1.6632749cd8f5fp-320 ++0x1.d038a32d61933p8 ++0x1.632a66cd5c94bp9 ++0x1.631f833e694f8p9 ++0x1.e111c646e8043p-139 ++-0x1.631ec3cf4a7b9p9 ++0x1.6311f75346d75p9 ++-0x1.c6d344d145206p5 ++0x1.ad42672f6fed7p0 ++-0x1.f4d3f0d1b85eep7 ++0x1.d35412055367bp7 ++-0x1.8e94d1fb70dcep2 ++0x1.04c9f0425e693p2 ++-0x1.b0bb57c60b6a0p5 ++0x1.73d4f770b54e0p5 ++0x1.bcb6129b5ff2bp8 ++-0x1.c82390742c1b2p-832 ++-0x1.bed2624f0b283p3 ++-0x1.62fbd7e6a4400p9 ++0x1.262d57250d7cfp-656 ++-0x1.1ebe27d65ffa7p6 ++0x1.7ab2a69e414b6p1 ++0x1.579870e61406fp2 ++0x1.baaef71d93bc9p-22 ++-0x1.6321d7d010e1ap9 +diff -urN glibc-2.17-c758a686/benchtests/cos-inputs glibc-2.17-c758a686/benchtests/cos-inputs +--- glibc-2.17-c758a686/benchtests/cos-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/cos-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,2411 @@ ++## args: double ++## ret: double ++## includes: math.h ++-0x1.5500006d24c56p657 ++-0x1.74eb14d50ab58p838 ++0x1.b6e5537112339p2 ++-0x1.5320f43535558p30 ++0x1.a5d743be1ed81p19 ++-0x1.e44a771e82dd8p325 ++-0x1.37c07097b1e0bp19 ++0x1.b6da163b3a193p-8 ++0x1.9c1d26a5a4d15p19 ++0x1.24fb45187e1cfp25 ++-0x1.8a7204656d1c5p17 ++-0x1.a59a742066c34p34 ++0x1.8907a5632a248p35 ++-0x1.e481d625714fbp0 ++-0x1.ef80132f1ffafp-12 ++-0x1.e9da155008608p671 ++0x1.7a6085f1f7a0bp24 ++0x1.2d6d6713a3cb3p9 ++-0x1.109665062930bp0 ++-0x1.65ded44238895p20 ++-0x1.4debb5bad15c9p411 ++-0x1.b6c131e9e2a95p414 ++-0x1.896a57dbdc990p0 ++0x1.345f96c1b84cbp46 ++-0x1.e54805da72fa3p-24 ++-0x1.d54bf16b395bcp23 ++-0x1.47f9c5e27f6f3p707 ++-0x1.b8a5440ee9fd7p9 ++0x1.5ff3170744344p-18 ++0x1.266593131001bp1020 ++0x1.42e0f5708b4d1p23 ++-0x1.6279c65ab2acap3 ++-0x1.e5ef0437f662ap15 ++-0x1.0750602edf46ap562 ++0x1.249941e897f8dp44 ++0x1.436c067c4c00cp26 ++-0x1.4334507e7a73bp-5 ++-0x1.5f99b4d006698p25 ++0x1.11697571c9c99p502 ++0x1.253f915648fd2p46 ++-0x1.2ecfb6fd18ffcp332 ++-0x1.2b6e350fc35dap25 ++-0x1.a26f8116b1f53p195 ++-0x1.491d341c65181p-7 ++0x1.3c13e14118343p38 ++-0x1.a6a105deff5e0p5 ++-0x1.fbe7761b1e8d2p18 ++0x1.6709c7306f030p26 ++-0x1.adbf8321968d5p112 ++0x1.d9a53349d7df5p624 ++0x1.5454e1450ae1cp463 ++-0x1.5e0c04637d573p724 ++0x1.7951c309d6e27p850 ++0x1.285dc7fdae1ccp26 ++-0x1.c8c2c6e7107dcp40 ++-0x1.b5afc39812d5cp73 ++-0x1.dbf7863f7522dp-9 ++0x1.6ac6347189089p36 ++0x1.27b04425488afp31 ++0x1.cf38e00daa5afp370 ++0x1.303432a81f7e0p189 ++-0x1.8c05308efd7dbp0 ++-0x1.249b044f1f591p-1 ++-0x1.bf68624ae32d8p315 ++0x1.66c281dc83c31p327 ++-0x1.486c663f75760p2 ++-0x1.feab128c4d050p878 ++0x1.f2db6323e2bc8p47 ++0x1.aba1300582abfp-1 ++-0x1.70b692602f649p28 ++0x1.63bbd511e2d1cp1019 ++-0x1.ad48262c26df0p-23 ++0x1.e7a7573e40d0dp1 ++0x1.5081452ccba88p449 ++-0x1.0198677d57aaap19 ++0x1.78cc5057c8ea8p319 ++-0x1.fbf866574db56p1 ++-0x1.13cf375475387p0 ++0x1.9e05552a6ebdbp5 ++0x1.fe8ec1124c5b2p17 ++0x1.801683636a380p854 ++0x1.bed635dab7cc3p10 ++0x1.29d4d1734709ap23 ++-0x1.692a2422044fbp14 ++-0x1.5a8db25d26e70p0 ++0x1.65e3870f3c860p309 ++0x1.3caf03947f677p1 ++0x1.0a60b6ecb0107p22 ++0x1.8cbcc6715593ep30 ++0x1.faa85328a30d0p858 ++-0x1.700da718a4a31p0 ++0x1.59c2127ae8e32p20 ++0x1.a5e3214dc3d15p647 ++-0x1.1db30365f086dp1 ++-0x1.0399c3c28453ap0 ++-0x1.dd8f835681c23p1017 ++0x1.2751c6b1cde31p478 ++-0x1.b881719d9f6bdp-16 ++0x1.22f885319d1b5p-20 ++0x1.e5d4d0d25845ap-23 ++0x1.0045944e09121p37 ++0x1.3fa8c311b4a60p38 ++0x1.e55e21efd912dp46 ++0x1.6d5f5310aea1bp646 ++-0x1.d3570603de208p23 ++0x1.3365358de2fe1p161 ++-0x1.629526ed15f02p26 ++-0x1.e62dc4d44fab1p40 ++0x1.e1f9c02374c6dp24 ++-0x1.90a100664e089p-21 ++0x1.8dafd569a76b4p26 ++-0x1.406e919853bcfp694 ++0x1.931d703570765p711 ++-0x1.6973e3885a11ep0 ++0x1.9e6a122e9eb4ap8 ++0x1.35a7e5d0935fdp222 ++-0x1.2d6c2408f3370p667 ++0x1.e08e82243180fp0 ++-0x1.ec6237ba9b765p906 ++-0x1.f01e76edc5f71p0 ++-0x1.5cbd54e60a98ep-1 ++0x1.9e0250bdd8df6p426 ++0x1.d78115ab10587p107 ++-0x1.2d739249672fbp17 ++0x1.fedb779d35b35p41 ++-0x1.8f0c6774e24acp889 ++0x1.0244d1b6b4fe3p31 ++-0x1.c2bfd0a931704p3 ++-0x1.1cf0950e0a018p15 ++-0x1.ec54b3a8ffc12p24 ++-0x1.88c5a3114de94p492 ++-0x1.30b5d5aec851cp940 ++-0x1.5b9bc4ee38a1bp-24 ++0x1.3341961dfc2ddp659 ++-0x1.c78046362a6a5p3 ++0x1.2d6e122696618p750 ++-0x1.4730d67c27d89p-3 ++-0x1.e6f9821fd5f72p21 ++-0x1.dc9c33c3b4affp11 ++0x1.f0390127af37bp1 ++0x1.a105328b91461p904 ++0x1.ca3296a765ee9p29 ++0x1.9ed025781f734p-8 ++-0x1.38b913b9a8502p54 ++0x1.80cf557137b99p40 ++-0x1.ef48673d98d25p20 ++0x1.e98c94063264ep314 ++-0x1.98cf55855bf23p0 ++0x1.a20040bbc9705p24 ++-0x1.bbaa1373a6b04p-13 ++0x1.3a05a58adde58p-26 ++0x1.c286149c7e9f5p470 ++-0x1.6b81753989e5ap25 ++0x1.25b0b093ed7f8p2 ++-0x1.0fa8f1bcd9638p467 ++-0x1.58a1939b34f60p25 ++0x1.dbd641b5c98edp117 ++0x1.1fb4562dd42aap-16 ++0x1.14e3242e58954p0 ++0x1.d3a2230b9e01ep897 ++-0x1.53b4b1f9012a0p497 ++-0x1.024f21758b27ep0 ++-0x1.c507e0d80c18bp388 ++0x1.7a51e62e9bbf7p489 ++-0x1.964e538ed6a85p29 ++0x1.273937c7e6db5p315 ++0x1.d1cd90de0d573p1 ++0x1.d879906814a5cp-24 ++0x1.9c0153b0ede21p46 ++-0x1.956a15502cadcp-23 ++0x1.445f06629acb9p24 ++-0x1.01310510ba8afp37 ++-0x1.3fe9d1eac62fbp773 ++-0x1.25ab5749018d2p611 ++-0x1.80cfc67e14b4fp26 ++0x1.7ecf27b07b148p23 ++0x1.43101294381abp26 ++0x1.6c2761f81b901p-23 ++0x1.ba9fe7138c3cep112 ++-0x1.21d97415b6ba7p15 ++-0x1.6e0e76aaf7d3ep-7 ++0x1.776856675164ep4 ++0x1.e6da629a8c493p-19 ++-0x1.08d20753e957dp657 ++0x1.3e58548ada7d0p-14 ++-0x1.c101c29c2ca2bp671 ++0x1.f81ae7d44a371p151 ++0x1.ceebb1e9b0ac5p25 ++0x1.1efb100681836p1 ++0x1.8af3458dfddf7p13 ++-0x1.2568259ec877fp15 ++0x1.63c373ca8604cp-19 ++0x1.bc2476e5f6203p26 ++0x1.d21a939613119p14 ++0x1.7a7d113ec8249p0 ++-0x1.1cc05529e617cp4 ++0x1.78fad183e2167p6 ++-0x1.9416a783a4e38p25 ++-0x1.51e6d29257863p47 ++-0x1.382e97b6481f3p45 ++0x1.17fc047aebf99p10 ++0x1.40c8b1a325f9bp33 ++0x1.d5bbf4c199cbap29 ++-0x1.df5752482cfe6p-20 ++-0x1.12c1f684ae960p14 ++0x1.2a8757492a1acp29 ++-0x1.891c334662682p16 ++0x1.8d82378077273p6 ++0x1.166da45911fe3p154 ++-0x1.202fe7e0931ecp25 ++0x1.f671a5c525c60p25 ++-0x1.a16666f2d0d73p0 ++0x1.341e9765a7c3dp26 ++-0x1.1e626406b087dp-21 ++-0x1.790a818b2e25cp26 ++-0x1.b42b75a1c17cep11 ++0x1.57a50372893aap129 ++0x1.c9f2355b4664ap6 ++-0x1.670df37270a5dp47 ++0x1.8e63d0b3e0c9ap533 ++-0x1.8c842353144b7p0 ++0x1.14bfe1e6692bfp3 ++-0x1.8daca557ecbc8p0 ++0x1.0f66604e1cae6p1 ++0x1.6b4b447033d3cp17 ++-0x1.34fbd3e9490bfp343 ++0x1.9a8b8523a35d1p0 ++-0x1.bacaa7bb3931cp709 ++-0x1.6ce3907ecd3eap27 ++-0x1.6329f65be40dfp388 ++0x1.9f4407a6b30dbp-4 ++-0x1.c64231dff1ff8p-1 ++-0x1.f9d481e9d8a98p21 ++-0x1.3150861950cb4p7 ++0x1.709e700648c1dp3 ++0x1.0248a23a58372p-11 ++-0x1.ca6a851aa0470p12 ++0x1.b24d336cb3971p0 ++0x1.2ad5a72281833p24 ++-0x1.4043b11fad8b6p-24 ++-0x1.e73a03bba587cp0 ++0x1.46cfe1fec14f8p40 ++-0x1.7dfd30173d85cp39 ++-0x1.628c71e6500b1p0 ++-0x1.7e77e7b456aebp16 ++0x1.1df3c34e26e48p21 ++0x1.1ac7a39becc9fp29 ++0x1.1515d5cb1c51cp1 ++-0x1.67cab45949d3bp22 ++0x1.e4e286c86c45fp-16 ++-0x1.8cd97769969d7p483 ++0x1.ce30758136824p27 ++0x1.95b154a54a24cp37 ++0x1.acffd079cb0c5p412 ++-0x1.411c8332662bfp0 ++-0x1.7bc4041696bdbp1 ++0x1.c4ab9624d294fp445 ++-0x1.d1fcb4363c5bep-20 ++-0x1.bea1604dd499dp23 ++0x1.a108a042c4592p1 ++-0x1.04fb706aa9341p17 ++0x1.6a7111c6128c2p20 ++0x1.193151e0fd7c5p-10 ++-0x1.4b06317e471c3p119 ++0x1.cecb95b038037p792 ++-0x1.a561975e1d17ap44 ++-0x1.a8c170e426f1fp1 ++-0x1.53be42cd2bdebp7 ++-0x1.7ccd663e6d70fp-25 ++-0x1.182736e3f62e0p466 ++0x1.ac67800768ebcp12 ++-0x1.09a9d58fea51ap7 ++-0x1.75fc03701c53ep13 ++-0x1.3d9615a1f4a5dp-23 ++0x1.0e7e11092806bp343 ++-0x1.348fe488f91eep46 ++-0x1.1fad639f2da7bp8 ++-0x1.40aae476e0ed5p662 ++0x1.9f70f2da0cc95p132 ++-0x1.da5486badb181p-1 ++-0x1.3b3f076f46893p-9 ++-0x1.0b5187929e913p22 ++0x1.781ca4f1df000p0 ++0x1.6ceb8227b17f8p0 ++-0x1.5445a1397c2f2p751 ++0x1.5418512e0a8a1p8 ++-0x1.533876ccfba74p477 ++0x1.3396d7a19dc51p644 ++0x1.3cdb768fc6e00p-17 ++-0x1.1810260402476p2 ++-0x1.e2815264307f0p21 ++0x1.fb7b8378ba7b1p3 ++-0x1.7bc8c6f28c24bp0 ++-0x1.de5186502e418p-3 ++0x1.cc6417710e32dp9 ++-0x1.b74806ec02f90p-3 ++0x1.7b297737f89a6p0 ++-0x1.e7bf0149253d7p0 ++-0x1.691d818b4a914p-27 ++0x1.ffcfb3b604abep25 ++-0x1.0fd1f4204dd47p26 ++-0x1.349960924dd94p25 ++0x1.330097fdd7ff0p15 ++0x1.bb7555f93a67cp0 ++-0x1.e8d0023eb9798p-15 ++0x1.457db3a13df89p23 ++-0x1.d439a114e34d3p43 ++-0x1.33a971d3908ffp1 ++-0x1.8074051196a9fp35 ++-0x1.36caa6f4f6150p20 ++-0x1.e5047468eb004p36 ++-0x1.e2c677eef9254p479 ++0x1.043ad02a44c86p18 ++0x1.a762226b8977fp6 ++-0x1.d1eff1baa8a00p915 ++0x1.73f354e9bec57p0 ++-0x1.5e04c7be5d65ap26 ++0x1.32e6133ae3ba2p973 ++-0x1.130bb36a9180dp0 ++-0x1.0f8635fd75c96p-25 ++0x1.ac6c73500f7f1p977 ++0x1.5f47f080916d2p747 ++-0x1.7c13d0ffb2d1bp0 ++0x1.8cc7a6557936fp0 ++-0x1.3d20c6693cf4dp963 ++0x1.2252e753aae06p32 ++0x1.6102c79abd114p776 ++-0x1.ea41c6f9badc0p22 ++-0x1.4566d3374234ap942 ++0x1.48c290edccc4dp4 ++-0x1.5eb5d6958df05p41 ++0x1.3097218c10affp24 ++-0x1.5f51d4fbc2a24p866 ++-0x1.d961e32aa4458p24 ++0x1.2bd1132581a0bp17 ++0x1.31bf077fdc502p-13 ++0x1.dbc9d0ecfecffp958 ++-0x1.d9474275f8dbbp37 ++-0x1.7f9391c99c32cp38 ++-0x1.b22c9445db1a7p613 ++0x1.cf566724b6a87p-10 ++0x1.850211bd3bb55p93 ++-0x1.9ac2c530689d4p0 ++-0x1.be62f5b130b8dp0 ++0x1.032d004bc7a43p692 ++0x1.322f5733ea1fbp0 ++0x1.bed011520ae63p195 ++-0x1.441d84290be35p763 ++-0x1.444960b6d3e89p180 ++-0x1.ec5922981de7ap37 ++-0x1.75d2e1678af63p343 ++-0x1.10eba74970e62p11 ++0x1.62e1e19894307p10 ++0x1.e97543610b789p164 ++-0x1.eda7b7f647b42p15 ++-0x1.fe0c2274f3185p-4 ++-0x1.c0bce3cb049e5p33 ++0x1.aa0523e5fa5d6p0 ++0x1.213f833485611p5 ++0x1.599313c2534f2p-22 ++0x1.1ae571e1bc724p5 ++-0x1.c24055d80a5f8p-11 ++-0x1.a12e65804366bp46 ++0x1.76dc549f2274ap741 ++-0x1.03d390d8997e4p26 ++-0x1.1b36c4cf581c8p841 ++-0x1.56ae7518949d6p36 ++0x1.d86b40100783bp47 ++-0x1.56d0c378ca190p1 ++-0x1.da917388c2c69p830 ++-0x1.fd3906fa866c4p-1 ++0x1.fcc2828b80e39p24 ++0x1.927092bfc1613p62 ++0x1.364ce530c3b8bp14 ++-0x1.a5dd07a7a1b6bp-3 ++-0x1.7039c188c446ep372 ++0x1.ecc00543c4179p34 ++0x1.70a557bff1d19p43 ++0x1.053ac4631eb6ep42 ++-0x1.6e93c69519311p684 ++0x1.fddc610f652bfp25 ++0x1.5d23c14e5347cp10 ++0x1.28b57726066c6p21 ++-0x1.e34b009469f8bp26 ++0x1.8ec3a1532803ep25 ++0x1.2334b34f842cap73 ++0x1.a3f9461f83fc7p44 ++-0x1.bdb5217da4e12p-24 ++-0x1.87ce777fef3e9p0 ++0x1.b994e0f9d64e4p-1 ++-0x1.f051e48eb0a27p-1 ++-0x1.71fc03a2c0dc4p37 ++0x1.d4a7259ec9671p182 ++0x1.af2936d3b5356p18 ++0x1.b19b2069e1487p741 ++0x1.0c4f54d908dbbp842 ++0x1.9633b6cc8f95fp31 ++-0x1.f7f0b10fc7abbp-12 ++0x1.7dcef7488ef54p42 ++0x1.71d9a29951d30p979 ++0x1.9eecb676902eap12 ++-0x1.197a371161a1ap-6 ++-0x1.970b549202f75p15 ++-0x1.5673b2bc3c890p7 ++-0x1.0be9a65ae3299p45 ++0x1.64c4365cb4456p9 ++-0x1.6cc886298a2a6p209 ++-0x1.e3a8a52c483c1p1007 ++-0x1.82ab5565c6bf7p595 ++0x1.8aea2679ef0aap-13 ++-0x1.b37ea43570d83p697 ++-0x1.f5f545093efa8p10 ++0x1.133a54b78232bp-24 ++0x1.b401802bf603fp253 ++0x1.975cf4fe7de01p-13 ++0x1.dfffb229e4a31p33 ++-0x1.d728e796c4c59p46 ++0x1.dbce063607663p-9 ++-0x1.dcfdf7d58b834p32 ++0x1.05a416fb1e983p-20 ++-0x1.b64004211a42ep8 ++0x1.be8fe6328bdc8p503 ++0x1.a7a376a6bfebbp0 ++-0x1.3ade54ae52634p-6 ++-0x1.85b2e43641c2bp6 ++0x1.cf97d457a0958p-1 ++-0x1.f6ec45c2a3b4ap-2 ++0x1.cbcf649cc02d7p19 ++0x1.1e1317c82a6a9p21 ++0x1.a5bca61a82ec3p46 ++-0x1.fc551214a234ap33 ++-0x1.72ac7403760e3p0 ++0x1.bb03d7536d4ccp698 ++-0x1.af4ec32e9fce3p71 ++-0x1.c778f2c7ac74dp17 ++0x1.86c4360709304p1 ++0x1.028015715c76bp0 ++0x1.bfb74117c6ff9p33 ++-0x1.3feed1dd39ce9p40 ++0x1.f14981f4a8d29p16 ++-0x1.b525b5d886fd7p7 ++-0x1.abf156a96afc7p923 ++-0x1.9c1ed568f3cb9p16 ++0x1.7c041208761a6p0 ++0x1.3886e66f106abp151 ++0x1.839cb78b2b4abp30 ++0x1.9a5742c86fb7ep20 ++0x1.91ef725e99f72p592 ++0x1.d36ce6c1fd001p24 ++0x1.e750762ade5ffp0 ++0x1.e92b20a39491ep379 ++-0x1.32e291ee286c8p33 ++0x1.5b7642273a0eep40 ++-0x1.5ea1b0ccd8f28p98 ++0x1.2b80736f4a9d0p9 ++-0x1.2b42618941bb9p395 ++-0x1.7d0ad22761616p26 ++-0x1.7762272cba5e3p25 ++0x1.58954232affb6p25 ++-0x1.34ad53c58a47fp23 ++0x1.8975855985d19p501 ++-0x1.d1f4d79c31380p566 ++-0x1.a32851cc2be65p390 ++0x1.916815589e4b1p0 ++-0x1.5b8b64c9f96a2p30 ++-0x1.d058606fb9e48p15 ++0x1.262a7428526b9p1 ++0x1.96f7c5b3e3919p0 ++-0x1.f5a3a1fc53c6fp1 ++-0x1.30a2d4c407270p46 ++-0x1.6178648438383p19 ++0x1.af13d500f7cc9p30 ++0x1.b9e6172f71258p-6 ++0x1.e27fc1f8aa119p21 ++-0x1.bd9da3d73cd01p6 ++0x1.921da05fc12eap26 ++-0x1.6902454fef7ffp-10 ++0x1.584fc276a6b2bp4 ++0x1.c4b586982c7fep20 ++0x1.942c82ac0f530p4 ++0x1.c1f2b55b51948p4 ++0x1.c34ec3fccc805p5 ++-0x1.a34d9538665cep-15 ++-0x1.8ec031fad3fa4p466 ++-0x1.2f68a72835eefp45 ++0x1.d87c03eaaa1bfp12 ++-0x1.4dad353827827p7 ++-0x1.a61fa78ccb76dp8 ++0x1.f02425994e790p-1 ++0x1.7872164950239p44 ++-0x1.448fa3fa91514p0 ++-0x1.356365717ef4fp3 ++-0x1.27996239e2d4ap25 ++0x1.bfe2746ef36fbp168 ++-0x1.b1a050e0ed3fep16 ++-0x1.657e858ddef02p932 ++0x1.7b7466e89a978p0 ++-0x1.94e103a446f68p185 ++0x1.b0f5135086da8p39 ++0x1.9fa8e6d1aa67ep39 ++-0x1.565ac73db7728p76 ++-0x1.597aa2da93d2ap-14 ++-0x1.79d053e42f35cp0 ++-0x1.e756a7899b592p566 ++0x1.cc02d40dd176fp3 ++0x1.5853f727a0382p931 ++0x1.7f9ff133dd7fcp7 ++-0x1.54eae1e948c26p13 ++0x1.f463812c9625ep194 ++0x1.4200608051042p26 ++0x1.acb924d665d6ep25 ++-0x1.ee69c20fc82d7p25 ++0x1.b62ca2d803314p-17 ++0x1.99ad868f85696p323 ++-0x1.1fc20334bb246p25 ++-0x1.85488755819b0p25 ++0x1.91bae5f4012f6p0 ++-0x1.878693a7343c8p192 ++0x1.a7e580acde1afp634 ++-0x1.5c9f455bb898ep0 ++0x1.717d31fc4eecap15 ++0x1.43716097fef0ep16 ++-0x1.a9073787b0452p15 ++-0x1.2fea30a1d7acbp0 ++-0x1.d46bc3926e9b0p382 ++0x1.307b62ea850b3p0 ++-0x1.17732119c2eedp507 ++-0x1.0508c4bc0aa93p-9 ++-0x1.ff22636c40955p-4 ++0x1.3819811e7b876p10 ++0x1.b46c414c3d879p-24 ++0x1.86ce2688839fep13 ++0x1.f6f5e13195f14p-6 ++-0x1.86a78458de8a7p26 ++0x1.7c3c148fa8c8fp33 ++-0x1.fd9c067d42344p25 ++-0x1.b93722d8573eap717 ++0x1.78daf3e05d2dep999 ++-0x1.1759c00e1539cp26 ++0x1.9cdc12562cdd8p0 ++0x1.0bbb00fcd3fcap-24 ++-0x1.2db1a21b9553cp26 ++-0x1.8cac849c4c14cp-14 ++0x1.20e652e2b31e5p-10 ++0x1.b871e12ae1a1cp523 ++0x1.e06945e6b136bp-1 ++-0x1.8b8870eefb9b2p6 ++-0x1.b692c7b8371d6p24 ++-0x1.90c2846a01900p31 ++0x1.9cd6c3cdf6af2p901 ++-0x1.1a9d210cc532fp23 ++-0x1.334ff5833e6c7p32 ++0x1.32b22205b182ap26 ++0x1.b63623cddd9a3p355 ++-0x1.003b72665acecp-5 ++-0x1.a39c1457f6db7p0 ++0x1.47209333843c4p4 ++-0x1.52f9a306b7dbcp-11 ++-0x1.4cdef0e2215dap22 ++-0x1.8504b5f49eaf5p538 ++-0x1.749866e19666bp28 ++-0x1.d770a34b092aep23 ++0x1.8f64b6b7d5992p16 ++-0x1.89bff2ce038f9p4 ++-0x1.6ba252e9fb2b1p5 ++0x1.4af34179805a3p0 ++0x1.5089668042774p9 ++-0x1.448240d8f0474p-19 ++-0x1.72c886f82bcb8p0 ++0x1.0960b155ba27ep814 ++-0x1.a13513169019ap24 ++-0x1.575773fdcb9fdp30 ++0x1.82fd844618c3bp0 ++-0x1.d64c423ea7fa5p-25 ++0x1.8b29a1a6c049bp5 ++-0x1.e6b4610657578p7 ++-0x1.401257d46dbd8p7 ++-0x1.9fff55074713dp0 ++-0x1.c95e85b6e7218p1 ++-0x1.4651a74f2b3d3p615 ++0x1.a9e7c5c808ecbp-26 ++-0x1.9ba7158986b2bp46 ++-0x1.5c655039f3748p24 ++0x1.b3b0b23e6a1d2p30 ++0x1.7295033ed096ep26 ++-0x1.4d7931d25197fp12 ++0x1.968f207ccf926p25 ++-0x1.93d7b0b7b7859p419 ++-0x1.e5f0c57320518p17 ++-0x1.a17e305c0d250p2 ++-0x1.541eb51e65168p932 ++-0x1.36367707fd0d7p28 ++-0x1.9ed6914905c92p-25 ++0x1.3c46e4b5f0410p10 ++0x1.629ba311169efp10 ++0x1.b790745db6677p999 ++0x1.08ebf45d987edp547 ++-0x1.d8c5051fe47d4p-1 ++0x1.94738125e02b5p907 ++0x1.aa0ce7ffd5ea7p9 ++-0x1.bed4e59348203p806 ++-0x1.41f0976d7f84cp21 ++0x1.6c848429f2c56p924 ++0x1.dcaed6b16da0ep800 ++0x1.adb6d492b974bp1 ++0x1.5a3ab5ecb42b9p22 ++0x1.0992e56329420p540 ++-0x1.b45d52586efc0p27 ++-0x1.b513872f9e108p8 ++-0x1.61b56231fa37cp522 ++-0x1.f38fb1bdbc53dp-11 ++-0x1.b70f1554498d9p49 ++0x1.75b9409a5eff5p28 ++-0x1.01efc62c97c1cp-19 ++0x1.27b536506d0cbp31 ++-0x1.d125456feb4c1p23 ++-0x1.19edb0407ceaap9 ++-0x1.15c9c7f0c69d9p16 ++-0x1.c32963b133dd2p45 ++0x1.6fa8f2041aba3p13 ++0x1.6a15556ab5bf1p-27 ++-0x1.375b96248e95ap629 ++-0x1.fd70c62ca1cc4p20 ++0x1.f53dc1f7f194dp40 ++0x1.1a33e660a7ed3p-22 ++-0x1.94bc6555a7c85p818 ++0x1.419555793d713p74 ++0x1.dd482322ed590p714 ++0x1.fb7ff0dcc63bfp-10 ++-0x1.af039600c8f91p24 ++0x1.767755fe16937p15 ++0x1.c2e47788f82c0p-20 ++0x1.de0757a27a2a0p990 ++0x1.fc40504c8efc7p274 ++0x1.56f37190581d9p15 ++-0x1.6a00039c1ded9p-27 ++0x1.385920f5fb50bp-17 ++-0x1.2ee5a2d829252p266 ++0x1.3511772922eb5p14 ++0x1.d77d763b7eec1p983 ++-0x1.3cb083116259cp9 ++0x1.e91ba1e8e7175p9 ++-0x1.a6b130fb1911bp848 ++0x1.a586d7a33557ep35 ++-0x1.592d642efd386p36 ++-0x1.48a3d6fe9d98fp18 ++0x1.304a33a14b6f1p0 ++-0x1.fd5d90db5e04ap21 ++0x1.f58fc63af014fp-2 ++-0x1.544891c6a1929p-7 ++-0x1.889fd1ca54008p18 ++0x1.cfe531a280790p25 ++0x1.720db29d32cb3p582 ++0x1.d0fdb1492e856p5 ++-0x1.d56587d8858a8p9 ++0x1.a97c6235bbdcfp0 ++-0x1.4dce63f19060fp217 ++-0x1.8a9771ecb1855p0 ++-0x1.023f571ba1300p33 ++0x1.598c20141d1f8p24 ++-0x1.115037892f8bfp25 ++0x1.e354332ab1ca7p346 ++0x1.0d27f1e52cfa3p102 ++-0x1.90e2e2c9434d0p47 ++-0x1.320164348c448p834 ++-0x1.ae1856db3911ep4 ++0x1.856b70cf9eae4p-21 ++-0x1.cdee4539c3a1cp16 ++-0x1.d00240ecaa28ep25 ++0x1.7265d25cb9ab5p0 ++-0x1.644f30279ec2ep16 ++0x1.44df430f5990ap6 ++-0x1.ac22a7e22ec86p4 ++-0x1.414fc579fa14ap15 ++0x1.6f74f627319b6p548 ++0x1.8849e2ffee284p42 ++-0x1.7cea50d8c8b5fp417 ++-0x1.986f67d38b434p0 ++-0x1.7e4044f0e0c65p-4 ++-0x1.b43eb556b532bp485 ++0x1.e2f103744c2fap-4 ++0x1.88ff52ba9330bp615 ++0x1.15db777586675p-9 ++0x1.ffbf701645e70p-1 ++0x1.8896a6f755077p34 ++-0x1.f0eb53cb17860p573 ++0x1.dc88960657275p28 ++-0x1.6af3872d10978p26 ++-0x1.db51518cc915ep9 ++-0x1.f1f4f230cbea7p14 ++-0x1.567352d25a29fp22 ++-0x1.6f6a60e8d7141p954 ++0x1.386626ca69274p23 ++0x1.30bc15e924ff3p26 ++-0x1.c601867be84dap676 ++-0x1.8c5cf7ac29180p941 ++0x1.9754c36e6ca27p-7 ++-0x1.d9167485813bcp4 ++0x1.8a9eb61165392p40 ++-0x1.df3b769ec4c96p-1 ++-0x1.aafc6751f5386p253 ++-0x1.b072707cc49e5p29 ++-0x1.b562e7eada4c3p45 ++0x1.1154b5e420252p20 ++-0x1.937f02df19998p0 ++-0x1.804dc53bf9844p933 ++-0x1.0267e6c4ce393p1 ++0x1.f2c7f1e6e1534p197 ++-0x1.55f2356cd0abap972 ++-0x1.eebc90d7dec4bp177 ++-0x1.650c65a8a6542p21 ++0x1.9826f11e25813p344 ++-0x1.3e070089db4e1p703 ++0x1.d88a20b249b8dp1005 ++0x1.44563581a1019p1 ++-0x1.b66482abc4601p29 ++0x1.829554468c236p12 ++-0x1.7f2f11a4e65b1p-17 ++0x1.c04c2222afa22p30 ++0x1.4dd7900e1a08dp9 ++-0x1.66bb03d2fbf4ap9 ++0x1.1752710b1f584p-3 ++-0x1.055de27bd3b43p21 ++-0x1.177c652007c06p1 ++-0x1.c4d410fc991ccp25 ++0x1.a53887384e01cp813 ++-0x1.7d36f1b5ee4b7p46 ++-0x1.8a3f57ff7521fp0 ++-0x1.2fcfb59864120p2 ++0x1.63bf91d1f143bp26 ++-0x1.1bc1e358d198ep56 ++-0x1.9adb13c70e083p396 ++-0x1.4e9ae34467457p-3 ++0x1.628da3632dc72p1003 ++-0x1.a01d83e08cfb9p-21 ++0x1.9854a0ff4c3c3p-9 ++-0x1.1894e1cc4b5c0p26 ++-0x1.b605c795c2cd5p45 ++-0x1.28016505a4ab7p19 ++-0x1.9c4a66c7f24a4p-24 ++0x1.26f715e1d2ef7p452 ++0x1.b66ee1e12b4ecp47 ++-0x1.fb7db206b4875p22 ++-0x1.a221962184559p15 ++-0x1.4315f238ebbbfp25 ++-0x1.44b0927e3dcb5p5 ++-0x1.6022167aa76c9p960 ++0x1.1259e16e64f7dp29 ++0x1.da683184db9ccp13 ++0x1.5e07800f8606ep21 ++0x1.30c430b6d2d47p394 ++-0x1.398662e38c15ap-26 ++-0x1.04edf4ca12198p3 ++0x1.a4d145fb27f2bp465 ++0x1.30bda21f3afa6p15 ++0x1.0ebb86cb6163fp927 ++0x1.01bca68bab9e1p-6 ++0x1.5dcff2791e7e2p-23 ++-0x1.7477f426ff684p0 ++-0x1.992ad047940bfp0 ++0x1.70c0d7fa4a49bp189 ++-0x1.9318a5d65755dp0 ++-0x1.91b161e6af6acp0 ++0x1.a51cf75f7df96p14 ++0x1.cad757aac0da3p25 ++-0x1.47af44137a0c3p940 ++-0x1.d3da77b5e1989p-5 ++-0x1.3173656fb06fap26 ++-0x1.9964b375b39cbp0 ++-0x1.500c76e1f87e0p18 ++-0x1.dcfa37b54ad38p18 ++-0x1.bcad45697b430p16 ++-0x1.7a8be3382c9a5p31 ++0x1.4a3a85b1486b2p0 ++-0x1.ccd230880d201p17 ++-0x1.c74536f317306p873 ++0x1.1f59624634972p826 ++-0x1.1e977673ce6f6p0 ++0x1.f9ed278dfc568p0 ++0x1.b5a1814d13bc2p23 ++-0x1.ef62a02276044p285 ++0x1.718856c9a1082p26 ++0x1.f7e3b2d10b444p4 ++-0x1.c41dc5c3b92f0p581 ++-0x1.2ce447adba33ep5 ++-0x1.6a15768a53241p29 ++0x1.cd9ba3f5a9474p938 ++-0x1.e753a161f7e24p104 ++-0x1.68b5a5b58c840p-11 ++0x1.267bc533526ecp23 ++-0x1.5ead471bb5306p22 ++-0x1.3618e2e425fdep23 ++-0x1.41b337f5c5f44p9 ++-0x1.6437239c568dfp243 ++-0x1.5f41d0fc227d0p-27 ++-0x1.6a89673ac0a5fp0 ++-0x1.4e2923e9941a7p-8 ++0x1.9700e4b914258p0 ++-0x1.de0e43654118ep659 ++-0x1.9f16a2675e209p-12 ++0x1.0eccb10931828p30 ++-0x1.a6d1862e5ab17p0 ++0x1.d6a1b57219403p18 ++-0x1.25c22185ff5fdp808 ++0x1.1e04b2fdb62a6p-18 ++0x1.a82b630c08134p0 ++0x1.18cb459f47a4ap31 ++0x1.77e887170bc28p0 ++-0x1.2b99174c675c6p847 ++0x1.9ddd3290f738dp9 ++0x1.4042e241ce62bp38 ++0x1.7ba716eb70543p35 ++-0x1.fb6b36a908fc7p157 ++-0x1.e5c7a7899d8dfp0 ++0x1.d222d21ce6da7p34 ++0x1.b87b679527a2ep14 ++-0x1.9abaa5ec33759p0 ++-0x1.37793205a45aap678 ++0x1.028c812928615p38 ++-0x1.feaab4fec9522p35 ++-0x1.b013e711ad8e0p-1 ++-0x1.33de92c99a948p526 ++0x1.752f25454e1bfp-25 ++-0x1.5559104e2af4ap42 ++-0x1.a569120980616p732 ++0x1.231e95b5db287p6 ++-0x1.48714153b9d5bp485 ++0x1.5f3cd25ed07ccp14 ++-0x1.3661771e7c25ep413 ++-0x1.8ee636d9e84dap21 ++-0x1.a599810bec6c0p19 ++0x1.0f3b961f24967p1 ++-0x1.1ed78232bd0ebp966 ++-0x1.7ca333893a545p9 ++-0x1.9b66327d0cb13p20 ++0x1.414327ade9b80p36 ++-0x1.c451b34ce3a1bp229 ++-0x1.ab62b00de54ebp906 ++-0x1.3b3791fe60796p28 ++-0x1.173ee0b983fd2p26 ++0x1.8f2ec3e1de32fp26 ++0x1.51bcd5ff9710ep353 ++0x1.ebaf95aef2672p1018 ++-0x1.751cd519e4a6dp0 ++-0x1.934f442067e49p0 ++-0x1.10e3913276d32p13 ++-0x1.f6b2a6a750390p24 ++-0x1.ae5b2603c4837p25 ++0x1.651942861820ap12 ++-0x1.7751460cb1104p27 ++-0x1.fe38f6d1c1756p23 ++-0x1.b17a57a6c2225p4 ++0x1.22e2f677963f1p35 ++-0x1.c406818f13a49p18 ++-0x1.f97e8481e23f1p-22 ++0x1.5cba77f17a861p37 ++-0x1.f476733bebfbbp-6 ++0x1.8258b766dee50p19 ++0x1.157fe5ff5048fp24 ++-0x1.d325f6274ab68p-12 ++-0x1.fddf647bdbeccp13 ++-0x1.c0ee32a9428dbp5 ++0x1.859d472c2aacap31 ++0x1.4880b54af8cf8p997 ++-0x1.b538b5c254d41p18 ++-0x1.677ac5634507dp21 ++0x1.815a103ec2700p95 ++0x1.32d130c393addp-21 ++-0x1.9ad38426fb1d4p14 ++-0x1.d809c40a02a12p-9 ++0x1.22da530cb9f27p14 ++0x1.cb2077ae707b1p6 ++0x1.32fcf058b7cc1p-25 ++0x1.e2e535f4c34a9p14 ++0x1.11f25046cd068p44 ++-0x1.418de55c6ae70p26 ++-0x1.aad2d3f89507fp530 ++-0x1.f88f75721f852p19 ++-0x1.f1d5a5aa4a842p-1 ++-0x1.3d902309ccfaep285 ++0x1.81c1606ce67d2p-9 ++-0x1.923fc4debf6e8p653 ++-0x1.6f31b3345c4d1p27 ++-0x1.c844d70062456p209 ++-0x1.97b2e18f6c883p0 ++0x1.f85c655d1c235p47 ++-0x1.4ba763d3c0937p20 ++-0x1.97e2e38237ddfp991 ++0x1.3701d45e325fap-15 ++-0x1.fceb0021c01aep-16 ++0x1.3929b7bbecc6fp19 ++-0x1.03c5042796010p938 ++0x1.e6a2b1ce3c89cp5 ++-0x1.8462c75fc795dp0 ++0x1.91a9b66ac4b2bp-2 ++0x1.a9adb0a7e864dp13 ++0x1.a222963d65a5fp18 ++0x1.fb3f11b5edae9p19 ++0x1.d279f26eb8775p-23 ++0x1.843003a410f87p585 ++-0x1.3781e023929a1p12 ++0x1.2f9ea3013e0c3p20 ++-0x1.65fb7629d55f9p618 ++0x1.5420d77378e62p1 ++-0x1.2c9cb0653355fp18 ++0x1.e5fec6e9b62cfp887 ++-0x1.04671129ac1b4p1 ++-0x1.8e99f30cb98e2p11 ++-0x1.80c376dbeab92p3 ++0x1.5d03e053a3f66p-13 ++0x1.6a609415d4822p3 ++0x1.4b0c946ec7a18p10 ++-0x1.6ce16241882f4p1008 ++-0x1.9ca3b5624a1f7p1 ++0x1.adeb34123b9a7p783 ++0x1.657df688fca05p4 ++0x1.7ec760fb6453ep971 ++-0x1.00bd533686e8ap8 ++0x1.ddc5b4c3146fap8 ++-0x1.dabfe4e152cc1p5 ++-0x1.9a83878c11a1bp195 ++-0x1.136c90eb454fdp38 ++-0x1.b129d413e2968p17 ++-0x1.bb21f5afd3c12p17 ++0x1.aeebb6948401fp25 ++-0x1.d10366f45a92ap5 ++0x1.66a9f0a63563fp19 ++0x1.8faa7348340a6p0 ++-0x1.5770156e64fe3p46 ++-0x1.0729f6a9d0fcdp5 ++-0x1.98c0e5d74567cp14 ++0x1.ba55a5ebf7965p36 ++0x1.1d6121dab3ef9p111 ++0x1.fa14c03e032b3p938 ++0x1.9c853700c2470p145 ++0x1.6a17454e5a6d1p-27 ++-0x1.1788b486450c5p1 ++0x1.edb9e180065b6p24 ++0x1.7b14f0a7c6c73p18 ++-0x1.40b0e4d7ee3b2p15 ++0x1.8711c71648cfcp16 ++-0x1.3e46a54242738p11 ++0x1.87dbb061d7c81p1 ++-0x1.6c23a559a0b0bp33 ++0x1.eedc82db40e8fp535 ++0x1.6e44b32d58e96p26 ++0x1.2ce240a6fb9e0p0 ++-0x1.8aa3e3dafbd1cp82 ++-0x1.be96c2479bfb8p6 ++-0x1.827e97ba4a30cp-19 ++-0x1.df8f04c1be1a0p8 ++0x1.9177448bb2b38p31 ++0x1.1048a637ba992p316 ++-0x1.3c865406d78e5p25 ++0x1.0bce74034850ap9 ++0x1.72cc021c86b4ap847 ++-0x1.935a854cd1476p-26 ++-0x1.c209c22dded2ap46 ++-0x1.bfa07289be7dfp-14 ++-0x1.9180653f54946p-18 ++-0x1.c135d03366185p15 ++-0x1.b40e326cb48f5p0 ++-0x1.c675728b6bb2dp1013 ++0x1.19da179d6babdp725 ++0x1.978d06c2067edp17 ++-0x1.cdb5141b33586p645 ++-0x1.9773558b653ecp25 ++0x1.3b567232f3129p632 ++-0x1.786a8125b5258p104 ++-0x1.5ed511cf3e2a8p11 ++-0x1.3f2b56cc2b7c4p806 ++-0x1.9c1a73744e1f5p34 ++-0x1.3c4627661ba9bp42 ++0x1.6fee415f36b1bp24 ++-0x1.f37db348601b2p47 ++0x1.48d277f108c4dp26 ++0x1.664a14b032392p-4 ++0x1.b50335690a9cep403 ++-0x1.327550e6d7fc6p307 ++0x1.6d0f1274d1dbdp541 ++0x1.1c10d39266f66p29 ++-0x1.5a7b45e2f574bp519 ++0x1.0ea38771f6368p22 ++-0x1.34aa02c4c29a6p276 ++-0x1.f3e1a33c418cep-25 ++0x1.30ede40680d9bp632 ++-0x1.030c57ef82307p854 ++-0x1.1f71476c9daf5p8 ++-0x1.dd4640ef11f44p-1 ++0x1.29f9e4b905d41p20 ++-0x1.c33d15648e005p23 ++0x1.6fb53008a6b5ep8 ++-0x1.19f050cc3775ap41 ++-0x1.141935fe4ebddp37 ++-0x1.06c48202a2cbdp0 ++0x1.e9a6e18ebee69p15 ++0x1.2967e001ffd42p22 ++-0x1.8c9c860e895d3p0 ++0x1.68db63ee856a6p16 ++0x1.39e5c24814662p-26 ++0x1.7766a41257495p0 ++-0x1.5e9c33d60ff5fp25 ++0x1.522da4c04faf8p8 ++-0x1.dba0a5618fbf4p34 ++-0x1.c0d3761bbcf56p-1 ++0x1.17a5f7795ad55p40 ++0x1.55f1834a06b07p704 ++0x1.3e78a1243c4fcp26 ++0x1.659c33e8bdffcp43 ++-0x1.f24077bc9318bp661 ++-0x1.ab7d700809e49p782 ++0x1.40584524cb947p0 ++0x1.997c3124d8d86p0 ++0x1.6498074e6f48ap18 ++-0x1.3cc550fa2907bp-16 ++-0x1.3c5527246d6e0p22 ++0x1.a9ca27fe5c9fap22 ++-0x1.28bbb66ee75c7p-24 ++0x1.3feb704d719c4p33 ++0x1.a85103490c12fp0 ++0x1.23edf714f214cp12 ++-0x1.f89114f814a26p10 ++-0x1.8b4005ac68fe8p40 ++0x1.d0c2c73a140f4p18 ++0x1.f12744da61839p938 ++-0x1.4972e012e3bf3p13 ++-0x1.5f6516206cdfcp36 ++-0x1.78f5a5f3d9d8ep13 ++0x1.abdad6b9b65ffp11 ++-0x1.628061c2a64c3p13 ++-0x1.36f50079f514cp26 ++-0x1.26cff62e0a07fp16 ++-0x1.3396e025b96fbp1 ++-0x1.de90b2fae57c1p994 ++0x1.8e5f7741ef5e3p923 ++0x1.9328e3f117564p152 ++-0x1.846ea1da5dc69p615 ++-0x1.4ef3442b14b4dp8 ++-0x1.930c272b3b81dp0 ++0x1.9937743f54e33p-6 ++0x1.64fbc187d66ddp38 ++0x1.653842167c192p12 ++-0x1.99a6209d27f46p10 ++0x1.8ccf525e85a45p25 ++-0x1.0e66241e41d8ep14 ++0x1.740b47e3b8ba6p354 ++-0x1.be957129fb4d2p30 ++0x1.e735d2e16e62dp16 ++0x1.e06c66d10af7ep2 ++-0x1.70c843db3c498p24 ++-0x1.356eb6baad693p592 ++0x1.ac5906747d463p22 ++-0x1.4c81404800155p-18 ++0x1.c24ba6d35df27p-1 ++-0x1.df3b814baebc5p-7 ++-0x1.4fbe7514e3468p4 ++-0x1.71a020b06860bp35 ++-0x1.7ea9145079ffdp0 ++-0x1.43f857a537751p8 ++-0x1.5be44475bd43cp12 ++0x1.55b1d5d904e1ep-24 ++-0x1.abd0b159d0c99p5 ++0x1.7dad06b80c10cp25 ++0x1.7b5dc3d6f8d01p0 ++0x1.1afd7477d74e6p24 ++-0x1.68b33313d93cap20 ++0x1.d68ef5c08f978p46 ++-0x1.256832b9bea68p-23 ++0x1.86deb6e0c31c7p24 ++-0x1.009863c410effp29 ++0x1.dec46182fd6afp25 ++-0x1.7cb163ac511e3p14 ++0x1.354831ca22ed5p19 ++0x1.3047707ea0defp-8 ++0x1.2c09254310224p1 ++-0x1.3d3c872e8b875p0 ++0x1.3fd2c5814d3c4p8 ++-0x1.9b7303763a412p555 ++-0x1.0e34256cf4983p12 ++-0x1.23e1a4d5f82aap22 ++-0x1.515492c6d3c3dp45 ++0x1.7007916be678cp-2 ++-0x1.569787a433b8bp814 ++-0x1.ec3d210f868dep-1 ++-0x1.6b75355e1f926p5 ++-0x1.625c03a0df70ap22 ++0x1.966563060d94ep40 ++-0x1.ba81f6776bb22p37 ++0x1.6cf5927b93cfcp-5 ++0x1.70cbc6b62c369p483 ++0x1.9e8c70de208cap19 ++-0x1.9f463097a5d99p11 ++-0x1.58c534ba51fb4p40 ++0x1.4f8b82099edeep26 ++0x1.d09bf7ba88cb7p24 ++-0x1.6c7af75665821p13 ++0x1.6e97b1ae6f120p17 ++-0x1.7bdcf42df8f3dp148 ++-0x1.2ee1e501c5c44p8 ++-0x1.c07117e66c01fp3 ++-0x1.b6624589e86f8p39 ++-0x1.3d3b360fdb23dp7 ++-0x1.2582b11ecc116p336 ++0x1.7481a321f5256p31 ++-0x1.222ab3691571ep19 ++-0x1.1e419246f958dp1 ++0x1.ab51c6feeab27p23 ++-0x1.7250449530cacp12 ++0x1.163fa61f55b34p4 ++0x1.8191c3fab648bp26 ++0x1.e574e641e9953p36 ++0x1.bcb7d57a8be21p19 ++-0x1.cdbdf1f04e27dp713 ++0x1.619bf59c7d8c9p-2 ++0x1.efd0252da4206p9 ++0x1.37a88102e8fb0p484 ++0x1.cc89f0ea997bfp-22 ++0x1.8dedf0760d306p629 ++-0x1.a13e8382b5f97p0 ++-0x1.a82aa369fc6ecp430 ++-0x1.beffb6d4defb8p-22 ++0x1.f1a644b10c6d9p7 ++0x1.9dfa508a997e0p7 ++0x1.0daa03637d98ap162 ++-0x1.b8c876b5e4a9dp0 ++0x1.ff125371e1bc4p-1 ++-0x1.949833005771cp0 ++0x1.c0c55430f9cbdp3 ++-0x1.714f570923bd4p926 ++-0x1.ab5b85f19aa66p0 ++-0x1.65c85390b2408p781 ++0x1.ec07655eaaf47p38 ++-0x1.e544715929a02p494 ++0x1.7ed0279df0f77p-17 ++0x1.6fb3a12754691p36 ++-0x1.41ab405178a11p142 ++-0x1.db6871f3c584dp0 ++-0x1.c0d186c2b6b34p25 ++-0x1.186545efdec01p15 ++-0x1.e4dd47a4fe36cp12 ++-0x1.2be85575eb960p9 ++-0x1.7514576624239p636 ++0x1.ca44724938996p20 ++0x1.c00ea79ff62a3p15 ++0x1.e4b5b4ced3371p18 ++-0x1.e802b666b8b3bp576 ++-0x1.0f58d230a2735p37 ++0x1.20b346f87c5fap5 ++0x1.0f1be20502191p13 ++0x1.d5b9262dfe8cep16 ++0x1.1c8e4596c422dp25 ++-0x1.3046a7fbcb787p28 ++0x1.c936670321b1bp624 ++-0x1.3b7c709a4d739p25 ++-0x1.3ad3b52b7a8bbp6 ++-0x1.9c77c3ed0da77p534 ++-0x1.b430a641670b4p9 ++0x1.bb4e427cf8f00p5 ++-0x1.bdd570ddd9f21p498 ++-0x1.5fffb06dce6d9p0 ++-0x1.31b725a7f4c50p-1 ++-0x1.4a5e165da5c90p257 ++-0x1.7a9d706ea21aap632 ++-0x1.c13902aa3b501p-16 ++-0x1.34378127441dep16 ++0x1.1899667507aa0p8 ++0x1.b2199455cf381p17 ++-0x1.4c1941a32328ap13 ++0x1.18f575bcb47d3p15 ++0x1.24c4f7f41c27fp17 ++-0x1.778b636eb24aap31 ++0x1.c76120a96993dp19 ++0x1.0900d47dafcf3p702 ++-0x1.89c9464bb2574p0 ++0x1.8504779144b5dp0 ++-0x1.726f662aba5b1p20 ++-0x1.1c5ca2fd655c3p26 ++0x1.b5b0544ca94dbp910 ++0x1.c9930669c935ep-18 ++-0x1.fa0ed41cc58c8p37 ++-0x1.6b60a27346578p-27 ++0x1.5219873f67d7cp12 ++-0x1.7a2c7684be1c6p0 ++-0x1.613492313ae4ap7 ++0x1.806334d1e4496p711 ++-0x1.88e563a4c9a58p7 ++0x1.33c076dccc763p13 ++0x1.11ed850120464p839 ++-0x1.75ea967c17be9p495 ++-0x1.ba72f7be7c7ccp14 ++0x1.7589e0d04c4b8p189 ++0x1.8417412710306p3 ++-0x1.cade31e811061p437 ++-0x1.974b573315304p-24 ++-0x1.ac42144bfc176p24 ++-0x1.7bed32fc75c59p11 ++-0x1.4825d5ba1f52bp13 ++-0x1.c3bbd693a499dp6 ++0x1.38c470d825bc5p3 ++0x1.4ed3556f8eb84p411 ++-0x1.a632636e736fep4 ++0x1.211be5b96be3ep-22 ++-0x1.8cdba14cb1ed8p12 ++-0x1.9a7b35414dc4dp16 ++-0x1.d5d9a0afa77cfp634 ++0x1.c34cb68989b32p17 ++-0x1.84ba041f02caap0 ++0x1.61a51738c63e5p18 ++-0x1.3f37a3e362c12p-5 ++-0x1.b0166656ecf80p20 ++0x1.45f4822152389p13 ++-0x1.ac54855cc74bfp25 ++0x1.b9ddc53febefap453 ++0x1.cfc301950d687p1015 ++0x1.1cb21718dca32p23 ++-0x1.232350a52c4f7p983 ++0x1.d6e6a10d548e5p23 ++0x1.977056a2668eap292 ++-0x1.ffc1c328d34b1p3 ++0x1.91d0e100810d6p-9 ++-0x1.3e0756498d337p1 ++-0x1.b68aa43ff9110p45 ++0x1.a53200b957e9dp-6 ++-0x1.c39415555077fp-6 ++-0x1.aef7328553c7cp0 ++0x1.f2059429fcdd8p23 ++0x1.8a50e7c0eec78p17 ++-0x1.c21e6658d1fe7p-1 ++0x1.9ce192ed63b28p23 ++0x1.da1012047ba28p41 ++-0x1.b09f87dd277f2p10 ++0x1.e58ab4f8ef73fp22 ++0x1.9672675520b23p0 ++0x1.010b17f807152p45 ++-0x1.92d967fe78b7dp831 ++-0x1.a71196fb66603p303 ++-0x1.2786d24ce59c8p-20 ++-0x1.ad6e7205f5d75p150 ++-0x1.6c9037f2ec353p44 ++-0x1.800ee1d7cd409p914 ++-0x1.cac7e495263ffp605 ++-0x1.d6a7e7ccedfefp796 ++-0x1.1ee981d337986p-9 ++0x1.bbb3427565a92p474 ++-0x1.c42631df1cefap44 ++-0x1.e04a92f8f896bp-1 ++0x1.d2a2e5778cc7ep899 ++-0x1.bc30d7beea737p986 ++-0x1.7ede11aa7d47fp18 ++-0x1.489a02a167b04p32 ++-0x1.9257b27ecc0d6p6 ++0x1.12ab65c6d3b81p46 ++0x1.d50d624f63097p24 ++0x1.e88f961d0afddp23 ++-0x1.1f8fd098fdee0p-14 ++-0x1.5c8862170e148p-16 ++-0x1.abd9759e682c6p4 ++-0x1.f1ac241ecfa70p-16 ++-0x1.bf27001863e98p558 ++-0x1.c3a843ee1f309p15 ++-0x1.5458e7f6ecfeap22 ++0x1.af31467613f65p0 ++0x1.665d563797d5ap13 ++0x1.f305a29da24c2p4 ++-0x1.4062318aed418p12 ++0x1.7b7721549420bp0 ++-0x1.ed9ce71907bf6p15 ++-0x1.95a9a284af0c1p843 ++-0x1.0f46820718da8p16 ++0x1.305e23b30adf3p859 ++0x1.3c1fb3275314dp15 ++0x1.e58eb396e0188p31 ++-0x1.7c43c46f53c30p8 ++0x1.4cd3202666397p-6 ++-0x1.ca6216ef28d3ep784 ++-0x1.7435667810fd5p-20 ++-0x1.adf8179db7d4dp23 ++-0x1.dc08b58090270p28 ++0x1.d1f4356f2e4a6p27 ++0x1.eb1f447c6659cp13 ++0x1.f2d524e96e3f9p523 ++0x1.1ca5d135f4a81p5 ++-0x1.b7cd435089283p499 ++0x1.9b3f745c109c0p25 ++-0x1.aebc724bc9f13p917 ++-0x1.0cba50c3750c5p922 ++0x1.5f59539f3c424p8 ++-0x1.08889270ebac4p549 ++0x1.d6d2815236c18p37 ++-0x1.f53a4227c3cbbp10 ++0x1.8d29342fe90aap22 ++-0x1.491bf16e3b738p36 ++0x1.8fb153cddee3cp34 ++0x1.cad7f140e42e8p1020 ++0x1.0ae2e6fd71d2cp30 ++-0x1.e84ee3f73d212p-1 ++-0x1.7231326f8e61fp650 ++0x1.ac0311909abe5p966 ++0x1.d5f7e441a9096p411 ++-0x1.75e293eb1043dp24 ++0x1.7be84683271cep572 ++0x1.5f8ff3c680e11p36 ++0x1.cf03874ee3db3p334 ++-0x1.58c8c1e8be2edp632 ++-0x1.baee66c1245c4p9 ++0x1.8ced030bb09e6p108 ++-0x1.fda225f8ecb2dp368 ++0x1.63d8c15566bc3p-1 ++0x1.9bbd74b01b538p2 ++-0x1.16ed44021834bp12 ++-0x1.0235450de863ap29 ++0x1.9428b5952ead7p23 ++0x1.a512872ac8875p0 ++-0x1.8f7e94f6ce64ep-24 ++0x1.9d9de34f631a6p0 ++0x1.02ee55a75cb5dp-3 ++-0x1.0b6532e2c6919p-24 ++0x1.9caaa1946b56dp0 ++-0x1.efc845be18280p258 ++-0x1.4177b13af435cp16 ++0x1.564ad7ff494fep20 ++-0x1.21e081ad2d02cp312 ++-0x1.a4da0315686e9p0 ++0x1.663bb46627e4bp40 ++0x1.618f84e86d1aep22 ++0x1.4dedf383d4291p888 ++-0x1.bb9d0678f7888p3 ++0x1.5319a1e934edap186 ++0x1.1c0897fc41663p10 ++0x1.8b6dd26fc7f0cp21 ++-0x1.342a0316bd81bp20 ++-0x1.ca34766b88f7bp553 ++0x1.8a65224d8b44fp188 ++-0x1.3637e3eee59b1p-24 ++0x1.549801faaed00p14 ++-0x1.a08912a6fa581p39 ++-0x1.06bd137276b59p226 ++0x1.4368a18959df2p17 ++-0x1.b4bca5db9d268p-1 ++0x1.394126b0c3cf8p3 ++-0x1.8654666821399p831 ++-0x1.f79af4f836b2cp21 ++0x1.9942b024fb0d3p0 ++-0x1.1ebad7277d725p-12 ++-0x1.fedb203dad286p19 ++-0x1.40a4d27a54422p29 ++-0x1.a27013a6b5db3p-16 ++-0x1.eca7e4e273765p951 ++-0x1.dedf0543ecdcfp12 ++0x1.7b7ec1819cff0p24 ++0x1.064b131f15337p24 ++-0x1.a5f5949b9f801p9 ++0x1.a3bcf0c3c2f0cp184 ++-0x1.83b94461ba34ap-6 ++-0x1.5992353ea24efp17 ++-0x1.194a036ff1ae4p43 ++0x1.e0d7d07382e99p42 ++0x1.8ad3f033a34f7p31 ++-0x1.c9fdd72e0cce7p8 ++0x1.ac66c27ae4518p-14 ++0x1.1aad20c97ef2bp-24 ++0x1.c687a7e1b3bb2p771 ++0x1.02ce270f74c87p-10 ++0x1.1562759c45e83p-2 ++-0x1.5bf0b43affc94p40 ++-0x1.eb88d184013f1p25 ++-0x1.bcd3d71c4a84dp15 ++-0x1.feb5845a4017ep2 ++-0x1.6e1c807e05452p36 ++0x1.450494828da68p25 ++0x1.7fe6d347bc643p75 ++-0x1.1b70f1ea5a1a4p23 ++-0x1.2171070c39370p460 ++0x1.c0bfd441a9070p172 ++-0x1.dff6d1ed042eap155 ++0x1.1064c4ba80b64p916 ++-0x1.ef5113553c112p310 ++0x1.8dcbe38231eafp-11 ++0x1.48d1a6fc900a2p519 ++-0x1.bce42351af42dp20 ++0x1.a169a56cb6b12p-13 ++-0x1.750fd2fdd73d5p-25 ++0x1.b92933b734341p24 ++0x1.a50cf516689b3p19 ++0x1.5de0c597781e3p17 ++0x1.bd70b0b71c3e5p351 ++0x1.eacc7731e857cp495 ++0x1.a3fb42a165580p22 ++-0x1.8f76c56e255b4p-14 ++-0x1.9fbdb32a35c6cp141 ++0x1.c3c477621a74bp378 ++-0x1.8c380783af50ap2 ++-0x1.a05d50261fe1fp5 ++0x1.e088235d1a76dp25 ++0x1.5011713801c4dp5 ++0x1.264d4420ae3abp15 ++-0x1.d2ac4569a1c6ap785 ++0x1.0411b74a91529p199 ++-0x1.4657b01035e58p26 ++-0x1.d25ad603e04e0p23 ++-0x1.0bfd05a085350p26 ++-0x1.974fb15d3aa9bp10 ++-0x1.06b730454c09ap1 ++0x1.20a7a61fe0c14p23 ++0x1.2a3e5568a88d1p-15 ++0x1.478f810da74a7p34 ++0x1.13486653f1c89p0 ++0x1.37e3105c65d09p2 ++0x1.d8db173b39e12p685 ++0x1.f33e80726ece4p-1 ++-0x1.27e633778cc62p-9 ++0x1.f4af54734e49ep36 ++0x1.94e76082b3cfep20 ++0x1.bf1ca6e0f5864p23 ++-0x1.901a9197545a8p0 ++0x1.132c37fab90d3p-16 ++0x1.83d2770599e1cp470 ++0x1.2091760b362aap-5 ++0x1.04e4c158364eap250 ++-0x1.c44196bcbc78ep23 ++-0x1.7698c2d4504ecp0 ++0x1.74db0716d3237p857 ++0x1.86c78536631bcp0 ++-0x1.28dad63946e6bp21 ++0x1.3fb691eee1a19p24 ++-0x1.3a048091bbb1cp21 ++-0x1.fc9b13357eec8p14 ++-0x1.11f6d7b366483p-4 ++-0x1.1d2690d2fc3c9p13 ++-0x1.b404c2560d76ep34 ++0x1.f7ed62a6e49d8p18 ++0x1.7245829fb1c45p500 ++-0x1.27b61792a550dp581 ++-0x1.e51cb307c265cp20 ++0x1.f12564eb04cecp0 ++0x1.fb9b7593d9ae8p843 ++0x1.94abf50c1ae27p26 ++-0x1.bb7a62f317dccp221 ++-0x1.659ae30b4af07p674 ++0x1.eeda462ccc67cp9 ++-0x1.d6ec454444ad5p30 ++0x1.edc3b03486bc9p-1 ++0x1.8c359325387c4p169 ++0x1.a46ec36418dfbp0 ++-0x1.668df7872660ap231 ++-0x1.7a3f30b53dbbdp20 ++-0x1.186542f9de11ap13 ++-0x1.ac3103ff8d0dep956 ++-0x1.1701e1f4b7a28p45 ++-0x1.a77534a41661bp26 ++-0x1.805b83ca4a983p741 ++0x1.9b8e34cafe7d1p237 ++-0x1.7d6591476c813p11 ++0x1.2564573a6270ep10 ++-0x1.34d5721bd9e2fp205 ++-0x1.2d24c4f0d1402p21 ++0x1.3975d02ae228ap26 ++-0x1.c520231d589a8p12 ++0x1.841ed75a75d69p0 ++-0x1.6c6be6fa5913ep39 ++0x1.c44db37db2cafp267 ++0x1.92d8e08dcc638p24 ++0x1.87c7a090d5ce1p-16 ++0x1.3130f2cb35283p773 ++0x1.87fc94babfa17p14 ++-0x1.35d156f2365eap663 ++0x1.7f0c71af5cf7fp-2 ++0x1.c1171538bad68p509 ++-0x1.6d8c4522af157p8 ++0x1.6923c7c62dd28p43 ++-0x1.cc29d0dd1d0a8p7 ++0x1.b35e40c13ab28p12 ++-0x1.9771f23aa28b8p2 ++0x1.fc625426d9743p-1 ++0x1.f2eac0a3b585bp18 ++0x1.1bf6e59ca97eap-26 ++-0x1.1a5641181130dp574 ++0x1.c65aa7a45b0efp25 ++0x1.db74347a72291p23 ++0x1.82abe2590802fp0 ++-0x1.021815669b26cp643 ++-0x1.4b5f153d3a4a7p37 ++-0x1.3ffba4bbd1cf6p15 ++-0x1.06b1963b06e9fp75 ++0x1.1f230613bbeacp18 ++0x1.65da91ad037c7p25 ++0x1.efbe10dba52b5p690 ++0x1.dc82d7dbf1ef2p4 ++-0x1.a78d8512d1313p5 ++-0x1.87f2d6caba40cp20 ++0x1.6e4bb6102226ap500 ++0x1.a88fe25344e53p45 ++-0x1.cf03e69d00b76p16 ++-0x1.a69333452a9c5p12 ++0x1.dd2e13a94b242p6 ++-0x1.ce73036c98611p23 ++0x1.91e9d1ac14305p10 ++-0x1.68e6a230c0c32p26 ++-0x1.167d022857473p12 ++-0x1.c4d8a56a3c59fp21 ++0x1.76fd938c01180p0 ++-0x1.9f3023d3fe5cfp-9 ++-0x1.25c1b071f9f0ep744 ++0x1.d3a0d06d79bd8p447 ++-0x1.205561bc373c0p70 ++-0x1.bb14c219cf119p39 ++0x1.3fc332e6a45d1p1001 ++0x1.a94ac5e537ddcp31 ++-0x1.455b03fb1f252p19 ++-0x1.398ff64a119b4p164 ++0x1.a6d3422953772p7 ++0x1.e4f53738724b7p35 ++-0x1.e3c923a871c32p20 ++0x1.3f7a33b9f877cp625 ++-0x1.b08cd29c8af3cp41 ++0x1.41e0545a9fd41p44 ++-0x1.37adf744bfbf4p781 ++-0x1.f9b3e0086091dp-9 ++0x1.c7cd625a6ffd9p27 ++0x1.44dac65c6e037p527 ++-0x1.b465f6c0968a6p0 ++0x1.145960c880918p400 ++0x1.bdda37840188cp16 ++0x1.31f306f18f6bbp3 ++0x1.4e51a42a59d1dp465 ++-0x1.84b5b6411630dp-9 ++0x1.b91e57055ad75p9 ++0x1.4873658bb25a1p27 ++-0x1.f03661c52ba71p15 ++-0x1.eacd674476419p5 ++0x1.aaae40a57b08ap41 ++-0x1.549d609dbc23ep7 ++0x1.b9b6227653d8dp4 ++-0x1.1bded0f0b7680p561 ++-0x1.e92355003abc3p-20 ++0x1.dad677e6137b5p29 ++-0x1.e196a69741820p21 ++-0x1.635324c3f6b71p45 ++-0x1.0e1687acad9b8p823 ++0x1.a1d7a6774c9a9p0 ++0x1.cbca47ac9b582p11 ++-0x1.acda422c4bea7p-7 ++0x1.621f73a497a57p-16 ++-0x1.b8c9242605781p864 ++-0x1.db3792a5149fbp0 ++0x1.8862c65ee2160p-17 ++0x1.d6dd16228de1fp-10 ++-0x1.b88502e85c4e6p3 ++-0x1.c1a4c6ca9cb90p23 ++-0x1.cc1cf066e7a33p25 ++-0x1.b5e1749178cf6p744 ++0x1.dfc7054b12578p12 ++-0x1.29ec85df3a58cp334 ++-0x1.85b8b0c95dbd5p13 ++0x1.7257e1349b295p33 ++0x1.9d85520001790p129 ++-0x1.793fe72cc8c1bp215 ++0x1.739df4f1e7750p25 ++-0x1.a98cd0bd8bf08p22 ++0x1.cd8da092fb8dap89 ++0x1.8c16c534ebb2bp-11 ++-0x1.abb2c2ad80b34p14 ++0x1.2de7338716d92p-18 ++0x1.9211d060f4465p-3 ++-0x1.72fc35651040dp0 ++0x1.2a26d2667b91cp29 ++-0x1.f4b0d40e31bbcp19 ++0x1.fbbe40d2d31c3p25 ++-0x1.9f4c04b486a5ep19 ++-0x1.45193205aa9c4p164 ++-0x1.37a8b60e2d5cep6 ++-0x1.3988f220e6441p-26 ++0x1.493d31fd3c02ap82 ++0x1.2b3340bd6f2a1p39 ++-0x1.54cbb04f2304ap-1 ++0x1.926940fdef273p38 ++-0x1.45ea2765ca2dfp24 ++-0x1.ed0821bb849eep479 ++0x1.4fba868adf04bp16 ++-0x1.e9d417e0bc17cp0 ++-0x1.f4f965b3faf30p17 ++0x1.7d7f77efe5d3fp23 ++0x1.50cfc50c2f640p24 ++-0x1.cf1df3c5ffe17p46 ++0x1.f936b6dca473cp211 ++-0x1.8a1406e6ee482p11 ++0x1.463197698d0d5p101 ++0x1.2409659b805cep7 ++-0x1.3b3d65813a051p191 ++0x1.06ce059e85ca0p0 ++0x1.b60c06f9f5398p6 ++0x1.d60fe7ff7c31cp12 ++-0x1.07b0f652e0470p5 ++-0x1.4580b6d0afe76p50 ++0x1.e21807ed764cep-18 ++0x1.fdc865ca4cd63p-1 ++-0x1.c499a71b0ca05p269 ++0x1.0d75e2b8a7955p160 ++0x1.6a04420a71954p-27 ++0x1.763e053587862p7 ++-0x1.39ef5367547b0p5 ++-0x1.2b2e67b7a8bcfp24 ++0x1.86f6e7b54f573p2 ++0x1.c2b6e3acd3d96p35 ++-0x1.e97ef093600a2p11 ++-0x1.c572f3826cf29p980 ++0x1.796b642ff617cp-3 ++0x1.601b631f840c9p-14 ++-0x1.8eba049870e51p902 ++-0x1.3b17c1c67a109p25 ++0x1.d305139f10a36p17 ++0x1.ec817466d70a7p0 ++-0x1.1265c21b2d99fp245 ++0x1.d1fe37e14bb77p-1 ++-0x1.f178f690d9f42p6 ++0x1.40e3362b70ed9p481 ++-0x1.6a04a793aaf0fp-12 ++-0x1.8245c6bdd8165p16 ++-0x1.7264a53f935a8p10 ++-0x1.13fba79ae44ccp18 ++-0x1.eb9557cea7ac8p0 ++-0x1.8ec847721bf13p26 ++0x1.74d974321f101p-12 ++-0x1.bb1c86a8ca6a4p35 ++-0x1.0c4b1052754aep459 ++0x1.067f874c51947p15 ++-0x1.9cdeb085dbf66p-25 ++0x1.e03a470b607f6p32 ++0x1.3f70e0d5faf68p782 ++-0x1.0d7ac25499901p39 ++-0x1.d0c8711803183p-4 ++0x1.dddfb43ab15dbp49 ++0x1.80dc4549bc143p-2 ++-0x1.8432c6e6dbcb8p46 ++-0x1.e7a2c04ccff8ep46 ++-0x1.453a2503dad3bp-26 ++0x1.3bf04538c0bcfp706 ++0x1.b909a6eac3c92p21 ++-0x1.7a6db4a0188cap9 ++-0x1.1d3e80b32c07ep-11 ++-0x1.43fbf1bf87d6ap978 ++-0x1.d24c3457d0d3cp15 ++0x1.106e24eadb4efp207 ++-0x1.291f20d923034p-15 ++0x1.910ca4ab8908dp12 ++-0x1.8f25f39b6831dp-23 ++-0x1.eb0a55dd34df9p25 ++-0x1.6aa47787b6253p834 ++-0x1.7574d59d3717bp41 ++-0x1.cf28f24daf9f0p234 ++0x1.7760660a714d0p0 ++-0x1.a38422219ffe8p25 ++0x1.52d2453a853c0p47 ++0x1.905551119e9e1p930 ++-0x1.5f7e4096319e3p844 ++0x1.9c7951ed1ddf7p11 ++0x1.a16287317c9fcp879 ++-0x1.0804647cb4089p-1 ++0x1.a886323cf0d4ap512 ++0x1.1ff6b66d5ebe7p41 ++0x1.4ab1627ed8fe0p12 ++-0x1.a32a8757fb5eep542 ++0x1.5f89860e18209p24 ++0x1.7dcfd293f582ap-8 ++-0x1.13f813514eaafp591 ++-0x1.e5e046e81a4a0p315 ++0x1.f4b365dbf8bf5p874 ++0x1.c8a4e5e39c9c2p1018 ++0x1.fa6c62b3010cep649 ++0x1.c2de84df7c3e5p934 ++0x1.af51a42607dc8p-18 ++0x1.88a3d1f1000cfp874 ++-0x1.7a4744d42926cp0 ++0x1.aa8de5d123c00p-1 ++-0x1.5255469b0b1a0p21 ++-0x1.ddce133b21c51p426 ++-0x1.324320eae37c5p23 ++0x1.ae4c1209db983p-5 ++-0x1.b856a600fbd98p38 ++0x1.6f4d04c321f75p21 ++0x1.01475416807a5p9 ++0x1.9d38235f415fdp-13 ++0x1.206ec06d9ab68p-10 ++0x1.bb75b35deec78p33 ++-0x1.1696b22d64f95p113 ++0x1.c1df8560b5cbdp18 ++0x1.52a872c448619p39 ++-0x1.1ef841f17fc34p85 ++-0x1.f133c2e3045d9p-2 ++-0x1.129596a5af08ap-7 ++-0x1.c93715d49ac3ap41 ++0x1.603ac7f2c733dp10 ++-0x1.d3fbb47476501p143 ++-0x1.8cacb5e52c001p26 ++-0x1.a3c87118d19b3p33 ++0x1.222aa2db4190ap25 ++-0x1.5409a38a92aa7p872 ++0x1.38cf32c6b7d09p-9 ++0x1.a4ec535aa90d5p25 ++-0x1.42daf51bf5934p839 ++-0x1.316b8421f5fd1p-15 ++0x1.b1f814b0326e5p697 ++0x1.a9ffc120ca209p668 ++0x1.d058e125f023fp790 ++-0x1.5112b5102f58ep137 ++-0x1.4202328599a61p29 ++0x1.da41b5d447aa6p454 ++-0x1.ef77a65167e5cp24 ++-0x1.0e6276669fc5bp32 ++0x1.b0a6d77eb6c83p-4 ++0x1.1a345788bd44dp546 ++0x1.41f4053900144p-19 ++0x1.057f512cc3bc7p14 ++0x1.6e8b02db1ffd6p105 ++0x1.7ce35635e252ap0 ++-0x1.b96b40b776baep24 ++0x1.ff4ab03720fa9p-4 ++-0x1.adf7c2f3f7875p14 ++0x1.e870529e21dcfp17 ++0x1.d63b208262928p25 ++-0x1.3891962477405p7 ++-0x1.437ff414d0fa9p19 ++-0x1.291a550edea92p5 ++0x1.9ec093b7eb3b2p375 ++-0x1.8ed4f1b3bafe7p626 ++-0x1.b41a54850cf23p712 ++-0x1.a6bc42ea33f9fp767 ++-0x1.2d9bb56ea445ap35 ++-0x1.aece85e37b54ap0 ++0x1.246751c26d13bp296 ++0x1.f2e7f697a2d1fp29 ++0x1.6c37a490520bcp26 ++-0x1.ff8603bbcf498p2 ++0x1.362023b6cd6b2p31 ++0x1.cf2d87e53206ap0 ++0x1.8fe7a627af176p9 ++0x1.8a1ba043b40b9p6 ++-0x1.8615b0b70103fp0 ++0x1.7db401923e93dp923 ++0x1.6f54e4a864f17p0 ++-0x1.86c5665be0ef3p43 ++0x1.6b5066bfcc388p26 ++0x1.20d1f69be6b86p3 ++-0x1.d177e68f841d5p-1 ++0x1.fc49110300d0dp-2 ++-0x1.bd5bb6e1c5f43p-1 ++-0x1.139a94e47ca10p-9 ++-0x1.ac36349c2d3e8p6 ++0x1.7698522ba5c25p216 ++-0x1.62a700634c519p228 ++0x1.dc4a17d8c584ep-13 ++-0x1.052aa2ae959adp25 ++0x1.d6adb0d709d68p17 ++-0x1.0c4c506cc6c2bp79 ++0x1.7977c290c1798p0 ++-0x1.684b477bd74e1p39 ++0x1.bae964ed32d31p-2 ++-0x1.aa5d80bdd8324p24 ++0x1.b8ba85fbfb8adp21 ++0x1.e4eb26b6aaa01p20 ++-0x1.ec2a365168686p41 ++0x1.28dcc3ac950f9p173 ++-0x1.906e052eb7470p-20 ++-0x1.707e251ce768ap440 ++-0x1.821b023683ae3p37 ++-0x1.4db457ffe8a62p742 ++0x1.0670c3d7576b1p8 ++-0x1.f44a632b6a2d4p2 ++-0x1.b75b407bea318p-1 ++0x1.507f63e62851ep-25 ++0x1.bd10460d75116p15 ++0x1.fc3ba353f04b8p13 ++-0x1.2af436412167ap34 ++0x1.8e58408a0b161p30 ++-0x1.cb1884deacccap677 ++0x1.112e30c8147d8p288 ++-0x1.03a724eaa0da3p14 ++-0x1.58a7a7304d337p4 ++-0x1.d3d8600450d2fp46 ++0x1.6784927c4db75p3 ++0x1.925e011c2be99p-19 ++0x1.ebfaf6c6dfd75p-1 ++-0x1.0730625f34e2cp622 ++-0x1.0c78f6f77f4a0p16 ++0x1.4e7226251590fp34 ++0x1.c2d2c2bcfe176p45 ++0x1.92a40269de752p262 ++-0x1.6b17d4e0e4095p47 ++-0x1.b35df39dbe7bap23 ++-0x1.2433941ea6c1dp181 ++-0x1.156bc71aaf929p26 ++-0x1.c0a2337b73d37p-25 ++0x1.c4a1144dd5788p47 ++0x1.61d1b135895c0p26 ++0x1.defc76272ee65p473 ++0x1.d28a2698c470dp0 ++0x1.94f6142bed738p0 ++-0x1.7f782459fa34fp18 ++-0x1.a68016b127852p46 ++-0x1.8c8512f7601a6p559 ++-0x1.296f002678629p0 ++-0x1.6713546c2b7dcp24 ++0x1.5820400b8ca32p-17 ++-0x1.986947ed54745p28 ++0x1.5589220a8d908p2 ++-0x1.bb73c7db6c6b5p18 ++0x1.57545758dc374p1020 ++0x1.3c61573e1df6cp860 ++0x1.b5ba913c8b04ap43 ++0x1.152d60fff636ap25 ++0x1.9dfde0143fc3bp664 ++0x1.8002f4ae0cd26p546 ++-0x1.5555972687f97p44 ++0x1.d4cd0108a77b8p-22 ++0x1.d605a75200cfdp799 ++0x1.8f1ed35661061p13 ++-0x1.aa357490e4b15p16 ++0x1.c616b347d6c7cp47 ++-0x1.5c1bb32908a9dp37 ++0x1.3e63c3071d00ep10 ++0x1.f6a851a65eb40p16 ++-0x1.09293376e5ff7p3 ++-0x1.d28c834a48febp-1 ++0x1.5d1f711534ffap8 ++-0x1.ab58768a06b4fp0 ++-0x1.c305e4720570cp1 ++-0x1.fd01f697e68f3p6 ++0x1.20aa374d16fa9p-7 ++-0x1.640d51133a28dp7 ++-0x1.4cbd82a906116p-20 ++0x1.e728b313e9290p20 ++0x1.2f00b66b200eep2 ++0x1.e70cd0870834dp22 ++-0x1.424f62131a07dp440 ++-0x1.8ffdb1a359d44p8 ++-0x1.d14c66613a0afp47 ++-0x1.bb9dc4d8f0b60p23 ++0x1.8cfc42cbf93fep21 ++-0x1.bff987c5b24f7p40 ++0x1.acb444767500cp404 ++-0x1.e3a3278c0889cp615 ++-0x1.c7c03410ee559p1 ++0x1.1aeb262f169afp9 ++-0x1.c00d57ef36176p16 ++-0x1.54b5c337ab8c7p26 ++-0x1.fca5308d5a5f0p-1 ++-0x1.ee65a575ad332p6 ++-0x1.73d3b5be2d412p4 ++0x1.994532de92cc3p288 ++-0x1.7b3b402cd684ap672 ++-0x1.5581914c736a3p26 ++0x1.8691a1510a8ddp26 ++0x1.439e202ffc78ap31 ++-0x1.00f1f1c0a534dp5 ++-0x1.e787a060a1beap-1 ++-0x1.a40b4564248ddp33 ++0x1.9db0f66a7c69ap758 ++-0x1.29df95676f2f3p29 ++-0x1.c1e2a39fad4f9p30 ++-0x1.2398052cf9970p5 ++0x1.9584270d98e8ap34 ++-0x1.9c3a8363c08d6p-9 ++-0x1.c3ae6326607b1p0 ++0x1.0e33e435785a9p24 ++0x1.3e1547010b972p30 ++-0x1.00e45198f46adp12 ++0x1.cab9d2d70a0ecp176 ++0x1.3cad136952e75p0 ++-0x1.b690f763014a7p-1 ++0x1.5d5f04e7e601ap840 ++0x1.687d04cf256e2p17 ++0x1.fef58250afa5ap733 ++0x1.bf55465c8726dp10 ++-0x1.879cf61bde347p0 ++0x1.41fa061534bfbp1000 ++-0x1.3547166ae0563p18 ++-0x1.29b792c792304p0 ++0x1.44f0c244630e4p4 ++0x1.b44fa2fd3ba45p-10 ++-0x1.ee70d4ee2a313p20 ++0x1.e09a910e6fec6p47 ++0x1.df08c242a0825p41 ++0x1.1b9f438519594p25 ++-0x1.009e65b886832p23 ++-0x1.b211e177c4878p-25 ++0x1.cf4f511036953p-22 ++-0x1.a331a056fd10dp15 ++0x1.78b95045b3821p20 ++0x1.9741d0c92a811p19 ++0x1.0799369efbf5ep23 ++-0x1.aa78545af6518p25 ++0x1.a4f3e0e422feep826 ++-0x1.67f8d1c373dd4p871 ++-0x1.e4d67454ffbcbp11 ++-0x1.c55dd363dd674p3 ++0x1.6402e3d9defaap15 ++0x1.8b5f257d1ec68p-16 ++0x1.af29726910ee4p42 ++0x1.99bc46ffb746dp0 ++-0x1.a1375601023eep810 ++0x1.85c587e566703p737 ++-0x1.f7c1e1a4d0636p-4 ++0x1.969d9183c03dbp558 ++0x1.f049b22399098p34 ++0x1.943ec10617417p5 ++-0x1.e2dd46c8c4c7ap353 ++0x1.fda825f2618b4p4 ++0x1.be0c71a4be7fap24 ++0x1.253fc5016e602p26 ++-0x1.f40770706a468p19 ++0x1.a93453e7eedafp544 ++0x1.4cbf20bbaffe4p0 ++0x1.8523e43195d20p0 ++0x1.ef3fe0d51ca0ap869 ++-0x1.7bfd906b4bc4cp0 ++-0x1.eb85c2e781ca5p834 ++-0x1.c72973927a11bp11 ++-0x1.07bc71bed30b3p39 ++0x1.ca2691e190f22p-24 ++0x1.cb48f51c1417ep44 ++-0x1.567c86970707bp44 ++-0x1.1328459387024p19 ++0x1.8dbca5e6ae26bp-20 ++-0x1.0ea782b471c95p7 ++0x1.885d949bd233ep25 ++0x1.5706b40d7d8d3p-11 ++-0x1.99ffd54628c49p0 ++0x1.4dd434ac6f7e8p150 ++0x1.e33c777463aa2p25 ++-0x1.f7ee12177cdddp285 ++-0x1.13f2e7648aeb4p8 ++-0x1.bb3e114af14ffp386 ++0x1.0ea653cfc5144p86 ++-0x1.97afd730cab3ap0 ++-0x1.1b4a96ad1229ep44 ++0x1.e6b573ec87b1bp172 ++0x1.2f0542b4e0611p533 ++-0x1.b95a733cdd7ddp20 ++-0x1.d47cf66eebb8ep-15 ++0x1.78f0b5f53a39cp33 ++-0x1.8c35d7a87e6fep18 ++-0x1.5273b2382ccd0p15 ++0x1.286441ca5714dp-20 ++0x1.136ee1c73224fp872 ++-0x1.96c0235d8d55cp24 ++-0x1.732f95c827773p35 ++0x1.667404de0f089p374 ++-0x1.2c5137dddd70ep38 ++-0x1.7ac64352f8731p311 ++-0x1.375d526b9499bp10 ++-0x1.608744f90585bp46 ++-0x1.b152d1cd9d10bp11 ++0x1.ac15612e56ca9p23 ++-0x1.1e20923124ba0p18 ++-0x1.976ff6fbebe0cp483 ++0x1.19c89663c0f50p1 ++-0x1.5d4732b848227p0 ++0x1.bce080a10af4ep71 ++0x1.4b5181670d98ep1 ++-0x1.88ef56cab1b8bp0 ++-0x1.124bc48a15e4ep560 ++0x1.16aa8030446c5p1 ++0x1.ea3d708440531p-5 ++0x1.9a933630408d3p0 ++0x1.25c992f62ef85p21 ++-0x1.892203bbd6e79p787 ++-0x1.b69e12ed65962p-12 ++-0x1.213bc173722c7p858 ++0x1.9ec5648d542b0p0 ++0x1.e49be4cdb62fep9 ++-0x1.b51b42ddbf7d6p656 ++-0x1.d98793002d34ap0 ++0x1.8365b15d3d1c8p17 ++0x1.512fb18d70d75p39 ++-0x1.6de981933ee82p136 ++-0x1.985c12bed07e0p13 ++-0x1.a5fbc7fc45b3ap-1 ++-0x1.8710f55f8c2d7p-24 ++-0x1.e21315a4ae92cp40 ++-0x1.b9e2943771bf3p0 ++0x1.da6de76a482d9p458 ++0x1.5599148b4cf81p7 ++0x1.d71ea41f64e8ap776 ++0x1.89d6b23942ee9p0 ++0x1.9fd7d5273c695p21 ++0x1.817ca791272d0p1021 ++-0x1.3452f5175f006p-2 ++0x1.f3af654e608f2p13 ++0x1.1d0a0528d7bdep21 ++0x1.2c2aa710a863fp924 ++-0x1.77b2852f5e175p8 ++0x1.9f48d30a1e11bp47 ++-0x1.54f600b66c2fep12 ++0x1.56b3a59e3e2f4p751 ++-0x1.641b67eda77fdp23 ++-0x1.62d64749736ebp-5 ++0x1.a481622af3746p911 ++-0x1.96cec2f358260p24 ++-0x1.f82d54d558421p19 ++0x1.5c4330323eb8bp34 ++-0x1.9f86b23c7fe1fp17 ++0x1.5994062e8e0f1p22 ++-0x1.b33505561d1cap905 ++-0x1.ccdf732c7d20bp680 ++-0x1.d6a84378ac8b9p23 ++-0x1.a877d1dcede4fp4 ++0x1.9c4fb2b271fa0p-17 ++-0x1.edb1d145f200ep836 ++-0x1.f9a466fe6d9c0p36 ++-0x1.e07ab7c21cb33p-5 ++-0x1.1c05b681bc11bp12 ++-0x1.dfea704995e47p0 ++0x1.3ec9e0020df9bp261 ++-0x1.2de113c0c0abcp840 ++0x1.d523551d1301bp301 ++0x1.d57ff49633b0ap16 ++-0x1.60e00540a4916p43 ++-0x1.ae7cd0ead2707p-21 ++0x1.59c5a3da56943p646 ++0x1.a0f1e02dc546fp0 ++-0x1.90c74581ad4c2p804 ++-0x1.3df5a6745c7b4p279 ++0x1.b1dbd7c284f4ap0 ++-0x1.53a8236e11ad5p613 ++0x1.d01ae4b6ec723p5 ++-0x1.4f07c42ad516ep38 ++-0x1.3f42955e43c60p164 ++-0x1.cef08022a889fp-22 ++-0x1.a104038d6d3aep-11 ++0x1.6ab276053bf58p64 ++-0x1.fa13e25fded10p682 ++0x1.1346116d1b13ep-24 ++-0x1.5cc635b87a547p7 ++-0x1.1c6e458e45611p918 ++0x1.4da2b3a7d743fp588 ++-0x1.5867132e9910dp-6 ++-0x1.866e226885b36p3 ++-0x1.e4af96c89ac8dp7 ++-0x1.32c417258beabp1 ++0x1.ec6d23817ac87p136 ++0x1.4c42234c4cb83p26 ++0x1.627095699f9f2p21 ++0x1.29d5932425be5p19 ++-0x1.59c3a61405350p997 ++0x1.0e0152a02da15p-11 ++-0x1.cbd9001dbd84dp-23 ++0x1.395d53fa21924p970 ++-0x1.21ea97d900ce4p-18 ++-0x1.3857250897e85p18 ++0x1.23e571394fd82p-12 ++-0x1.957af33a560cep-26 ++0x1.7a62d3a97c082p-20 ++0x1.219ec6b246176p5 ++0x1.6a0b96bc3a98ep-27 ++-0x1.b3c5f05c06d11p48 ++0x1.acb0a26d67df5p-10 ++0x1.ce255615d9492p812 ++-0x1.977ad219e6c61p0 ++0x1.de2041abcf313p10 ++-0x1.b942620b8acfep4 ++0x1.a66fb3fbc1f3cp5 ++0x1.35a9b2e6488d6p26 ++-0x1.c36cc56721b05p198 ++-0x1.b9edf7dff3578p-1 ++-0x1.ffbad564ba12ep16 ++0x1.50e3f66a70bd1p485 ++-0x1.a6e547a36e5a4p465 ++0x1.54e875c76edc9p0 ++-0x1.7333a63971418p341 ++0x1.c39a24f08faebp18 ++-0x1.850e4447fd121p3 ++0x1.69b2d631a085bp42 ++0x1.7d5f03a544ce5p647 ++-0x1.54b9f0c3790dap369 ++0x1.b5db54f60d7fcp3 ++0x1.bfede6bcbdab5p14 ++0x1.c49ed00de612fp3 ++0x1.fdd5778773204p20 ++-0x1.ea24548478072p-20 ++-0x1.bbafb75c3ff50p30 ++-0x1.9b0e77b958919p841 ++-0x1.ad3172fd06e85p2 ++0x1.2d24d32d0d341p203 ++0x1.7c2480162bf05p42 ++0x1.e028339f344a0p3 ++-0x1.5dd47591cf023p11 ++-0x1.a20940b9cb5b8p693 ++0x1.d9eef5eef22a0p-16 ++-0x1.f0f51635acaf5p873 ++-0x1.c4353793f8e09p954 ++-0x1.3df5f51c831ccp17 ++0x1.e5b497ae4cae6p23 ++0x1.43162012fdb57p-10 ++-0x1.ba6782c6cca02p394 ++-0x1.1f4d15ce5c886p976 ++0x1.afa4370e97c87p44 ++-0x1.4b72433cea7f4p34 ++-0x1.01d1a13ce3762p-1 ++0x1.4a5b4081f8482p599 ++-0x1.e5b132f5337d4p30 ++0x1.4812553307bb4p25 ++-0x1.2d6ce79efbffap26 ++-0x1.102777593c0e7p425 ++-0x1.d6cf8795449a2p9 ++0x1.0c80d756d5c0bp-19 ++-0x1.9950064153b61p25 ++-0x1.8e3d83d000c70p30 ++-0x1.462b54d1612b6p38 ++-0x1.4c6a67184b714p2 ++-0x1.0e4572028b0bcp7 ++0x1.3e6a630eef30fp822 ++0x1.a291d6c857b9bp19 ++-0x1.0e87122715084p23 ++-0x1.ab4990691ca4fp891 ++-0x1.7675c774d88f1p26 ++-0x1.76d935c0d01acp957 ++-0x1.f86d4487dc29ep39 ++-0x1.2ab3d736f572ap-1 ++0x1.846c74b34d14bp0 ++0x1.a789a2d158e61p3 ++-0x1.82c2e4943b305p7 ++-0x1.4668a4a069757p184 ++-0x1.4bc1d2b00fc7ap14 ++-0x1.a544825f32188p12 ++-0x1.e2f896a71d084p40 ++-0x1.d4f317c77cf8dp34 ++0x1.2fcfb6146b469p18 ++-0x1.fc0ef70d94a57p992 ++-0x1.8bc622e9b81a9p332 ++0x1.ab3d255d05066p0 ++0x1.032294d998d40p895 ++0x1.597286cff2ddcp-9 ++-0x1.448590f2dfdf1p13 ++-0x1.ec7a74fefbef8p30 ++-0x1.fec72598e90e7p698 ++-0x1.739c7600c2aa3p0 ++-0x1.1532224ccff07p604 ++-0x1.adb0720f88c1cp671 ++-0x1.0f5c60e6cdf52p918 ++-0x1.cd43b383af967p12 ++-0x1.412293a10f35bp12 ++0x1.637192a10a8c0p35 ++-0x1.1310d6c648b59p25 ++0x1.d8c161c67b50ap28 ++0x1.c64b8175f853ap3 ++0x1.db34f69efdf5ep20 ++0x1.308bc4c848b55p65 ++0x1.9bde77693f64ep0 ++0x1.df5fb02f5fb43p41 ++0x1.511f0030d8e62p12 ++-0x1.623861243cc06p9 ++-0x1.f5db61e5469b9p8 ++0x1.5b6cb194d89edp18 ++-0x1.12c0876a1b15ep18 ++-0x1.939f8667ccc46p-8 ++-0x1.56cdd13279359p25 ++0x1.91eb17eaeb8c4p11 ++-0x1.5e31156143a7dp37 ++-0x1.46ba04e866f63p7 ++0x1.dbfed0411bc7fp538 ++0x1.f69893a985cc9p17 ++-0x1.11278358c2510p141 ++0x1.6c07667947649p10 ++0x1.1b5c9235ff249p852 ++-0x1.1e9e57d76a9a9p37 ++-0x1.388491cbdac70p17 ++-0x1.c2eea2091b3f8p-1 ++-0x1.cd087524966a7p25 ++0x1.f6adc5d4459cap600 ++-0x1.f57ff5b713a99p3 ++0x1.f2d9b467e8ee0p-8 ++-0x1.ee0bd3710bef0p-14 ++0x1.a61cc024a420cp-24 ++0x1.e902f4b561c63p3 ++0x1.9955d0ecba68cp-21 ++0x1.60eb50fec72a7p-20 ++-0x1.09f0677aee265p1005 ++-0x1.8812968970db4p721 ++0x1.8dcc40b01b324p112 ++-0x1.3a90164a6fb2dp26 ++0x1.3802f5cdcda63p6 ++0x1.e21a052adc0d0p0 ++0x1.a948854deaa16p-11 ++-0x1.274d4065edf3cp25 ++-0x1.9193532bbe2c9p16 ++-0x1.2e26e362aa597p472 ++0x1.550114f8cd6b0p16 ++-0x1.1c39a294dfb51p946 ++-0x1.1ac3f37ca8f9ep6 ++-0x1.d0cfd15066c8dp673 ++0x1.1b1f153f16bbdp29 ++0x1.56b9b46a42022p12 ++-0x1.89e4012cc6deap0 ++-0x1.d6fb928514d12p1004 ++-0x1.a136f5a490ae4p664 ++0x1.36932245e98cbp26 ++0x1.b1fb46c217a41p277 ++0x1.7b54923209cb7p587 ++0x1.caaf81b413ec0p608 ++0x1.ab5a96a090df8p6 ++-0x1.630330ace2d7cp41 ++0x1.ee7e47e57812bp-4 ++0x1.4351e41d03816p21 ++-0x1.aafe0659a5c58p11 ++0x1.2748836e9b331p41 ++0x1.fe7b979d71d95p598 ++-0x1.48c5920336400p-7 ++-0x1.b223b4be25585p382 ++0x1.a94e62298c7a1p45 ++-0x1.5217e3915a0e8p11 ++-0x1.2e65032ba771fp-9 ++0x1.6a3d4382141ebp-6 ++0x1.468a9481d74e4p169 ++0x1.b3bf676408855p20 ++0x1.ee41d72d85a88p23 ++0x1.0f1525458e264p557 ++0x1.a601a30301754p-22 ++-0x1.71d595d59b86cp566 ++-0x1.62e7f03cb1f31p12 ++-0x1.73f5402ab4e19p-8 ++-0x1.72c1f709ea5c2p13 ++-0x1.3919a5ad625dcp-4 ++0x1.fd017587ee830p310 ++0x1.b7518131b5253p0 ++-0x1.f348906bc1126p-6 ++-0x1.fc7ac7285a79ap0 ++-0x1.59f1d57e68057p17 ++0x1.bdd572c2631e7p19 ++0x1.bdf7f6ea49a0dp300 ++-0x1.8c4877c037477p29 ++-0x1.5da7b5197c995p15 ++0x1.67de61ebfcad3p107 ++-0x1.9096f72642477p323 ++0x1.e5fc51f35ab90p15 ++0x1.9f7bf6c845f55p0 ++0x1.6a59935f352f0p23 ++0x1.1f7b41c8d8513p20 ++-0x1.86d8339a09175p637 ++-0x1.3fa5c32fca635p6 ++0x1.23faf483fef1ep-18 ++-0x1.408f70d527f00p40 ++-0x1.9440f7b969c8ap209 ++-0x1.4e380016a4d6cp987 ++0x1.a20616e878c04p1023 ++0x1.2a9f54471780ap3 ++0x1.75dbe2c1ec783p-23 ++0x1.67c2221fc3804p23 ++0x1.bcdeb6f3c5549p30 ++-0x1.bb12215c52f92p779 ++0x1.8ffeb3898d1c8p-19 ++0x1.1fb8b50205437p2 ++-0x1.5a4a653146e40p32 ++-0x1.0c6b30ada1b09p23 ++-0x1.8b5c231e30042p0 ++0x1.1f16455d89ad8p882 ++-0x1.513c3208d3047p6 ++-0x1.cee964e33c448p30 ++0x1.af44434d9c9c6p0 ++-0x1.0276334fd570bp-15 ++0x1.5dedf26999173p0 ++-0x1.1b2e4780cd70fp417 ++0x1.534237e205b0ap8 ++-0x1.29c1563c96376p41 ++0x1.8a3457a805380p776 ++-0x1.47fc55d109066p332 ++0x1.793aa09de6e04p1006 ++-0x1.bf3fb2020504fp896 ++-0x1.7366b3b52b79ap-3 ++-0x1.b95a21c326d4fp754 ++-0x1.8f992737bdb7dp526 ++0x1.e0f1212c81cf0p21 ++-0x1.5299f2819f9dep19 ++0x1.ae0255b511d01p4 ++0x1.8fc2a4bf7afe8p261 ++-0x1.91f2f0444f31ap634 ++-0x1.a8ad341b55868p7 ++-0x1.b33f97a647507p4 ++-0x1.ac58d36c99905p0 ++0x1.717660662d7f4p618 ++0x1.747371ab298bap14 ++0x1.d500a4ff90ba3p9 ++-0x1.c49132a3807d3p18 ++0x1.775041f5adf79p40 ++0x1.d196f39ecbbfdp-15 ++-0x1.955a20c2e98a8p10 ++-0x1.eb44149e132e3p20 ++-0x1.91fc970666340p-10 ++-0x1.8cbd518d4e97ap9 ++0x1.446762982f5a5p30 ++-0x1.243fd3db30072p7 ++0x1.7f9b147083efep863 ++0x1.02e06605707fcp11 ++-0x1.f943c41c8d938p36 ++-0x1.66297706f7c14p727 ++-0x1.6b59c16db566cp26 ++0x1.5d48f15c59f58p452 ++-0x1.e8f5230318f79p-1 ++0x1.31fad3c41d123p34 ++-0x1.6757e2c0a08a7p11 ++0x1.7f07e07a0a269p288 ++# cos slow path at 768 bits ++# Implemented in sysdeps/ieee754/dbl-64/sincos32.c ++## name: 768bits ++0x1.000000cf4a2a2p0 ++0x1.0000010b239a9p0 ++0x1.00000162a932bp0 ++0x1.000002d452a10p0 ++0x1.000005bc7d86dp0 ++0x1.47c453f752654p637 ++0x1.b27df119d2861p78 ++0x1.b073672e47988p835 ++0x1.f2f5607cc76e1p157 ++-0x1.3c7b45a1446e9p349 ++0x1.544a364a05b26p228 ++0x1.157fa0b2ffd20p164 ++-0x1.f4ba7359080d6p172 ++-0x1.7698941fce366p651 ++-0x1.9875603af20dbp433 ++-0x1.b00f872fa6260p918 ++0x1.468e65e8e3656p661 ++-0x1.6cbd47b10d74bp464 ++-0x1.2c2c62a2f067ap197 ++-0x1.8e3db452cbb07p810 ++0x1.8446c34a2644cp277 ++-0x1.b0f6f1b8db81ap179 ++0x1.93b574629bf16p748 ++0x1.b6b6e0a06cb05p344 ++-0x1.7cbc2702fbd97p922 ++-0x1.887a36760f072p336 ++0x1.17b9c169b2efep714 ++-0x1.e947b36ae0940p794 ++-0x1.d70d15a2338b8p884 ++0x1.0a98017bf55bep935 ++-0x1.bc07c6c7cc03bp538 ++-0x1.c42d477462280p949 ++-0x1.9c6dc4908a248p536 ++0x1.37a0d35e7fd14p74 ++-0x1.9c9cf14390543p64 ++0x1.7c0a43fe4ef89p409 ++-0x1.cc1fa7c639575p65 ++0x1.df36548f960eep769 ++-0x1.d3f102775834fp176 ++-0x1.0a6bf05ba56c4p713 ++-0x1.4775c1ce2834ep903 ++-0x1.7ade6237217c2p272 ++-0x1.35ebc7dee67bep898 ++0x1.26ded2ecd7486p728 ++0x1.90c6535aa78d1p591 ++-0x1.dd85c54160392p296 ++-0x1.1ee7b2598c033p904 ++0x1.28de547f9a6a7p156 ++0x1.bb7ff11e74372p775 ++0x1.bb4da1ff7cd43p113 ++0x1.52f2e13f3ddcfp430 ++0x1.7aa0c44aa3950p964 ++0x1.33ffd1540eeaap899 ++-0x1.a8c7f7947c6efp453 ++-0x1.3a8f54a1dfe1cp193 ++0x1.fedb8178dbabap386 ++0x1.b53776fb33667p290 ++-0x1.1dbc12b1b9e1ep632 ++0x1.ed4db1eaa237cp454 ++-0x1.e43334d044861p32 ++0x1.db66f595e3e93p165 ++0x1.6c6af169f717ap165 ++0x1.d14cf2d2b8875p589 ++-0x1.1661f59554000p419 ++0x1.f76c50b4e5bd1p276 ++-0x1.b00253e803df0p175 ++-0x1.8ec0a6121e3b6p8 ++0x1.5e1195ad8957fp899 ++0x1.ec89e4f11ac8fp433 ++-0x1.1d38a4ee578e9p339 ++0x1.4377875dce8fdp326 ++0x1.ee58a172d118cp745 ++0x1.ff0232a89efd3p913 ++-0x1.a6c9c19756962p883 ++0x1.dbb6b6a957161p710 ++0x1.12fd57b2e5ebbp83 ++0x1.e9e364fad4bcbp329 ++0x1.cbe8b375ad172p953 ++-0x1.08a4b728fde64p598 ++0x1.60f510ee233d5p828 ++0x1.ba51673480a49p100 ++-0x1.b04114708e216p378 ++-0x1.9fd7b6bc2ce33p61 ++0x1.c32ea014657c0p820 ++0x1.1d3621e24b581p110 ++-0x1.4139a7fc5b5dep135 ++-0x1.2399c1ea2ea2fp729 ++0x1.aa2a835f87dbcp650 ++0x1.948dc5cd26e75p371 ++-0x1.a5a520d06d146p940 ++-0x1.191a55bfe7786p1013 ++-0x1.a46e0156a6bf3p525 ++-0x1.91fd2519f735bp372 ++0x1.1a78a3d726d73p617 ++0x1.428c901b2d569p906 ++-0x1.9f415555f701bp238 ++0x1.a7e133e2c9f01p315 ++0x1.e565b67830fabp1009 ++-0x1.9e88b6ff1a777p31 ++0x1.8ec4d30c1daebp710 ++-0x1.5c35d25455dabp540 ++-0x1.5957f35326911p855 ++0x1.5e8414f558911p832 ++0x1.fadce712c669ap551 ++-0x1.7b0554f4a1530p340 +diff -urN glibc-2.17-c758a686/benchtests/exp2-inputs glibc-2.17-c758a686/benchtests/exp2-inputs +--- glibc-2.17-c758a686/benchtests/exp2-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/exp2-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,105 @@ ++## args: double ++## ret: double ++## includes: math.h ++-0x1.8235e0aa4aab1p814 ++0x1.0e1220dfad80dp1006 ++-0x1.e6a710eed0706p919 ++0x1.11def1bbe9bc3p-471 ++0x1.05e9b1fc591d9p-1007 ++0x1.a58906c628b46p984 ++0x1.772627fce1208p-256 ++-0x1.461c146b65f2cp-62 ++-0x1.6cf046992fa9ep-876 ++-0x1.eaca47d76382cp-413 ++0x1.5056d0027ca2bp-634 ++0x1.1be8235cf2515p-300 ++0x1.f667e36bb79d2p913 ++0x1.b9ae233039c9cp-721 ++0x1.b70ec546dac57p589 ++-0x1.3ef895a695202p-318 ++-0x1.e73d755c17ecap-901 ++-0x1.f0a09005d2fdcp-52 ++0x1.77520292c8ea7p786 ++0x1.e5c0a38dccd6fp-510 ++-0x1.21dd1410a13fdp469 ++-0x1.f1ea1752b167cp-855 ++0x1.149395c6b1dfcp237 ++-0x1.22cfe4ceb2a85p244 ++0x1.061a75f02c856p-417 ++-0x1.04aaf4e1a4962p-645 ++-0x1.b962f2c49c11ap169 ++0x1.6074818509343p-151 ++-0x1.6b9946b997353p350 ++-0x1.6b8631635d607p-328 ++0x1.6893162dc2973p923 ++-0x1.0a1c40492986dp-371 ++-0x1.23ae72061594ap-113 ++0x1.d73d84becb49dp-816 ++0x1.545894ebc8944p-487 ++-0x1.c006c29733c62p325 ++-0x1.745dc305eeb06p-994 ++0x1.6cdeb63076b54p420 ++0x1.c8f137c690673p906 ++-0x1.170ab5609f77cp205 ++-0x1.0b11b685a3349p-46 ++0x1.7f68672b92eb1p-622 ++0x1.66d431dee4bfdp-333 ++-0x1.e43304b22a96dp228 ++0x1.58ac069095de9p-419 ++-0x1.3fcaa6e1f1ac3p654 ++-0x1.437ed00080554p-88 ++0x1.717ad5a379c50p531 ++0x1.9688d6a6dd841p127 ++-0x1.189c3732f9ac8p505 ++-0x1.8c5da688a249ep871 ++0x1.808015df2809ep-647 ++0x1.54ccb260c52f6p183 ++0x1.ec1574f23f1b5p757 ++-0x1.2de0222e50454p-176 ++-0x1.dc5715d5ac4f3p-882 ++0x1.6fa963199b1fbp389 ++-0x1.0a143338c0ff3p149 ++0x1.c278a3ec4071cp240 ++0x1.7bdb071d7e6ffp-360 ++-0x1.e9b7a0af460ddp-809 ++0x1.d069e62cf695bp535 ++0x1.0f7ba1b172a18p-887 ++-0x1.96af5166829b7p399 ++-0x1.8f70240823cdbp-65 ++-0x1.fcd2d5a63a217p-971 ++-0x1.089241ad467f2p-247 ++-0x1.3fa3940d58aa8p1022 ++-0x1.aff1c0aec4e7dp814 ++-0x1.6bad319cfc3bcp-378 ++0x1.9c8956c66ba36p-579 ++-0x1.6d9393f52ee3fp411 ++0x1.e529d23501328p926 ++0x1.3ec71520af29cp690 ++0x1.787576a795b83p194 ++-0x1.ef38147d2dc40p107 ++-0x1.22a125ccbb1b2p-308 ++0x1.5f5c074be0351p-928 ++-0x1.377ed64bec482p390 ++-0x1.09eae6f62d4b8p-41 ++0x1.9f3fd03635c92p-104 ++0x1.cb7d07d13c9efp599 ++0x1.49e8154de36a7p538 ++-0x1.d68343fe573bfp-736 ++-0x1.4beba6b79ba1ep-811 ++0x1.927774a125013p221 ++-0x1.e4a1e48c33931p-152 ++-0x1.b8a3123361eb5p641 ++-0x1.909ea08b262f3p960 ++0x1.0d1b30600d5b0p822 ++-0x1.392420cf4ce19p-690 ++-0x1.f9e1f71c0f3a2p-349 ++-0x1.75600638cbf0ep-527 ++-0x1.788911851a5abp-193 ++-0x1.2ab1045fa9103p-471 ++-0x1.d9c7f1a19cefdp-44 ++0x1.ef5a66b13a5f8p171 ++0x1.261c24ba6cdfbp539 ++0x1.641945dc01d29p-620 ++0x1.5c190276797a1p935 ++-0x1.ea76b6a8a9d4ap-656 ++0x1.41a117e9931f0p-169 +diff -urN glibc-2.17-c758a686/benchtests/exp-inputs glibc-2.17-c758a686/benchtests/exp-inputs +--- glibc-2.17-c758a686/benchtests/exp-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/exp-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,589 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.6200315ce81efp9 ++0x1.0000000031579p0 ++0x1.000000009b551p0 ++0x1.000000067ace6p0 ++0x1.6200315ad0fc0p9 ++0x1.0000000000060p0 ++0x1.00000004237a7p0 ++0x1.6200315ad0fb2p9 ++0x1.0000000054ac1p0 ++0x1.6200315c98bcdp9 ++0x1.0000000002d96p0 ++0x1.0000000000038p256 ++0x1.6200315ad0fafp9 ++0x1.6200315d680ecp9 ++0x1.0000000000042p0 ++0x1.0000000000048p256 ++0x1.6200315ad0fbcp9 ++0x1.000000000000dp256 ++0x1.000000000001ep256 ++0x1.0000000000015p256 ++0x1.0000000000018p-256 ++0x1.000000000002ep0 ++0x1.000000000004ep-256 ++0x1.000000000001dp-256 ++0x1.6200315ad0fb4p9 ++0x1.00000002ca5f8p0 ++0x1.0000000000017p256 ++0x1.0000000000022p0 ++0x1.0000000000059p256 ++0x1.0000000000028p0 ++0x1.6200315ad0fa7p9 ++0x1.000000048059cp0 ++0x1.0000000000023p256 ++0x1.000000000003ap-256 ++0x1.0000000000022p-256 ++0x1.6200315f211bep9 ++0x1.000000000002ep-256 ++0x1.0000000000041p256 ++0x1.0000000000042p-256 ++0x1.6200315ad0fcfp9 ++0x1.6200315ad0fd7p9 ++0x1.000000004bd6fp0 ++0x1.000000000000dp-256 ++0x1.6200315ad0fb7p9 ++0x1.000000000001fp0 ++0x1.0000000000024p-256 ++0x1.0000000000058p256 ++0x1.6200315ad0fc5p9 ++0x1.620030025fbe9p9 ++0x1.000000000003dp-256 ++0x1.000000000003fp-256 ++0x1.0000000000009p256 ++0x1.00000005c7304p0 ++0x1.0000000000045p-256 ++0x1.0000000000011p-256 ++0x1.0000000000033p-256 ++0x1.0000000000036p256 ++0x1.0000000000059p-256 ++0x1.0000000000001p-256 ++0x1.0000000000052p-256 ++0x1.000000045baafp0 ++0x1.0000000000032p0 ++0x1.00000004a5089p0 ++0x1.00000005edb68p0 ++0x1.6200315ad0fd1p9 ++0x1.0000000080d5bp0 ++0x1.0000000000038p0 ++0x1.6200315ad0fdbp9 ++0x1.000000000005fp256 ++0x1.0000000291b1ep0 ++0x1.6200315af4bedp9 ++0x1.0000000000031p-256 ++0x1.6200315aea99bp9 ++0x1.00000005ab569p0 ++0x1.6200315d47b24p9 ++0x1.6200315ad0fd9p9 ++0x1.000000000003bp256 ++0x1.6200315d31eb9p9 ++0x1.000000059a297p0 ++0x1.0000000000011p256 ++0x1.0000000000021p-256 ++0x1.0000000000041p-256 ++0x1.0000000000049p0 ++0x1.00000006857afp0 ++0x1.6200315ceb300p9 ++0x1.000000000003bp-256 ++0x1.6200315bcaec3p9 ++0x1.0000000000018p256 ++0x1.00000002f3b77p0 ++0x1.6200315ad0fb5p9 ++0x1.0000000000027p-256 ++0x1.000000054447dp0 ++0x1.6200315e84846p9 ++0x1.0000000172fefp0 ++0x1.00000001c8808p0 ++0x1.0000000000003p256 ++0x1.000000000003ep-256 ++0x1.00000002ed36ep0 ++0x1.000000000002ap0 ++0x1.00000002ae08bp0 ++0x1.000000000005dp-256 ++0x1.0000000000063p256 ++0x1.000000000003ep0 ++0x1.0000000000037p256 ++0x1.6200315ad0fb6p9 ++0x1.000000000005ep0 ++0x1.000000000002ap256 ++0x1.0000000000056p256 ++0x1.0000000266056p0 ++0x1.6200315ad0fdap9 ++0x1.000000000002dp0 ++0x1.000000000004cp0 ++0x1.6200315ad0fb8p9 ++0x1.0000000000039p0 ++0x1.000000000002ap-256 ++0x1.6200315ad0fa5p9 ++0x1.0000000000035p256 ++0x1.000000000005ep256 ++0x1.000000000004cp-256 ++0x1.0000000000039p256 ++0x1.000000055574fp0 ++0x1.0000000000033p256 ++0x1.6200315ad0fc2p9 ++0x1.62003001fc398p9 ++0x1.000000000004ap-256 ++0x1.000000000001ap256 ++0x1.000000005d813p0 ++0x1.6200315ad0fe4p9 ++0x1.0000000000030p-256 ++0x1.0000000000020p-256 ++0x1.0000000066565p0 ++0x1.0000000000029p-256 ++0x1.6200315ad0fc7p9 ++0x1.000000049e880p0 ++0x1.0000000609903p0 ++0x1.00000005e309fp0 ++0x1.0000000000013p256 ++0x1.0000000000026p0 ++0x1.000000000002dp-256 ++0x1.6200315ad0fbdp9 ++0x1.000000000000fp256 ++0x1.00000001a9d52p0 ++0x1.000000000002cp256 ++0x1.0000000479d93p0 ++0x1.0000000000016p256 ++0x1.00000001d7d63p0 ++0x1.6200315bd5b13p9 ++0x1.00000001097e9p0 ++0x1.0000000000030p0 ++0x1.6200315d37392p9 ++0x1.6200315ad0fe0p9 ++0x1.6200315ba6119p9 ++0x1.000000000003ep256 ++0x1.00000000e87eap0 ++0x1.0000000000002p256 ++0x1.00000006501c2p0 ++0x1.000000000004bp256 ++0x1.620030022b98ap9 ++0x1.000000000003fp0 ++0x1.00000002d0e01p0 ++0x1.00000001f6819p0 ++0x1.0000000000020p256 ++0x1.0000000000021p0 ++0x1.000000000005cp256 ++0x1.6200315ad0faep9 ++0x1.6200315c61515p9 ++0x1.0000000000008p256 ++0x1.0000000000056p-256 ++0x1.00000004f2923p0 ++0x1.000000000001ep0 ++0x1.0000000000028p256 ++0x1.000000000004fp256 ++0x1.000000000002cp-256 ++0x1.0000000000025p0 ++0x1.6200315e1215ap9 ++0x1.6200315ad0fb3p9 ++0x1.6200315e921dap9 ++0x1.6200315ad0fd6p9 ++0x1.0000000000049p256 ++0x1.000000000004dp256 ++0x1.0000000000042p256 ++0x1.0000000000051p0 ++0x1.6200315d83129p9 ++0x1.0000000690278p0 ++0x1.0000000000036p0 ++0x1.0000000000026p256 ++0x1.000000000005fp-256 ++0x1.000000000000cp256 ++0x1.0000000000007p256 ++0x1.000000050a3fep0 ++0x1.000000000001fp-256 ++0x1.000000000002ep256 ++0x1.000000000004ep256 ++0x1.6200315f00e77p9 ++0x1.6200315ad0fd2p9 ++0x1.6200315d4ee5bp9 ++0x1.00000004552a6p0 ++0x1.6200315ad0fe3p9 ++0x1.000000003a2cbp0 ++0x1.6200315ad0fdfp9 ++0x1.00000002b4894p0 ++0x1.0000000000022p256 ++0x1.000000023a58ep0 ++0x1.6200315ad0fd8p9 ++0x1.0000000000029p256 ++0x1.6200315efe051p9 ++0x1.0000000205d74p0 ++0x1.0000000000045p256 ++0x1.6200315ad0fb0p9 ++0x1.6200315d77cc5p9 ++0x1.000000065ac8bp0 ++0x1.0000000000037p0 ++0x1.6200315ad0fbfp9 ++0x1.6200315dacc95p9 ++0x1.000000000002fp-256 ++0x1.000000000000ep256 ++0x1.00000006bf05cp0 ++0x1.0000000000051p256 ++0x1.0000000000062p0 ++0x1.0000000000031p256 ++0x1.6200315be943dp9 ++0x1.000000000005bp0 ++0x1.0000000000045p0 ++0x1.6200315e08505p9 ++0x1.000000000001bp256 ++0x1.0000000000005p256 ++0x1.000000000005dp256 ++0x1.6200315ad0fc9p9 ++0x1.6200315e97676p9 ++0x1.0000000000024p0 ++0x1.0000000000003p-256 ++0x1.6200315ad0fd4p9 ++0x1.6200315ee2c3bp9 ++0x1.0000000000020p0 ++0x1.6200315ad0fdcp9 ++0x1.0000000000053p-256 ++0x1.000000000004bp-256 ++0x1.6200315cafb6ep9 ++0x1.000000000003ap256 ++0x1.0000000000013p-256 ++0x1.0000000000060p256 ++0x1.6200315ad0fd3p9 ++0x1.0000000000009p-256 ++0x1.000000000005cp-256 ++0x1.00000000acff5p0 ++0x1.000000000004dp0 ++0x1.0000000000050p256 ++0x1.6200315e34fc6p9 ++0x1.0000000000044p-256 ++0x1.000000000002dp256 ++0x1.0000000000062p256 ++0x1.6200315bf4442p9 ++0x1.6200315ad0fabp9 ++0x1.000000000003cp0 ++0x1.0000000000019p256 ++0x1.000000000000cp-256 ++0x1.000000000000bp-256 ++0x1.0000000000063p0 ++0x1.000000000003cp256 ++0x1.0000000000061p-256 ++0x1.6200315ad0fb1p9 ++0x1.00000006456f9p0 ++0x1.6200315ad0fb9p9 ++0x1.6200315ad0fccp9 ++0x1.6200315ad0fd5p9 ++0x1.6200315ad0fd0p9 ++0x1.0000000353687p0 ++0x1.6200315ad0facp9 ++0x1.000000000005bp256 ++0x1.6200315e8bb51p9 ++0x1.6200315d73094p9 ++0x1.000000027bdbap0 ++0x1.000000006f2b7p0 ++0x1.0000000000057p0 ++0x1.0000000298327p0 ++0x1.000000019a7f7p0 ++0x1.6200315b7b9ddp9 ++0x1.000000041cf9ep0 ++0x1.0000000000040p256 ++0x1.0000000000059p0 ++0x1.6200315ad0fe2p9 ++0x1.0000000000056p0 ++0x1.0000000000034p-256 ++0x1.6200315cf49aep9 ++0x1.0000000000017p-256 ++0x1.000000000bae8p0 ++0x1.6200315ad0fc1p9 ++0x1.00000004c336dp0 ++0x1.0000000000032p256 ++0x1.6200315ae9fb5p9 ++0x1.000000000004cp256 ++0x1.0000000000057p-256 ++0x1.0000000000035p-256 ++0x1.6200315d4d455p9 ++42 ++0x1.6200315ad0fa8p9 ++0x1.00000002502f2p0 ++0x1.6200315ad0fa3p9 ++0x1.000000000005dp0 ++0x1.0000000000012p-256 ++0x1.0000000000006p256 ++0x1.0000000000028p-256 ++0x1.0000000000044p256 ++0x1.000000000004ap0 ++0x1.00000000927ffp0 ++0x1.0000000000044p0 ++0x1.00000006f8909p0 ++0x1.6200315ad0fc8p9 ++0x1.0000000000061p0 ++0x1.000000012a7e8p0 ++0x1.000000000000fp-256 ++0x1.6200315b6f0a0p9 ++0x1.00000001b92adp0 ++0x1.000000000005ep-256 ++0x1.6200315d436fep9 ++0x1.000000004301dp0 ++0x1.0000000000023p0 ++0x1.000000000005ap0 ++0x1.6200315e7189ap9 ++0x1.0000000000033p0 ++0x1.6200315c19f20p9 ++0x1.0000000000040p-256 ++0x1.0000000000031p0 ++0x1.0000000000027p0 ++0x1.6200315d1dfeap9 ++0x1.0000000588fc5p0 ++0x1.000000015ad42p0 ++0x1.6200300248616p9 ++0x1.0000000000021p256 ++0x1.6200315ad0fcap9 ++0x1.6200315ad0fbbp9 ++0x1.6200315ad0fbep9 ++0x1.0000000000052p0 ++0x1.0000000000016p-256 ++0x1.0000000000005p-256 ++0x1.0000000000046p256 ++0x1.000000000003cp-256 ++0x1.0000000000054p0 ++0x1.000000034ce7ep0 ++0x1.0000000000050p-256 ++0x1.000000000002fp256 ++0x1.6200315f2a44bp9 ++0x1.6200315ad0fa2p9 ++0x1.6200315f53addp9 ++0x1.0000000000043p256 ++0x1.000000000002bp0 ++0x1.6200315b9a51fp9 ++0x1.62003002148e6p9 ++0x1.0000000000039p-256 ++0x1.0000000000023p-256 ++0x1.00000006d45eep0 ++0x1.000000000002cp0 ++0x1.0000000000055p256 ++0x1.000000000000ap256 ++0x1.0000000000010p-256 ++0x1.0000000000047p-256 ++0x1.000000000002fp0 ++0x1.0000000000001p256 ++0x1.000000040ff8cp0 ++0x1.0000000121a96p0 ++0x1.6200315c8b9bcp9 ++0x1.000000000001cp-256 ++0x1.0000000000063p-256 ++0x1.0000000000006p-256 ++0x1.000000000001ap-256 ++0x1.6200300247b12p9 ++0x1.0000000000046p0 ++0x1.0000000000036p-256 ++0x1.00000004bcb64p0 ++0x1.0000000000032p-256 ++0x1.0000000000057p256 ++0x1.6200315e03518p9 ++0x1.00000005331abp0 ++0x1.000000000001ep-256 ++0x1.6200315f76ad3p9 ++0x1.000000000004dp-256 ++0x1.000000000003bp0 ++0x1.00000005b6032p0 ++0x1.0000000000007p-256 ++0x1.6200315ad0fc4p9 ++0x1.0000000000051p-256 ++0x1.000000000005cp0 ++0x1.6200315ad0fc6p9 ++0x1.0000000100a97p0 ++0x1.0000000000040p0 ++0x1.000000000004fp0 ++0x1.000000000003dp0 ++0x1.0000000000027p256 ++0x1.0000000000000p-256 ++0x1.6200315b10d8dp9 ++0x1.0000000000060p-256 ++0x1.6200315ad0fcdp9 ++0x1.6200315ad0fa4p9 ++0x1.6200315d07f8ep9 ++0x1.000000000001bp-256 ++0x1.0000000000041p0 ++0x1.6200315ad0fe1p9 ++0x1.0000000000053p0 ++0x1.00000003168edp0 ++0x1.0000000000000p256 ++0x1.0000000000002p-256 ++0x1.6200315bd4cecp9 ++0x1.0000000000047p256 ++0x1.6200315b2b8adp9 ++0x1.000000000002bp256 ++0x1.0000000000055p-256 ++0x1.000000000004ap256 ++0x1.00000006c9b25p0 ++0x1.0000000000054p-256 ++0x1.0000000000047p0 ++0x1.6200315d8ee5dp9 ++0x1.6200315b74b4cp9 ++0x1.000000000005ap256 ++0x1.0000000000043p-256 ++0x1.0000000000055p0 ++0x1.0000000000019p-256 ++0x1.000000031d0f6p0 ++0x1.00000006ede40p0 ++0x1.00000002152cfp0 ++0x1.6200315f61210p9 ++0x1.6200315ad0fadp9 ++0x1.000000044ea9dp0 ++0x1.0000000000050p0 ++0x1.0000000000024p256 ++0x1.000000022b033p0 ++0x1.0000000000043p0 ++0x1.000000000001fp256 ++0x1.0000000000034p0 ++0x1.0000000000025p-256 ++0x1.0000000000034p256 ++0x1.000000000001dp0 ++0x1.000000000005ap-256 ++0x1.6200315ad0fddp9 ++0x1.0000000577cf3p0 ++0x1.000000051b6d0p0 ++0x1.00000006143ccp0 ++0x1.0000000000010p256 ++0x1.000000061ee95p0 ++0x1.6200315c3eed5p9 ++0x1.00000000dfa98p0 ++0x1.0000000000049p-256 ++0x1.0000000000052p256 ++0x1.0000000000053p256 ++0x1.000000000005bp-256 ++0x1.000000000000ep-256 ++0x1.6200315e8ca3cp9 ++0x1.6200315ad0faap9 ++0x1.0000000142a95p0 ++0x1.6200315ad0fcep9 ++0x1.6200315ad0fcbp9 ++0x1.6200315ef86c6p9 ++0x1.0000000000026p-256 ++0x1.6200315ed1587p9 ++0x1.000000067021dp0 ++0x1.00000001e72bep0 ++0x1.6200315ad0fbap9 ++0x1.00000000d6d46p0 ++0x1.0000000000058p0 ++0x1.00000000a42a3p0 ++0x1.6200315b50c42p9 ++0x1.6200315c4ee10p9 ++0x1.0000000416795p0 ++0x1.0000000000014p-256 ++0x1.0000000000037p-256 ++0x1.6200315ad0fa6p9 ++0x1.0000000000004p-256 ++0x1.0000000000054p256 ++0x1.000000018254ap0 ++0x1.6200315dc2365p9 ++0x1.0000000000015p-256 ++0x1.000000000004fp-256 ++0x1.0000000665754p0 ++0x1.0000000000046p-256 ++0x1.6200315b2ba38p9 ++0x1.000000000002bp-256 ++0x1.6200315ba202ep9 ++0x1.0000000000008p-256 ++0x1.0000000359e90p0 ++0x1.00000004dae48p0 ++0x1.000000000001cp256 ++0x1.0000000000062p-256 ++0x1.0000000000048p0 ++0x1.000000000003fp256 ++0x1.6200315bcd48bp9 ++0x1.6200315ad0fa9p9 ++0x1.0000000000030p256 ++0x1.6200315d64448p9 ++0x1.0000000089aadp0 ++0x1.6200315f0aa29p9 ++0x1.00000005d1dcdp0 ++0x1.6200315ad0fdep9 ++0x1.0000000000061p256 ++0x1.0000000000058p-256 ++0x1.0000000000012p256 ++0x1.000000000005fp0 ++0x1.000000000003ap0 ++0x1.000000000000bp256 ++0x1.000000000004bp0 ++0x1.0000000000038p-256 ++0x1.0000000000029p0 ++0x1.0000000000025p256 ++0x1.000000000001dp256 ++0x1.0000000000004p256 ++0x1.6200315e2240ep9 ++0x1.6200315ad0fc3p9 ++0x1.6200315b2bbc3p9 ++0x1.0000000000014p256 ++0x1.0000000078009p0 ++0x1.000000000003dp256 ++0x1.6200315db488fp9 ++0x1.000000000000ap-256 ++0x1.000000000004ep0 ++0x1.0000000000035p0 ++0x1.0000000000048p-256 ++# Slow path with computation in 144 bit precision. ++# Implemented in: sysdeps/ieee754/dbl-64/mpexp.c ++## name: 144bits ++0x1.0000000002d96p0 ++0x1.000000000bae8p0 ++0x1.0000000031579p0 ++0x1.000000003a2cbp0 ++0x1.000000004301dp0 ++0x1.000000004bd6fp0 ++0x1.0000000054ac1p0 ++0x1.000000005d813p0 ++0x1.00000005ab569p0 ++0x1.00000005b6032p0 ++0x1.00000005c7304p0 ++0x1.00000005d1dcdp0 ++0x1.00000005e309fp0 ++0x1.00000005edb68p0 ++0x1.0000000609903p0 ++0x1.00000006143ccp0 ++0x1.000000061ee95p0 ++0x1.00000006456f9p0 ++0x1.00000006501c2p0 ++0x1.000000065ac8bp0 ++0x1.0000000665754p0 ++0x1.000000067021dp0 ++0x1.000000067ace6p0 ++0x1.00000006857afp0 ++0x1.0000000690278p0 ++0x1.00000006bf05cp0 ++0x1.00000006c9b25p0 ++0x1.00000006d45eep0 ++0x1.00000006ede40p0 ++0x1.00000006f8909p0 ++0x1.62003000076d2p9 ++0x1.6200300017e2cp9 ++0x1.6200300023ffbp9 ++0x1.620030002b135p9 ++0x1.6200300030a8bp9 ++0x1.620030003123fp9 ++0x1.62003000652b3p9 ++0x1.620030007bf4ap9 ++0x1.6200300081a79p9 ++0x1.6200300090289p9 ++0x1.620030009dcbbp9 ++0x1.62003000c07cep9 ++0x1.62003000ee5dbp9 ++0x1.62003000fa646p9 ++0x1.62003000fe2cap9 ++0x1.6200300125996p9 ++0x1.6200300130865p9 ++0x1.6200300133673p9 ++0x1.6200300136fdfp9 ++0x1.6200300150360p9 ++0x1.620030016c416p9 ++0x1.6200315ee2c3bp9 ++0x1.6200315ef86c6p9 ++0x1.6200315efe051p9 ++0x1.6200315f00e77p9 ++0x1.6200315f0aa29p9 ++0x1.6200315f211bep9 ++0x1.6200315f2a44bp9 ++0x1.6200315f53addp9 ++0x1.6200315f61210p9 ++0x1.6200315f76ad3p9 ++# Slowest path with computation in 768 bit precision. ++# Implemented in: sysdeps/ieee754/dbl-64/mpexp.c ++## name: 768bits ++708.00096423260981737257679924368858 ++0x1.00000027f5496p0 ++0x1.0000015853da7p0 ++0x1.0000098e5e007p0 ++0x1.0000099a1ac59p0 +diff -urN glibc-2.17-c758a686/benchtests/ffs-inputs glibc-2.17-c758a686/benchtests/ffs-inputs +--- glibc-2.17-c758a686/benchtests/ffs-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/ffs-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,103 @@ ++## args: int ++## ret: int ++## includes: strings.h ++0x33ed4 ++0x2b ++0xba3f6965 ++0x4 ++0x927e0ceb ++0x7 ++0x0 ++0x3418b ++0x318c ++0x19a7402 ++0x699d4586 ++0x392e4 ++0x66 ++0x7fc86 ++0x13d ++0x2aa7a61 ++0x29d ++0x1d729b2 ++0x13a ++0x7 ++0x11b958 ++0x3a6a23 ++0x1b0d749 ++0x1f12ecb ++0x21 ++0x285a ++0x24702 ++0x88799 ++0x10b ++0x5 ++0x572739 ++0x12f0 ++0xa36c89 ++0x1 ++0x1f58 ++0x33743ce8 ++0xbefe ++0x7 ++0x3 ++0xdc ++0x1713e ++0x8d28 ++0xbb0ef6d ++0x3c7 ++0x2 ++0xd0e53fcc ++0x2e2 ++0x762 ++0xf ++0x35 ++0x2fc6e7a ++0x105 ++0x58e3 ++0x3 ++0x16aa ++0x7b1b38 ++0x0 ++0x2b ++0x99538d ++0xb3234 ++0x322 ++0x806bd ++0xd73 ++0x503a ++0x7d ++0xb88bb919 ++0x4f5 ++0x1f757c4f ++0xc37e5 ++0xd9e519 ++0xf0a ++0xe9f1e8d ++0x4664 ++0x4 ++0x1 ++0x1 ++0x0 ++0x1ee25 ++0x75a24 ++0x73c57b0 ++0x300e9 ++0x9 ++0x5b ++0x6d25 ++0x38bf436e ++0xf4724994 ++0x2b ++0xb8a5de ++0x4a ++0x281da ++0x905db8 ++0x3d606 ++0x6c200855 ++0x21 ++0x354e0dfa ++0x2 ++0x1 ++0xf8297c3 ++0x2fed30 ++0xd4ab7 +diff -urN glibc-2.17-c758a686/benchtests/ffsll-inputs glibc-2.17-c758a686/benchtests/ffsll-inputs +--- glibc-2.17-c758a686/benchtests/ffsll-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/ffsll-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,103 @@ ++## args: long long ++## ret: int ++## includes: string.h ++0xedada05aba9463 ++0x7c4e52bbc75241 ++0x16ab7ad ++0x20ec623a4ccdb ++0x1e24e9ed059d ++0x3acf ++0x6eb28fbb803a274 ++0xc1 ++0x25fc2148c092529f ++0x1d10ba752e5 ++0x322bd878b3 ++0x26fa11b70e20 ++0x30cd6a05a17ca14b ++0x1591d3a2d0cc7 ++0x8119d76e910c1a ++0x2b24d878fee314 ++0x1c ++0x3022a3955 ++0xedc7b7b6a818 ++0x40 ++0xf28 ++0xa2ecb ++0x56a7e4211a2ca38 ++0x6a0ee2316382 ++0x634 ++0x58 ++0x4fad66fb43f5 ++0x1f004b76 ++0x7 ++0x6ff84575bb70af ++0x5d5b4e ++0xaa614b130 ++0x15504 ++0x1a2e2e7e ++0x54b0f28b383cc ++0x6 ++0x2a2a3440b7 ++0x158a132dc0c20836 ++0x77aa8e9c91c43b1 ++0x33f526901fc08594 ++0x7bf156c ++0xb458b5e ++0x6289fcb44 ++0x4d84973bbd8c00 ++0x2e8c2de648 ++0x150fab ++0x16ebb7bae02934 ++0x485285b6065272 ++0xfdde0b16299 ++0x747d3c940cb ++0x1bdb379 ++0xfcb26a ++0x20b90cc92bbef ++0x46 ++0xf0e681aaec28b2d5 ++0x10c738cf1109 ++0x8509bef69993908 ++0x3332 ++0x219167d ++0x7eb19c6f88f ++0x32a1b4ead441e65 ++0xdc93 ++0x327a7e6676802312 ++0xcc7296c957 ++0xb0b20c47c6b500a ++0x55d614072f1 ++0x3c8e4 ++0x1a ++0x5809b7ae ++0x2 ++0x1525 ++0x13 ++0x6e ++0x1b ++0x7c58cf ++0x2f5347197bcf6 ++0x516a0d576e2c3 ++0x4f3cf315 ++0x3c16a7531f3a1 ++0xa929f8 ++0x1ce88e5 ++0x6ab464e92bc3 ++0x3ff39bb2 ++0xea9921 ++0xb3009 ++0x39b037793bef0da0 ++0x5d ++0x39a9989019c92 ++0x108bae ++0x239c1c ++0x1851dc9178f4 ++0x1fc6f70 ++0x38 ++0xa8f606a147 ++0x30dac66b ++0x76d377c20b0e836 ++0x2425 ++0x4e5a82884 ++0x7a1f128a894728 ++0xb5f0af24e3f7347 +diff -urN glibc-2.17-c758a686/benchtests/json-lib.c glibc-2.17-c758a686/benchtests/json-lib.c +--- glibc-2.17-c758a686/benchtests/json-lib.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/json-lib.c 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,178 @@ ++/* Simple library for printing JSON data. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <string.h> ++ ++#include "json-lib.h" ++ ++void ++json_init (json_ctx_t *ctx, unsigned int indent_level, FILE *fp) ++{ ++ ctx->indent_level = indent_level; ++ ctx->fp = fp; ++ ctx->first_element = true; ++} ++ ++static void ++do_indent (json_ctx_t *ctx) ++{ ++ char indent_buf[ctx->indent_level + 1]; ++ ++ memset (indent_buf, ' ', ctx->indent_level + 1); ++ indent_buf[ctx->indent_level] = '\0'; ++ ++ fputs (indent_buf, ctx->fp); ++} ++ ++void ++json_document_begin (json_ctx_t *ctx) ++{ ++ do_indent (ctx); ++ ++ fputs ("{\n", ctx->fp); ++ ++ ctx->indent_level++; ++ ctx->first_element = true; ++} ++ ++void ++json_document_end (json_ctx_t *ctx) ++{ ++ ctx->indent_level--; ++ ++ do_indent (ctx); ++ ++ fputs ("\n}", ctx->fp); ++} ++ ++void ++json_attr_object_begin (json_ctx_t *ctx, const char *name) ++{ ++ if (!ctx->first_element) ++ fprintf (ctx->fp, ",\n"); ++ ++ do_indent (ctx); ++ ++ fprintf (ctx->fp, "\"%s\": {\n", name); ++ ++ ctx->indent_level++; ++ ctx->first_element = true; ++} ++ ++void ++json_attr_object_end (json_ctx_t *ctx) ++{ ++ ctx->indent_level--; ++ ctx->first_element = false; ++ ++ fputs ("\n", ctx->fp); ++ ++ do_indent (ctx); ++ ++ fputs ("}", ctx->fp); ++} ++ ++void ++json_attr_string (json_ctx_t *ctx, const char *name, const char *s) ++{ ++ if (!ctx->first_element) ++ fprintf (ctx->fp, ",\n"); ++ else ++ ctx->first_element = false; ++ ++ do_indent (ctx); ++ ++ fprintf (ctx->fp, "\"%s\": \"%s\"", name, s); ++} ++ ++void ++json_attr_double (json_ctx_t *ctx, const char *name, double d) ++{ ++ if (!ctx->first_element) ++ fprintf (ctx->fp, ",\n"); ++ else ++ ctx->first_element = false; ++ ++ do_indent (ctx); ++ ++ fprintf (ctx->fp, "\"%s\": %g", name, d); ++} ++ ++void ++json_array_begin (json_ctx_t *ctx, const char *name) ++{ ++ if (!ctx->first_element) ++ fprintf (ctx->fp, ",\n"); ++ ++ do_indent (ctx); ++ ++ fprintf (ctx->fp, "\"%s\": [", name); ++ ++ ctx->indent_level++; ++ ctx->first_element = true; ++} ++ ++void ++json_array_end (json_ctx_t *ctx) ++{ ++ ctx->indent_level--; ++ ctx->first_element = false; ++ ++ fputs ("]", ctx->fp); ++} ++ ++void ++json_element_double (json_ctx_t *ctx, double d) ++{ ++ if (!ctx->first_element) ++ fprintf (ctx->fp, ", %g", d); ++ else ++ { ++ fprintf (ctx->fp, "%g", d); ++ ctx->first_element = false; ++ } ++} ++ ++void ++json_element_object_begin (json_ctx_t *ctx) ++{ ++ if (!ctx->first_element) ++ fprintf (ctx->fp, ","); ++ ++ fputs ("\n", ctx->fp); ++ ++ do_indent (ctx); ++ ++ fputs ("{\n", ctx->fp); ++ ++ ctx->indent_level++; ++ ctx->first_element = true; ++} ++ ++void ++json_element_object_end (json_ctx_t *ctx) ++{ ++ ctx->indent_level--; ++ ctx->first_element = false; ++ ++ fputs ("\n", ctx->fp); ++ ++ do_indent (ctx); ++ ++ fputs ("}", ctx->fp); ++} +diff -urN glibc-2.17-c758a686/benchtests/json-lib.h glibc-2.17-c758a686/benchtests/json-lib.h +--- glibc-2.17-c758a686/benchtests/json-lib.h 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/json-lib.h 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,47 @@ ++/* Simple library for printing JSON data. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef __JSON_LIB_H__ ++#define __JSON_LIB_H__ ++ ++#include <stdbool.h> ++#include <stdio.h> ++ ++struct json_ctx ++{ ++ FILE *fp; ++ unsigned int indent_level; ++ bool first_element; ++}; ++ ++typedef struct json_ctx json_ctx_t; ++ ++void json_init (json_ctx_t *ctx, unsigned int indent_level, FILE *fp); ++void json_document_begin (json_ctx_t *ctx); ++void json_document_end (json_ctx_t *ctx); ++void json_attr_object_begin (json_ctx_t *ctx, const char *name); ++void json_attr_object_end (json_ctx_t *ctx); ++void json_attr_string (json_ctx_t *ctx, const char *name, const char *s); ++void json_attr_double (json_ctx_t *ctx, const char *name, double d); ++void json_array_begin (json_ctx_t *ctx, const char *name); ++void json_array_end (json_ctx_t *ctx); ++void json_element_double (json_ctx_t *ctx, double d); ++void json_element_object_begin (json_ctx_t *ctx); ++void json_element_object_end (json_ctx_t *ctx); ++ ++#endif +diff -urN glibc-2.17-c758a686/benchtests/log2-inputs glibc-2.17-c758a686/benchtests/log2-inputs +--- glibc-2.17-c758a686/benchtests/log2-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/log2-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,203 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.fe80b73f2f763p-485 ++0x1.63fbf19a1a79ap-572 ++0x1.63fb4717f36abp-594 ++0x1.6a75240c62b59p-162 ++0x1.43ad207275c97p-830 ++0x1.1c24c26efbca5p-673 ++0x1.c37f23c54205ap655 ++0x1.fdc0e348d5bbbp722 ++0x1.0e2e51e9645a9p503 ++0x1.3291a6e483d75p-941 ++0x1.6b4f9118d9ddfp329 ++0x1.618e84faa68d1p-696 ++0x1.7f8a7417686dbp577 ++0x1.3fc6a169fc1a2p662 ++0x1.6631142da8476p-11 ++0x1.67cc768721f6ep159 ++0x1.7439b48fb7f01p-744 ++0x1.17cad4e754e3fp-833 ++0x1.6ca873e653646p35 ++0x1.6283941b425d9p-322 ++0x1.38de764542fc9p-939 ++0x1.6a5706bcca88ep318 ++0x1.8b9e71efccf99p-671 ++0x1.61d7a07ca117fp-246 ++0x1.66707402ed87fp468 ++0x1.650ff2faef0c4p-185 ++0x1.6afe3332695d8p-382 ++0x1.5c05817f1aec0p861 ++0x1.61bb62e0a68cdp625 ++0x1.678e93ded24cep-614 ++0x1.d2b6e60469afdp-753 ++0x1.abb9a6eed73b2p-731 ++0x1.21a4014034f31p-718 ++0x1.bdbe3237b3785p779 ++0x1.0f115229b9a52p-437 ++0x1.6154e26a722b2p388 ++0x1.64e982a82df60p346 ++0x1.61bdc663af57bp799 ++0x1.091f7362aa8bfp-871 ++0x1.e35153cac25b3p873 ++0x1.6402b62fbebf7p-329 ++0x1.680d413ef3777p775 ++0x1.8620d183bd0a7p-670 ++0x1.e0e017206206ep-129 ++0x1.66d9419f2852cp-526 ++0x1.5a07e14aa7e55p-888 ++0x1.b91ed57fdd3f2p1017 ++0x1.7c58838087ef5p519 ++0x1.2d0676720fb21p-145 ++0x1.64bcd3d675a60p-390 ++0x1.6204f6b121d0dp255 ++0x1.6af30218cdccfp-955 ++0x1.dcf3f2c2809e1p-821 ++0x1.6269366dd0672p436 ++0x1.dd117726eefe5p93 ++0x1.65de442c50bedp-28 ++0x1.10c8b6ab1a5f0p-313 ++0x1.6855f7474d2eep828 ++0x1.6659b0863e8d0p-545 ++0x1.7a80b6736105cp-566 ++0x1.3ff7a01b0590cp560 ++0x1.6559f386d6ca3p-696 ++0x1.68e96369693cep812 ++0x1.8d29a4b500b0dp537 ++0x1.65b347d411765p826 ++0x1.669080c6f3a8bp-121 ++0x1.faabb750c7baep548 ++0x1.670f72a6f1cd1p834 ++0x1.6b75063adb10dp396 ++0x1.f030420faed63p-788 ++0x1.a20214aeefbe0p186 ++0x1.8b3af704f3526p449 ++0x1.6663a7e181023p-643 ++0x1.e1f6d671b95f6p978 ++0x1.6aea24ab9c956p84 ++0x1.6318c0bc48f9bp-996 ++0x1.6603e22b2d2d1p-257 ++0x1.6b59906a87ddfp-896 ++0x1.665307aea1415p-153 ++0x1.6d9be19aca354p-887 ++0x1.640977cfbd7dep-564 ++0x1.1c6de3bf6f82ep909 ++0x1.24c452230e994p705 ++0x1.6b2c473cd0623p-626 ++0x1.beab17bff5e9ap-708 ++0x1.680445b6d430bp465 ++0x1.454de219171f0p158 ++0x1.6818a49dfb38dp20 ++0x1.15cb95403d2a4p622 ++0x1.1338a5210da9ap-78 ++0x1.651fc5045320ep-861 ++0x1.657ed41aace5bp-2 ++0x1.ff563189469ffp-44 ++0x1.62c811ba1d5e4p1 ++0x1.61f23108289f9p-422 ++0x1.168066765d078p875 ++0x1.a671a61b114a2p124 ++0x1.4471a372f703ep252 ++0x1.623ae599ffa3fp98 ++0x1.531085de4958bp441 ++0x1.4d6172de45534p-911 ++0x1.e5dcc2b3d23acp-437 ++0x1.67cac1dccdfcdp985 ++0x1.0ac1a5608baf9p-896 ++0x1.654cd778b1e36p837 ++0x1.929004c882902p-552 ++0x1.594a8c88348b0p-970 ++0x1.dc7f4509ddfd6p-832 ++0x1.d49846a313b79p998 ++0x1.6314b3a5ac85bp1018 ++0x1.d1d1325f66b7ep-763 ++0x1.6592a24f64047p403 ++0x1.bd47a2a1cc99fp-486 ++0x1.644266dda9ad2p778 ++0x1.6b2e821002783p26 ++0x1.69936648ba64ap-143 ++0x1.61d2a2a99f470p-970 ++0x1.6599c252868bap-840 ++0x1.3590b2e6af870p56 ++0x1.6b8311b9abc91p-961 ++0x1.29d1a705c6a3bp-660 ++0x1.6815d5d44778ap945 ++0x1.6ae36036fcee1p153 ++0x1.2034b640f0f4ap-3 ++0x1.84fec67d11992p85 ++0x1.1fa1a74c0af59p-478 ++0x1.64de9092a8789p-784 ++0x1.701bf3e5b0120p243 ++0x1.63ac048ca107bp-666 ++0x1.0095c464cfc5ap58 ++0x1.5f2d0041e5db2p362 ++0x1.62fa34a5c1bcap-412 ++0x1.cacf042abda4fp-54 ++0x1.647a95ef487b3p224 ++0x1.f8c2353681cbep905 ++0x1.67bfe67714076p366 ++0x1.6779865baf78fp-291 ++0x1.9395b1beca360p361 ++0x1.6521449e5ffe2p-671 ++0x1.667567cd5db59p-293 ++0x1.511df0b72a30bp30 ++0x1.65f8251162417p642 ++0x1.d0a0825ffb10cp210 ++0x1.63f2f5ba5415ap-716 ++0x1.65681206c6030p-580 ++0x1.5254d49bacf90p-849 ++0x1.49dd92d7cf7fep-208 ++0x1.688f565603c25p473 ++0x1.6439333b5f705p-589 ++0x1.663922acbdbb0p208 ++0x1.5a2631eb8325cp490 ++0x1.6171d410fcbbfp683 ++0x1.6ae4d6f8f091ep511 ++0x1.ae8ff53250e31p-1012 ++0x1.f182e535fab45p-332 ++0x1.653f84e9e8c3fp-34 ++0x1.99a737ac5cdadp328 ++0x1.301bb0b8607cbp232 ++0x1.706fa3fcd1d85p337 ++0x1.b650863c8ead0p227 ++0x1.64b9045b2d59dp740 ++0x1.681c66eda34d4p-113 ++0x1.f881050ae3a0cp-51 ++0x1.08bb778ebc5b6p-28 ++0x1.815fe4e6e4b72p100 ++0x1.691b6172a5798p-576 ++0x1.684f74d76367cp1010 ++0x1.64d044c4779d2p-207 ++0x1.690c021b1ae97p454 ++0x1.9d0ec359f67d5p77 ++0x1.43686724be426p774 ++0x1.678821f848886p-43 ++0x1.17abd1fcb3d3bp532 ++0x1.616ee4093684fp-43 ++0x1.631ec6e8ef9a7p264 ++0x1.63aa97d7de121p795 ++0x1.b172e7750d144p841 ++0x1.6836107e18e77p-826 ++0x1.65957572dedc3p-339 ++0x1.66b8d2cad9382p301 ++0x1.c8f410709f858p-761 ++0x1.6a2093c2b009dp-1013 ++0x1.b97a45fb7dad5p660 ++0x1.8150734f7fc95p40 ++0x1.6ab8a053c9089p-246 ++0x1.6b81e74a6293ep-813 ++0x1.251a74cf150acp779 ++0x1.44cf3370a55eap703 ++0x1.32e2e35cc77f3p-4 ++0x1.c0c6049562d13p-997 ++0x1.a050f54285fb8p-397 ++0x1.68ada319f3033p748 ++0x1.b2f37264e0acbp753 ++0x1.617614c5ecea7p137 ++0x1.b01c803ac06b1p559 ++0x1.4a19f60ad4238p-223 ++0x1.6314648785495p-40 ++0x1.6936664ef255fp943 ++0x1.6208f15a6484fp464 ++0x1.6b1244514989ep-886 +diff -urN glibc-2.17-c758a686/benchtests/log-inputs glibc-2.17-c758a686/benchtests/log-inputs +--- glibc-2.17-c758a686/benchtests/log-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/log-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,295 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.0c5e3365a2d95p0 ++0x1.037414ff63ab9p0 ++0x1.fc9366fa4c3a0p-1 ++0x1.f710159a37ab9p-1 ++0x1.5576e114e4f7cp-961 ++0x1.9d3382c6679b7p-1 ++0x1.f9e37774c7510p-1 ++0x1.058622e63af9dp0 ++0x1.fa62a3b5d47b5p-1 ++0x1.01fb737f14c41p250 ++0x1.fc7952a4bde83p-1 ++0x1.b68a54ad54fb4p-320 ++0x1.b8978216476a5p837 ++0x1.345bf2c9c6238p-638 ++0x1.580da4a80849ap197 ++0x1.fb0f43269facap-1 ++0x1.065f47ccd6b6cp0 ++0x1.db1317a87c872p-928 ++0x1.f563a1330ee1bp-1 ++0x1.8352661de852dp-1 ++0x1.887750a7ad5d0p315 ++0x1.385ed12583117p674 ++0x1.ff610285e1e46p-1 ++0x1.02e063a2777f0p-254 ++0x1.6b0f9482349a9p-489 ++0x1.f0413135a3a88p430 ++0x1.1ec910ecf9419p2 ++0x1.caab24b23bfdap-1 ++0x1.42d83712a1fabp-995 ++0x1.01d4b06dc2ce1p-2 ++0x1.c10a94cb4f93dp2 ++0x1.071a5441b3cabp0 ++0x1.04e8940083142p504 ++0x1.5083603bf110cp-660 ++0x1.f5312171625f3p-1 ++0x1.f15370065e66dp-1 ++0x1.f4de71c3efa90p-1 ++0x1.072a679084c2ep0 ++0x1.f89d125e68705p-1 ++0x1.31a5450e17b4fp10 ++0x1.036d1462f82d5p-1 ++0x1.54f131208767bp0 ++0x1.016fc65a58dd9p0 ++0x1.24b2c009625bfp-512 ++0x1.2898b1cc9ddc8p-1 ++0x1.0270851f17bb1p-241 ++0x1.eb1f03c6aa4d3p38 ++0x1.d29a93f1faf4fp964 ++0x1.d31de19a4e829p140 ++0x1.f8d260eeb5cefp-1 ++0x1.f259a4bc8f770p-1 ++0x1.8b9016448c4ccp-105 ++0x1.240f40168110bp-253 ++0x1.06fb26943be9bp0 ++0x1.9bae861967209p87 ++0x1.51fcc64d69563p-48 ++0x1.f4ff2413b004bp-1 ++0x1.387d65055d963p4 ++0x1.1c5705c916859p929 ++0x1.073be54be8356p0 ++0x1.544871c917766p-1 ++0x1.398536e090d37p-79 ++0x1.f34707ce261e5p-1 ++0x1.2e5792109f59bp593 ++0x1.075bd0ce07ef0p0 ++0x1.0ef545b2e5627p0 ++0x1.b2aa170bed688p-919 ++0x1.e341461098908p984 ++0x1.eacd43dea8eb2p-1 ++0x1.18c2a0ab6598bp265 ++0x1.219df5338fbc1p482 ++0x1.a9a0d4ceb201dp2 ++0x1.c0a6467baf54dp-23 ++0x1.0b499489342c1p361 ++0x1.f7c1f18cae6f4p-42 ++0x1.d8dea4350fb7fp627 ++0x1.0541421affe22p0 ++0x1.574bd3c94bdc9p-528 ++0x1.9aa814150ab62p-1 ++0x1.cab9532515b30p10 ++0x1.01e446e6b365ep0 ++0x1.04ef17a8014c7p0 ++0x1.fd91b3dc4e166p-98 ++0x1.9e879318176aap-448 ++0x1.605e9760da702p457 ++0x1.3e1d3541f8a73p131 ++0x1.ce2a303076cbap-9 ++0x1.f72021eaea3b7p-547 ++0x1.3384548e90a6dp222 ++0x1.0215143216bbap0 ++0x1.f546109b8e222p-1 ++0x1.b828c4971379dp779 ++0x1.0465440f18b39p0 ++0x1.00a302042eb49p0 ++0x1.9914e6bc2d08dp-637 ++0x1.aa8176fc83146p3 ++0x1.0dc041c8c9084p788 ++0x1.c17f14032741cp157 ++0x1.f8c3355f2c74fp-1 ++0x1.c0c373cb8d3abp-568 ++0x1.ffb897f081c1cp-1 ++0x1.7da4d5c6ecca5p666 ++0x1.1f8dd20fc3029p-196 ++0x1.f39d30de8b00cp-1 ++0x1.5710417d88db0p526 ++0x1.f552e4572e2e0p-1 ++0x1.ce97f507ac81ep-196 ++0x1.fe0b407a35cf9p-1 ++0x1.ffba3091bc8d9p-1 ++0x1.f79207f982a95p907 ++0x1.f3bc85de399b1p-1 ++0x1.f6a9075959280p-1 ++0x1.9971a0d49cffcp0 ++0x1.fdd4d11db35dcp-1 ++0x1.9f453762d3790p-708 ++0x1.d1122424ad397p717 ++0x1.fd71a20e66628p-1 ++0x1.007c20fefd661p0 ++0x1.0137d702a29bdp0 ++0x1.93e9047c983bfp-16 ++0x1.10cdf415042b5p0 ++0x1.fe6d8639abca0p-1 ++0x1.f7278572f6b66p-1 ++0x1.0673e76436ebcp550 ++0x1.f34833c8c70bcp-1 ++0x1.1b530128cc02dp8 ++0x1.ae48a5851e7a3p-236 ++0x1.98bdb6dff9d19p74 ++0x1.fbfd85f14418ep-1 ++0x1.070dd2780fcdap22 ++0x1.07a8f5726ae12p0 ++0x1.9a2ac2db753f8p-892 ++0x1.1461250716450p57 ++0x1.3b5be316bc364p-3 ++0x1.a2143693816d1p862 ++0x1.9418a18831f94p-502 ++0x1.ea8306738954cp993 ++0x1.fff14533df4f3p-1 ++0x1.0693706ddc70cp1 ++0x1.59e3947bce39dp-4 ++0x1.fa64a24c3030ap-1 ++0x1.044ce02e484e6p0 ++0x1.a272b5bdc397ep327 ++0x1.1c4577fcbe052p4 ++0x1.00ede267fbd99p0 ++0x1.028e26e56b7dfp0 ++0x1.005cf758f0dd7p635 ++0x1.bca6110bd6b05p46 ++0x1.11e7148e3f7e4p137 ++0x1.616e31d9c78afp898 ++0x1.f2eff0abf8fa1p-1 ++0x1.fd2275eabbc55p-1 ++0x1.e8f5a410e1a82p-1 ++0x1.7124e6de4fec6p342 ++0x1.95b03344f67d4p74 ++0x1.fb46137fbdd00p-1 ++0x1.78f9961f0c11bp936 ++0x1.2d3230575fa1dp-23 ++0x1.5cd631b404c9dp564 ++0x1.6a7645d7bc818p-901 ++0x1.1daca63403190p-160 ++0x1.64b4929d7185dp7 ++0x1.f95a819a0c75ep-1 ++0x1.fa2a9599f61c2p-1 ++0x1.f68b82c96e845p-1 ++0x1.b5c634c9a19f0p-551 ++0x1.706c63689c814p917 ++0x1.fa1134f93ff1bp0 ++0x1.b8e642ca65132p12 ++0x1.fdb645fc3558fp-1 ++0x1.9909b15771ca6p2 ++0x1.f4f6132242443p-1 ++0x1.c02b65da31a5cp-9 ++0x1.8b40c0afd5a42p679 ++0x1.1d9f80f2849ebp1015 ++0x1.3426c343358d6p608 ++0x1.f634874d073bep-1 ++0x1.016ab0aff9b7dp0 ++0x1.f1f34486c65e2p-1 ++0x1.022e8230e4320p0 ++0x1.fbe0104a4b316p-1 ++0x1.55323737c4d7bp-69 ++0x1.fa3d13e0efecep-1 ++0x1.2a7e11b35214bp281 ++0x1.9a2c33af22120p-1 ++0x1.986983a9d6f51p-1 ++0x1.f2f723416775fp-1 ++0x1.5d8565304a570p2 ++0x1.f3999057087ebp-1 ++0x1.fff027a147cc4p-1 ++0x1.f369333fdcaa7p-1 ++0x1.15ee471de5adcp-537 ++0x1.faa9f49088862p-1 ++0x1.0138239c244bcp0 ++0x1.8c28955e4efb3p-1 ++0x1.c3db66d450094p-916 ++0x1.dc4b70539f21cp-390 ++0x1.f7a363909f425p501 ++0x1.fb86b76e851a5p-1 ++0x1.010290232f8fcp-97 ++0x1.650a4595be763p510 ++0x1.fbd7a36081ccdp-1 ++0x1.073f0084dc154p0 ++0x1.fb7951f83410dp868 ++0x1.0404d08738d62p0 ++0x1.f1d895b2a5fdap-1 ++0x1.55472046b4703p351 ++0x1.f63882efa2ec0p-1 ++0x1.f367c590b00e1p-1 ++0x1.5251b7177fe50p501 ++0x1.49f2a03e6057ap-140 ++0x1.d5a68682d9946p-1 ++0x1.fcdd65a9229b0p-1 ++0x1.98bea1a0d0fbep681 ++0x1.260d06b5edc4bp-336 ++0x1.f5d520240b30ap-1 ++0x1.f8715777db2f7p-1 ++0x1.b3b0b64c86e27p-1 ++0x1.ae637316fa604p2 ++0x1.79919761b73adp43 ++0x1.bd55c268d4f40p-1 ++0x1.c81103f744ee1p4 ++0x1.deeeb24db6f46p-1 ++0x1.1056a7ba848e4p566 ++0x1.b167817c24607p-513 ++0x1.95d245973230bp798 ++0x1.04d551a6da2dcp-921 ++0x1.df2572264569fp92 ++0x1.fb105105409c1p-1 ++0x1.277ce2d7a1945p20 ++0x1.fc93d4234f18bp-1 ++0x1.be9f65acd2fa6p-911 ++0x1.0548c4cb78cd1p400 ++0x1.794c300f69a14p688 ++0x1.7dda15569e759p731 ++0x1.fdc9d6a00fb8ep-1 ++0x1.faae623a143f1p-1 ++0x1.8128373a5b95ep-608 ++0x1.c2e13445f6ca7p316 ++0x1.01d3a3dd89524p0 ++0x1.aee2578e3f114p-1 ++0x1.863ff7799e878p-266 ++0x1.ea8897550748bp-262 ++0x1.0652f24fd5820p0 ++0x1.56114467afa90p1 ++0x1.01b4561c918a5p0 ++0x1.21cd64b06baebp339 ++0x1.3d6384a8fd1b3p-35 ++0x1.01af659ea1389p0 ++0x1.fa8ed0ab15042p-724 ++0x1.47c1f4babad96p785 ++0x1.fc47829fd7bdfp-1 ++0x1.f3d2241382331p-1 ++0x1.0a0897e048564p0 ++0x1.957ab3f18f8e3p-446 ++0x1.5aad466994dacp506 ++0x1.fba8a2b4ab119p-1 ++0x1.003c906ab1a79p0 ++0x1.7039f057a155fp-678 ++0x1.f85964e37aae8p-1 ++0x1.53e2e0469deecp-711 ++0x1.f0cb530a2bf7dp658 ++0x1.af8d471733d1dp-1022 ++0x1.a684e3b3af12dp-239 ++0x1.fd26d7fa466b5p1 ++0x1.ebd3605467082p163 ++0x1.e29567ed6afecp-11 ++0x1.073757004a5a1p0 ++0x1.022334168530bp0 ++0x1.d4a6e162f4ceap575 ++0x1.00dbb330a556fp0 ++0x1.276b872c49045p0 ++0x1.51e835ab51aafp-7 ++0x1.e3c106b648377p-184 ++0x1.5a46f2460d290p-46 ++0x1.199a05d85e80dp-258 ++0x1.cde614a60f60ap-1 ++0x1.50f3a79e68493p-152 ++0x1.2c9af562aa58dp0 ++0x1.f695411839d24p-1 ++0x1.e53e5125bcdffp413 ++0x1.03e4c3218f178p0 ++0x1.d66213dc2e585p-820 ++0x1.ff5b9106a784ep-1 ++0x1.4d4990f481852p-15 ++0x1.39a5976ee7210p-879 ++0x1.f5e4d494092e7p-1 ++0x1.2bb040585ffdep-28 ++0x1.f707b3cd873d2p-1 ++0x1.fc1a353ea30eap-1 ++0x1.fc44366f2d5c7p-1 ++0x1.f9fb832b4f54fp-1 +diff -urN glibc-2.17-c758a686/benchtests/Makefile glibc-2.17-c758a686/benchtests/Makefile +--- glibc-2.17-c758a686/benchtests/Makefile 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/Makefile 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,164 @@ ++# 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 ++# <http://www.gnu.org/licenses/>. ++ ++ ++# Makefile for benchmark tests. The only useful target here is `bench`. ++# Add benchmark functions in alphabetical order. ++ ++# Run python scripts with $(PYTHON). ++PYTHON := python ++ ++subdir := benchtests ++ ++include ../Makeconfig ++bench-math := acos acosh asin asinh atan atanh cos cosh exp exp2 ffs ffsll \ ++ log log2 modf pow rint sin sincos sinh sqrt tan tanh ++ ++bench-pthread := pthread_once ++ ++bench := $(bench-math) $(bench-pthread) ++ ++# String function benchmarks. ++string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ ++ mempcpy memset rawmemchr stpcpy stpncpy strcasecmp strcasestr \ ++ 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) ++ ++stdlib-bench := strtod ++ ++benchset := $(string-bench-all) $(stdlib-bench) ++ ++CFLAGS-bench-ffs.c += -fno-builtin ++CFLAGS-bench-ffsll.c += -fno-builtin ++ ++bench-malloc := malloc-thread ++ ++$(addprefix $(objpfx)bench-,$(bench-math)): $(libm) ++$(addprefix $(objpfx)bench-,$(bench-pthread)): $(shared-thread-library) ++$(objpfx)bench-malloc-thread: $(shared-thread-library) ++ ++ ++ ++# Rules to build and execute the benchmarks. Do not put any benchmark ++# parameters beyond this point. ++ ++# We don't want the benchmark programs to run in parallel since that could ++# affect their performance. ++.NOTPARALLEL: ++ ++include ../Rules ++ ++binaries-bench := $(addprefix $(objpfx)bench-,$(bench)) ++binaries-benchset := $(addprefix $(objpfx)bench-,$(benchset)) ++binaries-bench-malloc := $(addprefix $(objpfx)bench-,$(bench-malloc)) ++ ++# The default duration: 10 seconds. ++ifndef BENCH_DURATION ++BENCH_DURATION := 10 ++endif ++ ++CPPFLAGS-nonlib += -DDURATION=$(BENCH_DURATION) ++ ++# Use clock_gettime to measure performance of functions. The default is to use ++# HP_TIMING if it is available. ++ifdef USE_CLOCK_GETTIME ++CPPFLAGS-nonlib += -DUSE_CLOCK_GETTIME ++endif ++ ++DETAILED_OPT := ++ ++ifdef DETAILED ++DETAILED_OPT := -d ++endif ++ ++# This makes sure CPPFLAGS-nonlib and CFLAGS-nonlib are passed ++# for all these modules. ++cpp-srcs-left := $(binaries-benchset:=.c) $(binaries-bench:=.c) \ ++ $(binaries-bench-malloc:=.c) ++lib := nonlib ++include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) ++ ++extra-objs += json-lib.o ++ ++bench-deps := bench-skeleton.c bench-timing.h Makefile ++ ++run-bench = $(test-wrapper-env) \ ++ $(run-program-env) \ ++ $($*-ENV) $(rtld-prefix) $${run} ++ ++timing-type := $(objpfx)bench-timing-type ++ ++bench-clean: ++ rm -f $(binaries-bench) $(addsuffix .o,$(binaries-bench)) ++ rm -f $(binaries-benchset) $(addsuffix .o,$(binaries-benchset)) ++ rm -f $(binaries-bench-malloc) $(addsuffix .o,$(binaries-bench-malloc)) ++ rm -f $(timing-type) $(addsuffix .o,$(timing-type)) ++ ++bench: $(timing-type) bench-set bench-func bench-malloc ++ ++bench-set: $(binaries-benchset) ++ for run in $^; do \ ++ echo "Running $${run}"; \ ++ $(run-bench) > $${run}.out; \ ++ done ++ ++bench-malloc: $(binaries-bench-malloc) ++ run=$(objpfx)bench-malloc-thread; \ ++ for thr in 1 8 16 32; do \ ++ echo "Running $${run} $${thr}"; \ ++ $(run-bench) $${thr} > $${run}-$${thr}.out; \ ++ done ++ ++# Build and execute the benchmark functions. This target generates JSON ++# formatted bench.out. Each of the programs produce independent JSON output, ++# so one could even execute them individually and process it using any JSON ++# capable language or tool. ++bench-func: $(binaries-bench) ++ { timing_type=$$($(timing-type)); \ ++ echo "{\"timing_type\": \"$${timing_type}\","; \ ++ echo " \"functions\": {"; \ ++ for run in $^; do \ ++ if ! [ "x$${run}" = "x$<" ]; then \ ++ echo ","; \ ++ fi; \ ++ echo "Running $${run}" >&2; \ ++ $(run-bench) $(DETAILED_OPT); \ ++ done; \ ++ echo; \ ++ echo " }"; \ ++ echo "}"; } > $(objpfx)bench.out-tmp; \ ++ if [ -f $(objpfx)bench.out ]; then \ ++ mv -f $(objpfx)bench.out $(objpfx)bench.out.old; \ ++ fi; \ ++ mv -f $(objpfx)bench.out-tmp $(objpfx)bench.out ++ $(PYTHON) scripts/validate_benchout.py $(objpfx)bench.out \ ++ scripts/benchout.schema.json ++ ++$(timing-type) $(binaries-bench) $(binaries-benchset) \ ++ $(binaries-bench-malloc): %: %.o $(objpfx)json-lib.o \ ++ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ ++ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) ++ $(+link) ++ ++$(objpfx)bench-%.c: %-inputs $(bench-deps) ++ { if [ -n "$($*-INCLUDE)" ]; then \ ++ cat $($*-INCLUDE); \ ++ fi; \ ++ $(PYTHON) scripts/bench.py $(patsubst %-inputs,%,$<); } > $@-tmp ++ mv -f $@-tmp $@ +diff -urN glibc-2.17-c758a686/benchtests/modf-inputs glibc-2.17-c758a686/benchtests/modf-inputs +--- glibc-2.17-c758a686/benchtests/modf-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/modf-inputs 2015-06-20 21:22:16.301457983 -0400 +@@ -0,0 +1,4 @@ ++## includes: math.h ++## args: double:<double *> ++42.0 ++-42.0 +diff -urN glibc-2.17-c758a686/pow-inputs glibc-2.17-c758a686/benchtests/pow-inputs +--- glibc-2.17-c758a686/benchtests/pow-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/pow-inputs 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,511 @@ ++## args: double:double ++## ret: double ++## includes: math.h ++42.0, 42.0 ++-0x1.086f771a2b37bp696, 0x1.592b453fe869fp-81 ++0x1.19eb12518e61bp-217, 0x1.c87753325f271p59 ++0x1.5c68b7b390060p-869, -0x1.0000000000000p-64 ++0x1.d96cb2cd196ebp3, 0x1.0000000000000p-64 ++-0x1.f7cb93ee0ba9bp-238, 0x1.b7f046c622df6p691 ++0x1.5cf5307b64e94p-233, 0x1.4499d7e88a731p124 ++0x1.58bc610fde155p756, -0x1.0000000000000p-64 ++0x1.11e4c61e2489ep9, 0x1.f3ddd0aadf9e9p94 ++0x1.064765103f18ap-245, 0x1.a413811779c11p89 ++-0x1.a26e540b1b5e0p77, 0x1.5987a1b0f6368p897 ++0x1.465db461ffd24p681, -0x1.0000000000000p-64 ++-0x1.b986d646b93b4p-100, -0x1.936ff2a7c8adep-420 ++0x1.af0d371d0a43dp-197, 0x1.f185f2aba0958p217 ++0x1.13ce451492820p115, -0x1.1598c3d54c625p81 ++0x1.d5ec14b6de205p-604, -0x1.0000000000000p-64 ++0x1.cf8ad6a495d19p-100, 0x1.8d2563e08105dp7 ++0x1.1a7d3100f9ef4p-636, -0x1.0000000000000p-64 ++-0x1.6dd9a7d0122f5p421, 0x1.199895f013a09p49 ++0x1.b892e5125d7d1p-345, 0x1.0000000000000p-64 ++0x1.5dfa7063ce092p996, 0x1.0000000000000p-64 ++0x1.9e7d74cdbf190p512, -0x1.3d1b5206e8127p237 ++0x1.b941e202e240dp-325, -0x1.0000000000000p-64 ++-0x1.fbe85766fae96p-463, 0x1.91c903c89b075p85 ++0x1.eab5553bcdfbap-957, 0x1.ab0a06811189cp90 ++0x1.4c2c90f483a09p917, -0x1.0000000000000p-64 ++0x1.014bc72248db8p439, -0x1.e1bef116ca6d9p112 ++-0x1.6733d0746880bp-316, 0x1.8a34e6c887c39p-107 ++-0x1.5a9b05cc4e1c4p461, -0x1.88d2560562b17p-798 ++0x1.9690663e74e47p967, -0x1.0000000000000p-64 ++-0x1.125986687c812p-159, -0x1.bd3236342d0f4p550 ++0x1.3d6422e5177bep-951, 0x1.3878a292f55d9p226 ++-0x1.9922669366d2dp590, -0x1.ae14d63976e00p-684 ++0x1.d838c66e05cc9p256, 0x1.0000000000000p-64 ++0x1.c319328022c2cp890, -0x1.4a627098d6e49p170 ++0x1.0deee25028507p461, 0x1.310f343ce0281p94 ++0x1.279923dac3d31p147, 0x1.0000000000000p-64 ++0x1.e27fe364ee0b4p963, -0x1.107d33f004629p245 ++-0x1.8160e4b7efcecp833, -0x1.9612560bf9302p-472 ++-0x1.7814633c7452bp-821, -0x1.d36af1ef2c42fp636 ++0x1.bac865bccd66ep113, -0x1.454be507db267p19 ++0x1.c75b53051ead0p-931, -0x1.0000000000000p-64 ++-0x1.cab4e5935aeaep318, -0x1.6794550b87520p-257 ++0x1.088056b5fbc0dp-459, 0x1.0000000000000p-64 ++0x1.1f8eb28937183p748, -0x1.b2a940cf17bc0p217 ++0x1.ba85352faba13p-796, -0x1.0000000000000p-64 ++0x1.1d3984c620975p460, 0x1.0000000000000p-64 ++0x1.37acd13a9ea78p1019, 0x1.0000000000000p-64 ++0x1.0e9d041b054d3p-411, 0x1.0000000000000p-64 ++0x1.a156c095ec992p102, -0x1.46f561fd1fda9p98 ++-0x1.273ca2d449455p471, -0x1.fa6c92046c475p-860 ++-0x1.7b475167ae88ep-116, -0x1.eba627003ccc5p-339 ++0x1.2996c344cf7dcp-564, 0x1.21df51e88e157p161 ++-0x1.7d29f253d3e79p636, -0x1.8e30a1ba55f7fp77 ++0x1.99ffe6fb747bep1003, -0x1.8b1047a0ed3b3p67 ++0x1.248c46b353471p251, -0x1.3aa8631084564p8 ++-0x1.500c56dfd8fa0p-869, 0x1.819212336e2afp-523 ++0x1.012185cb5e155p-672, 0x1.dcbc907d906f0p203 ++0x1.964221fe0b0c5p-260, -0x1.0000000000000p-64 ++-0x1.172f10899cbcep669, 0x1.e4e656fea6c19p663 ++0x1.e356e63b681dep989, -0x1.dd9d772868663p41 ++0x1.ccd0118265376p287, -0x1.22ae0058250b6p184 ++0x1.3de177d6762ebp742, -0x1.ebc180d571e12p58 ++0x1.04caa30a223c6p-294, 0x1.0000000000000p-64 ++-0x1.e0ffa63b800fcp-938, 0x1.0a2c229973ed9p149 ++0x1.e0ffa63b800fcp-938, 0x1.0a2c229973ed9p149 ++0x1.d43815bff9e7dp-685, 0x1.825755f8cae4bp168 ++0x1.fe3b21bec8806p456, 0x1.0000000000000p-64 ++0x1.b26d766ab1f27p-162, 0x1.184f242e49092p249 ++-0x1.1c70d750f61abp-899, 0x1.e3f3e7ec803dap759 ++0x1.220fe763e4353p897, 0x1.6a6f650adecc0p141 ++0x1.d6f7716723825p-58, 0x1.0000000000000p-64 ++0x1.2b0242282c767p308, 0x1.c9dd84f859214p104 ++0x1.7d0ee4b3bb946p-563, -0x1.9d1683c6f5c5ap226 ++-0x1.8547b5d202937p967, -0x1.14e58570b43a5p-765 ++-0x1.568636c53d51fp-638, 0x1.164257f3ab632p-455 ++0x1.6d7936f1f5553p-435, 0x1.8f26767f92ccbp147 ++0x1.7c18551f15775p147, -0x1.0000000000000p-64 ++-0x1.f2ac8209992fbp-965, 0x1.5faaf4ec0340cp-236 ++-0x1.f57620fa5afd6p-69, -0x1.096166fce916ep-683 ++-0x1.5054f3c0b1320p-215, 0x1.8c01c0a19db1bp-285 ++0x1.e41e64f79a6a9p404, 0x1.0000000000000p-64 ++0x1.71fc41e25fe85p-413, 0x1.4acb80e80f0b2p214 ++0x1.fbf477dec9138p-661, 0x1.0000000000000p-64 ++0x1.7575c7cd67604p498, 0x1.0000000000000p-64 ++-0x1.f4dd41d434b62p-205, -0x1.981f66551fd64p805 ++0x1.76ac564847250p-870, -0x1.0000000000000p-64 ++0x1.bb0e222493e31p-632, 0x1.16ad202a7c871p27 ++-0x1.079a76db55d95p-974, -0x1.19d4717967203p-409 ++0x1.68a7c79597132p-227, 0x1.6c3871ff9ad60p195 ++0x1.4961c76e0940cp271, -0x1.0000000000000p-64 ++0x1.04cf75ca8337cp-273, -0x1.0000000000000p-64 ++0x1.4fffe4a25f260p152, -0x1.a0e3a7e58a0d3p149 ++0x1.c125c40bb88b6p-281, 0x1.bedf8672d605fp215 ++0x1.bcd59440339b5p67, -0x1.d225c2cc02d3bp60 ++0x1.670e80ab2399bp-841, 0x1.887061c29e4afp131 ++0x1.7c6ef76479beep839, -0x1.0f72a2967e041p98 ++0x1.272f8550905f7p-961, 0x1.21a6d4787c14cp190 ++0x1.0a33d4e39655cp-424, 0x1.4dafa3da87794p162 ++0x1.a34e21945e568p-641, 0x1.3a0a05d61f5e4p119 ++-0x1.b57493dffe1c3p68, -0x1.8e19843fbbd1ep515 ++0x1.a8ce11ea61121p248, -0x1.7b2376aa515e8p115 ++-0x1.5feca3ddab161p-509, 0x1.3e0c341715e1cp217 ++0x1.6695a0cf6063fp-689, 0x1.1852d463ea98ep37 ++0x1.9367127039f77p-293, 0x1.adbe75323caaap47 ++0x1.6ad5c2f704166p-336, -0x1.9bf7b7271daefp100 ++0x1.6791a1f6e89bap-845, 0x1.07e4c362cf895p92 ++-0x1.20d7f6086ddb2p143, 0x1.687a7454403f4p337 ++-0x1.9bd727a165453p-810, 0x1.742fe1f2bf2dbp-551 ++0x1.40c3b16a0dba0p438, -0x1.67a872ec62dadp90 ++0x1.5e0ab0f983abfp629, -0x1.0000000000000p-64 ++0x1.c929a231173cfp844, -0x1.f25c7501c8144p116 ++-0x1.410ad6057e935p204, 0x1.bdb5a3d649e74p-928 ++0x1.9f222254cab3fp-817, -0x1.0000000000000p-64 ++0x1.7f7d22b44403fp1007, -0x1.2299d752e308dp177 ++0x1.41f824f624f36p511, -0x1.0000000000000p-64 ++0x1.9fbb158e5d5dfp-525, 0x1.f803767193e3fp31 ++-0x1.e6a1216cab6d4p-260, 0x1.100d3600b5996p935 ++-0x1.dd23855d0cc3ep1003, 0x1.3411e38397aaep-158 ++-0x1.3a9e0585f7979p-827, -0x1.db64725e35a3cp-259 ++0x1.ce93a02ba2924p866, 0x1.0000000000000p-64 ++0x1.445bf157156d4p-100, 0x1.0000000000000p-64 ++-0x1.ba1ca38fc92ebp-848, -0x1.9270247b4b009p-609 ++-0x1.5ac2b6a0c0476p-172, -0x1.595d419d9babdp-399 ++-0x1.94f2b24fd7b65p839, -0x1.a42b466df80e1p519 ++0x1.bf66704c603f1p-859, 0x1.430eb110359f6p-63 ++0x1.e9ccb07667b5fp-435, 0x1.e7cec7c8e2138p229 ++-0x1.bcd59440339b5p67, -0x1.d225c2cc02d3bp60 ++0x1.a5e7c0a9c79d2p-503, -0x1.0000000000000p-64 ++0x1.91aa125544e6ep681, -0x1.0000000000000p-64 ++0x1.5371f5af7cd6ep-628, 0x1.078a57c0c5e30p147 ++-0x1.2890a668b0252p-207, 0x1.ec956130d1ea0p411 ++0x1.70f496a3b1319p-183, 0x1.9f04e4dd9dee0p159 ++-0x1.ab4c0689a295cp375, 0x1.ec1627c9f2374p-617 ++-0x1.390d459924f44p-348, -0x1.8e36a55756005p481 ++0x1.c1b483579742ap101, 0x1.a05a357f2d54fp236 ++0x1.d0a84005691b7p763, -0x1.68f840a20c734p60 ++0x1.f32d34d1fffd4p-40, 0x1.fc09869af26f1p131 ++-0x1.e693e5dbee2e0p207, 0x1.2301f18cd9d27p817 ++0x1.1f72a3d4f7881p-764, 0x1.4617565381163p177 ++-0x1.7f69c3aee139ep-648, 0x1.1f42e1d53ae48p597 ++-0x1.adc7f1f9fdc02p38, -0x1.a07af4087ad66p1011 ++-0x1.923d01b1c3960p-276, 0x1.2c6710910e47ap889 ++0x1.6b60a2accafe3p977, -0x1.78f4404c514b7p170 ++-0x1.0a2a3540be5a3p302, 0x1.3259b15ad5075p-333 ++-0x1.11e4c61e2489ep9, 0x1.f3ddd0aadf9e9p94 ++0x1.e02943925b096p-651, 0x1.3e5010a3be270p137 ++0x1.9887e07a7b4bdp-835, -0x1.0000000000000p-64 ++0x1.fb9fd6c57d283p-969, -0x1.eb21f1c75479dp195 ++0x1.55fb70ae2db62p-910, 0x1.b77402b5190d5p10 ++-0x1.38b1775c225eep723, 0x1.7595a59a7ba8dp901 ++0x1.fbdc30f777a6ap649, -0x1.ea19f696739e0p183 ++0x1.c2b5309403401p760, -0x1.0000000000000p-64 ++-0x1.3d6de154feafep496, -0x1.9763760be8c9dp-161 ++0x1.1c0a33e2b3719p-116, -0x1.0000000000000p-64 ++0x1.06b1024b8b4bap471, -0x1.cd9f24d503076p59 ++-0x1.6d0d67d7d2ad2p627, 0x1.35c77413a4d2fp190 ++-0x1.881467b6c56d5p-194, -0x1.465995072de7cp707 ++0x1.1147d4d59a3a5p-952, -0x1.0000000000000p-64 ++-0x1.c319328022c2cp890, -0x1.4a627098d6e49p170 ++0x1.993864ddbc05dp562, 0x1.0000000000000p-64 ++0x1.f9abd78250a64p633, -0x1.f104e2772f8cep141 ++-0x1.4d87f27b51978p-916, 0x1.073e35dc85a96p-1003 ++0x1.1e8e0347dd99bp278, 0x1.0000000000000p-64 ++0x1.7fbfc71fde6edp891, -0x1.0000000000000p-64 ++-0x1.ae86836ca4d83p659, -0x1.5153616fefc6ap-61 ++0x1.0452d237e1de7p-518, 0x1.296675c74320cp87 ++0x1.12fc06ee54ac1p615, -0x1.0000000000000p-64 ++0x1.887c234a8cc63p-708, 0x1.ae5fb57f66c84p175 ++0x1.4978c021c25cbp-130, -0x1.115a65f48b23cp80 ++-0x1.a1e733c9fd87fp552, 0x1.cef7045a6012ap811 ++0x1.f98611b7c6a51p538, -0x1.0000000000000p-64 ++-0x1.858f201dffc93p26, 0x1.6a110485981d4p-285 ++0x1.84297333218cep712, 0x1.497396c926ddfp73 ++0x1.12c3e319b6a54p-783, 0x1.0000000000000p-64 ++-0x1.8ee011da43d65p-879, 0x1.7b6cf1473438ep670 ++-0x1.4978c021c25cbp-130, -0x1.115a65f48b23cp80 ++0x1.f057a19099427p-736, 0x1.0000000000000p-64 ++0x1.407a2417c0b48p413, -0x1.90cbb0161a8c6p12 ++0x1.04f492d848a39p-816, 0x1.ec7fb651e4df9p225 ++-0x1.5290f79114db5p-971, -0x1.feede687f8cf3p-101 ++0x1.fb0cc227fae39p-669, 0x1.924f06f662685p143 ++-0x1.7d10c2a023848p734, -0x1.86a912207d0c3p757 ++-0x1.5ebd0337bf9f3p945, 0x1.cb53f1b618ab5p465 ++0x1.cef8d3cce5e81p531, -0x1.0000000000000p-64 ++0x1.cdc7962fdc900p51, 0x1.0000000000000p-64 ++-0x1.04f492d848a39p-816, 0x1.ec7fb651e4df9p225 ++-0x1.23221091a234fp828, -0x1.b08e262c8eca5p972 ++0x1.bc16f113ad6ebp-101, 0x1.7c8311241b744p169 ++0x1.e1c163876ccdcp843, -0x1.0000000000000p-64 ++0x1.3daea5a429d79p-639, 0x1.0000000000000p-64 ++0x1.e99204b546e58p215, -0x1.0000000000000p-64 ++-0x1.950493326e8b2p679, 0x1.fdc874cefc875p-615 ++0x1.016dd4fb0abd2p853, -0x1.c82dd72b4ab44p102 ++0x1.d0f6737fbcdbbp-353, 0x1.081a8002b8e53p211 ++0x1.f1d1f5c67bb5ap-321, 0x1.d64ec22c49552p176 ++-0x1.8a60721e2686ap880, -0x1.936f75de69956p-750 ++0x1.8368e4ed700bbp-57, 0x1.0000000000000p-64 ++-0x1.7c5d037e915cep538, -0x1.aa30914f141e5p-886 ++-0x1.9ff485cb26fa7p227, 0x1.82c1703140ceep465 ++-0x1.bc56157fec778p-542, -0x1.898e228074677p-385 ++0x1.eb16d56eb1d78p-224, 0x1.393ef32f107adp205 ++-0x1.10bf71d60a4d1p-524, 0x1.335ac0ca90f62p1004 ++0x1.392bc7ade8723p528, -0x1.50ea12907473fp21 ++0x1.a26d44e3b408fp-896, 0x1.beda15a2a2799p129 ++0x1.6d0d67d7d2ad2p627, 0x1.35c77413a4d2fp190 ++-0x1.47a744db0c087p689, -0x1.0445309d5d5bdp-205 ++0x1.0d3c074692057p781, -0x1.885716d3dcfbap146 ++0x1.5feca3ddab161p-509, 0x1.3e0c341715e1cp217 ++0x1.001af5dcc9beep589, 0x1.0000000000000p-64 ++0x1.0b0f700297c73p388, 0x1.0000000000000p-64 ++-0x1.4591e2de659a7p796, 0x1.4ab1a273f0697p736 ++0x1.1e68964b6cc85p6, -0x1.d50762f9e9ce4p59 ++0x1.40a7f08b7509dp-373, 0x1.6784b7c373049p207 ++0x1.c43b310d38279p-924, 0x1.d4b5d23a0b96dp239 ++0x1.421436f55761ep-12, 0x1.320481b0055a7p227 ++-0x1.135fa0f337e6ep856, -0x1.ed172226e05edp335 ++-0x1.d0a84005691b7p763, -0x1.68f840a20c734p60 ++-0x1.6153c39025700p908, -0x1.87eff6801054cp257 ++0x1.ad64258a1c8aep201, -0x1.eb202553cc800p129 ++0x1.09a810c8ff945p866, -0x1.0000000000000p-64 ++0x1.d14433f742c09p-360, 0x1.f4ff819b628ddp21 ++0x1.0c04a59d1fa4fp562, 0x1.66b354392a531p134 ++-0x1.84297333218cep712, 0x1.497396c926ddfp73 ++-0x1.fb9fd6c57d283p-969, -0x1.eb21f1c75479dp195 ++0x1.dd87e7279e72bp748, -0x1.0000000000000p-64 ++0x1.e494b3d72a143p612, -0x1.3b94e6aa337a0p-57 ++0x1.4a6b277bdabe4p-613, -0x1.0000000000000p-64 ++0x1.aa78012aaa9c7p338, 0x1.0000000000000p-64 ++-0x1.ab74577adade9p149, -0x1.2057c78ee21ccp31 ++0x1.3974c5e1e2049p105, -0x1.d3dbb0fb0baf1p54 ++0x1.c83bb023360a9p879, -0x1.0c6922624c625p97 ++-0x1.e21c0605b5f2bp-634, 0x1.f28232c2ebba3p-74 ++0x1.e61ed69f4f3e5p558, -0x1.0ee6a03187e13p128 ++0x1.d32cb4d190af4p-556, -0x1.0000000000000p-64 ++0x1.97a202fe3d99bp812, -0x1.12eba5e07e17fp131 ++0x1.5cbf140578025p750, -0x1.0000000000000p-64 ++0x1.8754d2c071fd1p-796, -0x1.0000000000000p-64 ++-0x1.c24a21659e391p874, 0x1.8fca31719d26fp-203 ++0x1.db5587ed33e3dp-392, -0x1.0000000000000p-64 ++0x1.59b6e3bd2734fp959, -0x1.0000000000000p-64 ++-0x1.2f68f32a5979ep367, 0x1.d77b92aecf0f8p-414 ++0x1.73e621f69389dp222, -0x1.1235366e0a84bp216 ++0x1.076b75274a516p-7, -0x1.0000000000000p-64 ++0x1.2505e4b701385p-178, -0x1.0000000000000p-64 ++0x1.ae0c974a70a8fp607, 0x1.0000000000000p-64 ++0x1.b2c344636c704p595, -0x1.9d1b879d64e7dp213 ++-0x1.a6f695e9d29eep-629, 0x1.dad8811e62691p422 ++0x1.e5aca4566a08ap234, -0x1.645ed34f63b48p65 ++0x1.67faa10de96c9p-929, 0x1.0000000000000p-64 ++0x1.503a50f3f36c9p-313, 0x1.a1b537c589279p212 ++-0x1.e62711b5b18aap-336, 0x1.176d22b7c6703p-81 ++-0x1.78e6d2fb3c6c8p-802, -0x1.4354b70f8d56ap-407 ++-0x1.a9b890e6a309bp-974, -0x1.fc73521e05c84p446 ++0x1.605c070891e95p751, -0x1.00e8a0f55071cp255 ++-0x1.8e249352e8ed4p-690, -0x1.d751a5bb2c420p-254 ++0x1.67246027c2465p584, 0x1.3aaa16d492946p178 ++0x1.c53735a56d1edp610, -0x1.630662efaf0c6p60 ++0x1.d54a131bae182p142, -0x1.a313606a0459dp220 ++0x1.38afe5f1ed5b4p-779, 0x1.0000000000000p-64 ++0x1.f2aa76462ad42p-982, 0x1.0000000000000p-64 ++0x1.e188a166c06b6p45, 0x1.0000000000000p-64 ++0x1.fbe85766fae96p-463, 0x1.91c903c89b075p85 ++0x1.3342d36ecf081p28, -0x1.0000000000000p-64 ++0x1.c2b0a036a1828p719, 0x1.0000000000000p-64 ++0x1.ba7f308dc60ddp517, -0x1.b38d014638da6p246 ++-0x1.075aa7ba85f42p624, -0x1.a357d32f45a61p-867 ++0x1.1fbb4362bf313p995, 0x1.d039c2c0e18bfp-6 ++-0x1.150426e803137p622, -0x1.9bafe2efa3e89p39 ++-0x1.3f2456d5cba52p116, 0x1.fa9ec45f18306p-389 ++0x1.8e58945bd1087p-701, 0x1.0000000000000p-64 ++-0x1.ab0ef29932d78p111, 0x1.4313d75c1df97p658 ++0x1.ee3e13dd00d34p1016, 0x1.d6b3d3b9034c1p85 ++-0x1.7f0bd006c0d62p-324, 0x1.8210646a5ccddp871 ++-0x1.c004d2256a5b8p402, -0x1.a01df480fdcb7p98 ++-0x1.3717c2e75f865p-749, -0x1.628ab47e4b9c7p-879 ++-0x1.dfb414ca1e89fp780, -0x1.b1a6d17b59340p927 ++0x1.2bb340a5c99b8p772, -0x1.4cb4a208cd38ap49 ++0x1.983d90ffcdc95p-131, 0x1.294857e7a5d9dp66 ++0x1.0789a00a3ff0fp-950, -0x1.0000000000000p-64 ++0x1.6816c6cd93ea9p112, 0x1.985412f1ac3d6p104 ++0x1.3c0e604f8974bp-226, 0x1.0000000000000p-64 ++0x1.07acb29e12fc1p687, -0x1.edff80d6b306fp107 ++0x1.22c1d3b2c0e45p135, -0x1.9a5dc703e46dbp204 ++0x1.ede956a719d56p248, -0x1.80e8e672e144fp156 ++-0x1.ff6263662c8fbp-263, 0x1.cf3867b2bac05p652 ++0x1.f01e46c129d76p-5, 0x1.00d113cf96023p137 ++0x1.45cf928146851p636, 0x1.26b1c5666d711p131 ++-0x1.768376c2f7584p563, 0x1.017143ae97b27p545 ++-0x1.1f72a3d4f7881p-764, 0x1.4617565381163p177 ++0x1.dd9431675dbb5p-114, 0x1.0000000000000p-64 ++-0x1.64cc1762105b7p-569, -0x1.2d69b27570067p840 ++0x1.bd1077dadd530p235, 0x1.0000000000000p-64 ++0x1.0aa166c2b93bdp488, -0x1.48d03430453b8p213 ++-0x1.b513845f09747p-331, -0x1.d04e154527b26p685 ++0x1.5c97b3a12df62p696, -0x1.e160e008f7d3ap89 ++0x1.8eec91bde3d69p-376, -0x1.0000000000000p-64 ++0x1.7d29f253d3e79p636, -0x1.8e30a1ba55f7fp77 ++0x1.c004d2256a5b8p402, -0x1.a01df480fdcb7p98 ++0x1.52b9d41aaa1e9p-589, -0x1.292cb15f1459dp46 ++-0x1.ea9ca6fa0919ep-279, -0x1.601e44b6a588cp40 ++# pow slow path at 240 bits ++# Implemented in sysdeps/ieee754/dbl-64/slowpow.c ++## name: 240bits ++0x1.01fcd33493ea3p596, -0x1.724bd4e887783p-14 ++0x1.032ff59ab34fdp-540, -0x1.61e3632080b87p-24 ++0x1.045c337b80f53p304, 0x1.dc3404c30fa69p-56 ++0x1.0681338469475p-294, -0x1.3562210f27dfap-51 ++0x1.0b55c01eab2a6p-447, -0x1.cd7162fecd483p-48 ++0x1.0b74d4b709002p-811, -0x1.0af1478682e96p-50 ++0x1.0e4d10f3aabc8p664, 0x1.e2bde3471eaa1p-55 ++0x1.110607de11aa5p120, 0x1.dcec269cfd865p-47 ++0x1.132aa4cc6f38bp-751, 0x1.366ca7979d9bbp-8 ++0x1.138ae6f5a6dadp-680, 0x1.890a0755fce7ap-40 ++0x1.1b7b95bdc6400p467, 0x1.ec36f5f75ce4cp-8 ++0x1.1c20e7f14086cp-788, 0x1.f22967f8b5d7cp-48 ++0x1.278262637b59cp446, -0x1.1aab83169f61cp-10 ++0x1.2936f2eb01500p-234, -0x1.aa25c56c7a42ap-51 ++0x1.2991068d7df8dp-895, -0x1.e22e0335a6813p-19 ++0x1.2a4320a5a4e06p342, 0x1.a60de202d0f39p0 ++0x1.2baa57016f98bp445, -0x1.19b39156d7af6p-42 ++0x1.3003b731560f2p189, -0x1.d03a35d7809bbp-6 ++0x1.3098f631b79b3p322, 0x1.936cf77d12901p-58 ++0x1.329f9083895d6p-470, 0x1.c4e0407eac9e1p-60 ++0x1.32e62120a48dep-373, 0x1.8c03970ea6143p-15 ++0x1.3b69741c89827p-951, 0x1.d7e2d50ab916bp-13 ++0x1.46d346d411a30p-451, -0x1.5bed1300261dcp-37 ++0x1.48d0870fc99a7p-691, -0x1.4f6541a43b8cdp-5 ++0x1.49ae5141ea416p-825, 0x1.cfc4b51dbe592p-24 ++0x1.4d1fb5a2a4d73p738, -0x1.d2a54658b1df9p-50 ++0x1.4ddb12f9500cbp962, 0x1.48bc1158eb70ap-15 ++0x1.4f51d32b02376p758, 0x1.11d1409aaea9fp-27 ++0x1.54f723dd63e3bp605, 0x1.6c02f2514de2ap-23 ++0x1.5529070b8d631p-489, 0x1.1c3dd76010b92p-37 ++0x1.569bf17eb40dfp217, -0x1.8cb97627ae884p-31 ++0x1.5e2892c719a5ap817, 0x1.f0e3d4b66e9c0p-11 ++0x1.619a049c49284p329, -0x1.0bc7b3735d182p-12 ++0x1.62e6745b17235p344, 0x1.86dcb0cd4e584p-39 ++0x1.6532120398cb6p374, -0x1.dd57d385dde4ap-56 ++0x1.6ab9873394341p712, 0x1.6cec233df7f19p-59 ++0x1.6d7c56b0ec1f9p723, -0x1.864ae3aa72d4ap-11 ++0x1.6decf38117b3ap-629, 0x1.e1c8b1eaebfbbp-27 ++0x1.6f57771705979p518, -0x1.44fbe6fcf4182p-24 ++0x1.6f57b14f5f248p880, 0x1.e2554493e7f0cp-2 ++0x1.6fee9735004b7p-71, 0x1.8eaf1527d88bep-48 ++0x1.7190e00c6cae0p-495, 0x1.705594f79ee43p-33 ++0x1.7238a1904c29cp40, 0x1.d454673e675eep-30 ++0x1.76aa529cae2a7p-457, -0x1.0652207d202acp-45 ++0x1.78e630a117b59p-105, 0x1.ecb1a67d5b9dcp-32 ++0x1.7d0976b552b5bp-316, -0x1.9c52a2a02f146p1 ++0x1.80a10162f3c9ep-462, 0x1.af6ef1f1d004ep-54 ++0x1.8794943d6e34bp-745, -0x1.0c7df064d51e9p-10 ++0x1.8a3d749288cbcp-469, 0x1.a9bf9202d914fp-46 ++0x1.8da421e64749bp-540, -0x1.494a81df89b6bp-26 ++0x1.8e05154795810p247, 0x1.3c04802f44ddcp-47 ++0x1.91b9d616c0878p-313, 0x1.a3c9263d26b2ap-30 ++0x1.95e973a94d414p-229, 0x1.d83d8244e6566p-28 ++0x1.9a3217b4fb0e5p-990, 0x1.82853149b1e30p-42 ++0x1.9e2556775fc02p-377, -0x1.a6ec93193a127p-38 ++0x1.9e83d7b0c831fp-906, 0x1.6a3485e3e4fe8p-21 ++0x1.a51cf0f0f49f7p751, 0x1.07b941a3af664p-12 ++0x1.a883c2cef7802p-432, 0x1.b5ee3711a8260p-34 ++0x1.aca70602f90f3p205, -0x1.a40d85c2b0ddap-55 ++0x1.b118069c4e0f8p133, 0x1.85ed946b41169p0 ++0x1.b1ada0a8ca383p-699, 0x1.ddfec76f67c1fp-37 ++0x1.b236b6872f638p419, 0x1.fa8f6525758b6p-5 ++0x1.b2413258b83b1p892, -0x1.bcea65c80772bp-12 ++0x1.b51563dac9885p-571, 0x1.7a1e16e485fdcp-30 ++0x1.b5e4833e40f76p-445, 0x1.44e23325bcc3fp-22 ++0x1.b6a2168ec3212p-674, -0x1.35bda0265f18bp-30 ++0x1.b8dd676727fa1p124, 0x1.3605e6ec76006p-29 ++0x1.b95437f961192p-500, 0x1.9276767f94721p-10 ++0x1.bb6647f65218ap741, -0x1.b9dd250927a8ap-6 ++0x1.bffdf0efb5c4ep-703, 0x1.85fac77188c01p-9 ++0x1.c0345583020c9p236, 0x1.de31b044cb918p-37 ++0x1.c4b9163604b90p548, 0x1.0a51f116977d3p-17 ++0x1.c66ec323be811p-726, -0x1.8829c716f5ddbp-24 ++0x1.c69da72348031p-390, 0x1.109f77bb4a2a2p-37 ++0x1.c712558c00177p-883, -0x1.9cf047e60fa38p-8 ++0x1.c74df6d64da29p-154, -0x1.bdba55e26ef07p2 ++0x1.c75fa2c065d1dp731, 0x1.fa827749d723cp-21 ++0x1.c8f5b7f54aa5fp-998, 0x1.59fa40e2d7a95p-10 ++0x1.c957e3768f0c2p-102, 0x1.0047f59669535p-5 ++0x1.ce0615637c099p-737, 0x1.b1795333136d6p-59 ++0x1.d1a7872210098p245, -0x1.afd8c410a1918p-16 ++0x1.d39ee7b8cae5ep722, 0x1.639a1575eb95cp-56 ++0x1.d4b4276a02096p-5, -0x1.7ff8354a6ba9cp-21 ++0x1.d500d1daf1bfcp-352, 0x1.e4c7243104fa7p-34 ++0x1.d684c68e86321p-661, -0x1.11305765580a9p-13 ++0x1.db08f6fcae9f5p-637, -0x1.a8cba163bd1dep-21 ++0x1.db09e6535414dp809, -0x1.0b10e70ed8d88p-48 ++0x1.e50573d07ecc0p41, 0x1.19ec44b6d99e6p-58 ++0x1.e59505ef043e0p926, -0x1.3201c7a1e8882p-62 ++0x1.e6b9b28e678a4p546, 0x1.70e042daa89e7p-30 ++0x1.e9a4e6bbbf235p-851, -0x1.1d70f7b787412p-21 ++0x1.ea68a16e4b7c9p-733, -0x1.ee7f337779825p-34 ++0x1.f0e76025ece1cp642, -0x1.bdc0d0d7020d5p-57 ++0x1.f1bcb1d70f84bp-568, 0x1.98c5d3b11e934p-21 ++0x1.f568146a8c658p240, 0x1.4def9749a6a7ep-44 ++0x1.f75bd43867225p-454, 0x1.34b1e5cb0df40p-16 ++0x1.fae7a09d10f34p955, -0x1.f7f8439082552p-31 ++0x1.fae913d4f952ep-809, -0x1.4b649402fce63p-6 ++0x1.fe6d725408f24p484, -0x1.25f4f6441d2e4p-12 ++0x1.ff6393f9150ccp-718, 0x1.a0cb50a9bf2f3p-31 ++# pow slowest path at 768 bits ++# Implemented in sysdeps/ieee754/dbl-64/slowpow.c ++## name: 768bits ++1.0000000000000020, 1.5 ++0x1.006777b4b61dep843, -0x1.67e3145491872p-1 ++0x1.0477a5cfb1972p-402, 0x1.8742e7a1ce99dp-1 ++0x1.0827a160ab475p-239, 0x1.fcae51d2d997dp-1 ++0x1.083723672b1a4p-204, 0x1.baddc57f1404cp-2 ++0x1.0b39f4b2f5c4fp-546, 0x1.7d02a31183f36p-1 ++0x1.0e2d62ea9d078p-68, 0x1.8afb43919ece2p3 ++0x1.0fedd1fd9bdc5p-1011, 0x1.c0ce64b178832p-6 ++0x1.10b984764821ep724, -0x1.36e872083e630p-4 ++0x1.12424342d99bbp686, -0x1.f8d4e18b1b309p-5 ++0x1.1335f40a059c7p1014, -0x1.5818e19224448p-2 ++0x1.14185484cbdb2p-780, 0x1.23f8d7d596280p-4 ++0x1.14f5b49e12b8fp-751, 0x1.522c717bca3eap0 ++0x1.15fe345b21e2bp399, -0x1.0a09061cd1de9p-1 ++0x1.17c3e75436530p104, -0x1.ef30d09c541e9p0 ++0x1.1e5296bbfeea7p747, -0x1.f68df5996bfedp-1 ++0x1.1efdd081a8d35p-90, 0x1.7c7d10d98a3c9p-1 ++0x1.203101f62452ap317, -0x1.3be834bfd34fap-1 ++0x1.29cb8617add92p968, -0x1.9cbe73f892a16p-6 ++0x1.2d75353d5df74p719, -0x1.e2f317d7b2c01p-1 ++0x1.2f08247664913p592, -0x1.35ab9793384a5p-2 ++0x1.2ff58217e86d7p725, -0x1.2c98b6be067ccp-2 ++0x1.3113614c8b9e1p159, -0x1.fc2f4279c8cbep-1 ++0x1.3115402118c24p134, -0x1.d435f65f0eefcp1 ++0x1.32e5a1ba96cdap52, -0x1.f7d8248930c17p-1 ++0x1.346f712d4c234p78, -0x1.830235fa4eb2cp3 ++0x1.35ea84ad8b4fap742, -0x1.728dd1bc7d70cp-3 ++0x1.36b91497c147ep579, -0x1.b7e7b0d1ad44dp-2 ++0x1.3752c6b5da9e6p351, -0x1.2a00f003acdd1p-1 ++0x1.3bccb31761b21p-193, 0x1.bdd7b5da189c8p1 ++0x1.42c0b561c10bep-850, 0x1.dcdee5de63ebcp-3 ++0x1.4520f56ca1422p-471, 0x1.348c312c9f319p-1 ++0x1.46e7406c8e11ep546, -0x1.876f67bed28c4p0 ++0x1.4ba3f35d2f4afp-333, 0x1.6e39f0895a072p-3 ++0x1.4cb3303ab8786p-838, 0x1.fe88a032de46ap-1 ++0x1.4d61505a36a60p234, -0x1.45c3e271db1fep1 ++0x1.4fcff0e946b1ep909, -0x1.90fa07de4eea5p-1 ++0x1.5172c6b32f2aep293, -0x1.fb0fa58fc74abp-2 ++0x1.51e4b4afeb58ap-2, 0x1.f184d702a5f4bp3 ++0x1.5212b31c06068p306, -0x1.e8e5c1b09f30dp-2 ++0x1.55c7413fbdd0cp-168, 0x1.68687102fa0b8p-3 ++0x1.5975f5580b29cp361, -0x1.cda627a0b0899p-3 ++0x1.5b3d77ff20607p-694, 0x1.95877099718f5p-4 ++0x1.5b85e6f45d26fp763, -0x1.b727a35d92656p-4 ++0x1.5c83b2d038766p-984, 0x1.4232c330c81b9p-1 ++0x1.5ec6e7e275af2p773, -0x1.8da470ca7dd62p-1 ++0x1.60b0e6123149bp-743, 0x1.25a696ab5fc09p-4 ++0x1.6567f1ab52caap-769, 0x1.ff57c1e78cc81p-3 ++0x1.689cb423d7ec7p95, -0x1.71d3f5a46c36fp-2 ++0x1.69e2a022e3db6p-672, 0x1.209f77b27f146p-1 ++0x1.6a6bb05202fd0p-621, 0x1.bc1f316194126p-5 ++0x1.72b181bf25fd7p303, -0x1.629be448db4f7p1 ++0x1.7667d46544feap887, -0x1.e92ef7681c985p-3 ++0x1.776f45edc5aa6p967, -0x1.8b34366de0584p-3 ++0x1.77d4e3169e8fdp889, -0x1.7159c5a0e440ep-4 ++0x1.792c56f01b25ep-474, 0x1.45237144dc76dp-2 ++0x1.7c4d814b67ce3p-30, 0x1.32f4217aa69bfp2 ++0x1.7fec1487cd8c2p-790, 0x1.373ec1a13952fp-4 ++0x1.8280e15921e7bp-544, 0x1.17f4d1f294f23p-2 ++0x1.8be4858d98288p395, -0x1.8ecf7076c1cadp-3 ++0x1.8c1a3651b2a3cp251, -0x1.fe464693b592fp-1 ++0x1.95b8339b15437p-805, 0x1.c590d48f70e09p-4 ++0x1.9ea712eab015cp643, -0x1.9f9a2005cd04dp-2 ++0x1.9ec010ebb0fb4p966, -0x1.322de55e2f27dp-3 ++0x1.a055b4cacfb90p692, -0x1.45a6d0302680bp-4 ++0x1.a2541721f7549p508, -0x1.46b5008fed93ap0 ++0x1.aa4ea2a62e6d3p146, -0x1.4948a7f0b9447p-2 ++0x1.aeab6627bd7fep-883, 0x1.e334b6e331bcfp-4 ++0x1.afc9062dd5d6cp285, -0x1.704640b7e8a60p0 ++0x1.b2e0e5768b8a4p700, -0x1.e3cc63841415cp-1 ++0x1.b44dd7483ff8fp762, -0x1.376275f0c7542p0 ++0x1.b461c649ef81fp-297, 0x1.757d3606ad420p-2 ++0x1.b47177acf880bp162, -0x1.dbc2c7336fcdcp-3 ++0x1.b5d597a5647bep312, -0x1.0d87f0669fd98p-3 ++0x1.b5f5f6894898fp824, -0x1.aeec9752febccp-2 ++0x1.b78b84a583db6p711, -0x1.443983558960ap-1 ++0x1.ba15f474f95a7p250, -0x1.9d46c49adf4ecp1 ++0x1.ba6e74fdcaafap685, -0x1.c69a403d3e719p-3 ++0x1.c14ed18d4eb53p652, -0x1.231bb32f82a5fp-1 ++0x1.c44727ecf4620p-965, 0x1.c61391aad6567p-6 ++0x1.c492c6882ec27p-423, 0x1.6bb9123ab40fdp-1 ++0x1.c525d219db143p-681, 0x1.5e10738bb6aefp-5 ++0x1.ca9510663b619p878, -0x1.8966f1a726428p-2 ++0x1.d2d4d70d57384p-769, 0x1.eec5e348f3c65p-5 ++0x1.d3275243b3fd2p-203, 0x1.a56f87acf7afbp1 ++0x1.d5d3022665384p-509, 0x1.d4f984b477a34p-5 ++0x1.dabf72e2c886fp642, -0x1.e930d581ea0c3p-3 ++0x1.daffa04064cf7p799, -0x1.b944c271f477bp-1 ++0x1.db25c4ae37695p710, -0x1.ff84b0c08defdp-3 ++0x1.dc06652f06a70p-689, 0x1.f2eb368dd304ap-3 ++0x1.e09726def851ap-784, 0x1.8d62918b2f6a5p-5 ++0x1.e1561576de8f5p-470, 0x1.983137f5396b2p-2 ++0x1.e5e4c7891da9bp-871, 0x1.5775130263654p-5 ++0x1.eca182884f17fp-295, 0x1.af55d3375f461p-3 ++0x1.f1c172bc4f401p-360, 0x1.f40476496c282p-4 ++0x1.f244722a51df2p548, -0x1.20f7a2f2fc3e8p-2 ++0x1.f422f159f235bp126, -0x1.339620de97b69p1 ++0x1.f43463d9cef16p-845, 0x1.2c364792462fep-3 ++0x1.f8b79758182dap-884, 0x1.ed6174093fca4p-6 ++0x1.fa5c677254961p133, -0x1.c91962524971ep-1 ++0x1.ff0544adacb78p649, -0x1.6c17c3a7210e2p-1 +diff -urN glibc-2.17-c758a686/benchtests/pthread_once-inputs glibc-2.17-c758a686/benchtests/pthread_once-inputs +--- glibc-2.17-c758a686/benchtests/pthread_once-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/pthread_once-inputs 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,9 @@ ++# This tests the common-case scenario for pthread_once. ++# We have a single thread that runs a no-op initialization once and then ++# repeatedly runs checks of the initialization (i.e., an acquire load and ++# conditional jump) in a tight loop. ++# scripts/bench.py doesn't handle function pointers, so we just use void *: ++## args: pthread_once_t *:void * ++## includes: pthread.h ++## include-sources: pthread_once-source.c ++&once, once_handler +diff -urN glibc-2.17-c758a686/pthread_once-source.c glibc-2.17-c758a686/benchtests/pthread_once-source.c +--- glibc-2.17-c758a686/benchtests/pthread_once-source.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/pthread_once-source.c 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,25 @@ ++/* Measure pthread_once best-case latency (i.e., when already initialized. ++ ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++static pthread_once_t once = PTHREAD_ONCE_INIT; ++ ++static void ++once_handler (void) ++{ ++} +diff -urN glibc-2.17-c758a686/benchtests/README glibc-2.17-c758a686/benchtests/README +--- glibc-2.17-c758a686/benchtests/README 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/README 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,99 @@ ++Using the glibc microbenchmark suite ++==================================== ++ ++The glibc microbenchmark suite automatically generates code for specified ++functions, builds and calls them repeatedly for given inputs to give some ++basic performance properties of the function. ++ ++Running the benchmark: ++===================== ++ ++The benchmark needs python 2.7 or later in addition to the ++dependencies required to build the GNU C Library. One may run the ++benchmark by invoking make as follows: ++ ++ $ make bench ++ ++This runs each function for 10 seconds and appends its output to ++benchtests/bench.out. To ensure that the tests are rebuilt, one could run: ++ ++ $ make bench-clean ++ ++The duration of each test can be configured setting the BENCH_DURATION variable ++in the call to make. One should run `make bench-clean' before changing ++BENCH_DURATION. ++ ++ $ make BENCH_DURATION=1 bench ++ ++The benchmark suite does function call measurements using architecture-specific ++high precision timing instructions whenever available. When such support is ++not available, it uses clock_gettime (CLOCK_PROCESS_CPUTIME_ID). One can force ++the benchmark to use clock_gettime by invoking make as follows: ++ ++ $ make USE_CLOCK_GETTIME=1 bench ++ ++Again, one must run `make bench-clean' before changing the measurement method. ++ ++Adding a function to benchtests: ++=============================== ++ ++If the name of the function is `foo', then the following procedure should allow ++one to add `foo' to the bench tests: ++ ++- Append the function name to the bench variable in the Makefile. ++ ++- Make a file called `foo-inputs` to provide the definition and input for the ++ function. The file should have some directives telling the parser script ++ about the function and then one input per line. Directives are lines that ++ have a special meaning for the parser and they begin with two hashes '##'. ++ The following directives are recognized: ++ ++ - args: This should be assigned a colon separated list of types of the input ++ arguments. This directive may be skipped if the function does not take any ++ inputs. One may identify output arguments by nesting them in <>. The ++ generator will create variables to get outputs from the calling function. ++ - ret: This should be assigned the type that the function returns. This ++ directive may be skipped if the function does not return a value. ++ - includes: This should be assigned a comma-separated list of headers that ++ need to be included to provide declarations for the function and types it ++ may need (specifically, this includes using "#include <header>"). ++ - include-sources: This should be assigned a comma-separated list of source ++ files that need to be included to provide definitions of global variables ++ and functions (specifically, this includes using "#include "source"). ++ See pthread_once-inputs and pthreads_once-source.c for an example of how ++ to use this to benchmark a function that needs state across several calls. ++ - init: Name of an initializer function to call to initialize the benchtest. ++ - name: See following section for instructions on how to use this directive. ++ ++ Lines beginning with a single hash '#' are treated as comments. See ++ pow-inputs for an example of an input file. ++ ++Multiple execution units per function: ++===================================== ++ ++Some functions have distinct performance characteristics for different input ++domains and it may be necessary to measure those separately. For example, some ++math functions perform computations at different levels of precision (64-bit vs ++240-bit vs 768-bit) and mixing them does not give a very useful picture of the ++performance of these functions. One could separate inputs for these domains in ++the same file by using the `name' directive that looks something like this: ++ ++ ##name: 240bit ++ ++See the pow-inputs file for an example of what such a partitioned input file ++would look like. ++ ++Benchmark Sets: ++============== ++ ++In addition to standard benchmarking of functions, one may also generate ++custom outputs for a set of functions. This is currently used by string ++function benchmarks where the aim is to compare performance between ++implementations at various alignments and for various sizes. ++ ++To add a benchset for `foo': ++ ++- Add `foo' to the benchset variable. ++- Write your bench-foo.c that prints out the measurements to stdout. ++- On execution, a bench-foo.out is created in $(objpfx) with the contents of ++ stdout. +diff -urN glibc-2.17-c758a686/rint-inputs glibc-2.17-c758a686/benchtests/rint-inputs +--- glibc-2.17-c758a686/benchtests/rint-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/rint-inputs 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,7 @@ ++## args: double ++## ret: double ++## includes: math.h ++78.5 ++-78.5 ++4503599627370497.0 ++-4503599627370497.0 +diff -urN glibc-2.17-c758a686/benchtests/scripts/benchout.schema.json glibc-2.17-c758a686/benchtests/scripts/benchout.schema.json +--- glibc-2.17-c758a686/benchtests/scripts/benchout.schema.json 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/scripts/benchout.schema.json 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,42 @@ ++{ ++ "title": "benchmark", ++ "type": "object", ++ "properties": { ++ "timing-type": { ++ "type": "string" ++ }, ++ "functions": { ++ "title": "Associative array of functions", ++ "type": "object", ++ "patternProperties": { ++ "^[_a-zA-Z][_a-zA-Z0-9]+$": { ++ "title": "Function names", ++ "type": "object", ++ "patternProperties": { ++ "^[_a-zA-Z0-9]*$": { ++ "title": "Function variants", ++ "type": "object", ++ "properties": { ++ "duration": {"type": "number"}, ++ "iterations": {"type": "number"}, ++ "max": {"type": "number"}, ++ "min": {"type": "number"}, ++ "mean": {"type": "number"}, ++ "timings": { ++ "type": "array", ++ "items": {"type": "number"} ++ } ++ }, ++ "required": ["duration", "iterations", "max", "min", "mean"], ++ "additionalProperties": false ++ } ++ }, ++ "additionalProperties": false ++ } ++ }, ++ "minProperties": 1 ++ } ++ }, ++ "required": ["timing-type", "functions"], ++ "additionalProperties": false ++} +diff -urN glibc-2.17-c758a686/benchtests/scripts/bench.py glibc-2.17-c758a686/benchtests/scripts/bench.py +--- glibc-2.17-c758a686/benchtests/scripts/bench.py 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/scripts/bench.py 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,308 @@ ++#!/usr/bin/python ++# 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 ++# <http://www.gnu.org/licenses/>. ++ ++"""Benchmark program generator script ++ ++This script takes a function name as input and generates a program using ++an input file located in the benchtests directory. The name of the ++input file should be of the form foo-inputs where 'foo' is the name of ++the function. ++""" ++ ++from __future__ import print_function ++import sys ++import os ++import itertools ++ ++# Macro definitions for functions that take no arguments. For functions ++# that take arguments, the STRUCT_TEMPLATE, ARGS_TEMPLATE and ++# VARIANTS_TEMPLATE are used instead. ++DEFINES_TEMPLATE = ''' ++#define CALL_BENCH_FUNC(v, i) %(func)s () ++#define NUM_VARIANTS (1) ++#define NUM_SAMPLES(v) (1) ++#define VARIANT(v) FUNCNAME "()" ++''' ++ ++# Structures to store arguments for the function call. A function may ++# have its inputs partitioned to represent distinct performance ++# characteristics or distinct flavors of the function. Each such ++# variant is represented by the _VARIANT structure. The ARGS structure ++# represents a single set of arguments. ++STRUCT_TEMPLATE = ''' ++#define CALL_BENCH_FUNC(v, i) %(func)s (%(func_args)s) ++ ++struct args ++{ ++%(args)s ++ double timing; ++}; ++ ++struct _variants ++{ ++ const char *name; ++ int count; ++ struct args *in; ++}; ++''' ++ ++# The actual input arguments. ++ARGS_TEMPLATE = ''' ++struct args in%(argnum)d[%(num_args)d] = { ++%(args)s ++}; ++''' ++ ++# The actual variants, along with macros defined to access the variants. ++VARIANTS_TEMPLATE = ''' ++struct _variants variants[%(num_variants)d] = { ++%(variants)s ++}; ++ ++#define NUM_VARIANTS %(num_variants)d ++#define NUM_SAMPLES(i) (variants[i].count) ++#define VARIANT(i) (variants[i].name) ++''' ++ ++# Epilogue for the generated source file. ++EPILOGUE = ''' ++#define RESULT(__v, __i) (variants[(__v)].in[(__i)].timing) ++#define RESULT_ACCUM(r, v, i, old, new) \\ ++ ((RESULT ((v), (i))) = (RESULT ((v), (i)) * (old) + (r)) / ((new) + 1)) ++#define BENCH_FUNC(i, j) ({%(getret)s CALL_BENCH_FUNC (i, j);}) ++#define FUNCNAME "%(func)s" ++#include "bench-skeleton.c"''' ++ ++ ++def gen_source(func, directives, all_vals): ++ """Generate source for the function ++ ++ Generate the C source for the function from the values and ++ directives. ++ ++ Args: ++ func: The function name ++ directives: A dictionary of directives applicable to this function ++ all_vals: A dictionary input values ++ """ ++ # The includes go in first. ++ for header in directives['includes']: ++ print('#include <%s>' % header) ++ ++ for header in directives['include-sources']: ++ print('#include "%s"' % header) ++ ++ # Print macros. This branches out to a separate routine if ++ # the function takes arguments. ++ if not directives['args']: ++ print(DEFINES_TEMPLATE % {'func': func}) ++ outargs = [] ++ else: ++ outargs = _print_arg_data(func, directives, all_vals) ++ ++ # Print the output variable definitions if necessary. ++ for out in outargs: ++ print(out) ++ ++ # If we have a return value from the function, make sure it is ++ # assigned to prevent the compiler from optimizing out the ++ # call. ++ if directives['ret']: ++ print('static %s volatile ret;' % directives['ret']) ++ getret = 'ret = ' ++ else: ++ getret = '' ++ ++ # Test initialization. ++ if directives['init']: ++ print('#define BENCH_INIT %s' % directives['init']) ++ ++ print(EPILOGUE % {'getret': getret, 'func': func}) ++ ++ ++def _print_arg_data(func, directives, all_vals): ++ """Print argument data ++ ++ This is a helper function for gen_source that prints structure and ++ values for arguments and their variants and returns output arguments ++ if any are found. ++ ++ Args: ++ func: Function name ++ directives: A dictionary of directives applicable to this function ++ all_vals: A dictionary input values ++ ++ Returns: ++ Returns a list of definitions for function arguments that act as ++ output parameters. ++ """ ++ # First, all of the definitions. We process writing of ++ # CALL_BENCH_FUNC, struct args and also the output arguments ++ # together in a single traversal of the arguments list. ++ func_args = [] ++ arg_struct = [] ++ outargs = [] ++ ++ for arg, i in zip(directives['args'], itertools.count()): ++ if arg[0] == '<' and arg[-1] == '>': ++ pos = arg.rfind('*') ++ if pos == -1: ++ die('Output argument must be a pointer type') ++ ++ outargs.append('static %s out%d;' % (arg[1:pos], i)) ++ func_args.append(' &out%d' % i) ++ else: ++ arg_struct.append(' %s volatile arg%d;' % (arg, i)) ++ func_args.append('variants[v].in[i].arg%d' % i) ++ ++ print(STRUCT_TEMPLATE % {'args' : '\n'.join(arg_struct), 'func': func, ++ 'func_args': ', '.join(func_args)}) ++ ++ # Now print the values. ++ variants = [] ++ for (k, vals), i in zip(all_vals.items(), itertools.count()): ++ out = [' {%s, 0},' % v for v in vals] ++ ++ # Members for the variants structure list that we will ++ # print later. ++ variants.append(' {"%s", %d, in%d},' % (k, len(vals), i)) ++ print(ARGS_TEMPLATE % {'argnum': i, 'num_args': len(vals), ++ 'args': '\n'.join(out)}) ++ ++ # Print the variants and the last set of macros. ++ print(VARIANTS_TEMPLATE % {'num_variants': len(all_vals), ++ 'variants': '\n'.join(variants)}) ++ return outargs ++ ++ ++def _process_directive(d_name, d_val): ++ """Process a directive. ++ ++ Evaluate the directive name and value passed and return the ++ processed value. This is a helper function for parse_file. ++ ++ Args: ++ d_name: Name of the directive ++ d_val: The string value to process ++ ++ Returns: ++ The processed value, which may be the string as it is or an object ++ that describes the directive. ++ """ ++ # Process the directive values if necessary. name and ret don't ++ # need any processing. ++ if d_name.startswith('include'): ++ d_val = d_val.split(',') ++ elif d_name == 'args': ++ d_val = d_val.split(':') ++ ++ # Return the values. ++ return d_val ++ ++ ++def parse_file(func): ++ """Parse an input file ++ ++ Given a function name, open and parse an input file for the function ++ and get the necessary parameters for the generated code and the list ++ of inputs. ++ ++ Args: ++ func: The function name ++ ++ Returns: ++ A tuple of two elements, one a dictionary of directives and the ++ other a dictionary of all input values. ++ """ ++ all_vals = {} ++ # Valid directives. ++ directives = { ++ 'name': '', ++ 'args': [], ++ 'includes': [], ++ 'include-sources': [], ++ 'ret': '', ++ 'init': '' ++ } ++ ++ try: ++ with open('%s-inputs' % func) as f: ++ for line in f: ++ # Look for directives and parse it if found. ++ if line.startswith('##'): ++ try: ++ d_name, d_val = line[2:].split(':', 1) ++ d_name = d_name.strip() ++ d_val = d_val.strip() ++ directives[d_name] = _process_directive(d_name, d_val) ++ except (IndexError, KeyError): ++ die('Invalid directive: %s' % line[2:]) ++ ++ # Skip blank lines and comments. ++ line = line.split('#', 1)[0].rstrip() ++ if not line: ++ continue ++ ++ # Otherwise, we're an input. Add to the appropriate ++ # input set. ++ cur_name = directives['name'] ++ all_vals.setdefault(cur_name, []) ++ all_vals[cur_name].append(line) ++ except IOError as ex: ++ die("Failed to open input file (%s): %s" % (ex.filename, ex.strerror)) ++ ++ return directives, all_vals ++ ++ ++def die(msg): ++ """Exit with an error ++ ++ Prints an error message to the standard error stream and exits with ++ a non-zero status. ++ ++ Args: ++ msg: The error message to print to standard error ++ """ ++ print('%s\n' % msg, file=sys.stderr) ++ sys.exit(os.EX_DATAERR) ++ ++ ++def main(args): ++ """Main function ++ ++ Use the first command line argument as function name and parse its ++ input file to generate C source that calls the function repeatedly ++ for the input. ++ ++ Args: ++ args: The command line arguments with the program name dropped ++ ++ Returns: ++ os.EX_USAGE on error and os.EX_OK on success. ++ """ ++ if len(args) != 1: ++ print('Usage: %s <function>' % sys.argv[0]) ++ return os.EX_USAGE ++ ++ directives, all_vals = parse_file(args[0]) ++ gen_source(args[0], directives, all_vals) ++ return os.EX_OK ++ ++ ++if __name__ == '__main__': ++ sys.exit(main(sys.argv[1:])) +diff -urN glibc-2.17-c758a686/benchtests/scripts/validate_benchout.py glibc-2.17-c758a686/benchtests/scripts/validate_benchout.py +--- glibc-2.17-c758a686/benchtests/scripts/validate_benchout.py 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/scripts/validate_benchout.py 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,85 @@ ++#!/usr/bin/python ++# 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 ++# <http://www.gnu.org/licenses/>. ++"""Benchmark output validator ++ ++Given a benchmark output file in json format and a benchmark schema file, ++validate the output against the schema. ++""" ++ ++from __future__ import print_function ++import json ++import sys ++import os ++ ++try: ++ import jsonschema ++except ImportError: ++ print('Could not find jsonschema module. Output not validated.') ++ # Return success because we don't want the bench target to fail just ++ # because the jsonschema module was not found. ++ sys.exit(os.EX_OK) ++ ++ ++def validate_bench(benchfile, schemafile): ++ """Validate benchmark file ++ ++ Validate a benchmark output file against a JSON schema. ++ ++ Args: ++ benchfile: The file name of the bench.out file. ++ schemafile: The file name of the JSON schema file to validate ++ bench.out against. ++ ++ Exceptions: ++ jsonschema.ValidationError: When bench.out is not valid ++ jsonschema.SchemaError: When the JSON schema is not valid ++ IOError: If any of the files are not found. ++ """ ++ with open(benchfile, 'r') as bfile: ++ with open(schemafile, 'r') as sfile: ++ bench = json.load(bfile) ++ schema = json.load(sfile) ++ jsonschema.validate(bench, schema) ++ ++ # If we reach here, we're all good. ++ print("Benchmark output in %s is valid." % benchfile) ++ ++ ++def main(args): ++ """Main entry point ++ ++ Args: ++ args: The command line arguments to the program ++ ++ Returns: ++ 0 on success or a non-zero failure code ++ ++ Exceptions: ++ Exceptions thrown by validate_bench ++ """ ++ if len(args) != 2: ++ print("Usage: %s <bench.out file> <bench.out schema>" % sys.argv[0], ++ file=sys.stderr) ++ return os.EX_USAGE ++ ++ validate_bench(args[0], args[1]) ++ return os.EX_OK ++ ++ ++if __name__ == '__main__': ++ sys.exit(main(sys.argv[1:])) +diff -urN glibc-2.17-c758a686/benchtests/sincos-inputs glibc-2.17-c758a686/benchtests/sincos-inputs +--- glibc-2.17-c758a686/benchtests/sincos-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/sincos-inputs 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,27 @@ ++## includes: math.h ++## args: double:<double *>:<double *> ++0.9 ++2.3 ++3.7 ++3.9 ++4.0 ++4.7 ++5.9 ++0x1.000000cf4a2a1p0 ++0x1.0000010b239a8p0 ++0x1.00000162a932ap0 ++0x1.000002d452a11p0 ++0x1.000005bc7d86cp0 ++## name: 768bits ++0.93340582292648832662962377071381 ++2.3328432680770916363144351635128 ++3.7439477503636453548097051680088 ++3.9225160069792437411706487182528 ++4.0711651639931289992091478779912 ++4.7858438478542097982426639646292 ++5.9840767662578002727968851104379 ++0x1.000000cf4a2a2p0 ++0x1.0000010b239a9p0 ++0x1.00000162a932bp0 ++0x1.000002d452a10p0 ++0x1.000005bc7d86dp0 +diff -urN glibc-2.17-c758a686/benchtests/sinh-inputs glibc-2.17-c758a686/benchtests/sinh-inputs +--- glibc-2.17-c758a686/benchtests/sinh-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/sinh-inputs 2015-06-20 21:22:16.302457953 -0400 +@@ -0,0 +1,303 @@ ++## args: double ++## ret: double ++## includes: math.h ++0x1.bcb6129b5ff2bp8 ++-0x1.63057386325ebp9 ++0x1.62f1d7dc4e8bfp9 ++0x1.d038a32d61933p8 ++-0x1.e471c1bac1ce4p-7 ++0x1.a552c2076a2c0p4 ++0x1.ea80c14d17262p4 ++0x1.62e67590a0733p9 ++0x1.62edf5f8ef2d6p9 ++-0x1.23f9c5b9b41c5p6 ++-0x1.62fac5eb878c6p9 ++0x1.3e57e666e2e04p3 ++0x1.bab6037e306ecp4 ++0x1.aeceb373ec08dp5 ++0x1.62ff7470df95dp9 ++-0x1.6c62d6c0af55fp6 ++-0x1.633c1105ee490p9 ++-0x1.c6d344d145206p5 ++0x1.50fc32aba8311p-15 ++-0x1.62eff1edf3d60p9 ++-0x1.7019f600db82cp7 ++-0x1.ecea83f0b3977p-4 ++0x1.6302c49c75ac4p9 ++-0x1.1929f6abc031bp8 ++-0x1.c6abd4778861bp3 ++0x1.df98b1662cf01p8 ++-0x1.0a9950e69a9dep-23 ++0x1.62f873b46c417p9 ++-0x1.6300b68646dc7p9 ++-0x1.465a556d29a85p-7 ++0x1.63018139cc344p9 ++0x1.62f23680e783cp9 ++-0x1.0469009da6a29p-16 ++0x1.baaef71d93bc9p-22 ++0x1.62f446bf431b8p9 ++0x1.62ecb5c679f45p9 ++0x1.632045a8a7ef9p9 ++-0x1.66e894b6d218cp6 ++0x1.62ee439267fe4p9 ++-0x1.632432d0e9e8fp9 ++0x1.5d07807c20bb9p1 ++0x1.aa3c546601d68p6 ++-0x1.2cdd0674e4abfp7 ++0x1.62e9f2b4a0744p9 ++0x1.631844f7a96d0p9 ++-0x1.2bf936af0bb54p4 ++-0x1.848c54c9d08a5p-13 ++-0x1.a38c970185777p-6 ++0x1.b1d18499dc98dp-27 ++0x1.02c7030513fd7p-15 ++-0x1.bdcec5aecd2eep-17 ++0x1.633c66e5307e9p9 ++0x1.6061d09a4b532p-10 ++0x1.eb7555bb47463p5 ++-0x1.6327e1c51ff78p9 ++-0x1.316943f542202p-26 ++0x1.6e54069de0b49p-9 ++0x1.bd8310798ec44p-8 ++0x1.cc4af059aa66ap8 ++-0x1.9a5ff5ea279f8p6 ++-0x1.9725c1ddcc807p5 ++-0x1.6317b78869f21p9 ++0x1.9d2f87fc603f4p5 ++0x1.213554dad3888p9 ++0x1.6302b7464cd16p9 ++0x1.493644a3cb32cp9 ++0x1.62f1877c1501ep9 ++-0x1.6315b48bf51f2p9 ++0x1.633cd176d9771p9 ++0x1.6328531b0a130p9 ++0x1.6304f3ed14c82p9 ++-0x1.62e9313aabeb2p9 ++-0x1.c1b3f715f7ad9p-6 ++-0x1.c43692f7b838cp-24 ++-0x1.6323360b63d60p9 ++-0x1.562ea1c51f0f0p7 ++0x1.600ef62445c5ep4 ++-0x1.7f4191bd896cbp-2 ++-0x1.f4d3f0d1b85eep7 ++-0x1.62fc3361285d3p9 ++0x1.3395d7ec1a5dbp-18 ++-0x1.3ccc114df227ap-23 ++-0x1.5bb910de6973fp-24 ++0x1.83f8e51d82968p6 ++-0x1.a729d2ed077a7p8 ++-0x1.1b005777a51cdp7 ++-0x1.62fa736043269p9 ++0x1.97df8447ce884p-22 ++-0x1.09774517f3944p7 ++-0x1.d042739a998a6p-27 ++0x1.8a1a0335512a5p-23 ++0x1.632396c691df1p9 ++0x1.0f45b5a6c79f5p-21 ++-0x1.0d68a2dbd6a04p-2 ++-0x1.239ff60f28877p6 ++0x1.632b742e1d0c9p9 ++0x1.ee36b15df2fc4p7 ++0x1.7e02f6f960a46p-18 ++0x1.f1a48503e33b1p-22 ++-0x1.6319f733c541fp9 ++-0x1.5f2434426cd39p-16 ++0x1.630c71268199ap9 ++-0x1.4d2140c9727ddp8 ++0x1.8713c2f7dd25ap-6 ++0x1.69bb815d57e03p-22 ++-0x1.633a822e16e6fp9 ++0x1.62f667f0092adp9 ++-0x1.ba2396d33e90cp8 ++-0x1.62fdf19fea01cp9 ++0x1.8195955afb315p7 ++0x1.6337149eda940p9 ++-0x1.633754b36f51ap9 ++0x1.9356878778911p4 ++0x1.6318527f69db0p9 ++-0x1.ee0742d151b97p-18 ++-0x1.88703361b4ad5p3 ++-0x1.631675fa3bc04p9 ++-0x1.f2bd954cf1c51p-27 ++-0x1.d897a0d2877f2p3 ++-0x1.630fb3c419c60p9 ++-0x1.62e861c33ae29p9 ++-0x1.84acb4c33fff9p1 ++-0x1.378b42b89d79dp-22 ++0x1.2825d1de625c8p6 ++0x1.631f833e694f8p9 ++-0x1.36853687b4e6dp-20 ++0x1.9b9a335db58d1p-21 ++0x1.e3928304b1b20p7 ++0x1.6316835c7cf05p9 ++0x1.6303738c05d04p9 ++-0x1.3c0e136ebb1d3p8 ++0x1.96cf3250cc987p-8 ++0x1.652cb53670db0p6 ++0x1.6440639342e8ep-4 ++0x1.4512d30165887p1 ++0x1.6337b63365473p9 ++0x1.449ee05b6ff3ep-12 ++-0x1.d1ecf009b1e3ap8 ++-0x1.be8e1102ed7f3p-12 ++0x1.62fa155e6e26ep9 ++-0x1.de739010d6091p7 ++-0x1.8c1a422a7d8b8p4 ++0x1.465d81dad540ep7 ++0x1.3db012d4e554dp5 ++-0x1.5329b46ad494ep8 ++-0x1.5695b6e7fcd02p6 ++0x1.6300e31dc8554p9 ++0x1.630252d0050e1p9 ++0x1.8d80571cb3337p-11 ++-0x1.62e93642f1118p9 ++-0x1.fb2f329c0bb96p6 ++0x1.9d18d4dc71c0bp-15 ++0x1.6311f75346d75p9 ++-0x1.7498c57682670p-9 ++0x1.f690a6c3716cbp-3 ++0x1.d63fe6b5c7c89p7 ++-0x1.a2388127452f0p-19 ++0x1.0738a10cb2383p6 ++-0x1.ca36b52292e65p-3 ++0x1.62ea1202d9816p9 ++0x1.1e4701aec3142p-22 ++0x1.6322f270f7ff5p9 ++0x1.62e6b6e528603p9 ++0x1.54c5f63777d5ap0 ++-0x1.02a544984fd67p-5 ++-0x1.ab3a9254e8794p5 ++-0x1.6321d7d010e1ap9 ++0x1.6335078d8f6f1p9 ++0x1.6336a46b6c9bap9 ++-0x1.630397a6b37e0p9 ++-0x1.baead70b0c2bap4 ++0x1.988527731f959p-20 ++0x1.cfd2c4878fd4ep6 ++-0x1.ce3bf20083050p8 ++-0x1.d3e823224ebe4p8 ++0x1.31a6458858034p7 ++-0x1.62f3821bac3f3p9 ++-0x1.1043c4ca951fbp-23 ++-0x1.074b075fe582ap-6 ++0x1.62f9213f8bc1fp9 ++0x1.415f919197b6cp-26 ++0x1.d6c6f6b983d6cp7 ++-0x1.631537abd1539p9 ++0x1.631ca21fe1f5ap9 ++-0x1.b276e5fc0915ap8 ++0x1.630a6325d4276p9 ++-0x1.3c6721ec5fd14p-11 ++-0x1.6330b03f5aa48p9 ++-0x1.30b15478c1933p-5 ++-0x1.630ef52917607p9 ++0x1.d20df37103516p-21 ++-0x1.a69a66dbd2ea1p8 ++-0x1.c69e923a07adcp6 ++0x1.6a7f505fea5d9p-17 ++-0x1.ca384346f16a9p8 ++0x1.32a202fb0895dp7 ++-0x1.320c539d2690cp8 ++0x1.10c193b381a23p-10 ++-0x1.2a2bb2e417439p6 ++-0x1.d1b6a4e76701bp-10 ++0x1.ba51c02ad2c00p-8 ++0x1.4eb503a5e519cp6 ++0x1.632b31037059ap9 ++-0x1.f03c46b9d44dbp-25 ++0x1.0810152df1887p-4 ++-0x1.f6a97309476d8p6 ++-0x1.f56fa7db86bf4p5 ++0x1.df804326360d0p4 ++-0x1.141d54326d8a1p7 ++0x1.0078e7f84d8d8p6 ++0x1.cef6f7b56f8c2p-19 ++0x1.0d0ce07e697a5p-15 ++0x1.6326673bf0ee0p9 ++0x1.3c1dd34b185a1p6 ++0x1.ddc3c42ec39bap6 ++-0x1.632752aab262cp9 ++0x1.630e01d39d028p9 ++0x1.dac293f73d850p5 ++0x1.631510cd8cc49p9 ++-0x1.028ed1e8dd32dp-17 ++-0x1.b0bb57c60b6a0p5 ++-0x1.783bf33152679p-18 ++0x1.c5d5e473ebbbbp-26 ++-0x1.915ff68d55569p5 ++-0x1.633510495d169p9 ++0x1.6312d35913b55p9 ++0x1.6d20f44123714p7 ++-0x1.6303c0b5329e9p9 ++-0x1.62faa7a46d17bp9 ++-0x1.633196bcef4aap9 ++0x1.6329f34ef70a1p9 ++0x1.3877f0875dea2p5 ++-0x1.413e167d515b4p-8 ++0x1.f017e3196ac82p3 ++0x1.230e2092aaa0ep5 ++-0x1.7b67d6318a255p7 ++0x1.04c9f0425e693p2 ++-0x1.1ebe27d65ffa7p6 ++-0x1.62f596dff99e7p9 ++-0x1.496ec324e967fp5 ++0x1.2f75110873a31p8 ++0x1.62ec21c319df7p9 ++-0x1.487513da26b06p5 ++0x1.6329675608d9fp9 ++-0x1.1de0320fc0737p9 ++0x1.73d4f770b54e0p5 ++0x1.62ef2138efd07p9 ++-0x1.7cd5764bf11ffp7 ++0x1.402ca060e1497p8 ++0x1.632cc11415f53p9 ++-0x1.631ec3cf4a7b9p9 ++-0x1.278e06c2c4ea4p-17 ++-0x1.62f55568a253dp9 ++0x1.6310e758dfd28p9 ++-0x1.3d480025e3245p7 ++-0x1.4517c5d83e40fp-1 ++0x1.6307c4b105e8bp9 ++0x1.630181fc28954p9 ++-0x1.8d2e660962aa3p-9 ++-0x1.98df07527c0bbp8 ++-0x1.a27ee2e3a28adp-10 ++0x1.6387b36f3b875p8 ++-0x1.05cbb323669c8p7 ++-0x1.52594428d68c5p1 ++-0x1.4c9235b765b89p-18 ++0x1.632a66cd5c94bp9 ++-0x1.62fbd7e6a4400p9 ++-0x1.728176d7c18f0p-24 ++0x1.62e6378477ec7p9 ++-0x1.632b611f08364p9 ++-0x1.25a7b6bd7d0d0p-3 ++0x1.00efd61470d55p-10 ++-0x1.6336976d5e8adp9 ++-0x1.359ca2cc9fc70p-12 ++0x1.5e2af7dfe1034p9 ++0x1.62fb546601bb5p9 ++-0x1.630544284f262p9 ++0x1.0b72226f94781p3 ++-0x1.1fb7b0f3e9cecp-22 ++0x1.c7b7361a9d625p5 ++0x1.dde5178b689c3p5 ++-0x1.13d52288f4693p-15 ++0x1.1868b4ff4df0bp-22 ++-0x1.a9369360a2239p-18 ++0x1.d35412055367bp7 ++-0x1.35d973c1b14fbp1 ++-0x1.6316075c46ee9p9 ++0x1.7c96f7ff40e1ep-25 ++0x1.2b2582d457cd0p6 ++-0x1.a28481bf5abc7p6 ++0x1.467a936424936p8 ++0x1.a1ca4036cbf56p-4 ++-0x1.34b9e14e1af56p5 ++0x1.00e73296682cap7 ++-0x1.01f6e4bd76df4p-13 ++-0x1.d84f005ebcd13p-7 ++-0x1.632dc46b7230cp9 ++-0x1.724f81862e781p-25 ++0x1.62f6f6ca932f5p9 ++-0x1.b07147eb43dd0p4 +diff -urN glibc-2.17-c758a686/benchtests/sin-inputs glibc-2.17-c758a686/benchtests/sin-inputs +--- glibc-2.17-c758a686/benchtests/sin-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/sin-inputs 2015-06-20 21:22:16.303457923 -0400 +@@ -0,0 +1,2913 @@ ++## includes: math.h ++## args: double ++## ret: double ++0x1.4e31719759424p353 ++-0x1.202ae0c324949p20 ++-0x1.0f8c771855528p-8 ++-0x1.339f22dc85e76p22 ++-0x1.904e251c945aap343 ++0x1.e13c5531993aep-2 ++0x1.5b05529d780f3p-24 ++0x1.41e8f0676cd4ep8 ++0x1.411e056bd6bcap-2 ++-0x1.0ca910674bec9p11 ++0x1.0c7df3a6a06b7p0 ++0x1.ef4075c4a3c3bp-11 ++0x1.52224219293bbp791 ++0x1.c227d66030144p3 ++0x1.b2a5d2451fcc7p0 ++-0x1.56a2c78366fcfp19 ++0x1.0e02525c58105p26 ++-0x1.e39c357c7c18bp404 ++-0x1.a4b3865993274p15 ++0x1.871d4238016f0p1 ++0x1.9c0ff32380748p-12 ++0x1.89db74b290234p-4 ++-0x1.46c0d53d48490p40 ++0x1.d2b7221564888p739 ++0x1.1ed4f44792d40p30 ++-0x1.f4cff05c7df9fp24 ++-0x1.130783c5347b2p19 ++0x1.f439e3a751c06p0 ++-0x1.630814d89b60ep23 ++0x1.e641156ac4981p28 ++0x1.b09f366ca1e8dp-1 ++-0x1.5e9a670db3d03p33 ++-0x1.130fb139e93b7p546 ++0x1.138355fdffae2p36 ++-0x1.20908459428fep42 ++0x1.8a1293891effap-2 ++0x1.d3fd23a93e82cp0 ++0x1.9c95c4a9d8f7fp848 ++-0x1.23c7340f1b756p-8 ++-0x1.aa82b642da2d7p304 ++0x1.1d4f233dfb177p26 ++-0x1.b55807b7ef532p-2 ++-0x1.971032fa3d5e8p21 ++0x1.d4e9e5d2cb6eap29 ++0x1.bc051494f7144p23 ++-0x1.661bf799c255fp201 ++0x1.052840edc4f07p24 ++0x1.0551d741e16d9p10 ++-0x1.3c365242efbadp690 ++-0x1.a1bcf06ea66e7p244 ++-0x1.4b20e44b06e11p14 ++0x1.3e5112fb02b33p45 ++-0x1.89cb01f331009p18 ++-0x1.de6db48d64d8ap-1 ++-0x1.d0bce02378eb6p24 ++0x1.3a9b24b4ad685p32 ++-0x1.e0c1554a97eabp136 ++0x1.398670a088410p23 ++0x1.7c2150ddf2a1bp-1 ++0x1.2153d792ddc8bp599 ++-0x1.ed7986b460920p34 ++0x1.6de72477b695fp789 ++0x1.0a1a8631872ccp1 ++-0x1.df4c22cbd016fp14 ++0x1.1b96201522f46p28 ++-0x1.8c8ea54e4ea92p13 ++-0x1.e36b62515b546p725 ++-0x1.62b4633089889p965 ++0x1.e1dcf4a52ec6ap23 ++0x1.3d7fb4750aed3p34 ++-0x1.ede78680f7292p40 ++0x1.96c0917ba637bp959 ++-0x1.e051760806b8bp-2 ++-0x1.e86f230e487d2p-16 ++-0x1.1d3397349ac97p8 ++-0x1.ddf236157546cp743 ++-0x1.70c031efdc4f9p415 ++0x1.233ff3c09d84ap9 ++0x1.3edab4c5f3a26p0 ++0x1.6c93b47873059p436 ++-0x1.3237841f0b0bep237 ++-0x1.8760d1293a1f3p-13 ++-0x1.a18c37bc89a24p1 ++-0x1.3f2766f7d26b6p542 ++-0x1.bec6222bee7a6p-1 ++0x1.f26ce5fd59845p456 ++0x1.5b32c136e1f9dp18 ++-0x1.b7ed411870c8fp6 ++-0x1.72aa75c106ffap42 ++0x1.db2c644144982p915 ++0x1.1415b4c83775bp24 ++-0x1.25a7566e7f67cp10 ++-0x1.9facd2a3d5418p18 ++0x1.78e1e40bdde9cp47 ++-0x1.5c33011915d84p0 ++0x1.ff6852a9c8d2cp22 ++-0x1.cc23573b9a1c2p37 ++-0x1.824f12c733c82p-2 ++-0x1.3cab932de7796p37 ++-0x1.1c4df62e7d177p1 ++0x1.c1b95025989fcp14 ++0x1.832e22eeb5989p-5 ++0x1.452f327db73f8p10 ++-0x1.290d05147591cp1002 ++-0x1.beaa851f05e92p-1 ++0x1.ad58373023277p513 ++0x1.f93821eb50de3p42 ++0x1.1bda02f0f3f9fp1 ++-0x1.38d441441abf9p33 ++-0x1.624000e54a29cp631 ++-0x1.d98c1179cdcb5p22 ++-0x1.c44511ec2f8b4p28 ++-0x1.30ef1448b9e93p-2 ++-0x1.c308f108883c4p333 ++0x1.12e7d2402f07ep7 ++-0x1.e74a96ae3bb5fp132 ++0x1.c31f54a536722p4 ++-0x1.56e14428bc436p-6 ++0x1.edb3a48cb14d9p-1 ++-0x1.f027b77ce5bddp14 ++-0x1.0c53346de6015p40 ++0x1.b19cf55c66693p14 ++-0x1.a19e001e2c6a1p16 ++-0x1.0e2865378e3aep3 ++-0x1.f65794e9df99fp47 ++0x1.e1ee854626d4ep536 ++-0x1.940bd6337c84cp-13 ++-0x1.2cbf8175aa84ap17 ++-0x1.961bc1591e602p3 ++-0x1.87b2b0601d2fap1 ++-0x1.772c74a581f96p751 ++-0x1.59e08127aee39p23 ++0x1.a527c23e0a4e1p0 ++0x1.eb60950795a35p-2 ++-0x1.1e46f002c96a2p-2 ++-0x1.9acc80758e051p8 ++0x1.a45c62bacde78p29 ++-0x1.5d26d76eeb16fp39 ++0x1.326df3a5344d2p18 ++0x1.adc29195a1e2dp15 ++0x1.ff9265140dcf4p89 ++0x1.76b20648c5b8dp19 ++0x1.5ca4265555944p-1 ++-0x1.9cc0e0deeb24bp2 ++-0x1.325eb43fe815fp-11 ++0x1.36bcc00217c62p393 ++0x1.b78b3134ed03ap8 ++-0x1.889c50b50e994p355 ++-0x1.03938396f299ep13 ++0x1.8f76b03720eeep25 ++-0x1.2ff306722b5a0p-20 ++-0x1.9166f7eede8c9p753 ++-0x1.ac96117a61cb3p35 ++-0x1.cf3642f86351ep5 ++-0x1.65ef55c9472d7p28 ++-0x1.d7e391105fa79p978 ++0x1.1c6cd319235fap46 ++-0x1.aa7970ac6beb8p40 ++-0x1.cff1e6c12b98dp27 ++-0x1.d0e054e560649p39 ++0x1.fe0175557d0dap-2 ++0x1.862a0150c14c8p24 ++0x1.ab0df0da7ef0dp0 ++0x1.452292fcc9743p-2 ++0x1.b525530505534p991 ++0x1.80e514cb850ebp14 ++0x1.e83385b509520p673 ++0x1.f73857e61fd2ep36 ++-0x1.c140a422bbc7ap10 ++0x1.6a3836b018674p666 ++0x1.420174d78cfd8p11 ++0x1.34bb45e923e9dp1 ++0x1.b90f228298b54p25 ++-0x1.399605f4445a3p203 ++0x1.c95d15ef0ce1ep-1 ++0x1.6ed1160abd68ep8 ++-0x1.40bbe306fa9b5p46 ++0x1.da8267a8f6494p46 ++0x1.6407626ac4921p3 ++0x1.5635a0a1b6c48p0 ++0x1.a2e9e58ba39c0p31 ++0x1.d4e0d618fbcfap697 ++0x1.973f27485658dp166 ++0x1.d17c3143c6d80p529 ++0x1.d936e70a9f908p16 ++-0x1.0a8ba2bc9bb3ap107 ++0x1.17e910c087095p26 ++0x1.4e23340e98273p991 ++-0x1.5f6a72e7950c9p-1 ++0x1.d29737bd89976p187 ++0x1.a7db27e5bb0fbp33 ++-0x1.dbcf01f3ac92fp19 ++-0x1.40aa778cc7865p-2 ++0x1.f16163407b344p-1 ++-0x1.32b196585adb2p26 ++-0x1.c83eb643cf122p165 ++0x1.291fa0c5f8d40p-4 ++-0x1.7ab62403e1a78p680 ++0x1.68f2830723d8dp-2 ++-0x1.54cf77dd7d83fp11 ++0x1.aee6014383723p16 ++-0x1.39ced0bf900c2p-2 ++-0x1.e3ce76406226fp-25 ++-0x1.7e5623b6bd702p20 ++0x1.478a64a7d9020p369 ++0x1.8888438f4aa60p495 ++0x1.804b902d0663ep-6 ++0x1.74c501d7381dcp0 ++0x1.65c56626b3f5dp20 ++0x1.7ca955c1db56bp-2 ++-0x1.3257f754500c2p6 ++0x1.93b0e2b87951bp807 ++0x1.78c226a06ff9dp881 ++-0x1.2a61e2ec72661p26 ++0x1.515561fe9c724p109 ++0x1.f04611a3f263cp-5 ++0x1.ef0196a9c0554p25 ++0x1.58bb53a309d66p147 ++-0x1.b67d94ed2b039p22 ++-0x1.a08f75ea1519bp-24 ++-0x1.9b14260bb0430p855 ++0x1.018fe4f13cc1ep563 ++-0x1.42f125d031ba6p663 ++0x1.7cdb837d7a326p8 ++-0x1.885d54001463ap0 ++0x1.e315d2bcdedaap0 ++0x1.cbd6f6692bc81p-3 ++0x1.f5be652eb0059p4 ++0x1.260be58c40562p84 ++-0x1.0fe3d67fb0d33p0 ++-0x1.a665d08300b9bp21 ++-0x1.879cf57ffe1b5p18 ++-0x1.8896d5a45e3d5p-2 ++0x1.182964987bd99p15 ++0x1.ae4ed76c12ddcp-1 ++-0x1.2b387213c40c0p10 ++-0x1.190326f5c5c9bp506 ++0x1.fc8ab2a922d40p56 ++0x1.84ba0399b0479p34 ++0x1.196320ea67543p801 ++0x1.c6f8306ba2e53p541 ++0x1.f79d44a0719afp7 ++0x1.8ca3c3000d226p7 ++-0x1.c434b33e05c76p-5 ++0x1.868d10df4adcbp-2 ++0x1.d365237c3ee46p-1 ++-0x1.2f53a0332a1b2p949 ++0x1.23fb93f05a5acp40 ++0x1.7170c1501bd5ap-26 ++0x1.bbb7d3ba1b005p650 ++0x1.41c1575e5df36p6 ++0x1.46d3f4d9169a3p39 ++0x1.c9fa657c758adp16 ++-0x1.c463d1e0760e3p5 ++0x1.0ef4e317bbeb3p45 ++-0x1.6b8f175a47735p1022 ++-0x1.9cbcb495f934fp0 ++0x1.b035202e76644p429 ++0x1.dfea1413ef865p-1 ++0x1.c30c667184d73p4 ++-0x1.6e4350ad76c38p6 ++0x1.11023720f1a27p-17 ++0x1.7d39738644047p5 ++0x1.08e8904336050p26 ++-0x1.a0f4632092bf4p31 ++-0x1.31db61e58f2c6p327 ++-0x1.216362a55985cp21 ++0x1.59afd473ae079p620 ++0x1.a67b229194875p0 ++-0x1.102f35c99abdcp408 ++0x1.7c8930f344010p8 ++-0x1.236814c694776p26 ++-0x1.69695069a7660p-2 ++-0x1.4833d2eb288d6p23 ++-0x1.6253b6dbdbdf0p-2 ++-0x1.cebd11d7b8c60p23 ++-0x1.6e47719d8cbdap23 ++-0x1.bc0e60a3d372cp-24 ++-0x1.aea4a37abf07bp-2 ++0x1.a424422079a3cp0 ++0x1.5f4ad2d1ae141p0 ++0x1.9d1c7329661c5p4 ++0x1.c95da42d6a20ap5 ++-0x1.637d860a40277p911 ++-0x1.777bf17319cfep11 ++-0x1.b8f294e0feb0bp5 ++0x1.f8dab5af1a40fp44 ++-0x1.4e822143a7e22p-6 ++-0x1.30f1a29272a12p0 ++0x1.ec9c45a34f565p548 ++0x1.5b2031d5f55c2p9 ++-0x1.596311decda04p24 ++-0x1.88dea317671eep84 ++0x1.1672932dd9083p-1 ++-0x1.dceba122a6c97p3 ++0x1.2a5880f1f8375p15 ++0x1.db8507740bf47p19 ++0x1.51a6f417b2d0bp-25 ++0x1.17296500d6e03p26 ++-0x1.05a473760addep-1 ++-0x1.95e0b2c256513p20 ++-0x1.150cf2ae9f714p19 ++0x1.f69660154e06fp0 ++-0x1.9aab65d69ac86p25 ++0x1.097f676316fabp8 ++0x1.e60dc42ce17c8p356 ++-0x1.6f236799d0618p18 ++-0x1.ddef96de04f2fp-3 ++-0x1.4f76b349a0943p-25 ++0x1.e41e1113025c6p779 ++0x1.026094b0f4060p17 ++0x1.69b29144b9540p-1 ++-0x1.b55194638c050p34 ++-0x1.b78f56c9abb41p38 ++0x1.eda3e2bbf366bp4 ++-0x1.dd66f0d648089p-2 ++0x1.f70f54c519e03p5 ++0x1.b2ed91264f4b0p736 ++-0x1.7e89b7cbfeef2p790 ++0x1.9ebdd376c6af6p669 ++-0x1.31bcf466a0f71p38 ++-0x1.db600765a5820p880 ++0x1.83720115e49bap19 ++-0x1.72f7158f3031dp485 ++0x1.b493a52c77e8ap262 ++-0x1.61b575ab7671cp-1 ++-0x1.d872154df6929p25 ++-0x1.966b0439fdb8ap949 ++-0x1.48ec6657af67cp-2 ++0x1.b79c505f0f0cap0 ++0x1.8cb2918d277b2p556 ++-0x1.57d9c07b3aff9p-1 ++-0x1.928615736e2c3p0 ++-0x1.89a736dbeb43ep273 ++0x1.78484185770a7p-1 ++-0x1.9716820109e97p82 ++0x1.e772957d51225p36 ++0x1.082be0a48a4ddp23 ++-0x1.fcb8f111481cbp-2 ++0x1.9221f605bd679p8 ++-0x1.4901b4e9ae99fp19 ++-0x1.107b70bf37787p19 ++0x1.116bf43b5a0c9p-1 ++-0x1.aaf0763749048p25 ++0x1.9958546576d59p2 ++0x1.7f1374d7f65b5p13 ++0x1.2b12a66cfcbfcp24 ++-0x1.032e0018d5e31p93 ++-0x1.b47f10ba68386p-22 ++-0x1.3d2b81e149a51p-1 ++-0x1.421ff5c85a241p24 ++0x1.e600548bb210dp-18 ++-0x1.678015108956ep-1 ++-0x1.e02ab7babc6e4p21 ++0x1.209470304e32ap9 ++-0x1.e80132771d75dp0 ++-0x1.a3344487bd369p27 ++0x1.e1eb2267b7fdcp496 ++-0x1.7721478b2d466p14 ++-0x1.9f701607ace6bp32 ++-0x1.3b5b74d34ada7p-12 ++0x1.2477a5441ffd0p9 ++0x1.d66a76c489eb1p3 ++-0x1.5bed268942217p0 ++0x1.2f7b251d454efp3 ++0x1.7e30f5f452228p10 ++0x1.eb98508ea666dp-10 ++0x1.2fcfe5c7591f1p0 ++-0x1.a0ac164173a04p17 ++-0x1.468a06a5522b9p21 ++-0x1.5824c7106d618p16 ++0x1.eb81c45f51ccdp40 ++-0x1.a3e486adaff0ep479 ++0x1.1974e0f299718p592 ++-0x1.e5a1e74789b73p45 ++-0x1.619690cc59a49p807 ++-0x1.aebff5a970e6cp15 ++-0x1.bfffc1c94a5fcp203 ++0x1.c6ca100bb7092p674 ++0x1.b95db5be3c216p-9 ++0x1.1f43a01f3499cp875 ++-0x1.de5737f187a25p6 ++-0x1.b0bb15e917960p24 ++0x1.26c0670524e93p17 ++-0x1.809321a40d4a8p-1 ++0x1.9dcd443d72518p484 ++0x1.6dbde56f8d28fp28 ++0x1.0842a4feb907ap1011 ++0x1.e22643ea2d366p840 ++-0x1.5a6d36e2f784fp0 ++0x1.941a537fbac6bp-19 ++0x1.735171a8af18ep390 ++-0x1.6c21854e6ac4ep-2 ++-0x1.4966b64a86f86p13 ++-0x1.9151a1dcc653ap-2 ++0x1.d39194332f055p-2 ++0x1.3441f2d9046a4p45 ++-0x1.63827188db8d2p27 ++0x1.6638414088a1ep-1 ++-0x1.a6bfc2a427d20p12 ++-0x1.a69f971d4e130p25 ++-0x1.d3300078065d9p46 ++0x1.4f37818518d61p356 ++-0x1.ad6bd45d98764p32 ++-0x1.2fbf90a8a2c99p877 ++-0x1.ff71d39bd81cap22 ++0x1.5fdec455fd1a8p20 ++-0x1.226887072ca0ap377 ++0x1.f72e43d6cf555p951 ++0x1.dc26c361d9df5p2 ++-0x1.0294c7e317c97p24 ++-0x1.7ed5874833105p-1 ++0x1.719536cabadbep803 ++-0x1.ec79d4096ea8fp27 ++0x1.eec6d47320e53p261 ++0x1.a1f7f00ab9ef0p19 ++-0x1.131f85094d6b2p-3 ++-0x1.62fd06cec62e9p920 ++0x1.3ac61495513e6p-10 ++0x1.38a2e3a18c65dp-1 ++0x1.4a7fb2f2fb6e3p-7 ++-0x1.2d23b2b1b0716p467 ++0x1.654b17175f19dp-17 ++-0x1.9e9791bea55b9p12 ++-0x1.1ba351d709f03p-20 ++-0x1.17cf2637f69aep956 ++0x1.e97fa01af0da4p12 ++-0x1.2fc4818397878p805 ++-0x1.cde053fdf18dep33 ++0x1.1e57e7c749fb6p907 ++-0x1.b6423794860bcp-2 ++-0x1.5f6ab21f70061p39 ++-0x1.a8d663f09366ap694 ++-0x1.ec4db28b5e248p-2 ++0x1.56f98549fccb5p7 ++0x1.94cd10662c26cp21 ++0x1.22fce3cdc1d23p258 ++-0x1.c59f864bc9d01p336 ++-0x1.265292b9f7156p26 ++-0x1.f079443577dbbp24 ++-0x1.361ac7035cb65p1 ++-0x1.e74096e5beb90p12 ++-0x1.7230603fa3279p47 ++-0x1.e9cbe08e63864p0 ++-0x1.6ebb6528c0777p27 ++0x1.5c5af7dbb0328p928 ++0x1.fa7c83278e735p19 ++0x1.331b21b0a2c88p2 ++0x1.f56ef59955713p32 ++-0x1.248d826402212p822 ++-0x1.2a96722b314a5p11 ++0x1.ce7975ddf3677p-19 ++-0x1.954ab0cb2f1dfp0 ++-0x1.ee8861dc9cd21p1 ++0x1.b8c9d509b7774p0 ++-0x1.accac3020df12p24 ++-0x1.c0b1048baa584p13 ++-0x1.247b04589de3bp32 ++0x1.7908215d3793ap-22 ++-0x1.8a0a5596f99e3p283 ++-0x1.30e8b0467a611p-14 ++0x1.7688417c5e950p25 ++0x1.071177de1d758p-1 ++-0x1.55a7203e5bb54p-11 ++-0x1.4beda7f02fc58p0 ++-0x1.8e6c752f1efcfp30 ++-0x1.c96c975bef932p31 ++-0x1.8123d67897403p24 ++-0x1.bd6ae1f640868p426 ++0x1.9fecb3cbf41c7p490 ++-0x1.a15bc3ae996e6p8 ++-0x1.05b3619b69842p14 ++-0x1.0442141ed67adp13 ++-0x1.e57d71c2d90aap6 ++-0x1.509d16f50ec01p544 ++-0x1.9010e6a39e0aep831 ++-0x1.e7b93430ad1d5p1 ++-0x1.5f96469e388c6p418 ++-0x1.2d5ed5dc35c75p134 ++0x1.85cd87f4cc346p-2 ++0x1.8b37f442cf6e9p0 ++0x1.9b1ae7a4ae625p0 ++-0x1.53c115a7be97bp38 ++-0x1.ff32d7edcd704p-14 ++-0x1.953fa5f60bd50p8 ++-0x1.f45e927d7ec3fp-1 ++-0x1.45de4402c93edp-1 ++-0x1.8fab8457e4c73p2 ++-0x1.e062920d6e2b6p-2 ++0x1.d85f469b95361p577 ++-0x1.98b8e736546f7p21 ++0x1.baf561d55a741p17 ++0x1.a72bd7daabe8bp105 ++-0x1.1ef7f1c2e5c9bp-18 ++0x1.0435b73182174p18 ++0x1.561e661a58867p-13 ++-0x1.2f150336c7ec0p3 ++0x1.ac91a59fb0bcap3 ++-0x1.078942a38f20cp1 ++-0x1.718d90b3efe95p-1 ++0x1.8dba84562c1a1p-25 ++0x1.9f94a2a92cc63p25 ++0x1.529ab6f344416p15 ++0x1.a005943ddb8eep0 ++0x1.ac93d3c825de4p19 ++-0x1.1140b5380990ep-2 ++-0x1.8ef2408d49792p9 ++-0x1.ca5042b95a883p11 ++0x1.7c287447df731p599 ++-0x1.e15023bd4744cp210 ++0x1.657882484d13fp23 ++0x1.e88f328b258fdp23 ++0x1.855dc0e37b99ap395 ++0x1.598187ea5ae51p33 ++-0x1.637ae365b4384p-1 ++-0x1.1923e00bf8e04p1 ++-0x1.5f4ed07d8a997p16 ++0x1.268767573e897p22 ++0x1.ad3f47ad94f57p227 ++-0x1.05cc81c2d4884p25 ++0x1.bc8e47678920ap0 ++-0x1.f772a716fb113p-22 ++0x1.bcdc73da531a3p-7 ++-0x1.b526f046be5e2p-2 ++-0x1.f888c3eda4f44p92 ++0x1.6f90f7637cce6p924 ++0x1.6ae52307d05c4p18 ++-0x1.40ea87b7fb3a9p2 ++0x1.270c426bb2c09p38 ++0x1.d82674e4cec0cp874 ++0x1.2dc86702ce991p122 ++0x1.e15520525a088p19 ++-0x1.ea28530234be7p17 ++0x1.9ba9b4938d1fep8 ++-0x1.8dcf703e176e2p12 ++-0x1.cc265742b5c6ep0 ++0x1.0065329f84432p554 ++-0x1.161137df0d91bp1 ++0x1.8fb0027634696p0 ++0x1.b9fa22d8a4cfep0 ++-0x1.667ba642c426bp628 ++0x1.6ea694c30205bp27 ++0x1.49f3651093200p822 ++-0x1.79f5a0df3fcebp667 ++-0x1.b53dd3f934f2ep427 ++-0x1.0565b1cf6e355p20 ++-0x1.7ef691c9c2091p-1 ++0x1.2f6062f73a03ap-2 ++0x1.d4f4c36b692b3p3 ++-0x1.945c555415314p3 ++-0x1.e1efa2575c11bp284 ++0x1.daa7f3648ccb3p680 ++-0x1.5ad77206e5e6ap-2 ++0x1.c79a40f6473f6p29 ++0x1.48fcb0b8cc309p73 ++-0x1.c0cb8090ed1dbp-8 ++-0x1.9411631355aa0p2 ++-0x1.4a1e129f65869p234 ++-0x1.7619e7382b57bp-7 ++-0x1.80f5c7807337ep5 ++0x1.e30ba2147b72ap23 ++0x1.faaab405c970ap10 ++-0x1.8db3b01985f05p-17 ++0x1.b155055e2c9bcp-12 ++0x1.7b1531e9dea19p16 ++-0x1.3f4041f462a08p35 ++-0x1.809d32d7edc1cp18 ++-0x1.261472134e23bp-6 ++0x1.9a6785f0bd19bp406 ++0x1.8227140a3e10dp491 ++-0x1.ef5aa000c8afbp845 ++0x1.41c582661c062p2 ++0x1.67fca3ca351fdp-2 ++-0x1.eb4e319782bc5p0 ++0x1.2f2de7f12ed11p0 ++0x1.f5a6b78c7b2e5p4 ++-0x1.1297c67142642p1007 ++-0x1.e1f4a032a77f6p0 ++-0x1.088754e6657a4p1 ++-0x1.75e1d72e80fbap30 ++0x1.78b350a1f00e8p22 ++0x1.271167a076a83p44 ++0x1.e70f437159d71p-2 ++0x1.87e957b57fa84p75 ++-0x1.677a102f413c2p0 ++0x1.8fc497cbb0095p-20 ++-0x1.d25da5b15d323p-1 ++0x1.76e7f1f9d8687p72 ++-0x1.36d924ab23541p25 ++0x1.b6964733ca4b5p1003 ++-0x1.fb16015e8942bp-1 ++-0x1.70a972441252ap981 ++0x1.7e76507a8675bp-17 ++-0x1.1cd0058f54456p122 ++-0x1.c0fb733c7fc31p-3 ++0x1.9eeeb2ae4b3ebp710 ++-0x1.adb9d02c6d361p1 ++-0x1.8043944ab395cp-2 ++-0x1.3929134a7aa22p6 ++-0x1.afef537037707p22 ++0x1.f95dd74ff9bd0p265 ++-0x1.46ee17ceaa71fp-1 ++-0x1.7f6ea716e7feep317 ++-0x1.1e22240f16846p-1 ++-0x1.20a474cb7609fp24 ++0x1.70e043acc61e5p16 ++-0x1.7eefa2d58eb0ep337 ++-0x1.5f0916075f895p25 ++0x1.587ca1f01e2f3p4 ++0x1.ec1f57978ca5fp-3 ++0x1.03b1a7547b5f9p313 ++0x1.b92e15306ee93p-1 ++-0x1.b52f21e5fe14bp-17 ++0x1.0e10b6ab5a214p-8 ++0x1.8c4b96284f26ap24 ++0x1.5f0360b127d60p-1 ++-0x1.9b60e1c781a78p501 ++0x1.20dad3315b635p586 ++0x1.34af961f320dep220 ++-0x1.300e85c202993p41 ++-0x1.4d8eb16113ddap-6 ++-0x1.73d644b4030d5p0 ++-0x1.368a658fa09f8p2 ++0x1.0c89d6b268d24p20 ++0x1.bb1a765ce28fdp47 ++0x1.8f4006e283f2fp13 ++0x1.92eb72301aaadp-20 ++0x1.d3c0d2e0def1cp14 ++-0x1.5bb3b4c71a538p268 ++-0x1.64f9c74e4f02cp409 ++0x1.092eb44978cc3p1 ++-0x1.871aa3260142cp12 ++0x1.b2231204c9adcp14 ++0x1.169a93b39b7c8p-2 ++-0x1.aea221c5784dep439 ++-0x1.bc398053cf866p725 ++0x1.5c55063fa98a0p26 ++-0x1.6d60d14fab3ffp19 ++-0x1.61a907b23322ep26 ++-0x1.3e2aa7e0685c7p28 ++0x1.1870b10038923p-1 ++0x1.3a52b1e143ab8p28 ++0x1.7bb547d4e8b19p18 ++-0x1.1f24978e6140fp507 ++-0x1.a95f874fe9ca8p42 ++0x1.65ecb6f9f87dap0 ++-0x1.71a20409c9197p0 ++0x1.385a123a7bc69p-22 ++-0x1.2f9e350b93eefp0 ++-0x1.1485e2b270712p19 ++0x1.3ac6f562d19b3p-2 ++0x1.6476142969e6cp325 ++-0x1.56463176cb1a3p283 ++0x1.20e5f768ccce0p0 ++0x1.319f01a378b2cp2 ++-0x1.8969458ad3464p-2 ++0x1.b1f7254761461p-2 ++-0x1.6cf2f4320d01fp0 ++-0x1.7906d597ec6d3p806 ++0x1.4efb250a0b393p-20 ++-0x1.6c12c573e5d7dp5 ++0x1.daafd30c1507cp24 ++0x1.9d6185d00050ep996 ++0x1.934ac1f1b9ed3p231 ++-0x1.1a45e56568952p-2 ++0x1.65bfa7b4278fcp16 ++-0x1.1aace0acffbdbp1 ++-0x1.68d463926e0dep-1 ++0x1.b1dab378ca1c2p25 ++-0x1.506cf2a809fddp704 ++0x1.358a15ae4294dp-13 ++-0x1.42c3c05c5826ap390 ++0x1.2fcbf708a00e3p3 ++-0x1.3677e200ab18ap-15 ++0x1.2873c5d55c2cfp-22 ++-0x1.2724526c9752dp-21 ++0x1.8d9b06275b83dp12 ++-0x1.b12f058122586p181 ++0x1.527573274a8d4p8 ++0x1.195f40a45ebb6p0 ++0x1.27e087658825dp-1 ++-0x1.2fa5c194bf350p8 ++0x1.aee9b799e7960p9 ++0x1.e7068384c91e9p19 ++-0x1.9c15b7bbbe8efp786 ++0x1.5e87f540349a7p36 ++0x1.4c6543847dd73p496 ++0x1.c589e3ee9a17ap33 ++0x1.c807c6669378cp-1 ++0x1.3adbb27f40e7ep0 ++0x1.5b0442a02b1cfp23 ++-0x1.4603d2868b08bp-2 ++-0x1.28a4e5eda874ep277 ++-0x1.a25a728b6e591p147 ++-0x1.12e453911f316p808 ++-0x1.e2b24769906d4p32 ++0x1.f884d2ae76492p-1 ++0x1.fda586dbd3223p18 ++-0x1.3f09d311f4081p893 ++0x1.289fb3f9141abp16 ++-0x1.41f333066913dp19 ++0x1.dee9e7bf987c9p976 ++-0x1.32a5b4fa2e6b2p0 ++-0x1.e20aa461c2157p34 ++-0x1.4a66f2ea0a5c0p45 ++-0x1.5ff44343e926dp0 ++-0x1.c88e22ba7c82cp0 ++-0x1.4026b50f54360p0 ++-0x1.7afb6345c0c15p24 ++-0x1.c17db7ae50ae9p8 ++-0x1.120ae360cb67dp11 ++-0x1.4cb780f424d93p13 ++-0x1.27eb05143f027p25 ++-0x1.20c813e3aed73p709 ++-0x1.86d2e433d192fp889 ++0x1.0961e47b86039p0 ++-0x1.8abfe08bbc72cp599 ++-0x1.d6de9255f915fp0 ++0x1.37c9063f4c54fp34 ++0x1.ef29e5cc63bd3p8 ++0x1.b0e307f445021p34 ++-0x1.2dd254b5abc94p5 ++0x1.774825660c90bp-8 ++-0x1.059295ecd45d1p0 ++0x1.4fedc45fad571p26 ++0x1.f40711380db13p7 ++-0x1.b95cb138eca91p35 ++-0x1.51ef12b10b034p-2 ++0x1.ed7034a4ba5fdp26 ++0x1.3407c59c49bd0p0 ++0x1.103160b4631c0p21 ++0x1.e19f639692ac0p261 ++-0x1.9fae70cb2d56cp31 ++0x1.38ee669963b88p21 ++0x1.99cb42f6c9388p355 ++-0x1.bcda7573c7ce4p927 ++-0x1.6291301099b9bp30 ++-0x1.d782c2e2c92bbp15 ++-0x1.784e8037661c5p19 ++0x1.36744643c4a42p36 ++0x1.c381c73ba6b44p5 ++-0x1.8e6584afbb6bap29 ++0x1.60ef319355c1dp478 ++0x1.754fa41b33911p888 ++-0x1.dc27a33bf6306p-18 ++0x1.b33d46d5e22fdp18 ++0x1.2bc62656f694ap827 ++0x1.3d75b544d079fp-2 ++0x1.e054c651bc3dep960 ++0x1.1a72c20a37235p14 ++0x1.aed6f37f159a8p4 ++-0x1.01992507d64dcp11 ++0x1.3b56f71608c5ep0 ++-0x1.d7e042bfb55fcp16 ++-0x1.eb3e0216540efp894 ++-0x1.4fd1c1f7dd5c2p46 ++0x1.02f127955effep0 ++0x1.cdbb710ee6b4bp40 ++0x1.090911a7b9637p-2 ++0x1.d74c64e6dda8dp29 ++-0x1.98a6009907880p158 ++0x1.a5cc91ee0faa7p41 ++0x1.943d06841a6c8p34 ++0x1.8ac7d5e70a232p-2 ++0x1.ba2c04cc3ef8dp3 ++-0x1.b58f95aa564d9p0 ++-0x1.973e5700e6b4bp20 ++0x1.b7a3524725846p0 ++-0x1.128721b885a46p17 ++0x1.bc6b54987973cp19 ++0x1.b4ad251ee68e4p-2 ++-0x1.50fc219493101p842 ++0x1.d58ae142787d9p-1 ++0x1.316d83c961b95p4 ++0x1.34d343338acc5p9 ++-0x1.8045f5444a6b6p24 ++-0x1.839b72308621ep1 ++-0x1.0e7452e31d1a4p17 ++-0x1.24c7e44469182p1 ++0x1.da29e623ef67ep-2 ++-0x1.0dbce3889c2c5p800 ++0x1.3bcca50129997p-2 ++-0x1.6b0ab247362d3p806 ++-0x1.600922864a5cbp12 ++0x1.0389370f595d0p-17 ++0x1.7ccf72e3efcffp23 ++-0x1.cb8b1074ff472p-2 ++0x1.b7a66671d9bc0p557 ++-0x1.c55a54873485dp5 ++-0x1.ed643182b4f8fp-1 ++0x1.3d6fb3a57bc7ap-2 ++-0x1.20776336f7781p1 ++0x1.42b72105c6ed8p612 ++0x1.06a4d6dd3a5c4p-2 ++0x1.830a33db5faf6p0 ++-0x1.bec3309e61a85p25 ++-0x1.cdd4202956c13p9 ++-0x1.456894b0fe5e2p-9 ++-0x1.5e75c7bfd1c26p13 ++0x1.2511840847d4ap1 ++-0x1.311d36a26ce96p25 ++0x1.7b3583c108d12p368 ++0x1.2b3ea65fb3fb0p3 ++0x1.9d531434f54aap1 ++0x1.b097301ac5504p16 ++0x1.8c8b55474e5dbp0 ++-0x1.1e79f18b6a2e0p44 ++0x1.ff9ad1733ab79p-2 ++0x1.475ca4f6bbc44p937 ++-0x1.bf0114ace534bp177 ++-0x1.b91072375d8a4p-2 ++0x1.84fcc3902af81p971 ++-0x1.81eec4a99819fp18 ++-0x1.18a9e42a54f34p0 ++-0x1.4019e136b83dcp-2 ++-0x1.78f283c624525p-2 ++0x1.2701b12d4f844p22 ++0x1.36fc85bbb6070p401 ++0x1.6b35225fd0908p94 ++0x1.e6e2131951debp279 ++-0x1.b82af00e76418p14 ++0x1.be658653e6766p256 ++-0x1.385b70831cafap29 ++0x1.d3f5c24cbc413p-2 ++0x1.f93972d50cfb3p-1 ++0x1.3b7813b2681acp0 ++-0x1.7f27f0e41cc47p24 ++-0x1.eb9b45f3358c3p9 ++-0x1.236842aae5290p1 ++-0x1.69135229dc5c9p4 ++-0x1.a81f93c59e748p11 ++0x1.21ed75692e14fp32 ++0x1.7ce2f7e7f462dp30 ++0x1.f9bfe445d11b5p2 ++-0x1.80d5201176135p10 ++-0x1.6502724d070d2p26 ++-0x1.756325ea0de70p357 ++-0x1.14982063b0f3bp18 ++-0x1.b62bd1473f7b4p683 ++-0x1.cbc8c7e76a18dp22 ++0x1.01ff77285718bp-1 ++0x1.149063aaa5e7fp26 ++0x1.36a8923cacda4p25 ++-0x1.3db72554025e2p10 ++-0x1.445e35540ca90p493 ++0x1.51bf04c8ae132p-25 ++0x1.6f5394c33dd94p5 ++-0x1.1ff746f462c25p-21 ++-0x1.109b702903094p10 ++-0x1.d5c5e7e8246e0p2 ++-0x1.52b9318533d0ep8 ++-0x1.73c380e23710fp11 ++0x1.63a440fa11bbbp230 ++-0x1.5d2961e3f707ap704 ++0x1.8b42849cca6abp1 ++0x1.8bc2e1537e745p10 ++-0x1.406c125032124p701 ++0x1.50850019bb449p-7 ++0x1.7df5d165411e6p-21 ++-0x1.c089e1db09fa1p24 ++0x1.fd15959b89b57p18 ++0x1.722ac54ce4ca6p28 ++0x1.9ed9928e455fep-9 ++-0x1.58698376f1cc9p4 ++-0x1.0cf1601dabfd0p-13 ++-0x1.23afd7ed7fb9dp-1 ++0x1.be965057282e2p112 ++-0x1.696652132ab94p18 ++0x1.77458321cdbd7p549 ++-0x1.417ae73977eeep-22 ++0x1.85abf3e024aacp-12 ++-0x1.b9cc71340e0abp-1 ++-0x1.2f5e246efd99ap1 ++0x1.700f73433df7ep-1 ++0x1.6016960e7dd29p205 ++0x1.fb0380828c4cbp39 ++-0x1.630bb6882ef0cp8 ++0x1.f6646483933acp-1 ++-0x1.aa81e7a2dc38fp614 ++-0x1.0a2d10e978ec2p154 ++-0x1.7df4b33b5344fp5 ++0x1.d702811d5c6abp984 ++-0x1.ec22926e5a82ep-21 ++0x1.34039400fe24cp11 ++-0x1.bd6547ae731d4p0 ++-0x1.ab8f03598b253p-1 ++-0x1.2c2aa517d17b7p152 ++0x1.d5afc263e2f26p7 ++0x1.2f1b33b063f94p0 ++-0x1.45a626aafd49ap45 ++-0x1.a819d0880c43ap8 ++-0x1.6fd166b7cf8a9p28 ++0x1.8f14c6d951680p-2 ++-0x1.f95a164067f69p-6 ++0x1.89b4a08a38cb0p14 ++0x1.a4b996c33a6bdp37 ++0x1.4aeb0322ec440p-1 ++-0x1.a420305ddf0dep20 ++0x1.5b68332d5fe77p189 ++-0x1.6929678422be5p19 ++0x1.dd2126a36ab02p10 ++0x1.98f53759e6cc2p776 ++0x1.c327955ab4d9cp600 ++0x1.c152d36d52060p-1 ++0x1.794e9268cf1f9p-3 ++0x1.0fd9b34cf9e14p0 ++-0x1.f1c2c3f721d38p24 ++-0x1.c2f18449c0b1cp-13 ++0x1.1f6f72691226fp26 ++-0x1.9eba60739e9fdp22 ++0x1.55e6b0539f3bap982 ++-0x1.deaf371270943p6 ++-0x1.9d3ae228b1311p12 ++-0x1.fecfd748896e1p0 ++0x1.fd5a059f9c172p-2 ++0x1.c7a7c29f81427p24 ++0x1.36ca81fa9a1adp684 ++0x1.8c3ff49ca4904p12 ++0x1.1d0d849df4253p1 ++0x1.f52c4094b100fp36 ++0x1.3349a0a047c9ap24 ++0x1.397f1147f1b4ap-7 ++-0x1.c7ea6242b1fa7p12 ++-0x1.01f5933842764p38 ++0x1.81c1a5562ef0dp29 ++-0x1.71a012ad6b2dap-2 ++0x1.4e0114b92be2dp846 ++-0x1.ea54b35d3f7e3p11 ++-0x1.8758771ca14b1p580 ++-0x1.a17a467fd6aadp8 ++0x1.f18514b3d4bc4p0 ++-0x1.acfaf20b2d004p15 ++0x1.5985717523c39p8 ++-0x1.8c04a7df8a0dfp-1 ++-0x1.2f9d510841af2p-1 ++0x1.153361ad245bep11 ++-0x1.85103699de39cp16 ++0x1.2df047f79c291p201 ++-0x1.489e6110776d9p0 ++-0x1.6b8242e1f61e9p-1 ++-0x1.9bb0554427766p995 ++-0x1.5661e39faa45ap14 ++-0x1.6c4da055e41c0p24 ++-0x1.d4e2a3a4090cdp175 ++-0x1.e5e790e8baa1bp-14 ++-0x1.129e75c7aff37p6 ++0x1.5375038c8dd70p27 ++-0x1.c04a313036171p992 ++-0x1.e12566734cc7bp976 ++-0x1.ed8b413aed34dp716 ++0x1.a3e0646c6265dp738 ++0x1.74a4333e87a2bp9 ++0x1.5d02455d1bb3dp15 ++0x1.712c9673a7d13p-26 ++0x1.4840b2e17f6edp1006 ++0x1.2053e5b7f6eedp26 ++-0x1.b5a30398cb230p-14 ++0x1.fe83c131a134dp0 ++-0x1.63f1305740debp8 ++0x1.ff796761e132ep34 ++-0x1.7d193269b00f9p22 ++0x1.94e78186aeac5p25 ++-0x1.278cb595be809p-2 ++0x1.d4ccc2ff780b8p42 ++-0x1.ef8b614873906p0 ++0x1.c8b7f506376c4p33 ++-0x1.97b4b07142435p-2 ++0x1.1efd54bfbe9fbp100 ++0x1.1560d1a87593fp27 ++0x1.5e8c0545cfcf4p26 ++0x1.9c69e6fd6459ep637 ++-0x1.4b25e05d58b46p863 ++-0x1.81ec10a304cf8p774 ++-0x1.1f9604ed5dc18p-1 ++0x1.becfd05c673b6p20 ++0x1.bde267b487883p183 ++-0x1.d917f2a793ddbp5 ++0x1.e85f16573a72dp919 ++-0x1.0cc5657e9b661p1 ++-0x1.446982673e881p9 ++0x1.e84e42461caddp326 ++-0x1.a479565cee358p-2 ++-0x1.2e7db1f9f89dap3 ++-0x1.6807f62188ee4p19 ++-0x1.f9a73671b8d07p1 ++0x1.1beef08374679p0 ++0x1.1dafc2f5778abp25 ++0x1.9250a762e1ba1p20 ++0x1.f9812520917ecp12 ++-0x1.0da0d4531229dp416 ++-0x1.72ff65f41d183p-2 ++-0x1.164d766bf45fep19 ++-0x1.3c7a02cb96b62p-1 ++0x1.3fd9603c15434p-1 ++0x1.6ed333c5adb05p-15 ++-0x1.b35ad0e907efcp23 ++0x1.ee8f5619a8d0cp-1 ++0x1.4523c70e30a5ep45 ++0x1.74f607e52d238p-1 ++-0x1.0fc6108958cecp1 ++0x1.9ccf57ca88ef6p621 ++-0x1.0809650c00191p20 ++0x1.ccf645ad30624p-2 ++0x1.40a22315ce02ap10 ++-0x1.4b4f6440c04d3p0 ++0x1.e846d4c3490f2p593 ++0x1.f92f20b5d8cafp-7 ++0x1.b90bb5fd78cd4p786 ++0x1.16afb2cf4deb8p538 ++-0x1.1aa4248addfffp5 ++-0x1.587286bdceb7cp1 ++-0x1.2ce667139fd6ep26 ++0x1.2fe84506f5385p963 ++0x1.3acb00c272448p-16 ++0x1.e0a3c2d64fee3p719 ++-0x1.b487d227fdec7p-2 ++0x1.faa152bb52391p18 ++-0x1.e79f5357231aep15 ++0x1.c65bb6c53d3dap-23 ++-0x1.ddfa475af1db1p674 ++0x1.d15766ea575b6p754 ++0x1.cc77931bf80adp1 ++-0x1.39d87172d2d3ap955 ++0x1.eee6f4a4110bdp829 ++0x1.a81e612359044p-12 ++-0x1.2876e2ba2738cp-2 ++-0x1.281e96b11431ap20 ++0x1.1679654620215p634 ++-0x1.c19584949678cp0 ++0x1.b8da124791494p-2 ++-0x1.e18f25739b74dp607 ++-0x1.4b5b316466f4ep-1 ++-0x1.c3f2d4a621a5fp12 ++0x1.7ca620f840a2cp828 ++-0x1.e2a1c45179529p-6 ++0x1.03b8346424511p-2 ++0x1.b135621e69725p551 ++0x1.28f6635324af0p1 ++0x1.ce24171b296d6p23 ++0x1.7fca444e86945p24 ++-0x1.de18458a2ee35p699 ++-0x1.10aaf42a372b8p-10 ++0x1.3175567afe205p25 ++0x1.b3ea9658f5c1ep-2 ++0x1.5cdfe0c3508c0p27 ++0x1.718706e31a168p-12 ++0x1.4b2475de57328p581 ++0x1.7e06534da3912p26 ++-0x1.bc4683ab53857p24 ++-0x1.dcbd172495052p-11 ++0x1.953bb577e3442p8 ++0x1.c704b77880f42p960 ++-0x1.e1cdd796bd369p25 ++0x1.c6f0846cfe9e4p-2 ++-0x1.6a35f6969e604p22 ++-0x1.648dc686aa66dp-1 ++-0x1.7362b1dd212ddp198 ++0x1.7311f4cc57a57p-2 ++0x1.437536a391f64p-16 ++0x1.989c90dd19204p34 ++-0x1.8382a5f03a8c2p-10 ++0x1.ef9bf32947b5ap8 ++0x1.4e8642971464ep9 ++-0x1.873e050c19a35p403 ++0x1.3b96e14be3ce6p9 ++-0x1.acdfb08fca270p9 ++0x1.a48c61da23d9ep255 ++-0x1.f23d367e7d312p-1 ++0x1.8657c785cda01p21 ++0x1.b834d785cb551p0 ++0x1.2e9e363624743p-1 ++0x1.d6bc40afd2e5cp1 ++-0x1.b28dd3c03580bp25 ++0x1.464f2654be753p15 ++0x1.0e66174c1a5b8p57 ++0x1.9513603120188p-11 ++0x1.d8f947940be48p462 ++0x1.f555e2ba605b4p15 ++-0x1.39e4b7d1c13c1p2 ++0x1.77b477c4ce082p450 ++0x1.db29e26cbb155p12 ++-0x1.09437624580b4p1 ++-0x1.54e64408c718dp-8 ++0x1.bc6023572bcc5p24 ++-0x1.b434a601701d7p601 ++-0x1.f4b1d689b2dd0p11 ++-0x1.0169d2091a98fp-2 ++0x1.3f8ff3fa74d41p-5 ++-0x1.8c80c2779ce0cp2 ++0x1.868886f5a1110p10 ++0x1.9c4df0b876ebfp-25 ++-0x1.71f585d4559b8p0 ++0x1.8de525de7f0b7p2 ++0x1.4176a6a108549p39 ++-0x1.5f815601d20b9p-2 ++-0x1.a38f23bfc9035p19 ++0x1.c5d840b1da838p-1 ++-0x1.34bd228405e26p24 ++0x1.57512021aabcap26 ++-0x1.bca9f6e287c33p-14 ++0x1.5ac0c1a2f4fafp24 ++-0x1.994ab36e7d723p2 ++-0x1.328d45a5fc470p341 ++-0x1.64af70ee7def2p-4 ++0x1.ee1db2f62022fp0 ++0x1.5f2dd10e6a6ecp-20 ++-0x1.838631f252728p42 ++-0x1.19cf34161b21dp11 ++0x1.9f91840121c5ap-22 ++0x1.9dbe335793b39p41 ++-0x1.839fc42eeae8cp103 ++0x1.eef9e6c8ffb8ap6 ++0x1.8541c004e3180p22 ++-0x1.8c1920d4c1503p85 ++0x1.b218a059a4570p-2 ++-0x1.a58d75620b198p667 ++-0x1.6efd621a14b0cp17 ++-0x1.099e53d938376p14 ++-0x1.18d6e5d70b10fp-1 ++-0x1.5788e732cd976p11 ++0x1.07ef71676445cp34 ++-0x1.ca4487363d2c1p27 ++0x1.dc926279d77cep263 ++0x1.8753049e6d5e1p-24 ++0x1.65f042ee1fc9dp47 ++0x1.bc3453e531abap-1 ++0x1.bcc4873bb393bp6 ++0x1.116535b98ffadp42 ++0x1.de18a3376458ep8 ++0x1.db06306746181p13 ++0x1.84c37202fcf43p1 ++0x1.866395219626bp18 ++-0x1.141071db29322p257 ++-0x1.73ef56ec1f623p950 ++0x1.e4d520d681029p25 ++-0x1.9eeee3bb51702p1 ++0x1.f0d4059310340p11 ++0x1.5183a5f0807cap12 ++0x1.1bfe251a8c4a8p21 ++-0x1.1a87e14b480c2p0 ++-0x1.7edd86bc0ed71p628 ++-0x1.ab66712e5be65p12 ++-0x1.5780654d83cf9p20 ++0x1.0e08e43c171b7p-23 ++-0x1.88da66ec65c0dp324 ++0x1.5c5926ec4f1a2p-2 ++0x1.decdf19a88501p4 ++-0x1.5bb127177c60fp935 ++0x1.7744646704854p0 ++-0x1.cddb237f3dfcdp672 ++-0x1.8c87310c7aa0ep16 ++0x1.1a8aa57389535p-1 ++-0x1.b27e20d250282p26 ++-0x1.facbf497fa225p576 ++0x1.fac832440d064p-1 ++-0x1.228927aeb745fp-2 ++0x1.3cd4a0cdd1361p47 ++-0x1.85c831564ddeap1 ++-0x1.83f066bfc1359p14 ++-0x1.b753f35ab1670p14 ++-0x1.76e0b3655bb28p30 ++0x1.4ef00786f3c9fp27 ++0x1.2621a3ae6c888p2 ++0x1.f0f6471c67c9bp-2 ++-0x1.ad9653d2d06aep-2 ++-0x1.f6717146079e5p22 ++-0x1.27ea06c37db0dp982 ++0x1.567a43608f4dcp8 ++0x1.c2aec319a9eb1p3 ++-0x1.0c9f22529d27dp-3 ++0x1.f675c28973d34p6 ++-0x1.b1ba46b0c8b89p-9 ++-0x1.348066bcb437ap-1 ++-0x1.c1e203c94dc06p19 ++-0x1.bd2d4187954e7p30 ++-0x1.85eb466fe1e41p-13 ++-0x1.2ce2532f3a652p11 ++0x1.ee2be60192dfep-2 ++0x1.7c77736361d2ep619 ++-0x1.9bb2716c8b4e1p21 ++0x1.458cc63edc9ebp16 ++0x1.427fa56cf1226p791 ++-0x1.cd4a90f4529cfp0 ++0x1.5a66116e3a525p585 ++-0x1.a44717a44cee8p9 ++-0x1.89c766e207c5bp47 ++0x1.8497829793fafp-2 ++-0x1.b169742951e02p18 ++-0x1.6f4840b361b11p-23 ++-0x1.caa2b00a5545ap22 ++0x1.158d27d29b47cp25 ++-0x1.c113704bba518p0 ++0x1.ad9bf10cb5ff8p14 ++-0x1.4e0a32305965bp-2 ++0x1.067fe63e938a4p-23 ++0x1.b96914a1b3a21p438 ++0x1.63dfb19a046cep34 ++0x1.db0804f3c7c9ep0 ++-0x1.8410d2e1034b3p0 ++-0x1.d1aaf2398a33dp-2 ++-0x1.bbb454f7f7f07p24 ++-0x1.c9acc42e8d061p19 ++0x1.203d60670cd9fp-8 ++-0x1.767535411c076p-1 ++0x1.60cc4040d39f1p422 ++-0x1.d10600cb8001bp29 ++0x1.b8e581930f94dp-1 ++-0x1.355566120a0b9p1 ++0x1.45b580cae60afp18 ++0x1.d911332e98370p0 ++-0x1.91177292f4cabp8 ++-0x1.418ad2d34bae0p-10 ++0x1.8291b4650a69ep-1 ++-0x1.79d9f4f590c73p24 ++0x1.a6c83045cbf27p20 ++0x1.671f710ecd668p1008 ++0x1.318ea4b002d99p-10 ++0x1.a7b8b355e681ap46 ++-0x1.8f1101e38969cp61 ++0x1.be31961f3aa50p160 ++0x1.0836b413055ffp647 ++-0x1.95d046a1ab722p919 ++0x1.fc127769b2558p421 ++-0x1.fa2d535dfb0ffp0 ++-0x1.19df965ee45d7p653 ++0x1.c409446d99c17p615 ++0x1.259ea3875295cp42 ++0x1.1d90964dac75cp23 ++0x1.2019d5248771cp42 ++-0x1.328307633514ap1 ++0x1.a28317d7099c2p23 ++0x1.ac9cd6e82d051p19 ++-0x1.32f0c45d72d8dp0 ++0x1.76fa3642a2e9ap2 ++-0x1.f5cac7ebb5a18p7 ++0x1.76df575b7cff4p12 ++-0x1.714c26d8c8d24p-26 ++0x1.14a3e3533f825p2 ++-0x1.aca7465e17036p-1 ++-0x1.6ea6365296b7fp37 ++0x1.903ff0fd1d1d1p816 ++-0x1.0acae1b832bffp618 ++0x1.0b9fb4c808dd7p15 ++-0x1.fc968462e80a1p42 ++0x1.971fe623dd7bbp-12 ++0x1.b2c787b5a85fbp10 ++0x1.6af4437902edap-26 ++0x1.eafdf13258e48p22 ++0x1.40dcf08370d64p-16 ++0x1.3c49f4603b25ep158 ++0x1.7d156688d9d5ep203 ++0x1.ea6ec75e3a3f8p14 ++-0x1.39770057684f9p335 ++-0x1.203f737ae7869p-12 ++0x1.820394211c83fp551 ++0x1.2a2466c9759cfp21 ++0x1.d7edd63490c31p-1 ++0x1.da78c7461ca5cp20 ++-0x1.5eada05f63f1ap12 ++0x1.4d0466560feb1p23 ++0x1.f840d32accedbp576 ++0x1.f017d5329baeep34 ++-0x1.28f2e2a8c25a1p6 ++-0x1.3b6705c364a3bp-12 ++-0x1.dce5f1df42de0p0 ++0x1.0d48966683a4ep1 ++-0x1.1c63a7cadb22ap-22 ++-0x1.16ba8367f31fdp156 ++-0x1.8b3e13c7f3a03p21 ++0x1.97fcd0035fe76p23 ++0x1.bec9562483afbp1 ++-0x1.88e6d0eac076bp3 ++0x1.5b15217b8879ep10 ++0x1.aedeb39054577p271 ++0x1.3fb5b2335be6dp-15 ++-0x1.c331a14d8c473p-5 ++-0x1.bfc2a2cb84079p17 ++0x1.3c11d271df1bap24 ++-0x1.13ea25a9e3f6bp108 ++0x1.2e2b40a38617ap-1 ++-0x1.f528b5d80128cp-21 ++0x1.6aadf20c0b366p542 ++-0x1.f50a1346f56cep306 ++0x1.2d5b105aa946fp0 ++0x1.f5a63052565cdp15 ++-0x1.cdc68541a84efp8 ++0x1.bd32141c6c295p25 ++-0x1.4ddb2056462ccp24 ++0x1.7830865a59204p23 ++0x1.468106f7529f8p5 ++-0x1.025cc0f22a1fbp37 ++-0x1.c00d57ad60ac5p0 ++-0x1.2a4135493a5ccp35 ++-0x1.2afa33c25a200p603 ++0x1.74f407f05f616p8 ++0x1.5b8937978050fp21 ++0x1.7a5db0fda57f4p16 ++0x1.4695f2bc976e0p0 ++0x1.f481e2cf35d18p-2 ++0x1.c262e34521fb6p-1 ++0x1.2cbc860c13474p17 ++0x1.64d371b08759ep15 ++0x1.da18e713e4cb9p-5 ++0x1.abc9a6f91a6d6p-8 ++0x1.2df6d29bbc5b5p1012 ++0x1.aa2cb76cdfa0bp0 ++-0x1.5fe9976d6cd0bp12 ++0x1.85f14525bfb00p-1 ++0x1.49b43399b1c42p106 ++-0x1.9cd354c208505p-15 ++-0x1.9d4235a514407p2 ++0x1.ee0a16b3daac7p17 ++0x1.fcc165f31733fp0 ++0x1.e5e150a67c9f2p-4 ++-0x1.75a4c2ba36cecp26 ++0x1.e94cf46939e6cp755 ++-0x1.0b7b352b6c592p-1 ++0x1.d4f714edbb965p21 ++-0x1.e1e8645c60564p747 ++0x1.0a3fd37d282e1p-1 ++0x1.9621f5e7054c9p-2 ++-0x1.c1a72478daa53p867 ++-0x1.985c42bec01c7p0 ++-0x1.1cf386cd14914p8 ++-0x1.5f67a73764c42p614 ++-0x1.522cd68c1bf68p26 ++-0x1.d799532d49d5ap674 ++0x1.46bb22a16728cp5 ++0x1.389933b0164ffp10 ++0x1.a5f50513df15bp99 ++-0x1.be02a2624e3e2p-6 ++0x1.842b00d07b638p18 ++0x1.2411e326586bap-1 ++-0x1.e39ec39ec78acp100 ++-0x1.9a0136520b211p-20 ++0x1.473bd1a29d139p-12 ++0x1.5997d3e7d9cfcp596 ++0x1.c569803b425e1p13 ++-0x1.a38fc2debd07bp914 ++-0x1.e7a0c727b8c85p-13 ++0x1.fec181572dc93p143 ++-0x1.9d59b64a201eep-2 ++0x1.730c81ab84d39p18 ++0x1.0b25801e3ab2dp4 ++0x1.23a5f5c54b7b8p1 ++0x1.322b0576073e0p0 ++-0x1.c1f8e33410fe8p-11 ++0x1.867ef74ad8684p499 ++0x1.364d612cd2496p1 ++-0x1.caec529ba1df2p42 ++-0x1.b99d77d2009bdp0 ++-0x1.4bf4f0d4925c5p909 ++-0x1.79d630227d604p512 ++-0x1.fbbc014403c00p855 ++0x1.32e5e1654b2a2p-1 ++0x1.c94ed499f75c2p25 ++-0x1.805ce3fcfd6cap236 ++-0x1.38c217951cfeap14 ++0x1.d2c6423a89b18p32 ++0x1.fa9fb7906c851p8 ++0x1.6a2e105660a34p460 ++-0x1.3bb4055b92b4bp20 ++0x1.19b7d1cb31d88p5 ++-0x1.b710d75b84f62p30 ++-0x1.abc2246751c8dp-2 ++0x1.a9454155ad3bap5 ++-0x1.8107e221264ecp30 ++0x1.3554a38510ef4p-2 ++-0x1.8c392588b88aap-2 ++0x1.6a61e531ae636p-1 ++0x1.522c04ef79576p-2 ++-0x1.585b113866998p935 ++0x1.6572d38c4566bp324 ++-0x1.01c407a78269bp-2 ++0x1.c667704230cf4p119 ++-0x1.c26e3294a15b7p609 ++0x1.398957506d8ebp0 ++0x1.e0b6730234a2ap12 ++0x1.5f55247076d4cp886 ++0x1.91a7e436c803ap85 ++-0x1.b405442f13b0dp-1 ++-0x1.89197589af46bp12 ++0x1.b689827fcf442p0 ++0x1.e511f183f3761p38 ++0x1.8bbf8044036dap-21 ++0x1.a6f9739fb14bdp715 ++-0x1.e0b26088aa820p260 ++0x1.7ba5e059f9881p23 ++0x1.fe66a754c0fd2p25 ++0x1.6c6a32bf8575ep-1 ++0x1.eaaca56a33a78p-1 ++0x1.9015009c0d6f2p359 ++-0x1.6cb7f41a689d7p511 ++0x1.aacc71d5bacbdp95 ++0x1.29e4c477b18a8p36 ++-0x1.ef83a0fc79d14p-3 ++0x1.32e2c2a316640p21 ++0x1.ec0675ef5c64dp18 ++-0x1.dbfc56a89d5c5p-17 ++-0x1.cbf486a4cadf0p927 ++0x1.07936134292b1p8 ++0x1.b151d4537a8d3p192 ++0x1.67efc2818dc90p323 ++-0x1.9cd295f2ce662p16 ++-0x1.821820585b1efp0 ++-0x1.e5de90be0509ap-6 ++0x1.d26fa3ccb06acp-1 ++0x1.0f26767f7e19ep9 ++0x1.9732e3a149dcfp2 ++-0x1.738c626bee029p22 ++0x1.ebc397d721a35p-10 ++0x1.628a90978e6e9p313 ++-0x1.7e31f7114dea8p15 ++0x1.79cc77a2bab11p10 ++0x1.2983d646690f3p588 ++-0x1.5eafc23db65cbp32 ++0x1.8942a552364e4p-2 ++0x1.e3ccf6eb08b48p25 ++0x1.7880661b82c3cp13 ++-0x1.960bb106193b4p3 ++0x1.512562f1663f3p-9 ++0x1.d73bb4b91b054p-1 ++0x1.da72a35c1109ap0 ++0x1.b7ab22fa83736p844 ++0x1.d13c003e58e8fp-1 ++-0x1.ad34c4a774bafp-2 ++0x1.215ee10881727p787 ++0x1.94e87183d84f5p-2 ++0x1.e67e95b1bfec2p5 ++-0x1.13b3721046567p433 ++-0x1.3496b371b7047p-20 ++0x1.a20233bcdcf1ep478 ++-0x1.8b2493a06a535p-1 ++0x1.a84f74a1a6298p15 ++0x1.20bc40cdba97ep-2 ++0x1.d77ea17713c46p99 ++-0x1.6206e0239f1adp43 ++-0x1.d3e2555f60ea3p-1 ++0x1.aac214994c1dap-23 ++0x1.b16e41716b9a4p1012 ++-0x1.bff49465bba1fp-5 ++0x1.3922b5075dd33p-23 ++-0x1.826d62aa4fc16p1 ++0x1.c787f3022d540p17 ++0x1.0e8f744f79d08p8 ++0x1.8224508569db1p4 ++0x1.3551056491610p39 ++-0x1.d97a27aa772f1p24 ++-0x1.080464f37e4f9p-1 ++-0x1.ef7ec170b1cc7p-14 ++-0x1.56a34672be8a3p0 ++0x1.568ce0836dad1p0 ++0x1.68e4d1349211cp0 ++-0x1.cdd5647152dccp0 ++-0x1.df937407c9261p-2 ++0x1.dbedf324f26c8p42 ++0x1.e61e938251d5bp-26 ++0x1.27aa70e4f9180p10 ++-0x1.2beb30d17d09fp11 ++0x1.fc2f613c865cfp612 ++-0x1.18a437c0c0337p989 ++0x1.497f7636bc81ep5 ++0x1.eefc152fee26ap-1 ++0x1.e01e636b8c0e8p13 ++0x1.641203e8ff6c4p10 ++0x1.7cd5f6dc77b45p-1 ++-0x1.a8c463d05a384p-18 ++-0x1.939935c60bc6dp32 ++-0x1.112004f389f0bp26 ++-0x1.e3dd8706dbb77p-2 ++-0x1.06660332f032dp0 ++-0x1.2df664008c6b8p946 ++-0x1.db05f1c0a68afp-2 ++-0x1.c148b6e43e444p8 ++-0x1.5de1353d73697p4 ++0x1.66fdf2d6b465bp9 ++-0x1.62c167e6e4b10p23 ++0x1.9eaa3110cddb2p86 ++0x1.88c261dc17162p11 ++0x1.1309b29673b81p-2 ++-0x1.2bb1f6b417cb9p30 ++0x1.087814c0ec7fap624 ++-0x1.e0c945389d582p8 ++0x1.7943a676a5441p24 ++-0x1.320c04ceb42ffp-21 ++0x1.d909361bb3862p45 ++0x1.3b65434a04806p23 ++-0x1.afd001facc7b1p-2 ++0x1.0b19c619a640ep-10 ++0x1.0957e03dfef54p38 ++0x1.24e94466217eap-8 ++0x1.63119435659e9p0 ++0x1.3f3e90058cdf8p32 ++0x1.9c5120fa60573p-20 ++0x1.4582f3a60e340p46 ++-0x1.909e3202d81a4p4 ++-0x1.0437d4ebf5610p-9 ++0x1.6539d39ccc38ap568 ++-0x1.41a5b0bbfb9bcp6 ++0x1.7e8bb37871e1cp19 ++-0x1.ad8ad1bbd74e5p18 ++0x1.de4de49f18b51p25 ++0x1.826ba7055be5dp0 ++-0x1.ef63f73ede073p13 ++0x1.3beb24857264ap-16 ++-0x1.6f4b015987fdfp13 ++-0x1.a1c3d13b1c1efp38 ++0x1.e54744ab0b987p-18 ++-0x1.30d3903b0fef8p0 ++0x1.221cb2580e640p-2 ++-0x1.3686a2b46f392p20 ++-0x1.953a23666db27p23 ++-0x1.0e27f512156c1p41 ++0x1.8aeac1aea8951p507 ++0x1.859272081065cp24 ++-0x1.1421f542a190ap22 ++-0x1.13f9b5260c5c6p1 ++0x1.26e7e7db18108p-1 ++-0x1.5c5fa31066b6fp24 ++-0x1.f561528837944p47 ++-0x1.296430993cfacp6 ++-0x1.2d27a23459f85p12 ++-0x1.532a550f8785ap8 ++-0x1.97da24484f8b4p1002 ++-0x1.6dd96318f0afdp-20 ++0x1.c22a23981d826p880 ++-0x1.bb6595d952b59p-9 ++0x1.9d303417d2283p-8 ++0x1.2fad41ad10377p3 ++0x1.0fa034dfdbfacp97 ++0x1.ac9f668620937p201 ++-0x1.0926c03aab751p431 ++-0x1.1122f714c565bp-24 ++0x1.85b8127865850p194 ++-0x1.70a2c17f946dcp41 ++-0x1.41fda46167f73p23 ++-0x1.25ad23c987dc1p11 ++-0x1.8b7901317fc7dp-14 ++0x1.3a39378fff8f4p7 ++-0x1.27d681a249f5cp30 ++0x1.cb79b21c83a00p65 ++0x1.6682c62f9ee17p544 ++0x1.9722e5ad48a83p0 ++-0x1.6877c6503e926p-11 ++0x1.60bdc18e9615ap38 ++0x1.71209215d4d4dp166 ++0x1.3b3083c9e79aep29 ++0x1.226c15a2738fbp20 ++-0x1.850e61bf2adc0p46 ++0x1.cf59c1a465033p4 ++-0x1.f28f75a1e366ap-2 ++-0x1.ddfe107392c51p752 ++0x1.ad9a867a0f388p7 ++0x1.c190d52d7d990p-2 ++0x1.40f39083588dcp0 ++-0x1.72a507fb05048p23 ++-0x1.cb11020748b01p915 ++0x1.1af08708ba5cap15 ++-0x1.627c101f73406p530 ++0x1.689206a8915abp318 ++-0x1.cb6761b5dea79p634 ++0x1.c2e0d162c326cp404 ++-0x1.718305de4f896p17 ++-0x1.e93fc085fd701p-2 ++0x1.11ece54e13460p5 ++0x1.8727425cf3cd8p24 ++-0x1.b42da698277c1p45 ++-0x1.6596f74580a61p749 ++0x1.5527e4a40304ap13 ++0x1.e44661960fc6ep861 ++-0x1.f172b70a99607p-1 ++-0x1.0551459f69b31p1 ++0x1.fe53e03d64618p-23 ++-0x1.32fa65f2e7445p-18 ++0x1.d186c41b4314ep15 ++0x1.554651879adf5p21 ++0x1.11ffd2256e002p-2 ++0x1.af32d40afb747p25 ++0x1.7f07047f01402p46 ++-0x1.7d6eb6b631adep325 ++0x1.368db60e46f81p0 ++-0x1.7dff648d5243bp2 ++-0x1.8c2ec01e5fedcp0 ++0x1.2a285014439ffp25 ++0x1.97d7a7e9d1488p267 ++-0x1.aa7e802105b2bp3 ++0x1.71f44577ef0e0p30 ++-0x1.c348a7a1cf0cap-5 ++-0x1.e3c124e128e3cp513 ++0x1.6382e3388fe7ep0 ++-0x1.535d11123ca67p-1 ++0x1.cb8544daa77adp232 ++0x1.c711c1bebf09bp-2 ++-0x1.5af6028fa5346p944 ++-0x1.96048340a5514p22 ++0x1.f72ff33637c6bp22 ++0x1.19acb5b9c1f96p849 ++0x1.2812a646b9299p-1 ++0x1.75f772acd0271p614 ++-0x1.182e332b82935p951 ++-0x1.20dda567e407ap389 ++-0x1.aabc54e09bf9fp5 ++0x1.e6b50061378a4p40 ++0x1.2f68852bc70d7p0 ++-0x1.823b97f7229a4p-15 ++0x1.c4e326b2e2dbfp21 ++0x1.7e4f6774b8a2ep-1 ++0x1.1ab614657417dp98 ++0x1.f3e634c32e8b7p3 ++0x1.e9e836b498598p-9 ++-0x1.1c64235980810p10 ++-0x1.aafc1207ad818p-2 ++0x1.9f3d233a5c111p-5 ++0x1.7999c2260403cp31 ++-0x1.f30211be994f6p24 ++-0x1.0c43722a9bbbep-6 ++0x1.930ee35921be4p-1 ++-0x1.5d6213b5f1254p22 ++-0x1.7d22615123c54p1 ++0x1.83b3112e046efp46 ++0x1.f41974f304112p603 ++-0x1.3a66e15aa8fe4p20 ++0x1.a13001aba9f6bp852 ++0x1.412aa2c7532c4p-14 ++-0x1.c81352e8264c2p23 ++-0x1.591d02625a9b5p22 ++-0x1.c41166b01542dp20 ++-0x1.5131d3c932102p2 ++0x1.3e0812627d769p0 ++-0x1.42230381aec5ep24 ++-0x1.f2b3323fb84d7p10 ++0x1.eb6774d11a107p309 ++0x1.66bfe7efc9981p413 ++0x1.7393b483ef4c9p18 ++0x1.1c23a0ccf4a1fp5 ++0x1.f726a29f3c7b0p-1 ++0x1.56a6c4b8f4c03p0 ++-0x1.d81fc1be44ccap0 ++0x1.acb2a2c71b283p0 ++-0x1.fc027711d2a95p42 ++0x1.fc337688991dap0 ++0x1.199a1661ea960p13 ++-0x1.3b86d2611c320p27 ++-0x1.61c2d21282edfp26 ++-0x1.64e50317eefc2p785 ++0x1.def315b3fe290p780 ++0x1.cf1e17c160022p-18 ++-0x1.38eda7d8530bep24 ++-0x1.808c94ffe4d91p-1 ++0x1.4610f3e719abep7 ++-0x1.1e9381dc4ec70p-11 ++0x1.43cba0bf131a0p13 ++-0x1.dc42b575ed4d3p1013 ++-0x1.6ed8149cc7bc6p-1 ++0x1.4a60f7c0d69e4p13 ++-0x1.538585ddb4696p23 ++-0x1.0864d6a255b66p19 ++0x1.fbb200de88ab3p20 ++0x1.0121e4f96ae33p19 ++0x1.d249f66c94efap-26 ++0x1.f22cd10757b66p-17 ++-0x1.dc648333c448cp28 ++-0x1.bd93661102aabp6 ++0x1.111ac7383f502p24 ++-0x1.2b702455abc46p3 ++-0x1.0a6586568a0d4p0 ++-0x1.66ac624962909p45 ++0x1.28169042cc3a5p12 ++0x1.f66474e488ef9p22 ++-0x1.9537062a41765p14 ++0x1.c121e1e9723f6p-20 ++-0x1.9f26e345e6c69p45 ++-0x1.c04f565228f00p23 ++-0x1.3f2a165966b01p14 ++0x1.e49031acb773fp4 ++0x1.45d4862b31a5dp14 ++0x1.d3f8a349399cdp651 ++-0x1.95bf4422cf479p21 ++-0x1.5e80e7683c406p38 ++0x1.cf9e839f22581p-13 ++-0x1.bcbd040073ae7p42 ++0x1.0dbf80c846440p1 ++0x1.b967a548e9278p25 ++-0x1.09f7d6e2794a9p36 ++0x1.f52b73cf4435bp957 ++-0x1.7bc586cbd1a46p12 ++0x1.ec2ca0ba0169fp956 ++0x1.7b4ec7011ab15p-14 ++0x1.9590d2642b855p2 ++-0x1.1792b47e89a3ep-2 ++0x1.096e8355c6a33p387 ++-0x1.0309a65ffc7d0p389 ++0x1.bbe450a514bbbp23 ++-0x1.c2a0c154c1ea8p22 ++0x1.8c8840b2a87e4p-1 ++0x1.bc053744b4d71p525 ++-0x1.0bad1023cf416p26 ++0x1.6c74f2f70249fp-2 ++-0x1.df29e2bbca95ep-20 ++0x1.541ef0a6c96dap25 ++0x1.228634785edb5p959 ++-0x1.2e5246cb79ea9p-2 ++-0x1.e27d61cf42df9p-1 ++0x1.92d2218c0d244p-3 ++-0x1.28dab0f8375dbp19 ++-0x1.6a69c59ed57f1p24 ++0x1.bc5c338bdaad2p9 ++0x1.1b86b1509d103p-2 ++0x1.96f70720b437fp-1 ++0x1.ec2dd7a3ff01bp11 ++0x1.6d674707f674dp24 ++0x1.8ccc84df77093p467 ++-0x1.fce2734699b46p131 ++0x1.78c0233339f48p-24 ++-0x1.10d36236e14f4p-22 ++0x1.0e5087309073ap0 ++-0x1.964d52d42dd8bp184 ++0x1.ae23e780b9411p-21 ++-0x1.54204161ed466p836 ++-0x1.954a4649af744p41 ++0x1.bdbbb7d31f152p-1 ++-0x1.56e0943fe5998p-22 ++-0x1.36a8e4332551dp927 ++0x1.020b52f89937ap23 ++0x1.d7a20332bdd63p11 ++0x1.3b0dd5979b6adp-2 ++0x1.c0e8434f16674p-10 ++0x1.87e7f538c365dp25 ++0x1.d3e821a1bc5a8p7 ++-0x1.96b7d456e788bp25 ++-0x1.3ad9e1e70f896p943 ++0x1.53ee76bc80972p-3 ++0x1.96fa10c429e87p-9 ++-0x1.8056956d2cfadp24 ++0x1.c741b2b122791p6 ++0x1.ba3a96c89b1b3p166 ++-0x1.83990344b014bp766 ++-0x1.3e571252648bap15 ++-0x1.3bb1972c795a9p9 ++0x1.adb4d3351c887p43 ++-0x1.ff802660bf9a5p0 ++0x1.6e469006517f7p47 ++-0x1.900d500fb6d49p26 ++-0x1.c76ab659c3834p25 ++0x1.e521b219c20dbp-7 ++0x1.921a034787ed3p10 ++0x1.e995010c15b21p8 ++0x1.8c2b466dd9540p47 ++-0x1.04c05174f23b9p12 ++-0x1.93b6b3adbef7bp392 ++0x1.c56de7617c8d9p-1 ++0x1.5160533d35ef7p19 ++0x1.e130936be6602p-1 ++-0x1.739414d989802p16 ++0x1.31b1d2c632ab2p-1 ++-0x1.c31d635f38768p22 ++0x1.bbb4f5b78c9c5p32 ++-0x1.e445c444330bcp388 ++-0x1.8c4be45fbe950p-1 ++-0x1.837291c50b911p-2 ++0x1.a8e1958326948p22 ++0x1.3489902ffcd05p89 ++0x1.3937a140c8ebdp102 ++0x1.6e18d2c91a6ddp-1 ++-0x1.ca05a2df5e759p-7 ++0x1.2cfef3c22cd0bp130 ++-0x1.4cf717964a9bfp7 ++0x1.54579498874b1p24 ++0x1.c107738f9b691p12 ++0x1.7bff9229e04d2p-2 ++-0x1.d03de2576ff0fp3 ++0x1.5f7b7021a52d5p45 ++-0x1.1942d4250cc59p402 ++-0x1.e0e3e37700163p34 ++0x1.e9b38334f06d3p655 ++-0x1.58ee600866d4ep189 ++0x1.5ef6e7cc455f0p289 ++-0x1.2c28461a00b92p4 ++0x1.10d365a1e8d8ap21 ++0x1.468d92dd56b89p7 ++-0x1.6abfb0ce30badp23 ++-0x1.5f89a14d0efd0p-2 ++0x1.15d3e3cd4669ep539 ++0x1.4713f780aa584p-2 ++0x1.3b21b2c71e99bp26 ++-0x1.48b56671059e1p-11 ++0x1.1bc1d481ce9dbp69 ++-0x1.b1ae27d09baa0p-2 ++0x1.33d7670cbf8a4p8 ++-0x1.6ac4255cad8dfp-8 ++0x1.62dab6f6b3009p34 ++0x1.425c721226be2p442 ++-0x1.275535869b097p9 ++0x1.ecb7c62bea980p0 ++0x1.bbcc660f5e0a8p15 ++-0x1.1f9e74b3579c2p0 ++0x1.fd7275569c113p36 ++0x1.dea7467ccaa26p-2 ++0x1.a791b0a57606ap24 ++-0x1.82cad3f8be955p22 ++-0x1.4157360076d26p-1 ++0x1.c97d10ced4329p0 ++-0x1.932787d6383efp2 ++-0x1.c01812d3d51a9p-2 ++-0x1.1c84d6fec1316p609 ++-0x1.0f01559dc82d6p-25 ++0x1.00f5458920f43p4 ++-0x1.43719306d3215p1 ++0x1.c656d370d0ffbp354 ++0x1.0e11c40e388b9p26 ++-0x1.290134e6aff9cp35 ++0x1.1040550bddeb0p-9 ++0x1.9a7781da48013p4 ++-0x1.0a9e5772e3233p-8 ++-0x1.0d91b0bf21e8ap-1 ++0x1.948055d3de56dp27 ++-0x1.3e88a1b46969ep40 ++0x1.bbcbb014c46c2p10 ++0x1.e9d0279c4b0a1p20 ++-0x1.b6238112f8687p398 ++-0x1.e242654542bebp-11 ++0x1.a762d2287829dp988 ++0x1.9bd01053b4464p8 ++-0x1.f8cd636f4e283p837 ++0x1.aa1c81bd7973bp47 ++0x1.970f71af84cc4p21 ++-0x1.aeb236cb2b17ep431 ++-0x1.93c0e6c9d5101p4 ++0x1.6a8314d7ab46ep14 ++-0x1.dff0340ed9b5fp23 ++-0x1.20d4206297414p0 ++-0x1.bfe4e19c4431ep16 ++-0x1.e364e69ce1acbp-2 ++0x1.da3807b2bef2cp5 ++0x1.7d5bf5fdf17d8p3 ++0x1.403cb40fa6ed7p-2 ++-0x1.e5eb014cd4696p-2 ++-0x1.12c867efadb58p-1 ++-0x1.17b9111cd2dedp47 ++0x1.5fbd06f46a166p20 ++0x1.3fa931008c3ddp12 ++-0x1.671603ed400c7p39 ++-0x1.f3a3f55752ffap381 ++-0x1.06d0b08cc2f3ap19 ++-0x1.20f970c57de9fp405 ++0x1.26bca4618e8c6p450 ++-0x1.e84bc67cbae25p21 ++-0x1.847b219c71e8ap-19 ++0x1.6485a7df487c2p-5 ++0x1.79e9b12eaade0p0 ++-0x1.ea3177ec5e17ap1 ++0x1.9061b7ce1ba79p-11 ++0x1.aabb7153d3d41p0 ++-0x1.cd05349e06fb9p453 ++-0x1.387bd166fd5c6p6 ++-0x1.5b7dc65df367ap16 ++-0x1.f014b7e23834fp0 ++0x1.be4041821c70ap5 ++-0x1.bb11127a3673ep-2 ++-0x1.69b7a36b6d3a1p44 ++-0x1.d182b403ec2d6p435 ++-0x1.fa162577a34bfp356 ++0x1.837c5378cbac9p1 ++0x1.f6aa460693a38p25 ++-0x1.30e5c6ba6d18bp0 ++0x1.f26723819b91ap-1 ++-0x1.a81dc27444846p14 ++0x1.3ec314460be45p-21 ++-0x1.a92ed0de504fdp25 ++0x1.026645ce3b546p5 ++-0x1.d783568871061p-20 ++-0x1.94e5527db2c75p27 ++-0x1.67f7371aa18ffp23 ++0x1.d3c365bbdea80p4 ++-0x1.9e1a5225f6428p211 ++-0x1.258ad3e2c8fa6p28 ++0x1.3136354b964fdp-2 ++-0x1.96d4f40d26403p10 ++0x1.095bd56107f24p5 ++0x1.9fce92abc33f3p19 ++-0x1.ce7553d981cd1p-1 ++-0x1.e601531fa6475p22 ++-0x1.6ab42170809bcp2 ++-0x1.b251d2575cac5p-18 ++-0x1.4c41d161ca889p-20 ++-0x1.1072d2e8dc7acp42 ++-0x1.59f0d7ec9545cp27 ++0x1.60e971fce2225p-1 ++-0x1.cae6a23b7284cp7 ++0x1.65457653e73cep10 ++0x1.e5d2c1b0f8814p-6 ++-0x1.2379c4cafa4c7p2 ++-0x1.a10a970cc1572p1023 ++-0x1.ca2f3652ecb2bp0 ++0x1.eef9a3fc5f760p19 ++-0x1.e34471bd585d3p0 ++0x1.c01c5448e8150p12 ++-0x1.bc8e94cc562d0p-1 ++-0x1.df2934c9a3eb9p-19 ++0x1.932107520d49bp0 ++-0x1.664d64c583dc0p26 ++-0x1.df503401587dep23 ++0x1.ff26b5f73eb26p0 ++0x1.223f61fd260f6p15 ++-0x1.388ca56b6eb09p-9 ++0x1.c843f6cbf0218p0 ++-0x1.5b55b55f69e3dp12 ++-0x1.55d2b6c9ccac1p-17 ++0x1.8fab8647c1b20p25 ++-0x1.c39c1323c517cp26 ++0x1.9b8cb5c150892p567 ++-0x1.075482bdba47ap11 ++-0x1.9eb9c5f4e9bfep-12 ++0x1.9301916eb43c8p-2 ++-0x1.8b05471774a4dp36 ++0x1.0cd1f741bc013p-1 ++-0x1.4dcce7d816178p952 ++0x1.5bb4d5a081463p313 ++-0x1.512e913b3aec4p43 ++-0x1.4363149bdc7b9p13 ++-0x1.363bc2214c09bp1 ++0x1.773a72172fd88p-1 ++0x1.585f6579ec411p13 ++0x1.d5f6f68d24a76p-2 ++0x1.69fd3358c8b0ap-23 ++-0x1.a4b6f1189e5dbp6 ++0x1.0de1b1a9735c3p-2 ++-0x1.dce0808027bddp22 ++0x1.0e7ce079de804p-8 ++0x1.9f5a738b4d6eep-2 ++-0x1.8462d5daae41ap11 ++-0x1.68674675a393bp24 ++-0x1.e10d4227c6195p-2 ++0x1.9efc93f7ae5e0p856 ++0x1.b21722c3599a5p998 ++-0x1.9230777d2e819p2 ++-0x1.234b04e484f07p-1 ++0x1.f0a83169e44f8p21 ++-0x1.551ab52bbf836p10 ++-0x1.954191e744c98p778 ++0x1.2b5df36e4639ap687 ++0x1.6febe142407c9p-1 ++0x1.b0a7d19a8a36bp14 ++-0x1.283335399df8ap582 ++-0x1.ff008550804a8p21 ++-0x1.7b3e67a391ce4p23 ++0x1.1d85929407a6dp24 ++0x1.5da834d23e5a3p447 ++-0x1.4692871c1db20p8 ++-0x1.afc295fcdbcb4p12 ++-0x1.9f23a78c18795p-1 ++0x1.6080b280acfddp17 ++-0x1.2e5266ef4d581p26 ++-0x1.24b7b38d26da1p257 ++-0x1.c53977510263cp4 ++-0x1.fb19403b773a8p-1 ++-0x1.244143543f68cp-9 ++-0x1.de8675a5953d7p-10 ++-0x1.127a02301391cp25 ++-0x1.e81cd0632e8f1p-6 ++-0x1.8f0832d2d654fp23 ++0x1.8d0592c41d57fp-1 ++-0x1.5bb7a2c85295ap829 ++0x1.5d0f05a6628d0p33 ++0x1.0fa8504e8dc88p26 ++0x1.efa587af6be2ep1 ++0x1.0e33b1aa5c9bap7 ++0x1.2910965c221adp24 ++0x1.7117912e9cc38p-19 ++-0x1.14f1f66cce91bp309 ++0x1.253d965df51d6p-2 ++0x1.c129f2121f395p8 ++0x1.725be7dae8d66p19 ++-0x1.93edb5e7fb6cfp5 ++0x1.5018651cc719fp-1 ++-0x1.cb02c64f918bfp46 ++-0x1.f46340a22bb84p21 ++0x1.8f68f646ec9f2p43 ++-0x1.6d9a331135c58p25 ++-0x1.170ac534d5637p44 ++0x1.a4a742eb49b6dp25 ++-0x1.7020056638407p607 ++0x1.48deb525372e9p-1 ++-0x1.33e8601f36771p-1 ++0x1.ec3874c4618a1p96 ++0x1.fc37d39694eb5p39 ++-0x1.ff4071cb454c4p10 ++-0x1.ed9d16ccafc18p730 ++0x1.7745c1d7844b9p-2 ++0x1.577ea4e34c3b6p437 ++-0x1.3207305c1a799p0 ++0x1.0917100431cc1p-21 ++0x1.2c183093fa529p603 ++-0x1.2c5d51ba70531p14 ++0x1.608c1509bfa83p148 ++-0x1.f839c173e805dp14 ++-0x1.98e12705bc31ep995 ++0x1.3a50f5332c5c9p123 ++0x1.a3c53078bbb14p14 ++0x1.7774161aba4aep38 ++0x1.f77d9613e7c1dp-1 ++0x1.087e662e1679bp0 ++-0x1.f6a5441a51460p9 ++-0x1.943ec15bcfd0fp-24 ++0x1.ca08a5623522dp836 ++-0x1.b94390a4ec03bp21 ++0x1.f028210e4643ep86 ++-0x1.a08b00ea57565p0 ++-0x1.d32a26194266ep33 ++0x1.f9c00577e6bdap14 ++0x1.2aa9d7f90174dp-2 ++-0x1.a73675bf09391p24 ++0x1.8e42320f970aap-5 ++-0x1.456e713f4c160p26 ++0x1.0a7c735c32ef7p370 ++-0x1.599d856aa3f83p126 ++-0x1.a2aeb2b04f0a4p-1 ++0x1.1b9611214c8efp38 ++0x1.b79443495fae2p555 ++0x1.bb96e62f437c0p449 ++-0x1.d8628272405eep331 ++0x1.3e7d077075b34p3 ++0x1.f02863b1964cfp-18 ++0x1.bc64148bb2bcbp963 ++-0x1.abbfa06274d7ep-2 ++0x1.4124c7371ae20p-12 ++0x1.01bea1cd85371p-2 ++-0x1.86f4c7d558b23p365 ++-0x1.2d7045098fc2bp6 ++0x1.12cdd38e1f1fcp40 ++-0x1.cf87f031ba281p-1 ++0x1.900f77d2e17b8p-3 ++-0x1.780482ed78ed2p0 ++-0x1.c0b7e330a1569p622 ++0x1.e964c06440769p21 ++-0x1.0575c6582a7e8p219 ++0x1.014cb3689dba2p364 ++0x1.757270c3f8b5ep6 ++0x1.f4b96482cda61p25 ++0x1.b56110293d311p31 ++0x1.c319d66d3a8c0p-15 ++0x1.42d33307c41bdp14 ++0x1.ea5575e42d23ap17 ++-0x1.a6e025cb863c7p0 ++0x1.cc5d70ede499dp27 ++0x1.e359a47239531p0 ++-0x1.d8d93754b2b11p29 ++-0x1.8ca7b5053585fp1000 ++0x1.d9d5310c25ca5p-1 ++0x1.8d9430af4511fp961 ++-0x1.66d8a6638d99bp512 ++0x1.b41ad75a8801bp9 ++-0x1.6a1f971fa26b6p-14 ++0x1.ab5c81ae14fe6p-1 ++0x1.1f8577d10b9c5p971 ++0x1.cdd440ab2d669p9 ++0x1.4951f5844ad5ep4 ++0x1.ec76109115f59p10 ++-0x1.5e9a80ad92f6cp0 ++0x1.a0e386b6ccb40p253 ++-0x1.987135136f652p-15 ++-0x1.4972078157c11p18 ++0x1.71af54cd3edcbp-22 ++0x1.2cb9c16feca61p4 ++-0x1.881612ba1bac0p23 ++-0x1.a1bc462181294p6 ++0x1.59e7f20d1a85ap20 ++0x1.6efbf694bc721p795 ++-0x1.194d02c8696c5p1 ++-0x1.c29f770300210p40 ++-0x1.465474694864dp5 ++-0x1.be79c39a626abp-2 ++0x1.a84f059ce3c46p0 ++0x1.7aa4e54b620c4p8 ++0x1.3da7c7bc6677fp-8 ++0x1.f69225fe61ad2p28 ++-0x1.64de33982551ap-1 ++-0x1.914f65e648df9p27 ++0x1.8a6b04c753621p4 ++0x1.9bbe37ce952f4p151 ++-0x1.dde326d0cc835p989 ++0x1.98c0d3cdf20d3p21 ++-0x1.284c014de6027p-7 ++0x1.88d835cac3b12p0 ++-0x1.b6db809206af5p2 ++-0x1.e565b22e34e93p32 ++0x1.749c6053c4d99p27 ++-0x1.117985fc29082p-3 ++-0x1.4aea6753378aep18 ++0x1.e0dab03922291p582 ++0x1.6215370395220p-11 ++0x1.c6fd922332304p23 ++0x1.634a06577ffe6p14 ++0x1.7a0794ef5f1b2p-17 ++0x1.12abd5b589964p-2 ++-0x1.7dc825820bbc5p-1 ++0x1.8dac9227f7521p19 ++-0x1.152a74beb6671p0 ++0x1.91c8274862218p-1 ++0x1.6b46c437366a9p2 ++0x1.91be1642b829cp-4 ++-0x1.9bbe55e1e875bp0 ++0x1.cf53d39670350p30 ++-0x1.6106a19021fd0p25 ++0x1.b4f8156fc19c5p951 ++0x1.e681709062081p40 ++-0x1.d940928c3f987p2 ++0x1.691480d2f533ap737 ++-0x1.85c093aaae1ecp900 ++-0x1.5affb35c6bf7fp26 ++-0x1.dc84061a932cfp17 ++0x1.ee1e42315879ep25 ++0x1.678d23f005c62p764 ++-0x1.ec9774244565cp535 ++-0x1.9271662cb2093p16 ++-0x1.f83131ca71ccdp-17 ++0x1.ca7930f286682p13 ++0x1.a7255589c90d3p-11 ++0x1.53ac82fd92bd9p14 ++0x1.a47a64b427441p43 ++-0x1.3a1722f39b3dep25 ++-0x1.9f33140b8a810p312 ++0x1.d03d52df1c72bp688 ++-0x1.1c6fc748fa1e5p43 ++0x1.0b3414a9938eep2 ++0x1.dd0da78a5d1d8p633 ++-0x1.4c4580f79db55p36 ++-0x1.92c9b7d98ad52p16 ++0x1.33a582ad335b4p8 ++0x1.8412d4cdc4b13p2 ++-0x1.6d70c0e74843fp-1 ++-0x1.094ee77340bdep25 ++0x1.29f1d2a5785f4p1014 ++-0x1.d15b11be3fe7bp7 ++0x1.58a4143823bb5p291 ++0x1.902405ab3dbd7p-12 ++-0x1.927bb2a52a3a0p22 ++0x1.72dfe5a32fb2bp26 ++-0x1.84fd5529c70e0p-2 ++-0x1.309e3082bb94bp3 ++0x1.1f345701b89f5p1 ++0x1.7dad63072bcb5p20 ++-0x1.ade4901d73471p99 ++-0x1.c22aa72bdcd7cp-24 ++-0x1.f59845faa6563p18 ++-0x1.ad6e102c9bc28p18 ++0x1.0fb34286e7064p0 ++0x1.94a631bd3477bp-13 ++0x1.210a974f1dccfp10 ++-0x1.2e4bb56104384p0 ++-0x1.baefd380be2d4p9 ++0x1.ed1987f86a22ap36 ++0x1.774a94a24ef7fp21 ++-0x1.2df7e52525ce2p23 ++-0x1.b56ff18142c84p244 ++0x1.5cf265da00a46p0 ++0x1.2301239fc121cp8 ++0x1.422ed28d49c39p695 ++0x1.737c10c4444c9p-15 ++0x1.2d1c455042173p729 ++-0x1.7ab92567a3677p47 ++-0x1.a93bc46c3f91cp-1 ++0x1.a84da7b1e13e8p764 ++0x1.01b0716556196p7 ++0x1.9279d0b582281p52 ++0x1.87062189adde4p283 ++0x1.1b0bf0a2108b2p36 ++-0x1.5eb4d47d17207p46 ++-0x1.2d48f70490ef9p41 ++0x1.02a927e62e4ccp229 ++0x1.64ece5d8585f1p-10 ++0x1.f348233a76acap526 ++0x1.18ae26a877ec0p-2 ++0x1.f29784bc68275p47 ++0x1.6001f45f7971bp12 ++0x1.a22b2698b25fap352 ++-0x1.e03a853c027d9p29 ++-0x1.a95c30e27b155p978 ++0x1.54ba70dc907bbp8 ++0x1.2973942fbefc1p-2 ++-0x1.d880a44876022p-2 ++-0x1.5714a530cbfe6p-8 ++-0x1.cafc377dc6968p152 ++-0x1.d75a05f2b42e7p32 ++0x1.457431b89e9fap-1 ++-0x1.1459601867581p0 ++0x1.d012824c3e9bdp-2 ++0x1.cba0151869ee4p-15 ++-0x1.28514551cf3c2p41 ++0x1.1a8f5790ecb1bp-2 ++-0x1.e3ca859ef8af9p-20 ++0x1.61d8824c0577cp17 ++0x1.0dbc60263979ap0 ++0x1.13ae60bcf616cp11 ++0x1.2b64749c50115p1 ++-0x1.d4d6b06398109p6 ++0x1.62482046dcfa3p-10 ++-0x1.144d5089806e4p0 ++-0x1.2a84e1516c3b9p-3 ++0x1.a4a9c383e277ep15 ++-0x1.b6a4a184f369cp14 ++0x1.0934a50d726c4p-2 ++0x1.9fac46d3bac78p-2 ++-0x1.0f3d41801c34ap830 ++-0x1.ddf6e4b3ae58dp14 ++-0x1.f8c654fd8faf6p578 ++-0x1.83e3d444fb99cp9 ++-0x1.29462350fde9fp18 ++0x1.c2d23298201f5p32 ++0x1.38dbe21a97dc9p765 ++0x1.b0ff117ae0c79p4 ++-0x1.936ba48a606fep-8 ++-0x1.5ed053069752fp9 ++0x1.73c4c4bf7d0eep5 ++-0x1.e7005748bed43p-1 ++-0x1.5f9f348eb0d61p-14 ++-0x1.fd0626e287666p-10 ++0x1.272f865f58d3fp1 ++0x1.89aa61b27b617p19 ++0x1.d3c0a3db910c4p703 ++-0x1.28c846d807abfp17 ++-0x1.ff57f267de4afp650 ++0x1.2f37531444d22p-1 ++0x1.295914905d114p-2 ++-0x1.a2cc76af10462p-2 ++-0x1.7e2a733986885p-12 ++-0x1.b026f4918478bp581 ++-0x1.940790b8f17d3p-17 ++0x1.0bea736dfa349p20 ++0x1.4c5ab26cb0893p17 ++0x1.cb8c42b26858cp4 ++-0x1.65eb419220961p8 ++-0x1.49628342f28b6p25 ++-0x1.0b70b20ac9274p-17 ++0x1.22d8177d1ee00p1 ++-0x1.df4a5041f3718p-24 ++-0x1.ad8cf7fdfad7fp-1 ++0x1.a24842645f612p5 ++0x1.36eac1a4ee651p13 ++0x1.f72fc2f8c5b6cp0 ++0x1.60901647c0c3bp18 ++0x1.983594e2c3028p2 ++-0x1.ae2e63b37144dp-2 ++0x1.63d9f29bc831cp3 ++-0x1.3f91157ed1b34p30 ++-0x1.f6a1a206c06cfp791 ++0x1.e5ba950e3dd7dp9 ++0x1.3db5f00ed6a5bp-2 ++-0x1.e758d3fa84fb9p14 ++0x1.26a215493eb73p-1 ++-0x1.9fbdd53b4633ap25 ++0x1.c6bd362b83b42p28 ++0x1.a57c06d6537a5p-3 ++-0x1.4d5ac675483eap-1 ++0x1.1b5483494381dp10 ++-0x1.a5e0731359db6p-17 ++0x1.d3285119915d0p-1 ++-0x1.9be71114e21b1p18 ++-0x1.ea8b7689adf04p125 ++0x1.78fea6e183fbep3 ++0x1.f0cf91eb94836p278 ++-0x1.3306524c34930p191 ++-0x1.4a2f071f69873p17 ++-0x1.ff2122f77561ap-2 ++0x1.511377046730fp229 ++0x1.14d73581dc669p976 ++-0x1.eb7e33dcfee72p35 ++-0x1.f4dbe5a5ff877p6 ++-0x1.d825938e1c238p6 ++0x1.5f0be541c74cap-6 ++0x1.079e24e0494c1p18 ++-0x1.34a8d3f3b42a6p901 ++0x1.34dc83fb0c6e7p-2 ++0x1.cf75150d00db1p0 ++-0x1.f031f0e0356b2p882 ++0x1.6b7973cd0aa93p862 ++-0x1.310095a968ce1p-2 ++-0x1.2866d1eec6cc3p-16 ++0x1.8191b0738f308p613 ++0x1.456f53f700f99p7 ++0x1.62847459e8128p183 ++-0x1.ba63e002b502dp-1 ++-0x1.1fc736191f77ep2 ++0x1.37572263819e5p-2 ++-0x1.7ae3b64ce441bp0 ++0x1.202e1625823d7p11 ++0x1.789183b6d53c2p33 ++-0x1.9f1015a572e03p27 ++0x1.ac19f4c66f202p21 ++0x1.3ffd935b47f14p827 ++-0x1.21ec60724c4d4p-23 ++-0x1.7d92c063e1943p794 ++-0x1.3329c4f9bcf9fp-1 ++-0x1.fb79b1e12f1b9p-1 ++-0x1.b453f204e2828p572 ++-0x1.05e91426fc791p287 ++-0x1.a0aca06187ac4p-2 ++-0x1.944d07402e20dp10 ++0x1.8b84302c454dap-1 ++0x1.57da67e840d07p-2 ++-0x1.5e139699b437cp0 ++-0x1.9611421dfe9a2p2 ++-0x1.dfe0a6790c2a1p15 ++-0x1.8d68a527dc4fep9 ++0x1.75d6920bfd64fp1 ++0x1.6ea3c72a463d9p0 ++0x1.017036841b9aep45 ++-0x1.b24cc456e7eecp11 ++-0x1.8fddc0abaff9ap16 ++-0x1.2415b665f8c99p26 ++0x1.8e6f32ff35e01p12 ++-0x1.e26252412c215p-2 ++0x1.955a700a5a653p-8 ++0x1.0ea7178825459p46 ++0x1.296d37b08b64ep140 ++0x1.166047ebdfbedp977 ++-0x1.4bcc33f01f7a1p36 ++-0x1.98d541beb3ab0p367 ++0x1.d75a350666c4ep36 ++0x1.c04822eb730fcp105 ++0x1.da66e151417f3p296 ++0x1.cb5376938dbe0p20 ++0x1.2bf8f7b48e8f0p15 ++0x1.8258537a3087ap19 ++-0x1.3f6af42d9b4e8p19 ++-0x1.123aa03954350p38 ++-0x1.768367b440c00p2 ++-0x1.406233b0d0f57p1 ++0x1.d8af4507de888p270 ++0x1.1ed46343e62d9p16 ++-0x1.0d2394e306c24p25 ++-0x1.2a47265c02b22p13 ++0x1.67f5d015d7adfp-2 ++0x1.6c7e32a8599bep24 ++0x1.4ff3f3faf1308p-17 ++0x1.6035a2fc3ea56p-2 ++-0x1.e85e0106abbc3p764 ++0x1.86eae4c63027cp-1 ++0x1.c79935bc19ae9p24 ++0x1.a99b811fcf714p-3 ++0x1.dc958723955fap32 ++-0x1.f256339f1d6d3p-1 ++0x1.fb29c0800abbep8 ++0x1.bfad063d46fa8p37 ++0x1.12b4c290f307cp0 ++-0x1.8cd584141bce7p26 ++-0x1.ba60a391b830dp4 ++-0x1.56d524c7c30dap41 ++0x1.6ffee3009fd2bp26 ++0x1.8bb180dc99719p8 ++0x1.6e1fe42f432d5p-10 ++-0x1.37a006c891712p46 ++0x1.2f1c942c39c55p402 ++-0x1.238be2f2d8cf2p863 ++-0x1.2b9d539b3b59ap21 ++0x1.73b8e458a50b9p21 ++-0x1.2768e227b49b5p-2 ++0x1.1516936960c2ep26 ++-0x1.ddde71ae89716p47 ++0x1.cde9e237806c8p332 ++0x1.14df62ffadc86p22 ++-0x1.cef3d59d11bbfp0 ++0x1.147587cc39596p11 ++-0x1.184116faeabd4p6 ++-0x1.52c9054a194efp532 ++0x1.00f111e190f7cp18 ++0x1.d7f525064b7ccp536 ++0x1.0d44e7cc02644p100 ++-0x1.16d8e062f9b27p33 ++-0x1.57b431dc4ddc9p-25 ++0x1.b6ece13eb981ep-18 ++-0x1.ef7cd24e26cddp28 ++-0x1.bedb764df5e91p14 ++-0x1.7a53f5bc491f2p-2 ++-0x1.c75c474186d48p-21 ++-0x1.7948a2340f8ccp27 ++0x1.7f28459c4c5b7p-3 ++0x1.7dba412384bdap24 ++0x1.f1a1763482009p751 ++0x1.e89f662826886p703 ++-0x1.cac75138c3526p13 ++0x1.39e786d2dc05dp9 ++-0x1.c0de8654d9d2cp-23 ++-0x1.b5b83454d5726p24 ++0x1.dfd9b4f326a02p9 ++0x1.5a792494bf6a7p602 ++0x1.c4f9f5fc40745p-1 ++-0x1.dec4154d34035p22 ++-0x1.d20985b372880p13 ++0x1.e08322497ccc7p34 ++-0x1.088f34cbb4570p-3 ++0x1.153a418434cf5p-1 ++0x1.e10de5e9186fep0 ++-0x1.dd6d97c9413f8p14 ++0x1.2386d6bba99b2p22 ++0x1.feb6a2da00daap-2 ++0x1.e1ce1507325e8p33 ++-0x1.282147169eea5p755 ++0x1.bb36d35a952fep-2 ++-0x1.f78ac5d6e92e7p31 ++-0x1.3fbb37d76149cp464 ++0x1.c565b245f458ap-2 ++0x1.63dd7410e99b0p46 ++0x1.374ad2ddaa195p20 ++-0x1.7679872738853p47 ++0x1.9d2e621a95f51p10 ++-0x1.63681742e61f1p160 ++0x1.723377f56685fp25 ++0x1.d4b42063b45aap-10 ++0x1.faa64445b0a9fp5 ++0x1.9f13f08a2c68cp24 ++0x1.5e08863f90e4ep634 ++0x1.3520f14a3d100p12 ++-0x1.6dec1180c4a30p23 ++-0x1.363ad7dd94e15p91 ++0x1.957711c469872p4 ++0x1.6a78174e047cdp283 ++0x1.e9ce64d645dcbp25 ++-0x1.aa5cc3fc79e94p540 ++0x1.313657c5c4981p298 ++0x1.6c129238ecbdbp0 ++0x1.817ff5141d57ep0 ++-0x1.a1a6536a8fe4cp926 ++0x1.bbd8e12bdc612p0 ++0x1.1a0a03f67cd7bp2 ++-0x1.415d0133cd310p2 ++0x1.08b0c1e34b29dp35 ++-0x1.e428432cbb7d5p9 ++-0x1.b9bd67795f0c3p0 ++-0x1.a893152e49e16p5 ++-0x1.e81760a539c99p33 ++-0x1.9d53d5c59a937p38 ++-0x1.cefea277671d9p11 ++0x1.ff43248d63df5p24 ++0x1.593914af16198p-21 ++-0x1.f34910fa15b18p0 ++0x1.58dab48d5e553p0 ++0x1.0a37f2b44bad6p35 ++-0x1.fc5f828ec77eap-15 ++-0x1.6592d152f9b08p472 ++-0x1.85a5754cd7c5bp12 ++-0x1.3c3e25ef48b5ap726 ++0x1.d27767aecb29dp5 ++-0x1.ee967500bcd88p19 ++0x1.be64452b706aap-2 ++0x1.9406e7378ff47p3 ++0x1.ca3c24bcd59c8p25 ++0x1.407c766a773cdp29 ++0x1.26ef70700dfa8p789 ++-0x1.b493b77a34bb6p-21 ++-0x1.2d5334bdb970ap3 ++-0x1.f31ed51dda243p-1 ++-0x1.561677af890b4p-2 ++-0x1.52ad65df5e675p29 ++-0x1.46d5938b70d32p22 ++0x1.bd8b859bdf9eep23 ++0x1.a515f6afc22e2p8 ++0x1.697520652bfd6p-1 ++-0x1.cca3159203943p11 ++0x1.c7a4967c92f5ep21 ++-0x1.e4076083ff124p118 ++0x1.4795b3dc73be5p21 ++0x1.4f5cc76450352p25 ++0x1.5d66d43044e72p-12 ++0x1.6e6e764a0b517p376 ++-0x1.3c2c46d020cafp0 ++-0x1.71878383e54a0p11 ++-0x1.90106128d6098p13 ++-0x1.345da3083c0cap37 ++0x1.1f3a52c232082p1 ++-0x1.b387718274c28p28 ++0x1.c4c15722ddd7dp4 ++-0x1.c67b533fc5d98p18 ++0x1.9ec4236ad4513p0 ++-0x1.262a57b5908ddp581 ++0x1.138ff2f62ed96p924 ++-0x1.2a3377ef850f0p9 ++-0x1.558bc5f67ee33p-14 ++0x1.e888750254606p-22 ++-0x1.f9d0d50d11f2ep37 ++-0x1.777ae766c28a2p29 ++-0x1.09e346e656647p17 ++0x1.eb546416c8f84p293 ++0x1.174e663e83926p36 ++-0x1.ba27457883c9dp-13 ++0x1.0e21179146e72p1 ++-0x1.dc30b5c7227e5p-1 ++0x1.1c5330a65cc14p-23 ++0x1.776655ee11a36p634 ++-0x1.4c06c77fa9d4cp21 ++0x1.0d94e52fa5002p19 ++0x1.7401000fb7cacp24 ++-0x1.d7d3544b26309p0 ++0x1.93c922c6fe31ep-2 ++-0x1.a3a0a3914f51ep-1 ++-0x1.4059b70d2e1ecp24 ++-0x1.8d2e12a9a241dp38 ++0x1.0a7df2e2ab942p296 ++-0x1.8b1a329e5ca50p0 ++-0x1.006b53dc2aef5p1 ++0x1.e69e734d01bbep21 ++-0x1.8586769b7591ap20 ++0x1.e609e60aa3770p804 ++-0x1.f62974bd1fcbfp13 ++0x1.c487460dd09fep7 ++-0x1.301c302e779c3p20 ++0x1.c142e3e9c59afp-1 ++0x1.37b9223a076c1p0 ++0x1.9ed467a1acc4ap7 ++0x1.85f744c68532ap-20 ++0x1.a76c83c5cb5abp9 ++0x1.2e4d91120cf95p743 ++0x1.20a2a661fc64cp6 ++-0x1.de8b904fc74c5p17 ++-0x1.3efab0ae9c967p390 ++-0x1.baaaa4beb4737p-1 ++0x1.c7a8c31fb995dp292 ++0x1.0ac905d847bf4p-1 ++0x1.3e16b224f5c6bp0 ++0x1.f24711f81bd86p-13 ++0x1.278ae68d14b89p25 ++0x1.13031191b1bbbp357 ++-0x1.0ef5a328fd16ep13 ++0x1.725d3352c48d0p-1 ++-0x1.4b4e915a26043p4 ++0x1.14d3f243c8183p21 ++-0x1.0adfb179858e8p-12 ++0x1.2048f1cff6f18p1 ++-0x1.56b496d283959p-2 ++0x1.0ae9d3320c997p1 ++0x1.76b1309a080c2p-1 ++0x1.40edd36c748b1p37 ++0x1.cf356041cb269p20 ++-0x1.2a6e248dc8560p40 ++-0x1.565ee78e2b2e6p-23 ++-0x1.8958f521381a8p1 ++0x1.fd0df44606563p-22 ++-0x1.a9612691423a1p-22 ++-0x1.16bab391b0ce9p13 ++-0x1.0c3ef5c0a4b6ep-13 ++0x1.930b260dda0a5p13 ++0x1.82c01684f4c65p678 ++0x1.2c88b588e9bcap4 ++-0x1.e11bd2ef6de2ep-1 ++0x1.8944d76626ab7p669 ++-0x1.693890da99eb1p708 ++0x1.78b1c579b4d4bp1 ++0x1.745707b19c6c6p-2 ++-0x1.89a741e1dfe7bp23 ++-0x1.d99707ee6300ap8 ++0x1.635006e567dddp168 ++-0x1.37f2423f6167ap0 ++-0x1.736a4513d92c2p-10 ++-0x1.676693b285b0ep584 ++-0x1.8c741522b0a01p15 ++-0x1.34b35744794b8p30 ++-0x1.0d6de0053f3f3p1 ++0x1.e1acd5fefb9f4p551 ++-0x1.288825d0eac71p480 ++0x1.7e1cc30d3316bp25 ++0x1.2b46a2786f662p10 ++-0x1.e35d76793d823p18 ++0x1.b36c0651aa89ap949 ++-0x1.ead715358b740p-1 ++0x1.87c461d4ae342p29 ++-0x1.7582e22ec0fffp682 ++0x1.ccee33c7e403cp-1 ++-0x1.c129832b83460p26 ++-0x1.a73d4529d4d51p-1 ++-0x1.7a9417de1e482p-2 ++-0x1.cfe415b09159fp5 ++0x1.9937b7d8057d3p-25 ++-0x1.1185143f94830p33 ++-0x1.d243651a4c153p41 ++0x1.738c07ff28a5fp33 ++-0x1.8c5de38eee632p1 ++-0x1.c81275f494f57p-1 ++-0x1.9fd4660ed63a1p25 ++0x1.18e380b5f2781p44 ++-0x1.497f37a345aa8p934 ++0x1.0bc797ce995e4p47 ++-0x1.490600f788389p539 ++-0x1.92e3e1c5eb894p4 ++0x1.d6977199168acp335 ++0x1.d06137ede4884p959 ++0x1.b25ac40cef705p432 ++0x1.695eb77a3a499p-1 ++-0x1.7e5900737e9ebp17 ++0x1.639e337b89a9dp238 ++0x1.e967a4713d5a0p43 ++0x1.56f9e4a16d041p346 ++0x1.b90fe0e573bd2p902 ++0x1.8fc2151c3268ap13 ++-0x1.0c5b50a95ef55p-19 ++-0x1.cd09619d8ede1p5 ++0x1.e23a368aeff4bp45 ++0x1.a299d6fc56011p-2 ++-0x1.7946b6c035ce1p6 ++0x1.f0c2d3f3f6809p23 ++-0x1.857651fc6cb0bp22 ++0x1.8b6c9589243edp28 ++0x1.d0063763af7b7p-6 ++0x1.a03a279df3b61p-12 ++-0x1.8f6440dd3a571p15 ++0x1.5702115e3395dp11 ++0x1.753293dcaaa78p0 ++0x1.691ec4d9bd585p165 ++-0x1.b671f3877ed27p0 ++0x1.97af437bbd99bp36 ++0x1.664c00fb70dcap26 ++-0x1.94f1c6757b92ap27 ++0x1.97dd3222f8901p36 ++-0x1.ab2ec50e36b5ap16 ++-0x1.42ab81528cdc5p29 ++0x1.9537a3e475a1bp-1 ++0x1.69ba402842bdfp-2 ++0x1.204fa031269b9p12 ++0x1.acd0117b50401p10 ++-0x1.6f1e24963cba0p24 ++-0x1.3678853a3c342p17 ++-0x1.1c7fc2d0f2645p1 ++-0x1.af8373184d592p-2 ++-0x1.f931f3789237ep3 ++0x1.05b356c5c6808p-10 ++0x1.e49f04420f1a3p0 ++0x1.f535c5c0909a8p198 ++-0x1.82dc21619e2b7p34 ++0x1.479b9359aa14bp35 ++0x1.92d325fbe6eecp11 ++0x1.909ea21f78d00p1 ++0x1.435cd7c1ee887p8 ++-0x1.3a9fc4354363cp44 ++-0x1.00b646dd4b498p10 ++-0x1.11a1e6e51f4f5p115 ++0x1.1a7ac52b21875p-2 ++0x1.e6a8849733aefp-19 ++0x1.6962c39edf43dp25 ++-0x1.ea1d7661b1044p68 ++0x1.0337f102c6521p26 ++-0x1.762915df91144p289 ++0x1.446ae20aa874cp-2 ++0x1.94e331e8c93a0p16 ++-0x1.7c7b439118666p25 ++-0x1.5f8ad60de99e9p6 ++0x1.549137cc746edp-21 ++-0x1.21d9e6074ed97p0 ++-0x1.574861d5d2449p6 ++0x1.331650a915232p11 ++0x1.e646a1f117d41p25 ++0x1.2018d63454393p-2 ++0x1.4cb4c39f91e0dp28 ++-0x1.5dcfb2b00277cp-14 ++0x1.daa065c9d4747p-3 ++-0x1.628af5ece9cb0p-9 ++-0x1.0443e4cad7780p-1 ++-0x1.dedc5001517b5p0 ++-0x1.9605a6741836bp-2 ++-0x1.0eac403d3a375p-8 ++-0x1.907957a46c55dp33 ++-0x1.bdd996400fb39p366 ++0x1.5d60d6c3bc1e3p13 ++-0x1.f684f28967382p-9 ++0x1.d2bc13e424342p0 ++0x1.1306d48e431d2p123 ++0x1.a44ac34907179p254 ++0x1.80a0b504d05cfp46 ++-0x1.c4c130a5a2ab3p4 ++0x1.aa9875a0ad120p42 ++0x1.92f40304c3502p-1 ++-0x1.5a086217bae89p-1 ++-0x1.7f92461fb7863p221 ++0x1.dcaa21c629a7bp20 ++0x1.973c70526c1c4p10 ++-0x1.58f6b3cebb936p0 ++0x1.366af7287b353p26 ++-0x1.a150963ef219bp-13 ++0x1.8dcb25a44c4a5p25 ++-0x1.abb293ca64809p16 ++-0x1.55ce241f8abe8p4 ++0x1.e0113452c0f03p38 ++-0x1.27fc007f4c82bp-1 ++0x1.abcb74a6eeb53p1009 ++0x1.53b0f0bb07b86p14 ++-0x1.54c8141b03f12p36 ++-0x1.0736e6ee73839p30 ++0x1.75f8001aae382p33 ++-0x1.024ad6d77126bp1 ++0x1.57d661a9e1759p778 ++-0x1.28dc4531d726dp-20 ++0x1.34b0271d50e17p1 ++-0x1.13b720a462992p0 ++-0x1.f2dec31d45c7ap0 ++0x1.51ddf26d6dc8fp14 ++0x1.4f8eb36cd79c9p15 ++-0x1.a3eab77c6bc5ap-2 ++0x1.3536c2505e758p24 ++-0x1.a48c91ce6acf6p1 ++-0x1.cfe614d084590p-1 ++-0x1.37c223479d8e5p34 ++0x1.3ab302a5e1187p19 ++-0x1.19bfb39635af3p9 ++0x1.50f1731d7f698p-2 ++-0x1.c5f92281bfc73p35 ++-0x1.f69343f49bb20p13 ++-0x1.82723036a9e57p7 ++0x1.e4ed355b3c00ap-23 ++0x1.7ebd829292355p0 ++0x1.6a20975fc296dp6 ++0x1.814aa1f83ddc5p19 ++-0x1.e9fb42073effdp883 ++0x1.61d877698a956p25 ++0x1.dcc1f7b93cb11p-2 ++0x1.fcbe6062a5d86p-1 ++0x1.b28d50696ad27p44 ++0x1.57bab70bb9f72p-5 ++0x1.f8c9631dd7bebp4 ++-0x1.cd4e077c60321p453 ++0x1.8f7c10d20a751p700 ++-0x1.9e3aa6a16e660p16 ++-0x1.4e1b47763daf8p3 ++-0x1.2039d5a282e43p45 ++0x1.15d7a3ccd36b3p12 ++0x1.b32b804c5c7bbp21 ++0x1.bc2f721362d31p-21 ++-0x1.a77f51d99609ap-2 ++-0x1.78254470e56f2p885 ++0x1.065b616a9cb9ep20 ++0x1.a455362c38b73p17 ++0x1.7cd9012d31cc5p19 ++0x1.f38b658d5c5c8p13 ++0x1.a1d8c7cb3e755p46 ++-0x1.8720419fcf071p861 ++0x1.c9d664de86fa0p11 ++-0x1.3032c7cb3f4f5p20 ++-0x1.4c5cb2dee8a4cp15 ++-0x1.af5bd3377809ep32 ++-0x1.8a3584d35cbb4p3 ++-0x1.5173771549c2cp3 ++0x1.70c313d51072cp6 ++0x1.f6f0b32aae83fp321 ++-0x1.cec9d1bb2b60cp624 ++-0x1.cd421185a053cp-2 ++0x1.7195806a8c89dp23 ++0x1.2ad661d2aa35bp324 ++0x1.72be4126e7236p523 ++0x1.d9a36630b8946p-10 ++0x1.7fa3815765425p19 ++-0x1.70c7d60688adbp-10 ++-0x1.eaa751f3372a5p0 ++0x1.bdeaf5b08c989p-24 ++-0x1.3a9f0155171a9p33 ++0x1.3cdd52c4dc184p0 ++-0x1.1bd7b2d4c4423p-1 ++-0x1.9f5150c2b709ap20 ++-0x1.89d8068abc6f1p842 ++-0x1.ceec2438b810bp21 ++-0x1.a948a503102a9p21 ++-0x1.cf78364f7fc71p27 ++-0x1.08deb24991385p0 ++0x1.70133227579bep-2 ++0x1.6205800dc93f8p0 ++-0x1.4e2a376e6f0e0p721 ++0x1.e30d43adb903bp35 ++0x1.f64210657b93ap12 ++-0x1.28618129a1956p14 ++-0x1.47e9104d7daf9p-1 ++-0x1.a032301a639dcp0 ++0x1.64d8d4817d586p22 ++0x1.bfbe973aefd26p17 ++-0x1.a99ba07350567p196 ++-0x1.8683c572cc281p545 ++0x1.904e746fd5521p26 ++-0x1.1ab434d351229p0 ++0x1.78bb5749ecc74p-24 ++-0x1.5a1f9122af4e0p-1 ++-0x1.0096f76176198p1014 ++-0x1.c374b2142bb05p-23 ++-0x1.14c5717c7ab84p46 ++0x1.304756bf39c0dp26 ++0x1.032157b7ad5b4p12 ++0x1.0167a4376c0c5p404 ++-0x1.2b33e07d94903p815 ++-0x1.0546b04e2f28ep1 ++0x1.4e7a67202b6c7p222 ++-0x1.1569c5f7c9a43p22 ++-0x1.7a4f25a89b8d7p0 ++-0x1.b19b42481db05p7 ++0x1.2fb006b058a81p44 ++0x1.41bb26e7ea591p22 ++0x1.9edc565a8a7ccp750 ++0x1.da4e0046b9d06p9 ++0x1.53b98665e609cp0 ++-0x1.42b700ad8d530p18 ++0x1.1fdfb58958afdp414 ++-0x1.56b4353a278a4p43 ++-0x1.f706a5edd47b4p691 ++0x1.ac72f4f2109fcp59 ++0x1.77e333e16d85dp13 ++0x1.ee51c6871309bp605 ++-0x1.c61080b14654fp0 ++# sin slowest path at 768 bits ++# Implemented in sysdeps/ieee754/dbl-64/sincos32.c ++## name: 768bits ++0.93340582292648832662962377071381 ++2.3328432680770916363144351635128 ++3.7439477503636453548097051680088 ++3.9225160069792437411706487182528 ++4.0711651639931289992091478779912 ++4.7858438478542097982426639646292 ++5.9840767662578002727968851104379 ++-0x1.946913945ef0bp919 ++0x1.1c8780f7a4682p611 ++-0x1.e5baa0e086df7p435 ++0x1.215b6544ccd9dp988 ++-0x1.0400243513f3ep355 ++0x1.af2591e3a6c8dp352 ++-0x1.8469102c2b910p496 ++-0x1.ad614701ebe00p373 ++-0x1.53d895d79f028p79 ++-0x1.c1f47655dbf06p748 ++0x1.955383c0fe4dbp236 ++0x1.fd00b10489e25p1017 ++-0x1.1ac573f72a900p617 ++-0x1.e6c5a2c754d63p668 ++-0x1.c04c06d3c9bb6p169 ++-0x1.6b50c75d0379fp154 ++-0x1.e404e32d17aa6p374 ++-0x1.13f7e64dd059fp981 ++0x1.b83c446cc221fp197 ++-0x1.6884818ec1e2bp34 ++-0x1.efaea6e07ba1ep118 ++-0x1.2f4a042ea2aa5p925 ++-0x1.7f2ce5eec3a1ap435 ++0x1.e099963c33c2ep382 ++-0x1.9e21f646e47e4p72 ++-0x1.1276c444b2602p767 ++-0x1.091891781b177p631 ++0x1.623ba2d6dd62dp940 ++0x1.b41e736053e23p204 ++0x1.0fdab611b5e72p853 ++0x1.e438955b23efap180 ++-0x1.743616457e1abp981 ++0x1.06b554eea34dep70 ++-0x1.83d775bab0aa6p260 ++-0x1.2389541676301p787 ++0x1.ec20d06255fc4p43 ++0x1.f4b9d28ce2dd6p729 ++-0x1.aa5f20f1a2b4ap222 ++0x1.17d374c688e49p844 ++0x1.3adc16a4b2461p173 ++0x1.3b87c3935314ep829 ++-0x1.6c5b05b13f352p661 ++0x1.c76c8671f2d00p207 ++-0x1.a19d949bd5ef8p301 ++-0x1.ff232524cd4f5p699 ++0x1.b23a63ccbf933p429 ++-0x1.260cc706b7092p86 ++-0x1.b4b845158c16fp607 ++-0x1.6b29c047caf4ap1003 ++-0x1.5451e75d6c4e5p93 ++-0x1.1ce9d2b02f8b8p173 ++-0x1.5f9141de74c66p228 ++-0x1.8477c7f84ee2fp795 ++0x1.8c20366e61996p771 ++-0x1.fa14b5d1e2278p929 ++-0x1.7838e2f1f3458p630 ++-0x1.908427a2b2b25p89 ++-0x1.4f35846a0e4f5p906 ++-0x1.6ad7d5bd4f80bp26 ++-0x1.e079761c09377p692 ++0x1.98ac66fb30c7dp342 ++0x1.cfe96007166fdp648 ++0x1.2554008adbf67p470 ++0x1.37c43698bc76cp113 ++0x1.0eb237971695bp629 ++-0x1.dbd26599b0a10p295 ++-0x1.72a877adef21ap763 ++0x1.cb57400936f56p750 ++-0x1.82def1457c813p937 ++0x1.b16f3533cdb98p897 ++0x1.67f3805325585p654 ++-0x1.673ba2ec64800p409 ++-0x1.ce15a75f15e94p464 ++0x1.fa20f59a4d4efp447 ++0x1.4ac8c2d45ccbfp105 ++0x1.a47d934601d32p685 ++0x1.1c4d64b15b946p989 ++-0x1.c8409231e383ap884 ++0x1.1c4ff63867e5ep479 ++-0x1.569bb7635282ep208 ++0x1.27e6e0f904293p386 ++-0x1.8d4e92ca6aaa5p455 ++0x1.0da3b3fbc6164p128 ++-0x1.0808e0778b59fp148 ++0x1.c13a5641139ebp550 ++-0x1.908b307add0ebp662 ++0x1.49eb1291c429ap216 ++0x1.fc58c4ac0478cp86 ++0x1.6a2e33b334902p445 ++0x1.27f611aee303bp387 ++0x1.5ddb515b26a4ap933 ++0x1.437534c005adep412 ++0x1.55de40b98c58bp151 ++-0x1.98d521c355be2p813 ++-0x1.6e04203014222p146 ++0x1.e4d52737fa44fp179 ++-0x1.1e3fa3fb95c37p782 ++-0x1.082555c869c25p980 ++-0x1.1b1e726bdbf7ep429 ++0x1.f475c1183eeb5p844 +diff -urN glibc-2.17-c758a686/benchtests/sqrt-inputs glibc-2.17-c758a686/benchtests/sqrt-inputs +--- glibc-2.17-c758a686/benchtests/sqrt-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/sqrt-inputs 2015-06-20 21:22:16.303457923 -0400 +@@ -0,0 +1,10 @@ ++## args: double ++## ret: double ++## includes: math.h ++0.25 ++0.75 ++2.0 ++4.0 ++2209.0 ++6642.25 ++15190.5625 +diff -urN glibc-2.17-c758a686/benchtests/tanh-inputs glibc-2.17-c758a686/benchtests/tanh-inputs +--- glibc-2.17-c758a686/benchtests/tanh-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/tanh-inputs 2015-06-20 21:22:16.303457923 -0400 +@@ -0,0 +1,203 @@ ++## args: double ++## ret: double ++## includes: math.h ++-0x1.79ea722d33e33p-9 ++-0x1.94d4e0c3df9bcp3 ++-0x1.b63e91ff711e0p0 ++-0x1.299707cfa0a5ap-5 ++-0x1.35ec261f6be52p-19 ++-0x1.d139c624e1f41p-49 ++-0x1.ba38b666e3abap-6 ++-0x1.83f902d2c81afp3 ++-0x1.dc37227180c76p-51 ++-0x1.922cb3b58f124p-3 ++0x1.3579562644365p1 ++0x1.3d52b2702b0dap3 ++-0x1.f7e79460fc57ep-7 ++-0x1.3f96b4611fb28p0 ++-0x1.a82265377c4bbp1 ++-0x1.ced121527ff6ap0 ++0x1.e4e26333b349ep-4 ++0x1.8c5fd0ab12b60p-40 ++0x1.c1b891cbc8f77p0 ++-0x1.223b80efcf234p-33 ++0x1.7184670fd30eep-41 ++-0x1.8a4421ee0d23ap-1 ++-0x1.67e981e763866p-41 ++-0x1.368b80b14c57bp1 ++-0x1.66353498bb0efp-39 ++0x1.1aa8449c2cce7p-18 ++-0x1.d70654bb75b1ep-43 ++0x1.c84f96b02d6f2p2 ++-0x1.f327d6a043438p-9 ++0x1.212b318a2bf91p-49 ++0x1.6253304db0fedp3 ++0x1.ca25248faffc4p-32 ++0x1.d502b71784735p2 ++-0x1.5c6891472b6bdp-29 ++-0x1.c05af046daa21p0 ++-0x1.3f35f7d788487p4 ++0x1.f71314c80ac27p1 ++0x1.ffb1e0c514641p2 ++0x1.cad8c2d932d94p-32 ++-0x1.ff34f15f5e3e6p-3 ++0x1.6156d70921443p-53 ++-0x1.4b5a84c95c083p0 ++0x1.c22fd4b9cc811p3 ++0x1.3fa1e66f4df60p2 ++-0x1.90f3f58afd000p-52 ++0x1.0d16c5632879dp1 ++0x1.421a752ee683cp1 ++-0x1.4b25106b6dd56p3 ++0x1.ac89b6ae063b4p0 ++-0x1.f5a005d7de302p1 ++0x1.263f96335fa00p-25 ++-0x1.81c160ff9fde2p2 ++-0x1.4c0a56228350bp4 ++-0x1.2c2e339d063c9p-47 ++-0x1.b57eb40fc048ep-21 ++-0x1.53a807e326e09p-39 ++0x1.535963f5cea8ap-43 ++-0x1.d049e60c0ecd3p-23 ++-0x1.ad3f8713c45ccp1 ++-0x1.b955931acef5cp-35 ++0x1.480e5368b9fb9p-33 ++0x1.9f8f61aff6da0p-54 ++-0x1.80ed544374dd1p2 ++0x1.0a15b06364b72p-42 ++-0x1.2700a6bd0f1cbp3 ++0x1.8257449cfd281p-42 ++-0x1.a96977ae27fb0p1 ++0x1.0fbf54939b136p-16 ++-0x1.68dc338c13b02p0 ++-0x1.08c49666633fcp1 ++0x1.7112c1edd1600p1 ++0x1.45aa62e647503p-13 ++0x1.24318616e191cp1 ++0x1.2712f5e21b96ap-52 ++0x1.cd76975043db0p-32 ++0x1.9ab2842033f1fp-15 ++0x1.9cf3279d8ff3ep-21 ++0x1.dccc3241d912ep-48 ++-0x1.b2a4e543a5268p0 ++-0x1.9802a51e2fa5ap0 ++0x1.3da4954669e1fp-27 ++-0x1.d4670486ae6c5p-50 ++0x1.12d690cf283ebp-25 ++0x1.34763296811bdp-39 ++-0x1.2f5427f0973cdp1 ++-0x1.44a7f0d39a7cbp-18 ++0x1.c954869657fd0p-45 ++0x1.c99220da8d555p3 ++0x1.a067b10753d0cp2 ++-0x1.4cfdd35756bc5p-10 ++0x1.5090825895bd5p-43 ++0x1.bbbc049609e09p-34 ++-0x1.d79730d4df424p1 ++0x1.4aeba21a72c73p-11 ++0x1.72115177d9511p2 ++-0x1.3a4015774746fp3 ++0x1.555713307b9b4p-37 ++0x1.a877a7a5a6963p-46 ++0x1.ba8ad1105bb80p-6 ++0x1.e500b2666c494p0 ++-0x1.7c7801ef98594p1 ++-0x1.89c34195ab10dp-21 ++-0x1.9653b765a54c3p1 ++0x1.cbc5464770c96p1 ++0x1.80dd335890daap-29 ++0x1.a88610813e760p-35 ++0x1.3bf7077dcaeb2p1 ++-0x1.58fc25c99925ep-51 ++0x1.99f184fd14ba6p-37 ++0x1.a5c077f3ec9fbp3 ++0x1.1676a1bd6d7fdp-31 ++-0x1.151f61d509024p0 ++-0x1.82b1234ed4accp-21 ++-0x1.9c78a7464a06ap2 ++0x1.81db55fe7d6a8p0 ++-0x1.403546a25090dp3 ++-0x1.884175facb7a0p-5 ++-0x1.8cd807cf97147p2 ++0x1.28b7d3631da7ap-16 ++-0x1.dbdfc6a3b7a56p3 ++-0x1.93ca444439063p2 ++-0x1.863014637e6b2p-40 ++0x1.6f0606cba779fp-48 ++0x1.e4bb004a92da3p0 ++0x1.4e7cd59b97811p-22 ++0x1.d82513d934824p0 ++0x1.08ea668aed516p-4 ++-0x1.4eb052c08e36ep3 ++-0x1.947540f62626bp-38 ++-0x1.9d4c17b3aa3e3p-18 ++0x1.ffdc334c6a7a3p3 ++-0x1.f01e851ab2990p-45 ++-0x1.040ac02963464p-37 ++0x1.deca67ef259e8p3 ++0x1.7ea616ef23425p-31 ++-0x1.5ad5526a35b13p1 ++-0x1.18477773e1136p2 ++-0x1.da68368e73652p1 ++0x1.d47856d151708p-32 ++-0x1.8dff62e84740bp2 ++0x1.512c92bc3fd5ap-42 ++0x1.0d46e50f3e34bp-38 ++-0x1.f2cba4b66f7aep3 ++-0x1.1bd6063435779p1 ++-0x1.314a92dc0593ap1 ++0x1.78e992e23299dp3 ++0x1.547ba4fcc9d15p1 ++-0x1.10b63582d5e5fp1 ++0x1.2bc994ee38c37p-3 ++-0x1.8edd86fbebfb1p3 ++-0x1.0f5bf4ace5c69p-54 ++0x1.e38d83d2c8025p-43 ++-0x1.9c31372efb7c2p-25 ++-0x1.01ea8256aa697p3 ++0x1.b68125750b075p-9 ++-0x1.49f40645faf47p0 ++-0x1.72a777e07e732p-8 ++0x1.198ea0f0d15eep1 ++-0x1.ecc6037c6538ap-21 ++-0x1.e649c0259ccc7p3 ++0x1.06f1640c8e2a4p0 ++-0x1.693d851f3cfeep-10 ++-0x1.0087454a6db2ep1 ++-0x1.05519085ee41cp-51 ++-0x1.df8af593c9a6dp2 ++-0x1.fa5552ca0ed82p-13 ++0x1.5d5fa0d6d5003p-9 ++0x1.726ff56109b1fp2 ++-0x1.17fe022e20687p2 ++0x1.261da31e2fd34p-35 ++-0x1.55b5028331f05p1 ++-0x1.5b3682390c9a9p2 ++-0x1.2e7715356184dp-16 ++0x1.5be03400eeeb7p0 ++-0x1.b530c329abc95p2 ++0x1.b3c9837089937p-50 ++0x1.9286b5e44023fp3 ++0x1.106137779070bp2 ++0x1.df2ad20740b3dp-26 ++-0x1.1ae7653a10472p4 ++0x1.1cecd7b22c032p4 ++0x1.e16190519649ep-48 ++-0x1.43ad33cd63d71p3 ++0x1.f978d68c76a16p2 ++0x1.340975e58a8a7p2 ++0x1.2ca3d4cef3844p3 ++-0x1.75fb149690f20p0 ++0x1.1c6be31b1d0b9p4 ++0x1.1b54873bb0292p0 ++-0x1.73c327f48e34fp-33 ++0x1.0e0354caf6818p-54 ++-0x1.168b022d669ccp1 ++-0x1.816c547ac8d97p-45 ++-0x1.ee86709f7750bp2 ++-0x1.137d50ed8e775p1 ++0x1.094c253414b65p-22 ++0x1.87a6a3e8c8b4fp-37 ++0x1.9c4674b85fc58p-9 ++0x1.2ba8d7d38efa2p-43 ++0x1.35e7234d9a485p4 +diff -urN glibc-2.17-c758a686/benchtests/tan-inputs glibc-2.17-c758a686/benchtests/tan-inputs +--- glibc-2.17-c758a686/benchtests/tan-inputs 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/benchtests/tan-inputs 2015-06-20 21:22:16.304457892 -0400 +@@ -0,0 +1,3456 @@ ++## args: double ++## ret: double ++## includes: math.h ++-0x1.8223b3a325943p573 ++0x1.a8a424675610fp845 ++0x1.923370ded0653p554 ++-0x1.759b34bb0cfdbp553 ++-0x1.a390469582e59p924 ++-0x1.cd9252152d901p462 ++-0x1.e2d1d2e34fd97p568 ++-0x1.b59d71a85565ep-15 ++-0x1.be1224d8f2474p629 ++-0x1.327c5786c74fbp559 ++0x1.75e1260927766p519 ++-0x1.d1ae866714e99p662 ++0x1.a086249ef7bb6p159 ++-0x1.008130223996dp463 ++-0x1.f77636d051905p336 ++0x1.dfed4714271cdp574 ++0x1.7204451a9cfdfp372 ++-0x1.31ab43b06eac7p703 ++0x1.4866b5a4dfafdp978 ++-0x1.cf2ba523a76c6p815 ++-0x1.25bc94b7d96b8p604 ++-0x1.b986e7275d085p225 ++-0x1.8d4ed15015b22p740 ++-0x1.58d231c6a5340p390 ++0x1.5f14b443ceb0fp0 ++0x1.40ae43729ddcap969 ++-0x1.d4e9674fd10a8p528 ++0x1.24d8e4308a916p413 ++-0x1.b143609970b27p101 ++0x1.b609b67cc8c6fp974 ++-0x1.8fc291f86553fp171 ++0x1.b24a7238fb771p275 ++-0x1.cde032076fb81p545 ++0x1.bbb5f22a04b44p794 ++0x1.5bdaf73cb6febp803 ++-0x1.58c180ec8edecp408 ++0x1.b5e6345064274p152 ++-0x1.83bd627132077p50 ++-0x1.bb46e4e6e61a0p585 ++0x1.bb9757f54f100p733 ++0x1.c55d070f0ac5fp438 ++0x1.3476a63166a0ep648 ++-0x1.a15f134f42095p828 ++-0x1.32e840e69acadp392 ++-0x1.bf17857e50b11p559 ++0x1.f73021afd46e7p407 ++0x1.9f00e7f88fb55p775 ++0x1.f64fe31245205p510 ++-0x1.857c82089e8dbp933 ++-0x1.e7c0240150699p244 ++0x1.85f1e1ff46b97p607 ++-0x1.8ac482283b408p507 ++0x1.655985eb933b4p332 ++-0x1.6e7ad10117706p577 ++-0x1.9f9b018c5a565p944 ++0x1.e15694711c05bp690 ++0x1.623803fd581a2p555 ++-0x1.58f8b25bde0c0p477 ++-0x1.e019f3e23ca4fp648 ++-0x1.6f1b061695e57p6 ++-0x1.c4e4506f6c270p698 ++-0x1.9249404f2bd69p-12 ++0x1.f6df00b66684ap227 ++-0x1.0a5ff4bbd59fap973 ++-0x1.783723759a83fp66 ++-0x1.f21b84834aef7p246 ++-0x1.8e49927eadea1p587 ++-0x1.eca7d45f5234dp631 ++0x1.41b1c5ef9873cp95 ++0x1.d449a6e011e9ep107 ++-0x1.7caa53d604056p443 ++0x1.7288a5f18c0aep556 ++0x1.8d7ba3b2300e6p183 ++-0x1.1747478ffe5b4p148 ++-0x1.769a84af31c8ap851 ++-0x1.e41b6039c9d89p23 ++-0x1.273bf4a49e223p408 ++-0x1.2d74708a8d553p7 ++-0x1.71a9314bbf5abp11 ++0x1.63c804f1dcb3bp654 ++0x1.a81bb1a86a2f5p368 ++-0x1.bbb1d0d267af6p679 ++0x1.574264e94bcacp646 ++-0x1.1ee57113a55bbp916 ++-0x1.e043311b22e8ap45 ++-0x1.2fd7c5340e069p842 ++-0x1.2faa426020fadp642 ++-0x1.92507362ad808p175 ++-0x1.9318c5c281337p897 ++-0x1.aeada555a018ep178 ++0x1.04d4f6535e33fp367 ++-0x1.e49b378f96eb8p749 ++-0x1.064e801d2dc83p75 ++-0x1.64deb34cefc2fp403 ++0x1.6d2e677f31896p467 ++-0x1.466ac0cf4dd29p746 ++-0x1.609c83df01cf5p137 ++0x1.d960e2cbe66a9p449 ++-0x1.602bd715ecb91p46 ++-0x1.b0af218f7c6a5p629 ++-0x1.21a921acce2fdp22 ++-0x1.f83004121d518p837 ++0x1.4ca7a2fb63bc5p156 ++0x1.191295449db9bp54 ++0x1.c9bd7171fde58p949 ++-0x1.e4162302d0c20p397 ++0x1.077f42760d255p258 ++0x1.a3b173403bf03p644 ++-0x1.c9ff841ec836dp889 ++0x1.acf92502f5b3cp624 ++-0x1.b8c23518af5e3p508 ++-0x1.88e416ff6ad6dp268 ++0x1.6280e7b9872b9p807 ++-0x1.7cd6b732512b1p212 ++-0x1.67ee930f4dcfcp388 ++0x1.64f4659e0b759p93 ++0x1.6cfa374d378c3p788 ++0x1.c1082531b7386p261 ++-0x1.b8d1e18e1c2ccp953 ++-0x1.46d403df71732p268 ++0x1.07f2566a38fafp589 ++-0x1.cb5ed766d06c9p356 ++0x1.64e9c5f032a8bp358 ++-0x1.a81485a8eb7a9p15 ++-0x1.29d6113c439ffp960 ++0x1.46f14425dfb7cp-22 ++-0x1.46d884db8e124p760 ++0x1.b6b2023f59712p442 ++-0x1.f8fea40ac8ffep855 ++-0x1.d363d57ed5fe2p800 ++0x1.385f65d4ccb30p812 ++-0x1.b13d912fc1851p600 ++-0x1.189687400f8b5p930 ++-0x1.3359b450bf3bfp285 ++-0x1.64d114ac159fep767 ++-0x1.9bc8e4afa247fp213 ++0x1.1299f68a1c892p327 ++0x1.8bca15f2a63b3p771 ++0x1.92d6366b40cd5p704 ++-0x1.c7cbe0307540ap1005 ++0x1.d2bfc0eb2f0f9p665 ++0x1.788336461cdf9p887 ++0x1.64c99758893dbp728 ++0x1.364825de23c96p378 ++-0x1.033600f7ce301p531 ++-0x1.34862202e7ecap256 ++0x1.6a6f4552a83b5p949 ++-0x1.a55017d2ab992p179 ++-0x1.a70fc12d64d86p591 ++-0x1.7f00f4d75d44fp563 ++-0x1.58a4c1d691cb1p209 ++0x1.37a2726f0d414p445 ++0x1.b7c3035071ef7p459 ++-0x1.3c5d37b781aecp256 ++0x1.a979508d7bd0dp576 ++0x1.708213f2fd915p528 ++-0x1.2054b2257c924p889 ++-0x1.0446b4b20cd97p573 ++0x1.9cba327cc49c7p207 ++0x1.f14ce310e4517p147 ++-0x1.8e4313d57243bp405 ++0x1.32f131e4e2c5dp-7 ++0x1.7b7d4171a5b89p761 ++-0x1.768b96404272dp319 ++0x1.e389677da758ap725 ++-0x1.f7f1270f6df26p963 ++0x1.97bd878c7b4e3p597 ++-0x1.b35ac52109914p372 ++0x1.86a351193c827p418 ++0x1.c78c9454775e2p325 ++-0x1.f7093192ede9bp819 ++-0x1.8f7823d7fe58fp200 ++-0x1.2068039af64a2p944 ++0x1.95a951ef8e07ap424 ++0x1.98b5776341626p241 ++-0x1.661af6c71f830p275 ++-0x1.bded24148bf8fp265 ++-0x1.da06d35c1e049p352 ++0x1.50c4c103b3adep946 ++-0x1.d89fc3a1a0038p683 ++0x1.e01904f9e518bp65 ++-0x1.904ac477905adp21 ++-0x1.566ae646625edp938 ++0x1.3fec71e5f5cbcp514 ++-0x1.88db248db4dbfp865 ++-0x1.5dc2c3388d7bbp213 ++-0x1.b5ac97796d94cp400 ++-0x1.7bbad1b8269a2p305 ++0x1.2115275214bf2p809 ++-0x1.b6727037ce307p726 ++0x1.983327e1249b5p120 ++-0x1.d10951541ff1fp728 ++-0x1.4f84e0b4a8cd1p28 ++0x1.0dbc3589068fdp241 ++0x1.1e9a9359bb743p399 ++0x1.a923364cdc026p924 ++-0x1.20ab54a355b5ap996 ++-0x1.90c1f77a05003p285 ++-0x1.2772c2d8adf26p15 ++-0x1.d75d54bd7efd8p221 ++0x1.5d0352b2cac14p335 ++0x1.92297454b3ba4p203 ++-0x1.e74193f05cdd7p411 ++0x1.e526b6137b06ep800 ++0x1.e99bb5f69bb23p558 ++-0x1.12fb97edc8ef7p509 ++0x1.93f9f4c363c48p114 ++-0x1.7da8c406ad9edp290 ++-0x1.681230393be1dp694 ++-0x1.c8ec5071ed259p771 ++-0x1.1010810f5ddd5p158 ++0x1.c74a81bf3dfe1p502 ++0x1.1a36b350bffb4p326 ++0x1.9997153de8d50p936 ++-0x1.2a4b83a44adb1p262 ++0x1.143135a73f62dp112 ++-0x1.a9fb66d704d20p924 ++0x1.52ad267e9e691p941 ++-0x1.960237aa0b476p456 ++-0x1.86f60247145c7p1002 ++-0x1.40fc032059f50p822 ++0x1.36e3e02584408p699 ++-0x1.19f154949871bp690 ++0x1.955050762de4dp982 ++0x1.da92c16dc3379p408 ++-0x1.7db2843ebc2e9p106 ++-0x1.5ed053da6629fp251 ++0x1.7a438137d5cf5p379 ++0x1.848bf06d16cb5p742 ++-0x1.10c327274daf3p243 ++0x1.e7d565d867a08p675 ++-0x1.fe4a75adfcf0ep507 ++-0x1.27ffc345d783ap83 ++0x1.7505c7af55362p582 ++0x1.e91a6585b3efep39 ++-0x1.c3f6c7813dc77p258 ++0x1.aa1a94fbb80afp391 ++-0x1.f91010d34d5a1p575 ++-0x1.d1c5e776352f8p81 ++-0x1.42ed75713379fp760 ++-0x1.443db008d07f8p671 ++-0x1.62b031d37d269p872 ++-0x1.e74ca5fa66410p11 ++-0x1.24c032fc2a37cp54 ++0x1.b10d0082d4525p430 ++-0x1.52a7436543c32p449 ++0x1.80de825c86b09p478 ++0x1.aeb2530eace81p186 ++-0x1.069422760f985p379 ++0x1.d254b2b61ba52p468 ++0x1.859f00c1dfdb4p946 ++0x1.b77c51fdbe932p801 ++-0x1.d84b803d9a2a9p653 ++0x1.fdeee09bb33b3p522 ++-0x1.977296b455844p588 ++-0x1.4da2b665db234p110 ++0x1.6e4656ff0b546p687 ++-0x1.427ef58be39fep749 ++0x1.5458b4f78e18bp1020 ++0x1.dbf6b5a443ad8p63 ++0x1.fabc4531c35d3p786 ++0x1.750be012c6154p365 ++0x1.d406b5ad76da9p348 ++-0x1.136ac7e63a7a4p852 ++0x1.f38d97e18ed30p770 ++-0x1.86eb94206ac9bp845 ++-0x1.9fd97758ea039p519 ++0x1.57e104a418329p842 ++-0x1.f47a53b612eedp131 ++-0x1.8c7f907591c6ep317 ++-0x1.7797a7c218b28p683 ++0x1.a65d35c8b88bfp445 ++0x1.e2eb60871eb89p30 ++0x1.569f174caec6bp914 ++-0x1.b83cc28d283bdp-9 ++0x1.4e3625ca8ae68p798 ++-0x1.5b0a1690ba66cp1010 ++-0x1.b964703464db3p516 ++0x1.594d72f510320p234 ++0x1.e0fd20fb450c9p195 ++-0x1.4c71468889a23p828 ++-0x1.b0550500c4f1ap615 ++-0x1.0660b078d6f3ep275 ++0x1.1aea54022a7c9p566 ++0x1.944f35657817bp909 ++-0x1.b918b7742beb2p620 ++0x1.30c8214b4ebd4p1003 ++0x1.b4b1127df81bbp636 ++0x1.499bc35bdb268p230 ++0x1.239303c6019cep75 ++-0x1.2ddf17942d7abp335 ++-0x1.c1cd51bb6ef20p219 ++0x1.317ef522313edp576 ++0x1.6622455a81f5ap165 ++0x1.a7cd35a9a03cfp611 ++0x1.55f8a593d1051p681 ++-0x1.8ac0e40f85b62p207 ++0x1.339c053ef2e4fp974 ++0x1.07bac767e2915p807 ++0x1.0572243093b94p336 ++-0x1.7e6d32d8e9b1fp573 ++0x1.05f97096a8c08p301 ++0x1.a0f3f063dc5c8p319 ++0x1.079d71aaef5c9p133 ++0x1.aae49653bc771p-9 ++-0x1.de13b5b4f8b8bp779 ++0x1.ed07835644d79p859 ++-0x1.86ae6094e5cb8p640 ++0x1.f45d03d3167a8p44 ++-0x1.1c9161ed1811ap657 ++0x1.ba5ae0f7f6255p730 ++0x1.3dc4917e05df6p199 ++-0x1.637eb2e09fc81p-20 ++-0x1.35c8010ca51abp558 ++0x1.46b46213d42d3p263 ++0x1.e82bb7d6f0966p439 ++-0x1.4a5335f72040ep748 ++-0x1.9150364d7a3e8p521 ++0x1.811436d27e101p345 ++0x1.1e6fd3d8c4c47p24 ++-0x1.d3dd14d8c8a72p195 ++0x1.7f6fa7878270ep615 ++0x1.0e23f7c6192b9p883 ++-0x1.64fb914120bf9p181 ++-0x1.5b9b402c6b12dp216 ++-0x1.67072619357dfp556 ++0x1.cb6d523053edcp116 ++0x1.0400b6f327cadp209 ++-0x1.cb1c2559a73a8p538 ++-0x1.0832e6f8f9389p562 ++-0x1.e237659a26998p113 ++-0x1.d390a323282adp250 ++-0x1.2abb75708ac0ep1000 ++0x1.93bcf2432f778p707 ++0x1.bbdbe0f57dba0p780 ++0x1.9ce4a245e8487p56 ++-0x1.f65290202bc33p297 ++0x1.2286377c2a7bep402 ++-0x1.25ba94a2a1b39p23 ++-0x1.7e7034f66b646p226 ++0x1.dfd3921f61b6fp865 ++0x1.8e77026d1dd42p947 ++-0x1.259a210ae8dbbp883 ++-0x1.ff947770042f4p50 ++-0x1.b11b83cbe34a6p138 ++-0x1.ed02f523ba5fap948 ++0x1.fae0c20538cfdp378 ++-0x1.f106f16618a36p390 ++0x1.12f06118a71a6p435 ++0x1.f459e36013ac6p193 ++-0x1.b71e601c8937ep647 ++0x1.741dd54a711bap303 ++-0x1.5fd0806197195p648 ++0x1.c08a364cba1c4p476 ++-0x1.0fae377d13b6bp376 ++-0x1.284b125539b1bp740 ++0x1.1b26509b3d375p643 ++-0x1.b3d3e132b5f3ep409 ++0x1.f5e2c4a09c6f3p579 ++-0x1.27c3958127ffcp568 ++0x1.3d88f5ed5e951p522 ++0x1.9f271783e03d7p573 ++-0x1.e470858d1dc67p587 ++0x1.cb625701aabb5p297 ++-0x1.583541c8ef4a9p519 ++-0x1.cff7a379366fdp449 ++0x1.ff5284d44492bp734 ++-0x1.36bec43199ee1p-24 ++0x1.21c7f78d864fep503 ++0x1.e84e55708a34cp1003 ++-0x1.bc6db2028ef2dp357 ++-0x1.03dc7515aba2fp362 ++0x1.d36d2291f6b57p427 ++-0x1.6b09f585f9193p808 ++-0x1.9c94e5c6b368fp214 ++-0x1.b637e724f9976p589 ++0x1.c782220738d46p18 ++-0x1.55e0e443747ecp298 ++-0x1.ae36671f9deb3p951 ++-0x1.ab18e77da892bp237 ++-0x1.b8214411e595cp533 ++-0x1.905e068e442f4p539 ++-0x1.9dac66939446bp803 ++-0x1.30d441b8ea8f2p401 ++0x1.2023c219ba756p306 ++0x1.9b83c3efed8c5p14 ++-0x1.3f0ef3440cb1ap1000 ++0x1.fe50609963492p823 ++-0x1.b29653a0b816dp53 ++0x1.3cb0a7690e4f5p279 ++-0x1.3bfba620e087ap429 ++-0x1.82e784a2946a4p187 ++-0x1.f2a2a27a31febp659 ++-0x1.1f6e730cbc7f3p330 ++0x1.232570e622955p1006 ++0x1.815d92a977bc4p742 ++-0x1.afefb62db66b2p361 ++-0x1.393f51c4b001fp-21 ++0x1.2e0a56d573c24p551 ++-0x1.85c9e0d20fc03p13 ++-0x1.ddf8e355bc110p27 ++-0x1.c421925083f29p63 ++-0x1.477b658be3782p332 ++-0x1.dfa7e1f25247bp101 ++-0x1.0ef1e0f8a34ebp836 ++-0x1.9736b5b40d3a6p328 ++-0x1.fc2130e5cb2ddp72 ++0x1.cb19b23ae4117p87 ++0x1.5e908222450d6p683 ++0x1.83d3300fda787p465 ++-0x1.1f75315eae92cp312 ++-0x1.4f87c66f9c24bp218 ++-0x1.20a0c7bb5ab06p713 ++-0x1.4379a08c0b472p507 ++-0x1.37c013509290bp25 ++0x1.30733493bc82ap796 ++0x1.451a0144b107fp12 ++0x1.d3b5609052753p696 ++-0x1.baded35e9b11fp215 ++-0x1.9010f587e1588p838 ++0x1.0e02515adc0f5p656 ++-0x1.786204df84f7ap400 ++0x1.cd5976e18d08ap562 ++0x1.a3b8b07edd8a5p695 ++0x1.272c360b4a09cp240 ++0x1.c76272882f071p807 ++-0x1.05a6b23f98b31p854 ++-0x1.309684da428b4p519 ++-0x1.b0b45682b1411p156 ++0x1.16d122510e170p482 ++0x1.d219a347bf3b0p121 ++0x1.76ddc05352dfep610 ++0x1.2f8b83aa236f5p634 ++-0x1.bff5136871c7cp321 ++-0x1.449411e1a1534p786 ++-0x1.6b9964e711a38p523 ++0x1.610080e646a92p572 ++-0x1.5a2035384b325p183 ++0x1.2f15b33162e14p520 ++0x1.5edd45422f82ep694 ++0x1.adc571bdc2896p1021 ++0x1.11ede09781861p818 ++-0x1.384970657fe1cp731 ++-0x1.b93df7e5ba775p747 ++-0x1.80e8650f78da7p617 ++-0x1.ceac833c51ddfp745 ++0x1.6531a38ced12cp46 ++0x1.91fb517112447p535 ++0x1.52a4566db4283p745 ++0x1.dc0275f484b73p935 ++-0x1.a14ae7206183fp724 ++-0x1.b3dcb3a37ca8cp-6 ++-0x1.e79600282da96p149 ++0x1.b8758421e1862p507 ++-0x1.2547846b083e9p-6 ++-0x1.84e3629cbab35p361 ++-0x1.c716339c7bd00p830 ++0x1.d39d1592b1957p616 ++-0x1.c416c32a4efa9p963 ++-0x1.c966d274ac272p421 ++-0x1.39623033efda7p13 ++-0x1.47b562fb33e7ap61 ++-0x1.908e8784678e6p615 ++0x1.90b9900e518b3p163 ++0x1.836e560de08e8p164 ++0x1.772670b0b8d27p226 ++0x1.7fd2e348de960p918 ++-0x1.3cd1201cba22fp198 ++-0x1.a7dbd2320565cp159 ++0x1.ca98f6aef3966p325 ++-0x1.d0c1a2329035bp2 ++-0x1.c0d31445503d7p530 ++0x1.c4b027bbc1746p567 ++0x1.32341565ed07ep159 ++-0x1.8c7b4695abfe2p513 ++-0x1.4578608c13f56p-22 ++0x1.5bab8379ff00cp49 ++0x1.306e7570eda77p869 ++0x1.732110fa64bafp393 ++-0x1.1146f698db29bp160 ++0x1.6885a0cfa919ap211 ++0x1.714b252420ac9p858 ++-0x1.486b66411fe7ap398 ++0x1.18421057ffa6ep237 ++-0x1.e731c4f710eddp197 ++0x1.7cff352552c84p37 ++-0x1.6abf14aa70dacp746 ++-0x1.f29b55bb8fe31p416 ++0x1.a77473515adf8p195 ++-0x1.4922814b5a637p498 ++-0x1.9ce303b95ccc7p511 ++-0x1.fc646726a5f20p951 ++-0x1.21eac2c21fe54p113 ++-0x1.e4e213df08c2ap265 ++-0x1.887dd5a85818ep912 ++-0x1.bbb2171b888c8p103 ++0x1.8b34a46c873c2p501 ++0x1.70e367db79ea0p241 ++0x1.7ce0039ed7da4p808 ++-0x1.c7fc26380f6c6p101 ++0x1.18c360c75aad0p234 ++0x1.fee2f67629486p962 ++0x1.a4d7a588fe8bbp-3 ++0x1.570291341d887p437 ++-0x1.a10e9531b0df8p337 ++-0x1.ca6825fbb4bf7p602 ++-0x1.c8d000ca12af8p113 ++0x1.b74a232faf0c9p-10 ++0x1.1dfd417243258p88 ++0x1.c755e373bd292p806 ++-0x1.3124b71499691p1020 ++0x1.a84680e1992ccp483 ++0x1.c5b2c448b0259p534 ++0x1.c54e340119590p56 ++0x1.42d4e3fc4a7dbp943 ++-0x1.6f81959716f0ep600 ++0x1.38fac2222482ap313 ++0x1.aa4840527639dp-25 ++0x1.9ad706bfe85f3p1020 ++0x1.2f2da18ecac33p825 ++0x1.6ee875bc8e577p747 ++0x1.da3412d07c978p387 ++0x1.cd8e14f3d97dep105 ++0x1.cd6cc00d3cff1p360 ++-0x1.f7bd4156bade4p679 ++0x1.9d89611d9047ep925 ++-0x1.2b41b1691def0p18 ++-0x1.806210fa000dfp258 ++-0x1.2f49e07812d94p116 ++0x1.339605b7fab92p1020 ++-0x1.0c09f7db12243p891 ++-0x1.81a2a42a061d3p903 ++0x1.a791057d419b5p888 ++0x1.581315b6920c6p-21 ++-0x1.c5f64504ae5f4p791 ++0x1.8982e6ced130fp227 ++-0x1.d0db364678c1fp12 ++0x1.43aa32552d958p657 ++0x1.899c234387f3ap633 ++-0x1.41470481079e0p614 ++-0x1.2aa723c52c3c4p920 ++-0x1.bcede1fa49331p512 ++-0x1.f37ac77972cdap-18 ++-0x1.e22c64e877035p779 ++0x1.754480a7b3bf9p898 ++0x1.6ae1a66d4b83dp6 ++-0x1.90c107ffacd38p913 ++0x1.b9381618da422p371 ++0x1.a981920976fa2p680 ++0x1.3a6ec4b57bc2ap15 ++-0x1.28dcc1f6d20bdp108 ++0x1.4326147c15728p335 ++-0x1.2259a0e73e4f4p122 ++-0x1.11cc764de91bbp18 ++0x1.f481816abfcb9p72 ++-0x1.c1d2d049ee85fp-23 ++0x1.61e4d0a08bebdp12 ++0x1.d86ed0f586a17p516 ++0x1.b100560d69d98p432 ++-0x1.50b8331476685p30 ++0x1.9f32c7425b9f6p739 ++-0x1.d89d2066c2887p0 ++-0x1.61ee079dde498p465 ++-0x1.3602968762b9ap32 ++0x1.4c2c9725ac92ep-20 ++-0x1.3a0d7321c02abp108 ++-0x1.b1325468e8fdbp781 ++-0x1.613d634860a5cp756 ++0x1.41f616b0ffe33p752 ++-0x1.61a3765afebf9p788 ++-0x1.538be659aab9ap199 ++0x1.da3661b9d7828p8 ++-0x1.76e835de4916dp-21 ++0x1.83db501e98db6p965 ++0x1.184bd1b938793p927 ++-0x1.6352b0ec9b3bbp851 ++-0x1.e00891c81db9fp966 ++0x1.6d2bc0bc2c25fp29 ++0x1.16f205d5ea0efp341 ++-0x1.222b02360aa21p423 ++-0x1.c43fc00ad0827p175 ++0x1.4a9da6ed14181p96 ++0x1.742f7252b3888p-24 ++0x1.e3a1434f237eap-6 ++0x1.788f015a48ed8p487 ++0x1.fdd0a707a7b24p120 ++0x1.bab124b6990f7p10 ++0x1.c8ffe2cf83b94p755 ++0x1.2372c778a1441p348 ++0x1.612b072d760cbp958 ++0x1.609f218942867p274 ++0x1.0483c3df44e59p24 ++-0x1.6f1a40a16d5e7p406 ++-0x1.784bf15a26f31p173 ++-0x1.7fd4e7bec6056p611 ++-0x1.c478c30401e95p33 ++0x1.0bbaf1e77d127p947 ++-0x1.0e6da7540b809p122 ++-0x1.47a8d09dbc89ap895 ++0x1.bc06021871563p927 ++-0x1.f89bc1de14148p464 ++0x1.98a2f4afe66b7p674 ++0x1.5f0bb5633b7dbp833 ++-0x1.8ce676f64c1f2p25 ++-0x1.4c8a51a1b0cbap555 ++-0x1.8210c69bcd3f0p26 ++-0x1.0b4731be2b020p855 ++0x1.73d857da7baa2p23 ++0x1.01075749d6fc6p689 ++-0x1.112e67981aa71p146 ++0x1.b01dd2c3cacd8p793 ++-0x1.cd5737ff4c257p433 ++-0x1.3e519196e9292p729 ++0x1.5b65b0284bd0dp839 ++-0x1.1c4762b976c53p-10 ++0x1.794245506f756p32 ++-0x1.4e1c35958207bp707 ++0x1.c3913360602d8p800 ++0x1.83f2621884b92p26 ++0x1.c069f020301dcp328 ++0x1.b27b85f417892p184 ++0x1.e004a34aff785p750 ++0x1.29fc70b6808adp70 ++0x1.2ec1a69b905fcp919 ++0x1.df6a235533225p599 ++0x1.438a2370d9eebp231 ++-0x1.dddd767c99337p889 ++0x1.0568d154a2870p18 ++-0x1.3363041710f4ap216 ++-0x1.64eb7482628abp653 ++-0x1.3772b3ab575c6p0 ++-0x1.1bdee549c535bp184 ++0x1.d556148c8ea18p820 ++0x1.6d31247f5cf60p84 ++0x1.aec7658e1d55ep-7 ++-0x1.df40a65c08fd9p16 ++-0x1.359021a96067ep851 ++-0x1.47ef93788827ep585 ++-0x1.d9a6960c12269p688 ++0x1.67a8b27b1b917p158 ++-0x1.d6d2a6399e8d2p292 ++0x1.431a4325d3651p320 ++0x1.b274e747ec490p365 ++0x1.d042571362911p3 ++0x1.3ffff11ae8155p254 ++-0x1.ea8cf38a078e5p25 ++-0x1.da1f81d728183p288 ++-0x1.d2f442f6baea0p3 ++-0x1.1125e418910dbp22 ++0x1.e28ee7f211bc6p608 ++-0x1.c7b590b383ae1p490 ++-0x1.ec07032c9fe8ap417 ++-0x1.2f82b55eebd81p266 ++-0x1.2d0c72c2a6eaap3 ++0x1.7654c41150714p-8 ++-0x1.cb7ba6fe71addp17 ++-0x1.ea76b17ba5274p1 ++-0x1.cee634f158cf0p478 ++0x1.9389c0f24345cp-5 ++0x1.ff0ab7bfdc77ep0 ++-0x1.5a2a9634b735ep118 ++0x1.a99a656f9766fp9 ++0x1.25e6b6c33e77ap760 ++0x1.5c07b3fdfc784p24 ++0x1.659bd21884363p21 ++0x1.a1e2d2a599b2cp-2 ++-0x1.b669c6b9ff4eap954 ++-0x1.227fe1b1d363dp375 ++-0x1.9d8815914355cp23 ++0x1.08f9c73e5d0b1p58 ++0x1.06ebc1e205a69p11 ++-0x1.c475c33c6e4d9p419 ++0x1.26e2f03c3b568p952 ++0x1.142e653198e2ap876 ++0x1.a17610c798c44p385 ++-0x1.5d25b7f4ed01ap784 ++-0x1.553e05b0c2d7fp1 ++0x1.ac28301a1a99dp-5 ++0x1.1e2830cae9f10p585 ++-0x1.89ecf76a7976bp784 ++-0x1.36a6c7f575816p91 ++-0x1.3290c1e3ab0fap439 ++0x1.571f2024af517p407 ++-0x1.9e9f16af2b7f2p-19 ++0x1.547107a4abf1ap556 ++0x1.8d9bb18e74c7fp327 ++0x1.6bf844726431dp79 ++0x1.6882c40a36829p521 ++0x1.5e33a37495769p499 ++0x1.aa1c25076a0c0p54 ++0x1.af11a32c8711cp844 ++0x1.842ef2865faebp19 ++0x1.69ab61853a58ap25 ++0x1.9955a12bf91eap155 ++0x1.e8a7220cbb889p593 ++0x1.c275a73192796p259 ++0x1.f79d74bb2c42ep261 ++-0x1.b80435f49efd4p25 ++-0x1.a3f243a5aba38p960 ++0x1.ab2a83515090ep837 ++-0x1.b93c62ada1c23p12 ++0x1.b042d7b712ce3p608 ++0x1.e173865ea2fbfp711 ++-0x1.c721e58a282efp25 ++0x1.b7dd57c5e569fp171 ++0x1.a148e142f39b9p699 ++0x1.2a5fa6d540fa0p62 ++0x1.34bb57427099cp574 ++0x1.6f2dc0bc39621p500 ++-0x1.0cc9448729503p734 ++-0x1.c234d03687945p494 ++0x1.7bccb6482f77ep4 ++-0x1.8c5e908aa7fb5p831 ++0x1.b1df92d2ec3b8p283 ++0x1.e333354359049p989 ++-0x1.e892b0f07a619p220 ++-0x1.ec44220b9f17ep8 ++0x1.f25a34ac7fbc6p7 ++-0x1.7472b4254d705p367 ++0x1.22e011afd6d0ep345 ++0x1.065d20ae2ee95p117 ++-0x1.6418273399593p831 ++0x1.388612f03819dp40 ++-0x1.dfc0d7643e76fp-6 ++-0x1.7689e01d3ef5fp189 ++0x1.f48a26de3d1a5p673 ++-0x1.3a86439ca37c9p-23 ++-0x1.de0cb3b3a1df8p355 ++0x1.8fca33d3d5d24p550 ++-0x1.5ee022e10d5ecp145 ++0x1.d65386a7e7b24p408 ++0x1.a75471ed7f723p3 ++0x1.84a43795ffed7p-25 ++0x1.270743fc743fdp404 ++0x1.3fdc27ff3d6f6p16 ++0x1.c2ca7781852bdp415 ++0x1.783d81633686dp295 ++0x1.0c62c5098c3c2p-4 ++0x1.abe5e0d2c9c74p9 ++0x1.8763249337c43p522 ++-0x1.354a300bdf2b4p9 ++0x1.77f8512b9b058p494 ++0x1.85e423863bfb1p299 ++-0x1.ff6a529c5f799p582 ++-0x1.af91845aed73dp292 ++0x1.bbe7d76864319p838 ++-0x1.6b92a5b928341p42 ++-0x1.bc96d3fe8ae11p453 ++-0x1.4cf8e5fdb6606p14 ++0x1.d7a286a93d573p552 ++-0x1.1e168326fabfcp619 ++0x1.2b78d4cf920a5p-11 ++-0x1.8b6761d15a192p11 ++0x1.7e41058d14f88p444 ++0x1.4ed112f6fe397p276 ++-0x1.4db517680987fp623 ++-0x1.2224f5210184cp332 ++0x1.bebb126a84646p845 ++-0x1.3890a2fcd6ed1p771 ++-0x1.ff3303971888bp-10 ++-0x1.c088d7303166fp9 ++0x1.3da6a7f5bc078p14 ++0x1.151f505312964p29 ++-0x1.3d0bb60c7b363p104 ++-0x1.6b9a26936754ap496 ++-0x1.9199b437eccc0p127 ++-0x1.aa36d2b9371b7p445 ++-0x1.0b8f350ea5f8cp-22 ++-0x1.f1f4b4b0405cdp-11 ++0x1.3105b5f0ba9bcp-15 ++-0x1.aa88d154a4ddep551 ++-0x1.0f68f1251f868p291 ++-0x1.9f078781f160cp1012 ++-0x1.9cabe23aae521p577 ++-0x1.4dae06e7b4120p16 ++-0x1.e43e623d48c49p-18 ++-0x1.29ccb1801e4c7p77 ++-0x1.6adca332f1fe7p-13 ++0x1.4d98f1ff8002dp-9 ++-0x1.b5a3575f4713fp470 ++-0x1.6374a29768141p237 ++0x1.af58667bcfbf2p127 ++0x1.128ff1d95cbe2p22 ++-0x1.1cd1c2bf75c3dp394 ++-0x1.911146b47e563p965 ++0x1.c9b034c25b038p1003 ++-0x1.f45070caf3082p630 ++0x1.dab7970bc1de9p1 ++0x1.4aea409a375dfp287 ++0x1.59d34792a5525p482 ++-0x1.50cd458fc25dep253 ++-0x1.759d44cd1fd81p269 ++-0x1.04a6060096d96p-3 ++-0x1.604b42f7ccab0p419 ++0x1.c30db3408e834p20 ++0x1.f7d0003cef355p465 ++-0x1.d33647c71ddf6p713 ++0x1.941117709cdfdp23 ++-0x1.8aaa468ff284bp786 ++-0x1.4c6536f0b6777p-16 ++0x1.8c86677fee3afp133 ++-0x1.0b1b35dbd7737p325 ++0x1.de2f93f581a04p12 ++-0x1.5a3ba4b477d56p15 ++0x1.e83645234e293p24 ++-0x1.3fca1310ff561p74 ++-0x1.2aeb7470b2da6p635 ++-0x1.3f3ad4cd76224p25 ++0x1.09752219591d6p-12 ++0x1.bc88b48080aa6p31 ++-0x1.e98923b202a64p20 ++0x1.bf0474f0f41e2p104 ++0x1.a4e9d3f2451a8p3 ++-0x1.3541735027a8bp560 ++-0x1.f73dd55c810dfp23 ++-0x1.505b10dc0eae6p912 ++0x1.3649c1c465dd4p17 ++-0x1.c777e501c8dfcp21 ++-0x1.5701a0b3897a4p11 ++-0x1.c320c380b445cp712 ++-0x1.1b36c09e0a14ep663 ++0x1.f60ea3f1a14cbp561 ++0x1.c6a3005c06a44p-18 ++0x1.af722598ce867p659 ++0x1.d636c36a5d8afp187 ++-0x1.16a3c0a4e81aap-7 ++-0x1.8f3db57790c2ap-19 ++0x1.703ca04fb8f62p-17 ++0x1.f73de47c2fb9ep35 ++0x1.973a34ff90b9dp-18 ++-0x1.d08281fbb5c2cp838 ++-0x1.be0f904e8c33fp342 ++-0x1.e01d440fbebdap-18 ++-0x1.df0f220b1c2acp-15 ++-0x1.bcc990cf09edap-25 ++0x1.8a350004b6021p21 ++0x1.0746671992572p12 ++0x1.bca1f2ae769dap-25 ++0x1.1c0ee394715fap13 ++0x1.bc9a351ecab48p356 ++-0x1.3e4cb5ef07939p17 ++-0x1.f2b664e58004dp1 ++-0x1.f42ee6d0e89ddp19 ++0x1.5f0a34dcee39dp20 ++-0x1.1debc4db7ecf6p20 ++0x1.0fc713f5c5de6p-3 ++-0x1.5d4db109cd5c4p5 ++0x1.73e807d8297f3p-17 ++-0x1.676ce231eda86p861 ++0x1.ebfa67a80676ep-10 ++-0x1.b9f6a30ee6469p-21 ++-0x1.c73277e6727fdp601 ++0x1.74de03b6dea40p159 ++-0x1.2259c59f68e46p-16 ++-0x1.cd68d2e6479f4p-23 ++-0x1.47b7f6102f2c2p10 ++0x1.cf24a2347776cp-27 ++-0x1.b725b137fdd1dp-3 ++-0x1.009047102718cp993 ++0x1.0771b34af6f2fp-8 ++0x1.049d06f739b38p699 ++-0x1.e8c0710c55d89p-17 ++0x1.23b5322648c9dp-12 ++0x1.cf0fe10d20725p2 ++0x1.50052516748d2p0 ++-0x1.afddd01d4ff78p2 ++-0x1.3e0df401f7903p381 ++-0x1.c9fc3321d1d88p8 ++-0x1.8b10a044fbcabp-16 ++-0x1.89260258d6e7bp14 ++0x1.db24554246421p-25 ++-0x1.420505cd0119bp521 ++-0x1.917894697053fp264 ++0x1.4e4bc6a5bd810p-22 ++0x1.613766f0b8925p-21 ++0x1.96bde6095382ap-1 ++0x1.0028d14831ce2p18 ++-0x1.c2174546c88c0p1017 ++0x1.83ec835c217c5p-10 ++0x1.fe32319f71affp913 ++0x1.3fa26558eafebp-9 ++-0x1.170bc0306f9d3p14 ++-0x1.2da6158b9104bp-6 ++0x1.da4016ececc3cp23 ++0x1.4aeb75f4274a8p74 ++0x1.0feda4108c230p-11 ++-0x1.9e9580350379ap975 ++0x1.8c72429a6c6b8p803 ++-0x1.753eb56c15fc4p205 ++-0x1.a8d226aa188ddp10 ++0x1.552f237c39a5cp24 ++-0x1.5101e740c55d2p-2 ++0x1.f83282678cd2bp87 ++0x1.380e51076f80ep17 ++-0x1.4e58c2d312887p1011 ++-0x1.709a10ec34872p-8 ++0x1.c115c4b52dd81p-11 ++0x1.dbf4f68b24b22p175 ++0x1.fdcfc21030c47p13 ++0x1.e3c234340a70cp870 ++-0x1.7ef4c3f9f118ep-17 ++0x1.4d8ec7ddbe0a5p-5 ++-0x1.ca4ae67422cf1p46 ++-0x1.1e79333cf2819p-16 ++0x1.088641b858387p14 ++-0x1.93191290365a6p163 ++0x1.f321d1dd96f4fp756 ++0x1.e771b71cceff9p8 ++-0x1.ae56c771a7cffp18 ++0x1.4ba1448b1d144p408 ++0x1.8439648ab93dep17 ++0x1.65f514736d787p943 ++0x1.fb6472b3bce83p334 ++-0x1.73e6857d4cf54p879 ++-0x1.0cb95433e6b2fp-1 ++-0x1.27ae632085c5ap2 ++0x1.f68fe052bec12p753 ++0x1.a8cc8446b7afcp17 ++-0x1.9e2494726de25p25 ++0x1.d825d64df0641p10 ++-0x1.ba99b6fb023c9p141 ++-0x1.53a8b1ea85f56p11 ++0x1.bfa5e68028b9cp930 ++0x1.feccf31f1a983p-5 ++-0x1.88d3a0062385ap-16 ++0x1.50f3313a7d76cp24 ++0x1.3ba8870e96502p727 ++0x1.fffc900187a9bp761 ++-0x1.683c12d0f5288p-5 ++0x1.89f8430bf5854p895 ++-0x1.dd1c76087e343p-11 ++-0x1.2be8706763f1ep-9 ++0x1.359462ac17cd2p15 ++-0x1.a972c2fa07af1p1 ++-0x1.fce055f5fd92fp397 ++0x1.93d615d9775fdp7 ++-0x1.a734a251665eap-21 ++-0x1.96aec33f91274p3 ++-0x1.d088b0ef518b3p24 ++-0x1.e36ff2227faa0p664 ++-0x1.968c9528f761cp-18 ++-0x1.55feb6226d9c6p-12 ++-0x1.c5fbf2dc0f1d5p374 ++-0x1.30df34bf0f038p-5 ++0x1.75ff2344da2ebp638 ++-0x1.6c95073fd64f5p-3 ++-0x1.80ecb21eaf859p23 ++0x1.a395a3209e01ep24 ++-0x1.08fa41560be83p-17 ++0x1.f5129125f47e1p-24 ++0x1.ea61c1b68dbaep-25 ++0x1.f9980204cad5bp13 ++0x1.ca5571cae9585p300 ++0x1.1457460444b6fp308 ++0x1.f75fc7df35e9bp463 ++-0x1.259877b2c7433p808 ++0x1.4c4fd2558a03dp-2 ++-0x1.77e600a0f8d1ap10 ++0x1.ce0a20f8622dbp782 ++-0x1.163735c430e54p21 ++-0x1.077f533341f7ap-25 ++-0x1.5bbea1334dce3p22 ++0x1.17edb056a1e69p582 ++-0x1.ab2f3216588abp-8 ++0x1.ad5473156bcecp608 ++0x1.495167c77e0b7p1002 ++0x1.ce1fb4d50c2d2p-2 ++0x1.0b6367a2e5b51p-13 ++0x1.4bebf24710022p18 ++0x1.cf035256dea51p-15 ++-0x1.b2d165e3c4438p329 ++-0x1.415066810a6ebp5 ++0x1.231e43a52fc6cp759 ++-0x1.3ad3866e7e5a8p-23 ++-0x1.f5ac52c3f7320p364 ++-0x1.3d01b455ea097p-23 ++0x1.a57f56aa1cc32p9 ++0x1.043250b5cbb79p892 ++0x1.49de321920550p721 ++0x1.c870766bd9d53p80 ++-0x1.c4fd755e743ffp21 ++-0x1.b37d062015770p-2 ++0x1.5022353402118p0 ++-0x1.c896463f5386cp-7 ++0x1.6f2f169391729p-17 ++0x1.bd8476b405432p250 ++0x1.322de42f4c84ap22 ++0x1.c3a2c33bf9e6ap43 ++0x1.9793e2027ca1bp19 ++-0x1.cced16209f116p-5 ++-0x1.535c83351d7dap13 ++0x1.5ab2e7182498ep1 ++0x1.c2aa0412973d9p19 ++0x1.6d5087c15f8b6p8 ++-0x1.cd9e619dfc1f9p272 ++-0x1.a291f0cf8c7f3p491 ++-0x1.7726454f22bc9p16 ++0x1.01d737edff679p-18 ++-0x1.2eee17c89d93ep18 ++0x1.d690a2fbc75ddp17 ++0x1.e477309fee5e9p-5 ++0x1.265176315b6b7p548 ++0x1.d036d3c6d89f6p4 ++-0x1.70e42649dec93p26 ++0x1.685656f96535ap21 ++-0x1.1cfd02fa51fdep-2 ++0x1.75d1455fcfa44p590 ++-0x1.718613f6ca999p645 ++-0x1.b254238b7bab4p472 ++0x1.7afe534d5251bp-9 ++-0x1.b3cdb07891d41p-2 ++-0x1.f956817bbdd80p704 ++0x1.e04a74104462dp14 ++-0x1.d953d153059f4p43 ++0x1.9a4fa2868350dp878 ++0x1.7efdd4f9e156dp671 ++0x1.940ad2c424e0dp69 ++-0x1.4d5ad6e0fa515p-12 ++-0x1.975f1701f1516p10 ++0x1.686ff10e39dcbp-18 ++-0x1.47c80041fd8f7p-6 ++0x1.0bbcf0786c446p-1 ++-0x1.7dc7163623c62p-16 ++0x1.c773a0bde09abp14 ++-0x1.59776427dd29ep22 ++-0x1.c428306233d02p1 ++-0x1.2b34449d61818p18 ++0x1.946545746e430p568 ++0x1.fc5d70b15d6a1p-12 ++-0x1.33c530a2e703ap198 ++0x1.4586c7aaed300p23 ++0x1.4047f3cea71fcp21 ++0x1.d95a0359eb81ep13 ++-0x1.2027133fa9651p-15 ++0x1.4c9c737d289bbp993 ++0x1.29ed82663c830p19 ++0x1.2a2431406668dp964 ++0x1.140c003d7b003p692 ++-0x1.ca47d1c5105abp778 ++-0x1.1e42d4bc3a5bbp621 ++-0x1.c487c6add8db4p104 ++0x1.5240c7e94fca2p346 ++0x1.8a21e49e99f87p739 ++-0x1.ec7a3732512efp665 ++-0x1.e7e0c60c72a8dp666 ++-0x1.4b2df12f55803p16 ++-0x1.1a11950ff7262p253 ++0x1.913010e21977cp22 ++-0x1.557b91af754ddp548 ++-0x1.1a5a85b93333cp0 ++-0x1.152436888890cp10 ++0x1.6242f32a2b3a9p24 ++-0x1.33e4b774b0406p79 ++0x1.4d20507145703p18 ++0x1.805ee638666c7p1001 ++0x1.2088f31deb3dep26 ++-0x1.2136d4a8edf58p369 ++-0x1.a5c002d03e071p350 ++0x1.8e25144772023p619 ++-0x1.49c336247aab8p20 ++0x1.209f141d6a3f0p905 ++-0x1.7df363dd844bbp301 ++-0x1.d8c5a2fad0ddcp843 ++0x1.955904e859e69p-2 ++0x1.b78170f9c0f21p396 ++-0x1.1856132fbf136p-1 ++0x1.daadd2d9a8fb5p366 ++-0x1.904c42e144851p840 ++-0x1.1086823c84588p579 ++-0x1.eee3b28d8e277p18 ++-0x1.601eb2587f407p532 ++-0x1.e77f45947cdeap646 ++0x1.ac9d1257a463dp8 ++-0x1.6022b4ad26dfbp0 ++0x1.35d246dce052dp257 ++-0x1.d87a368873c5ap11 ++0x1.b79c7081c299ep249 ++-0x1.e9b573eed4beep380 ++0x1.87fb012c6dbe8p22 ++0x1.9ff675e52fd5ap10 ++-0x1.e768e1c4dc0c4p336 ++0x1.eadd71dae6ae0p12 ++0x1.8097a2036b3f4p926 ++0x1.88fb542f66420p9 ++0x1.6548027f7a3a1p23 ++-0x1.9830129387949p17 ++0x1.c3d7c15bf28c5p4 ++-0x1.53daf69f10b1dp0 ++-0x1.b90f21ac330e5p21 ++-0x1.9b0a377b76cdep21 ++-0x1.d0a0a05604f38p-1 ++0x1.e3e8b72617fc0p17 ++0x1.ed2f26a4f9de4p19 ++0x1.af91858c30b58p20 ++0x1.4abc00b2bfabfp24 ++0x1.dc67b22b6d111p5 ++-0x1.c247046a455a1p9 ++-0x1.fb41c728f7cbcp14 ++-0x1.891962b6634f3p7 ++-0x1.7cbac2b76a18ep13 ++-0x1.fb101566432dcp25 ++0x1.90448733f0f47p23 ++-0x1.8884367e47700p13 ++-0x1.37d7a4bfa5918p15 ++0x1.778a11c7fccd0p22 ++-0x1.33526112284dbp22 ++0x1.acb6870fb9e6ap21 ++-0x1.5a7ec1b268139p0 ++-0x1.0ea0c6bcbb4cdp17 ++0x1.0eeb153b1d5cep-2 ++0x1.2915060d6792dp19 ++-0x1.f1c193bf9731cp7 ++-0x1.a37b92d1c834bp17 ++0x1.ea6c164f563d3p5 ++-0x1.c1a342aeeff9cp18 ++0x1.341f80345a109p18 ++-0x1.b96f42fb8bf4ep21 ++0x1.ed99773e5e0b2p-3 ++-0x1.1b9c620a22bdcp20 ++-0x1.93a342bce9d83p25 ++-0x1.5647879df4c39p5 ++0x1.1b5a74379d8bcp22 ++-0x1.f65e80bbc64e4p1 ++-0x1.f514118cd579cp14 ++-0x1.d72c805888cd1p20 ++0x1.891fc407363cbp0 ++-0x1.f5f910e2a922ap21 ++0x1.13ab76a6396c5p6 ++-0x1.779c34504754cp7 ++-0x1.0f44243ca88f6p4 ++-0x1.94d8e73e1e8d3p14 ++-0x1.86ae04f21b804p22 ++-0x1.dbaf1624ab130p11 ++-0x1.e2b2534178f87p5 ++-0x1.cd1f04e46ab89p4 ++-0x1.534e73dbf82d9p6 ++0x1.d77307aacf285p16 ++-0x1.d02d057014609p22 ++0x1.63c7f14ec1826p18 ++-0x1.4700d06054318p23 ++-0x1.8c9e77f2c5169p20 ++-0x1.4440d5499645bp13 ++0x1.f830d1530dc5cp6 ++-0x1.3158f1b64b60dp16 ++-0x1.fa3cd6daa1a84p14 ++-0x1.6f453297966cfp2 ++-0x1.b50c62db9fa33p24 ++-0x1.1f01b348e43cfp3 ++0x1.f96f42e962369p15 ++-0x1.d42235ed34040p11 ++0x1.6a97b4ebe527ap25 ++-0x1.069365a978478p19 ++-0x1.301312077210ep5 ++-0x1.079ed7eb88a2cp20 ++0x1.e181d27a14ee9p22 ++-0x1.1a6ef1e1b02b6p1 ++0x1.605322092fdb1p16 ++0x1.28cc961d4d565p1 ++-0x1.0d1b956eefd65p21 ++0x1.136a46db7583dp12 ++-0x1.463a51e655419p3 ++0x1.06b280c58f749p4 ++-0x1.81a8422a0e891p10 ++-0x1.36d660b754afep2 ++-0x1.869b518b7abf6p23 ++-0x1.ca5da55d82232p6 ++0x1.c7b553dac1cd9p7 ++-0x1.5c85b71c923d3p9 ++0x1.cd38e05f93bd8p23 ++-0x1.72322760da308p6 ++0x1.2696c6205df80p-2 ++-0x1.c31466f5abe12p5 ++0x1.53ca818613b56p15 ++-0x1.6d0e32af8c7fap25 ++-0x1.82c493bc254bfp7 ++0x1.29b5476d3c003p-3 ++0x1.545ad52476bedp2 ++0x1.210de622c50fcp13 ++-0x1.4ce9501256fecp7 ++0x1.bec8f2a75761fp-4 ++-0x1.ef455712f7403p24 ++-0x1.05ac51c61d35dp10 ++-0x1.179912e48e4d8p2 ++0x1.8309468cee051p-1 ++0x1.4ba7338d7adb9p-4 ++-0x1.86fb84d7687fbp13 ++-0x1.b440d2dfa7cfdp-3 ++-0x1.f21935fed929cp24 ++0x1.248647fb68621p9 ++-0x1.49cbf71886ed9p-4 ++-0x1.46b18502c494cp6 ++0x1.d60453a7627dcp9 ++0x1.90d72030622a0p-3 ++-0x1.99dc012169112p20 ++0x1.5b1582ba1840ep26 ++-0x1.a2d0e6722064cp10 ++0x1.51d930a0faa1cp-1 ++-0x1.e2f5b411dfbe0p11 ++-0x1.8978d711c2457p-3 ++0x1.9f390111d8e17p-4 ++-0x1.64e526c906dd9p15 ++0x1.3442b50cfed58p17 ++0x1.696de2ba96decp3 ++-0x1.1797a538e22cfp14 ++0x1.6b9a91b6bc0b6p15 ++-0x1.230dd7b9de0efp25 ++-0x1.c570875d25b1cp17 ++-0x1.4e93f3cd23d0ep7 ++0x1.836bf1949fdd9p-1 ++0x1.d55994d3bc6a5p22 ++0x1.34976081e3c93p0 ++0x1.325232301be88p-2 ++-0x1.724d85212c2bep21 ++0x1.f6ea543e490d8p16 ++0x1.9816822b9c9eap5 ++-0x1.2c5942e617f9fp25 ++0x1.9916d5a987c95p4 ++-0x1.9e10b7e75a799p17 ++0x1.cd41449ad1c08p14 ++0x1.bfbd219130397p10 ++-0x1.d299552d58110p20 ++-0x1.10990673db383p24 ++0x1.6860579da3e41p4 ++0x1.57c17718caa8fp16 ++-0x1.d480c713e380cp2 ++-0x1.5ef770cc4fd6fp-2 ++0x1.63fe54f142182p-3 ++-0x1.e57fe1748c166p25 ++0x1.38e472a1b69aep-1 ++-0x1.d7eb84d9725a8p19 ++0x1.979751083fa46p0 ++0x1.af7d8295ca361p0 ++0x1.93d6033938ce4p16 ++0x1.60d5f07b31fe1p23 ++0x1.d345416a2b360p14 ++-0x1.1451d5a8abe28p26 ++-0x1.da4ba1007d69fp7 ++-0x1.5c7583f8bbbb3p22 ++0x1.8c85070cab228p20 ++0x1.bc26967cda999p17 ++0x1.bcfc7238281b7p14 ++-0x1.f936f6a071917p0 ++0x1.c00e11c935746p0 ++0x1.759dc14fe7eb9p10 ++0x1.26c7d5b4b926ep5 ++0x1.c6512134c5122p-3 ++-0x1.9ebe3455ed58fp9 ++-0x1.be4832965373ep17 ++0x1.7f68b772cfc9ep18 ++0x1.baca2181e77dep17 ++-0x1.c2f755dd7a244p19 ++0x1.c4de32af2dd91p18 ++0x1.589f6697070fap22 ++-0x1.4a37b4210f303p8 ++-0x1.4ecfe0a126fb0p5 ++0x1.89dcb692c40e7p10 ++0x1.7d6342e0df42fp21 ++-0x1.0aec35f5f853bp-3 ++-0x1.7f68335d52ca5p10 ++-0x1.84f6e31758356p5 ++0x1.3a5a166d0b827p16 ++-0x1.eba706d2de457p8 ++0x1.489f72add92f9p5 ++-0x1.da6b250d6a545p23 ++-0x1.e50b35770abc5p-4 ++0x1.4b1b40263e386p6 ++-0x1.e6864361f583bp6 ++-0x1.bf8ca4dc53bfcp23 ++0x1.5de1b4a13724fp5 ++-0x1.3ccf14da239a8p16 ++-0x1.2c352220b6d92p19 ++-0x1.7a1a04680b72bp9 ++-0x1.63e577fdaa152p15 ++0x1.8dd7323abf3d4p-2 ++-0x1.7896d1e003d8cp5 ++-0x1.b4a72034750d1p19 ++-0x1.c9752551240f4p0 ++0x1.88c816d89c028p7 ++-0x1.e765347c03b1bp1 ++-0x1.f5a3e6d431f22p10 ++-0x1.bcbd4269b3468p-3 ++0x1.27d5c33a2b9cdp24 ++0x1.c24173c80f8fap-3 ++0x1.e5d8c7f661bdfp12 ++0x1.f248554706676p23 ++0x1.6b9b012dc2faap25 ++-0x1.c53702c39d6b5p10 ++-0x1.ba8441a0e4b94p13 ++0x1.6276f46c87421p23 ++-0x1.cab117d6a7540p2 ++-0x1.696a408d00cd8p22 ++0x1.a85c0033d55eap20 ++-0x1.f1d5338e62f8fp17 ++-0x1.cab73716e3a08p6 ++0x1.7ff7625f9ca6dp23 ++0x1.fee2e4e051542p25 ++-0x1.898ec4cbce2fap13 ++0x1.054c5714bee5bp1 ++-0x1.e769a1325c9b3p18 ++-0x1.00ef90bb0ea31p13 ++0x1.d99cf6f223a12p7 ++-0x1.4802b635a9faep6 ++0x1.5c49e6bca57d7p9 ++0x1.9cfa3500116d8p3 ++0x1.20a380697021fp22 ++-0x1.cc9ee1c701912p-2 ++-0x1.159814f41ffddp12 ++0x1.bcdae38e2096bp19 ++-0x1.a4c564a58485ep0 ++-0x1.b3ccf11be8cb0p3 ++-0x1.2e036784747fdp-4 ++0x1.3178b79bf23d6p15 ++0x1.762022e7db160p3 ++-0x1.19abb2ad29c47p0 ++0x1.702aa52a2b081p2 ++-0x1.3b2f85e3448eap15 ++0x1.fba527184dd2dp0 ++-0x1.0e13b3dc07053p5 ++-0x1.6e3d0266ae8b8p5 ++0x1.5a2d64a6aa882p14 ++-0x1.409c93e21717ap0 ++-0x1.90c8d5e8d4dbbp-1 ++-0x1.c6f751e442d8dp14 ++0x1.ba19007f25633p1 ++-0x1.30f675c6b9d89p10 ++0x1.f5966161ca0f3p19 ++0x1.8f2fb44baebe3p-1 ++0x1.974bc69c68cabp24 ++0x1.c56de726c32d3p0 ++-0x1.10dc876280044p10 ++-0x1.0aae85d11cbc7p3 ++0x1.fc6cb52005104p15 ++0x1.05e5130ff091ap25 ++0x1.e1ba941321d52p1 ++0x1.66c5a13cdadc8p5 ++-0x1.55c8322221dc9p14 ++-0x1.92bdc5556bd73p14 ++0x1.096e742861630p1 ++0x1.2a16e7c69bc3bp4 ++0x1.da44529305931p16 ++-0x1.c2d2d332c16bfp24 ++0x1.20c675f6fe727p5 ++-0x1.d38d6225474d3p23 ++-0x1.481de5e77c136p2 ++0x1.d279c02f61ae3p2 ++-0x1.e7d9573de4581p11 ++0x1.35fe74c080235p-1 ++-0x1.ac005162cad81p12 ++-0x1.13b0a70cb376fp22 ++-0x1.ebb45106c5803p24 ++-0x1.1dc057ac89a8ap3 ++-0x1.b8c0d151742e0p16 ++0x1.970375264e6a1p10 ++0x1.7e866527c9d49p12 ++0x1.c2ddf22b1bccbp1 ++-0x1.ab4174efa2f0ap15 ++-0x1.e253067271c08p2 ++0x1.0d4fb486d614ep1 ++-0x1.abd6e292f5548p17 ++0x1.eda5e7728b075p14 ++0x1.1454a6c45a426p23 ++-0x1.25e591a6a9a8cp0 ++-0x1.7cfbf5669ec46p12 ++-0x1.4679e1cbdf113p8 ++-0x1.ce9af0afc0c65p4 ++0x1.62f4634b7620ep4 ++0x1.62a9b3c2b9823p23 ++-0x1.1769864efbd8dp3 ++0x1.f34715ef52c0fp-4 ++-0x1.8b62623c188c7p8 ++0x1.7975e1f8c7996p-4 ++-0x1.3bb2403639e82p0 ++0x1.b19f02fc16c82p17 ++0x1.570b03b60ea6ap25 ++0x1.7b12645745ec7p25 ++0x1.c49c016ba07efp-3 ++-0x1.9654e0923906cp1 ++0x1.df287182db6fap-1 ++0x1.8082a573c5c90p9 ++0x1.067783759fc7ap1 ++-0x1.0193d3485481bp19 ++-0x1.f21fe48c86139p25 ++0x1.3b79f760c1f6bp6 ++-0x1.dfea72f0a3541p24 ++-0x1.6c0bc68338735p4 ++-0x1.585dc43d90bdcp-4 ++0x1.0b4a74ddaeffbp7 ++-0x1.96334231685ddp-1 ++0x1.f6f5538f88159p3 ++0x1.9b4c653dc6242p-4 ++0x1.8be735e377e26p-1 ++0x1.e11465e6856f1p0 ++-0x1.7198d0b28bc64p-1 ++0x1.dcbed3c85165ap9 ++-0x1.75cf96486fb5fp8 ++0x1.bc5d4762ed95ap18 ++-0x1.b4ab765a2ce10p2 ++0x1.eb8d56eda92c4p6 ++0x1.513d51d6c544ep21 ++-0x1.724cb58ad93ecp-2 ++-0x1.ae2f075a1c1e9p-4 ++0x1.3b27a36ab9d59p18 ++-0x1.3d35f4b149caap20 ++0x1.5d2301f5b984dp10 ++-0x1.b4f9911c7cbd5p5 ++-0x1.3c85c4e8893f2p0 ++0x1.ff16d24d0bd20p-1 ++-0x1.587e438ccd381p17 ++0x1.ef7cf5c296d36p22 ++0x1.e83847d5313bep18 ++0x1.7e01f150d09a5p4 ++0x1.d1c293dd145c8p3 ++-0x1.585e926cd5b1bp-2 ++-0x1.fb42f3ec59b27p3 ++-0x1.59b854f3c58b0p13 ++-0x1.f841b3d82549ap6 ++0x1.4aaa17e78776ap13 ++0x1.be3491ea08398p19 ++-0x1.8157656f77f49p10 ++-0x1.ef5b133a05238p9 ++-0x1.a84b3275b47aep-2 ++0x1.d2d40379eed33p-2 ++-0x1.b38e5132a2518p1 ++0x1.0b583593881eap1 ++0x1.de0c21d2e13f6p2 ++0x1.e57f91ef79d08p21 ++-0x1.35787426e7659p0 ++-0x1.2fc096d91558cp10 ++0x1.ca92d112801e6p-1 ++0x1.c130f673f9d00p3 ++0x1.ab43360e99861p7 ++-0x1.dfc494915cb98p16 ++-0x1.662a1708721aep23 ++-0x1.632a633f7b779p10 ++0x1.900746f103c7bp18 ++-0x1.1725a276c7758p13 ++-0x1.01e616e258a20p10 ++0x1.161df51eb42d5p16 ++-0x1.9116109f57baep-4 ++0x1.0924248619f04p-3 ++-0x1.528a30859b8aap1 ++0x1.3214b1efe1264p11 ++-0x1.279bd7646bb1fp14 ++0x1.9cac25e81f355p5 ++-0x1.c1b4e4b65f4c8p15 ++0x1.b9446219929c9p24 ++0x1.85dbc095a8b7ap15 ++-0x1.71a3c59471916p19 ++0x1.390f94db871c9p3 ++-0x1.667266143481ep-1 ++-0x1.3f41661ad1011p-3 ++0x1.39e7b0627a056p4 ++0x1.4be6257d4db36p1 ++-0x1.42b4f39ad58a8p21 ++-0x1.0ddfc3c773e9cp0 ++0x1.3e0b505a62bfep23 ++0x1.17ae947b55a16p3 ++-0x1.450e033bf3474p3 ++0x1.fc5a706652876p3 ++-0x1.ec85a78011932p-2 ++-0x1.1a2587c2acc7ap19 ++-0x1.0413c7bd307d9p-3 ++-0x1.c14f93438c9c7p24 ++0x1.c23452cc49201p0 ++-0x1.822bd11a73bb1p-4 ++-0x1.50a39655d03a3p19 ++0x1.93da259e63c6bp19 ++0x1.2b38c33777246p0 ++0x1.16ab521fc8f08p-2 ++-0x1.bd2e1426c0b97p9 ++-0x1.3f66f1cab29c2p24 ++-0x1.89542080e7b23p2 ++-0x1.a57e9572fab9ap-4 ++-0x1.ea38e30d4f2e9p-1 ++-0x1.6980315b826ffp21 ++-0x1.5f0ed5102c7e4p23 ++-0x1.bcee5575ad4e3p25 ++-0x1.f9a690462f13fp-4 ++0x1.b19d857513a36p20 ++-0x1.b14a15fcc1146p8 ++0x1.949ce3f3aeaedp13 ++0x1.d8b3403249e60p16 ++0x1.b42cd3bb4ca54p-2 ++0x1.805807a27361bp7 ++0x1.fa5ab42962ce2p24 ++-0x1.390543514c4d6p7 ++-0x1.a786543bad777p8 ++0x1.d38f169be1c02p18 ++0x1.a22dd22ff3ad6p3 ++0x1.5dafb7808dbe5p-4 ++0x1.c9dde4e221c90p-2 ++0x1.ad9804a975e98p7 ++-0x1.6b6343d804919p-4 ++0x1.40efa3258a7e0p-2 ++0x1.4994104561818p15 ++-0x1.202c76ef257b1p10 ++0x1.9dabc7786d2c8p3 ++-0x1.1bcf75d5e6e6ap4 ++-0x1.8802471c77a93p1 ++-0x1.8edc21142d145p2 ++0x1.21c2c22bbc29cp10 ++-0x1.6a6c82b8898ddp4 ++0x1.a3adf1a7b1a13p3 ++0x1.49d3d7c9f2254p13 ++0x1.b79d130f9431dp-1 ++0x1.0d1b7459c7e69p1 ++0x1.ab10c361ca6dep6 ++-0x1.fc0e761dad4fbp3 ++0x1.c45ad1e916b60p-4 ++0x1.077d3554fe489p0 ++0x1.dc36d78d24b31p3 ++0x1.60ae735b6f4b7p0 ++0x1.ee39527f71eb4p15 ++-0x1.6e7213bcc9467p0 ++0x1.431002c64536ep16 ++0x1.e5be6089f8d20p1 ++0x1.5e46b0f01f53dp23 ++0x1.69fff66d50910p0 ++-0x1.a0e9131bb56dbp18 ++0x1.674805aee7412p-1 ++-0x1.dabff64ead53ap0 ++0x1.d4a2274cff182p-1 ++0x1.fb3a27edc048bp1 ++0x1.a82744aaa00eap-4 ++0x1.302d4443c6c04p0 ++-0x1.2dc450ab7367fp-2 ++0x1.3cada637e6251p23 ++-0x1.1ba7f471bf8cep18 ++-0x1.a9a1b0bc1f9f7p1 ++-0x1.21a6435313043p-4 ++-0x1.72f020a7330b1p20 ++-0x1.9d4906d826708p-1 ++-0x1.b78fc5f05bc95p3 ++-0x1.156706eda9f85p4 ++-0x1.59c5832441b87p11 ++-0x1.de49e509aa110p9 ++0x1.e395a4ef1ad69p-2 ++-0x1.085cd295378c4p5 ++0x1.3a3167bb15567p19 ++0x1.f1c1f7a981956p17 ++-0x1.d57eb0ccc1192p24 ++0x1.49c4a7fce174dp12 ++0x1.42a6f5366340bp3 ++0x1.c73946000ef3cp15 ++0x1.31ce910c8f277p-4 ++0x1.0e1e520b20462p7 ++0x1.3c2672f8a2c03p12 ++0x1.0f9a64fdeb055p7 ++0x1.922625557e01ep-1 ++-0x1.abd306314559dp0 ++-0x1.1cdb82c46c748p22 ++0x1.f8b26607a6659p12 ++0x1.e5f5a3659806ep16 ++0x1.8a997615a5e47p4 ++-0x1.9a88b64eed8c5p12 ++-0x1.d685f50d87896p23 ++0x1.817095a80c3b6p-1 ++0x1.6142c7c1265e2p14 ++-0x1.d148003201454p5 ++0x1.2e8a76f17e51dp14 ++0x1.427402f1c86dcp0 ++0x1.9b2d423fdfa51p-4 ++-0x1.86f0c60e56f2ep-2 ++0x1.b32e43a763dc8p-1 ++-0x1.8cff449c1e97dp24 ++-0x1.880110436ba05p-1 ++-0x1.97b7d36271db4p1 ++0x1.f30b30d1aa293p-4 ++0x1.e5ada37f74455p19 ++-0x1.c26e223a61790p22 ++0x1.13a14657deeb3p4 ++-0x1.6478570f08c98p0 ++0x1.ceda65c15f255p11 ++-0x1.f62630fc890a7p22 ++-0x1.7782824757591p24 ++-0x1.98bfd567b54f1p-1 ++0x1.1c6955755acc0p3 ++0x1.65ac87fd01210p4 ++0x1.7bf572a17df2bp-2 ++-0x1.10ba33750f2b8p12 ++0x1.0eb2a5c9e5ab7p11 ++-0x1.a36377f89ac61p9 ++-0x1.1ef0e24d3ae7ep25 ++-0x1.754f03aa6e28dp4 ++0x1.ee53f7fbf6eafp-2 ++0x1.f50fe52b03ffbp2 ++-0x1.638950b33d379p1 ++0x1.3995d5405f180p2 ++-0x1.9d77e47674aa8p8 ++-0x1.32a0f62f354a3p21 ++0x1.26dbc38bc8937p22 ++0x1.3b7b3206286bdp-1 ++-0x1.4ee7f59ce5c39p4 ++-0x1.d6a1e75344b65p13 ++-0x1.d718e5bc70942p10 ++0x1.3f5d423f663fcp13 ++0x1.f01b35c0d9d59p25 ++-0x1.8bcc84208bd5dp-3 ++-0x1.181ad4f3244b1p16 ++0x1.0273210f71286p18 ++0x1.d29bc36a4515dp11 ++0x1.a20d92a1419efp15 ++0x1.2f51d558be78cp16 ++-0x1.5e6b84e9ec483p10 ++-0x1.16a2b6ee1de0cp11 ++-0x1.569474dd1954cp16 ++0x1.fb10a07b26f8fp19 ++0x1.8585c235045a7p5 ++0x1.d3337464c4076p2 ++-0x1.972fd5ff17f98p3 ++-0x1.2ed312782dbfbp17 ++-0x1.efa051135e1aap8 ++-0x1.f710d597fef71p8 ++0x1.aa8dd6f8a9beap9 ++0x1.9f1dc377cf120p2 ++0x1.62c3a7358a4f6p11 ++0x1.34efa6be82f88p14 ++-0x1.184f25cf949f5p0 ++-0x1.3f7491d3e3894p12 ++-0x1.f221e4559b24dp3 ++-0x1.f342571a6ca3ep1 ++-0x1.b50c874b791dcp23 ++-0x1.6b12a335d95e7p-2 ++0x1.73cf16b52cc79p2 ++-0x1.b18fd6ef0fcc4p-4 ++0x1.261c17c736b83p0 ++-0x1.c86005afe1b46p0 ++0x1.0fd231c7aab56p-3 ++0x1.3b66100eade0cp-4 ++0x1.1b62615d4579dp1 ++0x1.cadb62a061c44p24 ++0x1.3ae06343b6bcbp14 ++0x1.f291c2e85d959p-3 ++-0x1.061340896769bp1 ++-0x1.2bd0077f3cf19p-2 ++-0x1.ad7016b69a63fp-4 ++-0x1.e62a635c849dap20 ++-0x1.0b91a74b137c8p13 ++-0x1.90d2306d27347p8 ++0x1.844f36ffbcbf5p7 ++0x1.a43987044698dp3 ++0x1.4b28a54b06fd8p2 ++-0x1.13f7a05c3396fp-1 ++-0x1.a7f08659fdc44p7 ++-0x1.6230f3bb15667p1 ++-0x1.bb4c27fb03a6fp19 ++-0x1.abd3330e2907dp0 ++0x1.a10a926b01f22p20 ++0x1.4ef4737029ef8p20 ++-0x1.4fbc07dc0319fp21 ++0x1.4f5cf32c6f33fp20 ++0x1.9246404054591p0 ++-0x1.6556d1b2edaedp-2 ++-0x1.8609762c8b440p19 ++0x1.f7e69735662a3p25 ++-0x1.e924f3e7030bep15 ++-0x1.9288c5e79cf59p-1 ++-0x1.576322583b5e2p3 ++-0x1.36e724118914dp17 ++0x1.5af0268d084b3p0 ++-0x1.8677c0dacd6e4p3 ++-0x1.5499134382165p4 ++0x1.bbca46c3b4d52p0 ++-0x1.163cb68bf3dccp-1 ++0x1.cef2e67ee56dfp5 ++0x1.f6364662207f1p22 ++-0x1.c2e3f1f65d52dp1 ++-0x1.9d8c95af70b3fp2 ++0x1.a14de64f1781ep1 ++0x1.b20186799badbp14 ++-0x1.399014458c7f0p-3 ++-0x1.0fc4b2f3ed7c7p-4 ++-0x1.eded7159875dep0 ++-0x1.a263c32babe5cp-1 ++0x1.f58cb01f888cap-4 ++-0x1.697672487c482p18 ++0x1.5c460397011dbp-1 ++0x1.07b5c65ec8ad3p15 ++-0x1.4eb6a36be78ecp-4 ++0x1.e310154adf232p-4 ++-0x1.da842458624edp2 ++0x1.35a40221fabbbp3 ++0x1.ffcc323b881e2p-4 ++0x1.ee99c7c780be9p-4 ++-0x1.f901049a4f638p11 ++0x1.d3e7502eab4b6p-3 ++-0x1.253ef59d5b22bp3 ++0x1.059d75fdfb006p1 ++0x1.cbbfe23e9b204p1 ++0x1.d708f03a832c7p-1 ++-0x1.ab75a3d27c91ep-4 ++-0x1.6be4347f71cc1p-4 ++-0x1.e8c9e1c74124ep-2 ++-0x1.0e5f50bd9ab17p0 ++-0x1.057b22cc1ca57p-2 ++-0x1.4214a3145eee7p16 ++-0x1.8ff493b4d0161p3 ++0x1.ff71c54ac0722p1 ++-0x1.cbeb16791916dp2 ++-0x1.dbaa7305da875p2 ++-0x1.9e4ca5923b8f7p5 ++0x1.85a4e1dc18565p4 ++-0x1.66a210312f4fcp3 ++-0x1.60ff74a0b47d6p-4 ++0x1.2262b5f1adeacp-1 ++0x1.4c7db0b6a7422p4 ++0x1.e3e8f16cceb2ep6 ++0x1.ff5074ef37c49p0 ++-0x1.10e6c770bce9bp4 ++0x1.c6a3a0025e5dap22 ++-0x1.0bb1439478f5dp-2 ++-0x1.6fb0156408828p2 ++0x1.b28ff518979b6p1 ++0x1.9f63566d75ba1p0 ++-0x1.cdbd94929acf6p16 ++0x1.f3dd143481244p-4 ++0x1.5769939835a80p-1 ++-0x1.6b4ea312b9249p-2 ++-0x1.a73b84ba8d9a0p-1 ++-0x1.841c832628699p-2 ++0x1.15d930c5d9513p4 ++0x1.41317671877f1p24 ++0x1.c75165ddd78c0p0 ++0x1.693575a9d1138p3 ++-0x1.717b171687985p16 ++-0x1.945b94a09037dp-4 ++0x1.927ee26038e68p2 ++-0x1.f599772ffd90bp19 ++-0x1.5c5b47eaa8583p0 ++0x1.89ecc1f399ce5p2 ++-0x1.9feaa603120d3p-4 ++-0x1.61b0d15368a4cp19 ++-0x1.dd65243b8102ap-3 ++-0x1.d01653391399cp-4 ++0x1.a6fa353616c25p-1 ++-0x1.186f755c9547ap13 ++0x1.8ea3a743322dbp4 ++0x1.01f3d2122c4b1p13 ++-0x1.b43ad29df2703p2 ++-0x1.7ae312c61df29p2 ++0x1.b8bdf3bef563bp11 ++0x1.f8e434e9db303p-3 ++-0x1.f2c9a511ea803p1 ++-0x1.97c2f0e9d43b1p-1 ++-0x1.116c80ce25470p-4 ++-0x1.5a980694bcb2fp-2 ++-0x1.32e545c122be7p17 ++0x1.fa5101a1db44ep1 ++-0x1.acbb05a4fcad6p2 ++0x1.9c7b63462ad27p-1 ++-0x1.0b5fc67ab2279p-3 ++-0x1.db886026a7769p3 ++-0x1.fc0015986ba7dp3 ++0x1.08da532d7c2d8p2 ++0x1.1efed083d86d2p3 ++-0x1.93ddc734949adp-1 ++-0x1.8139b09417df1p5 ++0x1.b19e95af39a66p-4 ++0x1.fa36f74895f3dp-3 ++-0x1.8a50f1b23e664p2 ++0x1.eb65d4abdfdddp24 ++-0x1.5b58c5cf71143p11 ++-0x1.93789271d3e79p1 ++0x1.32d8d3818df7fp-1 ++0x1.a02656baff621p3 ++0x1.456822523692ep-1 ++0x1.9e821342b14aep24 ++-0x1.bacbd3affeb41p1 ++-0x1.5b4543a6420e3p1 ++0x1.94c0e4a504564p20 ++0x1.12189312e1789p3 ++-0x1.5465839d51246p16 ++0x1.212ec63d1fc28p-2 ++0x1.ea2df3e7023d5p-3 ++0x1.de0b83c02018ap3 ++-0x1.8240253b43da4p2 ++0x1.767607eab92e7p0 ++0x1.d9ccb717b987ap0 ++-0x1.98dee08d0a3adp3 ++-0x1.dcfca0020809dp-1 ++0x1.7f869312366ebp22 ++0x1.cd961413f209cp-1 ++-0x1.3221407824fffp2 ++0x1.2ade9658e1126p2 ++0x1.b34083bdc8115p2 ++-0x1.980922c6e082cp-2 ++0x1.799832b5bfa6bp26 ++-0x1.a56c15d91cd8bp-4 ++0x1.44a3a79631f72p-1 ++0x1.dda0957785a67p-3 ++-0x1.c54b66b69cac8p2 ++-0x1.b0cc178214892p0 ++-0x1.c1e5f06ea400fp17 ++-0x1.d29493a595f5ep2 ++0x1.8bdae6ba44b4bp-3 ++0x1.8d26f713baf31p13 ++0x1.8cb220c346946p3 ++0x1.71de257cb436dp3 ++-0x1.a52e1674a0f6dp-2 ++-0x1.418065835e8cfp2 ++-0x1.a4d5d76840286p-4 ++-0x1.3ed0116e38f5ep2 ++-0x1.87c515996b87cp20 ++0x1.35d67495a3d85p13 ++-0x1.430b146120c64p13 ++0x1.ce7d04c15930bp2 ++-0x1.704f325206940p2 ++-0x1.9e18f50e6cf7fp2 ++0x1.5269e51b29116p0 ++0x1.227c74bba7565p4 ++0x1.a81c022b943a6p-1 ++-0x1.a105212679fabp-2 ++0x1.b87ac53cacaf7p18 ++0x1.e71b216138183p17 ++-0x1.1668a6b611528p3 ++-0x1.586af282ee66ap3 ++-0x1.a646106bb9884p1 ++-0x1.781022484b783p2 ++0x1.4c9ab7f28c644p10 ++-0x1.c6dbc36bae35bp-1 ++0x1.55352240eedc3p4 ++0x1.b6f2b21a2eae2p22 ++0x1.9664d29b9e356p3 ++0x1.f3919543276fcp3 ++0x1.7cc834f6358cbp-2 ++0x1.9f07d58ef3ac7p5 ++0x1.9de5b20a4a764p1 ++-0x1.8aea705541631p18 ++-0x1.0952739540b5ap4 ++0x1.2993d67ddc894p0 ++-0x1.cecb056b46a86p3 ++-0x1.585ba625ce37dp4 ++-0x1.2c85b49135c11p6 ++0x1.1b03f53976b8bp2 ++0x1.804b5294eab8bp2 ++-0x1.15f090515ae7ap1 ++-0x1.c40c30eea2397p2 ++-0x1.d222d4cc61156p0 ++0x1.491254db782e2p9 ++0x1.089244b067d20p3 ++0x1.847fe11643736p3 ++0x1.aae600dfbb0d6p0 ++-0x1.c60c05a64e456p2 ++0x1.d3772608146aap16 ++0x1.210261c1bad19p19 ++0x1.7f61635ba6212p1 ++0x1.e03d05d58d78dp1 ++0x1.6fa5277426dffp2 ++0x1.7dd7a003f1fc5p8 ++0x1.d3c3c54fb269bp0 ++0x1.456084e1be432p-1 ++-0x1.9f35500c78f46p-4 ++0x1.b17ad24d5328bp21 ++0x1.45a4a452108b8p3 ++0x1.ee7835a4a15cap2 ++-0x1.5c88834020c4dp4 ++0x1.8195e389f02f0p1 ++-0x1.4d25e7891a5e3p1 ++0x1.a368603b90642p2 ++-0x1.fc1e4287a59a4p2 ++-0x1.087e41d357143p12 ++0x1.ccdb52d850e64p14 ++-0x1.ae95e02bbf2c6p2 ++0x1.d32c40fb7eed5p1 ++0x1.f4be74fc543aep-3 ++-0x1.c549772b73225p-3 ++-0x1.8e5cd0178d9fdp20 ++0x1.c81356a2c080ep-1 ++0x1.ed40040dadbe7p8 ++0x1.9914806c4c867p20 ++-0x1.501a27c66dd4ep21 ++0x1.dad8e19368949p18 ++0x1.4d9500c7ef7d7p0 ++-0x1.dc10c31391064p-4 ++-0x1.fc9d741aa8b78p15 ++0x1.467ff5c092692p6 ++-0x1.57a300f11a56dp10 ++-0x1.3289b70ab408bp-3 ++-0x1.406e2614c2a4ep4 ++-0x1.7320110d87bd1p17 ++0x1.ad9f174b85f67p-4 ++-0x1.6c05d0f81d05ap5 ++0x1.4d9fc757d40a4p2 ++-0x1.900c147490e47p1 ++-0x1.9bf4951c2d822p2 ++-0x1.f57e420cd00b7p3 ++0x1.748fa1fba98f6p-2 ++-0x1.7a48c776cf20ep3 ++0x1.5e1a45452622dp-2 ++0x1.ed24031124eddp-5 ++0x1.e691f37be2dacp3 ++0x1.231531dd30f1dp-2 ++-0x1.564fa0bfd60b1p18 ++-0x1.ac70324dce95dp1 ++0x1.a0d493588e057p23 ++0x1.f98780fb132a7p2 ++0x1.90ebc38d03a87p0 ++0x1.ff96e2f54d04dp24 ++-0x1.bf74b63ca40bbp2 ++0x1.9af727dde69f1p0 ++-0x1.e44071bd7b86bp1 ++-0x1.28d786fdcd052p26 ++0x1.8692e232cdae6p3 ++0x1.9b50469f50d88p-4 ++0x1.3ab662a7c7a65p-1 ++-0x1.d085169ef3012p2 ++0x1.bade31b1d2841p13 ++0x1.264cf12a5f18cp-3 ++0x1.eaf301a2af660p1 ++0x1.e09f42ccc01f3p3 ++0x1.4fef37206f995p20 ++0x1.3e7ff15ec0784p4 ++0x1.6ef7504e7c351p0 ++-0x1.65bfb1e6dffa7p4 ++0x1.034610cc74f21p4 ++-0x1.e7cdf2d5b5d7ap1 ++-0x1.56d207d3b7f15p26 ++0x1.9ade7656cdb52p-4 ++0x1.da34f1f8ba414p-4 ++-0x1.0620a0b7e0120p25 ++0x1.0aa527ccceddep12 ++-0x1.ff9b102c34c06p-1 ++-0x1.680934192f0eep-4 ++0x1.633c770deedcdp4 ++0x1.ac3d562aa3882p23 ++-0x1.fd93150cab59cp13 ++-0x1.2e68b5aeb1933p1 ++0x1.16a1b3634e220p4 ++-0x1.9a3017378b041p2 ++-0x1.9c6406add3380p-1 ++0x1.d28307b34902fp10 ++0x1.a256a6fc28529p0 ++-0x1.fc32d7015c25ap3 ++-0x1.90fe456ab6cd4p-3 ++-0x1.d82302f16ed56p3 ++0x1.e29194bbd8108p-4 ++0x1.ba28875f65f3fp2 ++0x1.aa02215f4279dp3 ++0x1.04b274650ae6dp16 ++0x1.5720460ea9547p4 ++0x1.d3565193466b6p25 ++-0x1.18ab75ac729b0p3 ++0x1.62b49423eac50p13 ++-0x1.5d5f51118764fp4 ++-0x1.0d11554e6379ep-3 ++-0x1.f7b3b55dfdf96p-5 ++0x1.d97d4089c87fdp3 ++-0x1.74dd56532f950p-3 ++0x1.f41ba46bbb346p3 ++0x1.15305286fef88p26 ++-0x1.6c32d3a71f573p20 ++-0x1.65a80408231a7p-2 ++-0x1.ef3b14f8fa244p15 ++-0x1.4060641b877f0p7 ++0x1.bb6e36c2071b4p20 ++-0x1.3a30a6c1a2f5dp3 ++-0x1.74ae12ec6a97bp1 ++0x1.29d196ea1da27p2 ++0x1.bfbfc35e1396cp2 ++-0x1.967993d8f656bp3 ++0x1.7f6f16b033158p15 ++0x1.9e5a06b632d09p2 ++-0x1.de52b7137b48ap-1 ++0x1.42702419de7adp18 ++0x1.87fba15348b74p-4 ++0x1.f1d4d2ed50b91p1 ++-0x1.f58ce2e3bed62p20 ++-0x1.0343179c7f2d3p4 ++0x1.c08e07f343f5fp0 ++0x1.c1bfa71d8698ep2 ++-0x1.3b5384007645cp3 ++-0x1.985c0097100f5p8 ++-0x1.31a462d00219dp14 ++-0x1.a1d1359744ef1p19 ++-0x1.4a50169190a5dp19 ++-0x1.47152657669dcp26 ++0x1.08ae25f622e03p0 ++-0x1.4a3ce79774730p1 ++0x1.4a69800ca5d1ep0 ++0x1.f5fc930d18d8dp4 ++0x1.643412561c61fp-4 ++-0x1.e07966a7404c6p11 ++-0x1.e6fbf6a0a6034p3 ++-0x1.fbd6e37a14101p2 ++-0x1.5a7960250d793p2 ++-0x1.a26cb448f2963p11 ++0x1.d54cc4dab0dc2p0 ++0x1.d49952cff6480p20 ++-0x1.a34ce477fb20bp-3 ++-0x1.9cec55870bb73p14 ++-0x1.cc4e1541cff60p15 ++0x1.17e2f5c7ae2dap0 ++-0x1.de61b653424aep5 ++-0x1.9f6f34286c574p10 ++0x1.d2b86784608d6p-2 ++-0x1.3395902eb25c8p20 ++0x1.69cdb5f2237f6p21 ++-0x1.50aa7555719afp1 ++0x1.450902d00dba0p14 ++-0x1.3581552b644e7p17 ++0x1.0c1ca2229363cp1 ++-0x1.aa0c55ea1366ap-2 ++0x1.935996dd54b32p16 ++0x1.3506f3b2a8c5bp4 ++-0x1.9ef4a31a3a5b3p21 ++0x1.6aed610ee94e6p3 ++0x1.9ec537389a85fp2 ++-0x1.b61b32703965cp0 ++-0x1.47b533489ac3cp14 ++-0x1.7a086173ea69ep-4 ++-0x1.9096e7b165d22p-1 ++-0x1.832a11dca8760p15 ++0x1.b46a101d0d0d8p-1 ++-0x1.754e34245b1d5p2 ++0x1.bd9a871af2cbcp19 ++0x1.91cd45ac60878p6 ++-0x1.f90ce27d3136fp-1 ++0x1.c793155aaf605p-2 ++-0x1.43c3752dba4e3p4 ++0x1.734ff4f414827p0 ++-0x1.5694b43404e9dp1 ++0x1.15ff858370de7p17 ++-0x1.6cb074bf09b29p-1 ++0x1.e15824dff4832p0 ++-0x1.a49b82d01f413p15 ++0x1.4e92a530645fap10 ++-0x1.0fb4501d2b553p8 ++0x1.6722853482a22p2 ++-0x1.e5ff02b36b547p3 ++0x1.8fd106fbca583p1 ++-0x1.cd3b94e6e9646p-2 ++-0x1.67e73006e1cbbp25 ++-0x1.798fe4eef94dap4 ++-0x1.9f845051b854ap0 ++-0x1.1801059eda986p-2 ++-0x1.e43bb3c1ba526p18 ++-0x1.858b7675fe3fep15 ++-0x1.95e2345d5fe0bp4 ++-0x1.3c5416ca090bap19 ++-0x1.495fa628eb2fcp-2 ++-0x1.7ef11453fd131p0 ++0x1.97369592c74a1p20 ++0x1.e538f5fd514c9p-4 ++0x1.3bdd939d79b75p1 ++0x1.51de3650db77cp13 ++0x1.0f1761cd1a600p-4 ++0x1.148233b993d99p2 ++0x1.93cd375850c5ep12 ++0x1.27629514fe508p-1 ++0x1.bb10511526fa8p-2 ++0x1.02fab5f81d1e0p11 ++0x1.59dbf0784024cp1 ++0x1.83fca118a0f13p11 ++0x1.549503148702ep20 ++-0x1.ebc3651a9536ap0 ++-0x1.a174916f8923ap10 ++-0x1.e62893a7af3aap-2 ++-0x1.f566616109d72p7 ++-0x1.6270b6860dc86p4 ++0x1.a88e8569e224ap2 ++-0x1.4f3ae6b9b7d44p15 ++0x1.565a510728736p3 ++0x1.ae5ff3ea9acf8p10 ++-0x1.cdaad52eecbb7p-2 ++0x1.14fe36e4c388fp-4 ++-0x1.b0fac12481c0cp-2 ++0x1.4f9e7648c99dcp24 ++0x1.fff1f1682d85cp23 ++-0x1.4e07d1cba1b3ep22 ++-0x1.aece66271bb23p-3 ++-0x1.480661fd12984p3 ++-0x1.cc42214f97882p9 ++0x1.9f8941c90d141p1 ++-0x1.a7cb21d392653p-4 ++0x1.f45fb2a44f985p21 ++-0x1.73ea53f7b5a83p0 ++0x1.ae0e97a5a226ap2 ++0x1.7116e4f8efeb7p13 ++0x1.b8689636e09d7p1 ++0x1.f87ea145c3eeap4 ++-0x1.7fb3d33c4b6f7p1 ++0x1.816ed7aac792bp-1 ++0x1.d46e75812b0cfp17 ++0x1.a94d05d52e058p-3 ++0x1.857ca451b8d1dp21 ++-0x1.dfe14188b48a1p14 ++0x1.7c5cb7db4b247p-3 ++-0x1.5b00f07b798c2p26 ++0x1.4927153475bd8p3 ++-0x1.659684713be27p-1 ++0x1.4b69e654ab5ecp14 ++0x1.599ca7a34504cp7 ++-0x1.e234942683626p-4 ++0x1.2dc9e2b98afd5p12 ++-0x1.11eff3e09aa18p1 ++0x1.66a8713d0f478p-4 ++0x1.ae07b611b2ed9p25 ++0x1.e5d5673df6e1ep2 ++-0x1.bc9a57d63d9cap-3 ++-0x1.f150f7c1a2718p22 ++0x1.a39e27b64a20ep0 ++-0x1.662a54062851dp4 ++0x1.c17bb0a5e2ee3p-2 ++0x1.2cde97703beb8p3 ++0x1.76c2a0f2dca13p1 ++0x1.44ef2264d458cp13 ++-0x1.39785220a1e11p3 ++0x1.0a9a846a9e8e0p3 ++-0x1.4c66f2ff6cd5fp26 ++-0x1.a3cf306fe7875p2 ++-0x1.f8fad771fd336p-4 ++0x1.56cce173621b0p23 ++-0x1.8b40322bb8a97p1 ++0x1.e9b391467db49p8 ++-0x1.c0b11253299d7p2 ++0x1.ce6213f40c4ddp3 ++0x1.98a4658fa2de2p0 ++-0x1.7714e7503ccfcp1 ++-0x1.e2c751117856dp-3 ++-0x1.116370d84cda0p1 ++-0x1.8a95106b4dd41p1 ++-0x1.83a101240371bp-1 ++0x1.a87241ef9f0afp1 ++-0x1.887e6438b7d77p0 ++-0x1.c51f915cee016p21 ++-0x1.90afb3af83a46p-2 ++-0x1.dd69445e1bce5p7 ++0x1.52ede1630d384p25 ++0x1.e5cb3017006a4p-3 ++0x1.7b37a1ae9bea3p22 ++-0x1.564077be3ff7dp19 ++0x1.0127514e5d65fp-1 ++-0x1.86f6945344917p2 ++-0x1.e27824003e156p-4 ++0x1.20f513644333bp6 ++-0x1.4d48e7c7bd1c2p17 ++0x1.df4f418ae8bcdp0 ++0x1.b530d7eb8c491p14 ++0x1.ae84640c8c195p-3 ++-0x1.99d503f399970p3 ++-0x1.7bac758737ddcp23 ++-0x1.b2e7529718232p5 ++0x1.d99e875cf2a8dp12 ++0x1.ad3fa0d2f24b0p-2 ++0x1.fd0875247597fp17 ++-0x1.d28dd391af036p8 ++-0x1.18c393d58dd4ep10 ++-0x1.7a2a73ac407fep10 ++0x1.885ec3882da73p1 ++-0x1.f4c664113f0d4p1 ++0x1.dc61d2bd58699p-3 ++0x1.50f330caf00fdp9 ++-0x1.2b4c2627a3648p24 ++-0x1.bddb32bea8700p-1 ++0x1.e55ac08bf2b42p0 ++0x1.e75cf1f0cd76ap0 ++-0x1.aeb8e3625b94ap-2 ++0x1.75a741f3c5a9ap-1 ++-0x1.017500e83e2dap7 ++-0x1.935241a43297ep2 ++-0x1.8c08819bbaca3p12 ++0x1.28f7569578c0fp15 ++0x1.9a68f5a0e6cb9p25 ++0x1.e99ce04bdef98p-1 ++-0x1.566b2614bedb3p22 ++-0x1.eb5840a35fdc6p25 ++0x1.75489211def83p19 ++-0x1.832cc5ad826a8p4 ++0x1.746297f53d755p1 ++-0x1.a92422038c33dp23 ++0x1.c94a716ac9472p2 ++-0x1.a780f5b351552p11 ++0x1.39b4a689dc65fp15 ++-0x1.063fd407d19b2p17 ++0x1.6c96851c4c0bbp-3 ++0x1.343a53f0ac710p-1 ++-0x1.78da56a8efd89p-4 ++-0x1.2e08371fa4c1dp1 ++-0x1.9cb170edaa8d6p0 ++-0x1.c47b95e92d85fp5 ++0x1.22d540cd4e25bp0 ++0x1.c0d7f6f009ad8p11 ++-0x1.694c81226c9d5p0 ++0x1.559fe2c8a2cb1p15 ++-0x1.be71b00f82b6dp-4 ++-0x1.949d26f8956a4p0 ++-0x1.e794823d81668p2 ++-0x1.913cc722037aep4 ++-0x1.6c89e06ae49a0p7 ++-0x1.d85ac741cf404p-1 ++0x1.827ce70a4080ep-4 ++0x1.d00906b80e8fep1 ++0x1.a5eb32c312d71p3 ++-0x1.1c82507185876p-4 ++-0x1.2745f53788520p8 ++-0x1.d59f5009d4e5cp2 ++0x1.cc2070bdb8850p18 ++0x1.1720074ab1a4ep1 ++0x1.8cd267087035ep1 ++-0x1.e5066000552e0p1 ++-0x1.894bb7d7746d1p0 ++-0x1.ffc9031f3af42p16 ++-0x1.9867b7cae951ep11 ++0x1.33ffa6ff96953p-4 ++0x1.18b8b52580f2dp-1 ++0x1.8036540909c52p1 ++0x1.cf69072d92af2p9 ++0x1.980aa121c5e65p1 ++0x1.5f89c3f3a61c7p25 ++-0x1.2e09a10012e1fp5 ++-0x1.a585c7402c27ep-2 ++-0x1.485eb3f6d7ecep-3 ++-0x1.f9bd852a74583p10 ++-0x1.3b7f83fbcda42p1 ++-0x1.6591217c65a71p17 ++-0x1.7b21e6ee5ca9cp17 ++-0x1.c979f792dbca7p11 ++-0x1.77bf75c469ac6p0 ++0x1.d16b6275c0f7dp14 ++0x1.4917f41f8b6a2p1 ++-0x1.19cd525e86beap9 ++-0x1.6e5003f71a811p14 ++-0x1.370ab7f9719f2p14 ++0x1.386006d492b82p3 ++0x1.1a58e03059f7cp12 ++0x1.2500012feb2d9p7 ++0x1.4d36d2e22e8d4p5 ++-0x1.f3e1a009ee07cp23 ++0x1.4668d78d78095p12 ++0x1.79aa13307ebf8p3 ++-0x1.c487960e89b2bp2 ++-0x1.06e8a5658fb35p-2 ++0x1.55c7f05a491fdp24 ++-0x1.0523e2d088c7bp11 ++-0x1.f62864f5158c9p19 ++0x1.c49ce5492ee6dp-3 ++0x1.cdb9120e5b67ep17 ++0x1.8f8a5268e820ep-4 ++0x1.6ee1e30d592a4p0 ++-0x1.812844c5cb134p2 ++0x1.6df1755141fd4p24 ++-0x1.728300fa1781fp14 ++0x1.8947c3e79ed66p0 ++-0x1.9844d48620c7fp8 ++0x1.23655019dc226p2 ++0x1.a9e1473cc8a13p12 ++0x1.66305231c4640p7 ++0x1.82af66fe8c503p2 ++-0x1.bc6b01062138ep15 ++-0x1.896955bc6c769p-1 ++-0x1.a9ee65b00a2e8p21 ++0x1.f4c3e6cd69231p-5 ++0x1.9013f5a753f8ep8 ++-0x1.d92d8497ba609p24 ++-0x1.2e2681d1e84bap3 ++0x1.8be4435259a45p7 ++0x1.79c7f5a2e6e62p2 ++0x1.acdbe4eb4b925p22 ++-0x1.35aae23bd5519p3 ++-0x1.733ba7e8564aep20 ++0x1.f77991555ff26p-5 ++-0x1.1c5745f873d55p-3 ++-0x1.1b14e11d332dcp-3 ++-0x1.c731514f4f896p20 ++0x1.a0c5c483ebf17p7 ++-0x1.36b1d13cb2c7ap19 ++-0x1.7a38c0bb685a4p2 ++0x1.6236e4c6b17b5p10 ++-0x1.f2b9767a6798ep1 ++-0x1.3958443bc6781p3 ++0x1.d6f1f3d9224a2p13 ++0x1.81b9f2569be9bp-2 ++-0x1.8f52243d1205fp2 ++0x1.2e2e25cd3e4a7p3 ++0x1.d34c76b790df9p2 ++0x1.7a91752f07156p26 ++-0x1.454b06030e52cp1 ++0x1.2c40025ab0e66p3 ++-0x1.76d66036ed303p18 ++0x1.667592a8df4efp25 ++0x1.415511ec79f5ep1 ++-0x1.7bbb12490183cp26 ++0x1.824ec336555b6p1 ++-0x1.b8dd16e17d94dp-1 ++0x1.7df770031af25p3 ++0x1.7bff02b791614p-3 ++0x1.13f597d144c47p4 ++0x1.81e4962b19a23p0 ++0x1.3900731ded692p13 ++0x1.9ed1c64a3942bp0 ++-0x1.e87ae52969fcdp-4 ++0x1.79bb77cc1f90cp2 ++0x1.14693020af9bfp23 ++0x1.8b61256862012p0 ++0x1.edae80414ab70p3 ++-0x1.93ab70cfa5b06p20 ++0x1.8ba9c535f5d61p1 ++-0x1.805ee155735acp1 ++-0x1.838ec4acbd018p-2 ++0x1.f32f63eb94fabp2 ++0x1.e241b1649d3b8p5 ++-0x1.3253458419677p10 ++0x1.e0df72e4e1543p11 ++0x1.e11d606072ff9p3 ++0x1.86c16681265b6p5 ++0x1.8628f44708c8bp23 ++-0x1.e00f07434fc92p9 ++-0x1.c17540870ee47p3 ++-0x1.9e5bb19dd040bp3 ++-0x1.4b2ae7e7eb36bp7 ++0x1.563c647e67c1cp14 ++0x1.9fd3804bf753ap1 ++-0x1.e01b361851110p5 ++0x1.f4c404c183defp3 ++0x1.91f9d60737e96p3 ++0x1.c2b2e43a35dc2p3 ++-0x1.93d6f51eaa6b7p0 ++0x1.077b77efc4f82p4 ++-0x1.5a77916ce4424p4 ++-0x1.68b4d3263da38p21 ++-0x1.f374766b6ed6ap2 ++-0x1.a9a9833b70761p0 ++0x1.e32a36975f82ep13 ++-0x1.faee82ffb3f86p3 ++0x1.e36e2752045d0p24 ++-0x1.65cd92ab90cd5p3 ++-0x1.2c9e444e88b94p3 ++0x1.f120d034d2381p10 ++-0x1.a9a8f0b3f6514p-4 ++0x1.936706bd2d06ep1 ++0x1.a0c1379968e55p15 ++-0x1.857891fb49f2dp0 ++-0x1.56d056a4a7495p25 ++0x1.903154bd06e72p0 ++0x1.6682d268e3100p4 ++0x1.3193534e62ce4p10 ++-0x1.8436b490e2355p3 ++0x1.c780d229e6f70p1 ++-0x1.c56866de11a8fp3 ++0x1.882d57bffac4ep17 ++0x1.5c9b122b1d7fcp-3 ++0x1.844794defc7edp0 ++0x1.ee2d82135ae68p-4 ++0x1.85279651395efp16 ++-0x1.2cd1153d349f2p19 ++0x1.7b6dd3b4f477ep12 ++-0x1.7288f46a576b0p1 ++-0x1.f8c0e0fc4bb49p2 ++-0x1.183706bd54880p3 ++0x1.ba0d572401eb1p-2 ++0x1.ca518633bac17p7 ++0x1.cd57538cf882cp-3 ++-0x1.8381b568c9479p9 ++0x1.1e9183ce544bcp13 ++0x1.6acba6699c0b9p4 ++-0x1.ec73039e9f0d4p20 ++-0x1.6477f2857b071p-3 ++0x1.e4a176c91821cp9 ++-0x1.8c0b56ccb6472p4 ++0x1.88bb9270ccca0p0 ++0x1.01872043ef4f6p26 ++0x1.a699a703d54f0p2 ++-0x1.4f9480c72527fp11 ++-0x1.f3922598eb070p25 ++0x1.ec1122cf73e00p11 ++0x1.1a5df470f93f2p3 ++0x1.2c4ac04f45ad8p2 ++0x1.420df3f07e2e9p1 ++-0x1.da3007b6e32e6p-3 ++0x1.c58594ba64852p5 ++0x1.97f94564a530ep1 ++-0x1.8f2f3232703fap23 ++-0x1.3aced1c22945fp3 ++-0x1.9fc3b1f2df6bap18 ++-0x1.2f9400213bfacp26 ++-0x1.5a93a1aecd7f8p23 ++0x1.e21fb377f0629p3 ++-0x1.60d2b29133715p2 ++-0x1.b35fd552a06bdp2 ++0x1.f888f3bf0894ap3 ++0x1.6179c63df740ap2 ++-0x1.1b57e16b67305p12 ++0x1.2df7a492a55aap3 ++0x1.f5a8c595b66f3p12 ++0x1.eb9b31a499310p0 ++-0x1.fa29138391d8dp24 ++-0x1.31e9737787955p22 ++-0x1.50bec0d665bd3p4 ++0x1.240336c6f50ecp20 ++-0x1.234332620141dp2 ++-0x1.494922947d1dep13 ++-0x1.4589500e3dc0cp-4 ++-0x1.c5b106e6c98c4p3 ++-0x1.8e5975aebe391p1 ++0x1.4acbd1eca3685p16 ++0x1.3767b5309ae35p25 ++-0x1.ab55b215961b5p19 ++0x1.9bbb7240953bcp6 ++0x1.2a69c6c2ce166p-4 ++0x1.236446d855ea1p26 ++0x1.007d67d2f6ae5p14 ++-0x1.465752c4bba54p4 ++0x1.c2c120ada26efp24 ++0x1.89d8e773ca030p0 ++-0x1.47d112473b7d2p23 ++-0x1.961ec43a6ac1bp0 ++0x1.cb149641f5e31p25 ++-0x1.445105fd4a114p13 ++-0x1.fbecb12a6b027p23 ++-0x1.7d2f532f070e7p24 ++0x1.8623305d4e6b2p12 ++0x1.9d4e770b846b6p20 ++0x1.2e6f72255a4e3p25 ++0x1.217f53ffa3517p18 ++-0x1.114cf59a17da7p22 ++-0x1.9058c29b9c42cp0 ++0x1.8b4964313d448p0 ++-0x1.1324f4ac83d84p17 ++0x1.8cdc938858e1cp1 ++-0x1.8e3ac7bd1d9bap1 ++0x1.91dd306db21b7p3 ++0x1.1dabf17b5d5ecp11 ++-0x1.8c5023b0520fbp17 ++0x1.519133d1a30c1p0 ++-0x1.83f8b0095f08fp11 ++0x1.a2c384402e2dep0 ++-0x1.99604221a841bp-3 ++-0x1.238c553c5b382p11 ++0x1.255263c1e7ea1p-2 ++-0x1.f6abe2ca3fa18p-4 ++-0x1.28b610d704296p2 ++0x1.7fe030dd6870bp21 ++-0x1.9277b3b585daap1 ++0x1.4aba5560a518fp18 ++0x1.d8b2d183392ffp12 ++0x1.606e50d62a689p3 ++-0x1.c9fe06391a2ffp6 ++0x1.33a2c66357454p2 ++-0x1.c14834e7cc6fep20 ++0x1.70fe71d9a61a1p10 ++0x1.9124214c779abp0 ++0x1.36fe96d18bbb1p5 ++0x1.ac0886bed0cbap-3 ++0x1.c394c39ec727ep21 ++0x1.8ede90b9ad083p1 ++-0x1.63f723efeb8aap6 ++-0x1.8006a11624d6fp9 ++-0x1.991dd79a46696p14 ++0x1.624f7005c927ap-3 ++-0x1.5a1bc5448ef00p15 ++-0x1.a1b2d04dd23dbp22 ++0x1.fbdae5e7003fep9 ++0x1.77e2f5191b00ap26 ++0x1.6acd972fb203ep7 ++-0x1.92e403fb5cd1fp1 ++-0x1.bdb8819563c37p3 ++-0x1.978c07f231d8cp-4 ++0x1.d394c0387504bp3 ++0x1.2ad084ae8150fp2 ++0x1.1c84d77148aeep-3 ++0x1.6cdec2610b6e2p9 ++-0x1.ad36f42f1539cp10 ++0x1.6b7736f489b84p23 ++0x1.428d260202acdp-3 ++-0x1.ac7df640f2e9dp-3 ++-0x1.383325e10f339p16 ++-0x1.9072c3baac08ep2 ++-0x1.8d25202dfe5e9p1 ++0x1.56cce34ce0a0fp3 ++-0x1.87e0b26002871p0 ++0x1.e58bf4dbae4e0p8 ++0x1.f721c656141c5p-5 ++0x1.936a122b128a9p3 ++-0x1.9d77a3df09bffp0 ++0x1.fee682c2083b1p-5 ++0x1.0df346c938fa6p20 ++-0x1.79a4807dc1c7cp12 ++0x1.43cb96fb17819p15 ++-0x1.f6cba0b606489p3 ++0x1.279ff1f5aa40ep2 ++-0x1.4a0200fac8a92p13 ++-0x1.5bb4a64995a2fp6 ++-0x1.8cfdf28a87367p1 ++0x1.b33a47d6a5006p12 ++-0x1.2d44128359d7ap3 ++0x1.8e27c5f19370ep1 ++0x1.b172a51df2790p12 ++0x1.9418b67f79674p2 ++-0x1.18472016853adp-4 ++0x1.429a944c7fc15p-3 ++-0x1.848c2357e315bp0 ++0x1.94ffc4b0437b7p-3 ++0x1.0ab3c61460bf1p23 ++0x1.c46df37c82e74p3 ++0x1.ae4073dbb6faap1 ++-0x1.333756903e0d4p2 ++0x1.9897d041ad55ap0 ++-0x1.dc34d00205413p-3 ++0x1.11d895596200dp0 ++0x1.2c40f229821eap3 ++0x1.cdf886a7aa583p1 ++0x1.981c0286db7cep1 ++-0x1.9e091230bd3a4p0 ++0x1.793f34193764dp-4 ++0x1.bb2a40332c042p-3 ++-0x1.f14492192a73fp-4 ++0x1.706253767db02p-1 ++-0x1.89a6c7e27292bp0 ++-0x1.9ecc544fb92bbp0 ++-0x1.929732055c207p3 ++0x1.7446d51c7b42dp-3 ++-0x1.86ed158a74c67p0 ++0x1.514041392ff26p2 ++0x1.82d476bb8edb4p0 ++0x1.7fd9b27331c05p-1 ++0x1.f5b7d49823843p3 ++-0x1.f69264abeafa3p3 ++-0x1.3b9c9235047b1p-3 ++-0x1.618cb26e482adp3 ++-0x1.7ff1014b720ddp2 ++0x1.89c1b5f05dc6ep0 ++0x1.8433102ecaabcp0 ++0x1.1a6f4686b08cbp-4 ++0x1.f6e9f6c4c11d8p2 ++0x1.f420f4826d0ebp3 ++-0x1.07e6c7ee77297p-4 ++-0x1.883073624792fp0 ++-0x1.413bd59318f29p10 ++-0x1.eccdd630f04c1p-5 ++0x1.ca83404a9139bp-4 ++-0x1.2fb1d040fa704p2 ++-0x1.ec2965839cdf8p-4 ++-0x1.980927a49fc8ep0 ++-0x1.8891479510a4cp0 ++-0x1.160f00148547bp4 ++0x1.2c829387de51dp3 ++-0x1.b823d3652d1f6p-4 ++0x1.610211fe18f2cp4 ++-0x1.4814c0233ff45p4 ++-0x1.910a500100124p3 ++-0x1.938eb41b840f3p2 ++0x1.8b3dc18cdc10cp-3 ++0x1.82bbb15b4a321p0 ++-0x1.7ca807b240b48p0 ++-0x1.e41654090b761p-6 ++0x1.2e37b710fc120p2 ++0x1.f6b7940e7b623p3 ++0x1.110c63611fdc6p3 ++0x1.02ee201bcaac4p-1 ++-0x1.15cc478b9585fp-3 ++0x1.eaa6a5dba0880p-3 ++-0x1.5064263da0e06p18 ++0x1.29e4125754701p2 ++-0x1.9877831252381p-4 ++0x1.8f2e232e9ac5dp2 ++0x1.2d80559c80ef0p3 ++-0x1.9254d7b9c8444p0 ++-0x1.f4e9e64183d12p-1 ++-0x1.f4c7a7634e935p3 ++-0x1.9abbe3194229cp0 ++-0x1.9919748132712p0 ++0x1.5f26256acb653p3 ++0x1.5763e1d0c726bp1 ++-0x1.94ff2678d1f72p-3 ++-0x1.a90bb2e15f04ap0 ++0x1.2dd9e546986a5p3 ++-0x1.f740c1ba3020dp2 ++0x1.c64395e34728dp-2 ++0x1.e3d0458eabfd8p1 ++-0x1.ed0765e6ea0f5p-3 ++0x1.dab346294cbdap-4 ++0x1.f61623d7e20b5p3 ++0x1.af9281c09646cp1 ++0x1.1b1e15cd3bcc5p16 ++0x1.06c4c10e6c8dep-4 ++0x1.dd07569c3c3ccp-2 ++-0x1.c15824199f02ep1 ++0x1.5243561208a38p-4 ++-0x1.f416f571790f9p2 ++-0x1.caef3657e7abbp1 ++0x1.83fbe5b4af7dcp0 ++-0x1.8853d6f37a1efp0 ++-0x1.46da6147a1b10p4 ++0x1.302416be4e2a1p2 ++-0x1.f2f8a5dc53cf4p2 ++0x1.6055e6e35bb41p-1 ++0x1.143d145693511p2 ++-0x1.6950a182bf9a2p-4 ++-0x1.8fcc8236972a5p2 ++0x1.e9cb13665b011p14 ++-0x1.f393f56d36bd5p2 ++-0x1.6965240cd8bcap3 ++0x1.941dd006b64ffp2 ++-0x1.f1e3d41258e12p1 ++-0x1.fccf763e37c40p-2 ++-0x1.b796d71e63f83p0 ++-0x1.92b6c5b1be835p3 ++0x1.9ce932c77615dp0 ++-0x1.73fbf1729d68fp2 ++0x1.478eb664414a1p4 ++0x1.56d8470b12ea3p1 ++-0x1.3e8954f72e006p1 ++0x1.f65e065d156a7p3 ++0x1.84664031b46b2p4 ++-0x1.f47a93802ea52p2 ++-0x1.e9592161077e5p-1 ++-0x1.2bd1669992834p3 ++0x1.6e2943a16b8e1p-3 ++-0x1.e7d855d59c297p-4 ++0x1.8f433768a46fdp1 ++-0x1.e515d3f871f61p-4 ++0x1.90af17c3b46a3p1 ++0x1.888852da31b55p0 ++0x1.2b2b219aba250p-4 ++0x1.acd68248a4138p3 ++0x1.2e88f26ed5c10p4 ++-0x1.93d8526e03271p2 ++0x1.326cd7502e35dp3 ++0x1.97cf340cdd0aap1 ++0x1.9bf172a79ddddp1 ++0x1.f762e63f6aa11p3 ++-0x1.a352761c52850p-4 ++-0x1.8ca4b46938898p0 ++0x1.5faf86ccf0263p3 ++-0x1.59de804f2786ep-3 ++-0x1.1411b2e66b984p4 ++0x1.c1744154cb07cp-2 ++-0x1.e470062fd9902p-4 ++0x1.96cdb4f1f7df7p1 ++0x1.23fc15223f81ep2 ++0x1.36a273c93939cp-4 ++-0x1.cc76161ba5551p2 ++0x1.30a473160c957p2 ++-0x1.2b9fd42df7d03p11 ++0x1.96269286b7ffdp1 ++-0x1.26acf7d9c5873p-4 ++0x1.4e9a05aed7b47p-2 ++0x1.8c2310e286165p3 ++0x1.2e7ea55e6bab4p3 ++-0x1.947447e283cf8p0 ++-0x1.5def45dd8c82dp3 ++-0x1.3562b72377e9dp17 ++-0x1.827dc1096f2c7p2 ++-0x1.864d742b9a86ap0 ++0x1.020c84197b2d6p-4 ++-0x1.c2b3209b520f2p3 ++0x1.4d46507b92ebfp1 ++0x1.f7a911dc6f5edp3 ++0x1.546ab7b47b80dp-4 ++-0x1.8e74270390650p0 ++0x1.798ef3689843dp4 ++0x1.e4ed141ca4042p2 ++-0x1.912b60e8b2288p1 ++-0x1.a446f3b0c931fp-3 ++0x1.8a8ca0324e319p1 ++0x1.85f9f17f3303bp-4 ++-0x1.8da4b789837fbp0 ++0x1.e0c1b65e1731fp0 ++0x1.51d9359cbafe5p0 ++-0x1.8c93e53362a95p0 ++0x1.2cb685f56e9c7p3 ++-0x1.24ca32a7d2e7fp-4 ++-0x1.f3a7d55be814ap2 ++-0x1.5f5563552f3dbp1 ++0x1.9651239a8f51cp23 ++0x1.7883f140d86e3p4 ++-0x1.f5d4704cadef3p3 ++-0x1.1a8b81c161806p-4 ++0x1.13a766d95ae15p-3 ++-0x1.788d1565e8c73p0 ++-0x1.5a00b1d8bf722p4 ++-0x1.142ef555a9f1dp2 ++-0x1.9f5fd239129c0p1 ++-0x1.9234030e398e9p0 ++-0x1.de3ee1a88c608p25 ++0x1.98b413f614dd1p1 ++0x1.919893496d760p0 ++0x1.cb4c6209daacdp1 ++0x1.716aa6b3989dep0 ++0x1.388236a8a2105p17 ++0x1.2d8ea65a5418ep3 ++0x1.8d3b6586a1f83p1 ++0x1.2ee22305d240cp2 ++0x1.513c50ad7096ap0 ++0x1.274f61da084fcp21 ++0x1.8e999360ff9bfp2 ++-0x1.634ee01f1e244p3 ++0x1.f56b84f17d59ep3 ++0x1.90cd66c769319p3 ++0x1.948793a745cb3p1 ++-0x1.922cc64d4c613p2 ++0x1.9202f01408a2ep1 ++0x1.647af0f3e78e8p0 ++0x1.92c404a15ff85p3 ++0x1.296510b2025d9p3 ++0x1.8af4d01937e3dp1 ++-0x1.905807696feddp2 ++-0x1.c5e746b866817p3 ++-0x1.74abf60c7458dp11 ++0x1.9fd310b80fc3fp-1 ++-0x1.0088c702d520ep3 ++0x1.99e684301b40dp1 ++0x1.9e40e369cece9p0 ++0x1.9a10f4d7ad560p0 ++-0x1.119517d95be1dp0 ++0x1.6507f65c0a11ap-10 ++-0x1.8d7e97db6ee5dp1 ++0x1.77b3e74ff2733p0 ++-0x1.9142f42793975p2 ++0x1.b08f86307ef40p0 ++-0x1.07f605feceabcp6 ++0x1.847750d22aedap0 ++0x1.da8917abe3345p-1 ++0x1.996981db39a5cp1 ++0x1.84af267337c45p0 ++-0x1.2d1e62cdb58fep3 ++0x1.57eb741c405e9p0 ++-0x1.9306d461c4f0dp1 ++0x1.97511167e78b7p1 ++0x1.a378c189bb9f2p0 ++0x1.9f116139e3045p3 ++0x1.0e56b2d056bd2p1 ++0x1.9022d6b0f776ap2 ++-0x1.9a66b69d283d3p16 ++0x1.93f2d78fa20b8p2 ++-0x1.960097e81f663p1 ++-0x1.f16b11682801ap2 ++0x1.7c5836e306cd7p4 ++0x1.931ce13cf2e8ep3 ++-0x1.9604801aef305p1 ++-0x1.6047b5e1f6282p4 ++0x1.8afcb3ed73526p1 ++0x1.f6f66374ec272p3 ++-0x1.637a71d0dd8cap3 ++-0x1.f503c3e728412p3 ++-0x1.6752748f04736p12 ++0x1.c39482bf49bafp0 ++-0x1.776fc1f105341p1 ++-0x1.1c8c0693eea0ep4 ++0x1.bf500107c5bf8p1 ++-0x1.c8cc1330ebb0fp3 ++-0x1.9fc43100011e3p1 ++-0x1.0218334d9287bp4 ++-0x1.873dc40133dc7p2 ++-0x1.6108e6ac3ce75p2 ++0x1.827f54be95fd2p2 ++-0x1.b3b9c1b2bc85bp1 ++0x1.6a566601abe51p1 ++-0x1.1838e51e22a74p3 ++-0x1.ec20a2f393847p-1 ++0x1.50e3f2decb26bp0 ++0x1.9e5c631aefd23p1 ++0x1.e380f3f3d1435p1 ++0x1.2d2396f6e3d53p21 ++-0x1.d37267e0da8b8p2 ++-0x1.dc488296aade7p-5 ++0x1.46ec674ce2a5dp13 ++0x1.554101eac799cp13 ++0x1.2f3013f5a6c54p8 ++0x1.6f83a66c663f4p4 ++-0x1.2b08f43aab39cp11 ++-0x1.e1e0d1853224dp-1 ++0x1.d771b17516553p6 ++-0x1.887044239cfe8p1 ++-0x1.a1db55509e8a4p1 ++-0x1.bfa480fc2440ep0 ++-0x1.6d6e63cfe5182p16 ++-0x1.fb48863e0822ep0 ++0x1.9f00e03bd225cp2 ++0x1.759ad7d2fd408p-6 ++0x1.127da379773a8p0 ++0x1.f29402cc634ddp2 ++-0x1.9952a78ed61b8p2 ++0x1.97dd5139447c3p1 ++-0x1.a76e765e68c3cp1 ++0x1.8e67566cd5e8ep2 ++0x1.1b03a778e2d96p0 ++0x1.5082b4b12d87dp0 ++-0x1.b7f804e64ad6dp-1 ++-0x1.fd8ec1fbdfc91p-1 ++-0x1.c72146ec63767p0 ++-0x1.535215502bb28p9 ++-0x1.7b86638bd0a8ep4 ++0x1.2ee16587be28ap25 ++0x1.e01b63e9ed441p-5 ++0x1.694304bf328eep8 ++0x1.ad55c78d3654dp3 ++0x1.9eee975660a8ap3 ++-0x1.c8b2561c9f81cp3 ++0x1.8283c7a80a610p0 ++0x1.5b20d2df32431p4 ++0x1.9cd6a2f10b171p1 ++-0x1.420cc50d7cdc2p8 ++-0x1.dd9861944bbb3p3 ++0x1.34a7a7976a495p0 ++-0x1.d583650030438p-6 ++0x1.d460c5cf3f543p0 ++-0x1.d465b0c30b6edp1 ++0x1.3c7da5c7e5924p1 ++0x1.2346875c60507p2 ++0x1.8a7b81be25ee8p2 ++-0x1.397700c5fcc57p2 ++-0x1.69d2e1c810103p14 ++0x1.a85411bd063ccp1 ++-0x1.0e29e1cbda382p1 ++0x1.9a5e601081659p1 ++-0x1.a7889779ffa67p0 ++-0x1.438e04868ccc9p4 ++-0x1.baa5420b07fdap0 ++-0x1.6db8900accb05p19 ++0x1.a8aec73d93c27p3 ++-0x1.77d4072c1ccf2p0 ++-0x1.21f6b21bc817ep2 ++-0x1.f6a2f62a6cb31p2 ++-0x1.fc06459a51fb8p2 ++-0x1.9af657156b1f3p2 ++0x1.506bb4f11e78cp0 ++-0x1.33ebc72ee6932p2 ++0x1.ae86415f42273p2 ++-0x1.9bf4a6fe8e910p1 ++-0x1.e96e9164690fcp21 ++0x1.6947f51227604p2 ++0x1.6013a22a2ddd3p1 ++-0x1.6af96677a90abp4 ++0x1.8afb44943c65ep3 ++0x1.8edc46a59110dp1 ++-0x1.27672769919c5p3 ++-0x1.965194e8561b3p0 ++0x1.3b1025ed73e67p1 ++-0x1.847770922125cp3 ++-0x1.dd5f522fb2873p-5 ++-0x1.5efb85cc876f7p4 ++-0x1.e68de705848ebp-5 ++0x1.7ead02ce67bbcp1 ++0x1.a051e272e6562p1 ++-0x1.86e703217068ep2 ++-0x1.9f42e3ab98d72p1 ++0x1.67ed973022fefp1 ++0x1.2fecd6c002277p9 ++0x1.78c3e7b8861cdp1 ++-0x1.a871661620c12p-6 ++0x1.f44003f7dc467p1 ++-0x1.8de9c11f74395p0 ++-0x1.e819107f5c6e2p3 ++0x1.95cc935ccd8b3p3 ++-0x1.8f4ed509b97e5p0 ++0x1.69451445560b1p1 ++-0x1.95ef447fbd184p3 ++0x1.86f83259b5fd7p0 ++0x1.0477224f543aep4 ++-0x1.84b8700c2e94ap2 ++-0x1.d83170e4e3d42p23 ++-0x1.8f0f6463688c9p3 ++-0x1.627477b68d92cp4 ++0x1.b08cf6f35c65fp1 ++0x1.408dd4780aba4p6 ++0x1.1086512459ff1p9 ++0x1.3909f67380c33p3 ++-0x1.949b71c1a11cep2 ++-0x1.8d1345e55533bp3 ++-0x1.8713c256b3756p2 ++-0x1.dbc685c55e3f5p25 ++0x1.fa1540a9be9a3p3 ++0x1.861632597290fp21 ++0x1.8a92623188bf5p2 ++-0x1.306816f3567cdp3 ++-0x1.46c942568bb98p4 ++-0x1.493192769939fp-5 ++0x1.6c7626b593bc1p15 ++-0x1.de9ae14ed3b14p-5 ++-0x1.9ceab67fd3361p17 ++-0x1.4635c7e723683p14 ++-0x1.f66857bcde805p5 ++0x1.1404718e327a9p5 ++-0x1.8bead04147772p0 ++0x1.67f23030a3b9cp-5 ++-0x1.605b1167aec6bp26 ++0x1.c492b71449ac9p-5 ++-0x1.896c46f57416fp0 ++0x1.f67af48b080f1p4 ++-0x1.2bf7f4c847654p2 ++0x1.d16a349978580p5 ++-0x1.62f916740779cp8 ++0x1.88d1874b175c6p0 ++-0x1.44bb24ced7803p23 ++-0x1.8b3367f4a1c9ap1 ++0x1.f904679db18c3p10 ++0x1.8af0b3bf1bc0ap1 ++0x1.91bd642036dc7p-5 ++0x1.e05700bd746ecp-5 ++0x1.442c71d7052dfp11 ++-0x1.c0860397d57f6p-5 ++0x1.22fa512afd525p15 ++-0x1.17963471d9c22p9 ++0x1.dc53e5919c4e9p-5 ++-0x1.f0ab744dd7c5ap12 ++0x1.6c6b174f1b2ddp25 ++-0x1.c0e8e1d4be4ddp21 ++-0x1.527b6735e78fdp-5 ++-0x1.eb2570edcb498p-6 ++-0x1.827ee5ca4565ep17 ++-0x1.d312763bdbfc9p-5 ++-0x1.1be7c35c5187dp21 ++0x1.bb05e3cf5bed1p8 ++0x1.2b35242e28392p2 ++0x1.2c478726c2eadp3 ++-0x1.f601e4eb21834p-7 ++-0x1.aa9224d5c7b99p12 ++0x1.ee4f61f98712ap25 ++-0x1.f11477e64dd5fp25 ++-0x1.eacea5fdf0447p22 ++0x1.8090172f53488p-5 ++-0x1.874452a514b8ap-5 ++0x1.b09b7525da067p-5 ++-0x1.a4a65761b73e4p19 ++-0x1.3edf87b67bac9p11 ++0x1.40df32ab49b60p16 ++0x1.ad82d260cd27cp12 ++-0x1.79d575123f3d3p4 ++0x1.1a420309f1acfp19 ++-0x1.e3d2815fcea1ap-5 ++0x1.9564275cad6b1p20 ++0x1.b22d964fa5da9p16 ++-0x1.ac6ec099f3767p12 ++-0x1.3a56c36fd71f8p5 ++-0x1.10a2668b9a962p19 ++-0x1.f582e4fb4b9fcp3 ++-0x1.c91490880d0abp9 ++-0x1.ed1516dd4512ap-5 ++-0x1.bd52b3aaf56cbp20 ++-0x1.5f8674c2c25b3p3 ++-0x1.0c0c55ef2b998p20 ++-0x1.d192227536e73p24 ++-0x1.2faaa2ecfe577p24 ++-0x1.b90651cb301d0p-5 ++-0x1.ac3b63b519eadp-5 ++-0x1.2bd446f3ca7f3p2 ++0x1.a430460e6a9b6p12 ++-0x1.b3d576f970023p-5 ++-0x1.a78456f24ad8bp21 ++-0x1.8e6d24c106191p-5 ++-0x1.445ac22c0535bp10 ++0x1.6006b3be58fcdp5 ++0x1.e2c9a30fed3dbp-5 ++0x1.a9c595abf1803p17 ++-0x1.dda6a16942918p5 ++0x1.882b80046b531p-5 ++0x1.e312c4711d211p-5 ++-0x1.ffc9304847f6ep23 ++0x1.e2bdf53a0e7eap-6 ++0x1.aafe55c56b961p4 ++-0x1.a42c00873fe91p19 ++-0x1.6e05225136648p14 ++0x1.8b6d7748a44d0p1 ++-0x1.4f9b15e74489bp24 ++-0x1.d0f83650acd18p10 ++0x1.75d88737c154ep10 ++0x1.fd9f30446da4cp12 ++-0x1.ea0f976d9c95fp8 ++-0x1.2e7ce0068807bp3 ++0x1.408f556f1b433p22 ++-0x1.33dd44ccdcad4p9 ++-0x1.1392b23681ed7p22 ++-0x1.a07451f59178ap0 ++0x1.4be7960b80101p-5 ++-0x1.c35dd7637fabbp3 ++-0x1.14eaf252d4e69p24 ++-0x1.eb5cb6f319984p12 ++-0x1.ff5795cc9e8c9p25 ++0x1.f373c7948157ap2 ++0x1.8b11d503c9621p9 ++-0x1.a6fba484a1e0dp23 ++0x1.185dc1c0b0020p9 ++-0x1.4205d4a32810fp8 ++0x1.ba7665e0e6ca3p-6 ++-0x1.9114139572d64p2 ++0x1.8550d5a435556p6 ++0x1.9217f777d16afp1 ++0x1.523d75d52216bp22 ++0x1.eaf44618ace9cp25 ++-0x1.0ce264ba236dep25 ++-0x1.dd0c66bca284fp4 ++0x1.e133b560a7249p-5 ++0x1.2e73200b72efcp3 ++0x1.31d3f1c22bbefp-5 ++-0x1.160c73ebb453bp9 ++0x1.725517d421c01p23 ++-0x1.b322115912690p8 ++0x1.3123b6c190157p15 ++-0x1.f7c6d4c05900ep2 ++0x1.4199c1016ddbep21 ++-0x1.939ab538fcf52p1 ++-0x1.fe9b67751e8e2p16 ++0x1.8194d6944c477p15 ++0x1.84ddc763e1a66p0 ++-0x1.4e1de2c8b8b84p-5 ++0x1.f2b9c3f27bde1p11 ++-0x1.616ef1dab5092p3 ++0x1.f592e4f2759fep3 ++0x1.4aa7e080f1cdbp11 ++0x1.ce0a91e4edc80p-6 ++0x1.534af4542f502p9 ++0x1.9a5816c8c9b58p-5 ++0x1.71ed06e256291p11 ++0x1.1a3b208fc7a34p17 ++0x1.93a935a59f8c6p2 ++0x1.d0cc856988238p6 ++-0x1.1aba30a4c9984p9 ++-0x1.f8c461cdebee7p21 ++-0x1.899a449c6c3ebp20 ++0x1.363ec045afdeep9 ++0x1.439216bc4453bp8 ++0x1.4447c6df4c7afp17 ++-0x1.9911c1e4c62abp15 ++0x1.e16500b58f801p-6 ++-0x1.b705b75ed89fbp22 ++-0x1.01e46049e5a39p20 ++-0x1.932304c2d6686p-5 ++-0x1.e6d670226ad2ap-6 ++-0x1.bd07e41c8e8bcp18 ++0x1.4a0e422534f2bp-8 ++-0x1.6940b30465840p8 ++0x1.d733705bedd6ep-6 ++0x1.d5cc051d8c218p19 ++-0x1.2c33e54a305f1p3 ++-0x1.e8b8d19effe41p-7 ++-0x1.3251544f616aep10 ++0x1.7695f68f3e6c7p15 ++0x1.8b4f237050232p1 ++0x1.0f3804c1ac573p26 ++0x1.63b6402daf587p25 ++-0x1.ef19b46fc82d1p-5 ++0x1.5b24532eef37bp8 ++0x1.e3cc25433e63dp8 ++-0x1.6adbc65e81bf0p-6 ++0x1.4af2127550ba6p19 ++0x1.0b0534813be5dp10 ++0x1.406e85cef6faep18 ++0x1.3624f311203b4p24 ++0x1.c539d648b5762p4 ++0x1.d33de1b06857cp22 ++0x1.088795083936fp26 ++-0x1.46d32700ac723p13 ++0x1.90cd33bd76f26p3 ++-0x1.bc8b039abda5dp-5 ++0x1.118c66b20ff59p24 ++0x1.86aa4299069edp17 ++-0x1.8c0d566b825bdp6 ++0x1.a2f000766a5dcp-8 ++0x1.f125b5925ecdcp9 ++-0x1.42e27168a01e5p-6 ++0x1.8d07c5da62627p-5 ++-0x1.300382649922bp25 ++-0x1.c6af64d64da9bp21 ++-0x1.dbf9b7e4544d8p-5 ++-0x1.ae66a3b7f8d1ep8 ++-0x1.68cae1e2a98b1p25 ++-0x1.d9d0e40f5b316p18 ++0x1.9240a42e12154p4 ++-0x1.85efc5a65c092p5 ++0x1.c25b32c0f3a22p21 ++-0x1.8ce4e51fc72bcp20 ++0x1.2d88a67e7f4d5p6 ++-0x1.f9fab7bee125dp2 ++0x1.d5ab6667f00aap-5 ++-0x1.8de195b535d34p0 ++0x1.856a236431247p5 ++-0x1.9355b20d3597fp3 ++0x1.c86242004b43bp16 ++-0x1.f075e5ac52efcp7 ++0x1.128a500680aadp22 ++-0x1.e05591544f544p21 ++0x1.93efc221f8e59p2 ++0x1.ab2f462bf74fcp5 ++0x1.c49bd6a3c1818p4 ++0x1.7b8ad50c7bfecp13 ++0x1.fc4e96888c2d1p-6 ++-0x1.58d6c2c5e054cp-5 ++-0x1.2f6ec7a1377e0p14 ++0x1.c58a842a616dbp3 ++0x1.834dd78309187p18 ++-0x1.c3a496c1450d1p-5 ++0x1.f4d2b45c847dfp3 ++0x1.8c356160ce725p1 ++0x1.3142d7811c731p2 ++0x1.93a9516a96a0bp3 ++0x1.a1bee68429794p7 ++0x1.b95dc334a2bc6p8 ++-0x1.19cef672a9a47p-6 ++-0x1.d27957ab51079p-5 ++-0x1.f326d3c218f96p-7 ++-0x1.3663f5c2f7a7ep21 ++0x1.92d2c298efc0ep3 ++0x1.0c0ac140813e9p14 ++0x1.f042d0f375d37p-5 ++-0x1.33d93108cefb4p17 ++0x1.49bb63dc63385p26 ++-0x1.6c4a43fe47766p15 ++0x1.ef7b348d27a11p-5 ++0x1.75c9e12812395p26 ++0x1.646c466065168p13 ++0x1.c6a595a4cf1eep-5 ++0x1.633eb2bb2135cp13 ++0x1.1d6fd48d68d10p16 ++0x1.909086ce4aa7bp19 ++0x1.33e475eaa77c1p6 ++0x1.dd76962579da8p4 ++0x1.2f6ff6e564b1cp2 ++-0x1.250d605076831p-5 ++-0x1.eb5e5279788d8p-5 ++-0x1.8d7a8777145a7p1 ++0x1.987364729a434p19 ++0x1.dabe4125b97b3p-5 ++0x1.b17e331eb6789p6 ++0x1.6db837fb7d483p-5 ++0x1.974bf2de99250p-5 ++0x1.eb7783df9a7d7p24 ++0x1.d4a382fdca607p-5 ++0x1.c819b06815072p-5 ++-0x1.884961789ce26p0 ++-0x1.49abd42b2da4ap11 ++-0x1.c22025eda45c0p-5 ++0x1.1507f3d165044p4 ++0x1.98d962253bc23p0 ++0x1.91d604536b2ddp1 ++-0x1.97e455ad89b74p14 ++-0x1.e048a7162e609p24 ++-0x1.b0f2a035fc460p-5 ++-0x1.dfae87af15a41p-5 ++0x1.5957d3127c4ecp-5 ++-0x1.e19520fdfdde8p18 ++0x1.14bbb5a3d4a9ep-5 ++0x1.40e1e0445bbe9p20 ++0x1.d11a60dfe5ccbp13 ++-0x1.2864a79b70a9fp12 ++-0x1.d586268ab9766p-5 ++0x1.e86f11c2cfc20p-6 ++0x1.44cca2c6d41b2p-6 ++-0x1.96a014873a351p-5 ++-0x1.8d81a234eaeb3p21 ++0x1.3a1533e669917p5 ++0x1.8ba860cf520bep1 ++0x1.4265b33954e48p10 ++-0x1.a249f7fe5c4e5p17 ++-0x1.2e1957e00bdd5p4 ++-0x1.8240d5065f3b6p17 ++0x1.8d74a29263a5ap0 ++0x1.951506f271652p1 ++0x1.e92041ee927e3p-6 ++0x1.ed2dc6dcf4002p-6 ++0x1.2c92337f90e49p2 ++-0x1.683c21e808cdep-5 ++-0x1.9a0b940509413p-6 ++0x1.98f7007ee0945p1 ++0x1.a2320700475bbp-7 ++0x1.bd43201cd4e31p-5 ++-0x1.cc04710864fd6p-5 ++0x1.a21c8714da14ep-5 ++0x1.773693ef8fa14p-5 ++0x1.79803001fe5dap-5 ++-0x1.2c32c75512fe9p2 ++0x1.844f25e75eb2fp0 ++-0x1.95d877a17a280p2 ++0x1.948a43d9d7741p1 ++0x1.971c84f87b377p0 ++0x1.9127e7382bcc8p-5 ++0x1.93fe639e0db3dp0 ++0x1.2f4d04d0c8b60p3 ++-0x1.902934f6cec25p0 ++-0x1.97e5e2e8c9690p0 ++-0x1.2e7f34a41089ap2 ++-0x1.dbf4d63956dabp-5 ++0x1.7de270a1cef9dp-5 ++-0x1.a8cfd796dd749p-5 ++-0x1.867323de7c548p0 ++-0x1.583b54858a854p-5 ++0x1.5a32b5f87c731p-6 ++-0x1.a893c3b3f116dp-5 ++0x1.8dba0559b03f2p-5 ++-0x1.8fddc49a817aap0 ++0x1.8dfc56712ea84p1 ++-0x1.5ec35128245fbp3 ++0x1.2ed721b3e7cf3p2 ++0x1.f6f6b38e4a725p2 ++0x1.8d7636d60e4a2p0 ++0x1.f53e24706a8adp2 ++-0x1.2b8e75888ccddp2 ++0x1.798c20cba7df8p4 ++-0x1.c28770144413dp3 ++0x1.99b0411242349p1 ++-0x1.899d668f66224p0 ++-0x1.9584c477164dfp1 ++0x1.894db4cfedf00p0 ++0x1.478fe109931cbp4 ++0x1.60ecc69ceb31cp3 ++-0x1.2daad0f631f1ap3 ++-0x1.90c0775e5bbd9p3 ++-0x1.9563261499472p1 ++-0x1.8cce8733835a8p1 ++-0x1.8e5bd67aad0bdp1 ++0x1.2f88b005dd5c1p3 ++0x1.2f79b51aa1b2ep3 ++0x1.c5ba9020db5c7p3 ++-0x1.91834694280eap3 ++-0x1.f59d31d57b57cp3 ++0x1.9f12216e6b6e5p0 ++0x1.9094e7026c1ebp3 ++0x1.155cc046ffb5bp4 ++-0x1.848890adc4715p0 ++0x1.90ad119b10f12p2 ++-0x1.8d9a028100e2cp0 ++0x1.c60477c5553dfp3 ++0x1.91b295b42732dp3 ++-0x1.93e8041f128acp3 ++0x1.88cc56d1e4905p0 ++-0x1.925832396eb4ap3 ++0x1.8a73075e37e87p1 ++-0x1.138d60f880517p4 ++-0x1.97cf677cc2b69p1 ++0x1.915aa29d49dbcp1 ++0x1.873b8780d5106p0 ++0x1.94c856a2d7bb6p1 ++-0x1.90628588db51ap3 ++-0x1.8f5770d7d1d70p1 ++0x1.c5579491935bbp3 ++-0x1.78da03f27aa07p4 ++0x1.9209877319a62p1 ++-0x1.2aea80b631733p2 ++0x1.2f75e48cddd2cp3 ++-0x1.5fb7273fcc453p3 ++-0x1.8488702ff0c32p0 ++-0x1.93dda7bee871ep0 ++-0x1.93b653501d3c1p2 ++0x1.9205222724e5bp1 ++0x1.2df4a1196323ep2 ++0x1.6108a416f100ap3 ++-0x1.8db7954424fc7p0 ++0x1.2bb8a1817846fp3 ++-0x1.8abed04ecb123p0 ++0x1.92d5f27ca693fp0 ++-0x1.2a3e75ea2ae07p2 ++-0x1.90fb35edc8d06p0 ++0x1.9a76161e739c7p0 ++# tan slow path at 240 bits ++# Implemented in sysdeps/ieee754/dbl-64/mptan.c ++# Range reduction is done using mp arithmetic. ++## name: 240bits ++0x1.ee5a221c1ec30p750 ++0x1.d0b7237b90954p983 ++0x1.50aee539c99e6p817 ++-0x1.63457438d44aap53 ++-0x1.294211dbd13e4p213 ++-0x1.d71b609ef9723p651 ++0x1.9c3fc4df7e48ep242 ++0x1.ab8b7376e687ep989 ++-0x1.23f9a2342724ap746 ++0x1.119932858dd5ap966 ++0x1.172f40abffae1p573 ++-0x1.f9bb63afd3e82p824 ++0x1.1d49b6073fd25p1018 ++0x1.3825a112069d0p360 ++0x1.8e64d153eac98p839 ++0x1.e87296bff194bp410 ++0x1.607562a57b7cbp149 ++0x1.79bab59092899p902 ++0x1.de5304e52acddp608 ++-0x1.418357b7072b6p987 ++-0x1.b86e0050bf853p732 ++-0x1.a1efd6e7ed2f7p903 ++-0x1.d8f94109ae4a3p874 ++0x1.4f3247a1eea1ep815 ++0x1.bdea912ba38d1p109 ++-0x1.c8df81ba65338p846 ++0x1.fdeb13595a17bp798 ++0x1.767af536202fcp99 ++-0x1.2a30021aae9e6p527 ++-0x1.28dee7f401161p970 ++0x1.4619840d88992p101 ++0x1.6bfc225d005a2p837 ++0x1.1e1af0e150b94p594 ++0x1.bb40b53e0e710p107 ++-0x1.509896c78f606p883 ++0x1.d89291baa92acp34 ++-0x1.3d17f161b743ep327 ++-0x1.39c6a16a6c7c6p264 ++0x1.c76d60078cecfp545 ++-0x1.154493e3be839p980 ++-0x1.b3df5360e6cbfp245 ++-0x1.f0c52280d0aadp653 ++-0x1.d93ce79dfe195p45 ++0x1.88dd7769601fep966 ++0x1.a903f553288eap298 ++0x1.4ecba03f7132fp152 ++-0x1.ee34e7eac85fap992 ++-0x1.010e46c3cd107p876 ++-0x1.b56fd64fe1fbdp323 ++0x1.2c50c6911febep742 ++0x1.740dc6b962c9bp422 ++-0x1.617e2227cbff6p224 ++-0x1.1ad286314c58bp940 ++0x1.ac1745b651b5fp649 ++0x1.fddce309449cfp982 ++0x1.73aa443462592p182 ++0x1.7d2e10f57bf82p306 ++-0x1.93eef4d8c4abep433 ++0x1.3d9bd192c5d05p408 ++0x1.1ba6707e8de9ap833 ++-0x1.c2f6f7c9e74b3p766 ++0x1.404e24bccecfcp457 ++-0x1.7a40f3ff05d01p530 ++-0x1.10de718a052b3p202 ++0x1.406e1464adc55p557 ++0x1.9e19028382754p550 ++0x1.635c94cbc7020p982 ++0x1.984492142a1c0p81 ++0x1.4b64a03a03816p428 ++0x1.247c4191da022p961 ++0x1.c141e714fe35cp908 ++0x1.1b3621a4c2bafp257 ++0x1.53d5e3c854773p294 ++0x1.0747d33080a32p824 ++0x1.1632770278ce8p845 ++-0x1.c782e7d005b27p622 ++0x1.593837dacc255p851 ++-0x1.ec2ff0a8e0bcdp569 ++-0x1.b594936bb511ep82 ++0x1.9b45519d36598p976 ++-0x1.9b8684eaa71c6p944 ++-0x1.a3d743632fed4p395 ++-0x1.b73bd248a7a07p401 ++-0x1.dbc2269986a9dp213 ++0x1.1db1d61aaef59p102 ++0x1.2e8bb0f1ad8e5p797 ++0x1.e883f6710822bp235 ++-0x1.869ff130d5a8ap348 ++0x1.2fa330ffa7b9bp49 ++-0x1.0504a5188eddbp500 ++-0x1.0d0a04316e717p622 ++0x1.e020a6a980593p957 ++0x1.869895a12103dp1011 ++-0x1.a069a71af1389p432 ++-0x1.814d711d1c525p904 ++0x1.3648160c04db0p640 ++-0x1.fafcf58cb570cp724 ++-0x1.00bdd7f58135ep394 ++0x1.e4d721588529ep259 ++-0x1.2b364691f9147p192 ++-0x1.7932c5bb927a9p463 ++0x1.d185a23e7a264p121 ++-0x1.d82395a639e87p578 ++0x1.d19bd28cdb538p1020 ++-0x1.91e123b92a975p528 ++-0x1.f5b921ff6813fp866 ++-0x1.f233e109dede1p346 ++0x1.22b5274acfea5p28 ++-0x1.b12c358527025p560 ++0x1.87f9c3636f7a7p770 ++-0x1.b7cfb4bd9ef9fp559 ++0x1.ab30f4cdb2826p927 ++0x1.3121e66534c09p996 ++0x1.32ff26e56b243p66 ++-0x1.6a3155c7bbc49p381 ++0x1.0629119d19fe7p306 ++0x1.666f07ccc3516p444 ++-0x1.71b82433bfd05p656 ++0x1.787bb435c6119p237 ++-0x1.bb81028d4e92ep822 ++-0x1.f956b52f53507p930 ++-0x1.9f75e34d740f3p394 ++0x1.babfd6b429321p307 ++-0x1.0546727a98f2fp892 ++-0x1.24e7a5b4ab558p36 ++0x1.91b656ffc9015p48 ++0x1.f214d6691dbc8p813 ++-0x1.7508047526de4p708 ++-0x1.6e0884d03f494p595 ++-0x1.abf2f140b46a1p958 ++0x1.cd37e24ae01d2p996 ++0x1.874b5349798ddp791 ++0x1.5db704095417cp479 ++-0x1.385f265e0be6dp529 ++-0x1.77d7f72971477p254 ++0x1.c1d572032a2bcp231 ++0x1.c5f3b1b1e6cb1p985 ++0x1.112e0044fe943p152 ++-0x1.c39e821cde6d0p860 ++0x1.70f7800567a4cp831 ++-0x1.bf2987be14b54p43 ++0x1.005dc191f8155p428 ++0x1.15ae534e6771bp286 ++0x1.c90422cac4067p433 ++0x1.ce9e737328102p189 ++0x1.809d12529d2fcp385 ++0x1.1063e5c391f7dp222 ++0x1.d2ec86f035aecp981 ++-0x1.196f9101def40p684 ++0x1.c63095b4787cbp964 ++-0x1.974c637b88001p971 ++-0x1.1f4ff59ad6375p982 ++-0x1.fd2845fc76df9p832 ++0x1.1e2872f75696dp150 ++0x1.550941834ba74p642 ++0x1.0d163506e72bbp960 ++-0x1.c4ac9745073bap738 ++0x1.8fd3f61e48e52p625 ++-0x1.5f9425e8039f3p636 ++0x1.3e4f37281e892p558 ++0x1.3373f1db8806cp990 ++-0x1.038965f403b17p774 ++-0x1.bd5b377d53669p945 ++-0x1.07b3f085c6733p689 ++0x1.3544b2eed1abfp262 ++0x1.1532c11ac2507p832 ++-0x1.c00c9609102c4p786 ++0x1.ad9637e0c897bp581 ++-0x1.fe4bc0f718a8cp569 ++0x1.0692371444ef5p700 ++0x1.cb4e64433e84cp965 ++-0x1.69d26008baa73p236 ++0x1.62f9711ed5d1ep464 ++0x1.e930d2860dadap435 ++-0x1.909f574e6549cp658 ++0x1.00e4f31691d23p399 ++-0x1.0d5823a83628bp540 ++-0x1.c7b743f92fb3fp569 ++0x1.7dee11c9dafa3p670 ++0x1.529be63463210p939 ++0x1.62bd520c84081p874 ++0x1.c993466a75c4cp61 ++-0x1.33b0260c2549bp495 ++0x1.09e87208ab6ffp625 ++0x1.0ae9e4d036946p291 ++0x1.07d5649391891p165 ++-0x1.bee4e05b04714p586 ++0x1.2b0994ee5f218p167 ++0x1.ebfc830d19d34p992 ++0x1.382612ecb922ap979 ++-0x1.21c82431ac446p1022 ++0x1.6196b60f1c50fp190 ++-0x1.c25ea71d737a2p248 ++0x1.d024774408b26p335 ++-0x1.f5ce472da3a21p644 ++-0x1.81a011e0b6271p851 ++0x1.9cd0227a58f39p939 ++-0x1.8698a10662bffp544 ++0x1.a07c20fa799d8p622 ++-0x1.d126c657c582bp880 ++# tan slowest path at 768 bits ++# Implemented in sysdeps/ieee754/dbl-64/mptan.c ++## name: 768bits ++0x1.dffffffffff1fp-22 ++0x1.810f60836538dp143 ++-0x1.e877a52501e08p134 +diff -urN glibc-2.17-c758a686/debug/test-strcpy_chk.c glibc-2.17-c758a686/debug/test-strcpy_chk.c +--- glibc-2.17-c758a686/debug/test-strcpy_chk.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/debug/test-strcpy_chk.c 2015-06-20 21:22:16.304457892 -0400 +@@ -54,6 +54,10 @@ + #include <setjmp.h> + #include <signal.h> + ++static int test_main (void); ++#define TEST_FUNCTION test_main () ++#include "../test-skeleton.c" ++ + volatile int chk_fail_ok; + jmp_buf chk_fail_buf; + +@@ -110,24 +114,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused));; +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, dst, src, dlen); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -151,14 +137,8 @@ + s1[i] = 32 + 23 * i % (max_char - 32); + s1[len] = 0; + +- if (HP_TIMING_AVAIL && dlen > len) +- printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s2, s1, len, dlen); +- +- if (HP_TIMING_AVAIL && dlen > len) +- putchar ('\n'); + } + + static void +@@ -290,28 +270,12 @@ + } + } + +-int ++static int + test_main (void) + { + size_t i; + +- struct sigaction sa; +- sa.sa_handler = handler; +- sa.sa_flags = 0; +- sigemptyset (&sa.sa_mask); +- +- sigaction (SIGABRT, &sa, NULL); +- +- /* Avoid all the buffer overflow messages on stderr. */ +- 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); ++ set_fortify_handler (handler); + + test_init (); + +@@ -389,5 +353,3 @@ + do_random_tests (); + return ret; + } +- +-#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/debug/tst-chk1.c glibc-2.17-c758a686/debug/tst-chk1.c +--- glibc-2.17-c758a686/debug/tst-chk1.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/debug/tst-chk1.c 2015-06-20 21:22:16.304457892 -0400 +@@ -20,7 +20,6 @@ + #include <fcntl.h> + #include <locale.h> + #include <obstack.h> +-#include <paths.h> + #include <setjmp.h> + #include <signal.h> + #include <stdio.h> +@@ -119,23 +118,7 @@ + static int + do_test (void) + { +- struct sigaction sa; +- sa.sa_handler = handler; +- sa.sa_flags = 0; +- sigemptyset (&sa.sa_mask); +- +- sigaction (SIGABRT, &sa, NULL); +- +- /* Avoid all the buffer overflow messages on stderr. */ +- 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); ++ set_fortify_handler (handler); + + struct A { char buf1[9]; char buf2[1]; } a; + struct wA { wchar_t buf1[9]; wchar_t buf2[1]; } wa; +@@ -1366,7 +1349,7 @@ + ret = 1; + } + +- fd = posix_openpt (O_RDWR); ++ int fd = posix_openpt (O_RDWR); + if (fd != -1) + { + char enough[1000]; +diff -urN glibc-2.17-c758a686/debug/tst-longjmp_chk.c glibc-2.17-c758a686/debug/tst-longjmp_chk.c +--- glibc-2.17-c758a686/debug/tst-longjmp_chk.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/debug/tst-longjmp_chk.c 2015-06-20 21:22:16.305457862 -0400 +@@ -1,3 +1,5 @@ ++/* Basic test to make sure doing a longjmp to a jmpbuf with an invalid sp ++ is caught by the fortification code. */ + #include <errno.h> + #include <fcntl.h> + #include <paths.h> +@@ -8,6 +10,12 @@ + #include <stdlib.h> + #include <unistd.h> + ++ ++static int do_test(void); ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" ++ ++ + static jmp_buf b; + + +@@ -43,26 +51,10 @@ + } + + +-int +-main (void) ++static int ++do_test (void) + { +- struct sigaction sa; +- sa.sa_handler = handler; +- sa.sa_flags = 0; +- sigemptyset (&sa.sa_mask); +- +- sigaction (SIGABRT, &sa, NULL); +- +- /* Avoid all the buffer overflow messages on stderr. */ +- 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); ++ set_fortify_handler (handler); + + + expected_to_fail = false; +diff -urN glibc-2.17-c758a686/elf/dl-support.c glibc-2.17-c758a686/elf/dl-support.c +--- glibc-2.17-c758a686/elf/dl-support.c 2015-06-20 23:38:08.194095607 -0400 ++++ glibc-2.17-c758a686/elf/dl-support.c 2015-06-20 22:00:26.531904072 -0400 +@@ -90,12 +90,6 @@ + /* Get architecture specific initializer. */ + #include <dl-procinfo.c> + +-/* We expect less than a second for relocation. */ +-#ifdef HP_SMALL_TIMING_AVAIL +-# undef HP_TIMING_AVAIL +-# define HP_TIMING_AVAIL HP_SMALL_TIMING_AVAIL +-#endif +- + /* Initial value of the CPU clock. */ + #ifndef HP_TIMING_NONAVAIL + hp_timing_t _dl_cpuclock_offset; +@@ -265,7 +259,7 @@ + internal_function + _dl_non_dynamic_init (void) + { +- if (HP_TIMING_AVAIL) ++ if (HP_SMALL_TIMING_AVAIL) + HP_TIMING_NOW (_dl_cpuclock_offset); + + if (!_dl_pagesize) +diff -urN glibc-2.17-c758a686/elf/rtld.c glibc-2.17-c758a686/elf/rtld.c +--- glibc-2.17-c758a686/elf/rtld.c 2015-06-20 23:38:08.170096325 -0400 ++++ glibc-2.17-c758a686/elf/rtld.c 2015-06-20 22:06:24.194043066 -0400 +@@ -193,12 +193,6 @@ + static struct libname_list _dl_rtld_libname; + static struct libname_list _dl_rtld_libname2; + +-/* We expect less than a second for relocation. */ +-#ifdef HP_SMALL_TIMING_AVAIL +-# undef HP_TIMING_AVAIL +-# define HP_TIMING_AVAIL HP_SMALL_TIMING_AVAIL +-#endif +- + /* Variable for statistics. */ + #ifndef HP_TIMING_NONAVAIL + static hp_timing_t relocate_time; +@@ -268,7 +262,7 @@ + { + ElfW(Addr) start_addr; + +- if (HP_TIMING_AVAIL) ++ if (HP_SMALL_TIMING_AVAIL) + { + /* If it hasn't happen yet record the startup time. */ + if (! HP_TIMING_INLINE) +@@ -277,9 +271,6 @@ + else + start_time = info->start_time; + #endif +- +- /* Initialize the timing functions. */ +- HP_TIMING_DIFF_INIT (); + } + + /* Transfer data about ourselves to the permanent link_map structure. */ +@@ -315,9 +306,7 @@ + + #endif + +-#if HP_TIMING_AVAIL + HP_TIMING_NOW (GL(dl_cpuclock_offset)); +-#endif + + /* Initialize the stack end variable. */ + __libc_stack_end = __builtin_frame_address (0); +@@ -330,7 +319,7 @@ + + #ifndef HP_TIMING_NONAVAIL + hp_timing_t rtld_total_time; +- if (HP_TIMING_AVAIL) ++ if (HP_SMALL_TIMING_AVAIL) + { + hp_timing_t end_time; + +@@ -372,7 +361,7 @@ + #define RESOLVE_MAP(sym, version, flags) (&bootstrap_map) + #include "dynamic-link.h" + +- if (HP_TIMING_INLINE && HP_TIMING_AVAIL) ++ if (HP_TIMING_INLINE && HP_SMALL_TIMING_AVAIL) + #ifdef DONT_USE_BOOTSTRAP_MAP + HP_TIMING_NOW (start_time); + #else +@@ -2720,7 +2709,7 @@ + char *wp; + + /* Total time rtld used. */ +- if (HP_TIMING_AVAIL) ++ if (HP_SMALL_TIMING_AVAIL) + { + HP_TIMING_PRINT (buf, sizeof (buf), *rtld_total_timep); + _dl_debug_printf ("\nruntime linker statistics:\n" +@@ -2788,7 +2777,7 @@ + + #ifndef HP_TIMING_NONAVAIL + /* Time spend while loading the object and the dependencies. */ +- if (HP_TIMING_AVAIL) ++ if (HP_SMALL_TIMING_AVAIL) + { + char pbuf[30]; + HP_TIMING_PRINT (buf, sizeof (buf), load_time); +diff -urN glibc-2.17-c758a686/Makefile.in glibc-2.17-c758a686/Makefile.in +--- glibc-2.17-c758a686/Makefile.in 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/Makefile.in 2015-06-20 21:22:16.305457862 -0400 +@@ -3,7 +3,7 @@ + # Uncomment the line below if you want to do parallel build. + # PARALLELMFLAGS = -j 4 + +-.PHONY: all install ++.PHONY: all install bench + + all .DEFAULT: + $(MAKE) -r PARALLELMFLAGS="$(PARALLELMFLAGS)" -C $(srcdir) objdir=`pwd` $@ +@@ -11,3 +11,6 @@ + install: + LANGUAGE=C LC_ALL=C; export LANGUAGE LC_ALL; \ + $(MAKE) -r PARALLELMFLAGS="$(PARALLELMFLAGS)" -C $(srcdir) objdir=`pwd` $@ ++ ++bench bench-clean: ++ $(MAKE) -C $(srcdir)/benchtests $(PARALLELMFLAGS) objdir=`pwd` $@ +diff -urN glibc-2.17-c758a686/ports/sysdeps/alpha/hp-timing.h glibc-2.17-c758a686/ports/sysdeps/alpha/hp-timing.h +--- glibc-2.17-c758a686/ports/sysdeps/alpha/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/alpha/hp-timing.h 2015-06-20 21:44:22.241186366 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. Alpha version. +- Copyright (C) 2001 Free Software Foundation, Inc. ++ Copyright (C) 2001-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson <rth@redhat.com>, 2001. + +@@ -20,52 +20,6 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +-#include <string.h> +-#include <sys/param.h> +-#include <_itoa.h> +- +-/* The macros defined here use the timestamp counter in IA-64. They +- provide a very accurate way to measure the time with very little +- overhead. The time values themself have no real meaning, only +- differences are interesting. +- +- The list of macros we need includes the following: +- +- - HP_TIMING_AVAIL: test for availability. +- +- - HP_TIMING_INLINE: this macro is non-zero if the functionality is not +- implemented using function calls but instead uses some inlined code +- which might simply consist of a few assembler instructions. We have to +- know this since we might want to use the macros here in places where we +- cannot make function calls. +- +- - hp_timing_t: This is the type for variables used to store the time +- values. +- +- - HP_TIMING_ZERO: clear `hp_timing_t' object. +- +- - HP_TIMING_NOW: place timestamp for current time in variable given as +- parameter. +- +- - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the +- HP_TIMING_DIFF macro. +- +- - HP_TIMING_DIFF: compute difference between two times and store it +- in a third. Source and destination might overlap. +- +- - HP_TIMING_ACCUM: add time difference to another variable. This might +- be a bit more complicated to implement for some platforms as the +- operation should be thread-safe and 64bit arithmetic on 32bit platforms +- is not. +- +- - HP_TIMING_ACCUM_NT: this is the variant for situations where we know +- there are no threads involved. +- +- - HP_TIMING_PRINT: write decimal representation of the timing value into +- the given string. This operation need not be inline even though +- HP_TIMING_INLINE is specified. +-*/ +- + /* We always have the timestamp register, but it's got only a 4 second + range. Use it for ld.so profiling only. */ + #define HP_TIMING_AVAIL (0) +@@ -77,9 +31,6 @@ + /* We use 32 bit values for the times. */ + typedef unsigned int hp_timing_t; + +-/* Set timestamp value to zero. */ +-#define HP_TIMING_ZERO(VAR) (VAR) = (0) +- + /* The "rpcc" instruction returns a 32-bit counting half and a 32-bit + "virtual cycle counter displacement". Subtracting the two gives us + a virtual cycle count. */ +@@ -90,28 +41,6 @@ + (VAR) = (int) (x_) - (int) (x_ >> 32); \ + } while (0) + +-/* ??? Two rpcc instructions can be scheduled simultaneously. */ +-#define HP_TIMING_DIFF_INIT() do { } while (0) +- +-/* It's simple arithmetic for us. */ +-#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) +- +-/* ??? Don't bother, since we're only used for ld.so. */ +-#define HP_TIMING_ACCUM(Sum, Diff) not implemented +- +-/* No threads, no extra work. */ +-#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) +- +-/* Print the time value. */ +-#define HP_TIMING_PRINT(Buf, Len, Val) \ +- do { \ +- char __buf[20]; \ +- char *__cp = _itoa_word (Val, __buf + sizeof (__buf), 10, 0); \ +- int __len = (Len); \ +- char *__dest = (Buf); \ +- while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ +- *__dest++ = *__cp++; \ +- memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.c glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.c +--- glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,23 +0,0 @@ +-/* Support for high precision, low overhead timing functions. IA-64 version. +- Copyright (C) 2001, 2002 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- <http://www.gnu.org/licenses/>. */ +- +-#include <hp-timing.h> +- +-/* We have to define the variable for the overhead. */ +-hp_timing_t _dl_hp_timing_overhead; +diff -urN glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.h glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.h +--- glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/ia64/hp-timing.h 2015-06-20 21:44:03.984740754 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. IA-64 version. +- Copyright (C) 2001-2012 Free Software Foundation, Inc. ++ Copyright (C) 2001-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001. + +@@ -20,56 +20,9 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +-#include <string.h> +-#include <sys/param.h> +-#include <_itoa.h> +-#include <ia64intrin.h> +- +-/* The macros defined here use the timestamp counter in IA-64. They +- provide a very accurate way to measure the time with very little +- overhead. The time values themself have no real meaning, only +- differences are interesting. +- +- The list of macros we need includes the following: +- +- - HP_TIMING_AVAIL: test for availability. +- +- - HP_TIMING_INLINE: this macro is non-zero if the functionality is not +- implemented using function calls but instead uses some inlined code +- which might simply consist of a few assembler instructions. We have to +- know this since we might want to use the macros here in places where we +- cannot make function calls. +- +- - hp_timing_t: This is the type for variables used to store the time +- values. +- +- - HP_TIMING_ZERO: clear `hp_timing_t' object. +- +- - HP_TIMING_NOW: place timestamp for current time in variable given as +- parameter. +- +- - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the +- HP_TIMING_DIFF macro. +- +- - HP_TIMING_DIFF: compute difference between two times and store it +- in a third. Source and destination might overlap. +- +- - HP_TIMING_ACCUM: add time difference to another variable. This might +- be a bit more complicated to implement for some platforms as the +- operation should be thread-safe and 64bit arithmetic on 32bit platforms +- is not. +- +- - HP_TIMING_ACCUM_NT: this is the variant for situations where we know +- there are no threads involved. +- +- - HP_TIMING_PRINT: write decimal representation of the timing value into +- the given string. This operation need not be inline even though +- HP_TIMING_INLINE is specified. +- +-*/ +- + /* We always assume having the timestamp register. */ + #define HP_TIMING_AVAIL (1) ++#define HP_SMALL_TIMING_AVAIL (1) + + /* We indeed have inlined functions. */ + #define HP_TIMING_INLINE (1) +@@ -77,10 +30,6 @@ + /* We use 64bit values for the times. */ + typedef unsigned long int hp_timing_t; + +-/* Set timestamp value to zero. */ +-#define HP_TIMING_ZERO(Var) (Var) = (0) +- +- + /* The Itanium/Merced has a bug where the ar.itc register value read + is not correct in some situations. The solution is to read again. + For now we always do this until we know how to recognize a fixed +@@ -95,53 +44,6 @@ + while (REPEAT_READ (__itc)); \ + Var = __itc; }) + +-/* Use two 'ar.itc' instructions in a row to find out how long it takes. */ +-#define HP_TIMING_DIFF_INIT() \ +- do { \ +- int __cnt = 5; \ +- GLRO(dl_hp_timing_overhead) = ~0ul; \ +- do \ +- { \ +- hp_timing_t __t1, __t2; \ +- HP_TIMING_NOW (__t1); \ +- HP_TIMING_NOW (__t2); \ +- if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \ +- GLRO(dl_hp_timing_overhead) = __t2 - __t1; \ +- } \ +- while (--__cnt > 0); \ +- } while (0) +- +-/* It's simple arithmetic for us. */ +-#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) +- +-/* We have to jump through hoops to get this correctly implemented. */ +-#define HP_TIMING_ACCUM(Sum, Diff) \ +- do { \ +- hp_timing_t __oldval; \ +- hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ +- hp_timing_t __newval; \ +- do \ +- { \ +- __oldval = (Sum); \ +- __newval = __oldval + __diff; \ +- } \ +- while (! __sync_bool_compare_and_swap (&Sum, __oldvar, __newval)); \ +- } while (0) +- +-/* No threads, no extra work. */ +-#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) +- +-/* Print the time value. */ +-#define HP_TIMING_PRINT(Buf, Len, Val) \ +- do { \ +- char __buf[20]; \ +- char *__cp = _itoa_word (Val, __buf + sizeof (__buf), 10, 0); \ +- int __len = (Len); \ +- char *__dest = (Buf); \ +- while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ +- *__dest++ = *__cp++; \ +- memcpy (__dest, " clock cycles", MIN (__len, \ +- (int) sizeof (" clock cycles"))); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/ports/sysdeps/ia64/Makefile glibc-2.17-c758a686/ports/sysdeps/ia64/Makefile +--- glibc-2.17-c758a686/ports/sysdeps/ia64/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/ports/sysdeps/ia64/Makefile 2015-06-20 22:31:17.725704221 -0400 +@@ -7,8 +7,6 @@ + + ifeq ($(subdir), csu) + CPPFLAGS-start.S = -D__ASSEMBLY__ +-sysdep_routines += hp-timing +-elide-routines.os += hp-timing + + ifeq (yes,$(build-shared)) + # Compatibility +diff -urN glibc-2.17-c758a686/Rules glibc-2.17-c758a686/Rules +--- glibc-2.17-c758a686/Rules 2015-06-20 23:38:08.446088067 -0400 ++++ glibc-2.17-c758a686/Rules 2015-06-20 21:22:16.305457862 -0400 +@@ -83,7 +83,7 @@ + + # This makes all the auxiliary and test programs. + +-.PHONY: others tests ++.PHONY: others tests bench + ifeq ($(multi-arch),no) + tests := $(filter-out $(tests-ifunc), $(tests)) + xtests := $(filter-out $(xtests-ifunc), $(xtests)) +@@ -192,6 +192,7 @@ + $(make-test-out) > $@ + + endif # tests ++ + + .PHONY: distclean realclean subdir_distclean subdir_realclean \ + subdir_clean subdir_mostlyclean subdir_testclean +diff -urN glibc-2.17-c758a686/scripts/pylint glibc-2.17-c758a686/scripts/pylint +--- glibc-2.17-c758a686/scripts/pylint 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/scripts/pylint 2015-06-20 21:22:16.305457862 -0400 +@@ -0,0 +1,5 @@ ++#!/bin/sh ++# Simple wrapper around the pylint program that uses the pylintrc file to ++# validate the source code in files passed on command line. ++ ++exec pylint --rcfile "${0%/*}/pylintrc" "$@" +diff -urN glibc-2.17-c758a686/scripts/pylintrc glibc-2.17-c758a686/scripts/pylintrc +--- glibc-2.17-c758a686/scripts/pylintrc 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/scripts/pylintrc 2015-06-20 21:22:16.305457862 -0400 +@@ -0,0 +1,274 @@ ++[MASTER] ++ ++# Specify a configuration file. ++#rcfile= ++ ++# Python code to execute, usually for sys.path manipulation such as ++# pygtk.require(). ++#init-hook= ++ ++# Profiled execution. ++profile=no ++ ++# Add files or directories to the blacklist. They should be base names, not ++# paths. ++ignore=CVS ++ ++# Pickle collected data for later comparisons. ++persistent=yes ++ ++# List of plugins (as comma separated values of python modules names) to load, ++# usually to register additional checkers. ++load-plugins= ++ ++ ++[MESSAGES CONTROL] ++ ++# Enable the message, report, category or checker with the given id(s). You can ++# either give multiple identifier separated by comma (,) or put this option ++# multiple time. See also the "--disable" option for examples. ++#enable= ++ ++# Disable the message, report, category or checker with the given id(s). You ++# can either give multiple identifiers separated by comma (,) or put this ++# option multiple times (only on the command line, not in the configuration ++# file where it should appear only once).You can also use "--disable=all" to ++# disable everything first and then reenable specific checks. For example, if ++# you want to run only the similarities checker, you can use "--disable=all ++# --enable=similarities". If you want to run only the classes checker, but have ++# no Warning level messages displayed, use"--disable=all --enable=classes ++# --disable=W" ++#disable= ++ ++ ++[REPORTS] ++ ++# Set the output format. Available formats are text, parseable, colorized, msvs ++# (visual studio) and html. You can also give a reporter class, eg ++# mypackage.mymodule.MyReporterClass. ++output-format=text ++ ++# Put messages in a separate file for each module / package specified on the ++# command line instead of printing them on stdout. Reports (if any) will be ++# written in a file name "pylint_global.[txt|html]". ++files-output=no ++ ++# Tells whether to display a full report or only the messages ++reports=yes ++ ++# Python expression which should return a note less than 10 (10 is the highest ++# note). You have access to the variables errors warning, statement which ++# respectively contain the number of errors / warnings messages and the total ++# number of statements analyzed. This is used by the global evaluation report ++# (RP0004). ++evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) ++ ++# Add a comment according to your evaluation note. This is used by the global ++# evaluation report (RP0004). ++comment=no ++ ++# Template used to display messages. This is a python new-style format string ++# used to format the massage information. See doc for all details ++#msg-template= ++ ++ ++[MISCELLANEOUS] ++ ++# List of note tags to take in consideration, separated by a comma. ++notes=FIXME,XXX,TODO ++ ++ ++[SIMILARITIES] ++ ++# Minimum lines number of a similarity. ++min-similarity-lines=4 ++ ++# Ignore comments when computing similarities. ++ignore-comments=yes ++ ++# Ignore docstrings when computing similarities. ++ignore-docstrings=yes ++ ++# Ignore imports when computing similarities. ++ignore-imports=no ++ ++ ++[BASIC] ++ ++# Required attributes for module, separated by a comma ++required-attributes= ++ ++# List of builtins function names that should not be used, separated by a comma ++bad-functions=map,filter,apply,input ++ ++# Regular expression which should only match correct module names ++module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ ++ ++# Regular expression which should only match correct module level names ++const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ ++ ++# Regular expression which should only match correct class names ++class-rgx=[A-Z_][a-zA-Z0-9]+$ ++ ++# Regular expression which should only match correct function names ++function-rgx=[a-z_][a-z0-9_]{2,30}$ ++ ++# Regular expression which should only match correct method names ++method-rgx=[a-z_][a-z0-9_]{2,30}$ ++ ++# Regular expression which should only match correct instance attribute names ++attr-rgx=[a-z_][a-z0-9_]{2,30}$ ++ ++# Regular expression which should only match correct argument names ++argument-rgx=[a-z_][a-z0-9_]{2,30}$ ++ ++# Regular expression which should only match correct variable names ++variable-rgx=[a-z_][a-z0-9_]{2,30}$ ++ ++# Regular expression which should only match correct attribute names in class ++# bodies ++class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ ++ ++# Regular expression which should only match correct list comprehension / ++# generator expression variable names ++inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ ++ ++# Good variable names which should always be accepted, separated by a comma ++# f is a useful name for a file descriptor ++good-names=f,i,j,k,ex,Run,_ ++ ++# Bad variable names which should always be refused, separated by a comma ++bad-names=foo,bar,baz,toto,tutu,tata ++ ++# Regular expression which should only match function or class names that do ++# not require a docstring. ++no-docstring-rgx=__.*__ ++ ++# Minimum line length for functions/classes that require docstrings, shorter ++# ones are exempt. ++docstring-min-length=-1 ++ ++ ++[VARIABLES] ++ ++# Tells whether we should check for unused import in __init__ files. ++init-import=no ++ ++# A regular expression matching the beginning of the name of dummy variables ++# (i.e. not used). ++dummy-variables-rgx=_$|dummy ++ ++# List of additional names supposed to be defined in builtins. Remember that ++# you should avoid to define new builtins when possible. ++additional-builtins= ++ ++ ++[FORMAT] ++ ++# Maximum number of characters on a single line. ++max-line-length=79 ++ ++# Regexp for a line that is allowed to be longer than the limit. ++ignore-long-lines=^\s*(# )?<?https?://\S+>?$ ++ ++# Maximum number of lines in a module ++max-module-lines=1000 ++ ++# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 ++# tab). ++indent-string=' ' ++ ++ ++[TYPECHECK] ++ ++# Tells whether missing members accessed in mixin class should be ignored. A ++# mixin class is detected if its name ends with "mixin" (case insensitive). ++ignore-mixin-members=yes ++ ++# List of classes names for which member attributes should not be checked ++# (useful for classes with attributes dynamically set). ++ignored-classes=SQLObject ++ ++# When zope mode is activated, add a predefined set of Zope acquired attributes ++# to generated-members. ++zope=no ++ ++# List of members which are set dynamically and missed by pylint inference ++# system, and so shouldn't trigger E0201 when accessed. Python regular ++# expressions are accepted. ++generated-members=REQUEST,acl_users,aq_parent ++ ++ ++[CLASSES] ++ ++# List of interface methods to ignore, separated by a comma. This is used for ++# instance to not check methods defines in Zope's Interface base class. ++ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by ++ ++# List of method names used to declare (i.e. assign) instance attributes. ++defining-attr-methods=__init__,__new__,setUp ++ ++# List of valid names for the first argument in a class method. ++valid-classmethod-first-arg=cls ++ ++# List of valid names for the first argument in a metaclass class method. ++valid-metaclass-classmethod-first-arg=mcs ++ ++ ++[IMPORTS] ++ ++# Deprecated modules which should not be used, separated by a comma ++deprecated-modules=regsub,TERMIOS,Bastion,rexec ++ ++# Create a graph of every (i.e. internal and external) dependencies in the ++# given file (report RP0402 must not be disabled) ++import-graph= ++ ++# Create a graph of external dependencies in the given file (report RP0402 must ++# not be disabled) ++ext-import-graph= ++ ++# Create a graph of internal dependencies in the given file (report RP0402 must ++# not be disabled) ++int-import-graph= ++ ++ ++[DESIGN] ++ ++# Maximum number of arguments for function / method ++max-args=5 ++ ++# Argument names that match this expression will be ignored. Default to name ++# with leading underscore ++ignored-argument-names=_.* ++ ++# Maximum number of locals for function / method body ++max-locals=15 ++ ++# Maximum number of return / yield for function / method body ++max-returns=6 ++ ++# Maximum number of branch for function / method body ++max-branches=12 ++ ++# Maximum number of statements in function / method body ++max-statements=50 ++ ++# Maximum number of parents for a class (see R0901). ++max-parents=7 ++ ++# Maximum number of attributes for a class (see R0902). ++max-attributes=7 ++ ++# Minimum number of public methods for a class (see R0903). ++min-public-methods=2 ++ ++# Maximum number of public methods for a class (see R0904). ++max-public-methods=20 ++ ++ ++[EXCEPTIONS] ++ ++# Exceptions that will emit a warning when being caught. Defaults to ++# "Exception" ++overgeneral-exceptions=Exception +diff -urN glibc-2.17-c758a686/string/strtok.c glibc-2.17-c758a686/string/strtok.c +--- glibc-2.17-c758a686/string/strtok.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/strtok.c 2015-06-20 21:22:16.305457862 -0400 +@@ -23,6 +23,10 @@ + + #undef strtok + ++#ifndef STRTOK ++# define STRTOK strtok ++#endif ++ + /* Parse S into tokens separated by characters in DELIM. + If S is NULL, the last string strtok() was called with is + used. For example: +@@ -33,9 +37,7 @@ + // s = "abc\0=-def\0" + */ + char * +-strtok (s, delim) +- char *s; +- const char *delim; ++STRTOK (char *s, const char *delim) + { + char *token; + +diff -urN glibc-2.17-c758a686/string/test-memccpy.c glibc-2.17-c758a686/string/test-memccpy.c +--- glibc-2.17-c758a686/string/test-memccpy.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-memccpy.c 2015-06-20 23:36:49.734443244 -0400 +@@ -74,24 +74,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute__ ((unused)); +- hp_timing_t stop __attribute__ ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, dst, src, c, n); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -122,14 +104,8 @@ + for (i = len; i + align1 < page_size && i < len + 64; ++i) + s1[i] = 32 + 32 * i % (max_char - 32); + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, n %4zd, char %d, alignment %2zd/%2zd:", len, n, c, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s2, s1, c, len, n); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-memchr.c glibc-2.17-c758a686/string/test-memchr.c +--- glibc-2.17-c758a686/string/test-memchr.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-memchr.c 2015-06-20 23:36:49.736443184 -0400 +@@ -47,24 +47,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s, c, n); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -97,14 +79,8 @@ + buf1[align + len] = seek_char; + } + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd:", pos, align); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, (char *) (buf1 + align), seek_char, len, result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-memcmp.c glibc-2.17-c758a686/string/test-memcmp.c +--- glibc-2.17-c758a686/string/test-memcmp.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-memcmp.c 2015-06-20 23:36:49.736443184 -0400 +@@ -100,24 +100,6 @@ + { + if (check_result (impl, s1, s2, len, exp_result) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s1, s2, len); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -147,14 +129,8 @@ + s2[len] = align2; + s2[len - 1] -= exp_result; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, len, exp_result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-memcpy.c glibc-2.17-c758a686/string/test-memcpy.c +--- glibc-2.17-c758a686/string/test-memcpy.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-memcpy.c 2015-06-20 23:36:49.736443184 -0400 +@@ -68,24 +68,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, dst, src, len); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -108,14 +90,8 @@ + for (i = 0, j = 1; i < len; i++, j += 23) + s1[i] = j; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s2, s1, len); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-memmem.c glibc-2.17-c758a686/string/test-memmem.c +--- glibc-2.17-c758a686/string/test-memmem.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-memmem.c 2015-06-20 23:36:49.736443184 -0400 +@@ -82,24 +82,6 @@ + if (check_result (impl, haystack, haystack_len, needle, needle_len, + expected) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, haystack, haystack_len, needle, needle_len); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -110,16 +92,10 @@ + memcpy (tmpbuf, buf1 + idx, len); + memcpy (buf1 + idx, str, len); + +- if (HP_TIMING_AVAIL) +- printf ("String %s, offset %zd:", str, idx); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx); + + memcpy (buf1 + idx, tmpbuf, len); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +@@ -143,16 +119,10 @@ + buf1[idx + off] = ch; + } + +- if (HP_TIMING_AVAIL) +- printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len, + buf1 + idx); + +- if (HP_TIMING_AVAIL) +- putchar ('\n'); +- + memcpy (buf1 + idx, tmpbuf, len); + } + } +diff -urN glibc-2.17-c758a686/string/test-memmove.c glibc-2.17-c758a686/string/test-memmove.c +--- glibc-2.17-c758a686/string/test-memmove.c 2015-06-20 23:38:08.186095846 -0400 ++++ glibc-2.17-c758a686/string/test-memmove.c 2015-06-20 23:36:49.737443154 -0400 +@@ -91,28 +91,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +-#ifdef TEST_BCOPY +- CALL (impl, src, dst, len); +-#else +- CALL (impl, dst, src, len); +-#endif +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -135,14 +113,8 @@ + for (i = 0, j = 1; i < len; i++, j += 23) + s1[i] = j; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s2, (char *) (buf2 + align1), s1, len); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-memset.c glibc-2.17-c758a686/string/test-memset.c +--- glibc-2.17-c758a686/string/test-memset.c 2015-06-20 23:38:08.186095846 -0400 ++++ glibc-2.17-c758a686/string/test-memset.c 2015-06-20 23:36:49.737443154 -0400 +@@ -92,29 +92,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +-#ifdef TEST_BZERO +- CALL (impl, s, n); +-#else +- CALL (impl, s, c, n); +-#endif +- +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -124,14 +101,8 @@ + if (align + len > page_size) + return; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd, c %2d:", len, align, c); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, (char *) buf1 + align, c, len); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + #ifndef TEST_BZERO +diff -urN glibc-2.17-c758a686/string/test-rawmemchr.c glibc-2.17-c758a686/string/test-rawmemchr.c +--- glibc-2.17-c758a686/string/test-rawmemchr.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-rawmemchr.c 2015-06-20 23:36:49.737443154 -0400 +@@ -49,24 +49,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s, c); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -93,14 +75,8 @@ + buf1[align + len] = -seek_char; + result = (char *) (buf1 + align + pos); + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd:", pos, align); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, (char *) (buf1 + align), seek_char, result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strcasecmp.c glibc-2.17-c758a686/string/test-strcasecmp.c +--- glibc-2.17-c758a686/string/test-strcasecmp.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strcasecmp.c 2015-06-20 23:36:49.737443154 -0400 +@@ -73,24 +73,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s1, s2); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -129,14 +111,8 @@ + else + s2[len - 1] -= exp_result; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, exp_result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strcasestr.c glibc-2.17-c758a686/string/test-strcasestr.c +--- glibc-2.17-c758a686/string/test-strcasestr.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strcasestr.c 2015-06-20 23:36:49.737443154 -0400 +@@ -78,24 +78,6 @@ + { + if (check_result (impl, s1, s2, exp_result) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~(hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s1, s2); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + +@@ -135,15 +117,8 @@ + } + s1[len1] = '\0'; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", +- len1, len2, align1, align2, fail ? "fail" : "found"); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strcat.c glibc-2.17-c758a686/string/test-strcat.c +--- glibc-2.17-c758a686/string/test-strcat.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strcat.c 2015-06-20 23:36:49.737443154 -0400 +@@ -56,25 +56,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- dst[k] = '\0'; +- HP_TIMING_NOW (start); +- CALL (impl, dst, src); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -101,17 +82,11 @@ + for (i = 0; i < len2; i++) + s2[i] = 32 + 23 * i % (max_char - 32); + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd/%4zd, alignment %2zd/%2zd:", len1, len2, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + { + s2[len2] = '\0'; + do_one_test (impl, s2, s1); + } +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strchr.c glibc-2.17-c758a686/string/test-strchr.c +--- glibc-2.17-c758a686/string/test-strchr.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strchr.c 2015-06-20 23:36:49.737443154 -0400 +@@ -107,24 +107,6 @@ + { + if (check_result (impl, s, c, exp_res) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s, c); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -160,15 +142,8 @@ + else + result = NULLRET (buf + align + len); + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment in bytes %2zd:", +- pos, align * sizeof (CHAR)); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, buf + align, seek_char, result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strcmp.c glibc-2.17-c758a686/string/test-strcmp.c +--- glibc-2.17-c758a686/string/test-strcmp.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strcmp.c 2015-06-20 23:36:49.737443154 -0400 +@@ -161,24 +161,6 @@ + { + if (check_result (impl, s1, s2, exp_result) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s1, s2); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -214,14 +196,8 @@ + s2[len + 1] = 24 + exp_result; + s2[len - 1] -= exp_result; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, exp_result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strcpy.c glibc-2.17-c758a686/string/test-strcpy.c +--- glibc-2.17-c758a686/string/test-strcpy.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strcpy.c 2015-06-20 23:36:49.737443154 -0400 +@@ -92,24 +92,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused));; +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, dst, src); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -135,14 +117,8 @@ + s1[i] = 32 + 23 * i % (max_char - 32); + s1[len] = 0; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignments in bytes %2zd/%2zd:", len, align1 * sizeof(CHAR), align2 * sizeof(CHAR)); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s2, s1, len); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-string.h glibc-2.17-c758a686/string/test-string.h +--- glibc-2.17-c758a686/string/test-string.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-string.h 2015-06-20 21:48:02.050511490 -0400 +@@ -1,5 +1,5 @@ + /* Test and measure string and memory 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 <jakub@redhat.com>, 1999. + +@@ -53,7 +53,6 @@ + #include <ifunc-impl-list.h> + #define GL(x) _##x + #define GLRO(x) _##x +-#include <hp-timing.h> + + + # define TEST_FUNCTION test_main () +@@ -67,8 +66,6 @@ + unsigned int seed; + size_t page_size; + +-hp_timing_t _dl_hp_timing_overhead; +- + # ifndef ITERATIONS + size_t iterations = 100000; + # define ITERATIONS_OPTIONS \ +@@ -107,7 +104,7 @@ + #define CALL(impl, ...) \ + (* (proto_t) (impl)->fn) (__VA_ARGS__) + +-#if defined TEST_IFUNC && defined TEST_NAME ++#ifdef TEST_NAME + /* Increase size of FUNC_LIST if assert is triggered at run-time. */ + static struct libc_ifunc_impl func_list[32]; + static int func_count; +@@ -159,16 +156,6 @@ + if (!notall || impl->test) + #endif + +-#define HP_TIMING_BEST(best_time, start, end) \ +- do \ +- { \ +- hp_timing_t tmptime; \ +- HP_TIMING_DIFF (tmptime, start + _dl_hp_timing_overhead, end); \ +- if (best_time > tmptime) \ +- best_time = tmptime; \ +- } \ +- while (0) +- + #ifndef BUF1PAGES + # define BUF1PAGES 1 + #endif +@@ -176,7 +163,7 @@ + static void + test_init (void) + { +-#if defined TEST_IFUNC && defined TEST_NAME ++#ifdef TEST_NAME + func_count = __libc_ifunc_impl_list (TEST_NAME, func_list, + (sizeof func_list + / sizeof func_list[0])); +@@ -199,7 +186,6 @@ + error (EXIT_FAILURE, errno, "mmap failed"); + if (mprotect (buf2 + page_size, page_size, PROT_NONE)) + error (EXIT_FAILURE, errno, "mprotect failed"); +- HP_TIMING_DIFF_INIT (); + if (do_srandom) + { + printf ("Setting seed to 0x%x\n", seed); +diff -urN glibc-2.17-c758a686/string/test-strlen.c glibc-2.17-c758a686/string/test-strlen.c +--- glibc-2.17-c758a686/string/test-strlen.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strlen.c 2015-06-20 23:36:59.693145264 -0400 +@@ -72,24 +72,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -107,14 +89,8 @@ + buf[align + i] = 1 + 11111 * i % MAX_CHAR; + buf[align + len] = 0; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd:", len, align); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, (CHAR *) (buf + align), len); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strncasecmp.c glibc-2.17-c758a686/string/test-strncasecmp.c +--- glibc-2.17-c758a686/string/test-strncasecmp.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strncasecmp.c 2015-06-20 23:36:59.694145234 -0400 +@@ -94,24 +94,6 @@ + { + if (check_result (impl, s1, s2, n, exp_result) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s1, s2, n); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -150,14 +132,8 @@ + else + s2[len - 1] -= exp_result; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, n, exp_result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strncat.c glibc-2.17-c758a686/string/test-strncat.c +--- glibc-2.17-c758a686/string/test-strncat.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strncat.c 2015-06-20 23:36:59.694145234 -0400 +@@ -67,24 +67,6 @@ + ret = 1; + return; + } +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- dst[k] = '\0'; +- HP_TIMING_NOW (start); +- CALL (impl, dst, src, n); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -114,18 +96,11 @@ + for (i = 0; i < len2; i++) + s2[i] = 32 + 23 * i % (max_char - 32); + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd/%4zd, alignment %2zd/%2zd, N %4zd:", +- len1, len2, align1, align2, n); +- + FOR_EACH_IMPL (impl, 0) + { + s2[len2] = '\0'; + do_one_test (impl, s2, s1, n); + } +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strncmp.c glibc-2.17-c758a686/string/test-strncmp.c +--- glibc-2.17-c758a686/string/test-strncmp.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strncmp.c 2015-06-20 23:36:59.694145234 -0400 +@@ -75,24 +75,6 @@ + { + if (check_result (impl, s1, s2, n, exp_result) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s1, s2, n); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -106,15 +88,10 @@ + { + s1 = (char*)(buf1 + page_size); + s2 = (char*)(buf2 + page_size); +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd/%4zd:", len, n); + + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, n, 0); + +- if (HP_TIMING_AVAIL) +- putchar ('\n'); +- + return; + } + +@@ -144,14 +121,8 @@ + s1[len] = 64; + } + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd/%4zd, alignment %2zd/%2zd:", len, n, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, n, exp_result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +@@ -189,14 +160,8 @@ + if (len >= n) + s2[n - 1] -= exp_result; + +- if (HP_TIMING_AVAIL) +- 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); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strncpy.c glibc-2.17-c758a686/string/test-strncpy.c +--- glibc-2.17-c758a686/string/test-strncpy.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strncpy.c 2015-06-20 23:36:59.695145204 -0400 +@@ -90,24 +90,6 @@ + return; + } + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute__ ((unused)); +- hp_timing_t stop __attribute__ ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, dst, src, n); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -133,14 +115,8 @@ + for (i = len + 1; i + align1 < page_size && i < len + 64; ++i) + s1[i] = 32 + 32 * i % (max_char - 32); + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, n %4zd, alignment %2zd/%2zd:", len, n, align1, align2); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s2, s1, len, n); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strnlen.c glibc-2.17-c758a686/string/test-strnlen.c +--- glibc-2.17-c758a686/string/test-strnlen.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strnlen.c 2015-06-20 23:36:59.695145204 -0400 +@@ -47,24 +47,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s, maxlen); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -80,14 +62,8 @@ + buf1[align + i] = 1 + 7 * i % max_char; + buf1[align + len] = 0; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd:", len, align); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, (char *) (buf1 + align), maxlen, MIN (len, maxlen)); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strpbrk.c glibc-2.17-c758a686/string/test-strpbrk.c +--- glibc-2.17-c758a686/string/test-strpbrk.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strpbrk.c 2015-06-20 23:36:59.695145204 -0400 +@@ -70,24 +70,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s, rej); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -137,14 +119,8 @@ + } + result = STRPBRK_RESULT (s, pos); + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd, rej len %2zd:", pos, align, len); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s, rej, result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strrchr.c glibc-2.17-c758a686/string/test-strrchr.c +--- glibc-2.17-c758a686/string/test-strrchr.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strrchr.c 2015-06-20 23:36:59.695145204 -0400 +@@ -73,24 +73,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s, c); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -129,14 +111,8 @@ + else + result = NULL; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment in bytes %2zd:", pos, align * sizeof(CHAR)); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, (CHAR *) (buf + align), seek_char, result); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strspn.c glibc-2.17-c758a686/string/test-strspn.c +--- glibc-2.17-c758a686/string/test-strspn.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strspn.c 2015-06-20 23:36:59.696145174 -0400 +@@ -74,24 +74,6 @@ + ret = 1; + return; + } +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~ (hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s, acc); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + static void +@@ -129,14 +111,8 @@ + s[i] = '\0'; + } + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd, alignment %2zd, acc len %2zd:", pos, align, len); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s, acc, pos); +- +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/string/test-strstr.c glibc-2.17-c758a686/string/test-strstr.c +--- glibc-2.17-c758a686/string/test-strstr.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/string/test-strstr.c 2015-06-20 23:36:59.696145174 -0400 +@@ -77,24 +77,6 @@ + { + if (check_result (impl, s1, s2, exp_result) < 0) + return; +- +- if (HP_TIMING_AVAIL) +- { +- hp_timing_t start __attribute ((unused)); +- hp_timing_t stop __attribute ((unused)); +- hp_timing_t best_time = ~(hp_timing_t) 0; +- size_t i; +- +- for (i = 0; i < 32; ++i) +- { +- HP_TIMING_NOW (start); +- CALL (impl, s1, s2); +- HP_TIMING_NOW (stop); +- HP_TIMING_BEST (best_time, start, stop); +- } +- +- printf ("\t%zd", (size_t) best_time); +- } + } + + +@@ -133,15 +115,9 @@ + } + s1[len1] = '\0'; + +- if (HP_TIMING_AVAIL) +- printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", +- len1, len2, align1, align2, fail ? "fail" : "found"); +- + FOR_EACH_IMPL (impl, 0) + do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); + +- if (HP_TIMING_AVAIL) +- putchar ('\n'); + } + + static void +diff -urN glibc-2.17-c758a686/sysdeps/generic/hp-timing-common.h glibc-2.17-c758a686/sysdeps/generic/hp-timing-common.h +--- glibc-2.17-c758a686/sysdeps/generic/hp-timing-common.h 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/generic/hp-timing-common.h 2015-06-20 21:34:49.496580235 -0400 +@@ -0,0 +1,62 @@ ++/* High precision, low overhead timing functions. Generic version. ++ Copyright (C) 1998-2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++/* In case a platform supports timers in the hardware the following macros ++ and types must be defined: ++ ++ - HP_TIMING_AVAIL: test for availability. ++ ++ - HP_TIMING_INLINE: this macro is non-zero if the functionality is not ++ implemented using function calls but instead uses some inlined code ++ which might simply consist of a few assembler instructions. We have to ++ know this since we might want to use the macros here in places where we ++ cannot make function calls. ++ ++ - hp_timing_t: This is the type for variables used to store the time ++ values. This type must be integral. ++ ++ - HP_TIMING_NOW: place timestamp for current time in variable given as ++ parameter. ++*/ ++ ++/* The target supports hp-timing. Share the common infrastructure. */ ++ ++#include <string.h> ++#include <sys/param.h> ++#include <_itoa.h> ++ ++/* Compute the difference between START and END, storing into DIFF. */ ++#define HP_TIMING_DIFF(Diff, Start, End) ((Diff) = (End) - (Start)) ++ ++/* Accumulate ADD into SUM. No attempt is made to be thread-safe. */ ++#define HP_TIMING_ACCUM_NT(Sum, Diff) ((Sum) += (Diff)) ++ ++/* Write a decimal representation of the timing value into the given string. */ ++#define HP_TIMING_PRINT(Dest, Len, Val) \ ++ do { \ ++ char __buf[20]; \ ++ char *__dest = (Dest); \ ++ size_t __len = (Len); \ ++ char *__cp = _itoa ((Val), __buf + sizeof (__buf), 10, 0); \ ++ size_t __cp_len = MIN (__buf + sizeof (__buf) - __cp, __len); \ ++ memcpy (__dest, __cp, __cp_len); \ ++ memcpy (__dest + __cp_len, " cycles", \ ++ MIN (__len - __cp_len, sizeof (" cycles"))); \ ++ __dest[__len - 1] = '\0'; \ ++ } while (0) +diff -urN glibc-2.17-c758a686/sysdeps/generic/hp-timing.h glibc-2.17-c758a686/sysdeps/generic/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/generic/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/generic/hp-timing.h 2015-06-20 21:36:22.190764717 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. Generic version. +- Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1998-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + +@@ -20,59 +20,17 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +- + /* There are no generic definitions for the times. We could write something + using the `gettimeofday' system call where available but the overhead of +- the system call might be too high. +- +- In case a platform supports timers in the hardware the following macros +- and types must be defined: +- +- - HP_TIMING_AVAIL: test for availability. +- +- - HP_TIMING_INLINE: this macro is non-zero if the functionality is not +- implemented using function calls but instead uses some inlined code +- which might simply consist of a few assembler instructions. We have to +- know this since we might want to use the macros here in places where we +- cannot make function calls. +- +- - hp_timing_t: This is the type for variables used to store the time +- values. +- +- - HP_TIMING_ZERO: clear `hp_timing_t' object. +- +- - HP_TIMING_NOW: place timestamp for current time in variable given as +- parameter. +- +- - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the +- HP_TIMING_DIFF macro. +- +- - HP_TIMING_DIFF: compute difference between two times and store it +- in a third. Source and destination might overlap. +- +- - HP_TIMING_ACCUM: add time difference to another variable. This might +- be a bit more complicated to implement for some platforms as the +- operation should be thread-safe and 64bit arithmetic on 32bit platforms +- is not. +- +- - HP_TIMING_ACCUM_NT: this is the variant for situations where we know +- there are no threads involved. +- +- - HP_TIMING_PRINT: write decimal representation of the timing value into +- the given string. This operation need not be inline even though +- HP_TIMING_INLINE is specified. +- +-*/ ++ the system call might be too high. */ + + /* Provide dummy definitions. */ + #define HP_TIMING_AVAIL (0) ++#define HP_SMALL_TIMING_AVAIL (0) + #define HP_TIMING_INLINE (0) + typedef int hp_timing_t; +-#define HP_TIMING_ZERO(Var) + #define HP_TIMING_NOW(var) +-#define HP_TIMING_DIFF_INIT() + #define HP_TIMING_DIFF(Diff, Start, End) +-#define HP_TIMING_ACCUM(Sum, Diff) + #define HP_TIMING_ACCUM_NT(Sum, Diff) + #define HP_TIMING_PRINT(Buf, Len, Val) + +diff -urN glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h +--- glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h 2015-06-20 23:38:08.609083190 -0400 ++++ glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h 2015-06-20 22:07:15.207493957 -0400 +@@ -315,7 +315,7 @@ + /* The object to be initialized first. */ + EXTERN struct link_map *_dl_initfirst; + +-#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL ++#if HP_SMALL_TIMING_AVAIL + /* Start time on CPU clock. */ + EXTERN hp_timing_t _dl_cpuclock_offset; + #endif +@@ -538,11 +538,6 @@ + /* All search directories defined at startup. */ + EXTERN struct r_search_path_elem *_dl_init_all_dirs; + +-#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL +- /* Overhead of a high-precision timing measurement. */ +- EXTERN hp_timing_t _dl_hp_timing_overhead; +-#endif +- + #ifdef NEED_DL_SYSINFO + /* Syscall handling improvements. This is very specific to x86. */ + EXTERN uintptr_t _dl_sysinfo; +diff -urN glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.c glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.c +--- glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,23 +0,0 @@ +-/* Support for high precision, low overhead timing functions. i686 version. +- Copyright (C) 1998, 2002 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- <http://www.gnu.org/licenses/>. */ +- +-#include <hp-timing.h> +- +-/* We have to define the variable for the overhead. */ +-hp_timing_t _dl_hp_timing_overhead; +diff -urN glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.h glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/i386/i686/hp-timing.h 2015-06-20 23:03:58.919192570 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. i686 version. +- Copyright (C) 1998, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++ Copyright (C) 1998-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + +@@ -20,62 +20,9 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +-#include <string.h> +-#include <sys/param.h> +-#include <_itoa.h> +- +-/* The macros defined here use the timestamp counter in i586 and up versions +- of the x86 processors. They provide a very accurate way to measure the +- time with very little overhead. The time values themself have no real +- meaning, only differences are interesting. +- +- This version is for the i686 processors. The difference to the i586 +- version is that the timerstamp register is unconditionally used. This is +- not the case for the i586 version where we have to perform runtime test +- whether the processor really has this capability. We have to make this +- distinction since the sysdeps/i386/i586 code is supposed to work on all +- platforms while the i686 already contains i686-specific code. +- +- The list of macros we need includes the following: +- +- - HP_TIMING_AVAIL: test for availability. +- +- - HP_TIMING_INLINE: this macro is non-zero if the functionality is not +- implemented using function calls but instead uses some inlined code +- which might simply consist of a few assembler instructions. We have to +- know this since we might want to use the macros here in places where we +- cannot make function calls. +- +- - hp_timing_t: This is the type for variables used to store the time +- values. +- +- - HP_TIMING_ZERO: clear `hp_timing_t' object. +- +- - HP_TIMING_NOW: place timestamp for current time in variable given as +- parameter. +- +- - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the +- HP_TIMING_DIFF macro. +- +- - HP_TIMING_DIFF: compute difference between two times and store it +- in a third. Source and destination might overlap. +- +- - HP_TIMING_ACCUM: add time difference to another variable. This might +- be a bit more complicated to implement for some platforms as the +- operation should be thread-safe and 64bit arithmetic on 32bit platforms +- is not. +- +- - HP_TIMING_ACCUM_NT: this is the variant for situations where we know +- there are no threads involved. +- +- - HP_TIMING_PRINT: write decimal representation of the timing value into +- the given string. This operation need not be inline even though +- HP_TIMING_INLINE is specified. +- +-*/ +- + /* We always assume having the timestamp register. */ + #define HP_TIMING_AVAIL (1) ++#define HP_SMALL_TIMING_AVAIL (1) + + /* We indeed have inlined functions. */ + #define HP_TIMING_INLINE (1) +@@ -83,9 +30,6 @@ + /* We use 64bit values for the times. */ + typedef unsigned long long int hp_timing_t; + +-/* Set timestamp value to zero. */ +-#define HP_TIMING_ZERO(Var) (Var) = (0) +- + /* That's quite simple. Use the `rdtsc' instruction. Note that the value + might not be 100% accurate since there might be some more instructions + running in this moment. This could be changed by using a barrier like +@@ -93,64 +37,6 @@ + in accurate clock cycles here so we don't do this. */ + #define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rdtsc" : "=A" (Var)) + +-/* Use two 'rdtsc' instructions in a row to find out how long it takes. */ +-#define HP_TIMING_DIFF_INIT() \ +- do { \ +- if (GLRO(dl_hp_timing_overhead) == 0) \ +- { \ +- int __cnt = 5; \ +- GLRO(dl_hp_timing_overhead) = ~0ull; \ +- do \ +- { \ +- hp_timing_t __t1, __t2; \ +- HP_TIMING_NOW (__t1); \ +- HP_TIMING_NOW (__t2); \ +- if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \ +- GLRO(dl_hp_timing_overhead) = __t2 - __t1; \ +- } \ +- while (--__cnt > 0); \ +- } \ +- } while (0) +- +-/* It's simple arithmetic for us. */ +-#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) +- +-/* We have to jump through hoops to get this correctly implemented. */ +-#define HP_TIMING_ACCUM(Sum, Diff) \ +- do { \ +- int __not_done; \ +- hp_timing_t __oldval = (Sum); \ +- hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ +- do \ +- { \ +- hp_timing_t __newval = __oldval + __diff; \ +- int __temp0, __temp1; \ +- __asm__ __volatile__ ("xchgl %0, %%ebx\n\t" \ +- "lock; cmpxchg8b %1\n\t" \ +- "sete %%bl\n\t" \ +- "xchgl %0, %%ebx" \ +- : "=SD" (__not_done), "=m" (Sum), \ +- "=A" (__oldval), "=c" (__temp0) \ +- : "m" (Sum), "2" (__oldval), \ +- "3" ((unsigned int) (__newval >> 32)), \ +- "0" ((unsigned int) __newval)); \ +- } \ +- while ((unsigned char) __not_done); \ +- } while (0) +- +-/* No threads, no extra work. */ +-#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) +- +-/* Print the time value. */ +-#define HP_TIMING_PRINT(Buf, Len, Val) \ +- do { \ +- char __buf[20]; \ +- char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \ +- size_t __len = (Len); \ +- char *__dest = (Buf); \ +- while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ +- *__dest++ = *__cp++; \ +- memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/sysdeps/i386/i686/Makefile glibc-2.17-c758a686/sysdeps/i386/i686/Makefile +--- glibc-2.17-c758a686/sysdeps/i386/i686/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/i386/i686/Makefile 2015-06-20 21:22:16.306457831 -0400 +@@ -1,8 +1,3 @@ +-ifeq ($(subdir),csu) +-sysdep_routines += hp-timing +-elide-routines.os += hp-timing +-endif +- + # So that we can test __m128's alignment + stack-align-test-flags += -msse + +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/hp-timing.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/hp-timing.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,81 +0,0 @@ +-/* High precision, low overhead timing functions. Linux/PPC32 version. +- Copyright (C) 2005 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- <http://www.gnu.org/licenses/>. */ +- +-#ifndef _HP_TIMING_H +-#define _HP_TIMING_H 1 +- +- +-/* There are no generic definitions for the times. We could write something +- using the `gettimeofday' system call where available but the overhead of +- the system call might be too high. +- +- In case a platform supports timers in the hardware the following macros +- and types must be defined: +- +- - HP_TIMING_AVAIL: test for availability. +- +- - HP_TIMING_INLINE: this macro is non-zero if the functionality is not +- implemented using function calls but instead uses some inlined code +- which might simply consist of a few assembler instructions. We have to +- know this since we might want to use the macros here in places where we +- cannot make function calls. +- +- - hp_timing_t: This is the type for variables used to store the time +- values. +- +- - HP_TIMING_ZERO: clear `hp_timing_t' object. +- +- - HP_TIMING_NOW: place timestamp for current time in variable given as +- parameter. +- +- - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the +- HP_TIMING_DIFF macro. +- +- - HP_TIMING_DIFF: compute difference between two times and store it +- in a third. Source and destination might overlap. +- +- - HP_TIMING_ACCUM: add time difference to another variable. This might +- be a bit more complicated to implement for some platforms as the +- operation should be thread-safe and 64bit arithmetic on 32bit platforms +- is not. +- +- - HP_TIMING_ACCUM_NT: this is the variant for situations where we know +- there are no threads involved. +- +- - HP_TIMING_PRINT: write decimal representation of the timing value into +- the given string. This operation need not be inline even though +- HP_TIMING_INLINE is specified. +- +-*/ +- +-/* Provide dummy definitions. */ +-#define HP_TIMING_AVAIL (0) +-#define HP_TIMING_INLINE (0) +-typedef unsigned long long int hp_timing_t; +-#define HP_TIMING_ZERO(Var) +-#define HP_TIMING_NOW(var) +-#define HP_TIMING_DIFF_INIT() +-#define HP_TIMING_DIFF(Diff, Start, End) +-#define HP_TIMING_ACCUM(Sum, Diff) +-#define HP_TIMING_ACCUM_NT(Sum, Diff) +-#define HP_TIMING_PRINT(Buf, Len, Val) +- +-/* Since this implementation is not available we tell the user about it. */ +-#define HP_TIMING_NONAVAIL 1 +- +-#endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.c glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.c +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,24 +0,0 @@ +-/* Support for high precision, low overhead timing functions. +- powerpc64 version. +- Copyright (C) 2005, 2008 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- <http://www.gnu.org/licenses/>. */ +- +-#include <hp-timing.h> +- +-/* We have to define the variable for the overhead. */ +-hp_timing_t _dl_hp_timing_overhead; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h 2015-06-20 23:38:08.326091657 -0400 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/power4/hp-timing.h 2015-06-20 21:38:56.874066681 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. powerpc64 version. +- Copyright (C) 2005, 2008 Free Software Foundation, Inc. ++ Copyright (C) 2005-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + +@@ -20,55 +20,9 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +-#include <string.h> +-#include <sys/param.h> +-#include <_itoa.h> +-#include <atomic.h> +- +-/* The macros defined here use the powerpc 64-bit time base register. +- The time base is nominally clocked at 1/8th the CPU clock, but this +- can vary. +- +- The list of macros we need includes the following: +- +- - HP_TIMING_AVAIL: test for availability. +- +- - HP_TIMING_INLINE: this macro is non-zero if the functionality is not +- implemented using function calls but instead uses some inlined code +- which might simply consist of a few assembler instructions. We have to +- know this since we might want to use the macros here in places where we +- cannot make function calls. +- +- - hp_timing_t: This is the type for variables used to store the time +- values. +- +- - HP_TIMING_ZERO: clear `hp_timing_t' object. +- +- - HP_TIMING_NOW: place timestamp for current time in variable given as +- parameter. +- +- - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the +- HP_TIMING_DIFF macro. +- +- - HP_TIMING_DIFF: compute difference between two times and store it +- in a third. Source and destination might overlap. +- +- - HP_TIMING_ACCUM: add time difference to another variable. This might +- be a bit more complicated to implement for some platforms as the +- operation should be thread-safe and 64bit arithmetic on 32bit platforms +- is not. +- +- - HP_TIMING_ACCUM_NT: this is the variant for situations where we know +- there are no threads involved. +- +- - HP_TIMING_PRINT: write decimal representation of the timing value into +- the given string. This operation need not be inline even though +- HP_TIMING_INLINE is specified. +- +-*/ +- + /* We always assume having the timestamp register. */ + #define HP_TIMING_AVAIL (1) ++#define HP_SMALL_TIMING_AVAIL (1) + + /* We indeed have inlined functions. */ + #define HP_TIMING_INLINE (1) +@@ -76,13 +30,10 @@ + /* We use 64bit values for the times. */ + typedef unsigned long long int hp_timing_t; + +-/* Set timestamp value to zero. */ +-#define HP_TIMING_ZERO(Var) (Var) = (0) +- + /* That's quite simple. Use the `mftb' instruction. Note that the value + might not be 100% accurate since there might be some more instructions + running in this moment. This could be changed by using a barrier like +- 'lwsync' right before the `mftb' instruciton. But we are not interested ++ 'lwsync' right before the `mftb' instruction. But we are not interested + in accurate clock cycles here so we don't do this. */ + + #define HP_TIMING_NOW(Var) \ +@@ -98,51 +49,6 @@ + Var = ((hp_timing_t) hi << 32) | lo; \ + } while (0) + +- +-/* Use two 'mftb' instructions in a row to find out how long it takes. +- On current POWER4, POWER5, and 970 processors mftb take ~10 cycles. */ +-#define HP_TIMING_DIFF_INIT() \ +- do { \ +- if (GLRO(dl_hp_timing_overhead) == 0) \ +- { \ +- int __cnt = 5; \ +- GLRO(dl_hp_timing_overhead) = ~0ull; \ +- do \ +- { \ +- hp_timing_t __t1, __t2; \ +- HP_TIMING_NOW (__t1); \ +- HP_TIMING_NOW (__t2); \ +- if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \ +- GLRO(dl_hp_timing_overhead) = __t2 - __t1; \ +- } \ +- while (--__cnt > 0); \ +- } \ +- } while (0) +- +-/* It's simple arithmetic in 64-bit. */ +-#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) +- +-/* We need to insure that this add is atomic in threaded environments. We use +- __arch_atomic_exchange_and_add_64 from atomic.h to get thread safety. */ +-#define HP_TIMING_ACCUM(Sum, Diff) \ +- do { \ +- hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ +- __arch_atomic_exchange_and_add_64 (&(Sum), __diff); \ +- } while (0) +- +-/* No threads, no extra work. */ +-#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) +- +-/* Print the time value. */ +-#define HP_TIMING_PRINT(Buf, Len, Val) \ +- do { \ +- char __buf[20]; \ +- char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \ +- size_t __len = (Len); \ +- char *__dest = (Buf); \ +- while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ +- *__dest++ = *__cp++; \ +- memcpy (__dest, " ticks", MIN (__len, sizeof (" ticks"))); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.c glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.c +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,24 +0,0 @@ +-/* Support for high precision, low overhead timing functions. +- powerpc64 version. +- Copyright (C) 2005 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- <http://www.gnu.org/licenses/>. */ +- +-#include <hp-timing.h> +- +-/* We have to define the variable for the overhead. */ +-hp_timing_t _dl_hp_timing_overhead; +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/hp-timing.h 2015-06-20 21:42:32.315524442 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. powerpc64 version. +- Copyright (C) 2005, 2008 Free Software Foundation, Inc. ++ Copyright (C) 2005-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + +@@ -20,55 +20,9 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +-#include <string.h> +-#include <sys/param.h> +-#include <_itoa.h> +-#include <atomic.h> +- +-/* The macros defined here use the powerpc 64-bit time base register. +- The time base is nominally clocked at 1/8th the CPU clock, but this +- can vary. +- +- The list of macros we need includes the following: +- +- - HP_TIMING_AVAIL: test for availability. +- +- - HP_TIMING_INLINE: this macro is non-zero if the functionality is not +- implemented using function calls but instead uses some inlined code +- which might simply consist of a few assembler instructions. We have to +- know this since we might want to use the macros here in places where we +- cannot make function calls. +- +- - hp_timing_t: This is the type for variables used to store the time +- values. +- +- - HP_TIMING_ZERO: clear `hp_timing_t' object. +- +- - HP_TIMING_NOW: place timestamp for current time in variable given as +- parameter. +- +- - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the +- HP_TIMING_DIFF macro. +- +- - HP_TIMING_DIFF: compute difference between two times and store it +- in a third. Source and destination might overlap. +- +- - HP_TIMING_ACCUM: add time difference to another variable. This might +- be a bit more complicated to implement for some platforms as the +- operation should be thread-safe and 64bit arithmetic on 32bit platforms +- is not. +- +- - HP_TIMING_ACCUM_NT: this is the variant for situations where we know +- there are no threads involved. +- +- - HP_TIMING_PRINT: write decimal representation of the timing value into +- the given string. This operation need not be inline even though +- HP_TIMING_INLINE is specified. +- +-*/ +- + /* We always assume having the timestamp register. */ + #define HP_TIMING_AVAIL (1) ++#define HP_SMALL_TIMING_AVAIL (1) + + /* We indeed have inlined functions. */ + #define HP_TIMING_INLINE (1) +@@ -76,13 +30,10 @@ + /* We use 64bit values for the times. */ + typedef unsigned long long int hp_timing_t; + +-/* Set timestamp value to zero. */ +-#define HP_TIMING_ZERO(Var) (Var) = (0) +- + /* That's quite simple. Use the `mftb' instruction. Note that the value + might not be 100% accurate since there might be some more instructions + running in this moment. This could be changed by using a barrier like +- 'lwsync' right before the `mftb' instruciton. But we are not interested ++ 'lwsync' right before the `mftb' instruction. But we are not interested + in accurate clock cycles here so we don't do this. */ + #ifdef _ARCH_PWR4 + #define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mfspr %0,268" : "=r" (Var)) +@@ -90,50 +41,6 @@ + #define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mftb %0" : "=r" (Var)) + #endif + +-/* Use two 'mftb' instructions in a row to find out how long it takes. +- On current POWER4, POWER5, and 970 processors mftb take ~10 cycles. */ +-#define HP_TIMING_DIFF_INIT() \ +- do { \ +- if (GLRO(dl_hp_timing_overhead) == 0) \ +- { \ +- int __cnt = 5; \ +- GLRO(dl_hp_timing_overhead) = ~0ull; \ +- do \ +- { \ +- hp_timing_t __t1, __t2; \ +- HP_TIMING_NOW (__t1); \ +- HP_TIMING_NOW (__t2); \ +- if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \ +- GLRO(dl_hp_timing_overhead) = __t2 - __t1; \ +- } \ +- while (--__cnt > 0); \ +- } \ +- } while (0) +- +-/* It's simple arithmetic in 64-bit. */ +-#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) +- +-/* We need to insure that this add is atomic in threaded environments. We use +- __arch_atomic_exchange_and_add_64 from atomic.h to get thread safety. */ +-#define HP_TIMING_ACCUM(Sum, Diff) \ +- do { \ +- hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ +- __arch_atomic_exchange_and_add_64 (&(Sum), __diff); \ +- } while (0) +- +-/* No threads, no extra work. */ +-#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) +- +-/* Print the time value. */ +-#define HP_TIMING_PRINT(Buf, Len, Val) \ +- do { \ +- char __buf[20]; \ +- char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \ +- size_t __len = (Len); \ +- char *__dest = (Buf); \ +- while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ +- *__dest++ = *__cp++; \ +- memcpy (__dest, " ticks", MIN (__len, sizeof (" ticks"))); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile 2015-06-20 23:38:08.082098958 -0400 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/Makefile 2015-06-20 21:22:16.306457831 -0400 +@@ -37,11 +37,6 @@ + + CFLAGS-libc-start.c += -fno-asynchronous-unwind-tables + +-ifeq ($(subdir),csu) +-sysdep_routines += hp-timing +-elide-routines.os += hp-timing +-endif +- + ifeq ($(subdir),elf) + # help gcc inline asm code from dl-machine.h + +cflags += -finline-limit=2000 +diff -urN glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.c glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.c +--- glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,23 +0,0 @@ +-/* Support for high precision, low overhead timing functions. sparcv9 version. +- Copyright (C) 2001, 2002 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by David S. Miller <davem@redhat.com>, 2001. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- <http://www.gnu.org/licenses/>. */ +- +-#include <hp-timing.h> +- +-/* We have to define the variable for the overhead. */ +-hp_timing_t _dl_hp_timing_overhead; +diff -urN glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.h glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/hp-timing.h 2015-06-20 21:43:48.754203254 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. sparcv9 version. +- Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++ Copyright (C) 2001-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David S. Miller <davem@redhat.com>, 2001. + +@@ -20,67 +20,17 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +-#include <string.h> +-#include <sys/param.h> +-#include <_itoa.h> +- + #define HP_TIMING_AVAIL (1) ++#define HP_SMALL_TIMING_AVAIL (1) + #define HP_TIMING_INLINE (1) + + typedef unsigned long long int hp_timing_t; + +-#define HP_TIMING_ZERO(Var) (Var) = (0) +- + #define HP_TIMING_NOW(Var) \ + __asm__ __volatile__ ("rd %%tick, %L0\n\t" \ + "srlx %L0, 32, %H0" \ + : "=r" (Var)) + +-#define HP_TIMING_DIFF_INIT() \ +- do { \ +- int __cnt = 5; \ +- GLRO(dl_hp_timing_overhead) = ~0ull; \ +- do \ +- { \ +- hp_timing_t __t1, __t2; \ +- HP_TIMING_NOW (__t1); \ +- HP_TIMING_NOW (__t2); \ +- if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \ +- GLRO(dl_hp_timing_overhead) = __t2 - __t1; \ +- } \ +- while (--__cnt > 0); \ +- } while (0) +- +-#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) +- +-#define HP_TIMING_ACCUM(Sum, Diff) \ +-do { \ +- hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ +- __asm__ __volatile__("srl %L0, 0, %%g1\n\t" \ +- "sllx %H0, 32, %%g6\n\t" \ +- "or %%g1, %%g6, %%g1\n\t" \ +- "1: ldx [%1], %%g5\n\t" \ +- "add %%g5, %%g1, %%g6\n\t" \ +- "casx [%1], %%g5, %%g6\n\t" \ +- "cmp %%g5, %%g6\n\t" \ +- "bne,pn %%xcc, 1b\n\t" \ +- " nop" \ +- : /* no outputs */ \ +- : "r" (__diff), "r" (&(Sum)) \ +- : "memory", "g1", "g5", "g6"); \ +-} while(0) +- +-#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) +- +-#define HP_TIMING_PRINT(Buf, Len, Val) \ +- do { \ +- char __buf[20]; \ +- char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \ +- int __len = (Len); \ +- char *__dest = (Buf); \ +- while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ +- *__dest++ = *__cp++; \ +- memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/Makefile +--- glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc32/sparcv9/Makefile 2015-06-20 21:22:16.307457801 -0400 +@@ -1,10 +1,5 @@ + sysdep-CFLAGS += -mcpu=ultrasparc -Wa,-Av9a + +-ifeq ($(subdir),csu) +-sysdep_routines += hp-timing +-elide-routines.os += hp-timing +-endif +- + ifeq ($(have-as-vis3),yes) + ASFLAGS-.o += -Wa,-Av9d + ASFLAGS-.os += -Wa,-Av9d +diff -urN glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.c glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.c +--- glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,23 +0,0 @@ +-/* Support for high precision, low overhead timing functions. sparc64 version. +- Copyright (C) 2001, 2002 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by David S. Miller <davem@redhat.com>, 2001. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- <http://www.gnu.org/licenses/>. */ +- +-#include <hp-timing.h> +- +-/* We have to define the variable for the overhead. */ +-hp_timing_t _dl_hp_timing_overhead; +diff -urN glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.h glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/hp-timing.h 2015-06-20 21:48:51.809000490 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. sparc64 version. +- Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++ Copyright (C) 2001-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David S. Miller <davem@redhat.com>, 2001. + +@@ -20,62 +20,14 @@ + #ifndef _HP_TIMING_H + #define _HP_TIMING_H 1 + +-#include <string.h> +-#include <sys/param.h> +-#include <_itoa.h> +- + #define HP_TIMING_AVAIL (1) ++#define HP_SMALL_TIMING_AVAIL (1) + #define HP_TIMING_INLINE (1) + + typedef unsigned long int hp_timing_t; + +-#define HP_TIMING_ZERO(Var) (Var) = (0) +- + #define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rd %%tick, %0" : "=r" (Var)) + +-#define HP_TIMING_DIFF_INIT() \ +- do { \ +- int __cnt = 5; \ +- GLRO(dl_hp_timing_overhead) = ~0ull; \ +- do \ +- { \ +- hp_timing_t __t1, __t2; \ +- HP_TIMING_NOW (__t1); \ +- HP_TIMING_NOW (__t2); \ +- if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \ +- GLRO(dl_hp_timing_overhead) = __t2 - __t1; \ +- } \ +- while (--__cnt > 0); \ +- } while (0) +- +-#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start)) +- +-#define HP_TIMING_ACCUM(Sum, Diff) \ +-do { \ +- hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ +- hp_timing_t tmp1, tmp2; \ +- __asm__ __volatile__("1: ldx [%3], %0\n\t" \ +- "add %0, %2, %1\n\t" \ +- "casx [%3], %0, %1\n\t" \ +- "cmp %0, %1\n\t" \ +- "bne,pn %%xcc, 1b\n\t" \ +- " nop" \ +- : "=&r" (tmp1), "=&r" (tmp2) \ +- : "r" (__diff), "r" (&(Sum)) \ +- : "memory", "g1", "g5", "g6"); \ +-} while(0) +- +-#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff) +- +-#define HP_TIMING_PRINT(Buf, Len, Val) \ +- do { \ +- char __buf[20]; \ +- char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \ +- int __len = (Len); \ +- char *__dest = (Buf); \ +- while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \ +- *__dest++ = *__cp++; \ +- memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/sysdeps/sparc/sparc64/Makefile glibc-2.17-c758a686/sysdeps/sparc/sparc64/Makefile +--- glibc-2.17-c758a686/sysdeps/sparc/sparc64/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/sparc/sparc64/Makefile 2015-06-20 21:22:16.307457801 -0400 +@@ -1,8 +1,3 @@ +-ifeq ($(subdir),csu) +-sysdep_routines += hp-timing +-elide-routines.os += hp-timing +-endif +- + ifeq ($(subdir),string) + sysdep_routines += align-cpy + endif +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.c glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.c +--- glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,2 +0,0 @@ +-/* We can use the i686 implementation without changes. */ +-#include <sysdeps/i386/i686/hp-timing.c> +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.h glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.h +--- glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/hp-timing.h 2015-06-20 21:43:09.403398207 -0400 +@@ -1,5 +1,5 @@ + /* High precision, low overhead timing functions. x86-64 version. +- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. ++ Copyright (C) 2002-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,24 +17,24 @@ + <http://www.gnu.org/licenses/>. */ + + #ifndef _HP_TIMING_H ++#define _HP_TIMING_H 1 + +-/* We can use some of the i686 implementation without changes. */ +-# include <sysdeps/i386/i686/hp-timing.h> ++/* We always assume having the timestamp register. */ ++#define HP_TIMING_AVAIL (1) ++#define HP_SMALL_TIMING_AVAIL (1) ++ ++/* We indeed have inlined functions. */ ++#define HP_TIMING_INLINE (1) ++ ++/* We use 64bit values for the times. */ ++typedef unsigned long long int hp_timing_t; + + /* The "=A" constraint used in 32-bit mode does not work in 64-bit mode. */ +-# undef HP_TIMING_NOW +-# define HP_TIMING_NOW(Var) \ ++#define HP_TIMING_NOW(Var) \ + ({ unsigned int _hi, _lo; \ + asm volatile ("rdtsc" : "=a" (_lo), "=d" (_hi)); \ + (Var) = ((unsigned long long int) _hi << 32) | _lo; }) + +-/* The funny business for 32-bit mode is not required here. */ +-# undef HP_TIMING_ACCUM +-# define HP_TIMING_ACCUM(Sum, Diff) \ +- do { \ +- hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \ +- __asm__ __volatile__ ("lock; addq %1, %0" \ +- : "=m" (Sum) : "r" (__diff), "m" (Sum)); \ +- } while (0) ++#include <hp-timing-common.h> + + #endif /* hp-timing.h */ +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/Makefile glibc-2.17-c758a686/sysdeps/x86_64/Makefile +--- glibc-2.17-c758a686/sysdeps/x86_64/Makefile 2015-06-20 23:38:08.530085553 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86_64/Makefile 2015-06-20 21:22:16.307457801 -0400 +@@ -2,8 +2,6 @@ + long-double-fcts = yes + + ifeq ($(subdir),csu) +-sysdep_routines += hp-timing +-elide-routines.os += hp-timing + gen-as-const-headers += link-defines.sym + endif + +diff -urN glibc-2.17-c758a686/test-skeleton.c glibc-2.17-c758a686/test-skeleton.c +--- glibc-2.17-c758a686/test-skeleton.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/test-skeleton.c 2015-06-20 21:22:16.307457801 -0400 +@@ -18,8 +18,10 @@ + <http://www.gnu.org/licenses/>. */ + + #include <errno.h> ++#include <fcntl.h> + #include <getopt.h> + #include <malloc.h> ++#include <paths.h> + #include <search.h> + #include <signal.h> + #include <stdio.h> +@@ -194,6 +196,32 @@ + exit (1); + } + ++/* Set fortification error handler. Used when tests want to verify that bad ++ code is caught by the library. */ ++static void ++__attribute__ ((unused)) ++set_fortify_handler (void (*handler) (int sig)) ++{ ++ struct sigaction sa; ++ ++ sa.sa_handler = handler; ++ sa.sa_flags = 0; ++ sigemptyset (&sa.sa_mask); ++ ++ sigaction (SIGABRT, &sa, NULL); ++ ++ /* Avoid all the buffer overflow messages on stderr. */ ++ 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); ++} ++ + /* We provide the entry point here. */ + int + main (int argc, char *argv[]) diff --git a/SOURCES/glibc-rh1085290.patch b/SOURCES/glibc-rh1085290.patch new file mode 100644 index 0000000..37f3c24 --- /dev/null +++ b/SOURCES/glibc-rh1085290.patch @@ -0,0 +1,60 @@ +commit dd3022d75e6fb8957843d6d84257a5d8457822d5 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Mar 27 19:49:51 2014 +0530 + + Return NULL for wildcard values in getnetgrent from nscd (BZ #16759) + + getnetgrent is supposed to return NULL for values that are wildcards + in the (host, user, domain) triplet. This works correctly with nscd + disabled, but with it enabled, it returns a blank ("") instead of a + NULL. This is easily seen with the output of `getent netgroup foonet` + for a netgroup foonet defined as follows in /etc/netgroup: + + foonet (,foo,) + + The output with nscd disabled is: + + foonet ( ,foo,) + + while with nscd enabled, it is: + + foonet (,foo,) + + The extra space with nscd disabled is due to the fact that `getent + netgroup` adds it if the return value from getnetgrent is NULL for + either host or user. + +diff --git glibc-2.17-c758a686/inet/getnetgrent_r.c glibc-2.17-c758a686/inet/getnetgrent_r.c +index 62cdfda..f6d064d 100644 +--- glibc-2.17-c758a686/inet/getnetgrent_r.c ++++ glibc-2.17-c758a686/inet/getnetgrent_r.c +@@ -235,6 +235,14 @@ endnetgrent (void) + __libc_lock_unlock (lock); + } + ++static const char * ++get_nonempty_val (const char *in) ++{ ++ if (*in == '\0') ++ return NULL; ++ return in; ++} ++ + #ifdef USE_NSCD + static enum nss_status + nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen, +@@ -243,11 +251,11 @@ nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen, + return NSS_STATUS_UNAVAIL; + + datap->type = triple_val; +- datap->val.triple.host = datap->cursor; ++ datap->val.triple.host = get_nonempty_val (datap->cursor); + datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1; +- datap->val.triple.user = datap->cursor; ++ datap->val.triple.user = get_nonempty_val (datap->cursor); + datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1; +- datap->val.triple.domain = datap->cursor; ++ datap->val.triple.domain = get_nonempty_val (datap->cursor); + datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1; + + return NSS_STATUS_SUCCESS; diff --git a/SOURCES/glibc-rh1085313.patch b/SOURCES/glibc-rh1085313.patch new file mode 100644 index 0000000..648130e --- /dev/null +++ b/SOURCES/glibc-rh1085313.patch @@ -0,0 +1,34 @@ +commit 58b930ae216bfa98cd60212b954b07b9963d6d04 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Sep 10 21:51:50 2014 +0530 + + Return failure in getnetgrent only when all netgroups have been searched (#17363) + + The netgroups lookup code fails when one of the groups in the search + tree is empty. In such a case it only returns the leaves of the tree + after the blank netgroup. This is because the line parser returns a + NOTFOUND status when the netgroup exists but is empty. The + __getnetgrent_internal implementation needs to be fixed to try + remaining groups if the current group is entry. This patch implements + this fix. Tested on x86_64. + + [BZ #17363] + * inet/getnetgrent_r.c (__internal_getnetgrent_r): Try next + group if the current group is empty. + +diff --git glibc-2.17-c758a686/inet/getnetgrent_r.c glibc-2.17-c758a686/inet/getnetgrent_r.c +index f6d064d..e101537 100644 +--- glibc-2.17-c758a686/inet/getnetgrent_r.c ++++ glibc-2.17-c758a686/inet/getnetgrent_r.c +@@ -297,7 +297,10 @@ __internal_getnetgrent_r (char **hostp, char **userp, char **domainp, + { + status = DL_CALL_FCT (*fct, (datap, buffer, buflen, &errno)); + +- if (status == NSS_STATUS_RETURN) ++ if (status == NSS_STATUS_RETURN ++ /* The service returned a NOTFOUND, but there are more groups that we ++ need to resolve before we give up. */ ++ || (status == NSS_STATUS_NOTFOUND && datap->needed_groups != NULL)) + { + /* This was the last one for this group. Look at next group + if available. */ diff --git a/SOURCES/glibc-rh1098042.patch b/SOURCES/glibc-rh1098042.patch new file mode 100644 index 0000000..efda3ac --- /dev/null +++ b/SOURCES/glibc-rh1098042.patch @@ -0,0 +1,28 @@ +commit cf26a0cb6a0bbaca46a01ddad6662e5e5159a32a +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu May 15 12:33:11 2014 +0530 + + Return EAI_AGAIN for AF_UNSPEC when herrno is TRY_AGAIN (BZ #16849) + + getaddrinfo correctly returns EAI_AGAIN for AF_INET and AF_INET6 + queries. For AF_UNSPEC however, an older change + (a682a1bf553b1efe4dbb03207fece5b719cec482) broke the check and due to + that the returned error was EAI_NONAME. + + This patch fixes the check so that a non-authoritative not-found is + returned as EAI_AGAIN to the user instead of EAI_NONAME. + +diff --git glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c +index 6258330..8f392b9 100644 +--- glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c ++++ glibc-2.17-c758a686/sysdeps/posix/getaddrinfo.c +@@ -867,8 +867,7 @@ gaih_inet (const char *name, const struct gaih_service *service, + if (status != NSS_STATUS_TRYAGAIN + || rc != ERANGE || herrno != NETDB_INTERNAL) + { +- if (status == NSS_STATUS_TRYAGAIN +- && herrno == TRY_AGAIN) ++ if (herrno == TRY_AGAIN) + no_data = EAI_AGAIN; + else + no_data = herrno == NO_DATA; diff --git a/SOURCES/glibc-rh1098047.patch b/SOURCES/glibc-rh1098047.patch new file mode 100644 index 0000000..b69deb5 --- /dev/null +++ b/SOURCES/glibc-rh1098047.patch @@ -0,0 +1,247 @@ +commit 16b293a7a6f65d8ff348a603d19e8fd4372fa3a9 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Apr 30 11:48:43 2014 +0530 + + Do not fail if one of the two responses to AF_UNSPEC fails (BZ #14308) + + [Fixes BZ #14308, #12994, #13651] + + AF_UNSPEC results in sending two queries in parallel, one for the A + record and the other for the AAAA record. If one of these is a + referral, then the query fails, which is wrong. It should return at + least the one successful response. + + The fix has two parts. The first part makes the referral fall back to + the SERVFAIL path, which results in using the successful response. + There is a bug in that path however, due to which the second part is + necessary. The bug here is that if the first response is a failure + and the second succeeds, __libc_res_nsearch does not detect that and + assumes a failure. The case where the first response is a success and + the second fails, works correctly. + + This condition is produced by buggy routers, so here's a crude + interposable library that can simulate such a condition. The library + overrides the recvfrom syscall and modifies the header of the packet + received to reproduce this scenario. It has two key variables: + mod_packet and first_error. + + The mod_packet variable when set to 0, results in odd packets being + modified to be a referral. When set to 1, even packets are modified + to be a referral. + + The first_error causes the first response to be a failure so that a + domain-appended search is performed to test the second part of the + __libc_nsearch fix. + + The driver for this fix is a simple getaddrinfo program that does an + AF_UNSPEC query. I have omitted this since it should be easy to + implement. + + I have tested this on x86_64. + + The interceptor library source: + + /* Override recvfrom and modify the header of the first DNS response to make it + a referral and reproduce bz #845218. We have to resort to this ugly hack + because we cannot make bind return the buggy response of a referral for the + AAAA record and an authoritative response for the A record. */ + #define _GNU_SOURCE + #include <sys/types.h> + #include <sys/socket.h> + #include <netinet/in.h> + #include <arpa/inet.h> + #include <stdio.h> + #include <stdbool.h> + #include <endian.h> + #include <dlfcn.h> + #include <stdlib.h> + + /* Lifted from resolv/arpa/nameser_compat.h. */ + typedef struct { + unsigned id :16; /*%< query identification number */ + #if BYTE_ORDER == BIG_ENDIAN + /* fields in third byte */ + unsigned qr: 1; /*%< response flag */ + unsigned opcode: 4; /*%< purpose of message */ + unsigned aa: 1; /*%< authoritive answer */ + unsigned tc: 1; /*%< truncated message */ + unsigned rd: 1; /*%< recursion desired */ + /* fields + * in + * fourth + * byte + * */ + unsigned ra: 1; /*%< recursion available */ + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */ + unsigned ad: 1; /*%< authentic data from named */ + unsigned cd: 1; /*%< checking disabled by resolver */ + unsigned rcode :4; /*%< response code */ + #endif + #if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN + /* fields + * in + * third + * byte + * */ + unsigned rd :1; /*%< recursion desired */ + unsigned tc :1; /*%< truncated message */ + unsigned aa :1; /*%< authoritive answer */ + unsigned opcode :4; /*%< purpose of message */ + unsigned qr :1; /*%< response flag */ + /* fields + * in + * fourth + * byte + * */ + unsigned rcode :4; /*%< response code */ + unsigned cd: 1; /*%< checking disabled by resolver */ + unsigned ad: 1; /*%< authentic data from named */ + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */ + unsigned ra :1; /*%< recursion available */ + #endif + /* remaining + * bytes + * */ + unsigned qdcount :16; /*%< number of question entries */ + unsigned ancount :16; /*%< number of answer entries */ + unsigned nscount :16; /*%< number of authority entries */ + unsigned arcount :16; /*%< number of resource entries */ + } HEADER; + + static int done = 0; + + /* Packets to modify. 0 for the odd packets and 1 for even packets. */ + static const int mod_packet = 0; + + /* Set to true if the first request should result in an error, resulting in a + search query. */ + static bool first_error = true; + + static ssize_t (*real_recvfrom) (int sockfd, void *buf, size_t len, int flags, + struct sockaddr *src_addr, socklen_t *addrlen); + + void + __attribute__ ((constructor)) + init (void) + { + real_recvfrom = dlsym (RTLD_NEXT, "recvfrom"); + + if (real_recvfrom == NULL) + { + printf ("Failed to get reference to recvfrom: %s\n", dlerror ()); + printf ("Cannot simulate test\n"); + abort (); + } + } + + /* Modify the second packet that we receive to set the header in a manner as to + reproduce BZ #845218. */ + static void + mod_buf (HEADER *h, int port) + { + if (done % 2 == mod_packet || (first_error && done == 1)) + { + printf ("(Modifying header)"); + + if (first_error && done == 1) + h->rcode = 3; + else + h->rcode = 0; /* NOERROR == 0. */ + h->ancount = 0; + h->aa = 0; + h->ra = 0; + h->arcount = 0; + } + done++; + } + + ssize_t + recvfrom (int sockfd, void *buf, size_t len, int flags, + struct sockaddr *src_addr, socklen_t *addrlen) + { + ssize_t ret = real_recvfrom (sockfd, buf, len, flags, src_addr, addrlen); + int port = htons (((struct sockaddr_in *) src_addr)->sin_port); + struct in_addr addr = ((struct sockaddr_in *) src_addr)->sin_addr; + const char *host = inet_ntoa (addr); + printf ("\n*** From %s:%d: ", host, port); + + mod_buf (buf, port); + + printf ("returned %zd\n", ret); + return ret; + } + + ChangeLog | 11 +++++++++++ + NEWS | 14 +++++++------- + resolv/res_query.c | 7 +++++-- + resolv/res_send.c | 2 +- + 4 files changed, 24 insertions(+), 10 deletions(-) + +commit e35c53e397e7abbd41fedacdedcfa5af7b5c2c52 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Tue Jul 8 16:40:24 2014 +0530 + + Check value at resplen2 if it is not NULL + + There was a typo in the previous patch due to which resplen2 was + checked for non-zero instead of the value at resplen2. Fix that and + improve the condition by checking resplen2 for non-NULL (instead of + answerp2) and also adding the check in a third place. + + ChangeLog | 3 +++ + resolv/res_query.c | 9 +++++---- + 2 files changed, 8 insertions(+), 4 deletions(-) + +diff -pruN glibc-2.17-c758a686/resolv/res_query.c glibc-2.17-c758a686/resolv/res_query.c +--- glibc-2.17-c758a686/resolv/res_query.c 2012-12-25 08:32:13.000000000 +0530 ++++ glibc-2.17-c758a686/resolv/res_query.c 2014-09-05 14:28:06.439191017 +0530 +@@ -378,7 +378,9 @@ __libc_res_nsearch(res_state statp, + ret = __libc_res_nquerydomain(statp, name, NULL, class, type, + answer, anslen, answerp, + answerp2, nanswerp2, resplen2); +- if (ret > 0 || trailing_dot) ++ if (ret > 0 || trailing_dot ++ /* If the second response is valid then we use that. */ ++ || (ret == 0 && resplen2 != NULL && *resplen2 > 0)) + return (ret); + saved_herrno = h_errno; + tried_as_is++; +@@ -418,7 +420,8 @@ __libc_res_nsearch(res_state statp, + answer, anslen, answerp, + answerp2, nanswerp2, + resplen2); +- if (ret > 0) ++ if (ret > 0 || (ret == 0 && resplen2 != NULL ++ && *resplen2 > 0)) + return (ret); + + if (answerp && *answerp != answer) { +@@ -487,7 +490,8 @@ __libc_res_nsearch(res_state statp, + ret = __libc_res_nquerydomain(statp, name, NULL, class, type, + answer, anslen, answerp, + answerp2, nanswerp2, resplen2); +- if (ret > 0) ++ if (ret > 0 || (ret == 0 && resplen2 != NULL ++ && *resplen2 > 0)) + return (ret); + } + +diff -pruN glibc-2.17-c758a686/resolv/res_send.c glibc-2.17-c758a686/resolv/res_send.c +--- glibc-2.17-c758a686/resolv/res_send.c 2014-09-05 14:28:30.039337246 +0530 ++++ glibc-2.17-c758a686/resolv/res_send.c 2014-09-05 14:28:06.439191017 +0530 +@@ -1343,6 +1343,7 @@ send_dg(res_state statp, + (*thisresplenp > *thisanssizp) + ? *thisanssizp : *thisresplenp); + ++ next_ns: + if (recvresp1 || (buf2 != NULL && recvresp2)) { + *resplen2 = 0; + return resplen; +@@ -1360,7 +1361,6 @@ send_dg(res_state statp, + goto wait; + } + +- next_ns: + __res_iclose(statp, false); + /* don't retry if called from dig */ + if (!statp->pfcode) diff --git a/SOURCES/glibc-rh1103856.patch b/SOURCES/glibc-rh1103856.patch new file mode 100644 index 0000000..d7c7676 --- /dev/null +++ b/SOURCES/glibc-rh1103856.patch @@ -0,0 +1,28 @@ +commit 4d653a59ffeae0f46f76a40230e2cfa9587b7e7e +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Fri May 30 22:43:52 2014 +0530 + + Add mmap usage in malloc_info output + + The current malloc_info xml output only has information about + allocations on the heap. Display information about number of mappings + and total mmapped size to this to complete the picture. + +diff -pruN glibc-2.17-c758a686/malloc/malloc.c glibc-2.17-c758a686/malloc/malloc.c +--- glibc-2.17-c758a686/malloc/malloc.c 2014-06-02 07:35:22.573256155 +0530 ++++ glibc-2.17-c758a686/malloc/malloc.c 2014-06-02 07:34:58.856257177 +0530 +@@ -6553,12 +6553,14 @@ malloc_info (int options, FILE *fp) + fprintf (fp, + "<total type=\"fast\" count=\"%zu\" size=\"%zu\"/>\n" + "<total type=\"rest\" count=\"%zu\" size=\"%zu\"/>\n" ++ "<total type=\"mmap\" count=\"%d\" size=\"%zu\"/>\n" + "<system type=\"current\" size=\"%zu\"/>\n" + "<system type=\"max\" size=\"%zu\"/>\n" + "<aspace type=\"total\" size=\"%zu\"/>\n" + "<aspace type=\"mprotect\" size=\"%zu\"/>\n" + "</malloc>\n", + total_nfastblocks, total_fastavail, total_nblocks, total_avail, ++ mp_.n_mmaps, mp_.mmapped_mem, + total_system, total_max_system, + total_aspace, total_aspace_mprotect); + diff --git a/SOURCES/glibc-rh1103874.patch b/SOURCES/glibc-rh1103874.patch new file mode 100644 index 0000000..4dd79df --- /dev/null +++ b/SOURCES/glibc-rh1103874.patch @@ -0,0 +1,152 @@ +diff -pruN glibc-2.17-c758a686/nptl/sysdeps/pthread/unwind-forcedunwind.c glibc-2.17-c758a686/nptl/sysdeps/pthread/unwind-forcedunwind.c +--- glibc-2.17-c758a686/nptl/sysdeps/pthread/unwind-forcedunwind.c 2010-05-04 16:57:23.000000000 +0530 ++++ glibc-2.17-c758a686/nptl/sysdeps/pthread/unwind-forcedunwind.c 2014-06-02 23:00:02.901013275 +0530 +@@ -45,8 +45,10 @@ pthread_cancel_init (void) + + if (__builtin_expect (libgcc_s_handle != NULL, 1)) + { +- /* Force gcc to reload all values. */ +- asm volatile ("" ::: "memory"); ++ /* Order reads so as to prevent speculation of loads ++ of libgcc_s_{resume,personality,forcedunwind,getcfa} ++ to points prior to the write barrier. */ ++ atomic_read_barrier (); + return; + } + +@@ -72,9 +74,14 @@ pthread_cancel_init (void) + libgcc_s_forcedunwind = forcedunwind; + PTR_MANGLE (getcfa); + libgcc_s_getcfa = getcfa; +- /* Make sure libgcc_s_handle is written last. Otherwise, +- pthread_cancel_init might return early even when the pointer the +- caller is interested in is not initialized yet. */ ++ /* At the point at which any thread writes the handle ++ to libgcc_s_handle, the initialization is complete. ++ The writing of libgcc_s_handle is atomic. All other ++ threads reading libgcc_s_handle do so atomically. Any ++ thread that does not execute this function must issue ++ a read barrier to ensure that all of the above has ++ actually completed and that the values of the ++ function pointers are correct. */ + atomic_write_barrier (); + libgcc_s_handle = handle; + } +@@ -91,13 +98,19 @@ __unwind_freeres (void) + } + } + +-void +-_Unwind_Resume (struct _Unwind_Exception *exc) ++static __always_inline void ++_maybe_pthread_cancel_init (void) + { + if (__builtin_expect (libgcc_s_handle == NULL, 0)) + pthread_cancel_init (); + else + atomic_read_barrier (); ++} ++ ++void ++_Unwind_Resume (struct _Unwind_Exception *exc) ++{ ++ _maybe_pthread_cancel_init (); + + void (*resume) (struct _Unwind_Exception *exc) = libgcc_s_resume; + PTR_DEMANGLE (resume); +@@ -108,10 +123,7 @@ __gcc_personality_v0 (int version, _Unwi + struct _Unwind_Exception *ue_header, + struct _Unwind_Context *context) + { +- if (__builtin_expect (libgcc_s_handle == NULL, 0)) +- pthread_cancel_init (); +- else +- atomic_read_barrier (); ++ _maybe_pthread_cancel_init (); + + _Unwind_Reason_Code (*personality) + (int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, +@@ -122,10 +136,7 @@ _Unwind_Reason_Code + _Unwind_ForcedUnwind (struct _Unwind_Exception *exc, _Unwind_Stop_Fn stop, + void *stop_argument) + { +- if (__builtin_expect (libgcc_s_handle == NULL, 0)) +- pthread_cancel_init (); +- else +- atomic_read_barrier (); ++ _maybe_pthread_cancel_init (); + + _Unwind_Reason_Code (*forcedunwind) + (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *) +@@ -135,10 +148,7 @@ _Unwind_ForcedUnwind (struct _Unwind_Exc + _Unwind_Word + _Unwind_GetCFA (struct _Unwind_Context *context) + { +- if (__builtin_expect (libgcc_s_handle == NULL, 0)) +- pthread_cancel_init (); +- else +- atomic_read_barrier (); ++ _maybe_pthread_cancel_init (); + + _Unwind_Word (*getcfa) (struct _Unwind_Context *) = libgcc_s_getcfa; + PTR_DEMANGLE (getcfa); +diff -pruN glibc-2.17-c758a686/sysdeps/gnu/unwind-resume.c glibc-2.17-c758a686/sysdeps/gnu/unwind-resume.c +--- glibc-2.17-c758a686/sysdeps/gnu/unwind-resume.c 2010-05-04 16:57:23.000000000 +0530 ++++ glibc-2.17-c758a686/sysdeps/gnu/unwind-resume.c 2014-06-02 23:02:26.812007078 +0530 +@@ -20,8 +20,11 @@ + #include <dlfcn.h> + #include <stdio.h> + #include <unwind.h> ++#include <pthreadP.h> ++#include <sysdep.h> + #include <gnu/lib-names.h> + ++static void *libgcc_s_handle; + static void (*libgcc_s_resume) (struct _Unwind_Exception *exc); + static _Unwind_Reason_Code (*libgcc_s_personality) + (int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, +@@ -42,13 +45,32 @@ init (void) + + libgcc_s_resume = resume; + libgcc_s_personality = personality; ++ atomic_write_barrier (); ++ /* At the point at which any thread writes the handle ++ to libgcc_s_handle, the initialization is complete. ++ The writing of libgcc_s_handle is atomic. All other ++ threads reading libgcc_s_handle do so atomically. Any ++ thread that does not execute this function must issue ++ a read barrier to ensure that all of the above has ++ actually completed and that the values of the ++ function pointers are correct. */ ++ libgcc_s_handle = handle; + } + ++static __always_inline void ++_maybe_init (void) ++{ ++ if (__builtin_expect (libgcc_s_handle == NULL, 0)) ++ init (); ++ else ++ atomic_read_barrier (); ++} ++ ++ + void + _Unwind_Resume (struct _Unwind_Exception *exc) + { +- if (__builtin_expect (libgcc_s_resume == NULL, 0)) +- init (); ++ _maybe_init (); + libgcc_s_resume (exc); + } + +@@ -58,8 +80,7 @@ __gcc_personality_v0 (int version, _Unwi + struct _Unwind_Exception *ue_header, + struct _Unwind_Context *context) + { +- if (__builtin_expect (libgcc_s_personality == NULL, 0)) +- init (); ++ _maybe_init (); + return libgcc_s_personality (version, actions, exception_class, + ue_header, context); + } diff --git a/SOURCES/glibc-rh1120490-int128.patch b/SOURCES/glibc-rh1120490-int128.patch new file mode 100644 index 0000000..2c539a2 --- /dev/null +++ b/SOURCES/glibc-rh1120490-int128.patch @@ -0,0 +1,60 @@ +Upstream patches to allow older compilers to use link.h: + +commit 30477995dc8a680283b4d6e02039bca09de83cf9 +Author: Marko Myllynen <myllynen@redhat.com> +Date: Fri May 30 10:50:21 2014 -0700 + + Replace __int128 with __int128_t + + * sysdeps/x86_64/link-defines.sym (BND_SIZE): Replace __int128 + with __int128_t. + +commit 48332d822090e41253692053a00dfe224d3ebec0 +Author: H.J. Lu <hjl.tools@gmail.com> +Date: Fri Apr 25 09:33:41 2014 -0700 + + Replace __int128 with __int128_t in bits/link.h + + __int128 was added in GCC 4.6 and __int128_t was added before x86-64 + was supported. This patch replaces __int128 with __int128_t so that + the installed bits/link.h can be used with older GCC. + + * sysdeps/x86/bits/link.h (La_x86_64_regs): Replace __int128 + with __int128_t. + (La_x86_64_retval): Likewise. + +diff -urN glibc-2.17-c758a686/sysdeps/x86/bits/link.h glibc-2.17-c758a686/sysdeps/x86/bits/link.h +--- glibc-2.17-c758a686/sysdeps/x86/bits/link.h 2014-11-05 13:39:09.888988366 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86/bits/link.h 2014-11-05 13:39:52.800863646 -0500 +@@ -94,7 +94,7 @@ + La_x86_64_xmm lr_xmm[8]; + La_x86_64_vector lr_vector[8]; + #ifndef __ILP32__ +- __int128 lr_bnd[4]; ++ __int128_t lr_bnd[4]; + #endif + } La_x86_64_regs; + +@@ -110,8 +110,8 @@ + La_x86_64_vector lrv_vector0; + La_x86_64_vector lrv_vector1; + #ifndef __ILP32__ +- __int128 lrv_bnd0; +- __int128 lrv_bnd1; ++ __int128_t lrv_bnd0; ++ __int128_t lrv_bnd1; + #endif + } La_x86_64_retval; + +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym +--- glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym 2014-11-05 13:39:09.889988363 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym 2014-11-05 13:39:52.800863646 -0500 +@@ -6,7 +6,7 @@ + XMM_SIZE sizeof (La_x86_64_xmm) + YMM_SIZE sizeof (La_x86_64_ymm) + ZMM_SIZE sizeof (La_x86_64_zmm) +-BND_SIZE sizeof (__int128) ++BND_SIZE sizeof (__int128_t) + + LR_SIZE sizeof (struct La_x86_64_regs) + LR_RDX_OFFSET offsetof (struct La_x86_64_regs, lr_rdx) diff --git a/SOURCES/glibc-rh1120490.patch b/SOURCES/glibc-rh1120490.patch new file mode 100644 index 0000000..c2ab741 --- /dev/null +++ b/SOURCES/glibc-rh1120490.patch @@ -0,0 +1,190 @@ +commit 602f80ec8b966cfad3b61914cbe14ee606cedf6e +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Tue Sep 16 22:16:01 2014 +0530 + + Make __extern_always_inline usable on clang++ again + + The fix for BZ #17266 (884ddc5081278f488ef8cd49951f41cfdbb480ce) + removed changes that had gone into cdefs.h to make + __extern_always_inline usable with clang++. This patch adds back + support for clang to detect if GNU inlining semantics are available, + this time without breaking the gcc use case. The check put here is + based on the earlier patch and assertion[1] that checking if + __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__ is defined is sufficient + to determine that clang++ suports GNU inlining semantics. + + Tested with a simple program that builds with __extern_always_inline + with the patch and fails compilation without it. + + #include <stdio.h> + #include <sys/cdefs.h> + + extern void foo_alias (void) __asm ("foo"); + + __extern_always_inline void + foo (void) + { + puts ("hi oh world!"); + return foo_alias (); + } + + void + foo_alias (void) + { + puts ("hell oh world"); + } + + int + main () + { + foo (); + } + + [1] https://sourceware.org/ml/libc-alpha/2012-12/msg00306.html + + [BZ #17266] + * misc/sys/cdefs.h: Define __extern_always_inline for clang + 4.2 and newer. + +commit 884ddc5081278f488ef8cd49951f41cfdbb480ce +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Tue Sep 16 14:08:48 2014 +0530 + + Revert to defining __extern_inline only for gcc-4.3+ (BZ #17266) + + The check for only __GNUC_STDC_INLINE__ and __GNUC_GNU_INLINE__ may + not be sufficient since those flags were added during initial support + for C99 inlining semantics. There is also a problem with always + defining __extern_inline and __extern_always_inline, since it enables + inline wrapper functions even when GNU inlining semantics are not + guaranteed. This, along with the possibility of such wrappers using + redirection (btowc for example) could result in compiler generating an + infinitely recusrive call to the function. + + In fact it was such a recursion that led to this code being written + the way it was; see: + + https://bugzilla.redhat.com/show_bug.cgi?id=186410 + + The initial change was to fix bugs 14530 and 13741, but they can be + resolved by checking if __fortify_function and/or + __extern_always_inline are defined, as it has been done in this patch. + In addition, I have audited uses of __extern_always_inline to make + sure that none of the uses result in compilation errors. + + There is however a regression in this patch for llvm, since it reverts + the llvm expectation that __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__ + definition imply proper extern inline semantics. + + 2014-09-16 Siddhesh Poyarekar <siddhesh@redhat.com> + Jakub Jelinek <jakub@redhat.com> + + [BZ #17266] + * libio/stdio.h: Check definition of __fortify_function + instead of __extern_always_inline to include bits/stdio2.h. + * math/bits/math-finite.h [__USE_XOPEN || __USE_ISOC99]: Also + check if __extern_always_inline is defined. + [__USE_MISC || __USE_XOPEN]: Likewise. + [__USE_ISOC99] Likewise. + * misc/sys/cdefs.h (__fortify_function): Define only if + __extern_always_inline is defined. + [!__cplusplus || __GNUC_PREREQ (4,3)]: Revert to defining + __extern_always_inline and __extern_inline only for g++-4.3 + and newer or a compatible gcc. + +diff --git glibc-2.17-c758a686/libio/stdio.h glibc-2.17-c758a686/libio/stdio.h +index d8c0bdb..1f4f837 100644 +--- glibc-2.17-c758a686/libio/stdio.h ++++ glibc-2.17-c758a686/libio/stdio.h +@@ -932,7 +932,7 @@ extern void funlockfile (FILE *__stream) __THROW; + #ifdef __USE_EXTERN_INLINES + # include <bits/stdio.h> + #endif +-#if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline ++#if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function + # include <bits/stdio2.h> + #endif + #ifdef __LDBL_COMPAT +diff --git glibc-2.17-c758a686/math/bits/math-finite.h glibc-2.17-c758a686/math/bits/math-finite.h +index aa755de..0656645 100644 +--- glibc-2.17-c758a686/math/bits/math-finite.h ++++ glibc-2.17-c758a686/math/bits/math-finite.h +@@ -251,7 +251,8 @@ extern long double __REDIRECT_NTH (lgammal_r, (long double, int *), + # endif + #endif + +-#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC99 ++#if ((defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC99) \ ++ && defined __extern_always_inline) + /* lgamma. */ + __extern_always_inline double __NTH (lgamma (double __d)) + { +@@ -284,7 +285,8 @@ __extern_always_inline long double __NTH (lgammal (long double __d)) + # endif + #endif + +-#if defined __USE_MISC || defined __USE_XOPEN ++#if ((defined __USE_MISC || defined __USE_XOPEN) \ ++ && defined __extern_always_inline) + /* gamma. */ + __extern_always_inline double __NTH (gamma (double __d)) + { +@@ -422,7 +424,7 @@ extern long double __REDIRECT_NTH (sqrtl, (long double), __sqrtl_finite); + # endif + #endif + +-#ifdef __USE_ISOC99 ++#if defined __USE_ISOC99 && defined __extern_always_inline + /* tgamma. */ + extern double __gamma_r_finite (double, int *); + __extern_always_inline double __NTH (tgamma (double __d)) +diff --git glibc-2.17-c758a686/misc/sys/cdefs.h glibc-2.17-c758a686/misc/sys/cdefs.h +index 04db956..01e81ba 100644 +--- glibc-2.17-c758a686/misc/sys/cdefs.h ++++ glibc-2.17-c758a686/misc/sys/cdefs.h +@@ -131,7 +131,6 @@ + /* Fortify support. */ + #define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1) + #define __bos0(ptr) __builtin_object_size (ptr, 0) +-#define __fortify_function __extern_always_inline __attribute_artificial__ + + #if __GNUC_PREREQ (4,3) + # define __warndecl(name, msg) \ +@@ -319,8 +318,17 @@ + #endif + + /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 +- inline semantics, unless -fgnu89-inline is used. */ +-#if (!defined __cplusplus || __GNUC_PREREQ (4,3)) && defined __GNUC__ ++ inline semantics, unless -fgnu89-inline is used. Using __GNUC_STDC_INLINE__ ++ or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions ++ older than 4.3 may define these macros and still not guarantee GNU inlining ++ semantics. ++ ++ clang++ identifies itself as gcc-4.2, but has support for GNU inlining ++ semantics, that can be checked fot by using the __GNUC_STDC_INLINE_ and ++ __GNUC_GNU_INLINE__ macro definitions. */ ++#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \ ++ || (defined __clang__ && (defined __GNUC_STDC_INLINE__ \ ++ || defined __GNUC_GNU_INLINE__))) + # if defined __GNUC_STDC_INLINE__ || defined __cplusplus + # define __extern_inline extern __inline __attribute__ ((__gnu_inline__)) + # define __extern_always_inline \ +@@ -329,13 +337,10 @@ + # define __extern_inline extern __inline + # define __extern_always_inline extern __always_inline + # endif +-#elif defined __GNUC__ /* C++ and GCC <4.3. */ +-# define __extern_inline extern __inline +-# define __extern_always_inline \ +- extern __always_inline +-#else /* Not GCC. */ +-# define __extern_inline /* Ignore */ +-# define __extern_always_inline /* Ignore */ ++#endif ++ ++#ifdef __extern_always_inline ++# define __fortify_function __extern_always_inline __attribute_artificial__ + #endif + + /* GCC 4.3 and above allow passing all anonymous arguments of an diff --git a/SOURCES/glibc-rh1125306.patch b/SOURCES/glibc-rh1125306.patch new file mode 100644 index 0000000..6b19f7f --- /dev/null +++ b/SOURCES/glibc-rh1125306.patch @@ -0,0 +1,20 @@ +commit a11892631d92f594c690d0d50a642b0d1aba58b8 +Author: Ondřej Bílka <neleai@seznam.cz> +Date: Wed May 7 14:08:57 2014 +0200 + + Fix typo in nscd/selinux.c + +diff --git glibc-2.17-c758a686/nscd/selinux.c glibc-2.17-c758a686/nscd/selinux.c +index 9a8a5a8..eaed6dd 100644 +--- glibc-2.17-c758a686/nscd/selinux.c ++++ glibc-2.17-c758a686/nscd/selinux.c +@@ -372,7 +372,7 @@ nscd_request_avc_has_perm (int fd, request_type req) + /* Get the security class for nscd. If this fails we will likely be + unable to do anything unless avc_deny_unknown is 0. */ +- if ((sc_nscd = string_to_security_class ("nscd")) == 0 +- && avc_deny_unknown == 1) ++ sc_nscd = string_to_security_class ("nscd"); ++ if (sc_nscd == 0 && avc_deny_unknown == 1) + dbg_log (_("Error getting security class for nscd.")); + + /* Convert permission to AVC bits. */ diff --git a/SOURCES/glibc-rh1132518-mpx.patch b/SOURCES/glibc-rh1132518-mpx.patch new file mode 100644 index 0000000..43997d0 --- /dev/null +++ b/SOURCES/glibc-rh1132518-mpx.patch @@ -0,0 +1,386 @@ +# MPX Support for glibc: +# +# Note: Renamed configure.ac changes to configure.in changes. +# +# commit ea8ba7cd14d0f479bae8365ae5c4ef177bdd0aad +# Author: Igor Zamyatin <igor.zamyatin@intel.com> +# Date: Wed Apr 16 14:43:16 2014 -0700 +# +# Save/restore bound registers for _dl_runtime_profile +# +# This patch saves and restores bound registers in x86-64 PLT for +# ld.so profile and LD_AUDIT: +# +# * sysdeps/x86_64/bits/link.h (La_x86_64_regs): Add lr_bnd. +# (La_x86_64_retval): Add lrv_bnd0 and lrv_bnd1. +# * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Save +# Intel MPX bound registers before _dl_profile_fixup. +# * sysdeps/x86_64/dl-trampoline.h: Restore Intel MPX bound +# registers after _dl_profile_fixup. Save and restore bound +# registers bnd0/bnd1 when calling _dl_call_pltexit. +# * sysdeps/x86_64/link-defines.sym (BND_SIZE): New. +# (LR_BND_OFFSET): Likewise. +# (LRV_BND0_OFFSET): Likewise. +# (LRV_BND1_OFFSET): Likewise. +# +# commit a4c75cfd56e536c2b18556e8a482d88dffa0fffc +# Author: Igor Zamyatin <igor.zamyatin@intel.com> +# Date: Tue Apr 1 10:16:04 2014 -0700 +# +# Save/restore bound registers in _dl_runtime_resolve +# +# This patch saves and restores bound registers in symbol lookup for x86-64: +# +# 1. Branches without BND prefix clear bound registers. +# 2. x86-64 pass bounds in bound registers as specified in MPX psABI +# extension on hjl/mpx/master branch at +# +# https://github.com/hjl-tools/x86-64-psABI +# https://groups.google.com/forum/#!topic/x86-64-abi/KFsB0XTgWYc +# +# Binutils has been updated to create an alternate PLT to add BND prefix +# when branching to ld.so. +# +# * config.h.in (HAVE_MPX_SUPPORT): New #undef. +# * sysdeps/x86_64/configure.ac: Set HAVE_MPX_SUPPORT. +# * sysdeps/x86_64/configure: Regenerated. +# * sysdeps/x86_64/dl-trampoline.S (REGISTER_SAVE_AREA): New +# macro. +# (REGISTER_SAVE_RAX): Likewise. +# (REGISTER_SAVE_RCX): Likewise. +# (REGISTER_SAVE_RDX): Likewise. +# (REGISTER_SAVE_RSI): Likewise. +# (REGISTER_SAVE_RDI): Likewise. +# (REGISTER_SAVE_R8): Likewise. +# (REGISTER_SAVE_R9): Likewise. +# (REGISTER_SAVE_BND0): Likewise. +# (REGISTER_SAVE_BND1): Likewise. +# (REGISTER_SAVE_BND2): Likewise. +# (_dl_runtime_resolve): Use them. Save and restore Intel MPX +# bound registers when calling _dl_fixup. +# +diff -urN glibc-2.17-c758a686/config.h.in glibc-2.17-c758a686/config.h.in +--- glibc-2.17-c758a686/config.h.in 2014-09-10 23:26:03.467045808 -0400 ++++ glibc-2.17-c758a686/config.h.in 2014-09-10 23:27:41.532851928 -0400 +@@ -107,6 +107,9 @@ + /* Define if assembler supports AVX512. */ + #undef HAVE_AVX512_ASM_SUPPORT + ++/* Define if assembler supports Intel MPX. */ ++#undef HAVE_MPX_SUPPORT ++ + /* Define if gcc supports FMA4. */ + #undef HAVE_FMA4_SUPPORT + +diff -urN glibc-2.17-c758a686/sysdeps/x86/bits/link.h glibc-2.17-c758a686/sysdeps/x86/bits/link.h +--- glibc-2.17-c758a686/sysdeps/x86/bits/link.h 2014-09-10 23:26:03.467045808 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86/bits/link.h 2014-09-10 23:27:41.533851926 -0400 +@@ -93,6 +93,9 @@ + uint64_t lr_rsp; + La_x86_64_xmm lr_xmm[8]; + La_x86_64_vector lr_vector[8]; ++#ifndef __ILP32__ ++ __int128 lr_bnd[4]; ++#endif + } La_x86_64_regs; + + /* Return values for calls from PLT on x86-64. */ +@@ -106,6 +109,10 @@ + long double lrv_st1; + La_x86_64_vector lrv_vector0; + La_x86_64_vector lrv_vector1; ++#ifndef __ILP32__ ++ __int128 lrv_bnd0; ++ __int128 lrv_bnd1; ++#endif + } La_x86_64_retval; + + #define La_x32_regs La_x86_64_regs +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/configure glibc-2.17-c758a686/sysdeps/x86_64/configure +--- glibc-2.17-c758a686/sysdeps/x86_64/configure 2014-09-10 23:26:03.573045598 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86_64/configure 2014-09-10 23:27:41.532851928 -0400 +@@ -212,6 +212,33 @@ + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_novzeroupper" >&5 + $as_echo "$libc_cv_cc_novzeroupper" >&6; } + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Intel MPX support" >&5 ++$as_echo_n "checking for Intel MPX support... " >&6; } ++if ${libc_cv_asm_mpx+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat > conftest.s <<\EOF ++ bndmov %bnd0,(%rsp) ++EOF ++if { ac_try='${CC-cc} -c $ASFLAGS conftest.s 1>&5' ++ { { 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_mpx=yes ++else ++ libc_cv_asm_mpx=no ++fi ++rm -f conftest* ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_mpx" >&5 ++$as_echo "$libc_cv_asm_mpx" >&6; } ++if test $libc_cv_asm_mpx == yes; then ++ $as_echo "#define HAVE_MPX_SUPPORT 1" >>confdefs.h ++ ++fi ++ + $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h + + # work around problem with autoconf and empty lines at the end of files +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/configure.in glibc-2.17-c758a686/sysdeps/x86_64/configure.in +--- glibc-2.17-c758a686/sysdeps/x86_64/configure.in 2014-09-10 23:26:03.468045806 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86_64/configure.in 2014-09-10 23:27:41.532851928 -0400 +@@ -70,6 +70,21 @@ + [libc_cv_cc_novzeroupper=no]) + ]) + ++dnl Check whether asm supports Intel MPX ++AC_CACHE_CHECK(for Intel MPX support, libc_cv_asm_mpx, [dnl ++cat > conftest.s <<\EOF ++ bndmov %bnd0,(%rsp) ++EOF ++if AC_TRY_COMMAND(${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then ++ libc_cv_asm_mpx=yes ++else ++ libc_cv_asm_mpx=no ++fi ++rm -f conftest*]) ++if test $libc_cv_asm_mpx == yes; then ++ AC_DEFINE(HAVE_MPX_SUPPORT) ++fi ++ + dnl It is always possible to access static and hidden symbols in an + dnl position independent way. + AC_DEFINE(PI_STATIC_AND_HIDDEN) +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h +--- glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h 2014-09-10 23:26:03.468045806 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h 2014-09-10 23:27:41.535851922 -0400 +@@ -63,6 +63,20 @@ + movaps (LR_XMM_OFFSET + XMM_SIZE*6)(%rsp), %xmm6 + movaps (LR_XMM_OFFSET + XMM_SIZE*7)(%rsp), %xmm7 + ++#ifndef __ILP32__ ++# ifdef HAVE_MPX_SUPPORT ++ bndmov (LR_BND_OFFSET)(%rsp), %bnd0 # Restore bound ++ bndmov (LR_BND_OFFSET + BND_SIZE)(%rsp), %bnd1 # registers. ++ bndmov (LR_BND_OFFSET + BND_SIZE*2)(%rsp), %bnd2 ++ bndmov (LR_BND_OFFSET + BND_SIZE*3)(%rsp), %bnd3 ++# else ++ .byte 0x66,0x0f,0x1a,0x84,0x24;.long (LR_BND_OFFSET) ++ .byte 0x66,0x0f,0x1a,0x8c,0x24;.long (LR_BND_OFFSET + BND_SIZE) ++ .byte 0x66,0x0f,0x1a,0x94,0x24;.long (LR_BND_OFFSET + BND_SIZE*2) ++ .byte 0x66,0x0f,0x1a,0x9c,0x24;.long (LR_BND_OFFSET + BND_SIZE*3) ++# endif ++#endif ++ + #ifdef RESTORE_AVX + /* Check if any xmm0-xmm7 registers are changed by audit + module. */ +@@ -222,6 +236,16 @@ + vmovdqa %xmm1, (LRV_SIZE + XMM_SIZE)(%rcx) + #endif + ++#ifndef __ILP32__ ++# ifdef HAVE_MPX_SUPPORT ++ bndmov %bnd0, LRV_BND0_OFFSET(%rcx) # Preserve returned bounds. ++ bndmov %bnd1, LRV_BND1_OFFSET(%rcx) ++# else ++ .byte 0x66,0x0f,0x1b,0x81;.long (LRV_BND0_OFFSET) ++ .byte 0x66,0x0f,0x1b,0x89;.long (LRV_BND1_OFFSET) ++# endif ++#endif ++ + fstpt LRV_ST0_OFFSET(%rcx) + fstpt LRV_ST1_OFFSET(%rcx) + +@@ -254,6 +278,16 @@ + 1: + #endif + ++#ifndef __ILP32__ ++# ifdef HAVE_MPX_SUPPORT ++ bndmov LRV_BND0_OFFSET(%rcx), %bnd0 # Restore bound registers. ++ bndmov LRV_BND1_OFFSET(%rcx), %bnd1 ++# else ++ .byte 0x66,0x0f,0x1a,0x81;.long (LRV_BND0_OFFSET) ++ .byte 0x66,0x0f,0x1a,0x89;.long (LRV_BND1_OFFSET) ++# endif ++#endif ++ + fldt LRV_ST1_OFFSET(%rsp) + fldt LRV_ST0_OFFSET(%rsp) + +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S +--- glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S 2014-09-10 23:26:03.468045806 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S 2014-09-10 23:27:41.534851924 -0400 +@@ -24,6 +24,30 @@ + # error RTLD_SAVESPACE_SSE must be aligned to 32 bytes + #endif + ++/* Area on stack to save and restore registers used for parameter ++ passing when calling _dl_fixup. */ ++#ifdef __ILP32__ ++/* X32 saves RCX, RDX, RSI, RDI, R8 and R9 plus RAX. */ ++# define REGISTER_SAVE_AREA (8 * 7) ++# define REGISTER_SAVE_RAX 0 ++#else ++/* X86-64 saves RCX, RDX, RSI, RDI, R8 and R9 plus RAX as well as BND0, ++ BND1, BND2, BND3. */ ++# define REGISTER_SAVE_AREA (8 * 7 + 16 * 4) ++/* Align bound register save area to 16 bytes. */ ++# define REGISTER_SAVE_BND0 0 ++# define REGISTER_SAVE_BND1 (REGISTER_SAVE_BND0 + 16) ++# define REGISTER_SAVE_BND2 (REGISTER_SAVE_BND1 + 16) ++# define REGISTER_SAVE_BND3 (REGISTER_SAVE_BND2 + 16) ++# define REGISTER_SAVE_RAX (REGISTER_SAVE_BND3 + 16) ++#endif ++#define REGISTER_SAVE_RCX (REGISTER_SAVE_RAX + 8) ++#define REGISTER_SAVE_RDX (REGISTER_SAVE_RCX + 8) ++#define REGISTER_SAVE_RSI (REGISTER_SAVE_RDX + 8) ++#define REGISTER_SAVE_RDI (REGISTER_SAVE_RSI + 8) ++#define REGISTER_SAVE_R8 (REGISTER_SAVE_RDI + 8) ++#define REGISTER_SAVE_R9 (REGISTER_SAVE_R8 + 8) ++ + .text + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function +@@ -31,28 +55,63 @@ + cfi_startproc + _dl_runtime_resolve: + cfi_adjust_cfa_offset(16) # Incorporate PLT +- subq $56,%rsp +- cfi_adjust_cfa_offset(56) +- movq %rax,(%rsp) # Preserve registers otherwise clobbered. +- movq %rcx, 8(%rsp) +- movq %rdx, 16(%rsp) +- movq %rsi, 24(%rsp) +- movq %rdi, 32(%rsp) +- movq %r8, 40(%rsp) +- movq %r9, 48(%rsp) +- movq 64(%rsp), %rsi # Copy args pushed by PLT in register. +- movq 56(%rsp), %rdi # %rdi: link_map, %rsi: reloc_index ++ subq $REGISTER_SAVE_AREA,%rsp ++ cfi_adjust_cfa_offset(REGISTER_SAVE_AREA) ++ # Preserve registers otherwise clobbered. ++ movq %rax, REGISTER_SAVE_RAX(%rsp) ++ movq %rcx, REGISTER_SAVE_RCX(%rsp) ++ movq %rdx, REGISTER_SAVE_RDX(%rsp) ++ movq %rsi, REGISTER_SAVE_RSI(%rsp) ++ movq %rdi, REGISTER_SAVE_RDI(%rsp) ++ movq %r8, REGISTER_SAVE_R8(%rsp) ++ movq %r9, REGISTER_SAVE_R9(%rsp) ++#ifndef __ILP32__ ++ # We also have to preserve bound registers. These are nops if ++ # Intel MPX isn't available or disabled. ++# ifdef HAVE_MPX_SUPPORT ++ bndmov %bnd0, REGISTER_SAVE_BND0(%rsp) ++ bndmov %bnd1, REGISTER_SAVE_BND1(%rsp) ++ bndmov %bnd2, REGISTER_SAVE_BND2(%rsp) ++ bndmov %bnd3, REGISTER_SAVE_BND3(%rsp) ++# else ++ .byte 0x66,0x0f,0x1b,0x44,0x24,REGISTER_SAVE_BND0 ++ .byte 0x66,0x0f,0x1b,0x4c,0x24,REGISTER_SAVE_BND1 ++ .byte 0x66,0x0f,0x1b,0x54,0x24,REGISTER_SAVE_BND2 ++ .byte 0x66,0x0f,0x1b,0x5c,0x24,REGISTER_SAVE_BND3 ++# endif ++#endif ++ # Copy args pushed by PLT in register. ++ # %rdi: link_map, %rsi: reloc_index ++ movq (REGISTER_SAVE_AREA + 8)(%rsp), %rsi ++ movq REGISTER_SAVE_AREA(%rsp), %rdi + call _dl_fixup # Call resolver. + movq %rax, %r11 # Save return value +- movq 48(%rsp), %r9 # Get register content back. +- movq 40(%rsp), %r8 +- movq 32(%rsp), %rdi +- movq 24(%rsp), %rsi +- movq 16(%rsp), %rdx +- movq 8(%rsp), %rcx +- movq (%rsp), %rax +- addq $72, %rsp # Adjust stack(PLT did 2 pushes) +- cfi_adjust_cfa_offset(-72) ++#ifndef __ILP32__ ++ # Restore bound registers. These are nops if Intel MPX isn't ++ # avaiable or disabled. ++# ifdef HAVE_MPX_SUPPORT ++ bndmov REGISTER_SAVE_BND3(%rsp), %bnd3 ++ bndmov REGISTER_SAVE_BND2(%rsp), %bnd2 ++ bndmov REGISTER_SAVE_BND1(%rsp), %bnd1 ++ bndmov REGISTER_SAVE_BND0(%rsp), %bnd0 ++# else ++ .byte 0x66,0x0f,0x1a,0x5c,0x24,REGISTER_SAVE_BND3 ++ .byte 0x66,0x0f,0x1a,0x54,0x24,REGISTER_SAVE_BND2 ++ .byte 0x66,0x0f,0x1a,0x4c,0x24,REGISTER_SAVE_BND1 ++ .byte 0x66,0x0f,0x1a,0x44,0x24,REGISTER_SAVE_BND0 ++# endif ++#endif ++ # Get register content back. ++ movq REGISTER_SAVE_R9(%rsp), %r9 ++ movq REGISTER_SAVE_R8(%rsp), %r8 ++ movq REGISTER_SAVE_RDI(%rsp), %rdi ++ movq REGISTER_SAVE_RSI(%rsp), %rsi ++ movq REGISTER_SAVE_RDX(%rsp), %rdx ++ movq REGISTER_SAVE_RCX(%rsp), %rcx ++ movq REGISTER_SAVE_RAX(%rsp), %rax ++ # Adjust stack(PLT did 2 pushes) ++ addq $(REGISTER_SAVE_AREA + 16), %rsp ++ cfi_adjust_cfa_offset(-(REGISTER_SAVE_AREA + 16)) + jmp *%r11 # Jump to function address. + cfi_endproc + .size _dl_runtime_resolve, .-_dl_runtime_resolve +@@ -130,6 +189,20 @@ + movaps %xmm6, (LR_XMM_OFFSET + XMM_SIZE*6)(%rsp) + movaps %xmm7, (LR_XMM_OFFSET + XMM_SIZE*7)(%rsp) + ++# ifndef __ILP32__ ++# ifdef HAVE_MPX_SUPPORT ++ bndmov %bnd0, (LR_BND_OFFSET)(%rsp) # Preserve bound ++ bndmov %bnd1, (LR_BND_OFFSET + BND_SIZE)(%rsp) # registers. Nops if ++ bndmov %bnd2, (LR_BND_OFFSET + BND_SIZE*2)(%rsp) # MPX not available ++ bndmov %bnd3, (LR_BND_OFFSET + BND_SIZE*3)(%rsp) # or disabled. ++# else ++ .byte 0x66,0x0f,0x1b,0x84,0x24;.long (LR_BND_OFFSET) ++ .byte 0x66,0x0f,0x1b,0x8c,0x24;.long (LR_BND_OFFSET + BND_SIZE) ++ .byte 0x66,0x0f,0x1b,0x84,0x24;.long (LR_BND_OFFSET + BND_SIZE*2) ++ .byte 0x66,0x0f,0x1b,0x8c,0x24;.long (LR_BND_OFFSET + BND_SIZE*3) ++# endif ++# endif ++ + # if defined HAVE_AVX_SUPPORT || defined HAVE_AVX512_ASM_SUPPORT + .data + L(have_avx): +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym +--- glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym 2014-09-10 23:26:03.468045806 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym 2014-09-10 23:27:41.535851922 -0400 +@@ -6,6 +6,7 @@ + XMM_SIZE sizeof (La_x86_64_xmm) + YMM_SIZE sizeof (La_x86_64_ymm) + ZMM_SIZE sizeof (La_x86_64_zmm) ++BND_SIZE sizeof (__int128) + + LR_SIZE sizeof (struct La_x86_64_regs) + LR_RDX_OFFSET offsetof (struct La_x86_64_regs, lr_rdx) +@@ -18,6 +19,9 @@ + LR_RSP_OFFSET offsetof (struct La_x86_64_regs, lr_rsp) + LR_XMM_OFFSET offsetof (struct La_x86_64_regs, lr_xmm) + LR_VECTOR_OFFSET offsetof (struct La_x86_64_regs, lr_vector) ++#ifndef __ILP32__ ++LR_BND_OFFSET offsetof (struct La_x86_64_regs, lr_bnd) ++#endif + + LRV_SIZE sizeof (struct La_x86_64_retval) + LRV_RAX_OFFSET offsetof (struct La_x86_64_retval, lrv_rax) +@@ -28,3 +32,7 @@ + LRV_ST1_OFFSET offsetof (struct La_x86_64_retval, lrv_st1) + LRV_VECTOR0_OFFSET offsetof (struct La_x86_64_retval, lrv_vector0) + LRV_VECTOR1_OFFSET offsetof (struct La_x86_64_retval, lrv_vector1) ++#ifndef __ILP32__ ++LRV_BND0_OFFSET offsetof (struct La_x86_64_retval, lrv_bnd0) ++LRV_BND1_OFFSET offsetof (struct La_x86_64_retval, lrv_bnd1) ++#endif diff --git a/SOURCES/glibc-rh1133812-1.patch b/SOURCES/glibc-rh1133812-1.patch new file mode 100644 index 0000000..963e6a4 --- /dev/null +++ b/SOURCES/glibc-rh1133812-1.patch @@ -0,0 +1,208 @@ +commit a1a6a401ab0a3c9f15fb7eaebbdcee24192254e8 +Author: Florian Weimer <fweimer@redhat.com> +Date: Tue Aug 26 19:38:59 2014 +0200 + + __gconv_translit_find: Disable function [BZ #17187] + + This functionality has never worked correctly, and the implementation + contained a security vulnerability (CVE-2014-5119). + +2014-08-21 Florian Weimer <fweimer@redhat.com> + + [BZ #17187] + * iconv/gconv_trans.c (struct known_trans, search_tree, lock, + trans_compare, open_translit, __gconv_translit_find): + Remove module loading code. + +diff --git glibc-2.17-c758a686/iconv/gconv_trans.c glibc-2.17-c758a686/iconv/gconv_trans.c +index 1e25854..d71c029 100644 +--- glibc-2.17-c758a686/iconv/gconv_trans.c ++++ glibc-2.17-c758a686/iconv/gconv_trans.c +@@ -238,181 +238,11 @@ __gconv_transliterate (struct __gconv_step *step, + return __GCONV_ILLEGAL_INPUT; + } + +- +-/* Structure to represent results of found (or not) transliteration +- modules. */ +-struct known_trans +-{ +- /* This structure must remain the first member. */ +- struct trans_struct info; +- +- char *fname; +- void *handle; +- int open_count; +-}; +- +- +-/* Tree with results of previous calls to __gconv_translit_find. */ +-static void *search_tree; +- +-/* We modify global data. */ +-__libc_lock_define_initialized (static, lock); +- +- +-/* Compare two transliteration entries. */ +-static int +-trans_compare (const void *p1, const void *p2) +-{ +- const struct known_trans *s1 = (const struct known_trans *) p1; +- const struct known_trans *s2 = (const struct known_trans *) p2; +- +- return strcmp (s1->info.name, s2->info.name); +-} +- +- +-/* Open (maybe reopen) the module named in the struct. Get the function +- and data structure pointers we need. */ +-static int +-open_translit (struct known_trans *trans) +-{ +- __gconv_trans_query_fct queryfct; +- +- trans->handle = __libc_dlopen (trans->fname); +- if (trans->handle == NULL) +- /* Not available. */ +- return 1; +- +- /* Find the required symbol. */ +- queryfct = __libc_dlsym (trans->handle, "gconv_trans_context"); +- if (queryfct == NULL) +- { +- /* We cannot live with that. */ +- close_and_out: +- __libc_dlclose (trans->handle); +- trans->handle = NULL; +- return 1; +- } +- +- /* Get the context. */ +- if (queryfct (trans->info.name, &trans->info.csnames, &trans->info.ncsnames) +- != 0) +- goto close_and_out; +- +- /* Of course we also have to have the actual function. */ +- trans->info.trans_fct = __libc_dlsym (trans->handle, "gconv_trans"); +- if (trans->info.trans_fct == NULL) +- goto close_and_out; +- +- /* Now the optional functions. */ +- trans->info.trans_init_fct = +- __libc_dlsym (trans->handle, "gconv_trans_init"); +- trans->info.trans_context_fct = +- __libc_dlsym (trans->handle, "gconv_trans_context"); +- trans->info.trans_end_fct = +- __libc_dlsym (trans->handle, "gconv_trans_end"); +- +- trans->open_count = 1; +- +- return 0; +-} +- +- + int + internal_function + __gconv_translit_find (struct trans_struct *trans) + { +- struct known_trans **found; +- const struct path_elem *runp; +- int res = 1; +- +- /* We have to have a name. */ +- assert (trans->name != NULL); +- +- /* Acquire the lock. */ +- __libc_lock_lock (lock); +- +- /* See whether we know this module already. */ +- found = __tfind (trans, &search_tree, trans_compare); +- if (found != NULL) +- { +- /* Is this module available? */ +- if ((*found)->handle != NULL) +- { +- /* Maybe we have to reopen the file. */ +- if ((*found)->handle != (void *) -1) +- /* The object is not unloaded. */ +- res = 0; +- else if (open_translit (*found) == 0) +- { +- /* Copy the data. */ +- *trans = (*found)->info; +- (*found)->open_count++; +- res = 0; +- } +- } +- } +- else +- { +- size_t name_len = strlen (trans->name) + 1; +- int need_so = 0; +- struct known_trans *newp; +- +- /* We have to continue looking for the module. */ +- if (__gconv_path_elem == NULL) +- __gconv_get_path (); +- +- /* See whether we have to append .so. */ +- if (name_len <= 4 || memcmp (&trans->name[name_len - 4], ".so", 3) != 0) +- need_so = 1; +- +- /* Create a new entry. */ +- newp = (struct known_trans *) malloc (sizeof (struct known_trans) +- + (__gconv_max_path_elem_len +- + name_len + 3) +- + name_len); +- if (newp != NULL) +- { +- char *cp; +- +- /* Clear the struct. */ +- memset (newp, '\0', sizeof (struct known_trans)); +- +- /* Store a copy of the module name. */ +- newp->info.name = cp = (char *) (newp + 1); +- cp = __mempcpy (cp, trans->name, name_len); +- +- newp->fname = cp; +- +- /* Search in all the directories. */ +- for (runp = __gconv_path_elem; runp->name != NULL; ++runp) +- { +- cp = __mempcpy (__stpcpy ((char *) newp->fname, runp->name), +- trans->name, name_len); +- if (need_so) +- memcpy (cp, ".so", sizeof (".so")); +- +- if (open_translit (newp) == 0) +- { +- /* We found a module. */ +- res = 0; +- break; +- } +- } +- +- if (res) +- newp->fname = NULL; +- +- /* In any case we'll add the entry to our search tree. */ +- if (__tsearch (newp, &search_tree, trans_compare) == NULL) +- { +- /* Yickes, this should not happen. Unload the object. */ +- res = 1; +- /* XXX unload here. */ +- } +- } +- } +- +- __libc_lock_unlock (lock); +- +- return res; ++ /* This function always fails. Transliteration module loading is ++ not implemented. */ ++ return 1; + } +-- +1.9.3 + diff --git a/SOURCES/glibc-rh1133812-2.patch b/SOURCES/glibc-rh1133812-2.patch new file mode 100644 index 0000000..63e3557 --- /dev/null +++ b/SOURCES/glibc-rh1133812-2.patch @@ -0,0 +1,631 @@ +commit 585367266923156ac6fb789939a923641ba5aaf4 +Author: Florian Weimer <fweimer@redhat.com> +Date: Wed May 28 14:05:03 2014 +0200 + + manual: Update the locale documentation + +commit 4e8f95a0df7c2300b830ec12c0ae1e161bc8a8a3 +Author: Florian Weimer <fweimer@redhat.com> +Date: Mon May 12 15:24:12 2014 +0200 + + _nl_find_locale: Improve handling of crafted locale names [BZ #17137] + + Prevent directory traversal in locale-related environment variables + (CVE-2014-0475). + +commit d183645616b0533b3acee28f1a95570bffbdf50f +Author: Florian Weimer <fweimer@redhat.com> +Date: Wed May 28 14:41:52 2014 +0200 + + setlocale: Use the heap for the copy of the locale argument + + This avoids alloca calls with potentially large arguments. + +diff -pruN glibc-2.17-c758a686/locale/findlocale.c glibc-2.17-c758a686/locale/findlocale.c +--- glibc-2.17-c758a686/locale/findlocale.c 2013-08-11 04:22:55.000000000 +0530 ++++ glibc-2.17-c758a686/locale/findlocale.c 2014-08-26 16:14:50.403253778 +0530 +@@ -17,6 +17,7 @@ + <http://www.gnu.org/licenses/>. */ + + #include <assert.h> ++#include <errno.h> + #include <locale.h> + #include <stdlib.h> + #include <string.h> +@@ -57,6 +58,45 @@ struct loaded_l10nfile *_nl_locale_file_ + + const char _nl_default_locale_path[] attribute_hidden = LOCALEDIR; + ++/* Checks if the name is actually present, that is, not NULL and not ++ empty. */ ++static inline int ++name_present (const char *name) ++{ ++ return name != NULL && name[0] != '\0'; ++} ++ ++/* Checks that the locale name neither extremely long, nor contains a ++ ".." path component (to prevent directory traversal). */ ++static inline int ++valid_locale_name (const char *name) ++{ ++ /* Not set. */ ++ size_t namelen = strlen (name); ++ /* Name too long. The limit is arbitrary and prevents stack overflow ++ issues later. */ ++ if (__glibc_unlikely (namelen > 255)) ++ return 0; ++ /* Directory traversal attempt. */ ++ static const char slashdot[4] = {'/', '.', '.', '/'}; ++ if (__glibc_unlikely (memmem (name, namelen, ++ slashdot, sizeof (slashdot)) != NULL)) ++ return 0; ++ if (namelen == 2 && __glibc_unlikely (name[0] == '.' && name [1] == '.')) ++ return 0; ++ if (namelen >= 3 ++ && __glibc_unlikely (((name[0] == '.' ++ && name[1] == '.' ++ && name[2] == '/') ++ || (name[namelen - 3] == '/' ++ && name[namelen - 2] == '.' ++ && name[namelen - 1] == '.')))) ++ return 0; ++ /* If there is a slash in the name, it must start with one. */ ++ if (__glibc_unlikely (memchr (name, '/', namelen) != NULL) && name[0] != '/') ++ return 0; ++ return 1; ++} + + struct __locale_data * + internal_function +@@ -65,7 +105,7 @@ _nl_find_locale (const char *locale_path + { + int mask; + /* Name of the locale for this category. */ +- char *loc_name; ++ char *loc_name = (char *) *name; + const char *language; + const char *modifier; + const char *territory; +@@ -73,31 +113,39 @@ _nl_find_locale (const char *locale_path + const char *normalized_codeset; + struct loaded_l10nfile *locale_file; + +- if ((*name)[0] == '\0') ++ if (loc_name[0] == '\0') + { + /* The user decides which locale to use by setting environment + variables. */ +- *name = getenv ("LC_ALL"); +- if (*name == NULL || (*name)[0] == '\0') +- *name = getenv (_nl_category_names.str ++ loc_name = getenv ("LC_ALL"); ++ if (!name_present (loc_name)) ++ loc_name = getenv (_nl_category_names.str + + _nl_category_name_idxs[category]); +- if (*name == NULL || (*name)[0] == '\0') +- *name = getenv ("LANG"); ++ if (!name_present (loc_name)) ++ loc_name = getenv ("LANG"); ++ if (!name_present (loc_name)) ++ loc_name = (char *) _nl_C_name; + } + +- if (*name == NULL || (*name)[0] == '\0' +- || (__builtin_expect (__libc_enable_secure, 0) +- && strchr (*name, '/') != NULL)) +- *name = (char *) _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 (*name, _nl_C_name), 1) == 0 +- || __builtin_expect (strcmp (*name, _nl_POSIX_name), 1) == 0) ++ if (__builtin_expect (strcmp (loc_name, _nl_C_name), 1) == 0 ++ || __builtin_expect (strcmp (loc_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; + return _nl_C[category]; + } ++ else if (!valid_locale_name (loc_name)) ++ { ++ __set_errno (EINVAL); ++ return NULL; ++ } ++ ++ *name = loc_name; + + /* We really have to load some data. First we try the archive, + but only if there was no LOCPATH environment variable specified. */ +diff -pruN glibc-2.17-c758a686/locale/setlocale.c glibc-2.17-c758a686/locale/setlocale.c +--- glibc-2.17-c758a686/locale/setlocale.c 2013-08-11 04:22:55.000000000 +0530 ++++ glibc-2.17-c758a686/locale/setlocale.c 2014-08-26 16:14:50.401253764 +0530 +@@ -272,6 +272,8 @@ setlocale (int category, const char *loc + of entries of the form `CATEGORY=VALUE'. */ + const char *newnames[__LC_LAST]; + struct __locale_data *newdata[__LC_LAST]; ++ /* Copy of the locale argument, for in-place splitting. */ ++ char *locale_copy = NULL; + + /* Set all name pointers to the argument name. */ + for (category = 0; category < __LC_LAST; ++category) +@@ -281,7 +283,13 @@ setlocale (int category, const char *loc + if (__builtin_expect (strchr (locale, ';') != NULL, 0)) + { + /* This is a composite name. Make a copy and split it up. */ +- char *np = strdupa (locale); ++ locale_copy = strdup (locale); ++ if (__glibc_unlikely (locale_copy == NULL)) ++ { ++ __libc_rwlock_unlock (__libc_setlocale_lock); ++ return NULL; ++ } ++ char *np = locale_copy; + char *cp; + int cnt; + +@@ -299,6 +307,7 @@ setlocale (int category, const char *loc + { + error_return: + __libc_rwlock_unlock (__libc_setlocale_lock); ++ free (locale_copy); + + /* Bogus category name. */ + ERROR_RETURN; +@@ -391,8 +400,9 @@ setlocale (int category, const char *loc + /* Critical section left. */ + __libc_rwlock_unlock (__libc_setlocale_lock); + +- /* Free the resources (the locale path variable). */ ++ /* Free the resources. */ + free (locale_path); ++ free (locale_copy); + + return composite; + } +diff -pruN glibc-2.17-c758a686/localedata/Makefile glibc-2.17-c758a686/localedata/Makefile +--- glibc-2.17-c758a686/localedata/Makefile 2014-08-26 16:15:22.656474571 +0530 ++++ glibc-2.17-c758a686/localedata/Makefile 2014-08-26 16:14:50.403253778 +0530 +@@ -77,7 +77,7 @@ locale_test_suite := tst_iswalnum tst_is + + tests = $(locale_test_suite) tst-digits tst-setlocale bug-iconv-trans \ + tst-leaks tst-mbswcs6 tst-xlocale1 tst-xlocale2 bug-usesetlocale \ +- tst-strfmon1 tst-sscanf bug-setlocale1 tst-setlocale2 ++ tst-strfmon1 tst-sscanf bug-setlocale1 tst-setlocale2 tst-setlocale3 + ifeq (yes,$(build-shared)) + ifneq (no,$(PERL)) + tests: $(objpfx)mtrace-tst-leaks +diff -pruN glibc-2.17-c758a686/localedata/tst-setlocale3.c glibc-2.17-c758a686/localedata/tst-setlocale3.c +--- glibc-2.17-c758a686/localedata/tst-setlocale3.c 1970-01-01 05:30:00.000000000 +0530 ++++ glibc-2.17-c758a686/localedata/tst-setlocale3.c 2014-08-26 16:14:50.403253778 +0530 +@@ -0,0 +1,203 @@ ++/* Regression test for setlocale invalid environment variable handling. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <locale.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++ ++/* The result of setlocale may be overwritten by subsequent calls, so ++ this wrapper makes a copy. */ ++static char * ++setlocale_copy (int category, const char *locale) ++{ ++ const char *result = setlocale (category, locale); ++ if (result == NULL) ++ return NULL; ++ return strdup (result); ++} ++ ++static char *de_locale; ++ ++static void ++setlocale_fail (const char *envstring) ++{ ++ setenv ("LC_CTYPE", envstring, 1); ++ if (setlocale (LC_CTYPE, "") != NULL) ++ { ++ printf ("unexpected setlocale success for \"%s\" locale\n", envstring); ++ exit (1); ++ } ++ const char *newloc = setlocale (LC_CTYPE, NULL); ++ if (strcmp (newloc, de_locale) != 0) ++ { ++ printf ("failed setlocale call \"%s\" changed locale to \"%s\"\n", ++ envstring, newloc); ++ exit (1); ++ } ++} ++ ++static void ++setlocale_success (const char *envstring) ++{ ++ setenv ("LC_CTYPE", envstring, 1); ++ char *newloc = setlocale_copy (LC_CTYPE, ""); ++ if (newloc == NULL) ++ { ++ printf ("setlocale for \"%s\": %m\n", envstring); ++ exit (1); ++ } ++ if (strcmp (newloc, de_locale) == 0) ++ { ++ printf ("setlocale with LC_CTYPE=\"%s\" left locale at \"%s\"\n", ++ envstring, de_locale); ++ exit (1); ++ } ++ if (setlocale (LC_CTYPE, de_locale) == NULL) ++ { ++ printf ("restoring locale \"%s\" with LC_CTYPE=\"%s\": %m\n", ++ de_locale, envstring); ++ exit (1); ++ } ++ char *newloc2 = setlocale_copy (LC_CTYPE, newloc); ++ if (newloc2 == NULL) ++ { ++ printf ("restoring locale \"%s\" following \"%s\": %m\n", ++ newloc, envstring); ++ exit (1); ++ } ++ if (strcmp (newloc, newloc2) != 0) ++ { ++ printf ("representation of locale \"%s\" changed from \"%s\" to \"%s\"", ++ envstring, newloc, newloc2); ++ exit (1); ++ } ++ free (newloc); ++ free (newloc2); ++ ++ if (setlocale (LC_CTYPE, de_locale) == NULL) ++ { ++ printf ("restoring locale \"%s\" with LC_CTYPE=\"%s\": %m\n", ++ de_locale, envstring); ++ exit (1); ++ } ++} ++ ++/* Checks that a known-good locale still works if LC_ALL contains a ++ value which should be ignored. */ ++static void ++setlocale_ignore (const char *to_ignore) ++{ ++ const char *fr_locale = "fr_FR.UTF-8"; ++ setenv ("LC_CTYPE", fr_locale, 1); ++ char *expected_locale = setlocale_copy (LC_CTYPE, ""); ++ if (expected_locale == NULL) ++ { ++ printf ("setlocale with LC_CTYPE=\"%s\" failed: %m\n", fr_locale); ++ exit (1); ++ } ++ if (setlocale (LC_CTYPE, de_locale) == NULL) ++ { ++ printf ("failed to restore locale: %m\n"); ++ exit (1); ++ } ++ unsetenv ("LC_CTYPE"); ++ ++ setenv ("LC_ALL", to_ignore, 1); ++ setenv ("LC_CTYPE", fr_locale, 1); ++ const char *actual_locale = setlocale (LC_CTYPE, ""); ++ if (actual_locale == NULL) ++ { ++ printf ("setlocale with LC_ALL, LC_CTYPE=\"%s\" failed: %m\n", ++ fr_locale); ++ exit (1); ++ } ++ if (strcmp (actual_locale, expected_locale) != 0) ++ { ++ printf ("setlocale under LC_ALL failed: got \"%s\", expected \"%s\"\n", ++ actual_locale, expected_locale); ++ exit (1); ++ } ++ unsetenv ("LC_CTYPE"); ++ setlocale_success (fr_locale); ++ unsetenv ("LC_ALL"); ++ free (expected_locale); ++} ++ ++static int ++do_test (void) ++{ ++ /* The glibc test harness sets this environment variable ++ uncondionally. */ ++ unsetenv ("LC_ALL"); ++ ++ de_locale = setlocale_copy (LC_CTYPE, "de_DE.UTF-8"); ++ if (de_locale == NULL) ++ { ++ printf ("setlocale (LC_CTYPE, \"de_DE.UTF-8\"): %m\n"); ++ return 1; ++ } ++ setlocale_success ("C"); ++ setlocale_success ("en_US.UTF-8"); ++ setlocale_success ("/en_US.UTF-8"); ++ setlocale_success ("//en_US.UTF-8"); ++ setlocale_ignore (""); ++ ++ setlocale_fail ("does-not-exist"); ++ setlocale_fail ("/"); ++ setlocale_fail ("/../localedata/en_US.UTF-8"); ++ setlocale_fail ("en_US.UTF-8/"); ++ setlocale_fail ("en_US.UTF-8/.."); ++ setlocale_fail ("en_US.UTF-8/../en_US.UTF-8"); ++ setlocale_fail ("../localedata/en_US.UTF-8"); ++ { ++ size_t large_length = 1024; ++ char *large_name = malloc (large_length + 1); ++ if (large_name == NULL) ++ { ++ puts ("malloc failure"); ++ return 1; ++ } ++ memset (large_name, '/', large_length); ++ const char *suffix = "en_US.UTF-8"; ++ strcpy (large_name + large_length - strlen (suffix), suffix); ++ setlocale_fail (large_name); ++ free (large_name); ++ } ++ { ++ size_t huge_length = 64 * 1024 * 1024; ++ char *huge_name = malloc (huge_length + 1); ++ if (huge_name == NULL) ++ { ++ puts ("malloc failure"); ++ return 1; ++ } ++ memset (huge_name, 'X', huge_length); ++ huge_name[huge_length] = '\0'; ++ /* Construct a composite locale specification. */ ++ const char *prefix = "LC_CTYPE=de_DE.UTF-8;LC_TIME="; ++ memcpy (huge_name, prefix, strlen (prefix)); ++ setlocale_fail (huge_name); ++ free (huge_name); ++ } ++ ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff -pruN glibc-2.17-c758a686/manual/locale.texi glibc-2.17-c758a686/manual/locale.texi +--- glibc-2.17-c758a686/manual/locale.texi 2013-08-11 04:22:55.000000000 +0530 ++++ glibc-2.17-c758a686/manual/locale.texi 2014-08-26 16:14:50.404253785 +0530 +@@ -29,6 +29,7 @@ will follow the conventions preferred by + * Setting the Locale:: How a program specifies the locale + with library functions. + * Standard Locales:: Locale names available on all systems. ++* Locale Names:: Format of system-specific locale names. + * Locale Information:: How to access the information for the locale. + * Formatting Numbers:: A dedicated function to format numbers. + * Yes-or-No Questions:: Check a Response against the locale. +@@ -99,14 +100,16 @@ locale named @samp{espana-castellano} to + most of Spain. + + The set of locales supported depends on the operating system you are +-using, and so do their names. We can't make any promises about what +-locales will exist, except for one standard locale called @samp{C} or +-@samp{POSIX}. Later we will describe how to construct locales. +-@comment (@pxref{Building Locale Files}). ++using, and so do their names, except that the standard locale called ++@samp{C} or @samp{POSIX} always exist. @xref{Locale Names}. ++ ++In order to force the system to always use the default locale, the ++user can set the @code{LC_ALL} environment variable to @samp{C}. + + @cindex combining locales +-A user also has the option of specifying different locales for different +-purposes---in effect, choosing a mixture of multiple locales. ++A user also has the option of specifying different locales for ++different purposes---in effect, choosing a mixture of multiple ++locales. @xref{Locale Categories}. + + For example, the user might specify the locale @samp{espana-castellano} + for most purposes, but specify the locale @samp{usa-english} for +@@ -120,7 +123,7 @@ which locales apply. However, the user + for a particular subset of those purposes. + + @node Locale Categories, Setting the Locale, Choosing Locale, Locales +-@section Categories of Activities that Locales Affect ++@section Locale Categories + @cindex categories for locales + @cindex locale categories + +@@ -128,7 +131,11 @@ The purposes that locales serve are grou + that a user or a program can choose the locale for each category + independently. Here is a table of categories; each name is both an + environment variable that a user can set, and a macro name that you can +-use as an argument to @code{setlocale}. ++use as the first argument to @code{setlocale}. ++ ++The contents of the environment variable (or the string in the second ++argument to @code{setlocale}) has to be a valid locale name. ++@xref{Locale Names}. + + @vtable @code + @comment locale.h +@@ -172,7 +179,7 @@ for affirmative and negative responses. + @comment locale.h + @comment ISO + @item LC_ALL +-This is not an environment variable; it is only a macro that you can use ++This is not a category; it is only a macro that you can use + with @code{setlocale} to set a single locale for all purposes. Setting + this environment variable overwrites all selections by the other + @code{LC_*} variables or @code{LANG}. +@@ -225,13 +232,7 @@ The symbols in this section are defined + @comment ISO + @deftypefun {char *} setlocale (int @var{category}, const char *@var{locale}) + The function @code{setlocale} sets the current locale for category +-@var{category} to @var{locale}. A list of all the locales the system +-provides can be created by running +- +-@pindex locale +-@smallexample +- locale -a +-@end smallexample ++@var{category} to @var{locale}. + + If @var{category} is @code{LC_ALL}, this specifies the locale for all + purposes. The other possible values of @var{category} specify an +@@ -256,10 +257,9 @@ is passed in as @var{locale} parameter. + + When you read the current locale for category @code{LC_ALL}, the value + encodes the entire combination of selected locales for all categories. +-In this case, the value is not just a single locale name. In fact, we +-don't make any promises about what it looks like. But if you specify +-the same ``locale name'' with @code{LC_ALL} in a subsequent call to +-@code{setlocale}, it restores the same combination of locale selections. ++If you specify the same ``locale name'' with @code{LC_ALL} in a ++subsequent call to @code{setlocale}, it restores the same combination ++of locale selections. + + To be sure you can use the returned string encoding the currently selected + locale at a later time, you must make a copy of the string. It is not +@@ -275,20 +275,15 @@ for @var{category}. + If a nonempty string is given for @var{locale}, then the locale of that + name is used if possible. + ++The effective locale name (either the second argument to ++@code{setlocale}, or if the argument is an empty string, the name ++obtained from the process environment) must be valid locale name. ++@xref{Locale Names}. ++ + If you specify an invalid locale name, @code{setlocale} returns a null + pointer and leaves the current locale unchanged. + @end deftypefun + +-The path used for finding locale data can be set using the +-@code{LOCPATH} environment variable. The default path for finding +-locale data is system specific. It is computed from the value given +-as the prefix while configuring the C library. This value normally is +-@file{/usr} or @file{/}. For the former the complete path is: +- +-@smallexample +-/usr/lib/locale +-@end smallexample +- + Here is an example showing how you might use @code{setlocale} to + temporarily switch to a new locale. + +@@ -328,7 +323,7 @@ locale categories, and future versions o + portability, assume that any symbol beginning with @samp{LC_} might be + defined in @file{locale.h}. + +-@node Standard Locales, Locale Information, Setting the Locale, Locales ++@node Standard Locales, Locale Names, Setting the Locale, Locales + @section Standard Locales + + The only locale names you can count on finding on all operating systems +@@ -362,7 +357,94 @@ with the environment, rather than trying + locale explicitly by name. Remember, different machines might have + different sets of locales installed. + +-@node Locale Information, Formatting Numbers, Standard Locales, Locales ++@node Locale Names, Locale Information, Standard Locales, Locales ++@section Locale Names ++ ++The following command prints a list of locales supported by the ++system: ++ ++@pindex locale ++@smallexample ++ locale -a ++@end smallexample ++ ++@strong{Portability Note:} With the notable exception of the standard ++locale names @samp{C} and @samp{POSIX}, locale names are ++system-specific. ++ ++Most locale names follow XPG syntax and consist of up to four parts: ++ ++@smallexample ++@var{language}[_@var{territory}[.@var{codeset}]][@@@var{modifier}] ++@end smallexample ++ ++Beside the first part, all of them are allowed to be missing. If the ++full specified locale is not found, less specific ones are looked for. ++The various parts will be stripped off, in the following order: ++ ++@enumerate ++@item ++codeset ++@item ++normalized codeset ++@item ++territory ++@item ++modifier ++@end enumerate ++ ++For example, the locale name @samp{de_AT.iso885915@@euro} denotes a ++German-language locale for use in Austria, using the ISO-8859-15 ++(Latin-9) character set, and with the Euro as the currency symbol. ++ ++In addition to locale names which follow XPG syntax, systems may ++provide aliases such as @samp{german}. Both categories of names must ++not contain the slash character @samp{/}. ++ ++If the locale name starts with a slash @samp{/}, it is treated as a ++path relative to the configured locale directories; see @code{LOCPATH} ++below. The specified path must not contain a component @samp{..}, or ++the name is invalid, and @code{setlocale} will fail. ++ ++@strong{Portability Note:} POSIX suggests that if a locale name starts ++with a slash @samp{/}, it is resolved as an absolute path. However, ++@theglibc{} treats it as a relative path under the directories listed ++in @code{LOCPATH} (or the default locale directory if @code{LOCPATH} ++is unset). ++ ++Locale names which are longer than an implementation-defined limit are ++invalid and cause @code{setlocale} to fail. ++ ++As a special case, locale names used with @code{LC_ALL} can combine ++several locales, reflecting different locale settings for different ++categories. For example, you might want to use a U.S. locale with ISO ++A4 paper format, so you set @code{LANG} to @samp{en_US.UTF-8}, and ++@code{LC_PAPER} to @samp{de_DE.UTF-8}. In this case, the ++@code{LC_ALL}-style combined locale name is ++ ++@smallexample ++LC_CTYPE=en_US.UTF-8;LC_TIME=en_US.UTF-8;LC_PAPER=de_DE.UTF-8;@dots{} ++@end smallexample ++ ++followed by other category settings not shown here. ++ ++@vindex LOCPATH ++The path used for finding locale data can be set using the ++@code{LOCPATH} environment variable. This variable lists the ++directories in which to search for locale definitions, separated by a ++colon @samp{:}. ++ ++The default path for finding locale data is system specific. A typical ++value for the @code{LOCPATH} default is: ++ ++@smallexample ++/usr/share/locale ++@end smallexample ++ ++The value of @code{LOCPATH} is ignored by privileged programs for ++security reasons, and only the default directory is used. ++ ++@node Locale Information, Formatting Numbers, Locale Names, Locales + @section Accessing Locale Information + + There are several ways to access locale information. The simplest diff --git a/SOURCES/glibc-rh1133812-3.patch b/SOURCES/glibc-rh1133812-3.patch new file mode 100644 index 0000000..c94a5ff --- /dev/null +++ b/SOURCES/glibc-rh1133812-3.patch @@ -0,0 +1,474 @@ +commit 2bf1804182cc4bd671193587c8d5e3de45a9618e +Author: Joseph Myers <joseph@codesourcery.com> +Date: Wed Jun 4 23:37:25 2014 +0000 + + Include LOCPATH in default test environment. + + Tests run using the default $(make-test-out) automatically get + GCONV_PATH and LC_ALL set, whether or not those environment variables + are actually needed for the individual test. However, they do not get + LOCPATH set, meaning that a large number of tests have -ENV settings + just to set LOCPATH. + + This patch moves LOCPATH into the default environment used for all + tests, on the principle that like GCONV_PATH any settings needed to + use files associated with the newly built library, rather than any old + installed files, are appropriate to use by default. + + A further motivation is that various tests using .sh files also set + some combination of LC_ALL, GCONV_PATH and LOCPATH. Preferably .sh + files should also use the default environment with any additions + required for the individual test. Now, it was suggested in + <https://sourceware.org/ml/libc-alpha/2014-05/msg00715.html> that + various Makefile variables used in testing should be derived by + composing the -before-env and -after-env variables used when explicit + environment settings are required. With such a change, it's also + natural for those variables to include the default settings (via some + intermediate makefile variable also used in make-test-out). + + Because some .sh files only set variables that correspond to the + default settings, or a subset thereof, and this applies to more of the + .sh files once LOCPATH is in the default settings, doing so reduces + the size of a revised version of + <https://sourceware.org/ml/libc-alpha/2014-05/msg00596.html>: scripts + only needing the (expanded) default settings will not need to receive + the separate -before-env and -after-env variables, only the single + variable they do at present. So moving LOCPATH into the default + settings can reduce churn caused by subsequent patches. + + Tested x86_64 and x86. + + * Rules (make-test-out): Include + LOCPATH=$(common-objpfx)localedata in default environment. + * debug/Makefile (tst-chk1-ENV): Remove variable. + (tst-chk2-ENV): Likewise. + (tst-chk3-ENV): Likewise. + (tst-chk4-ENV): Likewise. + (tst-chk5-ENV): Likewise. + (tst-chk6-ENV): Likewise. + (tst-lfschk1-ENV): Likewise. + (tst-lfschk2-ENV): Likewise. + (tst-lfschk3-ENV): Likewise. + (tst-lfschk4-ENV): Likewise. + (tst-lfschk5-ENV): Likewise. + (tst-lfschk6-ENV): Likewise. + * iconvdata/Makefile (bug-iconv6-ENV): Likewise. + (tst-iconv7-ENV): Likewise. + * intl/Makefile (LOCPATH-ENV): Likewise. + (tst-codeset-ENV): Likewise. + (tst-gettext3-ENV): Likewise. + (tst-gettext5-ENV): Likewise. + * libio/Makefile (tst-widetext-ENV): Don't set LOCPATH. + (tst-fopenloc-ENV): Likewise. + (tst-fgetws-ENV): Remove variable. + (tst-ungetwc1-ENV): Likewise. + (tst-ungetwc2-ENV): Likewise. + (bug-ungetwc2-ENV): Likewise. + (tst-swscanf-ENV): Likewise. + (bug-ftell-ENV): Likewise. + (tst-fgetwc-ENV): Likewise. + (tst-fseek-ENV): Likewise. + (tst-ftell-partial-wide-ENV): Likewise. + (tst-ftell-active-handler-ENV): Likewise. + (tst-ftell-append-ENV): Likewise. + * posix/Makefile (tst-fnmatch-ENV): Likewise. + (tst-regexloc-ENV): Likewise. + (bug-regex1-ENV): Likewise. + (tst-regex-ENV): Likewise. + (tst-regex2-ENV): Likewise. + (bug-regex5-ENV): Likewise. + (bug-regex6-ENV): Likewise. + (bug-regex17-ENV): Likewise. + (bug-regex18-ENV): Likewise. + (bug-regex19-ENV): Likewise. + (bug-regex20-ENV): Likewise. + (bug-regex22-ENV): Likewise. + (bug-regex23-ENV): Likewise. + (bug-regex25-ENV): Likewise. + (bug-regex26-ENV): Likewise. + (bug-regex30-ENV): Likewise. + (bug-regex32-ENV): Likewise. + (bug-regex33-ENV): Likewise. + (bug-regex34-ENV): Likewise. + (bug-regex35-ENV): Likewise. + (tst-rxspencer-ENV): Likewise. + (tst-rxspencer-no-utf8-ENV): Likewise. + * stdio-common/Makefile (tst-sprintf-ENV): Likewise. + (tst-sscanf-ENV): Likewise. + (tst-swprintf-ENV): Likewise. + (tst-swscanf-ENV): Likewise. + (test-vfprintf-ENV): Likewise. + (scanf13-ENV): Likewise. + (bug14-ENV): Likewise. + (tst-grouping-ENV): Likewise. + * stdlib/Makefile (tst-strtod-ENV): Likewise. + (tst-strtod3-ENV): Likewise. + (tst-strtod4-ENV): Likewise. + (tst-strtod5-ENV): Likewise. + (testmb2-ENV): Likewise./ + * string/Makefile (tst-strxfrm-ENV): Likewise. + (tst-strxfrm2-ENV): Likewise. + (bug-strcoll1-ENV): Likewise. + (test-strcasecmp-ENV): Likewise. + (test-strncasecmp-ENV): Likewise. + * time/Makefile (tst-strptime-ENV): Likewise. + (tst-ftime_l-ENV): Likewise. + * wcsmbs/Makefile (tst-btowc-ENV): Likewise. + (tst-mbrtowc-ENV): Likewise. + (tst-wcrtomb-ENV): Likewise. + (tst-mbrtowc2-ENV): Likewise. + (tst-c16c32-1-ENV): Likewise. + (tst-mbsnrtowcs-ENV): Likewise. + + localedata/ChangeLog: + * Makefile (TEST_MBWC_ENV): Remove variable. + (tst_iswalnum-ENV): Likewise. + (tst_iswalpha-ENV): Likewise. + (tst_iswcntrl-ENV): Likewise. + (tst_iswctype-ENV): Likewise. + (tst_iswdigit-ENV): Likewise. + (tst_iswgraph-ENV): Likewise. + (tst_iswlower-ENV): Likewise. + (tst_iswprint-ENV): Likewise. + (tst_iswpunct-ENV): Likewise. + (tst_iswspace-ENV): Likewise. + (tst_iswupper-ENV): Likewise. + (tst_iswxdigit-ENV): Likewise. + (tst_mblen-ENV): Likewise. + (tst_mbrlen-ENV): Likewise. + (tst_mbrtowc-ENV): Likewise. + (tst_mbsrtowcs-ENV): Likewise. + (tst_mbstowcs-ENV): Likewise. + (tst_mbtowc-ENV): Likewise. + (tst_strcoll-ENV): Likewise. + (tst_strfmon-ENV): Likewise. + (tst_strxfrm-ENV): Likewise. + (tst_swscanf-ENV): Likewise. + (tst_towctrans-ENV): Likewise. + (tst_towlower-ENV): Likewise. + (tst_towupper-ENV): Likewise. + (tst_wcrtomb-ENV): Likewise. + (tst_wcscat-ENV): Likewise. + (tst_wcschr-ENV): Likewise. + (tst_wcscmp-ENV): Likewise. + (tst_wcscoll-ENV): Likewise. + (tst_wcscpy-ENV): Likewise. + (tst_wcscspn-ENV): Likewise. + (tst_wcslen-ENV): Likewise. + (tst_wcsncat-ENV): Likewise. + (tst_wcsncmp-ENV): Likewise. + (tst_wcsncpy-ENV): Likewise. + (tst_wcspbrk-ENV): Likewise. + (tst_wcsrtombs-ENV): Likewise. + (tst_wcsspn-ENV): Likewise. + (tst_wcsstr-ENV): Likewise. + (tst_wcstod-ENV): Likewise. + (tst_wcstok-ENV): Likewise. + (tst_wcstombs-ENV): Likewise. + (tst_wcswidth-ENV): Likewise. + (tst_wcsxfrm-ENV): Likewise. + (tst_wctob-ENV): Likewise. + (tst_wctomb-ENV): Likewise. + (tst_wctrans-ENV): Likewise. + (tst_wctype-ENV): Likewise. + (tst_wcwidth-ENV): Likewise. + (tst-digits-ENV): Likewise. + (tst-mbswcs6-ENV): Likewise. + (tst-xlocale1-ENV): Likewise. + (tst-xlocale2-ENV): Likewise. + (tst-strfmon1-ENV): Likewise. + (tst-strptime-ENV): Likewise. + (tst-setlocale-ENV): Don't set LOCPATH. + (bug-iconv-trans-ENV): Remove variable. + (tst-sscanf-ENV): Likewise. + (tst-leaks-ENV): Don't set LOCPATH. + (bug-setlocale1-ENV): Remove variable. + (bug-setlocale1-static-ENV): Likewise. + (tst-setlocale2-ENV): Likewise. + +diff --git glibc-2.17-c758a686/Rules glibc-2.17-c758a686/Rules +index feb304d..9f1a445 100644 +--- glibc-2.17-c758a686/Rules ++++ glibc-2.17-c758a686/Rules +@@ -191,7 +191,8 @@ ifneq "$(strip $(tests) $(xtests) $(test-srcs))" "" + # from the test programs and whatever input files are present. + + make-test-out = $(test-wrapper-env) \ +- GCONV_PATH=$(common-objpfx)iconvdata LC_ALL=C \ ++ GCONV_PATH=$(common-objpfx)iconvdata \ ++ LOCPATH=$(common-objpfx)localedata LC_ALL=C \ + $($*-ENV) $(host-built-program-cmd) $($*-ARGS) + $(objpfx)%-bp.out: %.input $(objpfx)%-bp + $(make-test-out) > $@ < $(word 1,$^) +diff --git glibc-2.17-c758a686/debug/Makefile glibc-2.17-c758a686/debug/Makefile +index b599a22..c284c51 100644 +--- glibc-2.17-c758a686/debug/Makefile ++++ glibc-2.17-c758a686/debug/Makefile +@@ -109,18 +109,6 @@ CFLAGS-tst-lfschk3.c = -Wno-format + CFLAGS-tst-lfschk4.cc = -Wno-format + CFLAGS-tst-lfschk5.cc = -Wno-format + CFLAGS-tst-lfschk6.cc = -Wno-format +-tst-chk1-ENV = LOCPATH=$(common-objpfx)localedata +-tst-chk2-ENV = LOCPATH=$(common-objpfx)localedata +-tst-chk3-ENV = LOCPATH=$(common-objpfx)localedata +-tst-chk4-ENV = LOCPATH=$(common-objpfx)localedata +-tst-chk5-ENV = LOCPATH=$(common-objpfx)localedata +-tst-chk6-ENV = LOCPATH=$(common-objpfx)localedata +-tst-lfschk1-ENV = LOCPATH=$(common-objpfx)localedata +-tst-lfschk2-ENV = LOCPATH=$(common-objpfx)localedata +-tst-lfschk3-ENV = LOCPATH=$(common-objpfx)localedata +-tst-lfschk4-ENV = LOCPATH=$(common-objpfx)localedata +-tst-lfschk5-ENV = LOCPATH=$(common-objpfx)localedata +-tst-lfschk6-ENV = LOCPATH=$(common-objpfx)localedata + LDLIBS-tst-chk4 = -lstdc++ + LDLIBS-tst-chk5 = -lstdc++ + LDLIBS-tst-chk6 = -lstdc++ +diff --git glibc-2.17-c758a686/iconvdata/Makefile glibc-2.17-c758a686/iconvdata/Makefile +index 074d330..d98b6bd 100644 +--- glibc-2.17-c758a686/iconvdata/Makefile ++++ glibc-2.17-c758a686/iconvdata/Makefile +@@ -73,9 +73,6 @@ tests += bug-iconv3 + endif + + test-srcs := tst-table-from tst-table-to +- +-bug-iconv6-ENV = LOCPATH=$(common-objpfx)localedata +-tst-iconv7-ENV = LOCPATH=$(common-objpfx)localedata + endif + + # No code here is in libc.so. +diff --git glibc-2.17-c758a686/intl/Makefile glibc-2.17-c758a686/intl/Makefile +index f11449d..10051f6 100644 +--- glibc-2.17-c758a686/intl/Makefile ++++ glibc-2.17-c758a686/intl/Makefile +@@ -118,11 +118,6 @@ CFLAGS-tst-gettext4.c = -DOBJPFX=\"$(objpfx)\" + CFLAGS-tst-gettext5.c = -DOBJPFX=\"$(objpfx)\" + CFLAGS-tst-gettext6.c = -DOBJPFX=\"$(objpfx)\" + +-LOCPATH-ENV = LOCPATH=$(common-objpfx)localedata +-tst-codeset-ENV = $(LOCPATH-ENV) +-tst-gettext3-ENV = $(LOCPATH-ENV) +-tst-gettext5-ENV = $(LOCPATH-ENV) +- + ifeq ($(have-thread-library),yes) + ifeq (yes,$(build-shared)) + $(addprefix $(objpfx),$(multithread-test-srcs)): $(shared-thread-library) +diff --git glibc-2.17-c758a686/libio/Makefile glibc-2.17-c758a686/libio/Makefile +index b324ccc..4552360 100644 +--- glibc-2.17-c758a686/libio/Makefile ++++ glibc-2.17-c758a686/libio/Makefile +@@ -148,17 +148,8 @@ CFLAGS-tst_putwc.c = -DOBJPFX=\"$(objpfx)\" + + tst_wprintf2-ARGS = "Some Text" + +-tst-widetext-ENV = LOCPATH=$(common-objpfx)localedata LANGUAGE=C +-tst-fopenloc-ENV = LOCPATH=$(common-objpfx)localedata \ +- MALLOC_TRACE=$(objpfx)tst-fopenloc.mtrace +-tst-fgetws-ENV = LOCPATH=$(common-objpfx)localedata +-tst-ungetwc1-ENV = LOCPATH=$(common-objpfx)localedata +-tst-ungetwc2-ENV = LOCPATH=$(common-objpfx)localedata +-bug-ungetwc2-ENV = LOCPATH=$(common-objpfx)localedata +-tst-swscanf-ENV = LOCPATH=$(common-objpfx)localedata +-bug-ftell-ENV = LOCPATH=$(common-objpfx)localedata +-tst-fgetwc-ENV = LOCPATH=$(common-objpfx)localedata +-tst-fseek-ENV = LOCPATH=$(common-objpfx)localedata ++tst-widetext-ENV = LANGUAGE=C ++tst-fopenloc-ENV = MALLOC_TRACE=$(objpfx)tst-fopenloc.mtrace + + generated = tst-fopenloc.mtrace tst-fopenloc.check + +diff --git glibc-2.17-c758a686/localedata/Makefile glibc-2.17-c758a686/localedata/Makefile +index d7ab445..20da00c 100644 +--- glibc-2.17-c758a686/localedata/Makefile ++++ glibc-2.17-c758a686/localedata/Makefile +@@ -215,79 +215,13 @@ + $(addprefix --prefix=,$(install_root)) $$locale; \ + echo ' done'; \ + +-# The mbwc-tests need some environment setup to find the locale data files +-TEST_MBWC_ENV:= LOCPATH=$(common-objpfx)localedata +-tst_iswalnum-ENV = $(TEST_MBWC_ENV) +-tst_iswalpha-ENV = $(TEST_MBWC_ENV) +-tst_iswcntrl-ENV = $(TEST_MBWC_ENV) +-tst_iswctype-ENV = $(TEST_MBWC_ENV) +-tst_iswdigit-ENV = $(TEST_MBWC_ENV) +-tst_iswgraph-ENV = $(TEST_MBWC_ENV) +-tst_iswlower-ENV = $(TEST_MBWC_ENV) +-tst_iswprint-ENV = $(TEST_MBWC_ENV) +-tst_iswpunct-ENV = $(TEST_MBWC_ENV) +-tst_iswspace-ENV = $(TEST_MBWC_ENV) +-tst_iswupper-ENV = $(TEST_MBWC_ENV) +-tst_iswxdigit-ENV = $(TEST_MBWC_ENV) +-tst_mblen-ENV = $(TEST_MBWC_ENV) +-tst_mbrlen-ENV = $(TEST_MBWC_ENV) +-tst_mbrtowc-ENV = $(TEST_MBWC_ENV) +-tst_mbsrtowcs-ENV = $(TEST_MBWC_ENV) +-tst_mbstowcs-ENV = $(TEST_MBWC_ENV) +-tst_mbtowc-ENV = $(TEST_MBWC_ENV) +-tst_strcoll-ENV = $(TEST_MBWC_ENV) +-tst_strfmon-ENV = $(TEST_MBWC_ENV) +-tst_strxfrm-ENV = $(TEST_MBWC_ENV) +-tst_swscanf-ENV = $(TEST_MBWC_ENV) +-tst_towctrans-ENV = $(TEST_MBWC_ENV) +-tst_towlower-ENV = $(TEST_MBWC_ENV) +-tst_towupper-ENV = $(TEST_MBWC_ENV) +-tst_wcrtomb-ENV = $(TEST_MBWC_ENV) +-tst_wcscat-ENV = $(TEST_MBWC_ENV) +-tst_wcschr-ENV = $(TEST_MBWC_ENV) +-tst_wcscmp-ENV = $(TEST_MBWC_ENV) +-tst_wcscoll-ENV = $(TEST_MBWC_ENV) +-tst_wcscpy-ENV = $(TEST_MBWC_ENV) +-tst_wcscspn-ENV = $(TEST_MBWC_ENV) +-tst_wcslen-ENV = $(TEST_MBWC_ENV) +-tst_wcsncat-ENV = $(TEST_MBWC_ENV) +-tst_wcsncmp-ENV = $(TEST_MBWC_ENV) +-tst_wcsncpy-ENV = $(TEST_MBWC_ENV) +-tst_wcspbrk-ENV = $(TEST_MBWC_ENV) +-tst_wcsrtombs-ENV = $(TEST_MBWC_ENV) +-tst_wcsspn-ENV = $(TEST_MBWC_ENV) +-tst_wcsstr-ENV = $(TEST_MBWC_ENV) +-tst_wcstod-ENV = $(TEST_MBWC_ENV) +-tst_wcstok-ENV = $(TEST_MBWC_ENV) +-tst_wcstombs-ENV = $(TEST_MBWC_ENV) +-tst_wcswidth-ENV = $(TEST_MBWC_ENV) +-tst_wcsxfrm-ENV = $(TEST_MBWC_ENV) +-tst_wctob-ENV = $(TEST_MBWC_ENV) +-tst_wctomb-ENV = $(TEST_MBWC_ENV) +-tst_wctrans-ENV = $(TEST_MBWC_ENV) +-tst_wctype-ENV = $(TEST_MBWC_ENV) +-tst_wcwidth-ENV = $(TEST_MBWC_ENV) +-tst-digits-ENV = $(TEST_MBWC_ENV) +-tst-mbswcs6-ENV = $(TEST_MBWC_ENV) +-tst-xlocale1-ENV = $(TEST_MBWC_ENV) +-tst-xlocale2-ENV = $(TEST_MBWC_ENV) +-tst-strfmon1-ENV = $(TEST_MBWC_ENV) +-tst-strptime-ENV = $(TEST_MBWC_ENV) ++tst-setlocale-ENV = LC_ALL=ja_JP.EUC-JP + +-tst-setlocale-ENV = LOCPATH=$(common-objpfx)localedata LC_ALL=ja_JP.EUC-JP +- +-bug-iconv-trans-ENV = LOCPATH=$(common-objpfx)localedata +- +-tst-sscanf-ENV = LOCPATH=$(common-objpfx)localedata +- +-tst-leaks-ENV = MALLOC_TRACE=$(objpfx)tst-leaks.mtrace \ +- LOCPATH=$(common-objpfx)localedata ++tst-leaks-ENV = MALLOC_TRACE=$(objpfx)tst-leaks.mtrace + $(objpfx)mtrace-tst-leaks: $(objpfx)tst-leaks.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-leaks.mtrace > $@ + +-bug-setlocale1-ENV = LOCPATH=$(common-objpfx)localedata + bug-setlocale1-ARGS = $(common-objpfx) +-tst-setlocale2-ENV = LOCPATH=$(common-objpfx)localedata + + $(objdir)/iconvdata/gconv-modules: + $(MAKE) -C ../iconvdata subdir=iconvdata $@ +diff --git glibc-2.17-c758a686/posix/Makefile glibc-2.17-c758a686/posix/Makefile +index 328c2c5..3d75971 100644 +--- glibc-2.17-c758a686/posix/Makefile ++++ glibc-2.17-c758a686/posix/Makefile +@@ -203,27 +203,7 @@ tst-dir-ARGS = `pwd` `cd $(common-objdir)/$(subdir); pwd` `cd $(common-objdir); + tst-chmod-ARGS = $(objdir) + tst-vfork3-ARGS = --test-dir=$(objpfx) + +-tst-fnmatch-ENV = LOCPATH=$(common-objpfx)localedata +-tst-regexloc-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex1-ENV = LOCPATH=$(common-objpfx)localedata +-tst-regex-ENV = LOCPATH=$(common-objpfx)localedata +-tst-regex2-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex5-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex6-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex17-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex18-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex19-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex20-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex22-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex23-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex25-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex26-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex30-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex32-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex33-ENV = LOCPATH=$(common-objpfx)localedata +-bug-regex34-ENV = LOCPATH=$(common-objpfx)localedata + tst-rxspencer-ARGS = --utf8 rxspencer/tests +-tst-rxspencer-ENV = LOCPATH=$(common-objpfx)localedata + tst-pcre-ARGS = PCRE.tests + tst-boost-ARGS = BOOST.tests + bug-glob1-ARGS = "$(objpfx)" +diff --git glibc-2.17-c758a686/stdio-common/Makefile glibc-2.17-c758a686/stdio-common/Makefile +index f179eab..5f8e534 100644 +--- glibc-2.17-c758a686/stdio-common/Makefile ++++ glibc-2.17-c758a686/stdio-common/Makefile +@@ -118,13 +118,6 @@ CFLAGS-scanf17.c = -I../libio -I../stdlib -I../wcsmbs -I../time -I../string \ + + # We know the test has a format string problem. + CFLAGS-tst-sprintf.c = -Wno-format +-tst-sprintf-ENV = LOCPATH=$(common-objpfx)localedata +-tst-sscanf-ENV = LOCPATH=$(common-objpfx)localedata +-tst-swprintf-ENV = LOCPATH=$(common-objpfx)localedata +-test-vfprintf-ENV = LOCPATH=$(common-objpfx)localedata +-scanf13-ENV = LOCPATH=$(common-objpfx)localedata +-bug14-ENV = LOCPATH=$(common-objpfx)localedata +-tst-grouping-ENV = LOCPATH=$(common-objpfx)localedata + + CPPFLAGS += $(libio-mtsafe) + +diff --git glibc-2.17-c758a686/stdlib/Makefile glibc-2.17-c758a686/stdlib/Makefile +index d7a562f..0fdf7cc 100644 +--- glibc-2.17-c758a686/stdlib/Makefile ++++ glibc-2.17-c758a686/stdlib/Makefile +@@ -123,11 +123,6 @@ include ../Rules + # Testdir has to be named stdlib and needs to be writable + test-canon-ARGS = --test-dir=${common-objpfx}stdlib + +-tst-strtod-ENV = LOCPATH=$(common-objpfx)localedata +-tst-strtod3-ENV = LOCPATH=$(common-objpfx)localedata +-tst-strtod4-ENV = LOCPATH=$(common-objpfx)localedata +-tst-strtod5-ENV = LOCPATH=$(common-objpfx)localedata +-testmb2-ENV = LOCPATH=$(common-objpfx)localedata + bug-fmtmsg1-ENV = SEV_LEVEL=foo,11,newsev + + # Run a test on the header files we use. +diff --git glibc-2.17-c758a686/string/Makefile glibc-2.17-c758a686/string/Makefile +index 5a76872..70b9c19 100644 +--- glibc-2.17-c758a686/string/Makefile ++++ glibc-2.17-c758a686/string/Makefile +@@ -67,9 +67,6 @@ include ../Rules + tester-ENV = LANGUAGE=C + inl-tester-ENV = LANGUAGE=C + noinl-tester-ENV = LANGUAGE=C +-tst-strxfrm-ENV = LOCPATH=$(common-objpfx)localedata +-tst-strxfrm2-ENV = LOCPATH=$(common-objpfx)localedata +-bug-strcoll1-ENV = LOCPATH=$(common-objpfx)localedata + CFLAGS-inl-tester.c = -fno-builtin + CFLAGS-noinl-tester.c = -fno-builtin + CFLAGS-tst-strlen.c = -fno-builtin +diff --git glibc-2.17-c758a686/time/Makefile glibc-2.17-c758a686/time/Makefile +index b7f3dba..a07c041 100644 +--- glibc-2.17-c758a686/time/Makefile ++++ glibc-2.17-c758a686/time/Makefile +@@ -55,7 +55,4 @@ CFLAGS-test_time.c = -Wno-format + tst-getdate-ENV= DATEMSK=datemsk TZDIR=${common-objpfx}timezone/testdata + test_time-ARGS= EST5EDT CST + +-tst-strptime-ENV = LOCPATH=${common-objpfx}localedata +-tst-ftime_l-ENV = LOCPATH=${common-objpfx}localedata +- + bug-getdate1-ARGS = ${objpfx}bug-getdate1-fmt +diff --git glibc-2.17-c758a686/wcsmbs/Makefile glibc-2.17-c758a686/wcsmbs/Makefile +index 197ca7d..42843a6 100644 +--- glibc-2.17-c758a686/wcsmbs/Makefile ++++ glibc-2.17-c758a686/wcsmbs/Makefile +@@ -80,10 +80,3 @@ CPPFLAGS += $(libio-mtsafe) + + # We need to find the default version of strtold_l in stdlib. + CPPFLAGS-wcstold_l.c = -I../stdlib +- +-tst-btowc-ENV = LOCPATH=$(common-objpfx)localedata +-tst-mbrtowc-ENV = LOCPATH=$(common-objpfx)localedata +-tst-wcrtomb-ENV = LOCPATH=$(common-objpfx)localedata +-tst-mbrtowc2-ENV = LOCPATH=$(common-objpfx)localedata +-tst-c16c32-1-ENV = LOCPATH=$(common-objpfx)localedata +-tst-mbsnrtowcs-ENV = LOCPATH=$(common-objpfx)localedata +--- glibc-2.17-c758a686/localedata/Makefile 2014-08-26 21:38:56.564751630 +0530 ++++ glibc-2.17-c758a686/localedata/Makefile.new 2014-08-26 21:40:16.596223207 +0530 diff --git a/SOURCES/glibc-rh1138520.patch b/SOURCES/glibc-rh1138520.patch new file mode 100644 index 0000000..1ddb051 --- /dev/null +++ b/SOURCES/glibc-rh1138520.patch @@ -0,0 +1,145 @@ +commit af37a8a3496327a6e5617a2c76f17aa1e8db835e +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Mon Jan 27 11:32:44 2014 +0530 + + Avoid undefined behaviour in netgroupcache + + Using a buffer after it has been reallocated is undefined behaviour, + so get offsets of the triplets in the old buffer before reallocating + it. + +commit 5d41dadf31bc8a2f9c34c40d52a442d3794e405c +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Fri Jan 24 13:51:15 2014 +0530 + + Adjust pointers to triplets in netgroup query data (BZ #16474) + + The _nss_*_getnetgrent_r query populates the netgroup results in the + allocated buffer and then sets the result triplet to point to strings + in the buffer. This is a problem when the buffer is reallocated since + the pointers to the triplet strings are no longer valid. The pointers + need to be adjusted so that they now point to strings in the + reallocated buffer. + +commit 980cb5180e1b71224a57ca52b995c959b7148c09 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Jan 16 10:20:22 2014 +0530 + + Don't use alloca in addgetnetgrentX (BZ #16453) + + addgetnetgrentX has a buffer which is grown as per the needs of the + requested size either by using alloca or by falling back to malloc if + the size is larger than 1K. There are two problems with the alloca + bits: firstly, it doesn't really extend the buffer since it does not + use the return value of the extend_alloca macro, which is the location + of the reallocated buffer. Due to this the buffer does not actually + extend itself and hence a subsequent write may overwrite stuff on the + stack. + + The second problem is more subtle - the buffer growth on the stack is + discontinuous due to block scope local variables. Combine that with + the fact that unlike realloc, extend_alloca does not copy over old + content and you have a situation where the buffer just has garbage in + the space where it should have had data. + + This could have been fixed by adding code to copy over old data + whenever we call extend_alloca, but it seems unnecessarily + complicated. This code is not exactly a performance hotspot (it's + called when there is a cache miss, so factors like network lookup or + file reads will dominate over memory allocation/reallocation), so this + premature optimization is unnecessary. + + Thanks Brad Hubbard <bhubbard@redhat.com> for his help with debugging + the problem. + +diff -pruN glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +--- glibc-2.17-c758a686/nscd/netgroupcache.c 2014-04-09 12:13:58.618582111 +0530 ++++ glibc-2.17-c758a686/nscd/netgroupcache.c 2014-04-09 12:07:21.486598665 +0530 +@@ -93,7 +93,6 @@ addgetnetgrentX (struct database_dyn *db + size_t buffilled = sizeof (*dataset); + char *buffer = NULL; + size_t nentries = 0; +- bool use_malloc = false; + size_t group_len = strlen (key) + 1; + union + { +@@ -138,7 +137,7 @@ addgetnetgrentX (struct database_dyn *db + } + + memset (&data, '\0', sizeof (data)); +- buffer = alloca (buflen); ++ buffer = xmalloc (buflen); + first_needed.elem.next = &first_needed.elem; + memcpy (first_needed.elem.name, key, group_len); + data.needed_groups = &first_needed.elem; +@@ -218,21 +217,24 @@ addgetnetgrentX (struct database_dyn *db + + if (buflen - req->key_len - bufused < needed) + { +- size_t newsize = MAX (2 * buflen, +- buflen + 2 * needed); +- if (use_malloc || newsize > 1024 * 1024) +- { +- buflen = newsize; +- char *newbuf = xrealloc (use_malloc +- ? buffer +- : NULL, +- buflen); +- +- buffer = newbuf; +- use_malloc = true; +- } +- else +- extend_alloca (buffer, buflen, newsize); ++ buflen += MAX (buflen, 2 * needed); ++ /* Save offset in the old buffer. We don't ++ bother with the NULL check here since ++ we'll do that later anyway. */ ++ size_t nhostdiff = nhost - buffer; ++ size_t nuserdiff = nuser - buffer; ++ size_t ndomaindiff = ndomain - buffer; ++ ++ char *newbuf = xrealloc (buffer, buflen); ++ /* Fix up the triplet pointers into the new ++ buffer. */ ++ nhost = (nhost ? newbuf + nhostdiff ++ : NULL); ++ nuser = (nuser ? newbuf + nuserdiff ++ : NULL); ++ ndomain = (ndomain ? newbuf + ndomaindiff ++ : NULL); ++ buffer = newbuf; + } + + nhost = memcpy (buffer + bufused, +@@ -299,18 +301,8 @@ addgetnetgrentX (struct database_dyn *db + } + else if (status == NSS_STATUS_UNAVAIL && e == ERANGE) + { +- size_t newsize = 2 * buflen; +- if (use_malloc || newsize > 1024 * 1024) +- { +- buflen = newsize; +- char *newbuf = xrealloc (use_malloc +- ? buffer : NULL, buflen); +- +- buffer = newbuf; +- use_malloc = true; +- } +- else +- extend_alloca (buffer, buflen, newsize); ++ buflen *= 2; ++ buffer = xrealloc (buffer, buflen); + } + } + +@@ -446,8 +438,7 @@ addgetnetgrentX (struct database_dyn *db + } + + out: +- if (use_malloc) +- free (buffer); ++ free (buffer); + + *resultp = dataset; + 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 <fweimer@redhat.com> +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 <eggert@cs.ucla.edu> +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 <errno.h> + #include <fcntl.h> + #include <unistd.h> ++#include <stdint.h> ++#include <sys/fcntl.h> + #include <sys/stat.h> + #include <sys/statfs.h> + +-/* 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 <errno.h> + #include <fcntl.h> + #include <unistd.h> ++#include <stdint.h> ++#include <sys/fcntl.h> + #include <sys/stat.h> + #include <sys/statfs.h> + +-/* 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-rh1140272-avx512.patch b/SOURCES/glibc-rh1140272-avx512.patch new file mode 100644 index 0000000..5905e7b --- /dev/null +++ b/SOURCES/glibc-rh1140272-avx512.patch @@ -0,0 +1,1158 @@ +# +# AVX-512 support for glibc: +# +# Notes: Renamed configure.ac changes to configure.in. +# +# commit aa4de9cea5c07d43caeaca9722c2d417e9a2919c +# Author: H.J. Lu <hjl.tools@gmail.com> +# Date: Fri Mar 14 08:51:25 2014 -0700 +# +# Check AVX-512 assembler support first +# +# It checks AVX-512 assembler support first and sets libc_cv_cc_avx512 to +# $libc_cv_asm_avx512, instead of yes. GCC won't support AVX-512 if +# assembler doesn't support it. +# +# * sysdeps/x86_64/configure.ac: Check AVX-512 assembler support +# first. Disable AVX-512 GCC support if assembler doesn't support +# it. +# * sysdeps/x86_64/configure: Regenerated. +# +# commit 2d63a517e4084ec80403cd9f278690fa8b676cc4 +# Author: Igor Zamyatin <igor.zamyatin@intel.com> +# Date: Thu Mar 13 11:10:22 2014 -0700 +# +# Save and restore AVX-512 zmm registers to x86-64 ld.so +# +# AVX-512 ISA adds 512-bit zmm registers. This patch updates +# _dl_runtime_profile to pass zmm registers to run-time audit. It also +# changes _dl_x86_64_save_sse and _dl_x86_64_restore_sse to upport zmm +# registers, which are called when only when RTLD_PREPARE_FOREIGN_CALL +# is used. Its performance impact is minimum. +# +# * config.h.in (HAVE_AVX512_SUPPORT): New #undef. +# (HAVE_AVX512_ASM_SUPPORT): Likewise. +# * sysdeps/x86_64/bits/link.h (La_x86_64_zmm): New. +# (La_x86_64_vector): Add zmm. +# * sysdeps/x86_64/Makefile (tests): Add tst-audit10. +# (modules-names): Add tst-auditmod10a and tst-auditmod10b. +# ($(objpfx)tst-audit10): New target. +# ($(objpfx)tst-audit10.out): Likewise. +# (tst-audit10-ENV): New. +# (AVX512-CFLAGS): Likewise. +# (CFLAGS-tst-audit10.c): Likewise. +# (CFLAGS-tst-auditmod10a.c): Likewise. +# (CFLAGS-tst-auditmod10b.c): Likewise. +# * sysdeps/x86_64/configure.ac: Set config-cflags-avx512, +# HAVE_AVX512_SUPPORT and HAVE_AVX512_ASM_SUPPORT. +# * sysdeps/x86_64/configure: Regenerated. +# * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Add +# AVX-512 zmm register support. +# (_dl_x86_64_save_sse): Likewise. +# (_dl_x86_64_restore_sse): Likewise. +# * sysdeps/x86_64/dl-trampoline.h: Updated to support different +# size vector registers. +# * sysdeps/x86_64/link-defines.sym (YMM_SIZE): New. +# (ZMM_SIZE): Likewise. +# * sysdeps/x86_64/tst-audit10.c: New file. +# * sysdeps/x86_64/tst-auditmod10a.c: Likewise. +# * sysdeps/x86_64/tst-auditmod10b.c: Likewise. +# +# In addition adds: +# https://sourceware.org/ml/libc-alpha/2014-09/msg00228.html +# To extend zmm register checking. +# +diff -urN glibc-2.17-c758a686/config.h.in glibc-2.17-c758a686/config.h.in +--- glibc-2.17-c758a686/config.h.in 2014-09-10 23:11:14.605787816 -0400 ++++ glibc-2.17-c758a686/config.h.in 2014-09-10 23:16:36.331167056 -0400 +@@ -101,6 +101,12 @@ + /* Define if gcc supports VEX encoding. */ + #undef HAVE_SSE2AVX_SUPPORT + ++/* Define if compiler supports AVX512. */ ++#undef HAVE_AVX512_SUPPORT ++ ++/* Define if assembler supports AVX512. */ ++#undef HAVE_AVX512_ASM_SUPPORT ++ + /* Define if gcc supports FMA4. */ + #undef HAVE_FMA4_SUPPORT + +diff -urN glibc-2.17-c758a686/sysdeps/x86/bits/link.h glibc-2.17-c758a686/sysdeps/x86/bits/link.h +--- glibc-2.17-c758a686/sysdeps/x86/bits/link.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86/bits/link.h 2014-09-10 23:16:36.331167056 -0400 +@@ -66,6 +66,8 @@ + typedef float La_x86_64_xmm __attribute__ ((__vector_size__ (16))); + typedef float La_x86_64_ymm + __attribute__ ((__vector_size__ (32), __aligned__ (16))); ++typedef double La_x86_64_zmm ++ __attribute__ ((__vector_size__ (64), __aligned__ (16))); + # else + typedef float La_x86_64_xmm __attribute__ ((__mode__ (__V4SF__))); + # endif +@@ -74,6 +76,7 @@ + { + # if __GNUC_PREREQ (4,0) + La_x86_64_ymm ymm[2]; ++ La_x86_64_zmm zmm[1]; + # endif + La_x86_64_xmm xmm[4]; + } La_x86_64_vector __attribute__ ((__aligned__ (16))); +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/configure glibc-2.17-c758a686/sysdeps/x86_64/configure +--- glibc-2.17-c758a686/sysdeps/x86_64/configure 2014-09-10 23:11:15.000787061 -0400 ++++ glibc-2.17-c758a686/sysdeps/x86_64/configure 2014-09-10 23:16:36.338167042 -0400 +@@ -91,6 +91,59 @@ + + fi + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for AVX512 support in assembler" >&5 ++$as_echo_n "checking for AVX512 support in assembler... " >&6; } ++if ${libc_cv_asm_avx512+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat > conftest.s <<\EOF ++ vmovdqu64 %zmm0, (%rsp) ++EOF ++if { ac_try='${CC-cc} -c $ASFLAGS conftest.s 1>&5' ++ { { 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_avx512=yes ++else ++ libc_cv_asm_avx512=no ++fi ++rm -f conftest* ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_avx512" >&5 ++$as_echo "$libc_cv_asm_avx512" >&6; } ++if test $libc_cv_asm_avx512 == yes; then ++ $as_echo "#define HAVE_AVX512_ASM_SUPPORT 1" >>confdefs.h ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for AVX512 support" >&5 ++$as_echo_n "checking for AVX512 support... " >&6; } ++if ${libc_cv_cc_avx512+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if { ac_try='${CC-cc} -mavx512f -xc /dev/null -S -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_cc_avx512=$libc_cv_asm_avx512 ++else ++ libc_cv_cc_avx512=no ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_avx512" >&5 ++$as_echo "$libc_cv_cc_avx512" >&6; } ++if test $libc_cv_cc_avx512 = yes; then ++ $as_echo "#define HAVE_AVX512_SUPPORT 1" >>confdefs.h ++ ++fi ++config_vars="$config_vars ++config-cflags-avx512 = $libc_cv_cc_avx512" ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for AVX encoding of SSE instructions" >&5 + $as_echo_n "checking for AVX encoding of SSE instructions... " >&6; } + if ${libc_cv_cc_sse2avx+:} false; then : +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/configure.in glibc-2.17-c758a686/sysdeps/x86_64/configure.in +--- glibc-2.17-c758a686/sysdeps/x86_64/configure.in 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/configure.in 2014-09-10 23:16:36.338167042 -0400 +@@ -21,6 +21,30 @@ + AC_DEFINE(HAVE_AVX_SUPPORT) + fi + ++dnl Check if asm supports AVX512. ++AC_CACHE_CHECK(for AVX512 support in assembler, libc_cv_asm_avx512, [dnl ++cat > conftest.s <<\EOF ++ vmovdqu64 %zmm0, (%rsp) ++EOF ++if AC_TRY_COMMAND(${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then ++ libc_cv_asm_avx512=yes ++else ++ libc_cv_asm_avx512=no ++fi ++rm -f conftest*]) ++if test $libc_cv_asm_avx512 == yes; then ++ AC_DEFINE(HAVE_AVX512_ASM_SUPPORT) ++fi ++ ++dnl Check if -mavx512f works. ++AC_CACHE_CHECK(for AVX512 support, libc_cv_cc_avx512, [dnl ++LIBC_TRY_CC_OPTION([-mavx512f], [libc_cv_cc_avx512=$libc_cv_asm_avx512], [libc_cv_cc_avx512=no]) ++]) ++if test $libc_cv_cc_avx512 = yes; then ++ AC_DEFINE(HAVE_AVX512_SUPPORT) ++fi ++LIBC_CONFIG_VAR([config-cflags-avx512], [$libc_cv_cc_avx512]) ++ + dnl Check if -msse2avx works. + AC_CACHE_CHECK(for AVX encoding of SSE instructions, libc_cv_cc_sse2avx, [dnl + LIBC_TRY_CC_OPTION([-msse2avx], +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h +--- glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.h 2014-09-10 23:16:36.334167050 -0400 +@@ -19,14 +19,14 @@ + + #ifdef RESTORE_AVX + /* This is to support AVX audit modules. */ +- vmovdqu %ymm0, (LR_VECTOR_OFFSET)(%rsp) +- vmovdqu %ymm1, (LR_VECTOR_OFFSET + VECTOR_SIZE)(%rsp) +- vmovdqu %ymm2, (LR_VECTOR_OFFSET + VECTOR_SIZE*2)(%rsp) +- vmovdqu %ymm3, (LR_VECTOR_OFFSET + VECTOR_SIZE*3)(%rsp) +- vmovdqu %ymm4, (LR_VECTOR_OFFSET + VECTOR_SIZE*4)(%rsp) +- vmovdqu %ymm5, (LR_VECTOR_OFFSET + VECTOR_SIZE*5)(%rsp) +- vmovdqu %ymm6, (LR_VECTOR_OFFSET + VECTOR_SIZE*6)(%rsp) +- vmovdqu %ymm7, (LR_VECTOR_OFFSET + VECTOR_SIZE*7)(%rsp) ++ VMOV %VEC(0), (LR_VECTOR_OFFSET)(%rsp) ++ VMOV %VEC(1), (LR_VECTOR_OFFSET + VECTOR_SIZE)(%rsp) ++ VMOV %VEC(2), (LR_VECTOR_OFFSET + VECTOR_SIZE*2)(%rsp) ++ VMOV %VEC(3), (LR_VECTOR_OFFSET + VECTOR_SIZE*3)(%rsp) ++ VMOV %VEC(4), (LR_VECTOR_OFFSET + VECTOR_SIZE*4)(%rsp) ++ VMOV %VEC(5), (LR_VECTOR_OFFSET + VECTOR_SIZE*5)(%rsp) ++ VMOV %VEC(6), (LR_VECTOR_OFFSET + VECTOR_SIZE*6)(%rsp) ++ VMOV %VEC(7), (LR_VECTOR_OFFSET + VECTOR_SIZE*7)(%rsp) + + /* Save xmm0-xmm7 registers to detect if any of them are + changed by audit module. */ +@@ -72,7 +72,7 @@ + je 2f + vmovdqa %xmm0, (LR_VECTOR_OFFSET)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET)(%rsp), %ymm0 ++2: VMOV (LR_VECTOR_OFFSET)(%rsp), %VEC(0) + vmovdqa %xmm0, (LR_XMM_OFFSET)(%rsp) + + 1: vpcmpeqq (LR_SIZE + XMM_SIZE)(%rsp), %xmm1, %xmm8 +@@ -81,7 +81,7 @@ + je 2f + vmovdqa %xmm1, (LR_VECTOR_OFFSET + VECTOR_SIZE)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET + VECTOR_SIZE)(%rsp), %ymm1 ++2: VMOV (LR_VECTOR_OFFSET + VECTOR_SIZE)(%rsp), %VEC(1) + vmovdqa %xmm1, (LR_XMM_OFFSET + XMM_SIZE)(%rsp) + + 1: vpcmpeqq (LR_SIZE + XMM_SIZE*2)(%rsp), %xmm2, %xmm8 +@@ -90,7 +90,7 @@ + je 2f + vmovdqa %xmm2, (LR_VECTOR_OFFSET + VECTOR_SIZE*2)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET + VECTOR_SIZE*2)(%rsp), %ymm2 ++2: VMOV (LR_VECTOR_OFFSET + VECTOR_SIZE*2)(%rsp), %VEC(2) + vmovdqa %xmm2, (LR_XMM_OFFSET + XMM_SIZE*2)(%rsp) + + 1: vpcmpeqq (LR_SIZE + XMM_SIZE*3)(%rsp), %xmm3, %xmm8 +@@ -99,7 +99,7 @@ + je 2f + vmovdqa %xmm3, (LR_VECTOR_OFFSET + VECTOR_SIZE*3)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET + VECTOR_SIZE*3)(%rsp), %ymm3 ++2: VMOV (LR_VECTOR_OFFSET + VECTOR_SIZE*3)(%rsp), %VEC(3) + vmovdqa %xmm3, (LR_XMM_OFFSET + XMM_SIZE*3)(%rsp) + + 1: vpcmpeqq (LR_SIZE + XMM_SIZE*4)(%rsp), %xmm4, %xmm8 +@@ -108,7 +108,7 @@ + je 2f + vmovdqa %xmm4, (LR_VECTOR_OFFSET + VECTOR_SIZE*4)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET + VECTOR_SIZE*4)(%rsp), %ymm4 ++2: VMOV (LR_VECTOR_OFFSET + VECTOR_SIZE*4)(%rsp), %VEC(4) + vmovdqa %xmm4, (LR_XMM_OFFSET + XMM_SIZE*4)(%rsp) + + 1: vpcmpeqq (LR_SIZE + XMM_SIZE*5)(%rsp), %xmm5, %xmm8 +@@ -117,7 +117,7 @@ + je 2f + vmovdqa %xmm5, (LR_VECTOR_OFFSET + VECTOR_SIZE*5)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET + VECTOR_SIZE*5)(%rsp), %ymm5 ++2: VMOV (LR_VECTOR_OFFSET + VECTOR_SIZE*5)(%rsp), %VEC(5) + vmovdqa %xmm5, (LR_XMM_OFFSET + XMM_SIZE*5)(%rsp) + + 1: vpcmpeqq (LR_SIZE + XMM_SIZE*6)(%rsp), %xmm6, %xmm8 +@@ -126,7 +126,7 @@ + je 2f + vmovdqa %xmm6, (LR_VECTOR_OFFSET + VECTOR_SIZE*6)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET + VECTOR_SIZE*6)(%rsp), %ymm6 ++2: VMOV (LR_VECTOR_OFFSET + VECTOR_SIZE*6)(%rsp), %VEC(6) + vmovdqa %xmm6, (LR_XMM_OFFSET + XMM_SIZE*6)(%rsp) + + 1: vpcmpeqq (LR_SIZE + XMM_SIZE*7)(%rsp), %xmm7, %xmm8 +@@ -135,7 +135,7 @@ + je 2f + vmovdqa %xmm7, (LR_VECTOR_OFFSET + VECTOR_SIZE*7)(%rsp) + jmp 1f +-2: vmovdqu (LR_VECTOR_OFFSET + VECTOR_SIZE*7)(%rsp), %ymm7 ++2: VMOV (LR_VECTOR_OFFSET + VECTOR_SIZE*7)(%rsp), %VEC(7) + vmovdqa %xmm7, (LR_XMM_OFFSET + XMM_SIZE*7)(%rsp) + + 1: +@@ -213,8 +213,8 @@ + + #ifdef RESTORE_AVX + /* This is to support AVX audit modules. */ +- vmovdqu %ymm0, LRV_VECTOR0_OFFSET(%rcx) +- vmovdqu %ymm1, LRV_VECTOR1_OFFSET(%rcx) ++ VMOV %VEC(0), LRV_VECTOR0_OFFSET(%rcx) ++ VMOV %VEC(1), LRV_VECTOR1_OFFSET(%rcx) + + /* Save xmm0/xmm1 registers to detect if they are changed + by audit module. */ +@@ -243,13 +243,13 @@ + vpmovmskb %xmm2, %esi + cmpl $0xffff, %esi + jne 1f +- vmovdqu LRV_VECTOR0_OFFSET(%rsp), %ymm0 ++ VMOV LRV_VECTOR0_OFFSET(%rsp), %VEC(0) + + 1: vpcmpeqq (LRV_SIZE + XMM_SIZE)(%rsp), %xmm1, %xmm2 + vpmovmskb %xmm2, %esi + cmpl $0xffff, %esi + jne 1f +- vmovdqu LRV_VECTOR1_OFFSET(%rsp), %ymm1 ++ VMOV LRV_VECTOR1_OFFSET(%rsp), %VEC(1) + + 1: + #endif +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S +--- glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/dl-trampoline.S 2014-09-10 23:16:36.334167050 -0400 +@@ -96,7 +96,7 @@ + + /* Actively align the La_x86_64_regs structure. */ + andq $0xfffffffffffffff0, %rsp +-# ifdef HAVE_AVX_SUPPORT ++# if defined HAVE_AVX_SUPPORT || defined HAVE_AVX512_ASM_SUPPORT + /* sizeof(La_x86_64_regs). Need extra space for 8 SSE registers + to detect if any xmm0-xmm7 registers are changed by audit + module. */ +@@ -130,7 +130,7 @@ + movaps %xmm6, (LR_XMM_OFFSET + XMM_SIZE*6)(%rsp) + movaps %xmm7, (LR_XMM_OFFSET + XMM_SIZE*7)(%rsp) + +-# ifdef HAVE_AVX_SUPPORT ++# if defined HAVE_AVX_SUPPORT || defined HAVE_AVX512_ASM_SUPPORT + .data + L(have_avx): + .zero 4 +@@ -138,7 +138,7 @@ + .previous + + cmpl $0, L(have_avx)(%rip) +- jne 1f ++ jne L(defined) + movq %rbx, %r11 # Save rbx + movl $1, %eax + cpuid +@@ -147,18 +147,54 @@ + // AVX and XSAVE supported? + andl $((1 << 28) | (1 << 27)), %ecx + cmpl $((1 << 28) | (1 << 27)), %ecx +- jne 2f ++ jne 10f ++# ifdef HAVE_AVX512_ASM_SUPPORT ++ // AVX512 supported in processor? ++ movq %rbx, %r11 # Save rbx ++ xorl %ecx, %ecx ++ mov $0x7, %eax ++ cpuid ++ andl $(1 << 16), %ebx ++# endif + xorl %ecx, %ecx + // Get XFEATURE_ENABLED_MASK + xgetbv +- andl $0x6, %eax +-2: subl $0x5, %eax ++# ifdef HAVE_AVX512_ASM_SUPPORT ++ test %ebx, %ebx ++ movq %r11, %rbx # Restore rbx ++ je 20f ++ // Verify that XCR0[7:5] = '111b' and ++ // XCR0[2:1] = '11b' which means ++ // that zmm state is enabled ++ andl $0xe6, %eax ++ cmpl $0xe6, %eax ++ jne 20f ++ movl %eax, L(have_avx)(%rip) ++L(avx512): ++# define RESTORE_AVX ++# define VMOV vmovdqu64 ++# define VEC(i) zmm##i ++# define MORE_CODE ++# include "dl-trampoline.h" ++# undef VMOV ++# undef VEC ++# undef RESTORE_AVX ++# endif ++20: andl $0x6, %eax ++10: subl $0x5, %eax + movl %eax, L(have_avx)(%rip) + cmpl $0, %eax + +-1: js L(no_avx) ++L(defined): ++ js L(no_avx) ++# ifdef HAVE_AVX512_ASM_SUPPORT ++ cmpl $0xe6, L(have_avx)(%rip) ++ je L(avx512) ++# endif + + # define RESTORE_AVX ++# define VMOV vmovdqu ++# define VEC(i) ymm##i + # define MORE_CODE + # include "dl-trampoline.h" + +@@ -180,9 +216,9 @@ + .align 16 + cfi_startproc + _dl_x86_64_save_sse: +-# ifdef HAVE_AVX_SUPPORT ++# if defined HAVE_AVX_SUPPORT || defined HAVE_AVX512_ASM_SUPPORT + cmpl $0, L(have_avx)(%rip) +- jne 1f ++ jne L(defined_5) + movq %rbx, %r11 # Save rbx + movl $1, %eax + cpuid +@@ -191,21 +227,43 @@ + // AVX and XSAVE supported? + andl $((1 << 28) | (1 << 27)), %ecx + cmpl $((1 << 28) | (1 << 27)), %ecx +- jne 2f ++ jne 1f ++# ifdef HAVE_AVX512_ASM_SUPPORT ++ // AVX512 supported in a processor? ++ movq %rbx, %r11 # Save rbx ++ xorl %ecx,%ecx ++ mov $0x7,%eax ++ cpuid ++ andl $(1 << 16), %ebx ++# endif + xorl %ecx, %ecx + // Get XFEATURE_ENABLED_MASK + xgetbv +- andl $0x6, %eax +- cmpl $0x6, %eax +- // Nonzero if SSE and AVX state saving is enabled. +- sete %al +-2: leal -1(%eax,%eax), %eax ++# ifdef HAVE_AVX512_ASM_SUPPORT ++ test %ebx, %ebx ++ movq %r11, %rbx # Restore rbx ++ je 2f ++ // Verify that XCR0[7:5] = '111b' and ++ // XCR0[2:1] = '11b' which means ++ // that zmm state is enabled ++ andl $0xe6, %eax ++ movl %eax, L(have_avx)(%rip) ++ cmpl $0xe6, %eax ++ je L(avx512_5) ++# endif ++ ++2: andl $0x6, %eax ++1: subl $0x5, %eax + movl %eax, L(have_avx)(%rip) + cmpl $0, %eax + +-1: js L(no_avx5) ++L(defined_5): ++ js L(no_avx5) ++# ifdef HAVE_AVX512_ASM_SUPPORT ++ cmpl $0xe6, L(have_avx)(%rip) ++ je L(avx512_5) ++# endif + +-# define YMM_SIZE 32 + vmovdqa %ymm0, %fs:RTLD_SAVESPACE_SSE+0*YMM_SIZE + vmovdqa %ymm1, %fs:RTLD_SAVESPACE_SSE+1*YMM_SIZE + vmovdqa %ymm2, %fs:RTLD_SAVESPACE_SSE+2*YMM_SIZE +@@ -215,6 +273,18 @@ + vmovdqa %ymm6, %fs:RTLD_SAVESPACE_SSE+6*YMM_SIZE + vmovdqa %ymm7, %fs:RTLD_SAVESPACE_SSE+7*YMM_SIZE + ret ++# ifdef HAVE_AVX512_ASM_SUPPORT ++L(avx512_5): ++ vmovdqu64 %zmm0, %fs:RTLD_SAVESPACE_SSE+0*ZMM_SIZE ++ vmovdqu64 %zmm1, %fs:RTLD_SAVESPACE_SSE+1*ZMM_SIZE ++ vmovdqu64 %zmm2, %fs:RTLD_SAVESPACE_SSE+2*ZMM_SIZE ++ vmovdqu64 %zmm3, %fs:RTLD_SAVESPACE_SSE+3*ZMM_SIZE ++ vmovdqu64 %zmm4, %fs:RTLD_SAVESPACE_SSE+4*ZMM_SIZE ++ vmovdqu64 %zmm5, %fs:RTLD_SAVESPACE_SSE+5*ZMM_SIZE ++ vmovdqu64 %zmm6, %fs:RTLD_SAVESPACE_SSE+6*ZMM_SIZE ++ vmovdqu64 %zmm7, %fs:RTLD_SAVESPACE_SSE+7*ZMM_SIZE ++ ret ++# endif + L(no_avx5): + # endif + movdqa %xmm0, %fs:RTLD_SAVESPACE_SSE+0*XMM_SIZE +@@ -235,9 +305,13 @@ + .align 16 + cfi_startproc + _dl_x86_64_restore_sse: +-# ifdef HAVE_AVX_SUPPORT ++# if defined HAVE_AVX_SUPPORT || defined HAVE_AVX512_ASM_SUPPORT + cmpl $0, L(have_avx)(%rip) + js L(no_avx6) ++# ifdef HAVE_AVX512_ASM_SUPPORT ++ cmpl $0xe6, L(have_avx)(%rip) ++ je L(avx512_6) ++# endif + + vmovdqa %fs:RTLD_SAVESPACE_SSE+0*YMM_SIZE, %ymm0 + vmovdqa %fs:RTLD_SAVESPACE_SSE+1*YMM_SIZE, %ymm1 +@@ -248,6 +322,18 @@ + vmovdqa %fs:RTLD_SAVESPACE_SSE+6*YMM_SIZE, %ymm6 + vmovdqa %fs:RTLD_SAVESPACE_SSE+7*YMM_SIZE, %ymm7 + ret ++# ifdef HAVE_AVX512_ASM_SUPPORT ++L(avx512_6): ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+0*ZMM_SIZE, %zmm0 ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+1*ZMM_SIZE, %zmm1 ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+2*ZMM_SIZE, %zmm2 ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+3*ZMM_SIZE, %zmm3 ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+4*ZMM_SIZE, %zmm4 ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+5*ZMM_SIZE, %zmm5 ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+6*ZMM_SIZE, %zmm6 ++ vmovdqu64 %fs:RTLD_SAVESPACE_SSE+7*ZMM_SIZE, %zmm7 ++ ret ++# endif + L(no_avx6): + # endif + movdqa %fs:RTLD_SAVESPACE_SSE+0*XMM_SIZE, %xmm0 +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym +--- glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/link-defines.sym 2014-09-10 23:16:36.335167048 -0400 +@@ -4,6 +4,8 @@ + -- + VECTOR_SIZE sizeof (La_x86_64_vector) + XMM_SIZE sizeof (La_x86_64_xmm) ++YMM_SIZE sizeof (La_x86_64_ymm) ++ZMM_SIZE sizeof (La_x86_64_zmm) + + LR_SIZE sizeof (struct La_x86_64_regs) + LR_RDX_OFFSET offsetof (struct La_x86_64_regs, lr_rdx) +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/Makefile glibc-2.17-c758a686/sysdeps/x86_64/Makefile +--- glibc-2.17-c758a686/sysdeps/x86_64/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/Makefile 2014-09-10 23:22:04.269518711 -0400 +@@ -37,6 +37,20 @@ + + $(objpfx)tst-quad1pie: $(objpfx)tst-quadmod1pie.o + $(objpfx)tst-quad2pie: $(objpfx)tst-quadmod2pie.o ++ ++tests += tst-audit10 ++modules-names += tst-auditmod10a tst-auditmod10b ++ ++$(objpfx)tst-audit10: $(objpfx)tst-auditmod10a.so ++$(objpfx)tst-audit10.out: $(objpfx)tst-auditmod10b.so ++tst-audit10-ENV = LD_AUDIT=$(objpfx)tst-auditmod10b.so ++ ++ifeq (yes,$(config-cflags-avx512)) ++AVX512-CFLAGS = -mavx512f ++CFLAGS-tst-audit10.c += $(AVX512-CFLAGS) ++CFLAGS-tst-auditmod10a.c += $(AVX512-CFLAGS) ++CFLAGS-tst-auditmod10b.c += $(AVX512-CFLAGS) ++endif + endif + + ifeq ($(subdir),csu) +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/tst-audit10.c glibc-2.17-c758a686/sysdeps/x86_64/tst-audit10.c +--- glibc-2.17-c758a686/sysdeps/x86_64/tst-audit10.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/tst-audit10.c 2014-09-10 23:16:36.335167048 -0400 +@@ -0,0 +1,70 @@ ++/* Copyright (C) 2012-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 ++ <http://www.gnu.org/licenses/>. */ ++ ++/* Test case for x86-64 preserved registers in dynamic linker. */ ++ ++#ifdef __AVX512F__ ++#include <stdlib.h> ++#include <string.h> ++#include <cpuid.h> ++#include <immintrin.h> ++ ++static int ++avx512_enabled (void) ++{ ++ unsigned int eax, ebx, ecx, edx; ++ ++ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0 ++ || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE)) ++ return 0; ++ ++ __cpuid_count (7, 0, eax, ebx, ecx, edx); ++ if (!(ebx & bit_AVX512F)) ++ return 0; ++ ++ asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); ++ ++ /* Verify that ZMM, YMM and XMM states are enabled. */ ++ return (eax & 0xe6) == 0xe6; ++} ++ ++ ++extern __m512i audit_test (__m512i, __m512i, __m512i, __m512i, ++ __m512i, __m512i, __m512i, __m512i); ++int ++main (void) ++{ ++ /* Run AVX512 test only if AVX512 is supported. */ ++ if (avx512_enabled ()) ++ { ++ __m512i zmm = _mm512_setzero_si512 (); ++ __m512i ret = audit_test (zmm, zmm, zmm, zmm, zmm, zmm, zmm, zmm); ++ ++ zmm = _mm512_set1_epi64 (0x12349876); ++ ++ if (memcmp (&zmm, &ret, sizeof (ret))) ++ abort (); ++ } ++ return 0; ++} ++#else ++int ++main (void) ++{ ++ return 0; ++} ++#endif +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10a.c glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10a.c +--- glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10a.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10a.c 2014-09-10 23:16:36.335167048 -0400 +@@ -0,0 +1,65 @@ ++/* Copyright (C) 2012-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 ++ <http://www.gnu.org/licenses/>. */ ++ ++/* Test case for x86-64 preserved registers in dynamic linker. */ ++ ++#ifdef __AVX512F__ ++#include <stdlib.h> ++#include <string.h> ++#include <immintrin.h> ++ ++__m512i ++audit_test (__m512i x0, __m512i x1, __m512i x2, __m512i x3, ++ __m512i x4, __m512i x5, __m512i x6, __m512i x7) ++{ ++ __m512i zmm; ++ ++ zmm = _mm512_set1_epi64 (1); ++ if (memcmp (&zmm, &x0, sizeof (zmm))) ++ abort (); ++ ++ zmm = _mm512_set1_epi64 (2); ++ if (memcmp (&zmm, &x1, sizeof (zmm))) ++ abort (); ++ ++ zmm = _mm512_set1_epi64 (3); ++ if (memcmp (&zmm, &x2, sizeof (zmm))) ++ abort (); ++ ++ zmm = _mm512_set1_epi64 (4); ++ if (memcmp (&zmm, &x3, sizeof (zmm))) ++ abort (); ++ ++ zmm = _mm512_set1_epi64 (5); ++ if (memcmp (&zmm, &x4, sizeof (zmm))) ++ abort (); ++ ++ zmm = _mm512_set1_epi64 (6); ++ if (memcmp (&zmm, &x5, sizeof (zmm))) ++ abort (); ++ ++ zmm = _mm512_set1_epi64 (7); ++ if (memcmp (&zmm, &x6, sizeof (zmm))) ++ abort (); ++ ++ zmm = _mm512_set1_epi64 (8); ++ if (memcmp (&zmm, &x7, sizeof (zmm))) ++ abort (); ++ ++ return _mm512_setzero_si512 (); ++} ++#endif +diff -urN glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10b.c glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10b.c +--- glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10b.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86_64/tst-auditmod10b.c 2014-09-10 23:16:36.336167046 -0400 +@@ -0,0 +1,219 @@ ++/* Copyright (C) 2012-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 ++ <http://www.gnu.org/licenses/>. */ ++ ++/* Verify that changing AVX512 registers in audit library won't affect ++ function parameter passing/return. */ ++ ++#include <dlfcn.h> ++#include <stdint.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#include <bits/wordsize.h> ++#include <gnu/lib-names.h> ++ ++unsigned int ++la_version (unsigned int v) ++{ ++ setlinebuf (stdout); ++ ++ printf ("version: %u\n", v); ++ ++ char buf[20]; ++ sprintf (buf, "%u", v); ++ ++ return v; ++} ++ ++void ++la_activity (uintptr_t *cookie, unsigned int flag) ++{ ++ if (flag == LA_ACT_CONSISTENT) ++ printf ("activity: consistent\n"); ++ else if (flag == LA_ACT_ADD) ++ printf ("activity: add\n"); ++ else if (flag == LA_ACT_DELETE) ++ printf ("activity: delete\n"); ++ else ++ printf ("activity: unknown activity %u\n", flag); ++} ++ ++char * ++la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag) ++{ ++ char buf[100]; ++ const char *flagstr; ++ if (flag == LA_SER_ORIG) ++ flagstr = "LA_SET_ORIG"; ++ else if (flag == LA_SER_LIBPATH) ++ flagstr = "LA_SER_LIBPATH"; ++ else if (flag == LA_SER_RUNPATH) ++ flagstr = "LA_SER_RUNPATH"; ++ else if (flag == LA_SER_CONFIG) ++ flagstr = "LA_SER_CONFIG"; ++ else if (flag == LA_SER_DEFAULT) ++ flagstr = "LA_SER_DEFAULT"; ++ else if (flag == LA_SER_SECURE) ++ flagstr = "LA_SER_SECURE"; ++ else ++ { ++ sprintf (buf, "unknown flag %d", flag); ++ flagstr = buf; ++ } ++ printf ("objsearch: %s, %s\n", name, flagstr); ++ ++ return (char *) name; ++} ++ ++unsigned int ++la_objopen (struct link_map *l, Lmid_t lmid, uintptr_t *cookie) ++{ ++ printf ("objopen: %ld, %s\n", lmid, l->l_name); ++ ++ return 3; ++} ++ ++void ++la_preinit (uintptr_t *cookie) ++{ ++ printf ("preinit\n"); ++} ++ ++unsigned int ++la_objclose (uintptr_t *cookie) ++{ ++ printf ("objclose\n"); ++ return 0; ++} ++ ++uintptr_t ++la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook, ++ uintptr_t *defcook, unsigned int *flags, const char *symname) ++{ ++ printf ("symbind64: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n", ++ symname, (long int) sym->st_value, ndx, *flags); ++ ++ return sym->st_value; ++} ++ ++#include <tst-audit.h> ++ ++#ifdef __AVX512F__ ++#include <immintrin.h> ++#include <cpuid.h> ++ ++static int ++check_avx512 (void) ++{ ++ unsigned int eax, ebx, ecx, edx; ++ ++ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0 ++ || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE)) ++ return 0; ++ ++ __cpuid_count (7, 0, eax, ebx, ecx, edx); ++ if (!(ebx & bit_AVX512F)) ++ return 0; ++ ++ asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); ++ ++ /* Verify that ZMM, YMM and XMM states are enabled. */ ++ return (eax & 0xe6) == 0xe6; ++} ++ ++#else ++#include <emmintrin.h> ++#endif ++ ++ElfW(Addr) ++pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook, ++ uintptr_t *defcook, La_regs *regs, unsigned int *flags, ++ const char *symname, long int *framesizep) ++{ ++ printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n", ++ symname, (long int) sym->st_value, ndx, *flags); ++ ++#ifdef __AVX512F__ ++ if (check_avx512 () && strcmp (symname, "audit_test") == 0) ++ { ++ __m512i zero = _mm512_setzero_si512 (); ++ if (memcmp (®s->lr_vector[0], &zero, sizeof (zero)) ++ || memcmp (®s->lr_vector[1], &zero, sizeof (zero)) ++ || memcmp (®s->lr_vector[2], &zero, sizeof (zero)) ++ || memcmp (®s->lr_vector[3], &zero, sizeof (zero)) ++ || memcmp (®s->lr_vector[4], &zero, sizeof (zero)) ++ || memcmp (®s->lr_vector[5], &zero, sizeof (zero)) ++ || memcmp (®s->lr_vector[6], &zero, sizeof (zero)) ++ || memcmp (®s->lr_vector[7], &zero, sizeof (zero))) ++ abort (); ++ ++ for (int i = 0; i < 8; i++) ++ regs->lr_vector[i].zmm[0] ++ = (La_x86_64_zmm) _mm512_set1_epi64 (i + 1); ++ ++ __m512i zmm = _mm512_set1_epi64 (-1); ++ asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" ); ++ asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" ); ++ asm volatile ("vmovdqa64 %0, %%zmm2" : : "x" (zmm) : "xmm2" ); ++ asm volatile ("vmovdqa64 %0, %%zmm3" : : "x" (zmm) : "xmm3" ); ++ asm volatile ("vmovdqa64 %0, %%zmm4" : : "x" (zmm) : "xmm4" ); ++ asm volatile ("vmovdqa64 %0, %%zmm5" : : "x" (zmm) : "xmm5" ); ++ asm volatile ("vmovdqa64 %0, %%zmm6" : : "x" (zmm) : "xmm6" ); ++ asm volatile ("vmovdqa64 %0, %%zmm7" : : "x" (zmm) : "xmm7" ); ++ ++ *framesizep = 1024; ++ } ++#endif ++ ++ return sym->st_value; ++} ++ ++unsigned int ++pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook, ++ uintptr_t *defcook, const La_regs *inregs, La_retval *outregs, ++ const char *symname) ++{ ++ printf ("pltexit: symname=%s, st_value=%#lx, ndx=%u, retval=%tu\n", ++ symname, (long int) sym->st_value, ndx, ++ (ptrdiff_t) outregs->int_retval); ++ ++#ifdef __AVX512F__ ++ if (check_avx512 () && strcmp (symname, "audit_test") == 0) ++ { ++ __m512i zero = _mm512_setzero_si512 (); ++ if (memcmp (&outregs->lrv_vector0, &zero, sizeof (zero))) ++ abort (); ++ ++ for (int i = 0; i < 8; i++) ++ { ++ __m512i zmm = _mm512_set1_epi64 (i + 1); ++ if (memcmp (&inregs->lr_vector[i], &zmm, sizeof (zmm)) != 0) ++ abort (); ++ } ++ ++ outregs->lrv_vector0.zmm[0] ++ = (La_x86_64_zmm) _mm512_set1_epi64 (0x12349876); ++ ++ __m512i zmm = _mm512_set1_epi64 (-1); ++ asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" ); ++ asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" ); ++ } ++#endif ++ ++ return 0; ++} +diff -urN glibc-2.17-c758a686/sysdeps/x86/Makefile glibc-2.17-c758a686/sysdeps/x86/Makefile +--- glibc-2.17-c758a686/sysdeps/x86/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86/Makefile 2014-09-11 16:06:03.121319867 -0400 +@@ -2,8 +2,8 @@ + CFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ + -mno-sse -mno-mmx) + +-tests: $(objpfx)tst-xmmymm.out +-$(objpfx)tst-xmmymm.out: ../sysdeps/x86/tst-xmmymm.sh $(objpfx)ld.so ++tests: $(objpfx)tst-xmmymmzmm.out ++$(objpfx)tst-xmmymmzmm.out: ../sysdeps/x86/tst-xmmymmzmm.sh $(objpfx)ld.so + @echo "Checking ld.so for SSE register use. This will take a few seconds..." + $(SHELL) $< $(objpfx) '$(NM)' '$(OBJDUMP)' '$(READELF)' > $@ + endif +diff -urN glibc-2.17-c758a686/sysdeps/x86/tst-xmmymm.sh glibc-2.17-c758a686/sysdeps/x86/tst-xmmymm.sh +--- glibc-2.17-c758a686/sysdeps/x86/tst-xmmymm.sh 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86/tst-xmmymm.sh 1969-12-31 19:00:00.000000000 -0500 +@@ -1,103 +0,0 @@ +-#! /bin/bash +-# Make sure no code in ld.so uses xmm/ymm registers on x86-64. +-# Copyright (C) 2009-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 +-# <http://www.gnu.org/licenses/>. +- +-set -e +- +-objpfx="$1" +-NM="$2" +-OBJDUMP="$3" +-READELF="$4" +- +-tmp=$(mktemp ${objpfx}tst-xmmymm.XXXXXX) +-trap 'rm -f "$tmp"' 1 2 3 15 +- +-# List of object files we have to test +-rtldobjs=$($READELF -W -wi ${objpfx}dl-allobjs.os | +- awk '/^ </ { if ($5 == "(DW_TAG_compile_unit)") c=1; else c=0 } $2 == "DW_AT_name" { if (c == 1) print $NF }' | +- sed 's,\(.*/\|\)\([_[:alnum:]-]*[.]\).$,\2os,') +-rtldobjs="$rtldobjs $(ar t ${objpfx}rtld-libc.a)" +- +-# OBJECT symbols can be ignored. +-$READELF -sW ${objpfx}dl-allobjs.os ${objpfx}rtld-libc.a | +-egrep " OBJECT *GLOBAL " | +-awk '{if ($7 != "ABS") print $8 }' | +-sort -u > "$tmp" +-declare -a objects +-objects=($(cat "$tmp")) +- +-objs="dl-runtime.os" +-tocheck="dl-runtime.os" +- +-while test -n "$objs"; do +- this="$objs" +- objs="" +- +- for f in $this; do +- undef=$($NM -u "$objpfx"../*/"$f" | awk '{print $2}') +- if test -n "$undef"; then +- for s in $undef; do +- for obj in ${objects[*]} "_GLOBAL_OFFSET_TABLE_"; do +- if test "$obj" = "$s"; then +- continue 2 +- fi +- done +- for o in $rtldobjs; do +- ro=$(echo "$objpfx"../*/"$o") +- if $NM -g --defined-only "$ro" | egrep -qs " $s\$"; then +- if ! (echo "$tocheck $objs" | fgrep -qs "$o"); then +- echo "$o needed for $s" +- objs="$objs $o" +- fi +- break; +- fi +- done +- done +- fi +- done +- tocheck="$tocheck$objs" +-done +- +-echo +-echo +-echo "object files needed: $tocheck" +- +-cp /dev/null "$tmp" +-for f in $tocheck; do +- $OBJDUMP -d "$objpfx"../*/"$f" | +- awk 'BEGIN { last="" } /^[[:xdigit:]]* <[_[:alnum:]]*>:$/ { fct=substr($2, 2, length($2)-3) } /,%[xy]mm[[:digit:]]*$/ { if (last != fct) { print fct; last=fct} }' | +- while read fct; do +- if test "$fct" = "_dl_runtime_profile" -o "$fct" = "_dl_x86_64_restore_sse"; then +- continue; +- fi +- echo "function $fct in $f modifies xmm/ymm" >> "$tmp" +- result=1 +- done +-done +- +-if test -s "$tmp"; then +- echo +- echo +- cat "$tmp" +- result=1 +-else +- result=0 +-fi +- +-rm "$tmp" +-exit $result +diff -urN glibc-2.17-c758a686/sysdeps/x86/tst-xmmymmzmm.sh glibc-2.17-c758a686/sysdeps/x86/tst-xmmymmzmm.sh +--- glibc-2.17-c758a686/sysdeps/x86/tst-xmmymmzmm.sh 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/x86/tst-xmmymmzmm.sh 2014-09-11 16:05:10.073426623 -0400 +@@ -0,0 +1,103 @@ ++#! /bin/bash ++# Make sure no code in ld.so uses xmm/ymm/zmm registers on x86-64. ++# Copyright (C) 2009-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 ++# <http://www.gnu.org/licenses/>. ++ ++set -e ++ ++objpfx="$1" ++NM="$2" ++OBJDUMP="$3" ++READELF="$4" ++ ++tmp=$(mktemp ${objpfx}tst-xmmymmzmm.XXXXXX) ++trap 'rm -f "$tmp"' 1 2 3 15 ++ ++# List of object files we have to test ++rtldobjs=$($READELF -W -wi ${objpfx}dl-allobjs.os | ++ awk '/^ </ { if ($5 == "(DW_TAG_compile_unit)") c=1; else c=0 } $2 == "DW_AT_name" { if (c == 1) print $NF }' | ++ sed 's,\(.*/\|\)\([_[:alnum:]-]*[.]\).$,\2os,') ++rtldobjs="$rtldobjs $(ar t ${objpfx}rtld-libc.a)" ++ ++# OBJECT symbols can be ignored. ++$READELF -sW ${objpfx}dl-allobjs.os ${objpfx}rtld-libc.a | ++egrep " OBJECT *GLOBAL " | ++awk '{if ($7 != "ABS") print $8 }' | ++sort -u > "$tmp" ++declare -a objects ++objects=($(cat "$tmp")) ++ ++objs="dl-runtime.os" ++tocheck="dl-runtime.os" ++ ++while test -n "$objs"; do ++ this="$objs" ++ objs="" ++ ++ for f in $this; do ++ undef=$($NM -u "$objpfx"../*/"$f" | awk '{print $2}') ++ if test -n "$undef"; then ++ for s in $undef; do ++ for obj in ${objects[*]} "_GLOBAL_OFFSET_TABLE_"; do ++ if test "$obj" = "$s"; then ++ continue 2 ++ fi ++ done ++ for o in $rtldobjs; do ++ ro=$(echo "$objpfx"../*/"$o") ++ if $NM -g --defined-only "$ro" | egrep -qs " $s\$"; then ++ if ! (echo "$tocheck $objs" | fgrep -qs "$o"); then ++ echo "$o needed for $s" ++ objs="$objs $o" ++ fi ++ break; ++ fi ++ done ++ done ++ fi ++ done ++ tocheck="$tocheck$objs" ++done ++ ++echo ++echo ++echo "object files needed: $tocheck" ++ ++cp /dev/null "$tmp" ++for f in $tocheck; do ++ $OBJDUMP -d "$objpfx"../*/"$f" | ++ awk 'BEGIN { last="" } /^[[:xdigit:]]* <[_[:alnum:]]*>:$/ { fct=substr($2, 2, length($2)-3) } /,%[xyz]mm[[:digit:]]*$/ { if (last != fct) { print fct; last=fct} }' | ++ while read fct; do ++ if test "$fct" = "_dl_runtime_profile" -o "$fct" = "_dl_x86_64_restore_sse"; then ++ continue; ++ fi ++ echo "function $fct in $f modifies xmm/ymm/zmm" >> "$tmp" ++ result=1 ++ done ++done ++ ++if test -s "$tmp"; then ++ echo ++ echo ++ cat "$tmp" ++ result=1 ++else ++ result=0 ++fi ++ ++rm "$tmp" ++exit $result diff --git a/SOURCES/glibc-rh1140474.patch b/SOURCES/glibc-rh1140474.patch new file mode 100644 index 0000000..c3ce5cd --- /dev/null +++ b/SOURCES/glibc-rh1140474.patch @@ -0,0 +1,154 @@ +commit 41488498b6d9440ee66ab033808cce8323bba7ac +Author: Florian Weimer <fweimer@redhat.com> +Date: Wed Sep 3 19:45:43 2014 +0200 + + CVE-2014-6040: Crashes on invalid input in IBM gconv modules [BZ #17325] + + These changes are based on the fix for BZ #14134 in commit + 6e230d11837f3ae7b375ea69d7905f0d18eb79e5. + +diff --git glibc-2.17-c758a686/iconvdata/Makefile glibc-2.17-c758a686/iconvdata/Makefile +index 0a410a1..b6327d6 100644 +--- glibc-2.17-c758a686/iconvdata/Makefile ++++ glibc-2.17-c758a686/iconvdata/Makefile +@@ -297,6 +297,7 @@ $(objpfx)tst-iconv7.out: $(objpfx)gconv-modules \ + $(objpfx)iconv-test.out: run-iconv-test.sh $(objpfx)gconv-modules \ + $(addprefix $(objpfx),$(modules.so)) \ + $(common-objdir)/iconv/iconv_prog TESTS ++ iconv_modules="$(modules)" \ + $(SHELL) $< $(common-objdir) '$(test-wrapper)' > $@ + + $(objpfx)tst-tables.out: tst-tables.sh $(objpfx)gconv-modules \ +diff --git glibc-2.17-c758a686/iconvdata/ibm1364.c glibc-2.17-c758a686/iconvdata/ibm1364.c +index 0b5484f..cf80993 100644 +--- glibc-2.17-c758a686/iconvdata/ibm1364.c ++++ glibc-2.17-c758a686/iconvdata/ibm1364.c +@@ -221,7 +221,8 @@ enum + ++rp2; \ + \ + uint32_t res; \ +- if (__builtin_expect (ch < rp2->start, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ ++ || __builtin_expect (ch < rp2->start, 0) \ + || (res = DB_TO_UCS4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ + { \ +diff --git glibc-2.17-c758a686/iconvdata/ibm932.c glibc-2.17-c758a686/iconvdata/ibm932.c +index f5dca59..aa69d65 100644 +--- glibc-2.17-c758a686/iconvdata/ibm932.c ++++ glibc-2.17-c758a686/iconvdata/ibm932.c +@@ -74,11 +74,12 @@ + } \ + \ + ch = (ch * 0x100) + inptr[1]; \ ++ /* ch was less than 0xfd. */ \ ++ assert (ch < 0xfd00); \ + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ +- || __builtin_expect (ch < rp2->start, 0) \ ++ if (__builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm932db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, '\1') == 0 && ch !=0)) \ + { \ +diff --git glibc-2.17-c758a686/iconvdata/ibm933.c glibc-2.17-c758a686/iconvdata/ibm933.c +index f46dfb5..461fb5e 100644 +--- glibc-2.17-c758a686/iconvdata/ibm933.c ++++ glibc-2.17-c758a686/iconvdata/ibm933.c +@@ -162,7 +162,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm933db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +diff --git glibc-2.17-c758a686/iconvdata/ibm935.c glibc-2.17-c758a686/iconvdata/ibm935.c +index a8e4e6c..132d816 100644 +--- glibc-2.17-c758a686/iconvdata/ibm935.c ++++ glibc-2.17-c758a686/iconvdata/ibm935.c +@@ -162,7 +162,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm935db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +diff --git glibc-2.17-c758a686/iconvdata/ibm937.c glibc-2.17-c758a686/iconvdata/ibm937.c +index 239be61..69b154d 100644 +--- glibc-2.17-c758a686/iconvdata/ibm937.c ++++ glibc-2.17-c758a686/iconvdata/ibm937.c +@@ -162,7 +162,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm937db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +diff --git glibc-2.17-c758a686/iconvdata/ibm939.c glibc-2.17-c758a686/iconvdata/ibm939.c +index 5d0db36..9936e2c 100644 +--- glibc-2.17-c758a686/iconvdata/ibm939.c ++++ glibc-2.17-c758a686/iconvdata/ibm939.c +@@ -162,7 +162,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm939db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +diff --git glibc-2.17-c758a686/iconvdata/ibm943.c glibc-2.17-c758a686/iconvdata/ibm943.c +index be0c14f..c5d5742 100644 +--- glibc-2.17-c758a686/iconvdata/ibm943.c ++++ glibc-2.17-c758a686/iconvdata/ibm943.c +@@ -75,11 +75,12 @@ + } \ + \ + ch = (ch * 0x100) + inptr[1]; \ ++ /* ch was less than 0xfd. */ \ ++ assert (ch < 0xfd00); \ + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ +- || __builtin_expect (ch < rp2->start, 0) \ ++ if (__builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm943db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, '\1') == 0 && ch !=0)) \ + { \ +diff --git glibc-2.17-c758a686/iconvdata/run-iconv-test.sh glibc-2.17-c758a686/iconvdata/run-iconv-test.sh +index c98c929..5dfb69f 100755 +--- glibc-2.17-c758a686/iconvdata/run-iconv-test.sh ++++ glibc-2.17-c758a686/iconvdata/run-iconv-test.sh +@@ -184,6 +184,24 @@ while read utf8 from filename; do + + done < TESTS2 + ++# Check for crashes in decoders. ++printf '\016\377\377\377\377\377\377\377' > $temp1 ++for from in $iconv_modules ; do ++ echo $ac_n "test decoder $from $ac_c" ++ PROG=`eval echo $ICONV` ++ if $PROG < $temp1 >/dev/null 2>&1 ; then ++ : # fall through ++ else ++ status=$? ++ if test $status -gt 1 ; then ++ echo "/FAILED" ++ failed=1 ++ continue ++ fi ++ fi ++ echo "OK" ++done ++ + exit $failed + # Local Variables: + # mode:shell-script diff --git a/SOURCES/glibc-rh1144133.patch b/SOURCES/glibc-rh1144133.patch new file mode 100644 index 0000000..abefdf7 --- /dev/null +++ b/SOURCES/glibc-rh1144133.patch @@ -0,0 +1,55 @@ +commit 62058ce612ed3459501b4c4332e268edfe977f59 +Author: Carlos O'Donell <carlos@redhat.com> +Date: Mon Sep 29 13:14:21 2014 -0400 + + Correctly size profiling reloc table (bug 17411) + + During auditing or profiling modes the dynamic loader + builds a cache of the relocated PLT entries in order + to reuse them when called again through the same PLT + entry. This way the PLT entry is never completed and + the call into the resolver always results in profiling + or auditing code running. + + The problem is that the PLT relocation cache size + is not computed correctly. The size of the cache + should be "Size of a relocation result structure" + x "Number of PLT-related relocations". Instead the + code erroneously computes "Size of a relocation + result" x "Number of bytes worth of PLT-related + relocations". I can only assume this was a mistake + in the understanding of the value of DT_PLTRELSZ + which is the number of bytes of PLT-related relocs. + We do have a DT_RELACOUNT entry, which is a count + for dynamic relative relocs, but we have no + DT_PLTRELCOUNT and thus we need to compute it. + + This patch corrects the computation of the size of the + relocation table used by the glibc profiling code. + + For more details see: + https://sourceware.org/ml/libc-alpha/2014-09/msg00513.html + + [BZ #17411] + * elf/dl-reloc.c (_dl_relocate_object): Allocate correct amount for + l_reloc_result. + +diff --git glibc-2.17-c758a686/elf/dl-reloc.c glibc-2.17-c758a686/elf/dl-reloc.c +index d2c6dac..97a7119 100644 +--- glibc-2.17-c758a686/elf/dl-reloc.c ++++ glibc-2.17-c758a686/elf/dl-reloc.c +@@ -279,8 +279,12 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], + l->l_name); + } + +- l->l_reloc_result = calloc (sizeof (l->l_reloc_result[0]), +- l->l_info[DT_PLTRELSZ]->d_un.d_val); ++ size_t sizeofrel = l->l_info[DT_PLTREL]->d_un.d_val == DT_RELA ++ ? sizeof (ElfW(Rela)) ++ : sizeof (ElfW(Rel)); ++ size_t relcount = l->l_info[DT_PLTRELSZ]->d_un.d_val / sizeofrel; ++ l->l_reloc_result = calloc (sizeof (l->l_reloc_result[0]), relcount); ++ + if (l->l_reloc_result == NULL) + { + errstring = N_("\ diff --git a/SOURCES/glibc-rh1144516.patch b/SOURCES/glibc-rh1144516.patch new file mode 100644 index 0000000..8c45e74 --- /dev/null +++ b/SOURCES/glibc-rh1144516.patch @@ -0,0 +1,47 @@ +commit cfa4df95003c963c16d2102aef9c806f8175f373 +Author: Marcus Shawcroft <marcus.shawcroft@linaro.org> +Date: Tue Sep 24 12:59:06 2013 +0100 + + [AArch64] Adding sigcontextinfo.h + +diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h b/ports/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h +new file mode 100644 +index 0000000..42ff38e +--- /dev/null ++++ b/ports/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h +@@ -0,0 +1,35 @@ ++/* AArch64 definitions for signal handling calling conventions. ++ Copyright (C) 1996-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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <sys/ucontext.h> ++#include "kernel-features.h" ++ ++#define SIGCONTEXT siginfo_t *_si, struct ucontext * ++#define GET_PC(ctx) ((void *) (ctx)->uc_mcontext.pc) ++ ++/* There is no reliable way to get the sigcontext unless we use a ++ three-argument signal handler. */ ++#define __sigaction(sig, act, oact) ({ \ ++ (act)->sa_flags |= SA_SIGINFO; \ ++ (__sigaction) (sig, act, oact); \ ++}) ++ ++#define sigaction(sig, act, oact) ({ \ ++ (act)->sa_flags |= SA_SIGINFO; \ ++ (sigaction) (sig, act, oact); \ ++}) diff --git a/SOURCES/glibc-rh1150282.patch b/SOURCES/glibc-rh1150282.patch new file mode 100644 index 0000000..59de1df --- /dev/null +++ b/SOURCES/glibc-rh1150282.patch @@ -0,0 +1,515 @@ +This patch provides a compatibility kludge for legacy applications +which do not provide proper stack alignment. It cannot be upstreamed. + +The kludge is active for both i386 and x86-64, but it is actually only +needed on i386. + +In Fedora, the same effect was achieved by disabling multi-arch +altogether: + + https://bugzilla.redhat.com/show_bug.cgi?id=1471427 + +Further discussion is on this internal bug: + + https://bugzilla.redhat.com/show_bug.cgi?id=1478332 + + +--- glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c 2012-12-24 20:02:13.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/ifunc-impl-list.c 2015-04-20 09:04:11.826569951 -0600 +@@ -212,6 +212,8 @@ + + /* 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, 1, __strstr_sse2)) + +--- glibc-2.17-c758a686/sysdeps/x86_64/multiarch/init-arch.h 2012-12-24 20:02:13.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/init-arch.h 2015-04-20 12:15:17.984742925 -0600 +@@ -63,6 +63,34 @@ + #else /* __ASSEMBLER__ */ + + # include <sys/param.h> ++# include <sys/types.h> ++# include <sysdep.h> ++# include <stdbool.h> ++ ++/* 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 + { +--- glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile 2012-12-24 20:02:13.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/Makefile 2015-04-20 09:04:11.854569626 -0600 +@@ -17,7 +17,7 @@ + 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 ++ memcmp-ssse3 strstr-sse2-unaligned + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c varshift + CFLAGS-varshift.c += -msse4 +--- glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcasestr-c.c 2012-12-24 20:02:13.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strcasestr-c.c 2015-04-20 09:04:11.861569545 -0600 +@@ -12,7 +12,8 @@ + + #if 1 + libc_ifunc (__strcasestr, +- HAS_SSE4_2 ? __strcasestr_sse42 : __strcasestr_sse2); ++ HAS_SSE4_2 && !use_unaligned_strstr () ? __strcasestr_sse42 : ++ __strcasestr_sse2); + #else + libc_ifunc (__strcasestr, + 0 ? __strcasestr_sse42 : __strcasestr_sse2); +--- glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strstr-c.c 2012-12-24 20:02:13.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strstr-c.c 2015-04-20 09:04:11.866569487 -0600 +@@ -34,6 +34,7 @@ + #include "string/strstr.c" + + extern __typeof (__redirect_strstr) __strstr_sse42 attribute_hidden; ++extern __typeof (__redirect_strstr) __strstr_sse2_unaligned attribute_hidden; + extern __typeof (__redirect_strstr) __strstr_sse2 attribute_hidden; + + #include "init-arch.h" +@@ -41,7 +42,9 @@ + /* 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 ? __strstr_sse42 : __strstr_sse2) ++libc_ifunc (__libc_strstr, HAS_SSE4_2 ? (use_unaligned_strstr () ? ++ __strstr_sse2_unaligned : ++ __strstr_sse42) : __strstr_sse2) + + #undef strstr + strong_alias (__libc_strstr, strstr) +--- glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strstr-sse2-unaligned.S 1969-12-31 17:00:00.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/x86_64/multiarch/strstr-sse2-unaligned.S 2015-04-20 09:04:11.866569487 -0600 +@@ -0,0 +1,374 @@ ++/* strstr with unaligned loads ++ Copyright (C) 2009-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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <sysdep.h> ++ ++ENTRY(__strstr_sse2_unaligned) ++ movzbl (%rsi), %eax ++ testb %al, %al ++ je L(empty) ++ movzbl 1(%rsi), %edx ++ testb %dl, %dl ++ je L(strchr) ++ movd %eax, %xmm1 ++ movd %edx, %xmm2 ++ movq %rdi, %rax ++ andl $4095, %eax ++ punpcklbw %xmm1, %xmm1 ++ cmpq $4031, %rax ++ punpcklbw %xmm2, %xmm2 ++ punpcklwd %xmm1, %xmm1 ++ punpcklwd %xmm2, %xmm2 ++ pshufd $0, %xmm1, %xmm1 ++ pshufd $0, %xmm2, %xmm2 ++ ja L(cross_page) ++ movdqu (%rdi), %xmm3 ++ pxor %xmm5, %xmm5 ++ movdqu 1(%rdi), %xmm4 ++ movdqa %xmm3, %xmm6 ++ pcmpeqb %xmm1, %xmm3 ++ pcmpeqb %xmm2, %xmm4 ++ movdqu 16(%rdi), %xmm0 ++ pcmpeqb %xmm5, %xmm6 ++ pminub %xmm4, %xmm3 ++ movdqa %xmm3, %xmm4 ++ movdqu 17(%rdi), %xmm3 ++ pcmpeqb %xmm0, %xmm5 ++ pcmpeqb %xmm2, %xmm3 ++ por %xmm6, %xmm4 ++ pcmpeqb %xmm1, %xmm0 ++ pminub %xmm3, %xmm0 ++ por %xmm5, %xmm0 ++ pmovmskb %xmm4, %r8d ++ pmovmskb %xmm0, %eax ++ salq $16, %rax ++ orq %rax, %r8 ++ je L(next_32_bytes) ++L(next_pair_index): ++ bsf %r8, %rax ++ addq %rdi, %rax ++ cmpb $0, (%rax) ++ je L(zero1) ++ movzbl 2(%rsi), %edx ++ testb %dl, %dl ++ je L(found1) ++ cmpb 2(%rax), %dl ++ jne L(next_pair) ++ xorl %edx, %edx ++ jmp L(pair_loop_start) ++ ++ .p2align 4 ++L(strchr): ++ movzbl %al, %esi ++ jmp __strchr_sse2 ++ ++ .p2align 4 ++L(pair_loop): ++ addq $1, %rdx ++ cmpb 2(%rax,%rdx), %cl ++ jne L(next_pair) ++L(pair_loop_start): ++ movzbl 3(%rsi,%rdx), %ecx ++ testb %cl, %cl ++ jne L(pair_loop) ++L(found1): ++ ret ++L(zero1): ++ xorl %eax, %eax ++ ret ++ ++ .p2align 4 ++L(next_pair): ++ leaq -1(%r8), %rax ++ andq %rax, %r8 ++ jne L(next_pair_index) ++ ++ .p2align 4 ++L(next_32_bytes): ++ movdqu 32(%rdi), %xmm3 ++ pxor %xmm5, %xmm5 ++ movdqu 33(%rdi), %xmm4 ++ movdqa %xmm3, %xmm6 ++ pcmpeqb %xmm1, %xmm3 ++ pcmpeqb %xmm2, %xmm4 ++ movdqu 48(%rdi), %xmm0 ++ pcmpeqb %xmm5, %xmm6 ++ pminub %xmm4, %xmm3 ++ movdqa %xmm3, %xmm4 ++ movdqu 49(%rdi), %xmm3 ++ pcmpeqb %xmm0, %xmm5 ++ pcmpeqb %xmm2, %xmm3 ++ por %xmm6, %xmm4 ++ pcmpeqb %xmm1, %xmm0 ++ pminub %xmm3, %xmm0 ++ por %xmm5, %xmm0 ++ pmovmskb %xmm4, %eax ++ salq $32, %rax ++ pmovmskb %xmm0, %r8d ++ salq $48, %r8 ++ orq %rax, %r8 ++ je L(loop_header) ++L(next_pair2_index): ++ bsfq %r8, %rax ++ addq %rdi, %rax ++ cmpb $0, (%rax) ++ je L(zero2) ++ movzbl 2(%rsi), %edx ++ testb %dl, %dl ++ je L(found2) ++ cmpb 2(%rax), %dl ++ jne L(next_pair2) ++ xorl %edx, %edx ++ jmp L(pair_loop2_start) ++ ++ .p2align 4 ++L(pair_loop2): ++ addq $1, %rdx ++ cmpb 2(%rax,%rdx), %cl ++ jne L(next_pair2) ++L(pair_loop2_start): ++ movzbl 3(%rsi,%rdx), %ecx ++ testb %cl, %cl ++ jne L(pair_loop2) ++L(found2): ++ ret ++ L(zero2): ++ xorl %eax, %eax ++ ret ++L(empty): ++ mov %rdi, %rax ++ ret ++ ++ .p2align 4 ++L(next_pair2): ++ leaq -1(%r8), %rax ++ andq %rax, %r8 ++ jne L(next_pair2_index) ++L(loop_header): ++ movq $-512, %r11 ++ movq %rdi, %r9 ++ ++ pxor %xmm7, %xmm7 ++ andq $-64, %rdi ++ ++ .p2align 4 ++L(loop): ++ movdqa 64(%rdi), %xmm3 ++ movdqu 63(%rdi), %xmm6 ++ movdqa %xmm3, %xmm0 ++ pxor %xmm2, %xmm3 ++ pxor %xmm1, %xmm6 ++ movdqa 80(%rdi), %xmm10 ++ por %xmm3, %xmm6 ++ pminub %xmm10, %xmm0 ++ movdqu 79(%rdi), %xmm3 ++ pxor %xmm2, %xmm10 ++ pxor %xmm1, %xmm3 ++ movdqa 96(%rdi), %xmm9 ++ por %xmm10, %xmm3 ++ pminub %xmm9, %xmm0 ++ pxor %xmm2, %xmm9 ++ movdqa 112(%rdi), %xmm8 ++ addq $64, %rdi ++ pminub %xmm6, %xmm3 ++ movdqu 31(%rdi), %xmm4 ++ pminub %xmm8, %xmm0 ++ pxor %xmm2, %xmm8 ++ pxor %xmm1, %xmm4 ++ por %xmm9, %xmm4 ++ pminub %xmm4, %xmm3 ++ movdqu 47(%rdi), %xmm5 ++ pxor %xmm1, %xmm5 ++ por %xmm8, %xmm5 ++ pminub %xmm5, %xmm3 ++ pminub %xmm3, %xmm0 ++ pcmpeqb %xmm7, %xmm0 ++ pmovmskb %xmm0, %eax ++ testl %eax, %eax ++ je L(loop) ++ pminub (%rdi), %xmm6 ++ pminub 32(%rdi),%xmm4 ++ pminub 48(%rdi),%xmm5 ++ pcmpeqb %xmm7, %xmm6 ++ pcmpeqb %xmm7, %xmm5 ++ pmovmskb %xmm6, %edx ++ movdqa 16(%rdi), %xmm8 ++ pcmpeqb %xmm7, %xmm4 ++ movdqu 15(%rdi), %xmm0 ++ pmovmskb %xmm5, %r8d ++ movdqa %xmm8, %xmm3 ++ pmovmskb %xmm4, %ecx ++ pcmpeqb %xmm1,%xmm0 ++ pcmpeqb %xmm2,%xmm3 ++ salq $32, %rcx ++ pcmpeqb %xmm7,%xmm8 ++ salq $48, %r8 ++ pminub %xmm0,%xmm3 ++ orq %rcx, %rdx ++ por %xmm3,%xmm8 ++ orq %rdx, %r8 ++ pmovmskb %xmm8, %eax ++ salq $16, %rax ++ orq %rax, %r8 ++ je L(loop) ++L(next_pair_index3): ++ bsfq %r8, %rcx ++ addq %rdi, %rcx ++ cmpb $0, (%rcx) ++ je L(zero) ++ xorl %eax, %eax ++ movzbl 2(%rsi), %edx ++ testb %dl, %dl ++ je L(success3) ++ cmpb 1(%rcx), %dl ++ jne L(next_pair3) ++ jmp L(pair_loop_start3) ++ ++ .p2align 4 ++L(pair_loop3): ++ addq $1, %rax ++ cmpb 1(%rcx,%rax), %dl ++ jne L(next_pair3) ++L(pair_loop_start3): ++ movzbl 3(%rsi,%rax), %edx ++ testb %dl, %dl ++ jne L(pair_loop3) ++L(success3): ++ lea -1(%rcx), %rax ++ ret ++ ++ .p2align 4 ++L(next_pair3): ++ addq %rax, %r11 ++ movq %rdi, %rax ++ subq %r9, %rax ++ cmpq %r11, %rax ++ jl L(switch_strstr) ++ leaq -1(%r8), %rax ++ andq %rax, %r8 ++ jne L(next_pair_index3) ++ jmp L(loop) ++ ++ .p2align 4 ++L(switch_strstr): ++ movq %rdi, %rdi ++ jmp __strstr_sse2 ++ ++ .p2align 4 ++L(cross_page): ++ ++ movq %rdi, %rax ++ pxor %xmm0, %xmm0 ++ andq $-64, %rax ++ movdqa (%rax), %xmm3 ++ movdqu -1(%rax), %xmm4 ++ movdqa %xmm3, %xmm8 ++ movdqa 16(%rax), %xmm5 ++ pcmpeqb %xmm1, %xmm4 ++ pcmpeqb %xmm0, %xmm8 ++ pcmpeqb %xmm2, %xmm3 ++ movdqa %xmm5, %xmm7 ++ pminub %xmm4, %xmm3 ++ movdqu 15(%rax), %xmm4 ++ pcmpeqb %xmm0, %xmm7 ++ por %xmm3, %xmm8 ++ movdqa %xmm5, %xmm3 ++ movdqa 32(%rax), %xmm5 ++ pcmpeqb %xmm1, %xmm4 ++ pcmpeqb %xmm2, %xmm3 ++ movdqa %xmm5, %xmm6 ++ pmovmskb %xmm8, %ecx ++ pminub %xmm4, %xmm3 ++ movdqu 31(%rax), %xmm4 ++ por %xmm3, %xmm7 ++ movdqa %xmm5, %xmm3 ++ pcmpeqb %xmm0, %xmm6 ++ movdqa 48(%rax), %xmm5 ++ pcmpeqb %xmm1, %xmm4 ++ pmovmskb %xmm7, %r8d ++ pcmpeqb %xmm2, %xmm3 ++ pcmpeqb %xmm5, %xmm0 ++ pminub %xmm4, %xmm3 ++ movdqu 47(%rax), %xmm4 ++ por %xmm3, %xmm6 ++ movdqa %xmm5, %xmm3 ++ salq $16, %r8 ++ pcmpeqb %xmm1, %xmm4 ++ pcmpeqb %xmm2, %xmm3 ++ pmovmskb %xmm6, %r10d ++ pminub %xmm4, %xmm3 ++ por %xmm3, %xmm0 ++ salq $32, %r10 ++ orq %r10, %r8 ++ orq %rcx, %r8 ++ movl %edi, %ecx ++ pmovmskb %xmm0, %edx ++ subl %eax, %ecx ++ salq $48, %rdx ++ orq %rdx, %r8 ++ shrq %cl, %r8 ++ je L(loop_header) ++L(next_pair_index4): ++ bsfq %r8, %rax ++ addq %rdi, %rax ++ cmpb $0, (%rax) ++ je L(zero) ++ ++ cmpq %rax,%rdi ++ je L(next_pair4) ++ ++ movzbl 2(%rsi), %edx ++ testb %dl, %dl ++ je L(found3) ++ cmpb 1(%rax), %dl ++ jne L(next_pair4) ++ xorl %edx, %edx ++ jmp L(pair_loop_start4) ++ ++ .p2align 4 ++L(pair_loop4): ++ addq $1, %rdx ++ cmpb 1(%rax,%rdx), %cl ++ jne L(next_pair4) ++L(pair_loop_start4): ++ movzbl 3(%rsi,%rdx), %ecx ++ testb %cl, %cl ++ jne L(pair_loop4) ++L(found3): ++ subq $1, %rax ++ ret ++ ++ .p2align 4 ++L(next_pair4): ++ leaq -1(%r8), %rax ++ andq %rax, %r8 ++ jne L(next_pair_index4) ++ jmp L(loop_header) ++ ++ .p2align 4 ++L(found): ++ rep ++ ret ++ ++ .p2align 4 ++L(zero): ++ xorl %eax, %eax ++ ret ++ ++ ++END(__strstr_sse2_unaligned) +--- glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strstr-c.c 2012-12-24 20:02:13.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strstr-c.c 2015-04-20 09:04:11.876569371 -0600 +@@ -1,8 +1,6 @@ + /* Multiple versions of strstr + All versions must be listed in ifunc-impl-list.c. */ + +-#include "init-arch.h" +- + #define STRSTR __strstr_ia32 + #if defined SHARED && defined DO_VERSIONING && !defined NO_HIDDEN + #undef libc_hidden_builtin_def +@@ -17,13 +15,17 @@ + + #include "string/strstr.c" + ++#include "init-arch.h" ++ + extern __typeof (__redirect_strstr) __strstr_sse42 attribute_hidden; + extern __typeof (__redirect_strstr) __strstr_ia32 attribute_hidden; + + /* 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 ? __strstr_sse42 : __strstr_ia32) ++libc_ifunc (__libc_strstr, ++ HAS_SSE4_2 && !use_unaligned_strstr () ? ++ __strstr_sse42 : __strstr_ia32) + + #undef strstr + strong_alias (__libc_strstr, strstr) diff --git a/SOURCES/glibc-rh1156331.patch b/SOURCES/glibc-rh1156331.patch new file mode 100644 index 0000000..39ea469 --- /dev/null +++ b/SOURCES/glibc-rh1156331.patch @@ -0,0 +1,202 @@ +commit be349d7042de84c3c5157a5c1fbcad580aed33e1 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Dec 4 08:08:37 2014 +0530 + + ftell: seek to end only when there are unflushed bytes (BZ #17647) + + Currently we seek to end of file if there are unflushed writes or the + stream is in write mode, to get the current offset for writing in + append mode, which is the end of file. The latter case (i.e. stream + is in write mode, but no unflushed writes) is unnecessary since it + will only happen when the stream has just been flushed, in which case + the recorded offset ought to be reliable. + + Removing that case lets ftell give the correct offset when it follows + an ftruncate. The latter truncates the file, but does not change the + file position, due to which it is permissible to call ftell without an + intervening fseek call. + + Tested on x86_64 to verify that the added test case fails without the + patch and succeeds with it, and that there are no additional + regressions due to it. + + [BZ #17647] + * libio/fileops.c (do_ftell): Seek only when there are + unflushed writes. + * libio/wfileops.c (do_ftell_wide): Likewise. + * libio/tst-ftell-active-handler.c (do_ftruncate_test): New + test case. + (do_one_test): Call it. + +diff --git glibc-2.17-c758a686/libio/fileops.c glibc-2.17-c758a686/libio/fileops.c +index e0d7b76..1fc5719 100644 +--- glibc-2.17-c758a686/libio/fileops.c ++++ glibc-2.17-c758a686/libio/fileops.c +@@ -943,15 +943,14 @@ do_ftell (_IO_FILE *fp) + yet. */ + if (fp->_IO_buf_base != NULL) + { +- bool was_writing = (fp->_IO_write_ptr > fp->_IO_write_base +- || _IO_in_put_mode (fp)); ++ bool unflushed_writes = (fp->_IO_write_ptr > fp->_IO_write_base); + + bool append_mode = (fp->_flags & _IO_IS_APPENDING) == _IO_IS_APPENDING; + + /* When we have unflushed writes in append mode, seek to the end of the + file and record that offset. This is the only time we change the file + stream state and it is safe since the file handle is active. */ +- if (was_writing && append_mode) ++ if (unflushed_writes && append_mode) + { + result = _IO_SYSSEEK (fp, 0, _IO_seek_end); + if (result == _IO_pos_BAD) +@@ -961,7 +960,7 @@ do_ftell (_IO_FILE *fp) + } + + /* Adjust for unflushed data. */ +- if (!was_writing) ++ if (!unflushed_writes) + offset -= fp->_IO_read_end - fp->_IO_read_ptr; + /* We don't trust _IO_read_end to represent the current file offset when + writing in append mode because the value would have to be shifted to +diff --git glibc-2.17-c758a686/libio/tst-ftell-active-handler.c glibc-2.17-c758a686/libio/tst-ftell-active-handler.c +index e9dc7b3..9f23c55 100644 +--- glibc-2.17-c758a686/libio/tst-ftell-active-handler.c ++++ glibc-2.17-c758a686/libio/tst-ftell-active-handler.c +@@ -88,6 +88,95 @@ static size_t file_len; + typedef int (*fputs_func_t) (const void *data, FILE *fp); + fputs_func_t fputs_func; + ++/* This test verifies that the offset reported by ftell is correct after the ++ file is truncated using ftruncate. ftruncate does not change the file ++ offset on truncation and hence, SEEK_CUR should continue to point to the ++ old offset and not be changed to the new offset. */ ++static int ++do_ftruncate_test (const char *filename) ++{ ++ FILE *fp = NULL; ++ int fd; ++ int ret = 0; ++ struct test ++ { ++ const char *mode; ++ int fd_mode; ++ } test_modes[] = { ++ {"r+", O_RDWR}, ++ {"w", O_WRONLY}, ++ {"w+", O_RDWR}, ++ {"a", O_WRONLY}, ++ {"a+", O_RDWR} ++ }; ++ ++ for (int j = 0; j < 2; j++) ++ { ++ for (int i = 0; i < sizeof (test_modes) / sizeof (struct test); i++) ++ { ++ int fileret; ++ printf ("\tftruncate: %s (file, \"%s\"): ", ++ j == 0 ? "fopen" : "fdopen", ++ test_modes[i].mode); ++ ++ if (j == 0) ++ fileret = get_handles_fopen (filename, fd, fp, test_modes[i].mode); ++ else ++ fileret = get_handles_fdopen (filename, fd, fp, ++ test_modes[i].fd_mode, ++ test_modes[i].mode); ++ ++ if (fileret != 0) ++ return fileret; ++ ++ /* Write some data. */ ++ size_t written = fputs_func (data, fp); ++ ++ if (written == EOF) ++ { ++ printf ("fputs[1] failed to write data\n"); ++ ret |= 1; ++ } ++ ++ /* Record the offset. */ ++ long offset = ftell (fp); ++ ++ /* Flush data to allow switching active handles. */ ++ if (fflush (fp)) ++ { ++ printf ("Flush failed: %m\n"); ++ ret |= 1; ++ } ++ ++ /* Now truncate the file. */ ++ if (ftruncate (fd, 0) != 0) ++ { ++ printf ("Failed to truncate file: %m\n"); ++ ret |= 1; ++ } ++ ++ /* ftruncate does not change the offset, so there is no need to call ++ anything to be able to switch active handles. */ ++ long new_offset = ftell (fp); ++ ++ /* The offset should remain unchanged since ftruncate does not update ++ it. */ ++ if (offset != new_offset) ++ { ++ printf ("Incorrect offset. Expected %zu, but got %ld\n", ++ offset, new_offset); ++ ++ ret |= 1; ++ } ++ else ++ printf ("offset = %ld\n", offset); ++ ++ fclose (fp); ++ } ++ } ++ ++ return ret; ++} + /* Test that ftell output after a rewind is correct. */ + static int + do_rewind_test (const char *filename) +@@ -481,6 +570,7 @@ do_one_test (const char *filename) + ret |= do_write_test (filename); + ret |= do_append_test (filename); + ret |= do_rewind_test (filename); ++ ret |= do_ftruncate_test (filename); + + return ret; + } +diff --git glibc-2.17-c758a686/libio/wfileops.c glibc-2.17-c758a686/libio/wfileops.c +index 6a088b1..71281c1 100644 +--- glibc-2.17-c758a686/libio/wfileops.c ++++ glibc-2.17-c758a686/libio/wfileops.c +@@ -626,16 +626,15 @@ do_ftell_wide (_IO_FILE *fp) + const wchar_t *wide_read_base; + const wchar_t *wide_read_ptr; + const wchar_t *wide_read_end; +- bool was_writing = ((fp->_wide_data->_IO_write_ptr +- > fp->_wide_data->_IO_write_base) +- || _IO_in_put_mode (fp)); ++ bool unflushed_writes = (fp->_wide_data->_IO_write_ptr ++ > fp->_wide_data->_IO_write_base); + + bool append_mode = (fp->_flags & _IO_IS_APPENDING) == _IO_IS_APPENDING; + + /* When we have unflushed writes in append mode, seek to the end of the + file and record that offset. This is the only time we change the file + stream state and it is safe since the file handle is active. */ +- if (was_writing && append_mode) ++ if (unflushed_writes && append_mode) + { + result = _IO_SYSSEEK (fp, 0, _IO_seek_end); + if (result == _IO_pos_BAD) +@@ -674,7 +673,7 @@ do_ftell_wide (_IO_FILE *fp) + struct _IO_codecvt *cv = fp->_codecvt; + int clen = (*cv->__codecvt_do_encoding) (cv); + +- if (!was_writing) ++ if (!unflushed_writes) + { + if (clen > 0) + { diff --git a/SOURCES/glibc-rh1159169.patch b/SOURCES/glibc-rh1159169.patch new file mode 100644 index 0000000..7c1453d --- /dev/null +++ b/SOURCES/glibc-rh1159169.patch @@ -0,0 +1,42 @@ +commit ed6b0fe710b631b99ed9fc28cefedfe69a16dc55 +Author: Brad Hubbard <bhubbard@redhat.com> +Date: Wed Mar 18 14:51:26 2015 +0530 + + Use calloc to allocate xports (BZ #17542) + + If xports is NULL in xprt_register we malloc it but if sock > + _rpc_dtablesize() that memory does not get initialised and may in theory + contain any value. Later we make a conditional jump in svc_getreq_common + based on the uninitialised memory and this caused a general protection + fault in rpc.statd on an older version of glibc but this code has not + changed since that version. + + Following is the valgrind warning. + + ==26802== Conditional jump or move depends on uninitialised value(s) + ==26802== at 0x5343A25: svc_getreq_common (in /lib64/libc-2.5.so) + ==26802== by 0x534357B: svc_getreqset (in /lib64/libc-2.5.so) + ==26802== by 0x10DE1F: ??? (in /sbin/rpc.statd) + ==26802== by 0x10D0EF: main (in /sbin/rpc.statd) + ==26802== Uninitialised value was created by a heap allocation + ==26802== at 0x4C2210C: malloc (vg_replace_malloc.c:195) + ==26802== by 0x53438BE: xprt_register (in /lib64/libc-2.5.so) + ==26802== by 0x53450DF: svcudp_bufcreate (in /lib64/libc-2.5.so) + ==26802== by 0x10FE32: ??? (in /sbin/rpc.statd) + ==26802== by 0x10D13E: main (in /sbin/rpc.statd) + +diff --git glibc-2.17-c758a686/sunrpc/svc.c glibc-2.17-c758a686/sunrpc/svc.c +index 8c4e8a5..c6ccf10 100644 +--- glibc-2.17-c758a686/sunrpc/svc.c ++++ glibc-2.17-c758a686/sunrpc/svc.c +@@ -97,8 +97,8 @@ xprt_register (SVCXPRT *xprt) + + if (xports == NULL) + { +- xports = (SVCXPRT **) malloc (_rpc_dtablesize () * sizeof (SVCXPRT *)); +- if (xports == NULL) /* Don�t add handle */ ++ xports = (SVCXPRT **) calloc (_rpc_dtablesize (), sizeof (SVCXPRT *)); ++ if (xports == NULL) /* Don't add handle */ + return; + } + diff --git a/SOURCES/glibc-rh1161666.patch b/SOURCES/glibc-rh1161666.patch new file mode 100644 index 0000000..5285181 --- /dev/null +++ b/SOURCES/glibc-rh1161666.patch @@ -0,0 +1,125 @@ +commit 533bb7c2ae156ff2d49b2e0b20b33810ba5e2721 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Wed Nov 12 19:30:24 2014 +0530 + + Fix stack alignment when loader is invoked directly + + The s390 ABI requires the stack pointer to be aligned at 8-bytes. + When a program is invoked as an argument to the dynamic linker, + _dl_start_user adjusts the stack to remove the dynamic linker + arguments so that the program sees only its name and arguments. This + may result in the stack being misaligned since each argument shift is + only a word and not a double-word. + + This is now fixed shifting argv and envp down instead of shifting argc + up and reclaiming the stack. This requires _dl_argv to be adjusted + and hence, is no longer relro. + +diff --git glibc-2.17-c758a686/sysdeps/s390/s390-32/dl-machine.h glibc-2.17-c758a686/sysdeps/s390/s390-32/dl-machine.h +index c56185c..79f8ef9 100644 +--- glibc-2.17-c758a686/sysdeps/s390/s390-32/dl-machine.h ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/dl-machine.h +@@ -166,18 +166,49 @@ _dl_start_user:\n\ + # See if we were run as a command with the executable file\n\ + # name as an extra leading argument.\n\ + l %r1,_dl_skip_args@GOT12(0,%r12)\n\ +- l %r1,0(%r1) # load _dl_skip_args\n\ ++ l %r1,0(%r1) # load _dl_skip_args\n\ ++ ltr %r1,%r1\n\ ++ je .L4 # Skip the arg adjustment if there were none.\n\ + # Get the original argument count.\n\ + l %r0,96(%r15)\n\ + # Subtract _dl_skip_args from it.\n\ + sr %r0,%r1\n\ +- # Adjust the stack pointer to skip _dl_skip_args words.\n\ +- sll %r1,2\n\ +- ar %r15,%r1\n\ +- # Set the back chain to zero again\n\ +- xc 0(4,%r15),0(%r15)\n\ + # Store back the modified argument count.\n\ + st %r0,96(%r15)\n\ ++ # Copy argv and envp forward to account for skipped argv entries.\n\ ++ # We skipped at least one argument or we would not get here.\n\ ++ la %r6,100(%r15) # Destination pointer i.e. &argv[0]\n\ ++ lr %r5,%r6\n\ ++ lr %r0,%r1\n\ ++ sll %r0,2\n # Number of skipped bytes.\n\ ++ ar %r5,%r0 # Source pointer = Dest + Skipped args.\n\ ++ # argv copy loop:\n\ ++.L1: l %r7,0(%r5) # Load a word from the source.\n\ ++ st %r7,0(%r6) # Store the word in the destination.\n\ ++ ahi %r5,4\n\ ++ ahi %r6,4\n\ ++ ltr %r7,%r7\n\ ++ jne .L1 # Stop after copying the NULL.\n\ ++ # envp copy loop:\n\ ++.L2: l %r7,0(%r5) # Load a word from the source.\n\ ++ st %r7,0(%r6) # Store the word in the destination.\n\ ++ ahi %r5,4\n\ ++ ahi %r6,4\n\ ++ ltr %r7,%r7\n\ ++ jne .L2 # Stop after copying the NULL.\n\ ++ # Now we have to zero out the envp entries after NULL to allow\n\ ++ # start.S to properly find auxv by skipping zeroes.\n\ ++ # zero out loop:\n\ ++ lhi %r7,0\n\ ++.L3: st %r7,0(%r6) # Store zero.\n\ ++ ahi %r6,4 # Advance dest pointer.\n\ ++ ahi %r1,-1 # Subtract one from the word count.\n\ ++ ltr %r1,%r1\n\ ++ jne .L3 # Keep copying if the word count is non-zero.\n\ ++ # Adjust _dl_argv\n\ ++ la %r6,100(%r15)\n\ ++ l %r1,_dl_argv@GOT12(0,%r12)\n\ ++ st %r6,0(%r1)\n\ + # The special initializer gets called with the stack just\n\ + # as the application's entry point will see it; it can\n\ + # switch stacks if it moves these contents over.\n\ +@@ -185,7 +216,7 @@ _dl_start_user:\n\ + # Call the function to run the initializers.\n\ + # Load the parameters:\n\ + # (%r2, %r3, %r4, %r5) = (_dl_loaded, argc, argv, envp)\n\ +- l %r2,_rtld_local@GOT(%r12)\n\ ++.L4: l %r2,_rtld_local@GOT(%r12)\n\ + l %r2,0(%r2)\n\ + l %r3,96(%r15)\n\ + la %r4,100(%r15)\n\ +@@ -198,6 +229,9 @@ _dl_start_user:\n\ + l %r14,_dl_fini@GOT(%r12)\n\ + # Free stack frame\n\ + ahi %r15,96\n\ ++ # Reload argc and argv for the user's entry point.\n\ ++ # l %r2,0(%r15)\n\ ++ # la %r3,4(%r15)\n\ + # Jump to the user's entry point (saved in %r8).\n\ + br %r8\n\ + .Llit:\n\ +diff --git glibc-2.17-c758a686/sysdeps/s390/s390-32/dl-sysdep.h glibc-2.17-c758a686/sysdeps/s390/s390-32/dl-sysdep.h +new file mode 100644 +index 0000000..b992778 +--- /dev/null ++++ glibc-2.17-c758a686/sysdeps/s390/s390-32/dl-sysdep.h +@@ -0,0 +1,23 @@ ++/* System-specific settings for dynamic linker code. S/390 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include_next <dl-sysdep.h> ++ ++/* _dl_argv cannot be attribute_relro, because _dl_start_user ++ might write into it after _dl_start returns. */ ++#define DL_ARGV_NOT_RELRO 1 diff --git a/SOURCES/glibc-rh1162847-p1.patch b/SOURCES/glibc-rh1162847-p1.patch new file mode 100644 index 0000000..eab2afe --- /dev/null +++ b/SOURCES/glibc-rh1162847-p1.patch @@ -0,0 +1,104 @@ +# +# commit f8e3e9f31bfd71641418897228fa1732170b69cc +# Author: Alan Modra <amodra@gmail.com> +# Date: Thu Oct 3 13:51:52 2013 +0930 +# +# Correct little-endian relocation of UADDR64,32,16. +# +# * sysdeps/powerpc/powerpc32/dl-machine.c (__process_machine_rela): +# Correct handling of unaligned relocs for little-endian. +# * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_rela): Likewise. +# +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c 2014-11-11 18:51:36.140570654 -0500 +@@ -423,6 +423,12 @@ + Elf32_Addr const finaladdr, + int rinfo) + { ++ union unaligned ++ { ++ unsigned u2 __attribute__ ((mode (HI))); ++ unsigned u4 __attribute__ ((mode (SI))); ++ } __attribute__((__packed__)); ++ + switch (rinfo) + { + case R_PPC_NONE: +@@ -439,10 +445,7 @@ + return; + + case R_PPC_UADDR32: +- ((char *) reloc_addr)[0] = finaladdr >> 24; +- ((char *) reloc_addr)[1] = finaladdr >> 16; +- ((char *) reloc_addr)[2] = finaladdr >> 8; +- ((char *) reloc_addr)[3] = finaladdr; ++ ((union unaligned *) reloc_addr)->u4 = finaladdr; + break; + + case R_PPC_ADDR24: +@@ -460,8 +463,7 @@ + case R_PPC_UADDR16: + if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) + _dl_reloc_overflow (map, "R_PPC_UADDR16", reloc_addr, refsym); +- ((char *) reloc_addr)[0] = finaladdr >> 8; +- ((char *) reloc_addr)[1] = finaladdr; ++ ((union unaligned *) reloc_addr)->u2 = finaladdr; + break; + + case R_PPC_ADDR16_LO: +diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h 2014-11-11 18:51:36.141570651 -0500 +@@ -561,6 +561,12 @@ + Elf64_Addr *const reloc_addr = reloc_addr_arg; + const int r_type = ELF64_R_TYPE (reloc->r_info); + const Elf64_Sym *const refsym = sym; ++ union unaligned ++ { ++ unsigned u2 __attribute__ ((mode (HI))); ++ unsigned u4 __attribute__ ((mode (SI))); ++ unsigned u8 __attribute__ ((mode (DI))); ++ } __attribute__((__packed__)); + + if (r_type == R_PPC64_RELATIVE) + { +@@ -742,23 +748,11 @@ + return; + + case R_PPC64_UADDR64: +- /* We are big-endian. */ +- ((char *) reloc_addr_arg)[0] = (value >> 56) & 0xff; +- ((char *) reloc_addr_arg)[1] = (value >> 48) & 0xff; +- ((char *) reloc_addr_arg)[2] = (value >> 40) & 0xff; +- ((char *) reloc_addr_arg)[3] = (value >> 32) & 0xff; +- ((char *) reloc_addr_arg)[4] = (value >> 24) & 0xff; +- ((char *) reloc_addr_arg)[5] = (value >> 16) & 0xff; +- ((char *) reloc_addr_arg)[6] = (value >> 8) & 0xff; +- ((char *) reloc_addr_arg)[7] = (value >> 0) & 0xff; ++ ((union unaligned *) reloc_addr)->u8 = value; + return; + + case R_PPC64_UADDR32: +- /* We are big-endian. */ +- ((char *) reloc_addr_arg)[0] = (value >> 24) & 0xff; +- ((char *) reloc_addr_arg)[1] = (value >> 16) & 0xff; +- ((char *) reloc_addr_arg)[2] = (value >> 8) & 0xff; +- ((char *) reloc_addr_arg)[3] = (value >> 0) & 0xff; ++ ((union unaligned *) reloc_addr)->u4 = value; + return; + + case R_PPC64_ADDR32: +@@ -782,10 +776,8 @@ + case R_PPC64_UADDR16: + if (dont_expect ((value + 0x8000) >= 0x10000)) + _dl_reloc_overflow (map, "R_PPC64_UADDR16", reloc_addr, refsym); +- /* We are big-endian. */ +- ((char *) reloc_addr_arg)[0] = (value >> 8) & 0xff; +- ((char *) reloc_addr_arg)[1] = (value >> 0) & 0xff; +- break; ++ ((union unaligned *) reloc_addr)->u2 = value; ++ return; + + case R_PPC64_ADDR16_DS: + if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) diff --git a/SOURCES/glibc-rh1162847-p2.patch b/SOURCES/glibc-rh1162847-p2.patch new file mode 100644 index 0000000..9c67ab6 --- /dev/null +++ b/SOURCES/glibc-rh1162847-p2.patch @@ -0,0 +1,45 @@ +# +# commit 4cb81307b3771672864fa3a7498bd39c13267a00 +# Author: Alan Modra <amodra@gmail.com> +# Date: Fri Oct 4 12:48:51 2013 +0930 +# +# Use stdint.h types in union unaligned. +# +# * sysdeps/powerpc/powerpc32/dl-machine.c (__process_machine_rela): +# Use stdint types in rather than __attribute__((mode())). +# * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_rela): Likewise. +# +diff --git glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c +index f81899a..aba3618 100644 +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc32/dl-machine.c +@@ -418,8 +418,8 @@ __process_machine_rela (struct link_map *map, + { + union unaligned + { +- unsigned u2 __attribute__ ((mode (HI))); +- unsigned u4 __attribute__ ((mode (SI))); ++ uint16_t u2; ++ uint32_t u4; + } __attribute__((__packed__)); + + switch (rinfo) +diff --git glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +index b69a1ce..18cf157 100644 +--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h ++++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h +@@ -563,10 +563,10 @@ elf_machine_rela (struct link_map *map, + const Elf64_Sym *const refsym = sym; + union unaligned + { +- unsigned u2 __attribute__ ((mode (HI))); +- unsigned u4 __attribute__ ((mode (SI))); +- unsigned u8 __attribute__ ((mode (DI))); +- } __attribute__((__packed__)); ++ uint16_t u2; ++ uint32_t u4; ++ uint64_t u8; ++ } __attribute__ ((__packed__)); + + if (r_type == R_PPC64_RELATIVE) + { diff --git a/SOURCES/glibc-rh1162895-1.patch b/SOURCES/glibc-rh1162895-1.patch new file mode 100644 index 0000000..12594d7 --- /dev/null +++ b/SOURCES/glibc-rh1162895-1.patch @@ -0,0 +1,23 @@ +commit f6c44d475104e931bab2b4ffa499961088de673c +Author: Alan Modra <amodra@gmail.com> +Date: Mon Jul 14 21:14:50 2014 +0930 + + Correct DT_PPC64_NUM + + [BZ #17153] + * elf/elf.h (DT_PPC64_NUM): Correct value. + * NEWS: Add to fixed bug list. + +diff --git glibc-2.17-c758a686/elf/elf.h glibc-2.17-c758a686/elf/elf.h +index 40e87b2..78815e8 100644 +--- glibc-2.17-c758a686/elf/elf.h ++++ glibc-2.17-c758a686/elf/elf.h +@@ -2283,7 +2283,7 @@ typedef Elf32_Addr Elf32_Conflict; + #define DT_PPC64_OPD (DT_LOPROC + 1) + #define DT_PPC64_OPDSZ (DT_LOPROC + 2) + #define DT_PPC64_OPT (DT_LOPROC + 3) +-#define DT_PPC64_NUM 3 ++#define DT_PPC64_NUM 4 + + /* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry. */ + #define PPC64_OPT_TLS 1 diff --git a/SOURCES/glibc-rh1162895-2.patch b/SOURCES/glibc-rh1162895-2.patch new file mode 100644 index 0000000..0844319 --- /dev/null +++ b/SOURCES/glibc-rh1162895-2.patch @@ -0,0 +1,200 @@ +commit aa5f0ff11ad2cc85277c64cf65c723a9664e1149 +Author: Alan Modra <amodra@gmail.com> +Date: Wed Apr 16 19:33:32 2014 +0930 + + Correct IBM long double frexpl. + + Besides fixing the bugzilla, this also fixes corner-cases where the high + and low double differ greatly in magnitude, and handles a denormal + input without resorting to a fp rescale. + + [BZ #16740] + [BZ #16619] + * sysdeps/ieee754/ldbl-128ibm/s_frexpl.c (__frexpl): Rewrite. + * math/libm-test.inc (frexp_test_data): Add tests. + +diff --git glibc-2.17-c758a686/math/libm-test.inc glibc-2.17-c758a686/math/libm-test.inc +index 5e6789f..a4bf0b8 100644 +--- glibc-2.17-c758a686/math/libm-test.inc ++++ glibc-2.17-c758a686/math/libm-test.inc +@@ -5691,6 +5691,15 @@ frexp_test (void) + TEST_fI_f1 (frexp, 12.8L, 0.8L, 4); + TEST_fI_f1 (frexp, -27.34L, -0.854375L, 5); + ++#if defined TEST_LDOUBLE && LDBL_MANT_DIG >= 106 ++ TEST_fI_f1 (frexp, 1.0L-0x1p-106L, 1.0L-0x1p-106L, 0), ++ TEST_fI_f1 (frexp, 1.0L, 0.5L, 1), ++ TEST_fI_f1 (frexp, 1.0L+0x1p-105L, 0.5L+0x1p-106L, 1), ++ TEST_fI_f1 (frexp, -1.0L+0x1p-106L, -1.0L+0x1p-106L, 0), ++ TEST_fI_f1 (frexp, -1.0L, -0.5L, 1), ++ TEST_fI_f1 (frexp, -1.0L-0x1p-105L, -0.5L-0x1p-106L, 1), ++#endif ++ + END (frexp); + } + +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c 2015-06-16 15:37:44.293960271 -0400 ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c 2015-06-16 13:53:25.578700428 -0400 +@@ -31,57 +31,115 @@ + #include <math_private.h> + #include <math_ldbl_opt.h> + +-static const long double +-two107 = 162259276829213363391578010288128.0; /* 0x4670000000000000, 0 */ +- + long double __frexpl(long double x, int *eptr) + { +- uint64_t hx, lx, ix, ixl; +- int64_t explo; +- double xhi, xlo; +- +- ldbl_unpack (x, &xhi, &xlo); +- EXTRACT_WORDS64 (hx, xhi); +- EXTRACT_WORDS64 (lx, xlo); +- ixl = 0x7fffffffffffffffULL&lx; +- ix = 0x7fffffffffffffffULL&hx; +- *eptr = 0; +- if(ix>=0x7ff0000000000000ULL||ix==0) return x; /* 0,inf,nan */ +- if (ix<0x0010000000000000ULL) { /* subnormal */ +- x *= two107; +- xhi = ldbl_high (x); +- EXTRACT_WORDS64 (hx, xhi); +- ix = hx&0x7fffffffffffffffULL; +- *eptr = -107; ++ uint64_t hx, lx, ix, ixl; ++ int64_t explo, expon; ++ double xhi, xlo; ++ ++ ldbl_unpack (x, &xhi, &xlo); ++ EXTRACT_WORDS64 (hx, xhi); ++ EXTRACT_WORDS64 (lx, xlo); ++ ixl = 0x7fffffffffffffffULL & lx; ++ ix = 0x7fffffffffffffffULL & hx; ++ expon = 0; ++ if (ix >= 0x7ff0000000000000ULL || ix == 0) ++ { ++ /* 0,inf,nan. */ ++ *eptr = expon; ++ return x; ++ } ++ expon = ix >> 52; ++ if (expon == 0) ++ { ++ /* Denormal high double, the low double must be 0.0. */ ++ int cnt; ++ ++ /* Normalize. */ ++ if (sizeof (ix) == sizeof (long)) ++ cnt = __builtin_clzl (ix); ++ else if ((ix >> 32) != 0) ++ cnt = __builtin_clzl ((long) (ix >> 32)); ++ else ++ cnt = __builtin_clzl ((long) ix) + 32; ++ cnt = cnt - 12; ++ expon -= cnt; ++ ix <<= cnt + 1; ++ } ++ expon -= 1022; ++ ix &= 0x000fffffffffffffULL; ++ hx &= 0x8000000000000000ULL; ++ hx |= (1022LL << 52) | ix; ++ ++ if (ixl != 0) ++ { ++ /* If the high double is an exact power of two and the low ++ double has the opposite sign, then the exponent calculated ++ from the high double is one too big. */ ++ if (ix == 0 ++ && (int64_t) (hx ^ lx) < 0) ++ { ++ hx += 1LL << 52; ++ expon -= 1; ++ } ++ ++ explo = ixl >> 52; ++ if (explo == 0) ++ { ++ /* The low double started out as a denormal. Normalize its ++ mantissa and adjust the exponent. */ ++ int cnt; ++ ++ if (sizeof (ixl) == sizeof (long)) ++ cnt = __builtin_clzl (ixl); ++ else if ((ixl >> 32) != 0) ++ cnt = __builtin_clzl ((long) (ixl >> 32)); ++ else ++ cnt = __builtin_clzl ((long) ixl) + 32; ++ cnt = cnt - 12; ++ explo -= cnt; ++ ixl <<= cnt + 1; ++ } ++ ++ /* With variable precision we can't assume much about the ++ magnitude of the returned low double. It may even be a ++ denormal. */ ++ explo -= expon; ++ ixl &= 0x000fffffffffffffULL; ++ lx &= 0x8000000000000000ULL; ++ if (explo <= 0) ++ { ++ /* Handle denormal low double. */ ++ if (explo > -52) ++ { ++ ixl |= 1LL << 52; ++ ixl >>= 1 - explo; ++ } ++ else ++ { ++ ixl = 0; ++ lx = 0; ++ if ((hx & 0x7ff0000000000000ULL) == (1023LL << 52)) ++ { ++ /* Oops, the adjustment we made above for values a ++ little smaller than powers of two turned out to ++ be wrong since the returned low double will be ++ zero. This can happen if the input was ++ something weird like 0x1p1000 - 0x1p-1000. */ ++ hx -= 1LL << 52; ++ expon += 1; ++ } ++ } ++ explo = 0; + } +- *eptr += (ix>>52)-1022; ++ lx |= (explo << 52) | ixl; ++ } + +- if (ixl != 0ULL) { +- explo = (ixl>>52) - (ix>>52) + 0x3fe; +- if ((ixl&0x7ff0000000000000ULL) == 0LL) { +- /* the lower double is a denormal so we need to correct its +- mantissa and perhaps its exponent. */ +- int cnt; +- +- if (sizeof (ixl) == sizeof (long)) +- cnt = __builtin_clzl (ixl); +- else if ((ixl >> 32) != 0) +- cnt = __builtin_clzl ((long) (ixl >> 32)); +- else +- cnt = __builtin_clzl ((long) ixl) + 32; +- cnt = cnt - 12; +- lx = (lx&0x8000000000000000ULL) | ((explo-cnt)<<52) +- | ((ixl<<(cnt+1))&0x000fffffffffffffULL); +- } else +- lx = (lx&0x800fffffffffffffULL) | (explo<<52); +- } else +- lx = 0ULL; +- +- hx = (hx&0x800fffffffffffffULL) | 0x3fe0000000000000ULL; +- INSERT_WORDS64 (xhi, hx); +- INSERT_WORDS64 (xlo, lx); +- x = ldbl_pack (xhi, xlo); +- return x; ++ INSERT_WORDS64 (xhi, hx); ++ INSERT_WORDS64 (xlo, lx); ++ x = ldbl_pack (xhi, xlo); ++ *eptr = expon; ++ return x; + } + #ifdef IS_IN_libm + long_double_symbol (libm, __frexpl, frexpl); diff --git a/SOURCES/glibc-rh1162895-3.patch b/SOURCES/glibc-rh1162895-3.patch new file mode 100644 index 0000000..e9bfbfa --- /dev/null +++ b/SOURCES/glibc-rh1162895-3.patch @@ -0,0 +1,123 @@ +commit b0abbc21034f0e5edc49023d8fda0616173faf17 +Author: Alan Modra <amodra@gmail.com> +Date: Wed Apr 2 13:46:19 2014 +1030 + + Correct IBM long double nextafterl. + + Fix for values near a power of two, and some tidies. + + [BZ #16739] + * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (__nextafterl): Correct + output when value is near a power of two. Use int64_t for lx and + remove casts. Use decimal rather than hex exponent constants. + Don't use long double multiplication when double will suffice. + * math/libm-test.inc (nextafter_test_data): Add tests. + * NEWS: Add 16739 and 16786 to bug list. + +diff --git glibc-2.17-c758a686/math/libm-test.inc glibc-2.17-c758a686/math/libm-test.inc +index 19194f6..967b679 100644 +--- glibc-2.17-c758a686/math/libm-test.inc ++++ glibc-2.17-c758a686/math/libm-test.inc +@@ -8199,6 +8208,14 @@ pow_test (void) + #if defined TEST_DOUBLE || defined TEST_LDOUBLE + TEST_ff_f (pow, -7.49321e+133, -9.80818e+16, 0, UNDERFLOW_EXCEPTION); + #endif ++#if defined TEST_LDOUBLE && LDBL_MANT_DIG == 106 ++ TEST_ff_f (nextafter, 1.0L, -10.0L, 1.0L-0x1p-106L, NO_EXCEPTION), ++ TEST_ff_f (nextafter, 1.0L, 10.0L, 1.0L+0x1p-105L, NO_EXCEPTION), ++ TEST_ff_f (nextafter, 1.0L-0x1p-106L, 10.0L, 1.0L, NO_EXCEPTION), ++ TEST_ff_f (nextafter, -1.0L, -10.0L, -1.0L-0x1p-105L, NO_EXCEPTION), ++ TEST_ff_f (nextafter, -1.0L, 10.0L, -1.0L+0x1p-106L, NO_EXCEPTION), ++ TEST_ff_f (nextafter, -1.0L+0x1p-106L, -10.0L, -1.0L, NO_EXCEPTION), ++#endif + + TEST_ff_f (pow, -1.0, -0xffffff, -1.0); + TEST_ff_f (pow, -1.0, -0x1fffffe, 1.0); +diff --git glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c +index 30b1540..bf57cb8 100644 +--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c ++++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c +@@ -30,8 +30,7 @@ static char rcsid[] = "$NetBSD: $"; + + long double __nextafterl(long double x, long double y) + { +- int64_t hx,hy,ihx,ihy; +- uint64_t lx; ++ int64_t hx, hy, ihx, ihy, lx; + double xhi, xlo, yhi; + + ldbl_unpack (x, &xhi, &xlo); +@@ -79,19 +78,28 @@ long double __nextafterl(long double x, long double y) + u = math_opt_barrier (x); + x -= __LDBL_DENORM_MIN__; + if (ihx < 0x0360000000000000LL +- || (hx > 0 && (int64_t) lx <= 0) +- || (hx < 0 && (int64_t) lx > 1)) { ++ || (hx > 0 && lx <= 0) ++ || (hx < 0 && lx > 1)) { + u = u * u; + math_force_eval (u); /* raise underflow flag */ + } + return x; + } +- if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ +- INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); +- u = yhi; +- u *= 0x1.0000000000000p-105L; ++ /* If the high double is an exact power of two and the low ++ double is the opposite sign, then 1ulp is one less than ++ what we might determine from the high double. Similarly ++ if X is an exact power of two, and positive, because ++ making it a little smaller will result in the exponent ++ decreasing by one and normalisation of the mantissa. */ ++ if ((hx & 0x000fffffffffffffLL) == 0 ++ && ((lx != 0 && (hx ^ lx) < 0) ++ || (lx == 0 && hx >= 0))) ++ ihx -= 1LL << 52; ++ if (ihx < (106LL << 52)) { /* ulp will denormal */ ++ INSERT_WORDS64 (yhi, ihx & (0x7ffLL<<52)); ++ u = yhi * 0x1p-105; + } else { +- INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); ++ INSERT_WORDS64 (yhi, (ihx & (0x7ffLL<<52))-(105LL<<52)); + u = yhi; + } + return x - u; +@@ -109,8 +117,8 @@ long double __nextafterl(long double x, long double y) + u = math_opt_barrier (x); + x += __LDBL_DENORM_MIN__; + if (ihx < 0x0360000000000000LL +- || (hx > 0 && (int64_t) lx < 0 && lx != 0x8000000000000001LL) +- || (hx < 0 && (int64_t) lx >= 0)) { ++ || (hx > 0 && lx < 0 && lx != 0x8000000000000001LL) ++ || (hx < 0 && lx >= 0)) { + u = u * u; + math_force_eval (u); /* raise underflow flag */ + } +@@ -118,12 +126,21 @@ long double __nextafterl(long double x, long double y) + x = -0.0L; + return x; + } +- if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ +- INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); +- u = yhi; +- u *= 0x1.0000000000000p-105L; ++ /* If the high double is an exact power of two and the low ++ double is the opposite sign, then 1ulp is one less than ++ what we might determine from the high double. Similarly ++ if X is an exact power of two, and negative, because ++ making it a little larger will result in the exponent ++ decreasing by one and normalisation of the mantissa. */ ++ if ((hx & 0x000fffffffffffffLL) == 0 ++ && ((lx != 0 && (hx ^ lx) < 0) ++ || (lx == 0 && hx < 0))) ++ ihx -= 1LL << 52; ++ if (ihx < (106LL << 52)) { /* ulp will denormal */ ++ INSERT_WORDS64 (yhi, ihx & (0x7ffLL<<52)); ++ u = yhi * 0x1p-105; + } else { +- INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); ++ INSERT_WORDS64 (yhi, (ihx & (0x7ffLL<<52))-(105LL<<52)); + u = yhi; + } + return x + u; diff --git a/SOURCES/glibc-rh1163509-1.patch b/SOURCES/glibc-rh1163509-1.patch new file mode 100644 index 0000000..c8cd366 --- /dev/null +++ b/SOURCES/glibc-rh1163509-1.patch @@ -0,0 +1,834 @@ +Note: The __pthread_once definition in the new unified implementation in +this patch has been edited. The original version of the patch had an old +style declaration that was causing a -Werror=old-style-definition failure. + +commit 36875b06e0ed7f137190b9228bef553adfc338ba +Author: Torvald Riegel <triegel@redhat.com> +Date: Wed May 8 16:35:10 2013 +0200 + + Fixed and unified pthread_once. + + [BZ #15215] This unifies various pthread_once architecture-specific + implementations which were using the same algorithm with slightly different + implementations. It also adds missing memory barriers that are required for + correctness. + +diff --git a/nptl/sysdeps/unix/sysv/linux/pthread_once.c b/nptl/sysdeps/unix/sysv/linux/pthread_once.c +new file mode 100644 +index 0000000000000000..2684b660958361d4 +--- /dev/null ++++ b/nptl/sysdeps/unix/sysv/linux/pthread_once.c +@@ -0,0 +1,129 @@ ++/* Copyright (C) 2003-2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Jakub Jelinek <jakub@redhat.com>, 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include "pthreadP.h" ++#include <lowlevellock.h> ++#include <atomic.h> ++ ++ ++unsigned long int __fork_generation attribute_hidden; ++ ++ ++static void ++clear_once_control (void *arg) ++{ ++ pthread_once_t *once_control = (pthread_once_t *) arg; ++ ++ /* Reset to the uninitialized state here. We don't need a stronger memory ++ order because we do not need to make any other of our writes visible to ++ other threads that see this value: This function will be called if we ++ get interrupted (see __pthread_once), so all we need to relay to other ++ threads is the state being reset again. */ ++ *once_control = 0; ++ lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); ++} ++ ++ ++/* This is similar to a lock implementation, but we distinguish between three ++ states: not yet initialized (0), initialization finished (2), and ++ initialization in progress (__fork_generation | 1). If in the first state, ++ threads will try to run the initialization by moving to the second state; ++ the first thread to do so via a CAS on once_control runs init_routine, ++ other threads block. ++ When forking the process, some threads can be interrupted during the second ++ state; they won't be present in the forked child, so we need to restart ++ initialization in the child. To distinguish an in-progress initialization ++ from an interrupted initialization (in which case we need to reclaim the ++ lock), we look at the fork generation that's part of the second state: We ++ can reclaim iff it differs from the current fork generation. ++ XXX: This algorithm has an ABA issue on the fork generation: If an ++ initialization is interrupted, we then fork 2^30 times (30 bits of ++ once_control are used for the fork generation), and try to initialize ++ again, we can deadlock because we can't distinguish the in-progress and ++ interrupted cases anymore. */ ++int ++__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) ++{ ++ while (1) ++ { ++ int oldval, val, newval; ++ ++ /* We need acquire memory order for this load because if the value ++ signals that initialization has finished, we need to be see any ++ data modifications done during initialization. */ ++ val = *once_control; ++ atomic_read_barrier(); ++ do ++ { ++ /* Check if the initialization has already been done. */ ++ if (__glibc_likely ((val & 2) != 0)) ++ return 0; ++ ++ oldval = val; ++ /* We try to set the state to in-progress and having the current ++ fork generation. We don't need atomic accesses for the fork ++ generation because it's immutable in a particular process, and ++ forked child processes start with a single thread that modified ++ the generation. */ ++ newval = __fork_generation | 1; ++ /* We need acquire memory order here for the same reason as for the ++ load from once_control above. */ ++ val = atomic_compare_and_exchange_val_acq (once_control, newval, ++ oldval); ++ } ++ while (__glibc_unlikely (val != oldval)); ++ ++ /* Check if another thread already runs the initializer. */ ++ if ((oldval & 1) != 0) ++ { ++ /* Check whether the initializer execution was interrupted by a ++ fork. We know that for both values, bit 0 is set and bit 1 is ++ not. */ ++ if (oldval == newval) ++ { ++ /* Same generation, some other thread was faster. Wait. */ ++ lll_futex_wait (once_control, newval, LLL_PRIVATE); ++ continue; ++ } ++ } ++ ++ /* This thread is the first here. Do the initialization. ++ Register a cleanup handler so that in case the thread gets ++ interrupted the initialization can be restarted. */ ++ pthread_cleanup_push (clear_once_control, once_control); ++ ++ init_routine (); ++ ++ pthread_cleanup_pop (0); ++ ++ ++ /* Mark *once_control as having finished the initialization. We need ++ release memory order here because we need to synchronize with other ++ threads that want to use the initialized data. */ ++ atomic_write_barrier(); ++ *once_control = 2; ++ ++ /* Wake up all other threads. */ ++ lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); ++ break; ++ } ++ ++ return 0; ++} ++weak_alias (__pthread_once, pthread_once) ++hidden_def (__pthread_once) +diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/pthread_once.c b/nptl/sysdeps/unix/sysv/linux/sparc/pthread_once.c +deleted file mode 100644 +index a2111756374174f2..0000000000000000 +--- a/nptl/sysdeps/unix/sysv/linux/sparc/pthread_once.c ++++ /dev/null +@@ -1,93 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Jakub Jelinek <jakub@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +- +-int +-__pthread_once (once_control, init_routine) +- pthread_once_t *once_control; +- void (*init_routine) (void); +-{ +- while (1) +- { +- int oldval, val, newval; +- +- val = *once_control; +- do +- { +- /* Check if the initialized has already been done. */ +- if ((val & 2) != 0) +- return 0; +- +- oldval = val; +- newval = (oldval & 3) | __fork_generation | 1; +- val = atomic_compare_and_exchange_val_acq (once_control, newval, +- oldval); +- } +- while (__builtin_expect (val != oldval, 0)); +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) +- { +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- if (((oldval ^ newval) & -4) == 0) +- { +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, newval, LLL_PRIVATE); +- continue; +- } +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Add one to *once_control. */ +- atomic_increment (once_control); +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- break; +- } +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/sysdeps/unix/sysv/linux/aarch64/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/aarch64/nptl/pthread_once.c +deleted file mode 100644 +index 0897e1e004ef3278..0000000000000000 +--- a/sysdeps/unix/sysv/linux/aarch64/nptl/pthread_once.c ++++ /dev/null +@@ -1,90 +0,0 @@ +-/* Copyright (C) 2004-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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +-unsigned long int __fork_generation attribute_hidden; +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +-int +-__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +-{ +- for (;;) +- { +- int oldval; +- int newval; +- +- /* Pseudo code: +- newval = __fork_generation | 1; +- oldval = *once_control; +- if ((oldval & 2) == 0) +- *once_control = newval; +- Do this atomically. +- */ +- do +- { +- newval = __fork_generation | 1; +- oldval = *once_control; +- if (oldval & 2) +- break; +- } while (atomic_compare_and_exchange_val_acq (once_control, newval, oldval) != oldval); +- +- /* Check if the initializer has already been done. */ +- if ((oldval & 2) != 0) +- return 0; +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) == 0) +- break; +- +- /* Check whether the initializer execution was interrupted by a fork. */ +- if (oldval != newval) +- break; +- +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, oldval, LLL_PRIVATE); +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- /* Say that the initialisation is done. */ +- *once_control = __fork_generation | 2; +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/sysdeps/unix/sysv/linux/arm/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/arm/nptl/pthread_once.c +deleted file mode 100644 +index 0c03f1c816a2fad5..0000000000000000 +--- a/sysdeps/unix/sysv/linux/arm/nptl/pthread_once.c ++++ /dev/null +@@ -1,89 +0,0 @@ +-/* Copyright (C) 2004-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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +-unsigned long int __fork_generation attribute_hidden; +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +-int +-__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +-{ +- for (;;) +- { +- int oldval; +- int newval; +- +- /* Pseudo code: +- newval = __fork_generation | 1; +- oldval = *once_control; +- if ((oldval & 2) == 0) +- *once_control = newval; +- Do this atomically. +- */ +- do +- { +- newval = __fork_generation | 1; +- oldval = *once_control; +- if (oldval & 2) +- break; +- } while (atomic_compare_and_exchange_val_acq (once_control, newval, oldval) != oldval); +- +- /* Check if the initializer has already been done. */ +- if ((oldval & 2) != 0) +- return 0; +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) == 0) +- break; +- +- /* Check whether the initializer execution was interrupted by a fork. */ +- if (oldval != newval) +- break; +- +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, oldval, LLL_PRIVATE); +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- /* Say that the initialisation is done. */ +- *once_control = __fork_generation | 2; +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/sysdeps/unix/sysv/linux/ia64/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/ia64/nptl/pthread_once.c +deleted file mode 100644 +index 7730935dfec85ae6..0000000000000000 +--- a/sysdeps/unix/sysv/linux/ia64/nptl/pthread_once.c ++++ /dev/null +@@ -1,93 +0,0 @@ +-/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Jakub Jelinek <jakub@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +- +-int +-__pthread_once (once_control, init_routine) +- pthread_once_t *once_control; +- void (*init_routine) (void); +-{ +- while (1) +- { +- int oldval, val, newval; +- +- val = *once_control; +- do +- { +- /* Check if the initialized has already been done. */ +- if ((val & 2) != 0) +- return 0; +- +- oldval = val; +- newval = (oldval & 3) | __fork_generation | 1; +- val = atomic_compare_and_exchange_val_acq (once_control, newval, +- oldval); +- } +- while (__builtin_expect (val != oldval, 0)); +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) +- { +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- if (((oldval ^ newval) & -4) == 0) +- { +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, newval, LLL_PRIVATE); +- continue; +- } +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Add one to *once_control. */ +- atomic_increment (once_control); +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- break; +- } +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/sysdeps/unix/sysv/linux/m68k/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/m68k/nptl/pthread_once.c +deleted file mode 100644 +index 8d81db602eee601f..0000000000000000 +--- a/sysdeps/unix/sysv/linux/m68k/nptl/pthread_once.c ++++ /dev/null +@@ -1,90 +0,0 @@ +-/* Copyright (C) 2010-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Maxim Kuvyrkov <maxim@codesourcery.com>, 2010. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library. If not, see +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +-unsigned long int __fork_generation attribute_hidden; +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +-int +-__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +-{ +- for (;;) +- { +- int oldval; +- int newval; +- +- /* Pseudo code: +- newval = __fork_generation | 1; +- oldval = *once_control; +- if ((oldval & 2) == 0) +- *once_control = newval; +- Do this atomically. +- */ +- do +- { +- newval = __fork_generation | 1; +- oldval = *once_control; +- if (oldval & 2) +- break; +- } while (atomic_compare_and_exchange_val_acq (once_control, newval, oldval) != oldval); +- +- /* Check if the initializer has already been done. */ +- if ((oldval & 2) != 0) +- return 0; +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) == 0) +- break; +- +- /* Check whether the initializer execution was interrupted by a fork. */ +- if (oldval != newval) +- break; +- +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, oldval, LLL_PRIVATE); +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- /* Say that the initialisation is done. */ +- *once_control = __fork_generation | 2; +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/sysdeps/unix/sysv/linux/mips/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/mips/nptl/pthread_once.c +deleted file mode 100644 +index 308da8bbce0c3800..0000000000000000 +--- a/sysdeps/unix/sysv/linux/mips/nptl/pthread_once.c ++++ /dev/null +@@ -1,93 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Jakub Jelinek <jakub@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +- +-int +-__pthread_once (once_control, init_routine) +- pthread_once_t *once_control; +- void (*init_routine) (void); +-{ +- while (1) +- { +- int oldval, val, newval; +- +- val = *once_control; +- do +- { +- /* Check if the initialized has already been done. */ +- if ((val & 2) != 0) +- return 0; +- +- oldval = val; +- newval = (oldval & 3) | __fork_generation | 1; +- val = atomic_compare_and_exchange_val_acq (once_control, newval, +- oldval); +- } +- while (__builtin_expect (val != oldval, 0)); +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) +- { +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- if (((oldval ^ newval) & -4) == 0) +- { +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, newval, LLL_PRIVATE); +- continue; +- } +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Add one to *once_control. */ +- atomic_increment (once_control); +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- break; +- } +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/sysdeps/unix/sysv/linux/tile/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/tile/nptl/pthread_once.c +deleted file mode 100644 +index 93ac29b24c440b2c..0000000000000000 +--- a/sysdeps/unix/sysv/linux/tile/nptl/pthread_once.c ++++ /dev/null +@@ -1,94 +0,0 @@ +-/* Copyright (C) 2011-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. +- Based on work contributed by Jakub Jelinek <jakub@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <nptl/pthreadP.h> +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +- +-int +-__pthread_once (once_control, init_routine) +- pthread_once_t *once_control; +- void (*init_routine) (void); +-{ +- while (1) +- { +- int oldval, val, newval; +- +- val = *once_control; +- do +- { +- /* Check if the initialized has already been done. */ +- if ((val & 2) != 0) +- return 0; +- +- oldval = val; +- newval = (oldval & 3) | __fork_generation | 1; +- val = atomic_compare_and_exchange_val_acq (once_control, newval, +- oldval); +- } +- while (__builtin_expect (val != oldval, 0)); +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) +- { +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- if (((oldval ^ newval) & -4) == 0) +- { +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, newval, LLL_PRIVATE); +- continue; +- } +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Add one to *once_control. */ +- atomic_increment (once_control); +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- break; +- } +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) diff --git a/SOURCES/glibc-rh1163509-2.patch b/SOURCES/glibc-rh1163509-2.patch new file mode 100644 index 0000000..78284d0 --- /dev/null +++ b/SOURCES/glibc-rh1163509-2.patch @@ -0,0 +1,294 @@ +This patch is based on the below upstream commit. +It only includes relevant pthread_once bits. + +commit 08192659bbeae149e7cb1f4c43547257f7099bb0 +Author: Roland McGrath <roland@hack.frob.com> +Date: Mon Jul 7 09:28:38 2014 -0700 + + Get rid of nptl/sysdeps/ entirely! + +diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c +index ed1ea3498c397e5c..10c01d6023508e3c 100644 +--- a/nptl/pthread_once.c ++++ b/nptl/pthread_once.c +@@ -1,6 +1,6 @@ +-/* Copyright (C) 2002-2012 Free Software Foundation, Inc. ++/* Copyright (C) 2003-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. +- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. ++ Contributed by Jakub Jelinek <jakub@redhat.com>, 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 +@@ -9,7 +9,7 @@ + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public +@@ -18,37 +18,114 @@ + + #include "pthreadP.h" + #include <lowlevellock.h> ++#include <atomic.h> + + ++unsigned long int __fork_generation attribute_hidden; + +-static int once_lock = LLL_LOCK_INITIALIZER; + ++static void ++clear_once_control (void *arg) ++{ ++ pthread_once_t *once_control = (pthread_once_t *) arg; ++ ++ /* Reset to the uninitialized state here. We don't need a stronger memory ++ order because we do not need to make any other of our writes visible to ++ other threads that see this value: This function will be called if we ++ get interrupted (see __pthread_once), so all we need to relay to other ++ threads is the state being reset again. */ ++ *once_control = 0; ++ lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); ++} + ++ ++/* This is similar to a lock implementation, but we distinguish between three ++ states: not yet initialized (0), initialization finished (2), and ++ initialization in progress (__fork_generation | 1). If in the first state, ++ threads will try to run the initialization by moving to the second state; ++ the first thread to do so via a CAS on once_control runs init_routine, ++ other threads block. ++ When forking the process, some threads can be interrupted during the second ++ state; they won't be present in the forked child, so we need to restart ++ initialization in the child. To distinguish an in-progress initialization ++ from an interrupted initialization (in which case we need to reclaim the ++ lock), we look at the fork generation that's part of the second state: We ++ can reclaim iff it differs from the current fork generation. ++ XXX: This algorithm has an ABA issue on the fork generation: If an ++ initialization is interrupted, we then fork 2^30 times (30 bits of ++ once_control are used for the fork generation), and try to initialize ++ again, we can deadlock because we can't distinguish the in-progress and ++ interrupted cases anymore. */ + int + __pthread_once (once_control, init_routine) + pthread_once_t *once_control; + void (*init_routine) (void); + { +- /* XXX Depending on whether the LOCK_IN_ONCE_T is defined use a +- global lock variable or one which is part of the pthread_once_t +- object. */ +- if (*once_control == PTHREAD_ONCE_INIT) ++ while (1) + { +- lll_lock (once_lock, LLL_PRIVATE); ++ int oldval, val, newval; + +- /* XXX This implementation is not complete. It doesn't take +- cancelation and fork into account. */ +- if (*once_control == PTHREAD_ONCE_INIT) ++ /* We need acquire memory order for this load because if the value ++ signals that initialization has finished, we need to be see any ++ data modifications done during initialization. */ ++ val = *once_control; ++ atomic_read_barrier(); ++ do + { +- init_routine (); ++ /* Check if the initialization has already been done. */ ++ if (__glibc_likely ((val & 2) != 0)) ++ return 0; ++ ++ oldval = val; ++ /* We try to set the state to in-progress and having the current ++ fork generation. We don't need atomic accesses for the fork ++ generation because it's immutable in a particular process, and ++ forked child processes start with a single thread that modified ++ the generation. */ ++ newval = __fork_generation | 1; ++ /* We need acquire memory order here for the same reason as for the ++ load from once_control above. */ ++ val = atomic_compare_and_exchange_val_acq (once_control, newval, ++ oldval); ++ } ++ while (__glibc_unlikely (val != oldval)); + +- *once_control = !PTHREAD_ONCE_INIT; ++ /* Check if another thread already runs the initializer. */ ++ if ((oldval & 1) != 0) ++ { ++ /* Check whether the initializer execution was interrupted by a ++ fork. We know that for both values, bit 0 is set and bit 1 is ++ not. */ ++ if (oldval == newval) ++ { ++ /* Same generation, some other thread was faster. Wait. */ ++ lll_futex_wait (once_control, newval, LLL_PRIVATE); ++ continue; ++ } + } + +- lll_unlock (once_lock, LLL_PRIVATE); ++ /* This thread is the first here. Do the initialization. ++ Register a cleanup handler so that in case the thread gets ++ interrupted the initialization can be restarted. */ ++ pthread_cleanup_push (clear_once_control, once_control); ++ ++ init_routine (); ++ ++ pthread_cleanup_pop (0); ++ ++ ++ /* Mark *once_control as having finished the initialization. We need ++ release memory order here because we need to synchronize with other ++ threads that want to use the initialized data. */ ++ atomic_write_barrier(); ++ *once_control = 2; ++ ++ /* Wake up all other threads. */ ++ lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); ++ break; + } + + return 0; + } +-strong_alias (__pthread_once, pthread_once) ++weak_alias (__pthread_once, pthread_once) + hidden_def (__pthread_once) +diff --git a/nptl/sysdeps/unix/sysv/linux/pthread_once.c b/nptl/sysdeps/unix/sysv/linux/pthread_once.c +deleted file mode 100644 +index 2684b660958361d4..0000000000000000 +--- a/nptl/sysdeps/unix/sysv/linux/pthread_once.c ++++ /dev/null +@@ -1,129 +0,0 @@ +-/* Copyright (C) 2003-2014 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Jakub Jelinek <jakub@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +-#include <atomic.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- /* Reset to the uninitialized state here. We don't need a stronger memory +- order because we do not need to make any other of our writes visible to +- other threads that see this value: This function will be called if we +- get interrupted (see __pthread_once), so all we need to relay to other +- threads is the state being reset again. */ +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +- +-/* This is similar to a lock implementation, but we distinguish between three +- states: not yet initialized (0), initialization finished (2), and +- initialization in progress (__fork_generation | 1). If in the first state, +- threads will try to run the initialization by moving to the second state; +- the first thread to do so via a CAS on once_control runs init_routine, +- other threads block. +- When forking the process, some threads can be interrupted during the second +- state; they won't be present in the forked child, so we need to restart +- initialization in the child. To distinguish an in-progress initialization +- from an interrupted initialization (in which case we need to reclaim the +- lock), we look at the fork generation that's part of the second state: We +- can reclaim iff it differs from the current fork generation. +- XXX: This algorithm has an ABA issue on the fork generation: If an +- initialization is interrupted, we then fork 2^30 times (30 bits of +- once_control are used for the fork generation), and try to initialize +- again, we can deadlock because we can't distinguish the in-progress and +- interrupted cases anymore. */ +-int +-__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +-{ +- while (1) +- { +- int oldval, val, newval; +- +- /* We need acquire memory order for this load because if the value +- signals that initialization has finished, we need to be see any +- data modifications done during initialization. */ +- val = *once_control; +- atomic_read_barrier(); +- do +- { +- /* Check if the initialization has already been done. */ +- if (__glibc_likely ((val & 2) != 0)) +- return 0; +- +- oldval = val; +- /* We try to set the state to in-progress and having the current +- fork generation. We don't need atomic accesses for the fork +- generation because it's immutable in a particular process, and +- forked child processes start with a single thread that modified +- the generation. */ +- newval = __fork_generation | 1; +- /* We need acquire memory order here for the same reason as for the +- load from once_control above. */ +- val = atomic_compare_and_exchange_val_acq (once_control, newval, +- oldval); +- } +- while (__glibc_unlikely (val != oldval)); +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) +- { +- /* Check whether the initializer execution was interrupted by a +- fork. We know that for both values, bit 0 is set and bit 1 is +- not. */ +- if (oldval == newval) +- { +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, newval, LLL_PRIVATE); +- continue; +- } +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Mark *once_control as having finished the initialization. We need +- release memory order here because we need to synchronize with other +- threads that want to use the initialized data. */ +- atomic_write_barrier(); +- *once_control = 2; +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- break; +- } +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) diff --git a/SOURCES/glibc-rh1163509-3.patch b/SOURCES/glibc-rh1163509-3.patch new file mode 100644 index 0000000..17b2c93 --- /dev/null +++ b/SOURCES/glibc-rh1163509-3.patch @@ -0,0 +1,108 @@ +commit 63668b7084ac26865136e59fdf17781f9f49bd99 +Author: Torvald Riegel <triegel@redhat.com> +Date: Fri Oct 11 18:58:04 2013 +0300 + + pthread_once: Clean up constants. + + [BZ #15215] This just gives a name to the integer constants being used. + +diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h +index dda1032d5aa95234..1a842e06bff82479 100644 +--- a/nptl/pthreadP.h ++++ b/nptl/pthreadP.h +@@ -159,6 +159,12 @@ enum + #define FUTEX_TID_MASK 0x3fffffff + + ++/* pthread_once definitions. See __pthread_once for how these are used. */ ++#define __PTHREAD_ONCE_INPROGRESS 1 ++#define __PTHREAD_ONCE_DONE 2 ++#define __PTHREAD_ONCE_FORK_GEN_INCR 4 ++ ++ + /* Internal variables. */ + + +diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c +index 10c01d6023508e3c..595bd7e298003e00 100644 +--- a/nptl/pthread_once.c ++++ b/nptl/pthread_once.c +@@ -40,8 +40,11 @@ clear_once_control (void *arg) + + + /* This is similar to a lock implementation, but we distinguish between three +- states: not yet initialized (0), initialization finished (2), and +- initialization in progress (__fork_generation | 1). If in the first state, ++ states: not yet initialized (0), initialization in progress ++ (__fork_generation | __PTHREAD_ONCE_INPROGRESS), and initialization ++ finished (__PTHREAD_ONCE_DONE); __fork_generation does not use the bits ++ that are used for __PTHREAD_ONCE_INPROGRESS and __PTHREAD_ONCE_DONE (which ++ is what __PTHREAD_ONCE_FORK_GEN_INCR is used for). If in the first state, + threads will try to run the initialization by moving to the second state; + the first thread to do so via a CAS on once_control runs init_routine, + other threads block. +@@ -66,14 +69,14 @@ __pthread_once (once_control, init_routine) + int oldval, val, newval; + + /* We need acquire memory order for this load because if the value +- signals that initialization has finished, we need to be see any ++ signals that initialization has finished, we need to see any + data modifications done during initialization. */ + val = *once_control; + atomic_read_barrier(); + do + { + /* Check if the initialization has already been done. */ +- if (__glibc_likely ((val & 2) != 0)) ++ if (__glibc_likely ((val & __PTHREAD_ONCE_DONE) != 0)) + return 0; + + oldval = val; +@@ -82,7 +85,7 @@ __pthread_once (once_control, init_routine) + generation because it's immutable in a particular process, and + forked child processes start with a single thread that modified + the generation. */ +- newval = __fork_generation | 1; ++ newval = __fork_generation | __PTHREAD_ONCE_INPROGRESS; + /* We need acquire memory order here for the same reason as for the + load from once_control above. */ + val = atomic_compare_and_exchange_val_acq (once_control, newval, +@@ -91,11 +94,11 @@ __pthread_once (once_control, init_routine) + while (__glibc_unlikely (val != oldval)); + + /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) ++ if ((oldval & __PTHREAD_ONCE_INPROGRESS) != 0) + { + /* Check whether the initializer execution was interrupted by a +- fork. We know that for both values, bit 0 is set and bit 1 is +- not. */ ++ fork. We know that for both values, __PTHREAD_ONCE_INPROGRESS ++ is set and __PTHREAD_ONCE_DONE is not. */ + if (oldval == newval) + { + /* Same generation, some other thread was faster. Wait. */ +@@ -118,7 +121,7 @@ __pthread_once (once_control, init_routine) + release memory order here because we need to synchronize with other + threads that want to use the initialized data. */ + atomic_write_barrier(); +- *once_control = 2; ++ *once_control = __PTHREAD_ONCE_DONE; + + /* Wake up all other threads. */ + lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +diff --git a/nptl/sysdeps/unix/sysv/linux/fork.c b/nptl/sysdeps/unix/sysv/linux/fork.c +index 0635bfdb6cdf0aa8..8c197cb8e4347959 100644 +--- a/nptl/sysdeps/unix/sysv/linux/fork.c ++++ b/nptl/sysdeps/unix/sysv/linux/fork.c +@@ -146,8 +146,9 @@ __libc_fork (void) + + assert (THREAD_GETMEM (self, tid) != ppid); + ++ /* See __pthread_once. */ + if (__fork_generation_pointer != NULL) +- *__fork_generation_pointer += 4; ++ *__fork_generation_pointer += __PTHREAD_ONCE_FORK_GEN_INCR; + + /* Adjust the PID field for the new process. */ + THREAD_SETMEM (self, pid, THREAD_GETMEM (self, tid)); diff --git a/SOURCES/glibc-rh1163509-4.patch b/SOURCES/glibc-rh1163509-4.patch new file mode 100644 index 0000000..641face --- /dev/null +++ b/SOURCES/glibc-rh1163509-4.patch @@ -0,0 +1,443 @@ +This patch is based on the below upstream commit. +File deletions were altered to reflect file renames. + +commit f50277c19df0937ea9691ab7e7c642ecd3ed3d94 +Author: Torvald Riegel <triegel@redhat.com> +Date: Sun Oct 19 21:59:26 2014 +0200 + + pthread_once: Add fast path and remove x86 variants. + +diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c +index 595bd7e298003e00..2afb79c01fe0a61e 100644 +--- a/nptl/pthread_once.c ++++ b/nptl/pthread_once.c +@@ -58,11 +58,13 @@ clear_once_control (void *arg) + initialization is interrupted, we then fork 2^30 times (30 bits of + once_control are used for the fork generation), and try to initialize + again, we can deadlock because we can't distinguish the in-progress and +- interrupted cases anymore. */ +-int +-__pthread_once (once_control, init_routine) +- pthread_once_t *once_control; +- void (*init_routine) (void); ++ interrupted cases anymore. ++ XXX: We split out this slow path because current compilers do not generate ++ as efficient code when the fast path in __pthread_once below is not in a ++ separate function. */ ++static int ++__attribute__ ((noinline)) ++__pthread_once_slow (pthread_once_t *once_control, void (*init_routine) (void)) + { + while (1) + { +@@ -72,7 +74,7 @@ __pthread_once (once_control, init_routine) + signals that initialization has finished, we need to see any + data modifications done during initialization. */ + val = *once_control; +- atomic_read_barrier(); ++ atomic_read_barrier (); + do + { + /* Check if the initialization has already been done. */ +@@ -130,5 +132,18 @@ __pthread_once (once_control, init_routine) + + return 0; + } ++ ++int ++__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) ++{ ++ /* Fast path. See __pthread_once_slow. */ ++ int val; ++ val = *once_control; ++ atomic_read_barrier (); ++ if (__glibc_likely ((val & __PTHREAD_ONCE_DONE) != 0)) ++ return 0; ++ else ++ return __pthread_once_slow (once_control, init_routine); ++} + weak_alias (__pthread_once, pthread_once) + hidden_def (__pthread_once) +diff --git a/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S b/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S +deleted file mode 100644 +index ca3b860a7f6f95ae..0000000000000000 +--- a/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S ++++ /dev/null +@@ -1,178 +0,0 @@ +-/* Copyright (C) 2002-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <unwindbuf.h> +-#include <sysdep.h> +-#include <kernel-features.h> +-#include <lowlevellock.h> +- +- +- .comm __fork_generation, 4, 4 +- +- .text +- +- +- .globl __pthread_once +- .type __pthread_once,@function +- .align 16 +- cfi_startproc +-__pthread_once: +- movl 4(%esp), %ecx +- testl $2, (%ecx) +- jz 1f +- xorl %eax, %eax +- ret +- +-1: pushl %ebx +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (3, 0) +- pushl %esi +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (6, 0) +- movl %ecx, %ebx +- xorl %esi, %esi +- +- /* Not yet initialized or initialization in progress. +- Get the fork generation counter now. */ +-6: movl (%ebx), %eax +-#ifdef PIC +- LOAD_PIC_REG(cx) +-#endif +- +-5: movl %eax, %edx +- +- testl $2, %eax +- jnz 4f +- +- andl $3, %edx +-#ifdef PIC +- orl __fork_generation@GOTOFF(%ecx), %edx +-#else +- orl __fork_generation, %edx +-#endif +- orl $1, %edx +- +- LOCK +- cmpxchgl %edx, (%ebx) +- jnz 5b +- +- /* Check whether another thread already runs the initializer. */ +- testl $1, %eax +- jz 3f /* No -> do it. */ +- +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- xorl %edx, %eax +- testl $0xfffffffc, %eax +- jnz 3f /* Different for generation -> run initializer. */ +- +- /* Somebody else got here first. Wait. */ +-#ifdef __ASSUME_PRIVATE_FUTEX +- movl $FUTEX_WAIT|FUTEX_PRIVATE_FLAG, %ecx +-#else +-# if FUTEX_WAIT == 0 +- movl %gs:PRIVATE_FUTEX, %ecx +-# else +- movl $FUTEX_WAIT, %ecx +- orl %gs:PRIVATE_FUTEX, %ecx +-# endif +-#endif +- movl $SYS_futex, %eax +- ENTER_KERNEL +- jmp 6b +- +-3: /* Call the initializer function after setting up the +- cancellation handler. Note that it is not possible here +- to use the unwind-based cleanup handling. This would require +- that the user-provided function and all the code it calls +- is compiled with exceptions. Unfortunately this cannot be +- guaranteed. */ +- subl $UNWINDBUFSIZE+8, %esp +- cfi_adjust_cfa_offset (UNWINDBUFSIZE+8) +- movl %ecx, %ebx /* PIC register value. */ +- +- leal 8+UWJMPBUF(%esp), %eax +- movl $0, 4(%esp) +- movl %eax, (%esp) +- call __sigsetjmp@PLT +- testl %eax, %eax +- jne 7f +- +- leal 8(%esp), %eax +- call HIDDEN_JUMPTARGET(__pthread_register_cancel) +- +- /* Call the user-provided initialization function. */ +- call *24+UNWINDBUFSIZE(%esp) +- +- /* Pop the cleanup handler. */ +- leal 8(%esp), %eax +- call HIDDEN_JUMPTARGET(__pthread_unregister_cancel) +- addl $UNWINDBUFSIZE+8, %esp +- cfi_adjust_cfa_offset (-UNWINDBUFSIZE-8) +- +- /* Sucessful run of the initializer. Signal that we are done. */ +- movl 12(%esp), %ebx +- LOCK +- addl $1, (%ebx) +- +- /* Wake up all other threads. */ +- movl $0x7fffffff, %edx +-#ifdef __ASSUME_PRIVATE_FUTEX +- movl $FUTEX_WAKE|FUTEX_PRIVATE_FLAG, %ecx +-#else +- movl $FUTEX_WAKE, %ecx +- orl %gs:PRIVATE_FUTEX, %ecx +-#endif +- movl $SYS_futex, %eax +- ENTER_KERNEL +- +-4: popl %esi +- cfi_adjust_cfa_offset (-4) +- cfi_restore (6) +- popl %ebx +- cfi_adjust_cfa_offset (-4) +- cfi_restore (3) +- xorl %eax, %eax +- ret +- +-7: /* __sigsetjmp returned for the second time. */ +- movl 20+UNWINDBUFSIZE(%esp), %ebx +- cfi_adjust_cfa_offset (UNWINDBUFSIZE+16) +- cfi_offset (3, -8) +- cfi_offset (6, -12) +- movl $0, (%ebx) +- +- movl $0x7fffffff, %edx +-#ifdef __ASSUME_PRIVATE_FUTEX +- movl $FUTEX_WAKE|FUTEX_PRIVATE_FLAG, %ecx +-#else +- movl $FUTEX_WAKE, %ecx +- orl %gs:PRIVATE_FUTEX, %ecx +-#endif +- movl $SYS_futex, %eax +- ENTER_KERNEL +- +- leal 8(%esp), %eax +- call HIDDEN_JUMPTARGET (__pthread_unwind_next) +- /* NOTREACHED */ +- hlt +- cfi_endproc +- .size __pthread_once,.-__pthread_once +- +-hidden_def (__pthread_once) +-strong_alias (__pthread_once, pthread_once) +diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S +deleted file mode 100644 +index 7f5c0810fa16b987..0000000000000000 +--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S ++++ /dev/null +@@ -1,193 +0,0 @@ +-/* Copyright (C) 2002-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Ulrich Drepper <drepper@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <sysdep.h> +-#include <kernel-features.h> +-#include <tcb-offsets.h> +-#include <lowlevellock.h> +- +- +- .comm __fork_generation, 4, 4 +- +- .text +- +- +- .globl __pthread_once +- .type __pthread_once,@function +- .align 16 +-__pthread_once: +-.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 +- testl $2, (%rdi) +- jz 1f +- xorl %eax, %eax +- retq +- +- /* Preserve the function pointer. */ +-1: pushq %rsi +- cfi_adjust_cfa_offset(8) +- xorq %r10, %r10 +- +- /* Not yet initialized or initialization in progress. +- Get the fork generation counter now. */ +-6: movl (%rdi), %eax +- +-5: movl %eax, %edx +- +- testl $2, %eax +- jnz 4f +- +- andl $3, %edx +- orl __fork_generation(%rip), %edx +- orl $1, %edx +- +- LOCK +- cmpxchgl %edx, (%rdi) +- jnz 5b +- +- /* Check whether another thread already runs the initializer. */ +- testl $1, %eax +- jz 3f /* No -> do it. */ +- +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- xorl %edx, %eax +- testl $0xfffffffc, %eax +- jnz 3f /* Different for generation -> run initializer. */ +- +- /* Somebody else got here first. Wait. */ +-#ifdef __ASSUME_PRIVATE_FUTEX +- movl $FUTEX_WAIT|FUTEX_PRIVATE_FLAG, %esi +-#else +-# if FUTEX_WAIT == 0 +- movl %fs:PRIVATE_FUTEX, %esi +-# else +- movl $FUTEX_WAIT, %esi +- orl %fs:PRIVATE_FUTEX, %esi +-# endif +-#endif +- movl $SYS_futex, %eax +- syscall +- jmp 6b +- +- /* Preserve the pointer to the control variable. */ +-3: pushq %rdi +- cfi_adjust_cfa_offset(8) +- pushq %rdi +- cfi_adjust_cfa_offset(8) +- +-.LcleanupSTART: +- callq *16(%rsp) +-.LcleanupEND: +- +- /* Get the control variable address back. */ +- popq %rdi +- cfi_adjust_cfa_offset(-8) +- +- /* Sucessful run of the initializer. Signal that we are done. */ +- LOCK +- incl (%rdi) +- +- addq $8, %rsp +- cfi_adjust_cfa_offset(-8) +- +- /* Wake up all other threads. */ +- movl $0x7fffffff, %edx +-#ifdef __ASSUME_PRIVATE_FUTEX +- movl $FUTEX_WAKE|FUTEX_PRIVATE_FLAG, %esi +-#else +- movl $FUTEX_WAKE, %esi +- orl %fs:PRIVATE_FUTEX, %esi +-#endif +- movl $SYS_futex, %eax +- syscall +- +-4: addq $8, %rsp +- cfi_adjust_cfa_offset(-8) +- xorl %eax, %eax +- retq +- .size __pthread_once,.-__pthread_once +- +- +-hidden_def (__pthread_once) +-strong_alias (__pthread_once, pthread_once) +- +- +- .type clear_once_control,@function +- .align 16 +-clear_once_control: +- cfi_adjust_cfa_offset(3 * 8) +- movq (%rsp), %rdi +- movq %rax, %r8 +- movl $0, (%rdi) +- +- movl $0x7fffffff, %edx +-#ifdef __ASSUME_PRIVATE_FUTEX +- movl $FUTEX_WAKE|FUTEX_PRIVATE_FLAG, %esi +-#else +- movl $FUTEX_WAKE, %esi +- orl %fs:PRIVATE_FUTEX, %esi +-#endif +- movl $SYS_futex, %eax +- syscall +- +- movq %r8, %rdi +-.LcallUR: +- call _Unwind_Resume@PLT +- hlt +-.LENDCODE: +- cfi_endproc +- .size clear_once_control,.-clear_once_control +- +- +- .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 clear_once_control-.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 diff --git a/SOURCES/glibc-rh1163509-5.patch b/SOURCES/glibc-rh1163509-5.patch new file mode 100644 index 0000000..cc314ec --- /dev/null +++ b/SOURCES/glibc-rh1163509-5.patch @@ -0,0 +1,720 @@ +This patch removes the following remaining architecture specific +pthread_once implementations: + +- alpha, hppa, sh: Not used in RHEL. + +- s390: Was first moved, then renamed upstream by the following commits: + + commit 52ae23b4bfa09fa1f42e3f659aaa057d1176d06b + Author: Roland McGrath <roland@hack.frob.com> + Date: Thu Jun 26 09:31:11 2014 -0700 + + Move remaining S390 code out of nptl/. + + commit bc89c0fc70ba952f78fc27fc261ec209be0a6732 + Author: Torvald Riegel <triegel@redhat.com> + Date: Mon Dec 8 18:32:14 2014 +0100 + + Remove custom pthread_once implementation on s390. + +- powerpc: Was removed upstream by the following commit: + + commit 75ffb047f6ee2a545da8cf69dba9a979ca6271ce + Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> + Date: Sun Apr 13 18:13:42 2014 -0500 + + PowerPC: Sync pthread_once with default implementation + +diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c b/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c +deleted file mode 100644 +index 52ab53f0a912d107..0000000000000000 +--- a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c ++++ /dev/null +@@ -1,110 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Paul Mackerras <paulus@au.ibm.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- __asm __volatile (__lll_rel_instr); +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +- +-int +-__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +-{ +- for (;;) +- { +- int oldval; +- int newval; +- int tmp; +- +- /* Pseudo code: +- newval = __fork_generation | 1; +- oldval = *once_control; +- if ((oldval & 2) == 0) +- *once_control = newval; +- Do this atomically with an acquire barrier. +- */ +- newval = __fork_generation | 1; +- __asm __volatile ("1: lwarx %0,0,%3" MUTEX_HINT_ACQ "\n" +- " andi. %1,%0,2\n" +- " bne 2f\n" +- " stwcx. %4,0,%3\n" +- " bne 1b\n" +- "2: " __lll_acq_instr +- : "=&r" (oldval), "=&r" (tmp), "=m" (*once_control) +- : "r" (once_control), "r" (newval), "m" (*once_control) +- : "cr0"); +- +- /* Check if the initializer has already been done. */ +- if ((oldval & 2) != 0) +- return 0; +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) == 0) +- break; +- +- /* Check whether the initializer execution was interrupted by a fork. */ +- if (oldval != newval) +- break; +- +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, oldval, LLL_PRIVATE); +- } +- +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Add one to *once_control to take the bottom 2 bits from 01 to 10. +- A release barrier is needed to ensure memory written by init_routine +- is seen in other threads before *once_control changes. */ +- int tmp; +- __asm __volatile (__lll_rel_instr "\n" +- "1: lwarx %0,0,%2" MUTEX_HINT_REL "\n" +- " addi %0,%0,1\n" +- " stwcx. %0,0,%2\n" +- " bne- 1b" +- : "=&b" (tmp), "=m" (*once_control) +- : "r" (once_control), "m" (*once_control) +- : "cr0"); +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/nptl/sysdeps/unix/sysv/linux/s390/pthread_once.c b/nptl/sysdeps/unix/sysv/linux/s390/pthread_once.c +deleted file mode 100644 +index 4bce7fec13ea3bb2..0000000000000000 +--- a/nptl/sysdeps/unix/sysv/linux/s390/pthread_once.c ++++ /dev/null +@@ -1,108 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +- +-int +-__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +-{ +- while (1) +- { +- int oldval; +- int newval; +- +- /* Pseudo code: +- oldval = *once_control; +- if ((oldval & 2) == 0) +- { +- newval = (oldval & 3) | __fork_generation | 1; +- *once_control = newval; +- } +- Do this atomically. */ +- __asm __volatile (" l %1,%0\n" +- "0: lhi %2,2\n" +- " tml %1,2\n" +- " jnz 1f\n" +- " nr %2,%1\n" +- " ahi %2,1\n" +- " o %2,%3\n" +- " cs %1,%2,%0\n" +- " jl 0b\n" +- "1:" +- : "=Q" (*once_control), "=&d" (oldval), "=&d" (newval) +- : "m" (__fork_generation), "m" (*once_control) +- : "cc" ); +- /* Check if the initialized has already been done. */ +- if ((oldval & 2) != 0) +- break; +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) +- { +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- if (((oldval ^ newval) & -4) == 0) +- { +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, newval, LLL_PRIVATE); +- continue; +- } +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Add one to *once_control. */ +- __asm __volatile (" l %1,%0\n" +- "0: lr %2,%1\n" +- " ahi %2,1\n" +- " cs %1,%2,%0\n" +- " jl 0b\n" +- : "=Q" (*once_control), "=&d" (oldval), "=&d" (newval) +- : "m" (*once_control) : "cc" ); +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- break; +- } +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S +deleted file mode 100644 +index 62b92d8b103ded65..0000000000000000 +--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S ++++ /dev/null +@@ -1,257 +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 +- <http://www.gnu.org/licenses/>. */ +- +-#include <unwindbuf.h> +-#include <sysdep.h> +-#include <kernel-features.h> +-#include <lowlevellock.h> +-#include "lowlevel-atomic.h" +- +- +- .comm __fork_generation, 4, 4 +- +- .text +- .globl __pthread_once +- .type __pthread_once,@function +- .align 5 +- cfi_startproc +-__pthread_once: +- mov.l @r4, r0 +- tst #2, r0 +- bt 1f +- rts +- mov #0, r0 +- +-1: +- mov.l r12, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r12, 0) +- mov.l r9, @-r15 +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (r9, 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 r5, r8 +- mov r4, r9 +- +- /* Not yet initialized or initialization in progress. +- Get the fork generation counter now. */ +-6: +- mov.l @r4, r1 +- mova .Lgot, r0 +- mov.l .Lgot, r12 +- add r0, r12 +- +-5: +- mov r1, r0 +- +- tst #2, r0 +- bf 4f +- +- and #3, r0 +- mov.l .Lfgen, r2 +-#ifdef PIC +- add r12, r2 +-#endif +- mov.l @r2, r3 +- or r3, r0 +- or #1, r0 +- mov r0, r3 +- mov r1, r5 +- +- CMPXCHG (r5, @r4, r3, r2) +- bf 5b +- +- /* Check whether another thread already runs the initializer. */ +- mov r2, r0 +- tst #1, r0 +- bt 3f /* No -> do it. */ +- +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- xor r3, r0 +- mov #-4, r1 /* -4 = 0xfffffffc */ +- tst r1, r0 +- bf 3f /* Different for generation -> run initializer. */ +- +- /* Somebody else got here first. Wait. */ +-#ifdef __ASSUME_PRIVATE_FUTEX +- mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r5 +- extu.b r5, r5 +-#else +- stc gbr, r1 +- mov.w .Lpfoff, r2 +- add r2, r1 +- mov.l @r1, r5 +-# if FUTEX_WAIT != 0 +- mov #FUTEX_WAIT, r0 +- or r0, r5 +-# endif +-#endif +- mov r3, r6 +- mov #0, r7 +- mov #SYS_futex, r3 +- extu.b r3, r3 +- trapa #0x14 +- SYSCALL_INST_PAD +- bra 6b +- nop +- +- .align 2 +-.Lgot: +- .long _GLOBAL_OFFSET_TABLE_ +-#ifdef PIC +-.Lfgen: +- .long __fork_generation@GOTOFF +-#else +-.Lfgen: +- .long __fork_generation +-#endif +- +-3: +- /* Call the initializer function after setting up the +- cancellation handler. Note that it is not possible here +- to use the unwind-based cleanup handling. This would require +- that the user-provided function and all the code it calls +- is compiled with exceptions. Unfortunately this cannot be +- guaranteed. */ +- add #-UNWINDBUFSIZE, r15 +- cfi_adjust_cfa_offset (UNWINDBUFSIZE) +- +- mov.l .Lsigsetjmp, r1 +- mov #UWJMPBUF, r4 +- add r15, r4 +- bsrf r1 +- mov #0, r5 +-.Lsigsetjmp0: +- tst r0, r0 +- bf 7f +- +- mov.l .Lcpush, r1 +- bsrf r1 +- mov r15, r4 +-.Lcpush0: +- +- /* Call the user-provided initialization function. */ +- jsr @r8 +- nop +- +- /* Pop the cleanup handler. */ +- mov.l .Lcpop, r1 +- bsrf r1 +- mov r15, r4 +-.Lcpop0: +- +- add #UNWINDBUFSIZE, r15 +- cfi_adjust_cfa_offset (-UNWINDBUFSIZE) +- +- /* Sucessful run of the initializer. Signal that we are done. */ +- INC (@r9, r2) +- /* Wake up all other threads. */ +- mov r9, r4 +-#ifdef __ASSUME_PRIVATE_FUTEX +- mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5 +- extu.b r5, r5 +-#else +- stc gbr, r1 +- mov.w .Lpfoff, r2 +- add r2, r1 +- mov.l @r1, r5 +- mov #FUTEX_WAKE, r0 +- or r0, r5 +-#endif +- mov #-1, r6 +- shlr r6 /* r6 = 0x7fffffff */ +- mov #0, r7 +- mov #SYS_futex, r3 +- extu.b r3, r3 +- trapa #0x14 +- SYSCALL_INST_PAD +- +-4: +- 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+, r9 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r9) +- mov.l @r15+, r12 +- cfi_adjust_cfa_offset (-4) +- cfi_restore (r12) +- rts +- mov #0, r0 +- +-7: +- /* __sigsetjmp returned for the second time. */ +- cfi_adjust_cfa_offset (UNWINDBUFSIZE+16) +- cfi_offset (r12, -4) +- cfi_offset (r9, -8) +- cfi_offset (r8, -12) +- cfi_offset (pr, -16) +- mov #0, r7 +- mov.l r7, @r9 +- mov r9, r4 +-#ifdef __ASSUME_PRIVATE_FUTEX +- mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5 +-#else +- stc gbr, r1 +- mov.w .Lpfoff, r2 +- add r2, r1 +- mov.l @r1, r5 +- mov #FUTEX_WAKE, r0 +- or r0, r5 +-#endif +- extu.b r5, r5 +- mov #-1, r6 +- shlr r6 /* r6 = 0x7fffffff */ +- mov #SYS_futex, r3 +- extu.b r3, r3 +- trapa #0x14 +- SYSCALL_INST_PAD +- +- mov.l .Lunext, r1 +- bsrf r1 +- mov r15, r4 +-.Lunext0: +- /* NOTREACHED */ +- sleep +- cfi_endproc +- +-#ifndef __ASSUME_PRIVATE_FUTEX +-.Lpfoff: +- .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE +-#endif +- .align 2 +-.Lsigsetjmp: +- .long __sigsetjmp@PLT-(.Lsigsetjmp0-.) +-.Lcpush: +- .long HIDDEN_JUMPTARGET(__pthread_register_cancel)-.Lcpush0 +-.Lcpop: +- .long HIDDEN_JUMPTARGET(__pthread_unregister_cancel)-.Lcpop0 +-.Lunext: +- .long HIDDEN_JUMPTARGET(__pthread_unwind_next)-.Lunext0 +- .size __pthread_once,.-__pthread_once +- +-hidden_def (__pthread_once) +-strong_alias (__pthread_once, pthread_once) +diff --git a/sysdeps/unix/sysv/linux/alpha/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/alpha/nptl/pthread_once.c +deleted file mode 100644 +index c342e0a7a0965086..0000000000000000 +--- a/sysdeps/unix/sysv/linux/alpha/nptl/pthread_once.c ++++ /dev/null +@@ -1,95 +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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +-} +- +-int +-__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +-{ +- for (;;) +- { +- int oldval; +- int newval; +- int tmp; +- +- /* Pseudo code: +- newval = __fork_generation | 1; +- oldval = *once_control; +- if ((oldval & 2) == 0) +- *once_control = newval; +- Do this atomically. +- */ +- newval = __fork_generation | 1; +- __asm __volatile ( +- "1: ldl_l %0, %2\n" +- " and %0, 2, %1\n" +- " bne %1, 2f\n" +- " mov %3, %1\n" +- " stl_c %1, %2\n" +- " beq %1, 1b\n" +- "2: mb" +- : "=&r" (oldval), "=&r" (tmp), "=m" (*once_control) +- : "r" (newval), "m" (*once_control)); +- +- /* Check if the initializer has already been done. */ +- if ((oldval & 2) != 0) +- return 0; +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) == 0) +- break; +- +- /* Check whether the initializer execution was interrupted by a fork. */ +- if (oldval != newval) +- break; +- +- /* Same generation, some other thread was faster. Wait. */ +- lll_futex_wait (once_control, oldval, LLL_PRIVATE); +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- /* Add one to *once_control to take the bottom 2 bits from 01 to 10. */ +- atomic_increment (once_control); +- +- /* Wake up all other threads. */ +- lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) +diff --git a/sysdeps/unix/sysv/linux/hppa/nptl/pthread_once.c b/sysdeps/unix/sysv/linux/hppa/nptl/pthread_once.c +deleted file mode 100644 +index b920ebb22c10a569..0000000000000000 +--- a/sysdeps/unix/sysv/linux/hppa/nptl/pthread_once.c ++++ /dev/null +@@ -1,93 +0,0 @@ +-/* Copyright (C) 2003-2012 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Jakub Jelinek <jakub@redhat.com>, 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 +- <http://www.gnu.org/licenses/>. */ +- +-#include "pthreadP.h" +-#include <lowlevellock.h> +- +- +-unsigned long int __fork_generation attribute_hidden; +- +- +-static void +-clear_once_control (void *arg) +-{ +- pthread_once_t *once_control = (pthread_once_t *) arg; +- +- *once_control = 0; +- lll_private_futex_wake (once_control, INT_MAX); +-} +- +- +-int +-__pthread_once (once_control, init_routine) +- pthread_once_t *once_control; +- void (*init_routine) (void); +-{ +- while (1) +- { +- int oldval, val, newval; +- +- val = *once_control; +- do +- { +- /* Check if the initialized has already been done. */ +- if ((val & 2) != 0) +- return 0; +- +- oldval = val; +- newval = (oldval & 3) | __fork_generation | 1; +- val = atomic_compare_and_exchange_val_acq (once_control, newval, +- oldval); +- } +- while (__builtin_expect (val != oldval, 0)); +- +- /* Check if another thread already runs the initializer. */ +- if ((oldval & 1) != 0) +- { +- /* Check whether the initializer execution was interrupted +- by a fork. */ +- if (((oldval ^ newval) & -4) == 0) +- { +- /* Same generation, some other thread was faster. Wait. */ +- lll_private_futex_wait (once_control, newval); +- continue; +- } +- } +- +- /* This thread is the first here. Do the initialization. +- Register a cleanup handler so that in case the thread gets +- interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); +- +- init_routine (); +- +- pthread_cleanup_pop (0); +- +- +- /* Add one to *once_control. */ +- atomic_increment (once_control); +- +- /* Wake up all other threads. */ +- lll_private_futex_wake (once_control, INT_MAX); +- break; +- } +- +- return 0; +-} +-weak_alias (__pthread_once, pthread_once) +-hidden_def (__pthread_once) diff --git a/SOURCES/glibc-rh1165192.patch b/SOURCES/glibc-rh1165192.patch new file mode 100644 index 0000000..2ae1a66 --- /dev/null +++ b/SOURCES/glibc-rh1165192.patch @@ -0,0 +1,150 @@ +commit 03d2730b44cc2236318fd978afa2651753666c55 +Author: Florian Weimer <fweimer@redhat.com> +Date: Wed Apr 29 14:41:25 2015 +0200 + + CVE-2014-8121: Do not close NSS files database during iteration [BZ #18007] + +diff -up glibc-2.17-c758a686/nss/Makefile.rh1165192 glibc-2.17-c758a686/nss/Makefile +--- glibc-2.17-c758a686/nss/Makefile.rh1165192 2015-01-14 21:22:57.558006945 +0100 ++++ glibc-2.17-c758a686/nss/Makefile 2015-01-14 21:44:59.657777124 +0100 +@@ -38,7 +38,7 @@ install-bin := getent makedb + makedb-modules = xmalloc hash-string + extra-objs += $(makedb-modules:=.o) + +-tests = test-netdb tst-nss-test1 bug17079 ++tests = test-netdb tst-nss-test1 bug17079 tst-nss-getpwent + xtests = bug-erange + + include ../Makeconfig +diff -up glibc-2.17-c758a686/nss/nss_files/files-XXX.c.rh1165192 glibc-2.17-c758a686/nss/nss_files/files-XXX.c +--- glibc-2.17-c758a686/nss/nss_files/files-XXX.c.rh1165192 2015-01-14 21:22:14.630721754 +0100 ++++ glibc-2.17-c758a686/nss/nss_files/files-XXX.c 2015-01-14 21:22:15.072725814 +0100 +@@ -135,7 +135,7 @@ CONCAT(_nss_files_set,ENTNAME) (int stay + + __libc_lock_lock (lock); + +- status = internal_setent (stayopen); ++ status = internal_setent (1); + + if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0) + { +diff -up glibc-2.17-c758a686/nss/tst-nss-getpwent.c.rh1165192 glibc-2.17-c758a686/nss/tst-nss-getpwent.c +--- glibc-2.17-c758a686/nss/tst-nss-getpwent.c.rh1165192 2015-01-14 21:23:50.003236107 +0100 ++++ glibc-2.17-c758a686/nss/tst-nss-getpwent.c 2015-01-14 21:46:39.912194368 +0100 +@@ -0,0 +1,116 @@ ++/* 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <pwd.h> ++#include <stdbool.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++ ++int ++do_test (void) ++{ ++ /* Count the number of entries in the password database, and fetch ++ data from the first and last entries. */ ++ size_t count = 0; ++ struct passwd * pw; ++ char *first_name = NULL; ++ uid_t first_uid = 0; ++ char *last_name = NULL; ++ uid_t last_uid = 0; ++ setpwent (); ++ while ((pw = getpwent ()) != NULL) ++ { ++ if (first_name == NULL) ++ { ++ first_name = strdup (pw->pw_name); ++ if (first_name == NULL) ++ { ++ printf ("strdup: %m\n"); ++ return 1; ++ } ++ first_uid = pw->pw_uid; ++ } ++ ++ free (last_name); ++ last_name = strdup (pw->pw_name); ++ if (last_name == NULL) ++ { ++ printf ("strdup: %m\n"); ++ return 1; ++ } ++ last_uid = pw->pw_uid; ++ ++count; ++ } ++ endpwent (); ++ ++ if (count == 0) ++ { ++ printf ("No entries in the password database.\n"); ++ return 0; ++ } ++ ++ /* Try again, this time interleaving with name-based and UID-based ++ lookup operations. The counts do not match if the interleaved ++ lookups affected the enumeration. */ ++ size_t new_count = 0; ++ setpwent (); ++ while ((pw = getpwent ()) != NULL) ++ { ++ if (new_count == count) ++ { ++ printf ("Additional entry in the password database.\n"); ++ return 1; ++ } ++ ++new_count; ++ struct passwd *pw2 = getpwnam (first_name); ++ if (pw2 == NULL) ++ { ++ printf ("getpwnam (%s) failed: %m\n", first_name); ++ return 1; ++ } ++ pw2 = getpwnam (last_name); ++ if (pw2 == NULL) ++ { ++ printf ("getpwnam (%s) failed: %m\n", last_name); ++ return 1; ++ } ++ pw2 = getpwuid (first_uid); ++ if (pw2 == NULL) ++ { ++ printf ("getpwuid (%llu) failed: %m\n", (unsigned long long) first_uid); ++ return 1; ++ } ++ pw2 = getpwuid (last_uid); ++ if (pw2 == NULL) ++ { ++ printf ("getpwuid (%llu) failed: %m\n", (unsigned long long) last_uid); ++ return 1; ++ } ++ } ++ endpwent (); ++ if (new_count < count) ++ { ++ printf ("Missing entry in the password database.\n"); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/SOURCES/glibc-rh1165212.patch b/SOURCES/glibc-rh1165212.patch new file mode 100644 index 0000000..359a7d2 --- /dev/null +++ b/SOURCES/glibc-rh1165212.patch @@ -0,0 +1,336 @@ +# +# This is a special patch for rhel-6 to fix recursive dlopen. +# It is likely the upstream patch will always be too risky for +# rhel-6 and will involve reorganizing the way in which recursive +# dlopen is allowed to operate and how the _r_debug and stap +# points are used by gdb for the recursive case. +# +# This fix changes the internal API to duplicate the ldconfig +# cache data. This means that at any point the cache can be +# unmapped without any consequences. The caller is responsible +# fore freeing the returned string. +# +# A regression test is added to verify the assertion for _r_debug +# is no longer triggered due to the recursive dlopen. The test to +# verify the fix in _dl_load_cache_lookup is not automated and +# has to be run by hand. +# +# The original version of this patch was based on the first version +# of the upstream patch posted here: +# https://sourceware.org/ml/libc-alpha/2014-12/msg00446.html +# The current version has been modified to reflect the changes +# made in the revision of the patch committed to trunk after +# being posted for review here: +# https://sourceware.org/ml/libc-alpha/2014-12/msg00483.html + +This was committed upstream as: + +commit ccdb048df457d581f6ac7ede8b0c7a593a891dfa +Author: Carlos O'Donell <carlos@systemhalted.org> +Date: Wed Jan 21 01:51:10 2015 -0500 + + Fix recursive dlopen. + +--- glibc-2.17-c758a686/dlfcn/Makefile 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/dlfcn/Makefile 2015-06-22 12:44:41.000000000 -0400 +@@ -35,12 +35,12 @@ endif + ifeq (yes,$(build-shared)) + tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \ + bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2 \ +- bug-atexit3 tstatexit ++ bug-atexit3 tstatexit tst-rec-dlopen + endif + modules-names = glreflib1 glreflib2 glreflib3 failtestmod defaultmod1 \ + defaultmod2 errmsg1mod modatexit modcxaatexit \ + bug-dlsym1-lib1 bug-dlsym1-lib2 bug-atexit1-lib \ +- bug-atexit2-lib bug-atexit3-lib ++ bug-atexit2-lib bug-atexit3-lib moddummy1 moddummy2 + + failtestmod.so-no-z-defs = yes + glreflib2.so-no-z-defs = yes +@@ -122,6 +122,8 @@ LDLIBS-bug-atexit3-lib.so = -lstdc++ -lg + $(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 +--- glibc-2.17-c758a686/elf/dl-cache.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/elf/dl-cache.c 2015-06-22 12:44:39.000000000 -0400 +@@ -174,9 +174,12 @@ _dl_cache_libcmp (const char *p1, const + + + /* Look up NAME in ld.so.cache and return the file name stored there, +- or null if none is found. */ +- +-const char * ++ or null if none is found. ++ The caller is responsible for freeing the returned string. The ld.so.cache ++ may be unmapped at any time by a completing recursive dlopen and ++ this function must take care that it does not return references to ++ any data in the mapping. */ ++char * + internal_function + _dl_load_cache_lookup (const char *name) + { +@@ -289,7 +292,17 @@ _dl_load_cache_lookup (const char *name) + && best != NULL) + _dl_debug_printf (" trying file=%s\n", best); + +- return best; ++ if (best == NULL) ++ return NULL; ++ ++ /* The double copy is *required* since malloc may be interposed ++ and call dlopen itself whose completion would unmap the data ++ we are accessing. Therefore we must make the copy of the ++ mapping data without using malloc. */ ++ char *temp; ++ temp = alloca (strlen (best) + 1); ++ strcpy (temp, best); ++ return strdup (temp); + } + + #ifndef MAP_COPY +--- glibc-2.17-c758a686/elf/dl-load.c 2015-06-22 12:41:10.748836414 -0400 ++++ glibc-2.17-c758a686/elf/dl-load.c 2015-06-22 12:44:39.000000000 -0400 +@@ -2232,7 +2232,7 @@ _dl_map_object (struct link_map *loader, + { + /* Check the list of libraries in the file /etc/ld.so.cache, + for compatibility with Linux's ldconfig program. */ +- const char *cached = _dl_load_cache_lookup (name); ++ char *cached = _dl_load_cache_lookup (name); + + if (cached != NULL) + { +@@ -2262,6 +2262,7 @@ _dl_map_object (struct link_map *loader, + if (memcmp (cached, dirp, system_dirs_len[cnt]) == 0) + { + /* The prefix matches. Don't use the entry. */ ++ free (cached); + cached = NULL; + break; + } +@@ -2278,14 +2279,9 @@ _dl_map_object (struct link_map *loader, + &fb, loader ?: GL(dl_ns)[nsid]._ns_loaded, + LA_SER_CONFIG, &found_other_class, false); + if (__builtin_expect (fd != -1, 1)) +- { +- realname = local_strdup (cached); +- if (realname == NULL) +- { +- __close (fd); +- fd = -1; +- } +- } ++ realname = cached; ++ else ++ free (cached); + } + } + } +--- glibc-2.17-c758a686/elf/dl-open.c 2015-06-22 12:41:16.348913620 -0400 ++++ glibc-2.17-c758a686/elf/dl-open.c 2015-06-22 12:44:40.000000000 -0400 +@@ -221,7 +221,11 @@ dl_open_worker (void *a) + } + } + +- assert (_dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENT); ++ /* One might be tempted to assert that we are RT_CONSISTENT at this point, but that ++ may not be true if this is a recursive call to dlopen. ++ TODO: Fix all of the debug state so we end up at RT_CONSISTENT only when the last ++ recursive dlopen completes. */ ++ _dl_debug_initialize (0, args->nsid); + + /* Load the named object. */ + struct link_map *new; +--- glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h 2015-06-22 12:41:16.328913344 -0400 ++++ glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h 2015-06-22 12:44:41.000000000 -0400 +@@ -895,8 +895,8 @@ + internal_function; + + /* Look up NAME in ld.so.cache and return the file name stored there, +- or null if none is found. */ +-extern const char *_dl_load_cache_lookup (const char *name) ++ or null if none is found. Caller must free returned string. */ ++extern char *_dl_load_cache_lookup (const char *name) + internal_function; + + /* If the system does not support MAP_COPY we cannot leave the file open +--- glibc-2.17-c758a686/dlfcn/tst-rec-dlopen.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/dlfcn/tst-rec-dlopen.c 2015-06-22 12:44:41.000000000 -0400 +@@ -0,0 +1,143 @@ ++/* Test recursive dlopen using malloc hooks. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <malloc.h> ++#include <dlfcn.h> ++ ++#define DSO "moddummy1.so" ++#define FUNC "dummy1" ++ ++#define DSO1 "moddummy2.so" ++#define FUNC1 "dummy2" ++ ++/* Result of the called function. */ ++int func_result; ++ ++/* Prototype for my hook. */ ++void *custom_malloc_hook (size_t, const void *); ++ ++/* Pointer to old malloc hooks. */ ++void *(*old_malloc_hook) (size_t, const void *); ++ ++/* Call function func_name in DSO dso_name via dlopen. */ ++void ++call_func (const char *dso_name, const char *func_name) ++{ ++ int ret; ++ void *dso; ++ int (*func) (void); ++ char *err; ++ ++ /* Open the DSO. */ ++ dso = dlopen (dso_name, RTLD_NOW|RTLD_GLOBAL); ++ if (dso == NULL) ++ { ++ err = dlerror (); ++ fprintf (stderr, "%s\n", err); ++ exit (1); ++ } ++ /* Clear any errors. */ ++ dlerror (); ++ ++ /* Lookup func. */ ++ func = (int (*) (void)) dlsym (dso, func_name); ++ if (func == NULL) ++ { ++ err = dlerror (); ++ if (err != NULL) ++ { ++ fprintf (stderr, "%s\n", err); ++ exit (1); ++ } ++ } ++ /* Call func. */ ++ func_result = (*func) (); ++ ++ /* Close the library and look for errors too. */ ++ ret = dlclose (dso); ++ if (ret != 0) ++ { ++ err = dlerror (); ++ fprintf (stderr, "%s\n", err); ++ exit (1); ++ } ++ ++} ++ ++/* Empty hook that does nothing. */ ++void * ++custom_malloc_hook (size_t size, const void *caller) ++{ ++ void *result; ++ /* Restore old hooks. */ ++ __malloc_hook = old_malloc_hook; ++ /* First call a function in another library via dlopen. */ ++ call_func (DSO1, FUNC1); ++ /* Called recursively. */ ++ result = malloc (size); ++ /* Restore new hooks. */ ++ __malloc_hook = custom_malloc_hook; ++ return result; ++} ++ ++static int ++do_test (void) ++{ ++ /* Save old hook. */ ++ old_malloc_hook = __malloc_hook; ++ /* Install new hook. */ ++ __malloc_hook = custom_malloc_hook; ++ ++ /* Bug 17702 fixes two things: ++ * A recursive dlopen unmapping the ld.so.cache. ++ * An assertion that _r_debug is RT_CONSISTENT at entry to dlopen. ++ We can only test the latter. Testing the former requires modifying ++ ld.so.conf to cache the dummy libraries, then running ldconfig, ++ then run the test. If you do all of that (and glibc's test ++ infrastructure doesn't support that yet) then the test will ++ SEGFAULT without the fix. If you don't do that, then the test ++ will abort because of the assert described in detail below. */ ++ call_func (DSO, FUNC); ++ ++ /* Restore old hook. */ ++ __malloc_hook = old_malloc_hook; ++ ++ /* The function dummy2() is called by the malloc hook. Check to ++ see that it was called. This ensures the second recursive ++ dlopen happened and we called the function in that library. ++ Before the fix you either get a SIGSEGV when accessing mmap'd ++ ld.so.cache data or an assertion failure about _r_debug not ++ beint RT_CONSISTENT. We don't test for the SIGSEGV since it ++ would require finding moddummy1 or moddummy2 in the cache and ++ we don't have any infrastructure to test that, but the _r_debug ++ assertion triggers. */ ++ printf ("Returned result is %d\n", func_result); ++ if (func_result <= 0) ++ { ++ printf ("FAIL: Function call_func() not called.\n"); ++ exit (1); ++ } ++ ++ printf ("PASS: Function call_func() called more than once.\n"); ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +--- glibc-2.17-c758a686/dlfcn/moddummy1.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/dlfcn/moddummy1.c 2015-06-22 12:44:41.000000000 -0400 +@@ -0,0 +1,10 @@ ++/* Provide a dummy DSO for tst-rec-dlopen to use. */ ++#include <stdio.h> ++#include <stdlib.h> ++ ++int ++dummy1 (void) ++{ ++ printf ("Called dummy1()\n"); ++ return 1; ++} +--- glibc-2.17-c758a686/dlfcn/moddummy2.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/dlfcn/moddummy2.c 2015-06-22 12:44:41.000000000 -0400 +@@ -0,0 +1,13 @@ ++/* Provide a dummy DSO for tst-rec-dlopen to use. */ ++#include <stdio.h> ++#include <stdlib.h> ++ ++int ++dummy2 (void) ++{ ++ printf ("Called dummy2()\n"); ++ /* If the outer dlopen is not dummy1 (becuase of some error) ++ then tst-rec-dlopen will see a value of -1 as the returned ++ result and fail. */ ++ return -1; ++} diff --git a/SOURCES/glibc-rh1170118-CVE-2014-7817.patch b/SOURCES/glibc-rh1170118-CVE-2014-7817.patch new file mode 100644 index 0000000..8515473 --- /dev/null +++ b/SOURCES/glibc-rh1170118-CVE-2014-7817.patch @@ -0,0 +1,163 @@ +# +# commit a39208bd7fb76c1b01c127b4c61f9bfd915bfe7c +# Author: Carlos O'Donell <carlos@redhat.com> +# Date: Wed Nov 19 11:44:12 2014 -0500 +# +# CVE-2014-7817: wordexp fails to honour WRDE_NOCMD. +# +# The function wordexp() fails to properly handle the WRDE_NOCMD +# flag when processing arithmetic inputs in the form of "$((... ``))" +# where "..." can be anything valid. The backticks in the arithmetic +# epxression are evaluated by in a shell even if WRDE_NOCMD forbade +# command substitution. This allows an attacker to attempt to pass +# dangerous commands via constructs of the above form, and bypass +# the WRDE_NOCMD flag. This patch fixes this by checking for WRDE_NOCMD +# in exec_comm(), the only place that can execute a shell. All other +# checks for WRDE_NOCMD are superfluous and removed. +# +# We expand the testsuite and add 3 new regression tests of roughly +# the same form but with a couple of nested levels. +# +# On top of the 3 new tests we add fork validation to the WRDE_NOCMD +# testing. If any forks are detected during the execution of a wordexp() +# call with WRDE_NOCMD, the test is marked as failed. This is slightly +# heuristic since vfork might be used in the future, but it provides a +# higher level of assurance that no shells were executed as part of +# command substitution with WRDE_NOCMD in effect. In addition it doesn't +# require libpthread or libdl, instead we use the public implementation +# namespace function __register_atfork (already part of the public ABI +# for libpthread). +# +# Tested on x86_64 with no regressions. +# +diff --git glibc-2.17-c758a686/posix/wordexp-test.c glibc-2.17-c758a686/posix/wordexp-test.c +index 4957006..bdd65e4 100644 +--- glibc-2.17-c758a686/posix/wordexp-test.c ++++ glibc-2.17-c758a686/posix/wordexp-test.c +@@ -27,6 +27,25 @@ + + #define IFS " \n\t" + ++extern void *__dso_handle __attribute__ ((__weak__, __visibility__ ("hidden"))); ++extern int __register_atfork (void (*) (void), void (*) (void), void (*) (void), void *); ++ ++static int __app_register_atfork (void (*prepare) (void), void (*parent) (void), void (*child) (void)) ++{ ++ return __register_atfork (prepare, parent, child, ++ &__dso_handle == NULL ? NULL : __dso_handle); ++} ++ ++/* Number of forks seen. */ ++static int registered_forks; ++ ++/* For each fork increment the fork count. */ ++static void ++register_fork (void) ++{ ++ registered_forks++; ++} ++ + struct test_case_struct + { + int retval; +@@ -206,6 +225,12 @@ struct test_case_struct + { WRDE_SYNTAX, NULL, "$((2+))", 0, 0, { NULL, }, IFS }, + { WRDE_SYNTAX, NULL, "`", 0, 0, { NULL, }, IFS }, + { WRDE_SYNTAX, NULL, "$((010+4+))", 0, 0, { NULL }, IFS }, ++ /* Test for CVE-2014-7817. We test 3 combinations of command ++ substitution inside an arithmetic expression to make sure that ++ no commands are executed and error is returned. */ ++ { WRDE_CMDSUB, NULL, "$((`echo 1`))", WRDE_NOCMD, 0, { NULL, }, IFS }, ++ { WRDE_CMDSUB, NULL, "$((1+`echo 1`))", WRDE_NOCMD, 0, { NULL, }, IFS }, ++ { WRDE_CMDSUB, NULL, "$((1+$((`echo 1`))))", WRDE_NOCMD, 0, { NULL, }, IFS }, + + { -1, NULL, NULL, 0, 0, { NULL, }, IFS }, + }; +@@ -258,6 +283,15 @@ main (int argc, char *argv[]) + return -1; + } + ++ /* If we are not allowed to do command substitution, we install ++ fork handlers to verify that no forks happened. No forks should ++ happen at all if command substitution is disabled. */ ++ if (__app_register_atfork (register_fork, NULL, NULL) != 0) ++ { ++ printf ("Failed to register fork handler.\n"); ++ return -1; ++ } ++ + for (test = 0; test_case[test].retval != -1; test++) + if (testit (&test_case[test])) + ++fail; +@@ -367,6 +401,9 @@ testit (struct test_case_struct *tc) + + printf ("Test %d (%s): ", ++tests, tc->words); + ++ if (tc->flags & WRDE_NOCMD) ++ registered_forks = 0; ++ + if (tc->flags & WRDE_APPEND) + { + /* initial wordexp() call, to be appended to */ +@@ -378,6 +415,13 @@ testit (struct test_case_struct *tc) + } + retval = wordexp (tc->words, &we, tc->flags); + ++ if ((tc->flags & WRDE_NOCMD) ++ && (registered_forks > 0)) ++ { ++ printf ("FAILED fork called for WRDE_NOCMD\n"); ++ return 1; ++ } ++ + if (tc->flags & WRDE_DOOFFS) + start_offs = sav_we.we_offs; + +diff --git glibc-2.17-c758a686/posix/wordexp.c glibc-2.17-c758a686/posix/wordexp.c +index b6b65dd..26f3a26 100644 +--- glibc-2.17-c758a686/posix/wordexp.c ++++ glibc-2.17-c758a686/posix/wordexp.c +@@ -893,6 +893,10 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length, + pid_t pid; + int noexec = 0; + ++ /* Do nothing if command substitution should not succeed. */ ++ if (flags & WRDE_NOCMD) ++ return WRDE_CMDSUB; ++ + /* Don't fork() unless necessary */ + if (!comm || !*comm) + return 0; +@@ -2082,9 +2086,6 @@ parse_dollars (char **word, size_t *word_length, size_t *max_length, + } + } + +- if (flags & WRDE_NOCMD) +- return WRDE_CMDSUB; +- + (*offset) += 2; + return parse_comm (word, word_length, max_length, words, offset, flags, + quoted? NULL : pwordexp, ifs, ifs_white); +@@ -2196,9 +2197,6 @@ parse_dquote (char **word, size_t *word_length, size_t *max_length, + break; + + case '`': +- if (flags & WRDE_NOCMD) +- return WRDE_CMDSUB; +- + ++(*offset); + error = parse_backtick (word, word_length, max_length, words, + offset, flags, NULL, NULL, NULL); +@@ -2357,12 +2355,6 @@ wordexp (const char *words, wordexp_t *pwordexp, int flags) + break; + + case '`': +- if (flags & WRDE_NOCMD) +- { +- error = WRDE_CMDSUB; +- goto do_error; +- } +- + ++words_offset; + error = parse_backtick (&word, &word_length, &max_length, words, + &words_offset, flags, pwordexp, ifs, diff --git a/SOURCES/glibc-rh1173238.patch b/SOURCES/glibc-rh1173238.patch new file mode 100644 index 0000000..fd16686 --- /dev/null +++ b/SOURCES/glibc-rh1173238.patch @@ -0,0 +1,380 @@ +Cannot be upstreamed. rtkaio was removed from Fedora. + +diff -u --new-file glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio-le.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio-le.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio-le.abilist 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio-le.abilist 2015-04-28 19:44:03.038050864 -0400 +@@ -0,0 +1,41 @@ ++GLIBC_2.17 ++ GLIBC_2.17 A ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ lio_listio F ++ lio_listio64 F ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F +diff -ru --new-file glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/nptl/librtkaio.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/nptl/librtkaio.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/nptl/librtkaio.abilist 1969-12-31 17:00:00.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/i386/nptl/librtkaio.abilist 2015-04-23 17:51:48.159155741 -0600 +@@ -0,0 +1,49 @@ ++GLIBC_2.1 ++ GLIBC_2.1 A ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ lio_listio F ++ lio_listio64 F ++GLIBC_2.2 ++ GLIBC_2.2 A ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.4 ++ GLIBC_2.3.4 A ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++GLIBC_2.4 ++ GLIBC_2.4 A ++ lio_listio F ++ lio_listio64 F +diff -ru --new-file glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/librtkaio.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/librtkaio.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/librtkaio.abilist 1969-12-31 17:00:00.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/librtkaio.abilist 2015-04-23 17:50:38.059113789 -0600 +@@ -0,0 +1,49 @@ ++GLIBC_2.1 ++ GLIBC_2.1 A ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ lio_listio F ++ lio_listio64 F ++GLIBC_2.2 ++ GLIBC_2.2 A ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.4 ++ GLIBC_2.3.4 A ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++GLIBC_2.4 ++ GLIBC_2.4 A ++ lio_listio F ++ lio_listio64 F +diff -ru --new-file glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio.abilist 1969-12-31 17:00:00.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librtkaio.abilist 2015-04-23 21:19:41.204953576 -0600 +@@ -0,0 +1,54 @@ ++GLIBC_2.3 ++ GLIBC_2.3 A ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ lio_listio F ++ lio_listio64 F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.3 ++ GLIBC_2.3.3 A ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.4 ++ GLIBC_2.3.4 A ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++GLIBC_2.4 ++ GLIBC_2.4 A ++ lio_listio F ++ lio_listio64 F +diff -ru --new-file glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/nptl/librtkaio.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/nptl/librtkaio.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/nptl/librtkaio.abilist 1969-12-31 17:00:00.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-32/nptl/librtkaio.abilist 2015-04-23 17:50:54.671886744 -0600 +@@ -0,0 +1,49 @@ ++GLIBC_2.1 ++ GLIBC_2.1 A ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ lio_listio F ++ lio_listio64 F ++GLIBC_2.2 ++ GLIBC_2.2 A ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.4 ++ GLIBC_2.3.4 A ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++GLIBC_2.4 ++ GLIBC_2.4 A ++ lio_listio F ++ lio_listio64 F +diff -ru --new-file glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/nptl/librtkaio.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/nptl/librtkaio.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/nptl/librtkaio.abilist 1969-12-31 17:00:00.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/s390/s390-64/nptl/librtkaio.abilist 2015-04-23 17:52:01.366975232 -0600 +@@ -0,0 +1,54 @@ ++GLIBC_2.2 ++ GLIBC_2.2 A ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ lio_listio F ++ lio_listio64 F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.3 ++ GLIBC_2.3.3 A ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.4 ++ GLIBC_2.3.4 A ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++GLIBC_2.4 ++ GLIBC_2.4 A ++ lio_listio F ++ lio_listio64 F +diff -ru --new-file glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/nptl/librtkaio.abilist glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/nptl/librtkaio.abilist +--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/nptl/librtkaio.abilist 1969-12-31 17:00:00.000000000 -0700 ++++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/x86_64/64/nptl/librtkaio.abilist 2015-04-23 17:51:12.091648671 -0600 +@@ -0,0 +1,54 @@ ++GLIBC_2.2.5 ++ GLIBC_2.2.5 A ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ lio_listio F ++ lio_listio64 F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.3 ++ GLIBC_2.3.3 A ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.3.4 ++ GLIBC_2.3.4 A ++ mq_close F ++ mq_getattr F ++ mq_notify F ++ mq_open F ++ mq_receive F ++ mq_send F ++ mq_setattr F ++ mq_timedreceive F ++ mq_timedsend F ++ mq_unlink F ++GLIBC_2.4 ++ GLIBC_2.4 A ++ lio_listio F ++ lio_listio64 F diff --git a/SOURCES/glibc-rh1173537.patch b/SOURCES/glibc-rh1173537.patch new file mode 100644 index 0000000..bedde38 --- /dev/null +++ b/SOURCES/glibc-rh1173537.patch @@ -0,0 +1,65 @@ +commit c3ec475c5dd16499aa040908e11d382c3ded9692 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Mon May 26 11:40:08 2014 +0530 + + Use NSS_STATUS_TRYAGAIN to indicate insufficient buffer (BZ #16878) + + The netgroups nss modules in the glibc tree use NSS_STATUS_UNAVAIL + (with errno as ERANGE) when the supplied buffer does not have + sufficient space for the result. This is wrong, because the canonical + way to indicate insufficient buffer is to set the errno to ERANGE and + the status to NSS_STATUS_TRYAGAIN, as is used by all other modules. + + This fixes nscd behaviour when the nss_ldap module returns + NSS_STATUS_TRYAGAIN to indicate that a netgroup entry is too long to + fit into the supplied buffer. + +diff --git glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c +index b3d40e9..edab174 100644 +--- glibc-2.17-c758a686/nscd/netgroupcache.c ++++ glibc-2.17-c758a686/nscd/netgroupcache.c +@@ -197,11 +197,6 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + int e; + status = getfct.f (&data, buffer + buffilled, + buflen - buffilled - req->key_len, &e); +- if (status == NSS_STATUS_RETURN +- || status == NSS_STATUS_NOTFOUND) +- /* This was either the last one for this group or the +- group was empty. Look at next group if available. */ +- break; + if (status == NSS_STATUS_SUCCESS) + { + if (data.type == triple_val) +@@ -320,11 +315,18 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + } + } + } +- else if (status == NSS_STATUS_UNAVAIL && e == ERANGE) ++ else if (status == NSS_STATUS_TRYAGAIN && e == ERANGE) + { + buflen *= 2; + buffer = xrealloc (buffer, buflen); + } ++ else if (status == NSS_STATUS_RETURN ++ || status == NSS_STATUS_NOTFOUND ++ || status == NSS_STATUS_UNAVAIL) ++ /* This was either the last one for this group or the ++ group was empty or the NSS module had an internal ++ failure. Look at next group if available. */ ++ break; + } + + enum nss_status (*endfct) (struct __netgrent *); +diff --git glibc-2.17-c758a686/nss/nss_files/files-netgrp.c glibc-2.17-c758a686/nss/nss_files/files-netgrp.c +index 34eae4c..bc0b367 100644 +--- glibc-2.17-c758a686/nss/nss_files/files-netgrp.c ++++ glibc-2.17-c758a686/nss/nss_files/files-netgrp.c +@@ -252,7 +252,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result, + if (cp - host > buflen) + { + *errnop = ERANGE; +- status = NSS_STATUS_UNAVAIL; ++ status = NSS_STATUS_TRYAGAIN; + } + else + { diff --git a/SOURCES/glibc-rh1176906.patch b/SOURCES/glibc-rh1176906.patch new file mode 100644 index 0000000..e6afde1 --- /dev/null +++ b/SOURCES/glibc-rh1176906.patch @@ -0,0 +1,22 @@ +commit 7d81e8d6db95c112c297930a8f2f9617c305529a +Author: Florian Weimer <fweimer@redhat.com> +Date: Tue Dec 23 16:16:32 2014 +0100 + + iconvdata/run-iconv-test.sh: Actually test iconv modules + + Arjun Shankar noticed that this test case was not testing anything + because iconv was invoked without the required arguments. + +diff --git glibc-2.17-c758a686/iconvdata/run-iconv-test.sh glibc-2.17-c758a686/iconvdata/run-iconv-test.sh +index 5dfb69f..1d0bf52 100755 +--- glibc-2.17-c758a686/iconvdata/run-iconv-test.sh ++++ glibc-2.17-c758a686/iconvdata/run-iconv-test.sh +@@ -189,7 +189,7 @@ printf '\016\377\377\377\377\377\377\377' > $temp1 + for from in $iconv_modules ; do + echo $ac_n "test decoder $from $ac_c" + PROG=`eval echo $ICONV` +- if $PROG < $temp1 >/dev/null 2>&1 ; then ++ if $PROG -f $from -t UTF8 < $temp1 >/dev/null 2>&1 ; then + : # fall through + else + status=$? diff --git a/SOURCES/glibc-rh1183456.patch b/SOURCES/glibc-rh1183456.patch new file mode 100644 index 0000000..021ec3b --- /dev/null +++ b/SOURCES/glibc-rh1183456.patch @@ -0,0 +1,40 @@ +commit 3cb26316b45b23dc5cfecbafdc489b28c3a52029 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Thu Jan 29 10:30:09 2015 +0530 + + Initialize nscd stats data [BZ #17892] + + The padding bytes in the statsdata struct are not initialized, due to + which valgrind throws a warning: + + ==11384== Memcheck, a memory error detector + ==11384== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. + ==11384== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info + ==11384== Command: nscd -d + ==11384== + Fri 25 Apr 2014 10:34:53 AM CEST - 11384: handle_request: request received (Version = 2) from PID 11396 + Fri 25 Apr 2014 10:34:53 AM CEST - 11384: GETSTAT + ==11384== Thread 6: + ==11384== Syscall param socketcall.sendto(msg) points to uninitialised byte(s) + ==11384== at 0x4E4ACDC: send (in /lib64/libpthread-2.12.so) + ==11384== by 0x11AF6B: send_stats (in /usr/sbin/nscd) + ==11384== by 0x112F75: nscd_run_worker (in /usr/sbin/nscd) + ==11384== by 0x4E439D0: start_thread (in /lib64/libpthread-2.12.so) + ==11384== by 0x599AB6C: clone (in /lib64/libc-2.12.so) + ==11384== Address 0x15708395 is on thread 6's stack + + Fix the warning by initializing the structure. + +diff --git glibc-2.17-c758a686/nscd/nscd_stat.c glibc-2.17-c758a686/nscd/nscd_stat.c +index 0f1f3c0..7aaa21b 100644 +--- glibc-2.17-c758a686/nscd/nscd_stat.c ++++ glibc-2.17-c758a686/nscd/nscd_stat.c +@@ -94,6 +94,8 @@ send_stats (int fd, struct database_dyn dbs[lastdb]) + struct statdata data; + int cnt; + ++ memset (&data, 0, sizeof (data)); ++ + memcpy (data.version, compilation, sizeof (compilation)); + data.debug_level = debug_level; + data.runtime = time (NULL) - start_time; diff --git a/SOURCES/glibc-rh1183545.patch b/SOURCES/glibc-rh1183545.patch new file mode 100644 index 0000000..a9ec106 --- /dev/null +++ b/SOURCES/glibc-rh1183545.patch @@ -0,0 +1,233 @@ +commit d5dd6189d506068ed11c8bfa1e1e9bffde04decd +Author: Andreas Schwab <schwab@suse.de> +Date: Mon Jan 21 17:41:28 2013 +0100 + + Fix parsing of numeric hosts in gethostbyname_r + +diff --git glibc-2.17-c758a686/nss/Makefile glibc-2.17-c758a686/nss/Makefile +index 449a258..553eafa 100644 +--- glibc-2.17-c758a686/nss/Makefile ++++ glibc-2.17-c758a686/nss/Makefile +@@ -37,7 +37,8 @@ install-bin := getent makedb + makedb-modules = xmalloc hash-string + extra-objs += $(makedb-modules:=.o) + +-tests = test-netdb tst-nss-test1 bug17079 tst-nss-getpwent ++tests = test-netdb tst-nss-test1 bug17079 tst-nss-getpwent \ ++ test-digits-dots + xtests = bug-erange + + include ../Makeconfig +diff --git glibc-2.17-c758a686/nss/digits_dots.c glibc-2.17-c758a686/nss/digits_dots.c +index 2b86295..e007ef4 100644 +--- glibc-2.17-c758a686/nss/digits_dots.c ++++ glibc-2.17-c758a686/nss/digits_dots.c +@@ -46,7 +46,10 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + { + if (h_errnop) + *h_errnop = NETDB_INTERNAL; +- *result = NULL; ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_TRYAGAIN; ++ else ++ *result = NULL; + return -1; + } + +@@ -83,14 +86,16 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + } + + size_needed = (sizeof (*host_addr) +- + sizeof (*h_addr_ptrs) + strlen (name) + 1); ++ + sizeof (*h_addr_ptrs) ++ + sizeof (*h_alias_ptr) + strlen (name) + 1); + + if (buffer_size == NULL) + { + if (buflen < size_needed) + { ++ *status = NSS_STATUS_TRYAGAIN; + if (h_errnop != NULL) +- *h_errnop = TRY_AGAIN; ++ *h_errnop = NETDB_INTERNAL; + __set_errno (ERANGE); + goto done; + } +@@ -109,7 +114,7 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + *buffer_size = 0; + __set_errno (save); + if (h_errnop != NULL) +- *h_errnop = TRY_AGAIN; ++ *h_errnop = NETDB_INTERNAL; + *result = NULL; + goto done; + } +@@ -149,7 +154,9 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + if (! ok) + { + *h_errnop = HOST_NOT_FOUND; +- if (buffer_size) ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_NOTFOUND; ++ else + *result = NULL; + goto done; + } +@@ -190,7 +197,7 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + if (buffer_size == NULL) + *status = NSS_STATUS_SUCCESS; + else +- *result = resbuf; ++ *result = resbuf; + goto done; + } + +@@ -201,15 +208,6 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + + if ((isxdigit (name[0]) && strchr (name, ':') != NULL) || name[0] == ':') + { +- const char *cp; +- char *hostname; +- typedef unsigned char host_addr_t[16]; +- host_addr_t *host_addr; +- typedef char *host_addr_list_t[2]; +- host_addr_list_t *h_addr_ptrs; +- size_t size_needed; +- int addr_size; +- + switch (af) + { + default: +@@ -225,7 +223,10 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + /* This is not possible. We cannot represent an IPv6 address + in an `struct in_addr' variable. */ + *h_errnop = HOST_NOT_FOUND; +- *result = NULL; ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_NOTFOUND; ++ else ++ *result = NULL; + goto done; + + case AF_INET6: +@@ -233,42 +234,6 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + break; + } + +- size_needed = (sizeof (*host_addr) +- + sizeof (*h_addr_ptrs) + strlen (name) + 1); +- +- if (buffer_size == NULL && buflen < size_needed) +- { +- if (h_errnop != NULL) +- *h_errnop = TRY_AGAIN; +- __set_errno (ERANGE); +- goto done; +- } +- else if (buffer_size != NULL && *buffer_size < size_needed) +- { +- char *new_buf; +- *buffer_size = size_needed; +- new_buf = realloc (*buffer, *buffer_size); +- +- if (new_buf == NULL) +- { +- save = errno; +- free (*buffer); +- __set_errno (save); +- *buffer = NULL; +- *buffer_size = 0; +- *result = NULL; +- goto done; +- } +- *buffer = new_buf; +- } +- +- memset (*buffer, '\0', size_needed); +- +- host_addr = (host_addr_t *) *buffer; +- h_addr_ptrs = (host_addr_list_t *) +- ((char *) host_addr + sizeof (*host_addr)); +- hostname = (char *) h_addr_ptrs + sizeof (*h_addr_ptrs); +- + for (cp = name;; ++cp) + { + if (!*cp) +@@ -281,7 +246,9 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, + if (inet_pton (AF_INET6, name, host_addr) <= 0) + { + *h_errnop = HOST_NOT_FOUND; +- if (buffer_size) ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_NOTFOUND; ++ else + *result = NULL; + goto done; + } +diff --git glibc-2.17-c758a686/nss/getXXbyYY_r.c glibc-2.17-c758a686/nss/getXXbyYY_r.c +index 1067744..44d00f4 100644 +--- glibc-2.17-c758a686/nss/getXXbyYY_r.c ++++ glibc-2.17-c758a686/nss/getXXbyYY_r.c +@@ -179,6 +179,9 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, + case -1: + return errno; + case 1: ++#ifdef NEED_H_ERRNO ++ any_service = true; ++#endif + goto done; + } + #endif +@@ -288,7 +291,7 @@ done: + /* This happens when we weren't able to use a service for reasons other + than the module not being found. In such a case, we'd want to tell the + caller that errno has the real reason for failure. */ +- *h_errnop = NETDB_INTERNAL; ++ *h_errnop = NETDB_INTERNAL; + else if (status != NSS_STATUS_SUCCESS && !any_service) + /* We were not able to use any service. */ + *h_errnop = NO_RECOVERY; +diff --git glibc-2.17-c758a686/nss/test-digits-dots.c glibc-2.17-c758a686/nss/test-digits-dots.c +new file mode 100644 +index 0000000..1efa344 +--- /dev/null ++++ glibc-2.17-c758a686/nss/test-digits-dots.c +@@ -0,0 +1,38 @@ ++/* 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++/* Testcase for BZ #15014 */ ++ ++#include <stdlib.h> ++#include <netdb.h> ++#include <errno.h> ++ ++static int ++do_test (void) ++{ ++ char buf[32]; ++ struct hostent *result = NULL; ++ struct hostent ret; ++ int h_err = 0; ++ int err; ++ ++ err = gethostbyname_r ("1.2.3.4", &ret, buf, sizeof (buf), &result, &h_err); ++ return err == ERANGE && h_err == NETDB_INTERNAL ? EXIT_SUCCESS : EXIT_FAILURE; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/SOURCES/glibc-rh1186491.patch b/SOURCES/glibc-rh1186491.patch new file mode 100644 index 0000000..31dc1b5 --- /dev/null +++ b/SOURCES/glibc-rh1186491.patch @@ -0,0 +1,32 @@ +Patch not applicable to upstream, but the test failures not visible +there anymore. (The math tests have been reorganized.) + +--- glibc-2.17-c758a686/math/libm-test.inc 2015-01-22 10:53:11.015331338 -0500 ++++ glibc-2.17-c758a686/math/libm-test.inc 2015-01-26 16:46:24.631769811 -0500 +@@ -521,7 +521,7 @@ + } + + +-static void ++static void __attribute__ ((noinline)) + check_float_internal (const char *test_name, FLOAT computed, FLOAT expected, + FLOAT max_ulp, int xfail, int exceptions, + FLOAT *curr_max_error) +@@ -610,7 +610,7 @@ + } + + +-static void ++static void __attribute__ ((noinline)) + check_float (const char *test_name, FLOAT computed, FLOAT expected, + FLOAT max_ulp, int xfail, int exceptions) + { +@@ -619,7 +619,7 @@ + } + + +-static void ++static void __attribute__ ((noinline)) + check_complex (const char *test_name, __complex__ FLOAT computed, + __complex__ FLOAT expected, + __complex__ FLOAT max_ulp, __complex__ int xfail, diff --git a/SOURCES/glibc-rh1186620.patch b/SOURCES/glibc-rh1186620.patch new file mode 100644 index 0000000..ef8f580 --- /dev/null +++ b/SOURCES/glibc-rh1186620.patch @@ -0,0 +1,95 @@ +commit 3e3002ffead0526d088c353f97475400367087da +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Tue Feb 24 12:57:26 2015 +0530 + + Skip logging for DNSSEC responses [BZ 14841] + + DNSSEC defines a number of response types that one me expect when the + DO bit is set. We don't process any of them, but since we do allow + setting the DO bit, skip them without logging an error since it is + only a nuisance. + + Tested on x86_64. + + [BZ #14841] + * resolv/gethnamaddr.c (getanswer): Skip logging if + RES_USE_DNSSEC is set. + * resolv/nss_dns/dns-host.c (getanswer_r): Likewise. + +diff --git glibc-2.17-c758a686/resolv/gethnamaddr.c glibc-2.17-c758a686/resolv/gethnamaddr.c +index a861a84..7fd0e49 100644 +--- glibc-2.17-c758a686/resolv/gethnamaddr.c ++++ glibc-2.17-c758a686/resolv/gethnamaddr.c +@@ -331,23 +331,18 @@ getanswer (const querybuf *answer, int anslen, const char *qname, int qtype) + buflen -= n; + continue; + } +- if ((type == T_SIG) || (type == T_KEY) || (type == T_NXT)) { +- /* We don't support DNSSEC yet. For now, ignore +- * the record and send a low priority message +- * to syslog. +- */ +- syslog(LOG_DEBUG|LOG_AUTH, +- "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", +- qname, p_class(C_IN), p_type(qtype), +- p_type(type)); +- cp += n; +- continue; +- } + if (type != qtype) { +- syslog(LOG_NOTICE|LOG_AUTH, ++ /* Log a low priority message if we get an unexpected ++ * record, but skip it if we are using DNSSEC since it ++ * uses many different types in responses that do not ++ * match QTYPE. ++ */ ++ if ((_res.options & RES_USE_DNSSEC) == 0) { ++ syslog(LOG_NOTICE|LOG_AUTH, + "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", +- qname, p_class(C_IN), p_type(qtype), +- p_type(type)); ++ qname, p_class(C_IN), p_type(qtype), ++ p_type(type)); ++ } + cp += n; + continue; /* XXX - had_error++ ? */ + } +diff --git glibc-2.17-c758a686/resolv/nss_dns/dns-host.c glibc-2.17-c758a686/resolv/nss_dns/dns-host.c +index f715ab0..b16b0dd 100644 +--- glibc-2.17-c758a686/resolv/nss_dns/dns-host.c ++++ glibc-2.17-c758a686/resolv/nss_dns/dns-host.c +@@ -820,26 +820,19 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, + linebuflen -= n; + continue; + } +- if (__builtin_expect (type == T_SIG, 0) +- || __builtin_expect (type == T_KEY, 0) +- || __builtin_expect (type == T_NXT, 0)) +- { +- /* We don't support DNSSEC yet. For now, ignore the record +- and send a low priority message to syslog. */ +- syslog (LOG_DEBUG | LOG_AUTH, +- "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", +- qname, p_class (C_IN), p_type(qtype), p_type (type)); +- cp += n; +- continue; +- } + + if (type == T_A && qtype == T_AAAA && map) + have_to_map = 1; + else if (__builtin_expect (type != qtype, 0)) + { +- syslog (LOG_NOTICE | LOG_AUTH, +- "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", +- qname, p_class (C_IN), p_type (qtype), p_type (type)); ++ /* Log a low priority message if we get an unexpected record, but ++ skip it if we are using DNSSEC since it uses many different types ++ in responses that do not match QTYPE. */ ++ if ((_res.options & RES_USE_DNSSEC) == 0) ++ syslog (LOG_NOTICE | LOG_AUTH, ++ "gethostby*.getanswer: asked for \"%s %s %s\", " ++ "got type \"%s\"", ++ qname, p_class (C_IN), p_type (qtype), p_type (type)); + cp += n; + continue; /* XXX - had_error++ ? */ + } diff --git a/SOURCES/glibc-rh1188235.patch b/SOURCES/glibc-rh1188235.patch new file mode 100644 index 0000000..9435bc8 --- /dev/null +++ b/SOURCES/glibc-rh1188235.patch @@ -0,0 +1,89 @@ +commit 5bd80bfe9ca0d955bfbbc002781bc7b01b6bcb06 +Author: Paul Pluzhnikov <ppluzhnikov@google.com> +Date: Fri Feb 6 00:30:42 2015 -0500 + + CVE-2015-1472: wscanf allocates too little memory + + BZ #16618 + + Under certain conditions wscanf can allocate too little memory for the + to-be-scanned arguments and overflow the allocated buffer. The + implementation now correctly computes the required buffer size when + using malloc. + + A regression test was added to tst-sscanf. + +--- glibc-2.17-c758a686/stdio-common/vfscanf.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/stdio-common/vfscanf.c 2015-05-28 14:01:58.512816390 -0400 +@@ -272,9 +272,10 @@ + if (__builtin_expect (wpsize == wpmax, 0)) \ + { \ + CHAR_T *old = wp; \ +- size_t newsize = (UCHAR_MAX + 1 > 2 * wpmax \ +- ? UCHAR_MAX + 1 : 2 * wpmax); \ +- if (use_malloc || !__libc_use_alloca (newsize)) \ ++ bool fits = __glibc_likely (wpmax <= SIZE_MAX / sizeof (CHAR_T) / 2); \ ++ size_t wpneed = MAX (UCHAR_MAX + 1, 2 * wpmax); \ ++ size_t newsize = fits ? wpneed * sizeof (CHAR_T) : SIZE_MAX; \ ++ if (!__libc_use_alloca (newsize)) \ + { \ + wp = realloc (use_malloc ? wp : NULL, newsize); \ + if (wp == NULL) \ +@@ -286,14 +287,13 @@ + } \ + if (! use_malloc) \ + MEMCPY (wp, old, wpsize); \ +- wpmax = newsize; \ ++ wpmax = wpneed; \ + use_malloc = true; \ + } \ + else \ + { \ + size_t s = wpmax * sizeof (CHAR_T); \ +- wp = (CHAR_T *) extend_alloca (wp, s, \ +- newsize * sizeof (CHAR_T)); \ ++ wp = (CHAR_T *) extend_alloca (wp, s, newsize); \ + wpmax = s / sizeof (CHAR_T); \ + if (old != NULL) \ + MEMCPY (wp, old, wpsize); \ +--- glibc-2.17-c758a686/stdio-common/tst-sscanf.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/stdio-common/tst-sscanf.c 2015-06-03 13:56:10.883924259 -0400 +@@ -196,5 +196,38 @@ + } + } + ++ /* BZ #16618 ++ The test will segfault during SSCANF if the buffer overflow ++ is not fixed. The size of `s` is such that it forces the use ++ of malloc internally and this triggers the incorrect computation. ++ Thus the value for SIZE is arbitrariy high enough that malloc ++ is used. */ ++ { ++#define SIZE 131072 ++ CHAR *s = malloc ((SIZE + 1) * sizeof (*s)); ++ if (s == NULL) ++ abort (); ++ for (size_t i = 0; i < SIZE; i++) ++ s[i] = L('0'); ++ s[SIZE] = L('\0'); ++ int i = 42; ++ /* Scan multi-digit zero into `i`. */ ++ if (SSCANF (s, L("%d"), &i) != 1) ++ { ++ printf ("FAIL: bug16618: SSCANF did not read one input item.\n"); ++ result = 1; ++ } ++ if (i != 0) ++ { ++ printf ("FAIL: bug16618: Value of `i` was not zero as expected.\n"); ++ result = 1; ++ } ++ free (s); ++ if (result != 1) ++ printf ("PASS: bug16618: Did not crash.\n"); ++#undef SIZE ++ } ++ ++ + return result; + } diff --git a/SOURCES/glibc-rh1189278-1.patch b/SOURCES/glibc-rh1189278-1.patch new file mode 100644 index 0000000..012e005 --- /dev/null +++ b/SOURCES/glibc-rh1189278-1.patch @@ -0,0 +1,67 @@ +# +# In rhel-6.x the Makerules are not entirely as mature as they are +# in glibc 2.21 (from which the example link-libc-args is taken from). +# In rhel-6.x the applications are not built like their counterpart +# real applications, and because of that compiling DSOs that use TLS +# will fail with undefined references to __tls_get_addr which resides +# in ld.so and is never included in the link. This patch enhances +# only the build-module and build-module-asneeded targets to include +# a more fully and correct link line as the compiler driver would use +# 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 <joseph@codesourcery.com> +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 +@@ -437,6 +437,25 @@ + load-map-file = $(map-file:%=-Wl,--version-script=%) + endif + ++# Compiler arguments to use to link a shared object with libc and ++# ld.so. This is intended to be as similar as possible to a default ++# link with an installed libc. ++link-libc-args = -Wl,--start-group \ ++ $(libc-for-link) \ ++ $(common-objpfx)libc_nonshared.a \ ++ $(as-needed) $(elf-objpfx)ld.so $(no-as-needed) \ ++ -Wl,--end-group ++ ++# The corresponding shared libc to use. This may be modified for a ++# particular target. ++libc-for-link = $(common-objpfx)libc.so ++ ++# The corresponding dependencies. As these are used in dependencies, ++# not just commands, they cannot use target-specific variables so need ++# to name both possible libc.so objects. ++link-libc-deps = $(common-objpfx)libc.so $(common-objpfx)linkobj/libc.so \ ++ $(common-objpfx)libc_nonshared.a $(elf-objpfx)ld.so ++ + # Pattern rule to build a shared object from an archive of PIC objects. + # This must come after the installation rules so Make doesn't try to + # build shared libraries in place from the installed *_pic.a files. +@@ -518,12 +537,13 @@ + # not for shared objects + define build-module + $(build-module-helper) -o $@ $(shlib-lds-flags) \ +- $(csu-objpfx)abi-note.o $(build-module-objlist) ++ $(csu-objpfx)abi-note.o $(build-module-objlist) $(link-libc-args) + endef + define build-module-asneeded + $(build-module-helper) -o $@ $(shlib-lds-flags) \ + $(csu-objpfx)abi-note.o \ +- -Wl,--as-needed $(build-module-objlist) -Wl,--no-as-needed ++ -Wl,--as-needed $(build-module-objlist) -Wl,--no-as-needed \ ++ $(link-libc-args) + endef + + build-module-helper-objlist = \ diff --git a/SOURCES/glibc-rh1189278.patch b/SOURCES/glibc-rh1189278.patch new file mode 100644 index 0000000..86c7f4d --- /dev/null +++ b/SOURCES/glibc-rh1189278.patch @@ -0,0 +1,407 @@ +# +# Based on this upstream commit: +# +# commit d8dd00805b8f3a011735d7a407097fb1c408d867 +# Author: H.J. Lu <hjl.tools@gmail.com> +# Date: Fri Nov 28 07:54:07 2014 -0800 +# +# Resize DTV if the current DTV isn't big enough +# +# This patch changes _dl_allocate_tls_init to resize DTV if the current DTV +# isn't big enough. Tested on X86-64, x32 and ia32. +# +# [BZ #13862] +# * elf/dl-tls.c: Include <atomic.h>. +# (oom): Remove #ifdef SHARED/#endif. +# (_dl_static_dtv, _dl_initial_dtv): Moved before ... +# (_dl_resize_dtv): This. Extracted from _dl_update_slotinfo. +# (_dl_allocate_tls_init): Resize DTV if the current DTV isn't +# big enough. +# (_dl_update_slotinfo): Call _dl_resize_dtv to resize DTV. +# * nptl/Makefile (tests): Add tst-stack4. +# (modules-names): Add tst-stack4mod. +# ($(objpfx)tst-stack4): New. +# (tst-stack4mod.sos): Likewise. +# ($(objpfx)tst-stack4.out): Likewise. +# ($(tst-stack4mod.sos)): Likewise. +# (clean): Likewise. +# * nptl/tst-stack4.c: New file. +# * nptl/tst-stack4mod.c: Likewise. +# +diff -urN glibc-2.17-c758a686/elf/dl-tls.c glibc-2.17-c758a686/elf/dl-tls.c +--- glibc-2.17-c758a686/elf/dl-tls.c 2015-02-18 14:15:28.078461873 -0500 ++++ glibc-2.17-c758a686/elf/dl-tls.c 2015-02-18 14:38:37.630374771 -0500 +@@ -24,6 +24,7 @@ + #include <stdlib.h> + #include <unistd.h> + #include <sys/param.h> ++#include <atomic.h> + + #include <tls.h> + #include <dl-tls.h> +@@ -35,14 +36,12 @@ + + + /* Out-of-memory handler. */ +-#ifdef SHARED + static void + __attribute__ ((__noreturn__)) + oom (void) + { + _dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n"); + } +-#endif + + + size_t +@@ -392,6 +391,52 @@ + return result; + } + ++static dtv_t * ++_dl_resize_dtv (dtv_t *dtv) ++{ ++ /* Resize the dtv. */ ++ dtv_t *newp; ++ /* Load GL(dl_tls_max_dtv_idx) atomically since it may be written to by ++ other threads concurrently. -- We don't have the required atomic ++ infrastructure to load dl_tls_max_dtv_idx atomically, but on all the ++ architectures we care about it should load atomically. If this had ++ an atomic_load_acquire we would still be missing the releases for ++ the writes. */ ++ size_t newsize = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS; ++ size_t oldsize = dtv[-1].counter; ++ ++#if SHARED ++ if (dtv == GL(dl_initial_dtv)) ++ { ++ /* This is the initial dtv that was either statically allocated in ++ __libc_setup_tls or allocated during rtld startup using the ++ dl-minimal.c malloc instead of the real malloc. We can't free ++ it, we have to abandon the old storage. */ ++ ++ newp = malloc ((2 + newsize) * sizeof (dtv_t)); ++ if (newp == NULL) ++ oom (); ++ memcpy (newp, &dtv[-1], (2 + oldsize) * sizeof (dtv_t)); ++ } ++ else ++#endif ++ { ++ newp = realloc (&dtv[-1], ++ (2 + newsize) * sizeof (dtv_t)); ++ if (newp == NULL) ++ oom (); ++ } ++ ++ newp[0].counter = newsize; ++ ++ /* Clear the newly allocated part. */ ++ memset (newp + 2 + oldsize, '\0', ++ (newsize - oldsize) * sizeof (dtv_t)); ++ ++ /* Return the generation counter. */ ++ return &newp[1]; ++} ++ + + void * + internal_function +@@ -406,6 +451,16 @@ + size_t total = 0; + size_t maxgen = 0; + ++ /* Check if the current dtv is big enough. */ ++ if (dtv[-1].counter < GL(dl_tls_max_dtv_idx)) ++ { ++ /* Resize the dtv. */ ++ dtv = _dl_resize_dtv (dtv); ++ ++ /* Install this new dtv in the thread data structures. */ ++ INSTALL_DTV (result, &dtv[-1]); ++ } ++ + /* We have to prepare the dtv for all currently loaded modules using + TLS. For those which are dynamically loaded we add the values + indicating deferred allocation. */ +@@ -637,41 +692,10 @@ + assert (total + cnt == modid); + if (dtv[-1].counter < modid) + { +- /* Reallocate the dtv. */ +- dtv_t *newp; +- size_t newsize = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS; +- size_t oldsize = dtv[-1].counter; +- +- assert (map->l_tls_modid <= newsize); +- +- if (dtv == GL(dl_initial_dtv)) +- { +- /* This is the initial dtv that was allocated +- during rtld startup using the dl-minimal.c +- malloc instead of the real malloc. We can't +- free it, we have to abandon the old storage. */ +- +- newp = malloc ((2 + newsize) * sizeof (dtv_t)); +- if (newp == NULL) +- oom (); +- memcpy (newp, &dtv[-1], (2 + oldsize) * sizeof (dtv_t)); +- } +- else +- { +- newp = realloc (&dtv[-1], +- (2 + newsize) * sizeof (dtv_t)); +- if (newp == NULL) +- oom (); +- } +- +- newp[0].counter = newsize; +- +- /* Clear the newly allocated part. */ +- memset (newp + 2 + oldsize, '\0', +- (newsize - oldsize) * sizeof (dtv_t)); ++ /* Resize the dtv. */ ++ dtv = _dl_resize_dtv (dtv); + +- /* Point dtv to the generation counter. */ +- dtv = &newp[1]; ++ assert (modid <= dtv[-1].counter); + + /* Install this new dtv in the thread data + structures. */ +diff -urN glibc-2.17-c758a686/nptl/Makefile glibc-2.17-c758a686/nptl/Makefile +--- glibc-2.17-c758a686/nptl/Makefile 2015-02-18 14:15:28.073462028 -0500 ++++ glibc-2.17-c758a686/nptl/Makefile 2015-02-18 14:15:49.817786667 -0500 +@@ -251,7 +251,7 @@ + tst-exec1 tst-exec2 tst-exec3 tst-exec4 \ + tst-exit1 tst-exit2 tst-exit3 \ + tst-stdio1 tst-stdio2 \ +- tst-stack1 tst-stack2 tst-stack3 tst-pthread-getattr \ ++ tst-stack1 tst-stack2 tst-stack3 tst-stack4 tst-pthread-getattr \ + tst-unload \ + tst-dlsym1 \ + tst-sysconf \ +@@ -297,7 +297,7 @@ + + modules-names = tst-atfork2mod tst-tls3mod tst-tls4moda tst-tls4modb \ + tst-tls5mod tst-tls5moda tst-tls5modb tst-tls5modc \ +- tst-tls5modd tst-tls5mode tst-tls5modf \ ++ tst-tls5modd tst-tls5mode tst-tls5modf tst-stack4mod \ + tst-_res1mod1 tst-_res1mod2 tst-execstack-mod tst-fini1mod + extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) tst-cleanup4aux.o + test-extras += $(modules-names) tst-cleanup4aux +@@ -459,6 +459,19 @@ + $(common-objpfx)malloc/mtrace $(objpfx)tst-stack3.mtrace > $@ + generated += tst-stack3-mem tst-stack3.mtrace + ++$(objpfx)tst-stack4: $(libdl) $(shared-thread-library) ++tst-stack4mod.sos=$(shell for i in 0 1 2 3 4 5 6 7 8 9 10 \ ++ 11 12 13 14 15 16 17 18 19; do \ ++ for j in 0 1 2 3 4 5 6 7 8 9 10 \ ++ 11 12 13 14 15 16 17 18 19; do \ ++ echo $(objpfx)tst-stack4mod-$$i-$$j.so; \ ++ done; done) ++$(objpfx)tst-stack4.out: $(tst-stack4mod.sos) ++$(tst-stack4mod.sos): $(objpfx)tst-stack4mod.so ++ cp -f $< $@ ++clean: ++ rm -f $(tst-stack4mod.sos) ++ + $(objpfx)tst-cleanup4: $(objpfx)tst-cleanup4aux.o $(shared-thread-library) + $(objpfx)tst-cleanupx4: $(objpfx)tst-cleanup4aux.o $(shared-thread-library) + +diff -urN glibc-2.17-c758a686/nptl/tst-stack4.c glibc-2.17-c758a686/nptl/tst-stack4.c +--- glibc-2.17-c758a686/nptl/tst-stack4.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/nptl/tst-stack4.c 2015-02-18 14:15:49.817786667 -0500 +@@ -0,0 +1,159 @@ ++/* Test DTV size oveflow when pthread_create reuses old DTV and TLS is ++ used by dlopened shared object. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <stdio.h> ++#include <stdint.h> ++#include <dlfcn.h> ++#include <assert.h> ++#include <pthread.h> ++ ++/* The choices of thread count, and file counts are arbitary. ++ The point is simply to run enough threads that an exiting ++ thread has it's stack reused by another thread at the same ++ time as new libraries have been loaded. */ ++#define DSO_SHARED_FILES 20 ++#define DSO_OPEN_THREADS 20 ++#define DSO_EXEC_THREADS 2 ++ ++/* Used to make sure that only one thread is calling dlopen and dlclose ++ at a time. */ ++pthread_mutex_t g_lock; ++ ++typedef void (*function) (void); ++ ++void * ++dso_invoke(void *dso_fun) ++{ ++ function *fun_vec = (function *) dso_fun; ++ int dso; ++ ++ for (dso = 0; dso < DSO_SHARED_FILES; dso++) ++ (*fun_vec[dso]) (); ++ ++ pthread_exit (NULL); ++} ++ ++void * ++dso_process (void * p) ++{ ++ void *handle[DSO_SHARED_FILES]; ++ function fun_vec[DSO_SHARED_FILES]; ++ char dso_path[DSO_SHARED_FILES][100]; ++ int dso; ++ uintptr_t t = (uintptr_t) p; ++ ++ /* Open DSOs and get a function. */ ++ for (dso = 0; dso < DSO_SHARED_FILES; dso++) ++ { ++ sprintf (dso_path[dso], "tst-stack4mod-%i-%i.so", t, dso); ++ ++ pthread_mutex_lock (&g_lock); ++ ++ handle[dso] = dlopen (dso_path[dso], RTLD_NOW); ++ assert (handle[dso]); ++ ++ fun_vec[dso] = (function) dlsym (handle[dso], "function"); ++ assert (fun_vec[dso]); ++ ++ pthread_mutex_unlock (&g_lock); ++ } ++ ++ /* Spawn workers. */ ++ pthread_t thread[DSO_EXEC_THREADS]; ++ int i, ret; ++ uintptr_t result = 0; ++ for (i = 0; i < DSO_EXEC_THREADS; i++) ++ { ++ pthread_mutex_lock (&g_lock); ++ ret = pthread_create (&thread[i], NULL, dso_invoke, (void *) fun_vec); ++ if (ret != 0) ++ { ++ printf ("pthread_create failed: %d\n", ret); ++ result = 1; ++ } ++ pthread_mutex_unlock (&g_lock); ++ } ++ ++ if (!result) ++ for (i = 0; i < DSO_EXEC_THREADS; i++) ++ { ++ ret = pthread_join (thread[i], NULL); ++ if (ret != 0) ++ { ++ printf ("pthread_join failed: %d\n", ret); ++ result = 1; ++ } ++ } ++ ++ /* Close all DSOs. */ ++ for (dso = 0; dso < DSO_SHARED_FILES; dso++) ++ { ++ pthread_mutex_lock (&g_lock); ++ dlclose (handle[dso]); ++ pthread_mutex_unlock (&g_lock); ++ } ++ ++ /* Exit. */ ++ pthread_exit ((void *) result); ++} ++ ++static int ++do_test (void) ++{ ++ pthread_t thread[DSO_OPEN_THREADS]; ++ int i,j; ++ int ret; ++ int result = 0; ++ ++ pthread_mutex_init (&g_lock, NULL); ++ ++ /* 100 is arbitrary here and is known to trigger PR 13862. */ ++ for (j = 0; j < 100; j++) ++ { ++ for (i = 0; i < DSO_OPEN_THREADS; i++) ++ { ++ ret = pthread_create (&thread[i], NULL, dso_process, ++ (void *) (uintptr_t) i); ++ if (ret != 0) ++ { ++ printf ("pthread_create failed: %d\n", ret); ++ result = 1; ++ } ++ } ++ ++ if (result) ++ break; ++ ++ for (i = 0; i < DSO_OPEN_THREADS; i++) ++ { ++ ret = pthread_join (thread[i], NULL); ++ if (ret != 0) ++ { ++ printf ("pthread_join failed: %d\n", ret); ++ result = 1; ++ } ++ } ++ } ++ ++ return result; ++} ++ ++#define TEST_FUNCTION do_test () ++#define TIMEOUT 100 ++#include "../test-skeleton.c" +diff -urN glibc-2.17-c758a686/nptl/tst-stack4mod.c glibc-2.17-c758a686/nptl/tst-stack4mod.c +--- glibc-2.17-c758a686/nptl/tst-stack4mod.c 1969-12-31 19:00:00.000000000 -0500 ++++ glibc-2.17-c758a686/nptl/tst-stack4mod.c 2015-02-18 14:15:49.817786667 -0500 +@@ -0,0 +1,28 @@ ++/* This tests DTV usage with TLS in dlopened shared object. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++/* 256 is arbitrary here and is known to trigger PR 13862. */ ++__thread int var[256] attribute_hidden = {0}; ++ ++void ++function (void) ++{ ++ int i; ++ for (i = 0; i < sizeof (var) / sizeof (int); i++) ++ var[i] = i; ++} diff --git a/SOURCES/glibc-rh1193797.patch b/SOURCES/glibc-rh1193797.patch new file mode 100644 index 0000000..52b1251 --- /dev/null +++ b/SOURCES/glibc-rh1193797.patch @@ -0,0 +1,804 @@ +commit cf9313e7d1dd42addd6cf8c9277f0f18a62cdeff +Author: Carlos O'Donell <carlos@systemhalted.org> +Date: Fri Mar 13 09:49:24 2015 -0400 + + Enhance nscd's inotify support (Bug 14906). + +--- glibc-2.17-c758a686/nscd/cache.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nscd/cache.c 2015-05-13 13:45:57.259958374 -0400 +@@ -272,28 +272,38 @@ + while (runp != NULL) + { + #ifdef HAVE_INOTIFY +- if (runp->inotify_descr == -1) ++ if (runp->inotify_descr[TRACED_FILE] == -1) + #endif + { + struct stat64 st; + + if (stat64 (runp->fname, &st) < 0) + { ++ /* Print a diagnostic that the traced file was missing. ++ We must not disable tracing since the file might return ++ shortly and we want to reload it at the next pruning. ++ Disabling tracing here would go against the configuration ++ as specified by the user via check-files. */ + char buf[128]; +- /* We cannot stat() the file, disable file checking if the +- file does not exist. */ +- dbg_log (_("cannot stat() file `%s': %s"), ++ dbg_log (_("checking for monitored file `%s': %s"), + runp->fname, strerror_r (errno, buf, sizeof (buf))); +- if (errno == ENOENT) +- table->check_file = 0; + } + else + { +- if (st.st_mtime != table->file_mtime) ++ /* This must be `!=` to catch cases where users turn the ++ clocks back and we still want to detect any time difference ++ in mtime. */ ++ if (st.st_mtime != runp->mtime) + { +- /* The file changed. Invalidate all entries. */ ++ dbg_log (_("monitored file `%s` changed (mtime)"), ++ runp->fname); ++ /* The file changed. Invalidate all entries. */ + now = LONG_MAX; +- table->file_mtime = st.st_mtime; ++ runp->mtime = st.st_mtime; ++#ifdef HAVE_INOTIFY ++ /* Attempt to install a watch on the file. */ ++ install_watches (runp); ++#endif + } + } + } +--- glibc-2.17-c758a686/nscd/connections.c 2015-05-12 15:03:02.870274443 -0400 ++++ glibc-2.17-c758a686/nscd/connections.c 2015-05-13 13:45:57.259958374 -0400 +@@ -974,6 +974,44 @@ + finish_drop_privileges (); + } + ++#ifdef HAVE_INOTIFY ++#define TRACED_FILE_MASK (IN_DELETE_SELF | IN_CLOSE_WRITE | IN_MOVE_SELF) ++#define TRACED_DIR_MASK (IN_DELETE_SELF | IN_CREATE | IN_MOVED_TO | IN_MOVE_SELF) ++void ++install_watches (struct traced_file *finfo) ++{ ++ /* Use inotify support if we have it. */ ++ if (finfo->inotify_descr[TRACED_FILE] < 0) ++ finfo->inotify_descr[TRACED_FILE] = inotify_add_watch (inotify_fd, ++ finfo->fname, ++ TRACED_FILE_MASK); ++ if (finfo->inotify_descr[TRACED_FILE] < 0) ++ { ++ dbg_log (_("disabled inotify-based monitoring for file `%s': %s"), ++ finfo->fname, strerror (errno)); ++ return; ++ } ++ dbg_log (_("monitoring file `%s` (%d)"), ++ finfo->fname, finfo->inotify_descr[TRACED_FILE]); ++ /* Additionally listen for events in the file's parent directory. ++ We do this because the file to be watched might be ++ deleted and then added back again. When it is added back again ++ we must re-add the watch. We must also cover IN_MOVED_TO to ++ detect a file being moved into the directory. */ ++ if (finfo->inotify_descr[TRACED_DIR] < 0) ++ finfo->inotify_descr[TRACED_DIR] = inotify_add_watch (inotify_fd, ++ finfo->dname, ++ TRACED_DIR_MASK); ++ if (finfo->inotify_descr[TRACED_DIR] < 0) ++ { ++ dbg_log (_("disabled inotify-based monitoring for directory `%s': %s"), ++ finfo->fname, strerror (errno)); ++ return; ++ } ++ dbg_log (_("monitoring directory `%s` (%d)"), ++ finfo->dname, finfo->inotify_descr[TRACED_DIR]); ++} ++#endif + + void + register_traced_file (size_t dbidx, struct traced_file *finfo) +@@ -982,30 +1020,24 @@ + return; + + if (__builtin_expect (debug_level > 0, 0)) +- dbg_log (_("register trace file %s for database %s"), +- finfo->fname, dbnames[dbidx]); ++ dbg_log (_("monitoring file `%s' for database `%s' (%d)"), ++ finfo->fname, dbnames[dbidx], ++ finfo->inotify_descr[TRACED_DIR]); + + #ifdef HAVE_INOTIFY +- if (inotify_fd < 0 +- || (finfo->inotify_descr = inotify_add_watch (inotify_fd, finfo->fname, +- IN_DELETE_SELF +- | IN_MODIFY)) < 0) ++ install_watches (finfo); + #endif +- { +- /* We need the modification date of the file. */ +- struct stat64 st; +- +- if (stat64 (finfo->fname, &st) < 0) +- { +- /* We cannot stat() the file, disable file checking. */ +- dbg_log (_("cannot stat() file `%s': %s"), +- finfo->fname, strerror (errno)); +- return; +- } + +- finfo->inotify_descr = -1; +- finfo->mtime = st.st_mtime; ++ struct stat64 st; ++ if (stat64 (finfo->fname, &st) < 0) ++ { ++ /* We cannot stat() the file. Set mtime to zero and try again later. */ ++ dbg_log (_("stat failed for file `%s'; will try again later: %s"), ++ finfo->fname, strerror (errno)); ++ finfo->mtime = 0; + } ++ else ++ finfo->mtime = st.st_mtime; + + /* Queue up the file name. */ + finfo->next = dbs[dbidx].traced_files; +@@ -1030,20 +1062,27 @@ + for (number = pwddb; number < lastdb; ++number) + if (strcmp (key, dbnames[number]) == 0) + { +- if (number == hstdb) ++ struct traced_file *runp = dbs[number].traced_files; ++ while (runp != NULL) + { +- struct traced_file *runp = dbs[hstdb].traced_files; +- while (runp != NULL) +- if (runp->call_res_init) +- { +- res_init (); +- break; +- } +- else +- runp = runp->next; ++ /* Make sure we reload from file when checking mtime. */ ++ runp->mtime = 0; ++#ifdef HAVE_INOTIFY ++ /* During an invalidation we try to reload the traced ++ file watches. This allows the user to re-sync if ++ inotify events were lost. Similar to what we do during ++ pruning. */ ++ install_watches (runp); ++#endif ++ if (runp->call_res_init) ++ { ++ res_init (); ++ break; ++ } ++ runp = runp->next; + } + break; +- } ++ } + + if (number == lastdb) + { +@@ -1871,6 +1910,234 @@ + static time_t *starttime; + + ++#ifdef HAVE_INOTIFY ++/* Inotify event for changed file. */ ++union __inev ++{ ++ struct inotify_event i; ++# ifndef PATH_MAX ++# define PATH_MAX 1024 ++# endif ++ char buf[sizeof (struct inotify_event) + PATH_MAX]; ++}; ++ ++/* Returns 0 if the file is there otherwise -1. */ ++int ++check_file (struct traced_file *finfo) ++{ ++ struct stat64 st; ++ /* We could check mtime and if different re-add ++ the watches, and invalidate the database, but we ++ don't because we are called from inotify_check_files ++ which should be doing that work. If sufficient inotify ++ events were lost then the next pruning or invalidation ++ will do the stat and mtime check. We don't do it here to ++ keep the logic simple. */ ++ if (stat64 (finfo->fname, &st) < 0) ++ return -1; ++ return 0; ++} ++ ++/* Process the inotify event in INEV. If the event matches any of the files ++ registered with a database then mark that database as requiring its cache ++ to be cleared. We indicate the cache needs clearing by setting ++ TO_CLEAR[DBCNT] to true for the matching database. */ ++static void ++inotify_check_files (bool *to_clear, union __inev *inev) ++{ ++ /* Check which of the files changed. */ ++ for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt) ++ { ++ struct traced_file *finfo = dbs[dbcnt].traced_files; ++ ++ while (finfo != NULL) ++ { ++ /* The configuration file was moved or deleted. ++ We stop watching it at that point, and reinitialize. */ ++ if (finfo->inotify_descr[TRACED_FILE] == inev->i.wd ++ && ((inev->i.mask & IN_MOVE_SELF) ++ || (inev->i.mask & IN_DELETE_SELF) ++ || (inev->i.mask & IN_IGNORED))) ++ { ++ int ret; ++ bool moved = (inev->i.mask & IN_MOVE_SELF) != 0; ++ ++ if (check_file (finfo) == 0) ++ { ++ dbg_log (_("ignored inotify event for `%s` (file exists)"), ++ finfo->fname); ++ return; ++ } ++ ++ dbg_log (_("monitored file `%s` was %s, removing watch"), ++ finfo->fname, moved ? "moved" : "deleted"); ++ /* File was moved out, remove the watch. Watches are ++ automatically removed when the file is deleted. */ ++ if (moved) ++ { ++ ret = inotify_rm_watch (inotify_fd, inev->i.wd); ++ if (ret < 0) ++ dbg_log (_("failed to remove file watch `%s`: %s"), ++ finfo->fname, strerror (errno)); ++ } ++ finfo->inotify_descr[TRACED_FILE] = -1; ++ to_clear[dbcnt] = true; ++ if (finfo->call_res_init) ++ res_init (); ++ return; ++ } ++ /* The configuration file was open for writing and has just closed. ++ We reset the cache and reinitialize. */ ++ if (finfo->inotify_descr[TRACED_FILE] == inev->i.wd ++ && inev->i.mask & IN_CLOSE_WRITE) ++ { ++ /* Mark cache as needing to be cleared and reinitialize. */ ++ dbg_log (_("monitored file `%s` was written to"), finfo->fname); ++ to_clear[dbcnt] = true; ++ if (finfo->call_res_init) ++ res_init (); ++ return; ++ } ++ /* The parent directory was moved or deleted. We trigger one last ++ invalidation. At the next pruning or invalidation we may add ++ this watch back if the file is present again. */ ++ if (finfo->inotify_descr[TRACED_DIR] == inev->i.wd ++ && ((inev->i.mask & IN_DELETE_SELF) ++ || (inev->i.mask & IN_MOVE_SELF) ++ || (inev->i.mask & IN_IGNORED))) ++ { ++ bool moved = (inev->i.mask & IN_MOVE_SELF) != 0; ++ /* The directory watch may have already been removed ++ but we don't know so we just remove it again and ++ ignore the error. Then we remove the file watch. ++ Note: watches are automatically removed for deleted ++ files. */ ++ if (moved) ++ inotify_rm_watch (inotify_fd, inev->i.wd); ++ if (finfo->inotify_descr[TRACED_FILE] != -1) ++ { ++ dbg_log (_("monitored parent directory `%s` was %s, removing watch on `%s`"), ++ finfo->dname, moved ? "moved" : "deleted", finfo->fname); ++ if (inotify_rm_watch (inotify_fd, finfo->inotify_descr[TRACED_FILE]) < 0) ++ dbg_log (_("failed to remove file watch `%s`: %s"), ++ finfo->dname, strerror (errno)); ++ } ++ finfo->inotify_descr[TRACED_FILE] = -1; ++ finfo->inotify_descr[TRACED_DIR] = -1; ++ to_clear[dbcnt] = true; ++ if (finfo->call_res_init) ++ res_init (); ++ /* Continue to the next entry since this might be the ++ parent directory for multiple registered files and ++ we want to remove watches for all registered files. */ ++ continue; ++ } ++ /* The parent directory had a create or moved to event. */ ++ if (finfo->inotify_descr[TRACED_DIR] == inev->i.wd ++ && ((inev->i.mask & IN_MOVED_TO) ++ || (inev->i.mask & IN_CREATE)) ++ && strcmp (inev->i.name, finfo->sfname) == 0) ++ { ++ /* We detected a directory change. We look for the creation ++ of the file we are tracking or the move of the same file ++ into the directory. */ ++ int ret; ++ dbg_log (_("monitored file `%s` was %s, adding watch"), ++ finfo->fname, ++ inev->i.mask & IN_CREATE ? "created" : "moved into place"); ++ /* File was moved in or created. Regenerate the watch. */ ++ if (finfo->inotify_descr[TRACED_FILE] != -1) ++ inotify_rm_watch (inotify_fd, ++ finfo->inotify_descr[TRACED_FILE]); ++ ++ ret = inotify_add_watch (inotify_fd, ++ finfo->fname, ++ TRACED_FILE_MASK); ++ if (ret < 0) ++ dbg_log (_("failed to add file watch `%s`: %s"), ++ finfo->fname, strerror (errno)); ++ ++ finfo->inotify_descr[TRACED_FILE] = ret; ++ ++ /* The file is new or moved so mark cache as needing to ++ be cleared and reinitialize. */ ++ to_clear[dbcnt] = true; ++ if (finfo->call_res_init) ++ res_init (); ++ ++ /* Done re-adding the watch. Don't return, we may still ++ have other files in this same directory, same watch ++ descriptor, and need to process them. */ ++ } ++ /* Other events are ignored, and we move on to the next file. */ ++ finfo = finfo->next; ++ } ++ } ++} ++ ++/* If an entry in the array of booleans TO_CLEAR is TRUE then clear the cache ++ for the associated database, otherwise do nothing. The TO_CLEAR array must ++ have LASTDB entries. */ ++static inline void ++clear_db_cache (bool *to_clear) ++{ ++ for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt) ++ if (to_clear[dbcnt]) ++ { ++ pthread_mutex_lock (&dbs[dbcnt].prune_lock); ++ dbs[dbcnt].clear_cache = 1; ++ pthread_mutex_unlock (&dbs[dbcnt].prune_lock); ++ pthread_cond_signal (&dbs[dbcnt].prune_cond); ++ } ++} ++ ++int ++handle_inotify_events (void) ++{ ++ bool to_clear[lastdb] = { false, }; ++ union __inev inev; ++ ++ /* Read all inotify events for files registered via ++ register_traced_file(). */ ++ while (1) ++ { ++ /* Potentially read multiple events into buf. */ ++ ssize_t nb = TEMP_FAILURE_RETRY (read (inotify_fd, ++ &inev.buf, ++ sizeof (inev))); ++ if (nb < (ssize_t) sizeof (struct inotify_event)) ++ { ++ /* Not even 1 event. */ ++ if (__glibc_unlikely (nb == -1 && errno != EAGAIN)) ++ return -1; ++ /* Done reading events that are ready. */ ++ break; ++ } ++ /* Process all events. The normal inotify interface delivers ++ complete events on a read and never a partial event. */ ++ char *eptr = &inev.buf[0]; ++ ssize_t count; ++ while (1) ++ { ++ /* Check which of the files changed. */ ++ inotify_check_files (to_clear, &inev); ++ count = sizeof (struct inotify_event) + inev.i.len; ++ eptr += count; ++ nb -= count; ++ if (nb >= (ssize_t) sizeof (struct inotify_event)) ++ memcpy (&inev, eptr, nb); ++ else ++ break; ++ } ++ continue; ++ } ++ /* Actually perform the cache clearing. */ ++ clear_db_cache (to_clear); ++ return 0; ++} ++ ++#endif ++ + static void + __attribute__ ((__noreturn__)) + main_loop_poll (void) +@@ -1975,72 +2242,21 @@ + { + if (conns[1].revents != 0) + { +- bool to_clear[lastdb] = { false, }; +- union +- { +-# ifndef PATH_MAX +-# define PATH_MAX 1024 +-# endif +- struct inotify_event i; +- char buf[sizeof (struct inotify_event) + PATH_MAX]; +- } inev; +- +- while (1) +- { +- ssize_t nb = TEMP_FAILURE_RETRY (read (inotify_fd, &inev, +- sizeof (inev))); +- if (nb < (ssize_t) sizeof (struct inotify_event)) +- { +- if (__builtin_expect (nb == -1 && errno != EAGAIN, +- 0)) +- { +- /* Something went wrong when reading the inotify +- data. Better disable inotify. */ +- dbg_log (_("\ +-disabled inotify after read error %d"), +- errno); +- conns[1].fd = -1; +- firstfree = 1; +- if (nused == 2) +- nused = 1; +- close (inotify_fd); +- inotify_fd = -1; +- } +- break; +- } +- +- /* Check which of the files changed. */ +- for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt) +- { +- struct traced_file *finfo = dbs[dbcnt].traced_files; +- +- while (finfo != NULL) +- { +- if (finfo->inotify_descr == inev.i.wd) +- { +- to_clear[dbcnt] = true; +- if (finfo->call_res_init) +- res_init (); +- goto next; +- } +- +- finfo = finfo->next; +- } +- } +- next:; +- } +- +- /* Actually perform the cache clearing. */ +- for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt) +- if (to_clear[dbcnt]) +- { +- pthread_mutex_lock (&dbs[dbcnt].prune_lock); +- dbs[dbcnt].clear_cache = 1; +- pthread_mutex_unlock (&dbs[dbcnt].prune_lock); +- pthread_cond_signal (&dbs[dbcnt].prune_cond); +- } +- +- --n; ++ int ret; ++ ret = handle_inotify_events (); ++ if (ret == -1) ++ { ++ /* Something went wrong when reading the inotify ++ data. Better disable inotify. */ ++ dbg_log (_("disabled inotify-based monitoring after read error %d"), errno); ++ conns[1].fd = -1; ++ firstfree = 1; ++ if (nused == 2) ++ nused = 1; ++ close (inotify_fd); ++ inotify_fd = -1; ++ } ++ --n; + } + + first = 2; +@@ -2207,64 +2423,18 @@ + # ifdef HAVE_INOTIFY + else if (revs[cnt].data.fd == inotify_fd) + { +- bool to_clear[lastdb] = { false, }; +- union +- { +- struct inotify_event i; +- char buf[sizeof (struct inotify_event) + PATH_MAX]; +- } inev; +- +- while (1) ++ int ret; ++ ret = handle_inotify_events (); ++ if (ret == -1) + { +- ssize_t nb = TEMP_FAILURE_RETRY (read (inotify_fd, &inev, +- sizeof (inev))); +- if (nb < (ssize_t) sizeof (struct inotify_event)) +- { +- if (__builtin_expect (nb == -1 && errno != EAGAIN, 0)) +- { +- /* Something went wrong when reading the inotify +- data. Better disable inotify. */ +- dbg_log (_("disabled inotify after read error %d"), +- errno); +- (void) epoll_ctl (efd, EPOLL_CTL_DEL, inotify_fd, +- NULL); +- close (inotify_fd); +- inotify_fd = -1; +- } +- break; +- } +- +- /* Check which of the files changed. */ +- for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt) +- { +- struct traced_file *finfo = dbs[dbcnt].traced_files; +- +- while (finfo != NULL) +- { +- if (finfo->inotify_descr == inev.i.wd) +- { +- to_clear[dbcnt] = true; +- if (finfo->call_res_init) +- res_init (); +- goto next; +- } +- +- finfo = finfo->next; +- } +- } +- next:; +- } +- +- /* Actually perform the cache clearing. */ +- for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt) +- if (to_clear[dbcnt]) +- { +- pthread_mutex_lock (&dbs[dbcnt].prune_lock); +- dbs[dbcnt].clear_cache = 1; +- pthread_mutex_unlock (&dbs[dbcnt].prune_lock); +- pthread_cond_signal (&dbs[dbcnt].prune_cond); +- } +- } ++ /* Something went wrong when reading the inotify ++ data. Better disable inotify. */ ++ dbg_log (_("disabled inotify-based monitoring after read error %d"), errno); ++ close (inotify_fd); ++ inotify_fd = -1; ++ break; ++ } ++ } + # endif + # ifdef HAVE_NETLINK + else if (revs[cnt].data.fd == nl_status_fd) +@@ -2300,7 +2470,9 @@ + no reply in too long of a time. */ + time_t laststart = now - ACCEPT_TIMEOUT; + assert (starttime[sock] == 0); ++# ifdef HAVE_INOTIFY + assert (inotify_fd == -1 || starttime[inotify_fd] == 0); ++# endif + assert (nl_status_fd == -1 || starttime[nl_status_fd] == 0); + for (int cnt = highest; cnt > STDERR_FILENO; --cnt) + if (starttime[cnt] != 0 && starttime[cnt] < laststart) +--- glibc-2.17-c758a686/nscd/nscd.h 2015-05-12 15:03:02.870274443 -0400 ++++ glibc-2.17-c758a686/nscd/nscd.h 2015-05-13 13:45:57.259958374 -0400 +@@ -61,17 +61,67 @@ + 80% of the thread stack size. */ + #define MAX_STACK_USE ((8 * NSCD_THREAD_STACKSIZE) / 10) + +- +-/* Registered filename used to fill database. */ ++/* Records the file registered per database that when changed ++ or modified requires invalidating the database. */ + struct traced_file + { ++ /* Tracks the last modified time of the traced file. */ + time_t mtime; ++ /* Support multiple registered files per database. */ + struct traced_file *next; + int call_res_init; +- int inotify_descr; ++ /* Requires Inotify support to do anything useful. */ ++#define TRACED_FILE 0 ++#define TRACED_DIR 1 ++ int inotify_descr[2]; ++# ifndef PATH_MAX ++# define PATH_MAX 1024 ++# endif ++ /* The parent directory is used to scan for creation/deletion. */ ++ char dname[PATH_MAX]; ++ /* Just the name of the file with no directory component. */ ++ char *sfname; ++ /* The full-path name of the registered file. */ + char fname[]; + }; + ++/* Initialize a `struct traced_file`. As input we need the name ++ of the file, and if invalidation requires calling res_init. ++ If CRINIT is 1 then res_init will be called after invalidation ++ or if the traced file is changed in any way, otherwise it will ++ not. */ ++static inline void ++init_traced_file(struct traced_file *file, const char *fname, int crinit) ++{ ++ char *dname; ++ file->mtime = 0; ++ file->inotify_descr[TRACED_FILE] = -1; ++ file->inotify_descr[TRACED_DIR] = -1; ++ strcpy (file->fname, fname); ++ /* Compute the parent directory name and store a copy. The copy makes ++ it much faster to add/remove watches while nscd is running instead ++ of computing this over and over again in a temp buffer. */ ++ file->dname[0] = '\0'; ++ dname = strrchr (fname, '/'); ++ if (dname != NULL) ++ { ++ size_t len = (size_t)(dname - fname); ++ if (len > sizeof (file->dname)) ++ abort (); ++ strncpy (file->dname, file->fname, len); ++ file->dname[len] = '\0'; ++ } ++ /* The basename is the name just after the last forward slash. */ ++ file->sfname = &dname[1]; ++ file->call_res_init = crinit; ++} ++ ++#define define_traced_file(id, filename) \ ++static union \ ++{ \ ++ struct traced_file file; \ ++ char buf[sizeof (struct traced_file) + sizeof (filename)]; \ ++} id##_traced_file; + + /* Structure describing dynamic part of one database. */ + struct database_dyn +@@ -90,7 +140,6 @@ + int propagate; + struct traced_file *traced_files; + const char *db_filename; +- time_t file_mtime; + size_t suggested_module; + size_t max_db_size; + +@@ -216,6 +265,9 @@ + /* connections.c */ + extern void nscd_init (void); + extern void register_traced_file (size_t dbidx, struct traced_file *finfo); ++#ifdef HAVE_INOTIFY ++extern void install_watches (struct traced_file *finfo); ++#endif + extern void close_sockets (void); + extern void start_threads (void) __attribute__ ((__noreturn__)); + +--- glibc-2.17-c758a686/nss/nss_db/db-init.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nss/nss_db/db-init.c 2015-05-13 13:45:57.269958504 -0400 +@@ -22,35 +22,25 @@ + #include <nscd/nscd.h> + #include <string.h> + +-static union +-{ +- struct traced_file file; +- char buf[sizeof (struct traced_file) + sizeof (_PATH_VARDB "passwd.db")]; +-} pwd_traced_file; +- +-static union +-{ +- struct traced_file file; +- char buf[sizeof (struct traced_file) + sizeof (_PATH_VARDB "group.db")]; +-} grp_traced_file; ++#define PWD_FILENAME (_PATH_VARDB "passwd.db") ++define_traced_file (pwd, PWD_FILENAME); + +-static union +-{ +- struct traced_file file; +- char buf[sizeof (struct traced_file) + sizeof (_PATH_VARDB "services.db")]; +-} serv_traced_file; ++#define GRP_FILENAME (_PATH_VARDB "group.db") ++define_traced_file (grp, GRP_FILENAME); + ++#define SERV_FILENAME (_PATH_VARDB "services.db") ++define_traced_file (serv, SERV_FILENAME); + + void + _nss_db_init (void (*cb) (size_t, struct traced_file *)) + { +- strcpy (pwd_traced_file.file.fname,_PATH_VARDB "passwd.db"); ++ init_traced_file (&pwd_traced_file.file, PWD_FILENAME, 0); + cb (pwddb, &pwd_traced_file.file); + +- strcpy (grp_traced_file.file.fname, _PATH_VARDB "group.db"); ++ init_traced_file (&grp_traced_file.file, GRP_FILENAME, 0); + cb (grpdb, &grp_traced_file.file); + +- strcpy (serv_traced_file.file.fname, _PATH_VARDB "services.db"); ++ init_traced_file (&serv_traced_file.file, SERV_FILENAME, 0); + cb (servdb, &serv_traced_file.file); + } + +--- glibc-2.17-c758a686/nss/nss_files/files-init.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nss/nss_files/files-init.c 2015-05-13 13:45:57.269958504 -0400 +@@ -18,43 +18,46 @@ + + #ifdef USE_NSCD + ++#include <string.h> + #include <nscd/nscd.h> + ++#define PWD_FILENAME "/etc/passwd" ++define_traced_file (pwd, PWD_FILENAME); + +-#define TF(id, filename, ...) \ +-static union \ +-{ \ +- struct traced_file file; \ +- char buf[sizeof (struct traced_file) + sizeof (filename)]; \ +-} id##_traced_file = \ +- { \ +- .file = \ +- { \ +- .fname = filename, ## __VA_ARGS__ \ +- } \ +- } +- +-TF (pwd, "/etc/passwd"); +-TF (grp, "/etc/group"); +-TF (hst, "/etc/hosts"); +-TF (resolv, "/etc/resolv.conf", .call_res_init = 1); +-TF (serv, "/etc/services"); +-TF (netgr, "/etc/netgroup"); +- +- ++#define GRP_FILENAME "/etc/group" ++define_traced_file (grp, GRP_FILENAME); ++ ++#define HST_FILENAME "/etc/hosts" ++define_traced_file (hst, HST_FILENAME); ++ ++#define RESOLV_FILENAME "/etc/resolv.conf" ++define_traced_file (resolv, RESOLV_FILENAME); ++ ++#define SERV_FILENAME "/etc/services" ++define_traced_file (serv, SERV_FILENAME); ++ ++#define NETGR_FILENAME "/etc/netgroup" ++define_traced_file (netgr, NETGR_FILENAME); ++ + void + _nss_files_init (void (*cb) (size_t, struct traced_file *)) + { ++ init_traced_file (&pwd_traced_file.file, PWD_FILENAME, 0); + cb (pwddb, &pwd_traced_file.file); + ++ init_traced_file (&grp_traced_file.file, GRP_FILENAME, 0); + cb (grpdb, &grp_traced_file.file); + ++ init_traced_file (&hst_traced_file.file, HST_FILENAME, 0); + cb (hstdb, &hst_traced_file.file); + ++ init_traced_file (&resolv_traced_file.file, RESOLV_FILENAME, 1); + cb (hstdb, &resolv_traced_file.file); + ++ init_traced_file (&serv_traced_file.file, SERV_FILENAME, 0); + cb (servdb, &serv_traced_file.file); +- ++ ++ init_traced_file (&netgr_traced_file.file, NETGR_FILENAME, 0); + cb (netgrdb, &netgr_traced_file.file); + } + diff --git a/SOURCES/glibc-rh1194143.patch b/SOURCES/glibc-rh1194143.patch new file mode 100644 index 0000000..a5f2e1d --- /dev/null +++ b/SOURCES/glibc-rh1194143.patch @@ -0,0 +1,18 @@ +commit f9d2d03254a58d92635a311a42253eeed5a40a47 +Author: Andreas Schwab <schwab@suse.de> +Date: Mon May 26 18:01:31 2014 +0200 + + Fix invalid file descriptor reuse while sending DNS query (BZ #15946) + +diff --git glibc-2.17-c758a686/resolv/res_send.c glibc-2.17-c758a686/resolv/res_send.c +index 3273d55..af42b8a 100644 +--- glibc-2.17-c758a686/resolv/res_send.c ++++ glibc-2.17-c758a686/resolv/res_send.c +@@ -1410,6 +1410,7 @@ send_dg(res_state statp, + retval = reopen (statp, terrno, ns); + if (retval <= 0) + return retval; ++ pfd[0].fd = EXT(statp).nssocks[ns]; + } + } + goto wait; diff --git a/SOURCES/glibc-rh1195762.patch b/SOURCES/glibc-rh1195762.patch new file mode 100644 index 0000000..be26b8a --- /dev/null +++ b/SOURCES/glibc-rh1195762.patch @@ -0,0 +1,33 @@ +commit bdf1ff052a8e23d637f2c838fa5642d78fcedc33 +Author: Paul Pluzhnikov <ppluzhnikov@google.com> +Date: Sun Feb 22 12:01:47 2015 -0800 + + Fix BZ #17269 -- _IO_wstr_overflow integer overflow + +diff --git a/libio/wstrops.c b/libio/wstrops.c +index 43d847d..3993579 100644 +--- a/libio/wstrops.c ++++ b/libio/wstrops.c +@@ -95,8 +95,11 @@ _IO_wstr_overflow (fp, c) + wchar_t *old_buf = fp->_wide_data->_IO_buf_base; + size_t old_wblen = _IO_wblen (fp); + _IO_size_t new_size = 2 * old_wblen + 100; +- if (new_size < old_wblen) ++ ++ if (__glibc_unlikely (new_size < old_wblen) ++ || __glibc_unlikely (new_size > SIZE_MAX / sizeof (wchar_t))) + return EOF; ++ + new_buf + = (wchar_t *) (*((_IO_strfile *) fp)->_s._allocate_buffer) (new_size + * sizeof (wchar_t)); +@@ -186,6 +189,9 @@ enlarge_userbuf (_IO_FILE *fp, _IO_off64_t offset, int reading) + return 1; + + _IO_size_t newsize = offset + 100; ++ if (__glibc_unlikely (newsize > SIZE_MAX / sizeof (wchar_t))) ++ return 1; ++ + wchar_t *oldbuf = wd->_IO_buf_base; + wchar_t *newbuf + = (wchar_t *) (*((_IO_strfile *) fp)->_s._allocate_buffer) (newsize diff --git a/SOURCES/glibc-rh1197730-1.patch b/SOURCES/glibc-rh1197730-1.patch new file mode 100644 index 0000000..1f4997d --- /dev/null +++ b/SOURCES/glibc-rh1197730-1.patch @@ -0,0 +1,104 @@ +commit b3a9f56ba59c3d8eadd3135a1c25c37a63151450 +Author: Andreas Schwab <schwab@suse.de> +Date: Wed Jun 18 11:58:45 2014 +0200 + + Don't read past end of pattern in fnmatch (BZ #17062) + +diff --git glibc-2.17-c758a686/posix/fnmatch_loop.c glibc-2.17-c758a686/posix/fnmatch_loop.c +index f79d051..544769b 100644 +--- glibc-2.17-c758a686/posix/fnmatch_loop.c ++++ glibc-2.17-c758a686/posix/fnmatch_loop.c +@@ -899,11 +899,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) + + matched: + /* Skip the rest of the [...] that already matched. */ +- do ++ while ((c = *p++) != L (']')) + { +- ignore_next: +- c = *p++; +- + if (c == L('\0')) + /* [... (unterminated) loses. */ + return FNM_NOMATCH; +@@ -931,12 +928,11 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) + + if (c < L('a') || c >= L('z')) + { +- p = startp; +- goto ignore_next; ++ p = startp - 2; ++ break; + } + } + p += 2; +- c = *p++; + } + else if (c == L('[') && *p == L('=')) + { +@@ -947,7 +943,6 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) + if (c != L('=') || p[1] != L(']')) + return FNM_NOMATCH; + p += 2; +- c = *p++; + } + else if (c == L('[') && *p == L('.')) + { +@@ -962,10 +957,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) + break; + } + p += 2; +- c = *p++; + } + } +- while (c != L(']')); + if (not) + return FNM_NOMATCH; + } +diff --git glibc-2.17-c758a686/posix/tst-fnmatch3.c glibc-2.17-c758a686/posix/tst-fnmatch3.c +new file mode 100644 +index 0000000..2a83c1b +--- /dev/null ++++ glibc-2.17-c758a686/posix/tst-fnmatch3.c +@@ -0,0 +1,30 @@ ++/* Test for fnmatch not reading past the end of the pattern. ++ 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <fnmatch.h> ++ ++int ++do_test (void) ++{ ++ const char *pattern = "[[:alpha:]'[:alpha:]\0]"; ++ ++ return fnmatch (pattern, "a", 0) != FNM_NOMATCH; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +--- glibc-2.17-c758a686/posix/Makefile 2015-05-15 16:00:01.000000000 -0400 ++++ glibc-2.17-c758a686/posix/Makefile 2015-05-29 18:34:07.507240952 -0400 +@@ -87,7 +87,7 @@ + tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset \ + bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \ + bug-getopt5 tst-getopt_long1 bug-regex34 \ +- tst-pathconf ++ tst-pathconf tst-fnmatch3 + xtests := bug-ga2 + ifeq (yes,$(build-shared)) + test-srcs := globtest diff --git a/SOURCES/glibc-rh1197730-2.patch b/SOURCES/glibc-rh1197730-2.patch new file mode 100644 index 0000000..88af8cd --- /dev/null +++ b/SOURCES/glibc-rh1197730-2.patch @@ -0,0 +1,46 @@ +commit 4a28f4d55a6cc33474c0792fe93b5942d81bf185 +Author: Andreas Schwab <schwab@suse.de> +Date: Thu Feb 26 14:55:24 2015 +0100 + + Fix read past end of pattern in fnmatch (bug 18032) + +diff --git glibc-2.17-c758a686/posix/fnmatch_loop.c glibc-2.17-c758a686/posix/fnmatch_loop.c +index c0cb2fc..72c5d8f 100644 +--- glibc-2.17-c758a686/posix/fnmatch_loop.c ++++ glibc-2.17-c758a686/posix/fnmatch_loop.c +@@ -945,14 +945,13 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) + } + else if (c == L('[') && *p == L('.')) + { +- ++p; + while (1) + { + c = *++p; +- if (c == '\0') ++ if (c == L('\0')) + return FNM_NOMATCH; + +- if (*p == L('.') && p[1] == L(']')) ++ if (c == L('.') && p[1] == L(']')) + break; + } + p += 2; +diff --git glibc-2.17-c758a686/posix/tst-fnmatch3.c glibc-2.17-c758a686/posix/tst-fnmatch3.c +index d27a557..75bc00a 100644 +--- glibc-2.17-c758a686/posix/tst-fnmatch3.c ++++ glibc-2.17-c758a686/posix/tst-fnmatch3.c +@@ -21,9 +21,11 @@ + int + do_test (void) + { +- const char *pattern = "[[:alpha:]'[:alpha:]\0]"; +- +- return fnmatch (pattern, "a", 0) != FNM_NOMATCH; ++ if (fnmatch ("[[:alpha:]'[:alpha:]\0]", "a", 0) != FNM_NOMATCH) ++ return 1; ++ if (fnmatch ("[a[.\0.]]", "a", 0) != FNM_NOMATCH) ++ return 1; ++ return 0; + } + + #define TEST_FUNCTION do_test () diff --git a/SOURCES/glibc-rh1197730-3.patch b/SOURCES/glibc-rh1197730-3.patch new file mode 100644 index 0000000..c92d299 --- /dev/null +++ b/SOURCES/glibc-rh1197730-3.patch @@ -0,0 +1,62 @@ +commit c2c6d39fab901c97c18fa3a3a3658d9dc3f7df61 +Author: Paul Pluzhnikov <ppluzhnikov@google.com> +Date: Mon Mar 2 13:34:22 2015 -0800 + + Fix BZ 18036 buffer overflow (read past end of buffer) in internal_fnmatch + +--- glibc-2.17-c758a686/posix/fnmatch_loop.c ++++ glibc-2.17-c758a686/posix/fnmatch_loop.c +@@ -1036,7 +1036,12 @@ END (const CHAR *pattern) + } + else if ((*p == L('?') || *p == L('*') || *p == L('+') || *p == L('@') + || *p == L('!')) && p[1] == L('(')) +- p = END (p + 1); ++ { ++ p = END (p + 1); ++ if (*p == L('\0')) ++ /* This is an invalid pattern. */ ++ return pattern; ++ } + else if (*p == L(')')) + break; + +diff --git glibc-2.17-c758a686/posix/tst-fnmatch3.c glibc-2.17-c758a686/posix/tst-fnmatch3.c +index 75bc00a..fdf9934 100644 +--- glibc-2.17-c758a686/posix/tst-fnmatch3.c ++++ glibc-2.17-c758a686/posix/tst-fnmatch3.c +@@ -17,6 +17,26 @@ + <http://www.gnu.org/licenses/>. */ + + #include <fnmatch.h> ++#include <sys/mman.h> ++#include <string.h> ++#include <unistd.h> ++ ++int ++do_bz18036 (void) ++{ ++ const char p[] = "**(!()"; ++ const int pagesize = getpagesize (); ++ ++ char *pattern = mmap (0, 2 * pagesize, PROT_READ|PROT_WRITE, ++ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ if (pattern == MAP_FAILED) return 1; ++ ++ mprotect (pattern + pagesize, pagesize, PROT_NONE); ++ memset (pattern, ' ', pagesize); ++ strcpy (pattern, p); ++ ++ return fnmatch (pattern, p, FNM_EXTMATCH); ++} + + int + do_test (void) +@@ -25,7 +45,7 @@ do_test (void) + return 1; + if (fnmatch ("[a[.\0.]]", "a", 0) != FNM_NOMATCH) + return 1; +- return 0; ++ return do_bz18036 (); + } + + #define TEST_FUNCTION do_test () diff --git a/SOURCES/glibc-rh1199525.patch b/SOURCES/glibc-rh1199525.patch new file mode 100644 index 0000000..8af91ca --- /dev/null +++ b/SOURCES/glibc-rh1199525.patch @@ -0,0 +1,20 @@ +commit 2959eda9272a033863c271aff62095abd01bd4e3 +Author: Arjun Shankar <arjun.is@lostca.se> +Date: Tue Apr 21 14:06:31 2015 +0200 + + CVE-2015-1781: resolv/nss_dns/dns-host.c buffer overflow [BZ#18287] + +diff --git glibc-2.17-c758a686/resolv/nss_dns/dns-host.c glibc-2.17-c758a686/resolv/nss_dns/dns-host.c +index b16b0dd..d8c5579 100644 +--- glibc-2.17-c758a686/resolv/nss_dns/dns-host.c ++++ glibc-2.17-c758a686/resolv/nss_dns/dns-host.c +@@ -613,7 +613,8 @@ + int have_to_map = 0; + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data); + buffer += pad; +- if (__builtin_expect (buflen < sizeof (struct host_data) + pad, 0)) ++ buflen = buflen > pad ? buflen - pad : 0; ++ if (__builtin_expect (buflen < sizeof (struct host_data), 0)) + { + /* The buffer is too small. */ + too_small: diff --git a/SOURCES/glibc-rh1202952.patch b/SOURCES/glibc-rh1202952.patch new file mode 100644 index 0000000..fc41f3b --- /dev/null +++ b/SOURCES/glibc-rh1202952.patch @@ -0,0 +1,636 @@ +# +# commit f8aeae347377f3dfa8cbadde057adf1827fb1d44 +# Author: Alexandre Oliva <aoliva@redhat.com> +# Date: Tue Mar 17 01:14:11 2015 -0300 +# +# Fix DTV race, assert, DTV_SURPLUS Static TLS limit, and nptl_db garbage +# +# for ChangeLog +# +# [BZ #17090] +# [BZ #17620] +# [BZ #17621] +# [BZ #17628] +# * NEWS: Update. +# * elf/dl-tls.c (_dl_update_slotinfo): Clean up outdated DTV +# entries with Static TLS too. Skip entries past the end of the +# allocated DTV, from Alan Modra. +# (tls_get_addr_tail): Update to glibc_likely/unlikely. Move +# Static TLS DTV entry set up from... +# (_dl_allocate_tls_init): ... here (fix modid assertion), ... +# * elf/dl-reloc.c (_dl_nothread_init_static_tls): ... here... +# * nptl/allocatestack.c (init_one_static_tls): ... and here... +# * elf/dlopen.c (dl_open_worker): Drop l_tls_modid upper bound +# for Static TLS. +# * elf/tlsdeschtab.h (map_generation): Return size_t. Check +# that the slot we find is associated with the given map before +# using its generation count. +# * nptl_db/db_info.c: Include ldsodefs.h. +# (rtld_global, dtv_slotinfo_list, dtv_slotinfo): New typedefs. +# * nptl_db/structs.def (DB_RTLD_VARIABLE): New macro. +# (DB_MAIN_VARIABLE, DB_RTLD_GLOBAL_FIELD): Likewise. +# (link_map::l_tls_offset): New struct field. +# (dtv_t::counter): Likewise. +# (rtld_global): New struct. +# (_rtld_global): New rtld variable. +# (dl_tls_dtv_slotinfo_list): New rtld global field. +# (dtv_slotinfo_list): New struct. +# (dtv_slotinfo): Likewise. +# * nptl_db/td_symbol_list.c: Drop gnu/lib-names.h include. +# (td_lookup): Rename to... +# (td_mod_lookup): ... this. Use new mod parameter instead of +# LIBPTHREAD_SO. +# * nptl_db/td_thr_tlsbase.c: Include link.h. +# (dtv_slotinfo_list, dtv_slotinfo): New functions. +# (td_thr_tlsbase): Check DTV generation. Compute Static TLS +# addresses even if the DTV is out of date or missing them. +# * nptl_db/fetch-value.c (_td_locate_field): Do not refuse to +# index zero-length arrays. +# * nptl_db/thread_dbP.h: Include gnu/lib-names.h. +# (td_lookup): Make it a macro implemented in terms of... +# (td_mod_lookup): ... this declaration. +# * nptl_db/db-symbols.awk (DB_RTLD_VARIABLE): Override. +# (DB_MAIN_VARIABLE): Likewise. +# +diff -urN glibc-2.17-c758a686/elf/dl-open.c glibc-2.17-c758a686/elf/dl-open.c +--- glibc-2.17-c758a686/elf/dl-open.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/elf/dl-open.c 2015-03-17 14:39:47.746505786 -0400 +@@ -535,17 +535,7 @@ + && imap->l_tls_blocksize > 0) + { + /* For static TLS we have to allocate the memory here and +- now. This includes allocating memory in the DTV. But we +- cannot change any DTV other than our own. So, if we +- cannot guarantee that there is room in the DTV we don't +- even try it and fail the load. +- +- XXX We could track the minimum DTV slots allocated in +- all threads. */ +- if (! RTLD_SINGLE_THREAD_P && imap->l_tls_modid > DTV_SURPLUS) +- _dl_signal_error (0, "dlopen", NULL, N_("\ +-cannot load any more object with static TLS")); +- ++ now, but we can delay updating the DTV. */ + imap->l_need_tls_init = 0; + #ifdef SHARED + /* Update the slot information data for at least the +diff -urN glibc-2.17-c758a686/elf/dl-reloc.c glibc-2.17-c758a686/elf/dl-reloc.c +--- glibc-2.17-c758a686/elf/dl-reloc.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/elf/dl-reloc.c 2015-03-17 14:39:47.747505754 -0400 +@@ -136,12 +136,6 @@ + # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" + #endif + +- /* Fill in the DTV slot so that a later LD/GD access will find it. */ +- dtv_t *dtv = THREAD_DTV (); +- assert (map->l_tls_modid <= dtv[-1].counter); +- dtv[map->l_tls_modid].pointer.val = dest; +- dtv[map->l_tls_modid].pointer.is_static = true; +- + /* Initialize the memory. */ + memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size), + '\0', map->l_tls_blocksize - map->l_tls_initimage_size); +diff -urN glibc-2.17-c758a686/elf/dl-tls.c glibc-2.17-c758a686/elf/dl-tls.c +--- glibc-2.17-c758a686/elf/dl-tls.c 2015-03-17 14:39:31.335019227 -0400 ++++ glibc-2.17-c758a686/elf/dl-tls.c 2015-03-17 14:42:48.443852579 -0400 +@@ -432,17 +432,14 @@ + assert (listp->slotinfo[cnt].gen <= GL(dl_tls_generation)); + maxgen = MAX (maxgen, listp->slotinfo[cnt].gen); + ++ dtv[map->l_tls_modid].pointer.val = TLS_DTV_UNALLOCATED; ++ dtv[map->l_tls_modid].pointer.is_static = false; ++ + if (map->l_tls_offset == NO_TLS_OFFSET + || map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET) +- { +- /* For dynamically loaded modules we simply store +- the value indicating deferred allocation. */ +- dtv[map->l_tls_modid].pointer.val = TLS_DTV_UNALLOCATED; +- dtv[map->l_tls_modid].pointer.is_static = false; +- continue; +- } ++ continue; + +- assert (map->l_tls_modid == cnt); ++ assert (map->l_tls_modid == total + cnt); + assert (map->l_tls_blocksize >= map->l_tls_initimage_size); + #if TLS_TCB_AT_TP + assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize); +@@ -454,8 +451,6 @@ + #endif + + /* Copy the initialization image and clear the BSS part. */ +- dtv[map->l_tls_modid].pointer.val = dest; +- dtv[map->l_tls_modid].pointer.is_static = true; + memset (__mempcpy (dest, map->l_tls_initimage, + map->l_tls_initimage_size), '\0', + map->l_tls_blocksize - map->l_tls_initimage_size); +@@ -623,13 +618,16 @@ + struct link_map *map = listp->slotinfo[cnt].map; + if (map == NULL) + { +- /* If this modid was used at some point the memory +- might still be allocated. */ +- if (! dtv[total + cnt].pointer.is_static +- && dtv[total + cnt].pointer.val != TLS_DTV_UNALLOCATED) ++ if (dtv[-1].counter >= total + cnt) + { +- free (dtv[total + cnt].pointer.val); ++ /* If this modid was used at some point the memory ++ might still be allocated. */ ++ if (! dtv[total + cnt].pointer.is_static ++ && (dtv[total + cnt].pointer.val ++ != TLS_DTV_UNALLOCATED)) ++ free (dtv[total + cnt].pointer.val); + dtv[total + cnt].pointer.val = TLS_DTV_UNALLOCATED; ++ dtv[total + cnt].pointer.is_static = false; + } + + continue; +@@ -693,10 +691,8 @@ + memalign and not malloc. */ + free (dtv[modid].pointer.val); + +- /* This module is loaded dynamically- We defer memory +- allocation. */ +- dtv[modid].pointer.is_static = false; + dtv[modid].pointer.val = TLS_DTV_UNALLOCATED; ++ dtv[modid].pointer.is_static = false; + + if (modid == req_modid) + the_map = map; +@@ -734,13 +730,12 @@ + the_map = listp->slotinfo[idx].map; + } + +- again: + /* Make sure that, if a dlopen running in parallel forces the + variable into static storage, we'll wait until the address in the + static TLS block is set up, and use that. If we're undecided + yet, make sure we make the decision holding the lock as well. */ +- if (__builtin_expect (the_map->l_tls_offset +- != FORCED_DYNAMIC_TLS_OFFSET, 0)) ++ if (__glibc_unlikely (the_map->l_tls_offset ++ != FORCED_DYNAMIC_TLS_OFFSET)) + { + __rtld_lock_lock_recursive (GL(dl_load_lock)); + if (__builtin_expect (the_map->l_tls_offset == NO_TLS_OFFSET, 1)) +@@ -748,22 +743,28 @@ + the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET; + __rtld_lock_unlock_recursive (GL(dl_load_lock)); + } +- else ++ else if (__glibc_likely (the_map->l_tls_offset ++ != FORCED_DYNAMIC_TLS_OFFSET)) + { ++#if TLS_TCB_AT_TP ++ void *p = (char *) THREAD_SELF - the_map->l_tls_offset; ++#elif TLS_DTV_AT_TP ++ void *p = (char *) THREAD_SELF + the_map->l_tls_offset + TLS_PRE_TCB_SIZE; ++#else ++# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" ++#endif + __rtld_lock_unlock_recursive (GL(dl_load_lock)); +- if (__builtin_expect (the_map->l_tls_offset +- != FORCED_DYNAMIC_TLS_OFFSET, 1)) +- { +- void *p = dtv[GET_ADDR_MODULE].pointer.val; +- if (__builtin_expect (p == TLS_DTV_UNALLOCATED, 0)) +- goto again; ++ dtv[GET_ADDR_MODULE].pointer.is_static = true; ++ dtv[GET_ADDR_MODULE].pointer.val = p; + +- return (char *) p + GET_ADDR_OFFSET; +- } ++ return (char *) p + GET_ADDR_OFFSET; + } ++ else ++ __rtld_lock_unlock_recursive (GL(dl_load_lock)); ++ + } + void *p = dtv[GET_ADDR_MODULE].pointer.val = allocate_and_init (the_map); +- dtv[GET_ADDR_MODULE].pointer.is_static = false; ++ assert (!dtv[GET_ADDR_MODULE].pointer.is_static); + + return (char *) p + GET_ADDR_OFFSET; + } +diff -urN glibc-2.17-c758a686/elf/tlsdeschtab.h glibc-2.17-c758a686/elf/tlsdeschtab.h +--- glibc-2.17-c758a686/elf/tlsdeschtab.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/elf/tlsdeschtab.h 2015-03-17 14:39:47.747505754 -0400 +@@ -42,7 +42,7 @@ + return tdp->tlsinfo.ti_offset == tdq->tlsinfo.ti_offset; + } + +-inline static int ++inline static size_t + map_generation (struct link_map *map) + { + size_t idx = map->l_tls_modid; +@@ -58,7 +58,7 @@ + we can assume that, if the generation count is zero, we + still haven't determined the generation count for this + module. */ +- if (listp->slotinfo[idx].gen) ++ if (listp->slotinfo[idx].map == map && listp->slotinfo[idx].gen) + return listp->slotinfo[idx].gen; + else + break; +diff -urN glibc-2.17-c758a686/nptl/allocatestack.c glibc-2.17-c758a686/nptl/allocatestack.c +--- glibc-2.17-c758a686/nptl/allocatestack.c 2015-03-17 14:39:31.342019008 -0400 ++++ glibc-2.17-c758a686/nptl/allocatestack.c 2015-03-17 14:39:47.747505754 -0400 +@@ -1157,7 +1157,6 @@ + static inline void __attribute__((always_inline)) + init_one_static_tls (struct pthread *curp, struct link_map *map) + { +- dtv_t *dtv = GET_DTV (TLS_TPADJ (curp)); + # if TLS_TCB_AT_TP + void *dest = (char *) curp - map->l_tls_offset; + # elif TLS_DTV_AT_TP +@@ -1166,11 +1165,9 @@ + # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" + # endif + +- /* Fill in the DTV slot so that a later LD/GD access will find it. */ +- dtv[map->l_tls_modid].pointer.val = dest; +- dtv[map->l_tls_modid].pointer.is_static = true; +- +- /* Initialize the memory. */ ++ /* We cannot delay the initialization of the Static TLS area, since ++ it can be accessed with LE or IE, but since the DTV is only used ++ by GD and LD, we can delay its update to avoid a race. */ + memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size), + '\0', map->l_tls_blocksize - map->l_tls_initimage_size); + } +diff -urN glibc-2.17-c758a686/nptl_db/db_info.c glibc-2.17-c758a686/nptl_db/db_info.c +--- glibc-2.17-c758a686/nptl_db/db_info.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nptl_db/db_info.c 2015-03-17 14:39:47.747505754 -0400 +@@ -20,6 +20,7 @@ + + #include "thread_dbP.h" + #include <tls.h> ++#include <ldsodefs.h> + + typedef struct pthread pthread; + typedef struct pthread_key_struct pthread_key_struct; +@@ -36,6 +37,9 @@ + } dtv; + + typedef struct link_map link_map; ++typedef struct rtld_global rtld_global; ++typedef struct dtv_slotinfo_list dtv_slotinfo_list; ++typedef struct dtv_slotinfo dtv_slotinfo; + + /* Actually static in nptl/init.c, but we only need it for typeof. */ + extern bool __nptl_initial_report_events; +diff -urN glibc-2.17-c758a686/nptl_db/db-symbols.awk glibc-2.17-c758a686/nptl_db/db-symbols.awk +--- glibc-2.17-c758a686/nptl_db/db-symbols.awk 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nptl_db/db-symbols.awk 2015-03-17 14:39:47.747505754 -0400 +@@ -2,6 +2,8 @@ + # we've just built. It checks for all the symbols used in td_symbol_list. + + BEGIN { ++%define DB_RTLD_VARIABLE(name) /* Nothing. */ ++%define DB_MAIN_VARIABLE(name) /* Nothing. */ + %define DB_LOOKUP_NAME(idx, name) required[STRINGIFY (name)] = 1; + %define DB_LOOKUP_NAME_TH_UNIQUE(idx, name) th_unique[STRINGIFY (name)] = 1; + %include "db-symbols.h" +diff -urN glibc-2.17-c758a686/nptl_db/fetch-value.c glibc-2.17-c758a686/nptl_db/fetch-value.c +--- glibc-2.17-c758a686/nptl_db/fetch-value.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nptl_db/fetch-value.c 2015-03-17 14:39:47.747505754 -0400 +@@ -68,7 +68,8 @@ + } + } + +- if (idx != 0 && idx - (psaddr_t) 0 > DB_DESC_NELEM (desc)) ++ if (idx != 0 && DB_DESC_NELEM (desc) != 0 ++ && idx - (psaddr_t) 0 > DB_DESC_NELEM (desc)) + /* This is an internal indicator to callers with nonzero IDX + that the IDX value is too big. */ + return TD_NOAPLIC; +diff -urN glibc-2.17-c758a686/nptl_db/structs.def glibc-2.17-c758a686/nptl_db/structs.def +--- glibc-2.17-c758a686/nptl_db/structs.def 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nptl_db/structs.def 2015-03-17 14:44:29.779682236 -0400 +@@ -22,6 +22,28 @@ + # define STRUCTS_DEF_DEFAULTS 1 + #endif + ++#ifndef DB_RTLD_VARIABLE ++# define DB_RTLD_VARIABLE(name) DB_VARIABLE (name) ++#endif ++ ++#ifndef DB_MAIN_VARIABLE ++# define DB_MAIN_VARIABLE(name) DB_VARIABLE (name) ++#endif ++ ++#ifndef DB_RTLD_GLOBAL_FIELD ++# if !defined IS_IN_libpthread ++# define DB_RTLD_GLOBAL_FIELD(field) \ ++ DB_STRUCT_FIELD (rtld_global, _##field) \ ++ DB_MAIN_VARIABLE (_##field) ++# elif defined SHARED ++# define DB_RTLD_GLOBAL_FIELD(field) \ ++ DB_STRUCT_FIELD (rtld_global, _##field) ++# else ++# define DB_RTLD_GLOBAL_FIELD(field) \ ++ DB_MAIN_VARIABLE (_##field) ++# endif ++#endif /* DB_RTLD_GLOBAL_FIELD */ ++ + DB_STRUCT (pthread) + DB_STRUCT_FIELD (pthread, list) + DB_STRUCT_FIELD (pthread, report_events) +@@ -70,14 +92,31 @@ + DB_STRUCT_ARRAY_FIELD (pthread_key_data_level2, data) + + DB_STRUCT_FIELD (link_map, l_tls_modid) ++DB_STRUCT_FIELD (link_map, l_tls_offset) + + 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 + DB_STRUCT_FIELD (pthread, dtvp) + #endif + ++#if !(defined IS_IN_libpthread && !defined SHARED) ++DB_STRUCT (rtld_global) ++DB_RTLD_VARIABLE (_rtld_global) ++#endif ++DB_RTLD_GLOBAL_FIELD (dl_tls_dtv_slotinfo_list) ++ ++DB_STRUCT (dtv_slotinfo_list) ++DB_STRUCT_FIELD (dtv_slotinfo_list, len) ++DB_STRUCT_FIELD (dtv_slotinfo_list, next) ++DB_STRUCT_ARRAY_FIELD (dtv_slotinfo_list, slotinfo) ++ ++DB_STRUCT (dtv_slotinfo) ++DB_STRUCT_FIELD (dtv_slotinfo, gen) ++DB_STRUCT_FIELD (dtv_slotinfo, map) ++ + #ifdef STRUCTS_DEF_DEFAULTS + # undef DB_STRUCT_ARRAY_FIELD + # undef DB_ARRAY_VARIABLE +diff -urN glibc-2.17-c758a686/nptl_db/td_symbol_list.c glibc-2.17-c758a686/nptl_db/td_symbol_list.c +--- glibc-2.17-c758a686/nptl_db/td_symbol_list.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nptl_db/td_symbol_list.c 2015-03-17 14:39:47.747505754 -0400 +@@ -18,7 +18,6 @@ + <http://www.gnu.org/licenses/>. */ + + #include <assert.h> +-#include <gnu/lib-names.h> + #include "thread_dbP.h" + + static const char *symbol_list_arr[] = +@@ -41,12 +40,12 @@ + + + ps_err_e +-td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr) ++td_mod_lookup (struct ps_prochandle *ps, const char *mod, ++ int idx, psaddr_t *sym_addr) + { + ps_err_e result; + assert (idx >= 0 && idx < SYM_NUM_MESSAGES); +- result = ps_pglobal_lookup (ps, LIBPTHREAD_SO, symbol_list_arr[idx], +- sym_addr); ++ result = ps_pglobal_lookup (ps, mod, symbol_list_arr[idx], sym_addr); + + #ifdef HAVE_ASM_GLOBAL_DOT_NAME + /* For PowerPC, 64-bit uses dot symbols but 32-bit does not. +diff -urN glibc-2.17-c758a686/nptl_db/td_thr_tlsbase.c glibc-2.17-c758a686/nptl_db/td_thr_tlsbase.c +--- glibc-2.17-c758a686/nptl_db/td_thr_tlsbase.c 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nptl_db/td_thr_tlsbase.c 2015-03-17 14:39:47.748505723 -0400 +@@ -17,14 +17,118 @@ + <http://www.gnu.org/licenses/>. */ + + #include "thread_dbP.h" ++#include <link.h> + ++/* Get the DTV slotinfo list head entry from the dynamic loader state ++ into *LISTHEAD. */ ++static td_err_e ++dtv_slotinfo_list (td_thragent_t *ta, ++ psaddr_t *listhead) ++{ ++ td_err_e err; ++ psaddr_t head; ++ ++ if (ta->ta_addr__rtld_global == 0 ++ && td_mod_lookup (ta->ph, LD_SO, SYM__rtld_global, ++ &ta->ta_addr__rtld_global) != PS_OK) ++ ta->ta_addr__rtld_global = (void*)-1; ++ ++ if (ta->ta_addr__rtld_global != (void*)-1) ++ { ++ err = DB_GET_FIELD (head, ta, ta->ta_addr__rtld_global, ++ rtld_global, _dl_tls_dtv_slotinfo_list, 0); ++ if (err != TD_OK) ++ return err; ++ } ++ else ++ { ++ if (ta->ta_addr__dl_tls_dtv_slotinfo_list == 0 ++ && td_mod_lookup (ta->ph, NULL, SYM__dl_tls_dtv_slotinfo_list, ++ &ta->ta_addr__dl_tls_dtv_slotinfo_list) != PS_OK) ++ return TD_ERR; ++ ++ err = _td_fetch_value (ta, ta->ta_var__dl_tls_dtv_slotinfo_list, ++ SYM_DESC__dl_tls_dtv_slotinfo_list, ++ 0, ta->ta_addr__dl_tls_dtv_slotinfo_list, &head); ++ if (err != TD_OK) ++ return err; ++ } ++ ++ *listhead = head; ++ return TD_OK; ++} ++ ++/* Get the address of the DTV slotinfo entry for MODID into ++ *DTVSLOTINFO. */ ++static td_err_e ++dtv_slotinfo (td_thragent_t *ta, ++ unsigned long int modid, ++ psaddr_t *dtvslotinfo) ++{ ++ td_err_e err; ++ psaddr_t slot, temp; ++ size_t slbase = 0; ++ ++ err = dtv_slotinfo_list (ta, &slot); ++ if (err != TD_OK) ++ return err; ++ ++ while (slot) ++ { ++ /* Get the number of entries in this list entry's array. */ ++ err = DB_GET_FIELD (temp, ta, slot, dtv_slotinfo_list, len, 0); ++ if (err != TD_OK) ++ return err; ++ size_t len = (uintptr_t)temp; ++ ++ /* Did we find the list entry for modid? */ ++ if (modid < slbase + len) ++ break; ++ ++ /* We didn't, so get the next list entry. */ ++ slbase += len; ++ err = DB_GET_FIELD (temp, ta, slot, dtv_slotinfo_list, ++ next, 0); ++ if (err != TD_OK) ++ return err; ++ slot = temp; ++ } ++ ++ /* We reached the end of the list and found nothing. */ ++ if (!slot) ++ return TD_ERR; ++ ++ /* Take the slotinfo for modid from the list entry. */ ++ err = DB_GET_FIELD_ADDRESS (temp, ta, slot, dtv_slotinfo_list, ++ slotinfo, modid - slbase); ++ if (err != TD_OK) ++ return err; ++ slot = temp; ++ ++ *dtvslotinfo = slot; ++ return TD_OK; ++} ++ ++/* Return in *BASE the base address of the TLS block for MODID within ++ TH. ++ ++ It should return success and yield the correct pointer in any ++ circumstance where the TLS block for the module and thread ++ requested has already been initialized. ++ ++ It should fail with TD_TLSDEFER only when the thread could not ++ possibly have observed any values in that TLS block. That way, the ++ debugger can fall back to showing initial values from the PT_TLS ++ segment (and refusing attempts to mutate) for the TD_TLSDEFER case, ++ and never fail to make the values the program will actually see ++ available to the user of the debugger. */ + td_err_e + td_thr_tlsbase (const td_thrhandle_t *th, + unsigned long int modid, + psaddr_t *base) + { + td_err_e err; +- psaddr_t dtv, dtvslot, dtvptr; ++ psaddr_t dtv, dtvslot, dtvptr, temp; + + if (modid < 1) + return TD_NOTLS; +@@ -50,11 +154,75 @@ + return TD_TLSDEFER; + } + ++ err = dtv_slotinfo (th->th_ta_p, modid, &temp); ++ if (err != TD_OK) ++ return err; ++ ++ psaddr_t slot; ++ err = DB_GET_STRUCT (slot, th->th_ta_p, temp, dtv_slotinfo); ++ if (err != TD_OK) ++ return err; ++ ++ /* Take the link_map from the slotinfo. */ ++ psaddr_t map; ++ err = DB_GET_FIELD_LOCAL (map, th->th_ta_p, slot, dtv_slotinfo, map, 0); ++ if (err != TD_OK) ++ return err; ++ if (!map) ++ return TD_ERR; ++ ++ /* Ok, the modid is good, now find out what DTV generation it ++ requires. */ ++ err = DB_GET_FIELD_LOCAL (temp, th->th_ta_p, slot, dtv_slotinfo, gen, 0); ++ if (err != TD_OK) ++ return err; ++ size_t modgen = (uintptr_t)temp; ++ + /* Get the DTV pointer from the thread descriptor. */ + err = DB_GET_FIELD (dtv, th->th_ta_p, pd, pthread, dtvp, 0); + if (err != TD_OK) + return err; + ++ psaddr_t dtvgenloc; ++ /* Get the DTV generation count at dtv[0].counter. */ ++ err = DB_GET_FIELD_ADDRESS (dtvgenloc, th->th_ta_p, dtv, dtv, dtv, 0); ++ if (err != TD_OK) ++ return err; ++ err = DB_GET_FIELD (temp, th->th_ta_p, dtvgenloc, dtv_t, counter, 0); ++ if (err != TD_OK) ++ return err; ++ size_t dtvgen = (uintptr_t)temp; ++ ++ /* Is the DTV current enough? */ ++ if (dtvgen < modgen) ++ { ++ try_static_tls: ++ /* If the module uses Static TLS, we're still good. */ ++ err = DB_GET_FIELD (temp, th->th_ta_p, map, link_map, l_tls_offset, 0); ++ if (err != TD_OK) ++ return err; ++ ptrdiff_t tlsoff = (uintptr_t)temp; ++ ++ if (tlsoff != FORCED_DYNAMIC_TLS_OFFSET ++ && tlsoff != NO_TLS_OFFSET) ++ { ++ psaddr_t tp = pd; ++ ++#if TLS_TCB_AT_TP ++ dtvptr = tp - tlsoff; ++#elif TLS_DTV_AT_TP ++ dtvptr = tp + tlsoff + TLS_PRE_TCB_SIZE; ++#else ++# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" ++#endif ++ ++ *base = dtvptr; ++ return TD_OK; ++ } ++ ++ return TD_TLSDEFER; ++ } ++ + /* Find the corresponding entry in the DTV. */ + err = DB_GET_FIELD_ADDRESS (dtvslot, th->th_ta_p, dtv, dtv, dtv, modid); + if (err != TD_OK) +@@ -68,7 +236,7 @@ + /* It could be that the memory for this module is not allocated for + the given thread. */ + if ((uintptr_t) dtvptr & 1) +- return TD_TLSDEFER; ++ goto try_static_tls; + + *base = dtvptr; + return TD_OK; +diff -urN glibc-2.17-c758a686/nptl_db/thread_dbP.h glibc-2.17-c758a686/nptl_db/thread_dbP.h +--- glibc-2.17-c758a686/nptl_db/thread_dbP.h 2012-12-24 22:02:13.000000000 -0500 ++++ glibc-2.17-c758a686/nptl_db/thread_dbP.h 2015-03-17 14:39:47.748505723 -0400 +@@ -29,6 +29,7 @@ + #include "thread_db.h" + #include "../nptl/pthreadP.h" /* This is for *_BITMASK only. */ + #include <list.h> ++#include <gnu/lib-names.h> + + /* Indeces for the symbol names. */ + enum +@@ -139,11 +140,11 @@ + } + + +-/* Internal wrapper around ps_pglobal_lookup. */ +-extern ps_err_e td_lookup (struct ps_prochandle *ps, +- int idx, psaddr_t *sym_addr) attribute_hidden; +- +- ++/* Internal wrappers around ps_pglobal_lookup. */ ++extern ps_err_e td_mod_lookup (struct ps_prochandle *ps, const char *modname, ++ int idx, psaddr_t *sym_addr) attribute_hidden; ++#define td_lookup(ps, idx, sym_addr) \ ++ td_mod_lookup ((ps), LIBPTHREAD_SO, (idx), (sym_addr)) + + + /* Store in psaddr_t VAR the address of inferior's symbol NAME. */ diff --git a/SOURCES/glibc-rh1207032.patch b/SOURCES/glibc-rh1207032.patch new file mode 100644 index 0000000..7ddfb41 --- /dev/null +++ b/SOURCES/glibc-rh1207032.patch @@ -0,0 +1,649 @@ +commit fff94fa2245612191123a8015eac94eb04f001e2 +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Tue May 19 06:40:37 2015 +0530 + + Avoid deadlock in malloc on backtrace (BZ #16159) + + When the malloc subsystem detects some kind of memory corruption, + depending on the configuration it prints the error, a backtrace, a + memory map and then aborts the process. In this process, the + backtrace() call may result in a call to malloc, resulting in + various kinds of problematic behavior. + + In one case, the malloc it calls may detect a corruption and call + backtrace again, and a stack overflow may result due to the infinite + recursion. In another case, the malloc it calls may deadlock on an + arena lock with the malloc (or free, realloc, etc.) that detected the + corruption. In yet another case, if the program is linked with + pthreads, backtrace may do a pthread_once initialization, which + deadlocks on itself. + + In all these cases, the program exit is not as intended. This is + avoidable by marking the arena that malloc detected a corruption on, + as unusable. The following patch does that. Features of this patch + are as follows: + + - A flag is added to the mstate struct of the arena to indicate if the + arena is corrupt. + + - The flag is checked whenever malloc functions try to get a lock on + an arena. If the arena is unusable, a NULL is returned, causing the + malloc to use mmap or try the next arena. + + - malloc_printerr sets the corrupt flag on the arena when it detects a + corruption + + - free does not concern itself with the flag at all. It is not + important since the backtrace workflow does not need free. A free + in a parallel thread may cause another corruption, but that's not + new + + - The flag check and set are not atomic and may race. This is fine + since we don't care about contention during the flag check. We want + to make sure that the malloc call in the backtrace does not trip on + itself and all that action happens in the same thread and not across + threads. + + I verified that the test case does not show any regressions due to + this patch. I also ran the malloc benchmarks and found an + insignificant difference in timings (< 2%). + + +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 <tuliom@linux.vnet.ibm.com> +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 + # define arena_lock(ptr, size) do { \ +- if(ptr) \ ++ if(ptr && !arena_is_corrupt (ptr)) \ + (void)mutex_lock(&ptr->mutex); \ + else \ + ptr = arena_get2(ptr, (size), NULL); \ +@@ -808,7 +808,7 @@ reused_arena (mstate avoid_arena) + result = next_to_use; + do + { +- if (!mutex_trylock(&result->mutex)) ++ if (!arena_is_corrupt (result) && !mutex_trylock(&result->mutex)) + goto out; + + result = result->next; +@@ -820,7 +820,21 @@ reused_arena (mstate avoid_arena) + if (result == avoid_arena) + result = result->next; + +- /* No arena available. Wait for the next in line. */ ++ /* Make sure that the arena we get is not corrupted. */ ++ mstate begin = result; ++ while (arena_is_corrupt (result) || result == avoid_arena) ++ { ++ result = result->next; ++ if (result == begin) ++ break; ++ } ++ ++ /* 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); + +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)) { + malloc_printerr(check_action, "malloc_check_get_size: memory corruption", +- chunk2mem(p)); ++ chunk2mem(p), ++ chunk_is_mmapped (p) ? NULL : arena_for_chunk (p)); + return 0; + } + } +@@ -221,7 +222,8 @@ top_check(void) + return 0; + + mutex_unlock(&main_arena); +- malloc_printerr (check_action, "malloc: top chunk is corrupt", t); ++ malloc_printerr (check_action, "malloc: top chunk is corrupt", t, ++ &main_arena); + mutex_lock(&main_arena); + + /* Try to set up a new top chunk. */ +@@ -276,7 +278,8 @@ free_check(void* mem, const void *caller + if(!p) { + (void)mutex_unlock(&main_arena.mutex); + +- malloc_printerr(check_action, "free(): invalid pointer", mem); ++ malloc_printerr(check_action, "free(): invalid pointer", mem, ++ &main_arena); + return; + } + if (chunk_is_mmapped(p)) { +@@ -308,7 +311,8 @@ realloc_check(void* oldmem, size_t bytes + const mchunkptr oldp = mem2chunk_check(oldmem, &magic_p); + (void)mutex_unlock(&main_arena.mutex); + if(!oldp) { +- malloc_printerr(check_action, "realloc(): invalid pointer", oldmem); ++ malloc_printerr(check_action, "realloc(): invalid pointer", oldmem, ++ &main_arena); + return malloc_check(bytes, NULL); + } + const INTERNAL_SIZE_T oldsize = chunksize(oldp); +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 + tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ +- tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 tst-malloc-usable ++ tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 \ ++ tst-malloc-usable tst-malloc-backtrace + test-srcs = tst-mtrace + + routines = malloc morecore mcheck mtrace obstack +@@ -40,6 +41,9 @@ extra-libs-others = $(extra-libs) + libmemusage-routines = memusage + libmemusage-inhibit-o = $(filter-out .os,$(object-suffixes)) + ++$(objpfx)tst-malloc-backtrace: $(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 + +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); + static void* _int_pvalloc(mstate, size_t); +-static void malloc_printerr(int action, const char *str, void *ptr); ++static void malloc_printerr(int action, const char *str, void *ptr, mstate av); + + static void* internal_function mem2mem_check(void *p, size_t sz); + static int internal_function top_check(void); +@@ -1430,7 +1430,8 @@ typedef struct malloc_chunk* mbinptr; + BK = P->bk; \ + if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) { \ + mutex_unlock(&(AV)->mutex); \ +- malloc_printerr (check_action, "corrupted double-linked list", P); \ ++ malloc_printerr (check_action, "corrupted double-linked list", P, \ ++ AV); \ + mutex_lock(&(AV)->mutex); \ + } else { \ + FD->bk = BK; \ +@@ -1670,6 +1671,15 @@ typedef struct malloc_chunk* mfastbinptr + #define set_noncontiguous(M) ((M)->flags |= NONCONTIGUOUS_BIT) + #define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT) + ++/* ARENA_CORRUPTION_BIT is set if a memory corruption was detected on the ++ arena. Such an arena is no longer used to allocate chunks. Chunks ++ allocated in that arena before detecting corruption are not freed. */ ++ ++#define ARENA_CORRUPTION_BIT (4U) ++ ++#define arena_is_corrupt(A) (((A)->flags & ARENA_CORRUPTION_BIT)) ++#define set_arena_corrupt(A) ((A)->flags |= ARENA_CORRUPTION_BIT) ++ + /* + Set value of max_fast. + Use impossibly small value if 0. +@@ -2281,8 +2291,9 @@ static void* sysmalloc(INTERNAL_SIZE_T n + rather than expanding top. + */ + +- if ((unsigned long)(nb) >= (unsigned long)(mp_.mmap_threshold) && +- (mp_.n_mmaps < mp_.n_mmaps_max)) { ++ if (av == NULL ++ || ((unsigned long) (nb) >= (unsigned long) (mp_.mmap_threshold) ++ && (mp_.n_mmaps < mp_.n_mmaps_max))) { + + char* mm; /* return value from mmap call*/ + +@@ -2354,6 +2365,10 @@ static void* sysmalloc(INTERNAL_SIZE_T n + } + } + ++ /* There are no usable arenas and mmap also failed. */ ++ if (av == NULL) ++ return 0; ++ + /* Record incoming configuration of top */ + + old_top = av->top; +@@ -2519,7 +2534,7 @@ static void* sysmalloc(INTERNAL_SIZE_T n + else if (contiguous(av) && old_size && brk < old_end) { + /* Oops! Someone else killed our space.. Can't touch anything. */ + mutex_unlock(&av->mutex); +- malloc_printerr (3, "break adjusted to free malloc space", brk); ++ malloc_printerr (3, "break adjusted to free malloc space", brk, av); + mutex_lock(&av->mutex); + } + +@@ -2793,7 +2808,7 @@ munmap_chunk(mchunkptr p) + if (__builtin_expect (((block | total_size) & (GLRO(dl_pagesize) - 1)) != 0, 0)) + { + malloc_printerr (check_action, "munmap_chunk(): invalid pointer", +- chunk2mem (p)); ++ chunk2mem (p), NULL); + return; + } + +@@ -2861,21 +2876,20 @@ __libc_malloc(size_t bytes) + if (__builtin_expect (hook != NULL, 0)) + return (*hook)(bytes, RETURN_ADDRESS (0)); + +- arena_lookup(ar_ptr); ++ arena_get(ar_ptr, bytes); + +- arena_lock(ar_ptr, bytes); +- if(!ar_ptr) +- return 0; + victim = _int_malloc(ar_ptr, bytes); +- if(!victim) { ++ /* Retry with another arena only if we were able to find a usable arena ++ before. */ ++ if (!victim && ar_ptr != NULL) { + LIBC_PROBE (memory_malloc_retry, 1, bytes); + ar_ptr = arena_get_retry(ar_ptr, bytes); +- if (__builtin_expect(ar_ptr != NULL, 1)) { +- victim = _int_malloc(ar_ptr, bytes); +- (void)mutex_unlock(&ar_ptr->mutex); +- } +- } else ++ victim = _int_malloc (ar_ptr, bytes); ++ } ++ ++ if (ar_ptr != NULL) + (void)mutex_unlock(&ar_ptr->mutex); ++ + assert(!victim || chunk_is_mmapped(mem2chunk(victim)) || + ar_ptr == arena_for_chunk(mem2chunk(victim))); + return victim; +@@ -2946,6 +2960,11 @@ __libc_realloc(void* oldmem, size_t byte + /* its size */ + const INTERNAL_SIZE_T oldsize = chunksize(oldp); + ++ if (chunk_is_mmapped (oldp)) ++ ar_ptr = NULL; ++ else ++ ar_ptr = arena_for_chunk (oldp); ++ + /* Little security check which won't hurt performance: the + allocator never wrapps around at the end of the address space. + Therefore we can exclude some size values which might appear +@@ -2953,7 +2972,8 @@ __libc_realloc(void* oldmem, size_t byte + if (__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0) + || __builtin_expect (misaligned_chunk (oldp), 0)) + { +- malloc_printerr (check_action, "realloc(): invalid pointer", oldmem); ++ malloc_printerr (check_action, "realloc(): invalid pointer", oldmem, ++ ar_ptr); + return NULL; + } + +@@ -2977,7 +2997,6 @@ __libc_realloc(void* oldmem, size_t byte + return newmem; + } + +- ar_ptr = arena_for_chunk(oldp); + #if THREAD_STATS + if(!mutex_trylock(&ar_ptr->mutex)) + ++(ar_ptr->stat_lock_direct); +@@ -3043,18 +3062,17 @@ __libc_memalign(size_t alignment, size_t + } + + arena_get(ar_ptr, bytes + alignment + MINSIZE); +- if(!ar_ptr) +- return 0; ++ + p = _int_memalign(ar_ptr, alignment, bytes); +- if(!p) { ++ if(!p && ar_ptr != NULL) { + LIBC_PROBE (memory_memalign_retry, 2, bytes, alignment); + ar_ptr = arena_get_retry (ar_ptr, bytes); +- if (__builtin_expect(ar_ptr != NULL, 1)) { +- p = _int_memalign(ar_ptr, alignment, bytes); +- (void)mutex_unlock(&ar_ptr->mutex); +- } +- } else ++ p = _int_memalign (ar_ptr, alignment, bytes); ++ } ++ ++ if (ar_ptr != NULL) + (void)mutex_unlock(&ar_ptr->mutex); ++ + assert(!p || chunk_is_mmapped(mem2chunk(p)) || + ar_ptr == arena_for_chunk(mem2chunk(p))); + return p; +@@ -3088,18 +3106,16 @@ __libc_valloc(size_t bytes) + return (*hook)(pagesz, bytes, RETURN_ADDRESS (0)); + + arena_get(ar_ptr, bytes + pagesz + MINSIZE); +- if(!ar_ptr) +- return 0; + p = _int_valloc(ar_ptr, bytes); +- if(!p) { ++ if(!p && ar_ptr != NULL) { + LIBC_PROBE (memory_valloc_retry, 1, bytes); + ar_ptr = arena_get_retry (ar_ptr, bytes); +- if (__builtin_expect(ar_ptr != NULL, 1)) { +- p = _int_memalign(ar_ptr, pagesz, bytes); +- (void)mutex_unlock(&ar_ptr->mutex); +- } +- } else ++ p = _int_memalign(ar_ptr, pagesz, bytes); ++ } ++ ++ if (ar_ptr != NULL) + (void)mutex_unlock (&ar_ptr->mutex); ++ + assert(!p || chunk_is_mmapped(mem2chunk(p)) || + ar_ptr == arena_for_chunk(mem2chunk(p))); + +@@ -3134,15 +3150,15 @@ __libc_pvalloc(size_t bytes) + + arena_get(ar_ptr, bytes + 2*pagesz + MINSIZE); + p = _int_pvalloc(ar_ptr, bytes); +- if(!p) { ++ if(!p && ar_ptr != NULL) { + LIBC_PROBE (memory_pvalloc_retry, 1, bytes); + ar_ptr = arena_get_retry (ar_ptr, bytes + 2*pagesz + MINSIZE); +- if (__builtin_expect(ar_ptr != NULL, 1)) { +- p = _int_memalign(ar_ptr, pagesz, rounded_bytes); +- (void)mutex_unlock(&ar_ptr->mutex); +- } +- } else ++ p = _int_memalign(ar_ptr, pagesz, rounded_bytes); ++ } ++ ++ if (ar_ptr != NULL) + (void)mutex_unlock(&ar_ptr->mutex); ++ + assert(!p || chunk_is_mmapped(mem2chunk(p)) || + ar_ptr == arena_for_chunk(mem2chunk(p))); + +@@ -3184,43 +3200,54 @@ __libc_calloc(size_t n, size_t elem_size + sz = bytes; + + arena_get(av, sz); +- if(!av) +- return 0; ++ if(av) ++ { + +- /* Check if we hand out the top chunk, in which case there may be no +- need to clear. */ ++ /* Check if we hand out the top chunk, in which case there may be no ++ need to clear. */ + #if MORECORE_CLEARS +- oldtop = top(av); +- oldtopsize = chunksize(top(av)); +-#if MORECORE_CLEARS < 2 +- /* Only newly allocated memory is guaranteed to be cleared. */ +- if (av == &main_arena && +- oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop) +- oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop); ++ oldtop = top(av); ++ oldtopsize = chunksize(top(av)); ++# if MORECORE_CLEARS < 2 ++ /* Only newly allocated memory is guaranteed to be cleared. */ ++ if (av == &main_arena && ++ oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop) ++ oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop); ++# endif ++ if (av != &main_arena) ++ { ++ heap_info *heap = heap_for_ptr (oldtop); ++ if (oldtopsize < ((char *) heap + heap->mprotect_size - ++ (char *) oldtop)) ++ oldtopsize = (char *) heap + heap->mprotect_size - (char *) oldtop; ++ } + #endif +- if (av != &main_arena) +- { +- heap_info *heap = heap_for_ptr (oldtop); +- if (oldtopsize < (char *) heap + heap->mprotect_size - (char *) oldtop) +- oldtopsize = (char *) heap + heap->mprotect_size - (char *) oldtop; + } +-#endif ++ else ++ { ++ /* No usable arenas. */ ++ oldtop = 0; ++ oldtopsize = 0; ++ } + mem = _int_malloc(av, sz); + + + assert(!mem || chunk_is_mmapped(mem2chunk(mem)) || + av == arena_for_chunk(mem2chunk(mem))); + +- if (mem == 0) { ++ if (mem == 0 && av != NULL) { + LIBC_PROBE (memory_calloc_retry, 1, sz); + av = arena_get_retry (av, sz); +- if (__builtin_expect(av != NULL, 1)) { +- mem = _int_malloc(av, sz); +- (void)mutex_unlock(&av->mutex); +- } +- if (mem == 0) return 0; +- } else ++ mem = _int_malloc(av, sz); ++ } ++ ++ if (av != NULL) + (void)mutex_unlock(&av->mutex); ++ ++ /* Allocation failed even after a retry. */ ++ if (mem == 0) ++ return 0; ++ + p = mem2chunk(mem); + + /* Two optional cases in which clearing not necessary */ +@@ -3310,6 +3337,16 @@ _int_malloc(mstate av, size_t bytes) + + checked_request2size(bytes, nb); + ++ /* There are no usable arenas. Fall back to sysmalloc to get a chunk from ++ mmap. */ ++ if (__glibc_unlikely (av == NULL)) ++ { ++ void *p = sysmalloc (nb, av); ++ if (p != NULL) ++ alloc_perturb (p, bytes); ++ return p; ++ } ++ + /* + If the size qualifies as a fastbin, first check corresponding bin. + This code is safe to execute even if av is not yet initialized, so we +@@ -3334,7 +3371,7 @@ _int_malloc(mstate av, size_t bytes) + errstr = "malloc(): memory corruption (fast)"; + errout: + mutex_unlock(&av->mutex); +- malloc_printerr (check_action, errstr, chunk2mem (victim)); ++ malloc_printerr (check_action, errstr, chunk2mem (victim), av); + mutex_lock(&av->mutex); + return NULL; + } +@@ -3421,9 +3458,9 @@ _int_malloc(mstate av, size_t bytes) + if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0) + || __builtin_expect (victim->size > av->system_mem, 0)) + { +- void *p = chunk2mem(victim); + mutex_unlock(&av->mutex); +- malloc_printerr (check_action, "malloc(): memory corruption", p); ++ malloc_printerr (check_action, "malloc(): memory corruption", ++ chunk2mem (victim), av); + mutex_lock(&av->mutex); + } + size = chunksize(victim); +@@ -3801,7 +3838,7 @@ _int_free(mstate av, mchunkptr p, int ha + errout: + if (have_lock || locked) + (void)mutex_unlock(&av->mutex); +- malloc_printerr (check_action, errstr, chunk2mem(p)); ++ malloc_printerr (check_action, errstr, chunk2mem(p), av); + if (have_lock) + mutex_lock(&av->mutex); + return; +@@ -4196,7 +4233,7 @@ _int_realloc(mstate av, mchunkptr oldp, + errstr = "realloc(): invalid old size"; + errout: + mutex_unlock(&av->mutex); +- malloc_printerr (check_action, errstr, chunk2mem(oldp)); ++ malloc_printerr (check_action, errstr, chunk2mem(oldp), av); + mutex_lock(&av->mutex); + return NULL; + } +@@ -4436,7 +4473,7 @@ static void* + _int_valloc(mstate av, size_t bytes) + { + /* Ensure initialization/consolidation */ +- if (have_fastchunks(av)) malloc_consolidate(av); ++ if (av && have_fastchunks(av)) malloc_consolidate(av); + return _int_memalign(av, GLRO(dl_pagesize), bytes); + } + +@@ -4451,7 +4488,7 @@ _int_pvalloc(mstate av, size_t bytes) + size_t pagesz; + + /* Ensure initialization/consolidation */ +- if (have_fastchunks(av)) malloc_consolidate(av); ++ if (av && have_fastchunks(av)) malloc_consolidate(av); + pagesz = GLRO(dl_pagesize); + return _int_memalign(av, pagesz, (bytes + pagesz - 1) & ~(pagesz - 1)); + } +@@ -4463,6 +4500,10 @@ _int_pvalloc(mstate av, size_t bytes) + + static int mtrim(mstate av, size_t pad) + { ++ /* Don't touch corrupt arenas. */ ++ if (arena_is_corrupt (av)) ++ return 0; ++ + /* Ensure initialization/consolidation */ + malloc_consolidate (av); + +@@ -4956,8 +4997,14 @@ libc_hidden_def (__libc_mallopt) + extern char **__libc_argv attribute_hidden; + + static void +-malloc_printerr(int action, const char *str, void *ptr) ++malloc_printerr(int action, const char *str, void *ptr, mstate ar_ptr) + { ++ /* Avoid using this arena in future. We do not attempt to synchronize this ++ with anything else because we minimally want to ensure that __libc_message ++ gets its resources safely without stumbling on the current corruption. */ ++ if (ar_ptr) ++ set_arena_corrupt (ar_ptr); ++ + if ((action & 5) == 5) + __libc_message (action & 2, "%s\n", str); + else if (action & 1) +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. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++ ++#include <fcntl.h> ++#include <paths.h> ++#include <stdlib.h> ++#include <unistd.h> ++ ++#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)) ++call_free (void *ptr) ++{ ++ free (ptr); ++ *(size_t *)(ptr - sizeof (size_t)) = 1; ++} ++ ++int ++do_test (void) ++{ ++ void *ptr1 = malloc (SIZE); ++ void *ptr2 = malloc (SIZE); ++ ++ /* 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 ++ doesn't optimize out that malloc call. */ ++ return (ptr1 == ptr2); ++} ++ ++#define TEST_FUNCTION do_test () ++#define EXPECTED_SIGNAL SIGABRT ++ ++#include "../test-skeleton.c" 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 <fweimer@redhat.com> +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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <dlfcn.h> ++#include <stdio.h> ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <dlfcn.h> ++#include <stdio.h> ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <link.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++ ++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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <link.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++ ++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 <schwab@suse.de> +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 <iconv/loop.c> + + +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 + <U007E> /x7e TILDE + <U007F> /x7f DELETE + <U0080> /x80 PADDING CHARACTER (PAD) +-<UF303> /x88/x40 <CJK> +-<UF304> /x88/x41 <CJK> +-<UF305> /x88/x42 <CJK> +-<UF306> /x88/x43 <CJK> +-<UF307> /x88/x44 <CJK> +-<UF308> /x88/x45 <CJK> +-<UF309> /x88/x46 <CJK> +-<UF30A> /x88/x47 <CJK> +-<UF30B> /x88/x48 <CJK> +-<UF30C> /x88/x49 <CJK> +-<UF30D> /x88/x4a <CJK> +-<UF30E> /x88/x4b <CJK> +-<UF30F> /x88/x4c <CJK> +-<UF310> /x88/x4d <CJK> +-<UF311> /x88/x4e <CJK> +-<UF312> /x88/x4f <CJK> +-<UF313> /x88/x50 <CJK> +-<UF314> /x88/x51 <CJK> +-<UF315> /x88/x52 <CJK> +-<UF316> /x88/x53 <CJK> +-<UF317> /x88/x54 <CJK> +-<UF318> /x88/x55 <CJK> ++<U43F0> /x87/x40 <CJK> ++<U4C32> /x87/x41 <CJK> ++<U4603> /x87/x42 <CJK> ++<U45A6> /x87/x43 <CJK> ++<U4578> /x87/x44 <CJK> ++<U00027267> /x87/x45 <CJK> ++<U4D77> /x87/x46 <CJK> ++<U45B3> /x87/x47 <CJK> ++<U00027CB1> /x87/x48 <CJK> ++<U4CE2> /x87/x49 <CJK> ++<U00027CC5> /x87/x4a <CJK> ++<U3B95> /x87/x4b <CJK> ++<U4736> /x87/x4c <CJK> ++<U4744> /x87/x4d <CJK> ++<U4C47> /x87/x4e <CJK> ++<U4C40> /x87/x4f <CJK> ++<U000242BF> /x87/x50 <CJK> ++<U00023617> /x87/x51 <CJK> ++<U00027352> /x87/x52 <CJK> ++<U00026E8B> /x87/x53 <CJK> ++<U000270D2> /x87/x54 <CJK> ++<U4C57> /x87/x55 <CJK> ++<U0002A351> /x87/x56 <CJK> ++<U474F> /x87/x57 <CJK> ++<U45DA> /x87/x58 <CJK> ++<U4C85> /x87/x59 <CJK> ++<U00027C6C> /x87/x5a <CJK> ++<U4D07> /x87/x5b <CJK> ++<U4AA4> /x87/x5c <CJK> ++<U46A1> /x87/x5d <CJK> ++<U00026B23> /x87/x5e <CJK> ++<U7225> /x87/x5f <CJK> ++<U00025A54> /x87/x60 <CJK> ++<U00021A63> /x87/x61 <CJK> ++<U00023E06> /x87/x62 <CJK> ++<U00023F61> /x87/x63 <CJK> ++<U664D> /x87/x64 <CJK> ++<U56FB> /x87/x65 <CJK> ++<U7D95> /x87/x67 <CJK> ++<U591D> /x87/x68 <CJK> ++<U00028BB9> /x87/x69 <CJK> ++<U3DF4> /x87/x6a <CJK> ++<U9734> /x87/x6b <CJK> ++<U00027BEF> /x87/x6c <CJK> ++<U5BDB> /x87/x6d <CJK> ++<U00021D5E> /x87/x6e <CJK> ++<U5AA4> /x87/x6f <CJK> ++<U3625> /x87/x70 <CJK> ++<U00029EB0> /x87/x71 <CJK> ++<U5AD1> /x87/x72 <CJK> ++<U5BB7> /x87/x73 <CJK> ++<U5CFC> /x87/x74 <CJK> ++<U676E> /x87/x75 <CJK> ++<U8593> /x87/x76 <CJK> ++<U00029945> /x87/x77 <CJK> ++<U7461> /x87/x78 <CJK> ++<U749D> /x87/x79 <CJK> ++<U3875> /x87/x7a <CJK> ++<U00021D53> /x87/x7b <CJK> ++<U0002369E> /x87/x7c <CJK> ++<U00026021> /x87/x7d <CJK> ++<U3EEC> /x87/x7e <CJK> ++<U000258DE> /x87/xa1 <CJK> ++<U3AF5> /x87/xa2 <CJK> ++<U7AFC> /x87/xa3 <CJK> ++<U9F97> /x87/xa4 <CJK> ++<U00024161> /x87/xa5 <CJK> ++<U0002890D> /x87/xa6 <CJK> ++<U000231EA> /x87/xa7 <CJK> ++<U00020A8A> /x87/xa8 <CJK> ++<U0002325E> /x87/xa9 <CJK> ++<U430A> /x87/xaa <CJK> ++<U8484> /x87/xab <CJK> ++<U9F96> /x87/xac <CJK> ++<U942F> /x87/xad <CJK> ++<U4930> /x87/xae <CJK> ++<U8613> /x87/xaf <CJK> ++<U5896> /x87/xb0 <CJK> ++<U974A> /x87/xb1 <CJK> ++<U9218> /x87/xb2 <CJK> ++<U79D0> /x87/xb3 <CJK> ++<U7A32> /x87/xb4 <CJK> ++<U6660> /x87/xb5 <CJK> ++<U6A29> /x87/xb6 <CJK> ++<U889D> /x87/xb7 <CJK> ++<U744C> /x87/xb8 <CJK> ++<U7BC5> /x87/xb9 <CJK> ++<U6782> /x87/xba <CJK> ++<U7A2C> /x87/xbb <CJK> ++<U524F> /x87/xbc <CJK> ++<U9046> /x87/xbd <CJK> ++<U34E6> /x87/xbe <CJK> ++<U73C4> /x87/xbf <CJK> ++<U00025DB9> /x87/xc0 <CJK> ++<U74C6> /x87/xc1 <CJK> ++<U9FC7> /x87/xc2 <CJK> ++<U57B3> /x87/xc3 <CJK> ++<U492F> /x87/xc4 <CJK> ++<U544C> /x87/xc5 <CJK> ++<U4131> /x87/xc6 <CJK> ++<U0002368E> /x87/xc7 <CJK> ++<U5818> /x87/xc8 <CJK> ++<U7A72> /x87/xc9 <CJK> ++<U00027B65> /x87/xca <CJK> ++<U8B8F> /x87/xcb <CJK> ++<U46AE> /x87/xcc <CJK> ++<U00026E88> /x87/xcd <CJK> ++<U4181> /x87/xce <CJK> ++<U00025D99> /x87/xcf <CJK> ++<U7BAE> /x87/xd0 <CJK> ++<U000224BC> /x87/xd1 <CJK> ++<U9FC8> /x87/xd2 <CJK> ++<U000224C1> /x87/xd3 <CJK> ++<U000224C9> /x87/xd4 <CJK> ++<U000224CC> /x87/xd5 <CJK> ++<U9FC9> /x87/xd6 <CJK> ++<U8504> /x87/xd7 <CJK> ++<U000235BB> /x87/xd8 <CJK> ++<U40B4> /x87/xd9 <CJK> ++<U9FCA> /x87/xda <CJK> ++<U44E1> /x87/xdb <CJK> ++<U0002ADFF> /x87/xdc <CJK> ++<U62C1> /x87/xdd <CJK> ++<U706E> /x87/xde <CJK> ++<U9FCB> /x87/xdf <CJK> ++<U31C0> /x88/x40 <CJK> ++<U31C1> /x88/x41 <CJK> ++<U31C2> /x88/x42 <CJK> ++<U31C3> /x88/x43 <CJK> ++<U31C4> /x88/x44 <CJK> ++<U0002010C> /x88/x45 <CJK> ++<U31C5> /x88/x46 <CJK> ++<U000200D1> /x88/x47 <CJK> ++<U000200CD> /x88/x48 <CJK> ++<U31C6> /x88/x49 <CJK> ++<U31C7> /x88/x4a <CJK> ++<U000200CB> /x88/x4b <CJK> ++<U00021FE8> /x88/x4c <CJK> ++<U31C8> /x88/x4d <CJK> ++<U000200CA> /x88/x4e <CJK> ++<U31C9> /x88/x4f <CJK> ++<U31CA> /x88/x50 <CJK> ++<U31CB> /x88/x51 <CJK> ++<U31CC> /x88/x52 <CJK> ++<U0002010E> /x88/x53 <CJK> ++<U31CD> /x88/x54 <CJK> ++<U31CE> /x88/x55 <CJK> + <U0100> /x88/x56 LATIN CAPITAL LETTER A WITH MACRON + <U00C1> /x88/x57 LATIN CAPITAL LETTER A WITH ACUTE + <U01CD> /x88/x58 LATIN CAPITAL LETTER A WITH CARON +@@ -174,9 +300,9 @@ CHARMAP + <U00D3> /x88/x5f LATIN CAPITAL LETTER O WITH ACUTE + <U01D1> /x88/x60 LATIN CAPITAL LETTER O WITH CARON + <U00D2> /x88/x61 LATIN CAPITAL LETTER O WITH GRAVE +-<UF325> /x88/x62 <CJK> ++%<U00CA><U0304> /x88/x62 + <U1EBE> /x88/x63 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +-<UF327> /x88/x64 <CJK> ++%<U00CA><U030C> /x88/x64 + <U1EC0> /x88/x65 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + <U00CA> /x88/x66 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + <U0101> /x88/x67 LATIN SMALL LETTER A WITH MACRON +@@ -205,16 +331,16 @@ CHARMAP + <U01DA> /x88/x7e LATIN SMALL LETTER U WITH DIAERESIS AND CARON + <U01DC> /x88/xa1 LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + <U00FC> /x88/xa2 LATIN SMALL LETTER U WITH DIAERESIS +-<UF344> /x88/xa3 <CJK> ++%<U00EA><U0304> /x88/xa3 + <U1EBF> /x88/xa4 LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +-<UF346> /x88/xa5 <CJK> ++%<U00EA><U030C> /x88/xa5 + <U1EC1> /x88/xa6 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + <U00EA> /x88/xa7 LATIN SMALL LETTER E WITH CIRCUMFLEX + <U0261> /x88/xa8 LATIN SMALL LETTER SCRIPT G +-<UF34A> /x88/xa9 <CJK> +-<UF34B> /x88/xaa <CJK> ++<U23DA> /x88/xa9 EARTH GROUND ++<U23DB> /x88/xaa FUSE + <U0002A3A9> /x89/x40 <CJK> +-<UF3A1> /x89/x41 <CJK> ++<U00021145> /x89/x41 <CJK> + <U650A> /x89/x43 <CJK> + <U4E3D> /x89/x46 <CJK> + <U6EDD> /x89/x47 <CJK> +@@ -283,17 +409,17 @@ CHARMAP + <U80BC> /x89/xae <CJK> + <U8D0B> /x89/xb0 <CJK> + <U80F6> /x89/xb1 <CJK> +-<UF3F0> /x89/xb2 <CJK> ++<U000209E7> /x89/xb2 <CJK> + <U809F> /x89/xb5 <CJK> + <U9EC7> /x89/xb6 <CJK> + <U4CCD> /x89/xb7 <CJK> + <U9DC9> /x89/xb8 <CJK> + <U9E0C> /x89/xb9 <CJK> + <U4C3E> /x89/xba <CJK> +-<UF3F9> /x89/xbb <CJK> ++<U00029DF6> /x89/xbb <CJK> + <U0002700E> /x89/xbc <CJK> + <U9E0A> /x89/xbd <CJK> +-<UF3FC> /x89/xbe <CJK> ++<U0002A133> /x89/xbe <CJK> + <U35C1> /x89/xbf <CJK> + <U6E9A> /x89/xc1 <CJK> + <U823E> /x89/xc2 <CJK> +@@ -303,10 +429,10 @@ CHARMAP + <U9A8F> /x89/xc7 <CJK> + <U9F99> /x89/xc8 <CJK> + <U7987> /x89/xc9 <CJK> +-<UF408> /x89/xca <CJK> ++<U0002846C> /x89/xca <CJK> + <U00021DCA> /x89/xcb <CJK> + <U000205D0> /x89/xcc <CJK> +-<UF40B> /x89/xcd <CJK> ++<U00022AE6> /x89/xcd <CJK> + <U4E24> /x89/xce <CJK> + <U4E81> /x89/xcf <CJK> + <U4E80> /x89/xd0 <CJK> +@@ -356,95 +482,95 @@ CHARMAP + <U35BF> /x89/xfc <CJK> + <U55D7> /x89/xfd <CJK> + <U35C5> /x89/xfe <CJK> +-<UF43D> /x8a/x40 <CJK> ++<U00027D84> /x8a/x40 <CJK> + <U5525> /x8a/x41 <CJK> + <U00020C42> /x8a/x43 <CJK> +-<UF441> /x8a/x44 <CJK> +-<UF442> /x8a/x45 <CJK> ++<U00020D15> /x8a/x44 <CJK> ++<U0002512B> /x8a/x45 <CJK> + <U5590> /x8a/x46 <CJK> + <U00022CC6> /x8a/x47 <CJK> + <U39EC> /x8a/x48 <CJK> + <U00020341> /x8a/x49 <CJK> + <U8E46> /x8a/x4a <CJK> + <U00024DB8> /x8a/x4b <CJK> +-<UF449> /x8a/x4c <CJK> ++<U000294E5> /x8a/x4c <CJK> + <U4053> /x8a/x4d <CJK> + <U000280BE> /x8a/x4e <CJK> + <U777A> /x8a/x4f <CJK> +-<UF44D> /x8a/x50 <CJK> ++<U00022C38> /x8a/x50 <CJK> + <U3A34> /x8a/x51 <CJK> + <U47D5> /x8a/x52 <CJK> +-<UF450> /x8a/x53 <CJK> ++<U0002815D> /x8a/x53 <CJK> + <U000269F2> /x8a/x54 <CJK> + <U00024DEA> /x8a/x55 <CJK> + <U64DD> /x8a/x56 <CJK> +-<UF454> /x8a/x57 <CJK> ++<U00020D7C> /x8a/x57 <CJK> + <U00020FB4> /x8a/x58 <CJK> + <U00020CD5> /x8a/x59 <CJK> + <U000210F4> /x8a/x5a <CJK> + <U648D> /x8a/x5b <CJK> + <U8E7E> /x8a/x5c <CJK> +-<UF45A> /x8a/x5d <CJK> +-<UF45B> /x8a/x5e <CJK> +-<UF45C> /x8a/x5f <CJK> +-<UF45D> /x8a/x60 <CJK> ++<U00020E96> /x8a/x5d <CJK> ++<U00020C0B> /x8a/x5e <CJK> ++<U00020F64> /x8a/x5f <CJK> ++<U00022CA9> /x8a/x60 <CJK> + <U00028256> /x8a/x61 <CJK> + <U000244D3> /x8a/x62 <CJK> + <U00020D46> /x8a/x64 <CJK> +-<UF462> /x8a/x65 <CJK> ++<U00029A4D> /x8a/x65 <CJK> + <U000280E9> /x8a/x66 <CJK> + <U47F4> /x8a/x67 <CJK> +-<UF465> /x8a/x68 <CJK> +-<UF466> /x8a/x69 <CJK> ++<U00024EA7> /x8a/x68 <CJK> ++<U00022CC2> /x8a/x69 <CJK> + <U9AB2> /x8a/x6a <CJK> + <U3A67> /x8a/x6b <CJK> +-<UF469> /x8a/x6c <CJK> ++<U000295F4> /x8a/x6c <CJK> + <U3FED> /x8a/x6d <CJK> + <U3506> /x8a/x6e <CJK> + <U000252C7> /x8a/x6f <CJK> +-<UF46D> /x8a/x70 <CJK> +-<UF46E> /x8a/x71 <CJK> +-<UF46F> /x8a/x72 <CJK> ++<U000297D4> /x8a/x70 <CJK> ++<U000278C8> /x8a/x71 <CJK> ++<U00022D44> /x8a/x72 <CJK> + <U9D6E> /x8a/x73 <CJK> + <U9815> /x8a/x74 <CJK> + <U43D9> /x8a/x76 <CJK> + <U000260A5> /x8a/x77 <CJK> + <U64B4> /x8a/x78 <CJK> + <U54E3> /x8a/x79 <CJK> +-<UF477> /x8a/x7a <CJK> +-<UF478> /x8a/x7b <CJK> ++<U00022D4C> /x8a/x7a <CJK> ++<U00022BCA> /x8a/x7b <CJK> + <U00021077> /x8a/x7c <CJK> + <U39FB> /x8a/x7d <CJK> + <U0002106F> /x8a/x7e <CJK> +-<UF47C> /x8a/xa1 <CJK> +-<UF47D> /x8a/xa2 <CJK> +-<UF47E> /x8a/xa3 <CJK> ++<U000266DA> /x8a/xa1 <CJK> ++<U00026716> /x8a/xa2 <CJK> ++<U000279A0> /x8a/xa3 <CJK> + <U64EA> /x8a/xa4 <CJK> +-<UF480> /x8a/xa5 <CJK> ++<U00025052> /x8a/xa5 <CJK> + <U00020C43> /x8a/xa6 <CJK> + <U8E68> /x8a/xa7 <CJK> + <U000221A1> /x8a/xa8 <CJK> + <U00028B4C> /x8a/xa9 <CJK> +-<UF485> /x8a/xaa <CJK> ++<U00020731> /x8a/xaa <CJK> + <U480B> /x8a/xac <CJK> +-<UF488> /x8a/xad <CJK> ++<U000201A9> /x8a/xad <CJK> + <U3FFA> /x8a/xae <CJK> + <U5873> /x8a/xaf <CJK> +-<UF48B> /x8a/xb0 <CJK> +-<UF48D> /x8a/xb2 <CJK> ++<U00022D8D> /x8a/xb0 <CJK> ++<U000245C8> /x8a/xb2 <CJK> + <U000204FC> /x8a/xb3 <CJK> +-<UF48F> /x8a/xb4 <CJK> +-<UF490> /x8a/xb5 <CJK> +-<UF491> /x8a/xb6 <CJK> ++<U00026097> /x8a/xb4 <CJK> ++<U00020F4C> /x8a/xb5 <CJK> ++<U00020D96> /x8a/xb6 <CJK> + <U5579> /x8a/xb7 <CJK> + <U40BB> /x8a/xb8 <CJK> + <U43BA> /x8a/xb9 <CJK> + <U4AB4> /x8a/xbb <CJK> +-<UF497> /x8a/xbc <CJK> +-<UF498> /x8a/xbd <CJK> ++<U00022A66> /x8a/xbc <CJK> ++<U0002109D> /x8a/xbd <CJK> + <U81AA> /x8a/xbe <CJK> + <U98F5> /x8a/xbf <CJK> +-<UF49B> /x8a/xc0 <CJK> ++<U00020D9C> /x8a/xc0 <CJK> + <U6379> /x8a/xc1 <CJK> + <U39FE> /x8a/xc2 <CJK> + <U00022775> /x8a/xc3 <CJK> +@@ -452,49 +578,49 @@ CHARMAP + <U56A1> /x8a/xc5 <CJK> + <U647C> /x8a/xc6 <CJK> + <U3E43> /x8a/xc7 <CJK> +-<UF4A4> /x8a/xc9 <CJK> ++<U0002A601> /x8a/xc9 <CJK> + <U00020E09> /x8a/xca <CJK> + <U00022ACF> /x8a/xcb <CJK> +-<UF4A7> /x8a/xcc <CJK> ++<U00022CC9> /x8a/xcc <CJK> + <U000210C8> /x8a/xce <CJK> +-<UF4AA> /x8a/xcf <CJK> ++<U000239C2> /x8a/xcf <CJK> + <U3992> /x8a/xd0 <CJK> + <U3A06> /x8a/xd1 <CJK> +-<UF4AD> /x8a/xd2 <CJK> ++<U0002829B> /x8a/xd2 <CJK> + <U3578> /x8a/xd3 <CJK> +-<UF4AF> /x8a/xd4 <CJK> ++<U00025E49> /x8a/xd4 <CJK> + <U000220C7> /x8a/xd5 <CJK> + <U5652> /x8a/xd6 <CJK> + <U00020F31> /x8a/xd7 <CJK> +-<UF4B3> /x8a/xd8 <CJK> +-<UF4B4> /x8a/xd9 <CJK> ++<U00022CB2> /x8a/xd8 <CJK> ++<U00029720> /x8a/xd9 <CJK> + <U34BC> /x8a/xda <CJK> + <U6C3D> /x8a/xdb <CJK> +-<UF4B7> /x8a/xdc <CJK> +-<UF4BA> /x8a/xdf <CJK> +-<UF4BB> /x8a/xe0 <CJK> +-<UF4BC> /x8a/xe1 <CJK> +-<UF4BD> /x8a/xe2 <CJK> ++<U00024E3B> /x8a/xdc <CJK> ++<U00027574> /x8a/xdf <CJK> ++<U00022E8B> /x8a/xe0 <CJK> ++<U00022208> /x8a/xe1 <CJK> ++<U0002A65B> /x8a/xe2 <CJK> + <U00028CCD> /x8a/xe3 <CJK> + <U00020E7A> /x8a/xe4 <CJK> +-<UF4C0> /x8a/xe5 <CJK> +-<UF4C1> /x8a/xe6 <CJK> ++<U00020C34> /x8a/xe5 <CJK> ++<U0002681C> /x8a/xe6 <CJK> + <U7F93> /x8a/xe7 <CJK> +-<UF4C3> /x8a/xe8 <CJK> ++<U000210CF> /x8a/xe8 <CJK> + <U00022803> /x8a/xe9 <CJK> + <U00022939> /x8a/xea <CJK> + <U35FB> /x8a/xeb <CJK> + <U000251E3> /x8a/xec <CJK> +-<UF4C8> /x8a/xed <CJK> ++<U00020E8C> /x8a/xed <CJK> + <U00020F8D> /x8a/xee <CJK> + <U00020EAA> /x8a/xef <CJK> + <U3F93> /x8a/xf0 <CJK> + <U00020F30> /x8a/xf1 <CJK> + <U00020D47> /x8a/xf2 <CJK> +-<UF4CE> /x8a/xf3 <CJK> +-<UF4CF> /x8a/xf4 <CJK> ++<U0002114F> /x8a/xf3 <CJK> ++<U00020E4C> /x8a/xf4 <CJK> + <U00020EAB> /x8a/xf6 <CJK> +-<UF4D2> /x8a/xf7 <CJK> ++<U00020BA9> /x8a/xf7 <CJK> + <U00020D48> /x8a/xf8 <CJK> + <U000210C0> /x8a/xf9 <CJK> + <U0002113D> /x8a/xfa <CJK> +@@ -510,14 +636,14 @@ CHARMAP + <U00022C51> /x8b/x45 <CJK> + <U00022C55> /x8b/x46 <CJK> + <U3A18> /x8b/x47 <CJK> +-<UF4E2> /x8b/x48 <CJK> ++<U00020E98> /x8b/x48 <CJK> + <U000210C7> /x8b/x49 <CJK> + <U00020F2E> /x8b/x4a <CJK> +-<UF4E5> /x8b/x4b <CJK> ++<U0002A632> /x8b/x4b <CJK> + <U00026B50> /x8b/x4c <CJK> +-<UF4E7> /x8b/x4d <CJK> +-<UF4E8> /x8b/x4e <CJK> +-<UF4E9> /x8b/x4f <CJK> ++<U00028CD2> /x8b/x4d <CJK> ++<U00028D99> /x8b/x4e <CJK> ++<U00028CCA> /x8b/x4f <CJK> + <U95AA> /x8b/x50 <CJK> + <U54CC> /x8b/x51 <CJK> + <U82C4> /x8b/x52 <CJK> +@@ -526,7 +652,7 @@ CHARMAP + <U9C26> /x8b/x56 <CJK> + <U9AB6> /x8b/x57 <CJK> + <U0002775E> /x8b/x58 <CJK> +-<UF4F3> /x8b/x59 <CJK> ++<U00022DEE> /x8b/x59 <CJK> + <U7140> /x8b/x5a <CJK> + <U816D> /x8b/x5b <CJK> + <U80EC> /x8b/x5c <CJK> +@@ -573,15 +699,15 @@ CHARMAP + <U00020FB6> /x8b/xa7 <CJK> + <U00021180> /x8b/xa8 <CJK> + <U000252D8> /x8b/xa9 <CJK> +-<UF522> /x8b/xaa <CJK> +-<UF523> /x8b/xab <CJK> ++<U0002A2BD> /x8b/xaa <CJK> ++<U000249DA> /x8b/xab <CJK> + <U0002183A> /x8b/xac <CJK> +-<UF525> /x8b/xad <CJK> +-<UF526> /x8b/xae <CJK> ++<U00024177> /x8b/xad <CJK> ++<U0002827C> /x8b/xae <CJK> + <U5899> /x8b/xaf <CJK> + <U5268> /x8b/xb0 <CJK> + <U361A> /x8b/xb1 <CJK> +-<UF52A> /x8b/xb2 <CJK> ++<U0002573D> /x8b/xb2 <CJK> + <U7BB2> /x8b/xb3 <CJK> + <U5B68> /x8b/xb4 <CJK> + <U4800> /x8b/xb5 <CJK> +@@ -597,10 +723,10 @@ CHARMAP + <U5689> /x8b/xbf <CJK> + <U4E28> /x8b/xc0 <CJK> + <U5902> /x8b/xc1 <CJK> +-<UF53A> /x8b/xc2 <CJK> +-<UF53B> /x8b/xc3 <CJK> ++<U00021BC1> /x8b/xc2 <CJK> ++<U0002F878> /x8b/xc3 <CJK> + <U9751> /x8b/xc4 <CJK> +-<UF53D> /x8b/xc5 <CJK> ++<U00020086> /x8b/xc5 <CJK> + <U4E5B> /x8b/xc6 <CJK> + <U4EBB> /x8b/xc7 <CJK> + <U353E> /x8b/xc8 <CJK> +@@ -617,45 +743,227 @@ CHARMAP + <U722B> /x8b/xd3 <CJK> + <U4E2C> /x8b/xd4 <CJK> + <U72AD> /x8b/xd5 <CJK> +-<UF54E> /x8b/xd6 <CJK> ++<U000248E9> /x8b/xd6 <CJK> + <U7F52> /x8b/xd7 <CJK> + <U793B> /x8b/xd8 <CJK> + <U7CF9> /x8b/xd9 <CJK> + <U7F53> /x8b/xda <CJK> +-<UF553> /x8b/xdb <CJK> ++<U0002626A> /x8b/xdb <CJK> + <U34C1> /x8b/xdc <CJK> +-<UF556> /x8b/xde <CJK> ++<U0002634B> /x8b/xde <CJK> + <U8002> /x8b/xdf <CJK> + <U8080> /x8b/xe0 <CJK> +-<UF559> /x8b/xe1 <CJK> +-<UF55A> /x8b/xe2 <CJK> ++<U00026612> /x8b/xe1 <CJK> ++<U00026951> /x8b/xe2 <CJK> + <U535D> /x8b/xe3 <CJK> + <U8864> /x8b/xe4 <CJK> + <U89C1> /x8b/xe5 <CJK> +-<UF55E> /x8b/xe6 <CJK> ++<U000278B2> /x8b/xe6 <CJK> + <U8BA0> /x8b/xe7 <CJK> + <U8D1D> /x8b/xe8 <CJK> + <U9485> /x8b/xe9 <CJK> + <U9578> /x8b/xea <CJK> + <U957F> /x8b/xeb <CJK> + <U95E8> /x8b/xec <CJK> +-<UF565> /x8b/xed <CJK> ++<U00028E0F> /x8b/xed <CJK> + <U97E6> /x8b/xee <CJK> + <U9875> /x8b/xef <CJK> + <U98CE> /x8b/xf0 <CJK> + <U98DE> /x8b/xf1 <CJK> + <U9963> /x8b/xf2 <CJK> +-<UF56B> /x8b/xf3 <CJK> ++<U00029810> /x8b/xf3 <CJK> + <U9C7C> /x8b/xf4 <CJK> + <U9E1F> /x8b/xf5 <CJK> + <U9EC4> /x8b/xf6 <CJK> + <U6B6F> /x8b/xf7 <CJK> +-%IRREVERSIBLE%<U9F9C> /x8b/xf8 <CJK> ++<UF907> /x8b/xf8 <CJK> + <U4E37> /x8b/xf9 <CJK> +-<UF572> /x8b/xfa <CJK> ++<U00020087> /x8b/xfa <CJK> + <U961D> /x8b/xfb <CJK> + <U6237> /x8b/xfc <CJK> + <U94A2> /x8b/xfd <CJK> ++<U503B> /x8c/x40 <CJK> ++<U6DFE> /x8c/x41 <CJK> ++<U00029C73> /x8c/x42 <CJK> ++<U9FA6> /x8c/x43 <CJK> ++<U3DC9> /x8c/x44 <CJK> ++<U888F> /x8c/x45 <CJK> ++<U0002414E> /x8c/x46 <CJK> ++<U7077> /x8c/x47 <CJK> ++<U5CF5> /x8c/x48 <CJK> ++<U4B20> /x8c/x49 <CJK> ++<U000251CD> /x8c/x4a <CJK> ++<U3559> /x8c/x4b <CJK> ++<U00025D30> /x8c/x4c <CJK> ++<U6122> /x8c/x4d <CJK> ++<U00028A32> /x8c/x4e <CJK> ++<U8FA7> /x8c/x4f <CJK> ++<U91F6> /x8c/x50 <CJK> ++<U7191> /x8c/x51 <CJK> ++<U6719> /x8c/x52 <CJK> ++<U73BA> /x8c/x53 <CJK> ++<U00023281> /x8c/x54 <CJK> ++<U0002A107> /x8c/x55 <CJK> ++<U3C8B> /x8c/x56 <CJK> ++<U00021980> /x8c/x57 <CJK> ++<U4B10> /x8c/x58 <CJK> ++<U78E4> /x8c/x59 <CJK> ++<U7402> /x8c/x5a <CJK> ++<U51AE> /x8c/x5b <CJK> ++<U0002870F> /x8c/x5c <CJK> ++<U4009> /x8c/x5d <CJK> ++<U6A63> /x8c/x5e <CJK> ++<U0002A2BA> /x8c/x5f <CJK> ++<U4223> /x8c/x60 <CJK> ++<U860F> /x8c/x61 <CJK> ++<U00020A6F> /x8c/x62 <CJK> ++<U7A2A> /x8c/x63 <CJK> ++<U00029947> /x8c/x64 <CJK> ++<U00028AEA> /x8c/x65 <CJK> ++<U9755> /x8c/x66 <CJK> ++<U704D> /x8c/x67 <CJK> ++<U5324> /x8c/x68 <CJK> ++<U0002207E> /x8c/x69 <CJK> ++<U93F4> /x8c/x6a <CJK> ++<U76D9> /x8c/x6b <CJK> ++<U000289E3> /x8c/x6c <CJK> ++<U9FA7> /x8c/x6d <CJK> ++<U77DD> /x8c/x6e <CJK> ++<U4EA3> /x8c/x6f <CJK> ++<U4FF0> /x8c/x70 <CJK> ++<U50BC> /x8c/x71 <CJK> ++<U4E2F> /x8c/x72 <CJK> ++<U4F17> /x8c/x73 <CJK> ++<U9FA8> /x8c/x74 <CJK> ++<U5434> /x8c/x75 <CJK> ++<U7D8B> /x8c/x76 <CJK> ++<U5892> /x8c/x77 <CJK> ++<U58D0> /x8c/x78 <CJK> ++<U00021DB6> /x8c/x79 <CJK> ++<U5E92> /x8c/x7a <CJK> ++<U5E99> /x8c/x7b <CJK> ++<U5FC2> /x8c/x7c <CJK> ++<U00022712> /x8c/x7d <CJK> ++<U658B> /x8c/x7e <CJK> ++<U000233F9> /x8c/xa1 <CJK> ++<U6919> /x8c/xa2 <CJK> ++<U6A43> /x8c/xa3 <CJK> ++<U00023C63> /x8c/xa4 <CJK> ++<U6CFF> /x8c/xa5 <CJK> ++<U7200> /x8c/xa7 <CJK> ++<U00024505> /x8c/xa8 <CJK> ++<U738C> /x8c/xa9 <CJK> ++<U3EDB> /x8c/xaa <CJK> ++<U00024A13> /x8c/xab <CJK> ++<U5B15> /x8c/xac <CJK> ++<U74B9> /x8c/xad <CJK> ++<U8B83> /x8c/xae <CJK> ++<U00025CA4> /x8c/xaf <CJK> ++<U00025695> /x8c/xb0 <CJK> ++<U7A93> /x8c/xb1 <CJK> ++<U7BEC> /x8c/xb2 <CJK> ++<U7CC3> /x8c/xb3 <CJK> ++<U7E6C> /x8c/xb4 <CJK> ++<U82F8> /x8c/xb5 <CJK> ++<U8597> /x8c/xb6 <CJK> ++<U9FA9> /x8c/xb7 <CJK> ++<U8890> /x8c/xb8 <CJK> ++<U9FAA> /x8c/xb9 <CJK> ++<U8EB9> /x8c/xba <CJK> ++<U9FAB> /x8c/xbb <CJK> ++<U8FCF> /x8c/xbc <CJK> ++<U855F> /x8c/xbd <CJK> ++<U99E0> /x8c/xbe <CJK> ++<U9221> /x8c/xbf <CJK> ++<U9FAC> /x8c/xc0 <CJK> ++<U00028DB9> /x8c/xc1 <CJK> ++<U0002143F> /x8c/xc2 <CJK> ++<U4071> /x8c/xc3 <CJK> ++<U42A2> /x8c/xc4 <CJK> ++<U5A1A> /x8c/xc5 <CJK> ++<U9868> /x8c/xc9 <CJK> ++<U676B> /x8c/xca <CJK> ++<U4276> /x8c/xcb <CJK> ++<U573D> /x8c/xcc <CJK> ++<U85D6> /x8c/xce <CJK> ++<U0002497B> /x8c/xcf <CJK> ++<U82BF> /x8c/xd0 <CJK> ++<U0002710D> /x8c/xd1 <CJK> ++<U4C81> /x8c/xd2 <CJK> ++<U00026D74> /x8c/xd3 <CJK> ++<U5D7B> /x8c/xd4 <CJK> ++<U00026B15> /x8c/xd5 <CJK> ++<U00026FBE> /x8c/xd6 <CJK> ++<U9FAD> /x8c/xd7 <CJK> ++<U9FAE> /x8c/xd8 <CJK> ++<U5B96> /x8c/xd9 <CJK> ++<U9FAF> /x8c/xda <CJK> ++<U66E7> /x8c/xdb <CJK> ++<U7E5B> /x8c/xdc <CJK> ++<U6E57> /x8c/xdd <CJK> ++<U79CA> /x8c/xde <CJK> ++<U3D88> /x8c/xdf <CJK> ++<U44C3> /x8c/xe0 <CJK> ++<U00023256> /x8c/xe1 <CJK> ++<U00022796> /x8c/xe2 <CJK> ++<U439A> /x8c/xe3 <CJK> ++<U4536> /x8c/xe4 <CJK> ++<U5CD5> /x8c/xe6 <CJK> ++<U00023B1A> /x8c/xe7 <CJK> ++<U8AF9> /x8c/xe8 <CJK> ++<U5C78> /x8c/xe9 <CJK> ++<U3D12> /x8c/xea <CJK> ++<U00023551> /x8c/xeb <CJK> ++<U5D78> /x8c/xec <CJK> ++<U9FB2> /x8c/xed <CJK> ++<U7157> /x8c/xee <CJK> ++<U4558> /x8c/xef <CJK> ++<U000240EC> /x8c/xf0 <CJK> ++<U00021E23> /x8c/xf1 <CJK> ++<U4C77> /x8c/xf2 <CJK> ++<U3978> /x8c/xf3 <CJK> ++<U344A> /x8c/xf4 <CJK> ++<U000201A4> /x8c/xf5 <CJK> ++<U00026C41> /x8c/xf6 <CJK> ++<U8ACC> /x8c/xf7 <CJK> ++<U4FB4> /x8c/xf8 <CJK> ++<U00020239> /x8c/xf9 <CJK> ++<U59BF> /x8c/xfa <CJK> ++<U816C> /x8c/xfb <CJK> ++<U9856> /x8c/xfc <CJK> ++<U000298FA> /x8c/xfd <CJK> ++<U5F3B> /x8c/xfe <CJK> ++<U00020B9F> /x8d/x40 <CJK> ++<U000221C1> /x8d/x42 <CJK> ++<U0002896D> /x8d/x43 <CJK> ++<U4102> /x8d/x44 <CJK> ++<U46BB> /x8d/x45 <CJK> ++<U00029079> /x8d/x46 <CJK> ++<U3F07> /x8d/x47 <CJK> ++<U9FB3> /x8d/x48 <CJK> ++<U0002A1B5> /x8d/x49 <CJK> ++<U40F8> /x8d/x4a <CJK> ++<U37D6> /x8d/x4b <CJK> ++<U46F7> /x8d/x4c <CJK> ++<U00026C46> /x8d/x4d <CJK> ++<U417C> /x8d/x4e <CJK> ++<U000286B2> /x8d/x4f <CJK> ++<U000273FF> /x8d/x50 <CJK> ++<U456D> /x8d/x51 <CJK> ++<U38D4> /x8d/x52 <CJK> ++<U0002549A> /x8d/x53 <CJK> ++<U4561> /x8d/x54 <CJK> ++<U451B> /x8d/x55 <CJK> ++<U4D89> /x8d/x56 <CJK> ++<U4C7B> /x8d/x57 <CJK> ++<U4D76> /x8d/x58 <CJK> ++<U45EA> /x8d/x59 <CJK> ++<U3FC8> /x8d/x5a <CJK> ++<U00024B0F> /x8d/x5b <CJK> ++<U3661> /x8d/x5c <CJK> ++<U44DE> /x8d/x5d <CJK> ++<U44BD> /x8d/x5e <CJK> ++<U41ED> /x8d/x5f <CJK> + <U5D3E> /x8d/x60 <CJK> + <U5D48> /x8d/x61 <CJK> + <U5D56> /x8d/x62 <CJK> +@@ -780,8 +1088,8 @@ CHARMAP + <U00020325> /x8d/xfb <CJK> + <U43C1> /x8d/xfc <CJK> + <U35F1> /x8d/xfd <CJK> +-<UF6B0> /x8d/xfe <CJK> +-<UE311> /x8e/x40 <CJK> ++<U00020ED8> /x8d/xfe <CJK> ++<U00023ED7> /x8e/x40 <CJK> + <U57BE> /x8e/x41 <CJK> + <U00026ED3> /x8e/x42 <CJK> + <U713E> /x8e/x43 <CJK> +@@ -801,7 +1109,7 @@ CHARMAP + <U7AC2> /x8e/x51 <CJK> + <U7AC3> /x8e/x52 <CJK> + <U71D1> /x8e/x53 <CJK> +-<UE325> /x8e/x54 <CJK> ++<U0002648D> /x8e/x54 <CJK> + <U41CA> /x8e/x55 <CJK> + <U7ADA> /x8e/x56 <CJK> + <U7ADD> /x8e/x57 <CJK> +@@ -812,7 +1120,7 @@ CHARMAP + <U7B0B> /x8e/x5c <CJK> + <U7B55> /x8e/x5d <CJK> + <U7B29> /x8e/x5e <CJK> +-<UE330> /x8e/x5f <CJK> ++<U0002530E> /x8e/x5f <CJK> + <U00025CFE> /x8e/x60 <CJK> + <U7BA2> /x8e/x61 <CJK> + <U7B6F> /x8e/x62 <CJK> +@@ -822,7 +1130,7 @@ CHARMAP + <U7BD0> /x8e/x66 <CJK> + <U8421> /x8e/x67 <CJK> + <U7B92> /x8e/x68 <CJK> +-<U00023FF0> /x8e/x6a <CJK> ++<U00025D20> /x8e/x6a <CJK> + <U3DAD> /x8e/x6b <CJK> + <U00025C65> /x8e/x6c <CJK> + <U8492> /x8e/x6d <CJK> +@@ -831,7 +1139,7 @@ CHARMAP + <U00025CC1> /x8e/x71 <CJK> + <U7C44> /x8e/x72 <CJK> + <U7C83> /x8e/x73 <CJK> +-<UE345> /x8e/x74 <CJK> ++<U00024882> /x8e/x74 <CJK> + <U7CA6> /x8e/x75 <CJK> + <U667D> /x8e/x76 <CJK> + <U00024578> /x8e/x77 <CJK> +@@ -858,7 +1166,7 @@ CHARMAP + <U7DF5> /x8e/xb0 <CJK> + <U000217F9> /x8e/xb1 <CJK> + <U7DE5> /x8e/xb2 <CJK> +-<UE362> /x8e/xb3 <CJK> ++<U0002836D> /x8e/xb3 <CJK> + <U00026121> /x8e/xb5 <CJK> + <U0002615A> /x8e/xb6 <CJK> + <U7E6E> /x8e/xb7 <CJK> +@@ -886,15 +1194,15 @@ CHARMAP + <U8008> /x8e/xce <CJK> + <U801D> /x8e/xcf <CJK> + <U802F> /x8e/xd1 <CJK> +-<UE381> /x8e/xd2 <CJK> +-<UE382> /x8e/xd3 <CJK> ++<U0002A087> /x8e/xd2 <CJK> ++<U00026CC3> /x8e/xd3 <CJK> + <U803B> /x8e/xd4 <CJK> + <U803C> /x8e/xd5 <CJK> + <U8061> /x8e/xd6 <CJK> +-<UE386> /x8e/xd7 <CJK> ++<U00022714> /x8e/xd7 <CJK> + <U4989> /x8e/xd8 <CJK> + <U00026626> /x8e/xd9 <CJK> +-<UE389> /x8e/xda <CJK> ++<U00023DE3> /x8e/xda <CJK> + <U000266E8> /x8e/xdb <CJK> + <U6725> /x8e/xdc <CJK> + <U80A7> /x8e/xdd <CJK> +@@ -905,9 +1213,9 @@ CHARMAP + <U000226F6> /x8e/xe2 <CJK> + <U6C7F> /x8e/xe3 <CJK> + <U00026498> /x8e/xe4 <CJK> +-<UE394> /x8e/xe5 <CJK> ++<U00024FB8> /x8e/xe5 <CJK> + <U64E7> /x8e/xe6 <CJK> +-<UE396> /x8e/xe7 <CJK> ++<U0002148A> /x8e/xe7 <CJK> + <U8218> /x8e/xe8 <CJK> + <U0002185E> /x8e/xe9 <CJK> + <U6A53> /x8e/xea <CJK> +@@ -915,9 +1223,9 @@ CHARMAP + <U00024A95> /x8e/xec <CJK> + <U447A> /x8e/xed <CJK> + <U8229> /x8e/xee <CJK> +-<UE39E> /x8e/xef <CJK> ++<U00020B0D> /x8e/xef <CJK> + <U00026A52> /x8e/xf0 <CJK> +-<UE3A0> /x8e/xf1 <CJK> ++<U00023D7E> /x8e/xf1 <CJK> + <U4FF9> /x8e/xf2 <CJK> + <U000214FD> /x8e/xf3 <CJK> + <U84E2> /x8e/xf4 <CJK> +@@ -937,14 +1245,14 @@ CHARMAP + <U00020E16> /x8f/x43 <CJK> + <U000217B4> /x8f/x44 <CJK> + <U36C1> /x8f/x45 <CJK> +-<UE3B4> /x8f/x46 <CJK> ++<U0002317D> /x8f/x46 <CJK> + <U0002355A> /x8f/x47 <CJK> + <U827B> /x8f/x48 <CJK> + <U82E2> /x8f/x49 <CJK> + <U8318> /x8f/x4a <CJK> + <U00023E8B> /x8f/x4b <CJK> + <U00026DA3> /x8f/x4c <CJK> +-<UE3BB> /x8f/x4d <CJK> ++<U00026B05> /x8f/x4d <CJK> + <U00026B97> /x8f/x4e <CJK> + <U000235CE> /x8f/x4f <CJK> + <U3DBF> /x8f/x50 <CJK> +@@ -961,15 +1269,15 @@ CHARMAP + <U855A> /x8f/x5c <CJK> + <U3496> /x8f/x5d <CJK> + <U00026E42> /x8f/x5e <CJK> +-<UE3CD> /x8f/x5f <CJK> ++<U00022EEF> /x8f/x5f <CJK> + <U8458> /x8f/x60 <CJK> +-<UE3CF> /x8f/x61 <CJK> ++<U00025BE4> /x8f/x61 <CJK> + <U8471> /x8f/x62 <CJK> + <U3DD3> /x8f/x63 <CJK> + <U44E4> /x8f/x64 <CJK> + <U6AA7> /x8f/x65 <CJK> + <U844A> /x8f/x66 <CJK> +-<UE3D5> /x8f/x67 <CJK> ++<U00023CB5> /x8f/x67 <CJK> + <U7958> /x8f/x68 <CJK> + <U00026B96> /x8f/x6a <CJK> + <U00026E77> /x8f/x6b <CJK> +@@ -979,13 +1287,13 @@ CHARMAP + <U44A0> /x8f/x70 <CJK> + <U8493> /x8f/x71 <CJK> + <U84E4> /x8f/x72 <CJK> +-<UE3E1> /x8f/x73 <CJK> ++<U00025C91> /x8f/x73 <CJK> + <U4240> /x8f/x74 <CJK> + <U00025CC0> /x8f/x75 <CJK> + <U4543> /x8f/x76 <CJK> + <U8534> /x8f/x77 <CJK> + <U5AF2> /x8f/x78 <CJK> +-<UE3E7> /x8f/x79 <CJK> ++<U00026E99> /x8f/x79 <CJK> + <U4527> /x8f/x7a <CJK> + <U8573> /x8f/x7b <CJK> + <U4516> /x8f/x7c <CJK> +@@ -994,11 +1302,11 @@ CHARMAP + <U00028625> /x8f/xa1 <CJK> + <U0002863B> /x8f/xa2 <CJK> + <U85C1> /x8f/xa3 <CJK> +-<UE3F0> /x8f/xa4 <CJK> ++<U00027088> /x8f/xa4 <CJK> + <U8602> /x8f/xa5 <CJK> +-<UE3F2> /x8f/xa6 <CJK> ++<U00021582> /x8f/xa6 <CJK> + <U000270CD> /x8f/xa7 <CJK> +-<UE3F4> /x8f/xa8 <CJK> ++<U0002F9B2> /x8f/xa8 <CJK> + <U456A> /x8f/xa9 <CJK> + <U8628> /x8f/xaa <CJK> + <U3648> /x8f/xab <CJK> +@@ -1046,7 +1354,7 @@ CHARMAP + <U00027A59> /x8f/xd7 <CJK> + <U7AE9> /x8f/xd8 <CJK> + <U00027B3A> /x8f/xd9 <CJK> +-<UE426> /x8f/xda <CJK> ++<U00023F8F> /x8f/xda <CJK> + <U4713> /x8f/xdb <CJK> + <U00027B38> /x8f/xdc <CJK> + <U717C> /x8f/xdd <CJK> +@@ -1062,7 +1370,7 @@ CHARMAP + <U8B90> /x8f/xe7 <CJK> + <U8B9B> /x8f/xe8 <CJK> + <U8AAF> /x8f/xe9 <CJK> +-<UE436> /x8f/xea <CJK> ++<U000216DF> /x8f/xea <CJK> + <U4615> /x8f/xeb <CJK> + <U884F> /x8f/xec <CJK> + <U8C9B> /x8f/xed <CJK> +@@ -1080,14 +1388,14 @@ CHARMAP + <U8CDB> /x8f/xf9 <CJK> + <U705C> /x8f/xfa <CJK> + <U8D11> /x8f/xfb <CJK> +-<UE448> /x8f/xfc <CJK> ++<U00024CC9> /x8f/xfc <CJK> + <U3ED0> /x8f/xfd <CJK> + <U8DA9> /x90/x40 <CJK> + <U00028002> /x90/x41 <CJK> +-<UE44D> /x90/x42 <CJK> ++<U00021014> /x90/x42 <CJK> + <U0002498A> /x90/x43 <CJK> + <U3B7C> /x90/x44 <CJK> +-<UE450> /x90/x45 <CJK> ++<U000281BC> /x90/x45 <CJK> + <U0002710C> /x90/x46 <CJK> + <U7AE7> /x90/x47 <CJK> + <U8EAD> /x90/x48 <CJK> +@@ -1110,9 +1418,9 @@ CHARMAP + <U5EF8> /x90/x59 <CJK> + <U00023262> /x90/x5a <CJK> + <U8FF9> /x90/x5b <CJK> +-<UE467> /x90/x5c <CJK> +-<UE468> /x90/x5d <CJK> +-<UE469> /x90/x5e <CJK> ++<U0002A014> /x90/x5c <CJK> ++<U000286BC> /x90/x5d <CJK> ++<U00028501> /x90/x5e <CJK> + <U00022325> /x90/x5f <CJK> + <U3980> /x90/x60 <CJK> + <U00026ED7> /x90/x61 <CJK> +@@ -1123,7 +1431,7 @@ CHARMAP + <U0002856C> /x90/x66 <CJK> + <U0002860B> /x90/x67 <CJK> + <U90A8> /x90/x68 <CJK> +-<UE474> /x90/x69 <CJK> ++<U00028713> /x90/x69 <CJK> + <U90C4> /x90/x6a <CJK> + <U000286E6> /x90/x6b <CJK> + <U90AE> /x90/x6c <CJK> +@@ -1143,7 +1451,7 @@ CHARMAP + <U00023C9B> /x90/x7c <CJK> + <U00028B0C> /x90/x7d <CJK> + <U000255DB> /x90/x7e <CJK> +-<UE48A> /x90/xa1 <CJK> ++<U00020D31> /x90/xa1 <CJK> + <U932C> /x90/xa2 <CJK> + <U936B> /x90/xa3 <CJK> + <U00028AE1> /x90/xa4 <CJK> +@@ -1166,7 +1474,7 @@ CHARMAP + <U95A0> /x90/xb5 <CJK> + <U6FF6> /x90/xb6 <CJK> + <U42B9> /x90/xb7 <CJK> +-<UE4A1> /x90/xb8 <CJK> ++<U0002267A> /x90/xb8 <CJK> + <U000286D8> /x90/xb9 <CJK> + <U0002127C> /x90/xba <CJK> + <U00023E2E> /x90/xbb <CJK> +@@ -1198,11 +1506,11 @@ CHARMAP + <U4A0F> /x90/xd5 <CJK> + <U453D> /x90/xd6 <CJK> + <U4585> /x90/xd7 <CJK> +-<UE4C1> /x90/xd8 <CJK> ++<U00024AE9> /x90/xd8 <CJK> + <U7075> /x90/xd9 <CJK> + <U5B41> /x90/xda <CJK> + <U971B> /x90/xdb <CJK> +-<UE4C6> /x90/xdd <CJK> ++<U000291D5> /x90/xdd <CJK> + <U9757> /x90/xde <CJK> + <U5B4A> /x90/xdf <CJK> + <U000291EB> /x90/xe0 <CJK> +@@ -1224,7 +1532,7 @@ CHARMAP + <U00029433> /x90/xf0 <CJK> + <U97F5> /x90/xf2 <CJK> + <U0002941D> /x90/xf3 <CJK> +-<UE4DD> /x90/xf4 <CJK> ++<U0002797A> /x90/xf4 <CJK> + <U4AD1> /x90/xf5 <CJK> + <U9834> /x90/xf6 <CJK> + <U9833> /x90/xf7 <CJK> +@@ -1289,24 +1597,24 @@ CHARMAP + <U9DD4> /x91/x73 <CJK> + <U00029FB7> /x91/x74 <CJK> + <U0002A192> /x91/x75 <CJK> +-<UE51E> /x91/x76 <CJK> ++<U0002A1AB> /x91/x76 <CJK> + <U0002A0E1> /x91/x77 <CJK> + <U0002A123> /x91/x78 <CJK> + <U0002A1DF> /x91/x79 <CJK> + <U9D7E> /x91/x7a <CJK> + <U9D83> /x91/x7b <CJK> +-<UE524> /x91/x7c <CJK> ++<U0002A134> /x91/x7c <CJK> + <U9E0E> /x91/x7d <CJK> + <U6888> /x91/x7e <CJK> + <U9DC4> /x91/xa1 <CJK> +-<UE528> /x91/xa2 <CJK> ++<U0002215B> /x91/xa2 <CJK> + <U0002A193> /x91/xa3 <CJK> + <U0002A220> /x91/xa4 <CJK> + <U0002193B> /x91/xa5 <CJK> + <U0002A233> /x91/xa6 <CJK> + <U9D39> /x91/xa7 <CJK> +-<UE52E> /x91/xa8 <CJK> +-<UE52F> /x91/xa9 <CJK> ++<U0002A0B9> /x91/xa8 <CJK> ++<U0002A2B4> /x91/xa9 <CJK> + <U9E90> /x91/xaa <CJK> + <U9E95> /x91/xab <CJK> + <U9E9E> /x91/xac <CJK> +@@ -1367,10 +1675,10 @@ CHARMAP + <U7772> /x91/xe4 <CJK> + <U7A43> /x91/xe5 <CJK> + <U70D0> /x91/xe6 <CJK> +-<UE56D> /x91/xe7 <CJK> ++<U00024473> /x91/xe7 <CJK> + <U000243F8> /x91/xe8 <CJK> + <U717E> /x91/xe9 <CJK> +-<UE570> /x91/xea <CJK> ++<U000217EF> /x91/xea <CJK> + <U70A3> /x91/xeb <CJK> + <U000218BE> /x91/xec <CJK> + <U00023599> /x91/xed <CJK> +@@ -1380,23 +1688,23 @@ CHARMAP + <U000217F8> /x91/xf1 <CJK> + <U3722> /x91/xf2 <CJK> + <U000216FB> /x91/xf3 <CJK> +-<UE57A> /x91/xf4 <CJK> ++<U00021839> /x91/xf4 <CJK> + <U36E1> /x91/xf5 <CJK> + <U00021774> /x91/xf6 <CJK> +-<UE57D> /x91/xf7 <CJK> ++<U000218D1> /x91/xf7 <CJK> + <U00025F4B> /x91/xf8 <CJK> + <U3723> /x91/xf9 <CJK> + <U000216C0> /x91/xfa <CJK> + <U575B> /x91/xfb <CJK> + <U00024A25> /x91/xfc <CJK> + <U000213FE> /x91/xfd <CJK> +-<UE584> /x91/xfe <CJK> ++<U000212A8> /x91/xfe <CJK> + <U000213C6> /x92/x40 <CJK> + <U000214B6> /x92/x41 <CJK> + <U8503> /x92/x42 <CJK> + <U000236A6> /x92/x43 <CJK> + <U8455> /x92/x45 <CJK> +-<UE58B> /x92/x46 <CJK> ++<U00024994> /x92/x46 <CJK> + <U00027165> /x92/x47 <CJK> + <U00023E31> /x92/x48 <CJK> + <U0002555C> /x92/x49 <CJK> +@@ -1411,23 +1719,23 @@ CHARMAP + <U3C15> /x92/x52 <CJK> + <U3DE7> /x92/x53 <CJK> + <U586C> /x92/x54 <CJK> +-<UE59A> /x92/x55 <CJK> ++<U00021922> /x92/x55 <CJK> + <U6810> /x92/x56 <CJK> + <U4057> /x92/x57 <CJK> + <U0002373F> /x92/x58 <CJK> +-<UE59E> /x92/x59 <CJK> ++<U000240E1> /x92/x59 <CJK> + <U0002408B> /x92/x5a <CJK> +-<UE5A0> /x92/x5b <CJK> ++<U0002410F> /x92/x5b <CJK> + <U00026C21> /x92/x5c <CJK> + <U54CB> /x92/x5d <CJK> + <U569E> /x92/x5e <CJK> + <U000266B1> /x92/x5f <CJK> + <U5692> /x92/x60 <CJK> +-<UE5A6> /x92/x61 <CJK> ++<U00020FDF> /x92/x61 <CJK> + <U00020BA8> /x92/x62 <CJK> + <U00020E0D> /x92/x63 <CJK> + <U93C6> /x92/x64 <CJK> +-<UE5AA> /x92/x65 <CJK> ++<U00028B13> /x92/x65 <CJK> + <U939C> /x92/x66 <CJK> + <U4EF8> /x92/x67 <CJK> + <U512B> /x92/x68 <CJK> +@@ -1451,13 +1759,13 @@ CHARMAP + <U00028EB3> /x92/x7a <CJK> + <U00020275> /x92/x7b <CJK> + <U8ADA> /x92/x7c <CJK> +-<UE5C2> /x92/x7d <CJK> ++<U0002020C> /x92/x7d <CJK> + <U4E98> /x92/x7e <CJK> + <U50CD> /x92/xa1 <CJK> + <U510D> /x92/xa2 <CJK> + <U4FA2> /x92/xa3 <CJK> + <U4F03> /x92/xa4 <CJK> +-<UE5C8> /x92/xa5 <CJK> ++<U00024A0E> /x92/xa5 <CJK> + <U00023E8A> /x92/xa6 <CJK> + <U4F42> /x92/xa7 <CJK> + <U502E> /x92/xa8 <CJK> +@@ -1469,7 +1777,7 @@ CHARMAP + <U50FC> /x92/xae <CJK> + <U6E76> /x92/xb3 <CJK> + <U00023595> /x92/xb4 <CJK> +-<UE5D8> /x92/xb5 <CJK> ++<U00023E39> /x92/xb5 <CJK> + <U00023EBF> /x92/xb6 <CJK> + <U6D72> /x92/xb7 <CJK> + <U00021884> /x92/xb8 <CJK> +@@ -1493,7 +1801,7 @@ CHARMAP + <U0002438C> /x92/xcb <CJK> + <U00020C20> /x92/xcc <CJK> + <U000249AC> /x92/xcd <CJK> +-<UE5F1> /x92/xce <CJK> ++<U000210E4> /x92/xce <CJK> + <U69D1> /x92/xcf <CJK> + <U00020E1D> /x92/xd0 <CJK> + <U3EDE> /x92/xd2 <CJK> +@@ -1532,10 +1840,10 @@ CHARMAP + <U5A7E> /x92/xf3 <CJK> + <U5ACF> /x92/xf4 <CJK> + <U5A12> /x92/xf5 <CJK> +-<UE619> /x92/xf6 <CJK> ++<U00025946> /x92/xf6 <CJK> + <U000219F3> /x92/xf7 <CJK> + <U00021861> /x92/xf8 <CJK> +-<UE61C> /x92/xf9 <CJK> ++<U00024295> /x92/xf9 <CJK> + <U36F5> /x92/xfa <CJK> + <U6D05> /x92/xfb <CJK> + <U7443> /x92/xfc <CJK> +@@ -1577,7 +1885,7 @@ CHARMAP + <U5F0C> /x93/x61 <CJK> + <U5F0E> /x93/x62 <CJK> + <U00021927> /x93/x63 <CJK> +-<UE646> /x93/x64 <CJK> ++<U000217AB> /x93/x64 <CJK> + <U5A6B> /x93/x65 <CJK> + <U0002173B> /x93/x66 <CJK> + <U5B44> /x93/x67 <CJK> +@@ -1591,7 +1899,7 @@ CHARMAP + <U3EB8> /x93/x6f <CJK> + <U000225AF> /x93/x70 <CJK> + <U000225BE> /x93/x71 <CJK> +-<UE654> /x93/x72 <CJK> ++<U00029088> /x93/x72 <CJK> + <U00026F73> /x93/x73 <CJK> + <U61C0> /x93/x74 <CJK> + <U0002003E> /x93/x75 <CJK> +@@ -1603,7 +1911,7 @@ CHARMAP + <U00022C9B> /x93/x7b <CJK> + <U00022D07> /x93/x7c <CJK> + <U000246D4> /x93/x7d <CJK> +-<UE660> /x93/x7e <CJK> ++<U0002914D> /x93/x7e <CJK> + <U6471> /x93/xa1 <CJK> + <U00024665> /x93/xa2 <CJK> + <U00022B6A> /x93/xa3 <CJK> +@@ -1613,7 +1921,7 @@ CHARMAP + <U000298EA> /x93/xa7 <CJK> + <U00022E78> /x93/xa8 <CJK> + <U6337> /x93/xa9 <CJK> +-<UE66A> /x93/xaa <CJK> ++<U0002A45B> /x93/xaa <CJK> + <U64B6> /x93/xab <CJK> + <U6331> /x93/xac <CJK> + <U63D1> /x93/xad <CJK> +@@ -1632,10 +1940,10 @@ CHARMAP + <U550D> /x93/xba <CJK> + <U000232E0> /x93/xbb <CJK> + <U000218D9> /x93/xbc <CJK> +-<UE67D> /x93/xbd <CJK> ++<U0002943F> /x93/xbd <CJK> + <U66CE> /x93/xbe <CJK> + <U00023289> /x93/xbf <CJK> +-<UE680> /x93/xc0 <CJK> ++<U000231B3> /x93/xc0 <CJK> + <U3AE0> /x93/xc1 <CJK> + <U4190> /x93/xc2 <CJK> + <U00025584> /x93/xc3 <CJK> +@@ -1649,7 +1957,7 @@ CHARMAP + <U0002182A> /x93/xcb <CJK> + <U00023234> /x93/xcc <CJK> + <U3464> /x93/xcd <CJK> +-<UE68E> /x93/xce <CJK> ++<U0002320F> /x93/xce <CJK> + <U00023182> /x93/xcf <CJK> + <U000242C9> /x93/xd0 <CJK> + <U668E> /x93/xd1 <CJK> +@@ -1658,14 +1966,14 @@ CHARMAP + <U4B93> /x93/xd4 <CJK> + <U6630> /x93/xd5 <CJK> + <U00027870> /x93/xd6 <CJK> +-<UE697> /x93/xd7 <CJK> ++<U00021DEB> /x93/xd7 <CJK> + <U6663> /x93/xd8 <CJK> + <U000232D2> /x93/xd9 <CJK> + <U000232E1> /x93/xda <CJK> + <U661E> /x93/xdb <CJK> + <U00025872> /x93/xdc <CJK> + <U38D1> /x93/xdd <CJK> +-<UE69E> /x93/xde <CJK> ++<U0002383A> /x93/xde <CJK> + <U000237BC> /x93/xdf <CJK> + <U3B99> /x93/xe0 <CJK> + <U000237A2> /x93/xe1 <CJK> +@@ -1699,12 +2007,12 @@ CHARMAP + <U00028BEA> /x93/xfd <CJK> + <U00028ACB> /x93/xfe <CJK> + <U9289> /x94/x40 <CJK> +-<UE6C0> /x94/x41 <CJK> ++<U0002801E> /x94/x41 <CJK> + <U000289DC> /x94/x42 <CJK> + <U9467> /x94/x43 <CJK> + <U6DA5> /x94/x44 <CJK> + <U6F0B> /x94/x45 <CJK> +-<UE6C5> /x94/x46 <CJK> ++<U000249EC> /x94/x46 <CJK> + <U00023F7F> /x94/x48 <CJK> + <U3D8F> /x94/x49 <CJK> + <U6E04> /x94/x4a <CJK> +@@ -1728,8 +2036,8 @@ CHARMAP + <U000205EB> /x94/x5c <CJK> + <U747A> /x94/x5d <CJK> + <U00023EF8> /x94/x5e <CJK> +-<UE6DE> /x94/x5f <CJK> +-<UE6DF> /x94/x60 <CJK> ++<U0002365F> /x94/x5f <CJK> ++<U00024A4A> /x94/x60 <CJK> + <U00024917> /x94/x61 <CJK> + <U00025FE1> /x94/x62 <CJK> + <U3F06> /x94/x63 <CJK> +@@ -1763,7 +2071,7 @@ CHARMAP + <U3DCD> /x94/xa1 <CJK> + <U00024A4E> /x94/xa2 <CJK> + <U3EFF> /x94/xa3 <CJK> +-<UE701> /x94/xa4 <CJK> ++<U000249C5> /x94/xa4 <CJK> + <U000248F3> /x94/xa5 <CJK> + <U91FA> /x94/xa6 <CJK> + <U5732> /x94/xa7 <CJK> +@@ -1781,7 +2089,7 @@ CHARMAP + <U00024697> /x94/xb3 <CJK> + <U00023781> /x94/xb4 <CJK> + <U3A5E> /x94/xb5 <CJK> +-<UE713> /x94/xb6 <CJK> ++<U000248F0> /x94/xb6 <CJK> + <U7438> /x94/xb7 <CJK> + <U749B> /x94/xb8 <CJK> + <U3EBF> /x94/xb9 <CJK> +@@ -1799,7 +2107,7 @@ CHARMAP + <U73D0> /x94/xc5 <CJK> + <U7959> /x94/xc6 <CJK> + <U00027741> /x94/xc7 <CJK> +-<UE725> /x94/xc8 <CJK> ++<U000256E3> /x94/xc8 <CJK> + <U410E> /x94/xc9 <CJK> + <U8496> /x94/xcb <CJK> + <U79A5> /x94/xcc <CJK> +@@ -1822,11 +2130,11 @@ CHARMAP + <U3570> /x94/xdd <CJK> + <U36AA> /x94/xde <CJK> + <U000201D4> /x94/xdf <CJK> +-<UE73D> /x94/xe0 <CJK> ++<U00020C0D> /x94/xe0 <CJK> + <U7AE2> /x94/xe1 <CJK> + <U5A59> /x94/xe2 <CJK> + <U000226F5> /x94/xe3 <CJK> +-<UE741> /x94/xe4 <CJK> ++<U00025AAF> /x94/xe4 <CJK> + <U00025A9C> /x94/xe5 <CJK> + <U5A0D> /x94/xe6 <CJK> + <U0002025B> /x94/xe7 <CJK> +@@ -1843,7 +2151,7 @@ CHARMAP + <U00025EA6> /x94/xf2 <CJK> + <U7CCD> /x94/xf3 <CJK> + <U000249F9> /x94/xf4 <CJK> +-<UE752> /x94/xf5 <CJK> ++<U000217B0> /x94/xf5 <CJK> + <U7C8E> /x94/xf6 <CJK> + <U7C7C> /x94/xf7 <CJK> + <U7CAE> /x94/xf8 <CJK> +@@ -1854,18 +2162,18 @@ CHARMAP + <U7F4E> /x94/xfd <CJK> + <U00026261> /x94/xfe <CJK> + <U0002615C> /x95/x40 <CJK> +-<UE75D> /x95/x41 <CJK> ++<U00027B48> /x95/x41 <CJK> + <U7D97> /x95/x42 <CJK> + <U00025E82> /x95/x43 <CJK> + <U426A> /x95/x44 <CJK> +-<UE761> /x95/x45 <CJK> ++<U00026B75> /x95/x45 <CJK> + <U00020916> /x95/x46 <CJK> + <U67D6> /x95/x47 <CJK> + <U0002004E> /x95/x48 <CJK> + <U000235CF> /x95/x49 <CJK> + <U57C4> /x95/x4a <CJK> + <U00026412> /x95/x4b <CJK> +-<UE768> /x95/x4c <CJK> ++<U000263F8> /x95/x4c <CJK> + <U00024962> /x95/x4d <CJK> + <U7FDD> /x95/x4e <CJK> + <U7B27> /x95/x4f <CJK> +@@ -1878,15 +2186,15 @@ CHARMAP + <U8645> /x95/x56 <CJK> + <U9A63> /x95/x57 <CJK> + <U6A1C> /x95/x58 <CJK> +-<UE775> /x95/x59 <CJK> ++<U0002343F> /x95/x59 <CJK> + <U39E2> /x95/x5a <CJK> + <U000249F7> /x95/x5b <CJK> + <U000265AD> /x95/x5c <CJK> + <U9A1F> /x95/x5d <CJK> +-<UE77A> /x95/x5e <CJK> ++<U000265A0> /x95/x5e <CJK> + <U8480> /x95/x5f <CJK> + <U00027127> /x95/x60 <CJK> +-<UE77D> /x95/x61 <CJK> ++<U00026CD1> /x95/x61 <CJK> + <U44EA> /x95/x62 <CJK> + <U8137> /x95/x63 <CJK> + <U4402> /x95/x64 <CJK> +@@ -1905,14 +2213,14 @@ CHARMAP + <U0002721B> /x95/x71 <CJK> + <U5A86> /x95/x72 <CJK> + <U417F> /x95/x73 <CJK> +-<UE790> /x95/x74 <CJK> ++<U00021840> /x95/x74 <CJK> + <U5B2B> /x95/x75 <CJK> + <U000218A1> /x95/x76 <CJK> + <U5AE4> /x95/x77 <CJK> + <U000218D8> /x95/x78 <CJK> + <U86A0> /x95/x79 <CJK> +-%IRREVERSIBLE%<U8728> /x95/x7a <CJK> +-<UE797> /x95/x7b <CJK> ++<U0002F9BC> /x95/x7a <CJK> ++<U00023D8F> /x95/x7b <CJK> + <U882D> /x95/x7c <CJK> + <U00027422> /x95/x7d <CJK> + <U5A02> /x95/x7e <CJK> +@@ -1927,7 +2235,7 @@ CHARMAP + <U8954> /x95/xa9 <CJK> + <U00027785> /x95/xaa <CJK> + <U00027784> /x95/xab <CJK> +-<UE7A6> /x95/xac <CJK> ++<U00028BF5> /x95/xac <CJK> + <U00028BD9> /x95/xad <CJK> + <U00028B9C> /x95/xae <CJK> + <U000289F9> /x95/xaf <CJK> +@@ -1941,7 +2249,7 @@ CHARMAP + <U00029448> /x95/xb7 <CJK> + <U5F4D> /x95/xb8 <CJK> + <U922B> /x95/xb9 <CJK> +-<UE7B4> /x95/xba <CJK> ++<U00024284> /x95/xba <CJK> + <U65D4> /x95/xbb <CJK> + <U7129> /x95/xbc <CJK> + <U70C4> /x95/xbd <CJK> +@@ -1978,10 +2286,10 @@ CHARMAP + <U9404> /x95/xdd <CJK> + <U00028A4B> /x95/xde <CJK> + <U4062> /x95/xdf <CJK> +-<UE7DA> /x95/xe0 <CJK> ++<U00028AFC> /x95/xe0 <CJK> + <U9427> /x95/xe1 <CJK> + <U00028C1D> /x95/xe2 <CJK> +-<UE7DD> /x95/xe3 <CJK> ++<U00028C3B> /x95/xe3 <CJK> + <U84E5> /x95/xe4 <CJK> + <U8A2B> /x95/xe5 <CJK> + <U9599> /x95/xe6 <CJK> +@@ -1992,16 +2300,16 @@ CHARMAP + <U7445> /x95/xeb <CJK> + <U3EC2> /x95/xec <CJK> + <U000248FF> /x95/xed <CJK> +-<UE7E8> /x95/xee <CJK> +-<UE7E9> /x95/xef <CJK> ++<U00024A42> /x95/xee <CJK> ++<U000243EA> /x95/xef <CJK> + <U3EE7> /x95/xf0 <CJK> + <U00023225> /x95/xf1 <CJK> + <U968F> /x95/xf2 <CJK> +-<UE7ED> /x95/xf3 <CJK> ++<U00028EE7> /x95/xf3 <CJK> + <U00028E66> /x95/xf4 <CJK> + <U00028E65> /x95/xf5 <CJK> + <U3ECC> /x95/xf6 <CJK> +-<UE7F1> /x95/xf7 <CJK> ++<U000249ED> /x95/xf7 <CJK> + <U00024A78> /x95/xf8 <CJK> + <U00023FEE> /x95/xf9 <CJK> + <U7412> /x95/xfa <CJK> +@@ -2011,11 +2319,11 @@ CHARMAP + <U000290B0> /x95/xfe <CJK> + <U6847> /x96/x40 <CJK> + <U4A1D> /x96/x41 <CJK> +-<UE7FB> /x96/x42 <CJK> +-<UE7FC> /x96/x43 <CJK> ++<U00029093> /x96/x42 <CJK> ++<U000257DF> /x96/x43 <CJK> + <U9368> /x96/x45 <CJK> + <U00028989> /x96/x46 <CJK> +-<UE800> /x96/x47 <CJK> ++<U00028C26> /x96/x47 <CJK> + <U00028B2F> /x96/x48 <CJK> + <U000263BE> /x96/x49 <CJK> + <U92BA> /x96/x4a <CJK> +@@ -2027,14 +2335,14 @@ CHARMAP + <U979B> /x96/x50 <CJK> + <U9771> /x96/x51 <CJK> + <U9938> /x96/x52 <CJK> +-<UE80C> /x96/x53 <CJK> ++<U00020F26> /x96/x53 <CJK> + <U5DC1> /x96/x54 <CJK> + <U00028BC5> /x96/x55 <CJK> + <U00024AB2> /x96/x56 <CJK> + <U981F> /x96/x57 <CJK> + <U000294DA> /x96/x58 <CJK> + <U92F6> /x96/x59 <CJK> +-<UE813> /x96/x5a <CJK> ++<U000295D7> /x96/x5a <CJK> + <U91E5> /x96/x5b <CJK> + <U44C0> /x96/x5c <CJK> + <U00028B50> /x96/x5d <CJK> +@@ -2048,21 +2356,21 @@ CHARMAP + <U8414> /x96/x65 <CJK> + <U993B> /x96/x66 <CJK> + <U994D> /x96/x67 <CJK> +-<UE821> /x96/x68 <CJK> ++<U00027B06> /x96/x68 <CJK> + <U3DFD> /x96/x69 <CJK> + <U999B> /x96/x6a <CJK> + <U4B6F> /x96/x6b <CJK> + <U99AA> /x96/x6c <CJK> + <U9A5C> /x96/x6d <CJK> + <U00028B65> /x96/x6e <CJK> +-<UE828> /x96/x6f <CJK> ++<U000258C8> /x96/x6f <CJK> + <U6A8F> /x96/x70 <CJK> + <U9A21> /x96/x71 <CJK> + <U5AFE> /x96/x72 <CJK> + <U9A2F> /x96/x73 <CJK> +-<UE82D> /x96/x74 <CJK> ++<U000298F1> /x96/x74 <CJK> + <U4B90> /x96/x75 <CJK> +-<UE82F> /x96/x76 <CJK> ++<U00029948> /x96/x76 <CJK> + <U99BC> /x96/x77 <CJK> + <U4BBD> /x96/x78 <CJK> + <U4B97> /x96/x79 <CJK> +@@ -2092,7 +2400,7 @@ CHARMAP + <U9BCF> /x96/xb3 <CJK> + <U00029E2D> /x96/xb4 <CJK> + <U9B9F> /x96/xb5 <CJK> +-<UE84D> /x96/xb6 <CJK> ++<U0002A1F5> /x96/xb6 <CJK> + <U0002A0FE> /x96/xb7 <CJK> + <U9D21> /x96/xb8 <CJK> + <U4CAE> /x96/xb9 <CJK> +@@ -2100,15 +2408,15 @@ CHARMAP + <U9E18> /x96/xbb <CJK> + <U4CB0> /x96/xbc <CJK> + <U9D0C> /x96/xbd <CJK> +-<UE855> /x96/xbe <CJK> +-<UE856> /x96/xbf <CJK> ++<U0002A1B4> /x96/xbe <CJK> ++<U0002A0ED> /x96/xbf <CJK> + <U0002A0F3> /x96/xc0 <CJK> + <U0002992F> /x96/xc1 <CJK> + <U9DA5> /x96/xc2 <CJK> + <U84BD> /x96/xc3 <CJK> +-<UE85B> /x96/xc4 <CJK> ++<U00026E12> /x96/xc4 <CJK> + <U00026FDF> /x96/xc5 <CJK> +-<UE85D> /x96/xc6 <CJK> ++<U00026B82> /x96/xc6 <CJK> + <U85FC> /x96/xc7 <CJK> + <U4533> /x96/xc8 <CJK> + <U00026DA4> /x96/xc9 <CJK> +@@ -2116,7 +2424,7 @@ CHARMAP + <U00026DF0> /x96/xcb <CJK> + <U8420> /x96/xcc <CJK> + <U85EE> /x96/xcd <CJK> +-<UE865> /x96/xce <CJK> ++<U00026E00> /x96/xce <CJK> + <U000237D7> /x96/xcf <CJK> + <U00026064> /x96/xd0 <CJK> + <U79E2> /x96/xd1 <CJK> +@@ -2149,7 +2457,7 @@ CHARMAP + <U6FD9> /x96/xec <CJK> + <U701E> /x96/xee <CJK> + <U5414> /x96/xef <CJK> +-<UE887> /x96/xf0 <CJK> ++<U000241B5> /x96/xf0 <CJK> + <U57BB> /x96/xf1 <CJK> + <U58F3> /x96/xf2 <CJK> + <U578A> /x96/xf3 <CJK> +@@ -2157,9 +2465,9 @@ CHARMAP + <U57D7> /x96/xf5 <CJK> + <U7134> /x96/xf6 <CJK> + <U34AF> /x96/xf7 <CJK> +-<UE88F> /x96/xf8 <CJK> ++<U000241AC> /x96/xf8 <CJK> + <U71EB> /x96/xf9 <CJK> +-<UE891> /x96/xfa <CJK> ++<U00026C40> /x96/xfa <CJK> + <U00024F97> /x96/xfb <CJK> + <U000217B5> /x96/xfd <CJK> + <U00028A49> /x96/xfe <CJK> +@@ -2174,10 +2482,10 @@ CHARMAP + <U93BB> /x97/x48 <CJK> + <U93B8> /x97/x49 <CJK> + <U000218D6> /x97/x4a <CJK> +-<UE8A1> /x97/x4b <CJK> ++<U00020F1D> /x97/x4b <CJK> + <U8472> /x97/x4c <CJK> + <U00026CC0> /x97/x4d <CJK> +-<UE8A4> /x97/x4e <CJK> ++<U00021413> /x97/x4e <CJK> + <U000242FA> /x97/x4f <CJK> + <U00022C26> /x97/x50 <CJK> + <U000243C1> /x97/x51 <CJK> +@@ -2207,8 +2515,8 @@ CHARMAP + <U000217D9> /x97/x69 <CJK> + <U00024A66> /x97/x6a <CJK> + <U000203A7> /x97/x6b <CJK> +-<UE8C2> /x97/x6c <CJK> +-<UE8C3> /x97/x6d <CJK> ++<U00021424> /x97/x6c <CJK> ++<U000249E5> /x97/x6d <CJK> + <U7448> /x97/x6e <CJK> + <U00024916> /x97/x6f <CJK> + <U70A5> /x97/x70 <CJK> +@@ -2218,7 +2526,7 @@ CHARMAP + <U935F> /x97/x74 <CJK> + <U000204FE> /x97/x75 <CJK> + <U9331> /x97/x76 <CJK> +-<UE8CD> /x97/x77 <CJK> ++<U00028ACE> /x97/x77 <CJK> + <U00028A16> /x97/x78 <CJK> + <U9386> /x97/x79 <CJK> + <U00028BE7> /x97/x7a <CJK> +@@ -2226,23 +2534,23 @@ CHARMAP + <U4935> /x97/x7c <CJK> + <U00028A82> /x97/x7d <CJK> + <U716B> /x97/x7e <CJK> +-<UE8D5> /x97/xa1 <CJK> +-<UE8D6> /x97/xa2 <CJK> ++<U00024943> /x97/xa1 <CJK> ++<U00020CFF> /x97/xa2 <CJK> + <U56A4> /x97/xa3 <CJK> + <U0002061A> /x97/xa4 <CJK> +-<UE8D9> /x97/xa5 <CJK> +-<UE8DA> /x97/xa6 <CJK> ++<U00020BEB> /x97/xa5 <CJK> ++<U00020CB8> /x97/xa6 <CJK> + <U5502> /x97/xa7 <CJK> + <U79C4> /x97/xa8 <CJK> + <U000217FA> /x97/xa9 <CJK> + <U7DFE> /x97/xaa <CJK> + <U000216C2> /x97/xab <CJK> + <U00024A50> /x97/xac <CJK> +-<UE8E1> /x97/xad <CJK> ++<U00021852> /x97/xad <CJK> + <U452E> /x97/xae <CJK> + <U9401> /x97/xaf <CJK> + <U370A> /x97/xb0 <CJK> +-<UE8E5> /x97/xb1 <CJK> ++<U00028AC0> /x97/xb1 <CJK> + <U000249AD> /x97/xb2 <CJK> + <U59B0> /x97/xb3 <CJK> + <U000218BF> /x97/xb4 <CJK> +@@ -2267,7 +2575,7 @@ CHARMAP + <U0002139C> /x97/xc7 <CJK> + <U7175> /x97/xc8 <CJK> + <U42FB> /x97/xc9 <CJK> +-<UE8FE> /x97/xca <CJK> ++<U00028218> /x97/xca <CJK> + <U6E0F> /x97/xcb <CJK> + <U000290E4> /x97/xcc <CJK> + <U44EB> /x97/xcd <CJK> +@@ -2292,27 +2600,27 @@ CHARMAP + <U926E> /x97/xe0 <CJK> + <U493E> /x97/xe1 <CJK> + <U8F41> /x97/xe2 <CJK> +-<UE917> /x97/xe3 <CJK> +-<UE918> /x97/xe4 <CJK> ++<U00028C1C> /x97/xe3 <CJK> ++<U00026BC0> /x97/xe4 <CJK> + <U5812> /x97/xe5 <CJK> + <U57C8> /x97/xe6 <CJK> + <U36D6> /x97/xe7 <CJK> + <U00021452> /x97/xe8 <CJK> + <U70FE> /x97/xe9 <CJK> + <U00024362> /x97/xea <CJK> +-<UE91F> /x97/xeb <CJK> ++<U00024A71> /x97/xeb <CJK> + <U00022FE3> /x97/xec <CJK> + <U000212B0> /x97/xed <CJK> + <U000223BD> /x97/xee <CJK> + <U68B9> /x97/xef <CJK> + <U6967> /x97/xf0 <CJK> +-<UE925> /x97/xf1 <CJK> ++<U00021398> /x97/xf1 <CJK> + <U000234E5> /x97/xf2 <CJK> + <U00027BF4> /x97/xf3 <CJK> + <U000236DF> /x97/xf4 <CJK> + <U00028A83> /x97/xf5 <CJK> + <U000237D6> /x97/xf6 <CJK> +-<UE92B> /x97/xf7 <CJK> ++<U000233FA> /x97/xf7 <CJK> + <U00024C9F> /x97/xf8 <CJK> + <U6A1A> /x97/xf9 <CJK> + <U000236AD> /x97/xfa <CJK> +@@ -2321,7 +2629,7 @@ CHARMAP + <U44DF> /x97/xfd <CJK> + <U44CE> /x97/xfe <CJK> + <U00026D26> /x98/x40 <CJK> +-<UE934> /x98/x41 <CJK> ++<U00026D51> /x98/x41 <CJK> + <U00026C82> /x98/x42 <CJK> + <U00026FDE> /x98/x43 <CJK> + <U6F17> /x98/x44 <CJK> +@@ -2349,7 +2657,7 @@ CHARMAP + <U000242A5> /x98/x5a <CJK> + <U5A6E> /x98/x5b <CJK> + <U5A2B> /x98/x5c <CJK> +-<UE950> /x98/x5d <CJK> ++<U00024293> /x98/x5d <CJK> + <U6A2B> /x98/x5e <CJK> + <U00023EF9> /x98/x5f <CJK> + <U00027736> /x98/x60 <CJK> +@@ -2372,34 +2680,34 @@ CHARMAP + <U000243E9> /x98/x71 <CJK> + <U3DA5> /x98/x72 <CJK> + <U6CDF> /x98/x73 <CJK> +-<UE967> /x98/x74 <CJK> ++<U0002F825> /x98/x74 <CJK> + <U00024A4F> /x98/x75 <CJK> + <U7E65> /x98/x76 <CJK> + <U59EB> /x98/x77 <CJK> + <U5D2F> /x98/x78 <CJK> + <U3DF3> /x98/x79 <CJK> + <U5F5C> /x98/x7a <CJK> +-<UE96E> /x98/x7b <CJK> +-<UE96F> /x98/x7c <CJK> ++<U00024A5D> /x98/x7b <CJK> ++<U000217DF> /x98/x7c <CJK> + <U7DA4> /x98/x7d <CJK> + <U8426> /x98/x7e <CJK> + <U5485> /x98/xa1 <CJK> +-<UE973> /x98/xa2 <CJK> ++<U00023AFA> /x98/xa2 <CJK> + <U00023300> /x98/xa3 <CJK> + <U00020214> /x98/xa4 <CJK> + <U577E> /x98/xa5 <CJK> +-<UE977> /x98/xa6 <CJK> ++<U000208D5> /x98/xa6 <CJK> + <U00020619> /x98/xa7 <CJK> + <U3FE5> /x98/xa8 <CJK> +-<UE97A> /x98/xa9 <CJK> +-<UE97B> /x98/xaa <CJK> ++<U00021F9E> /x98/xa9 <CJK> ++<U0002A2B6> /x98/xaa <CJK> + <U7003> /x98/xab <CJK> +-<UE97D> /x98/xac <CJK> ++<U0002915B> /x98/xac <CJK> + <U5D70> /x98/xad <CJK> + <U738F> /x98/xae <CJK> + <U7CD3> /x98/xaf <CJK> + <U00028A59> /x98/xb0 <CJK> +-<UE982> /x98/xb1 <CJK> ++<U00029420> /x98/xb1 <CJK> + <U4FC8> /x98/xb2 <CJK> + <U7FE7> /x98/xb3 <CJK> + <U72CD> /x98/xb4 <CJK> +@@ -2414,7 +2722,7 @@ CHARMAP + <U00027B18> /x98/xbd <CJK> + <U906C> /x98/xbe <CJK> + <U71F5> /x98/xbf <CJK> +-<UE991> /x98/xc0 <CJK> ++<U000248F2> /x98/xc0 <CJK> + <U73E1> /x98/xc1 <CJK> + <U81F6> /x98/xc2 <CJK> + <U3ECA> /x98/xc3 <CJK> +@@ -2472,7 +2780,7 @@ CHARMAP + <U7851> /x98/xf7 <CJK> + <U7866> /x98/xf8 <CJK> + <U8448> /x98/xf9 <CJK> +-<UE9CB> /x98/xfa <CJK> ++<U00025535> /x98/xfa <CJK> + <U7933> /x98/xfb <CJK> + <U6803> /x98/xfc <CJK> + <U7932> /x98/xfd <CJK> +@@ -2694,7 +3002,7 @@ CHARMAP + <U4C6D> /x9a/x79 <CJK> + <U9C20> /x9a/x7a <CJK> + <U376F> /x9a/x7b <CJK> +-<UEAA9> /x9a/x7c <CJK> ++<U00021BC2> /x9a/x7c <CJK> + <U9D49> /x9a/x7d <CJK> + <U9C3A> /x9a/x7e <CJK> + <U9EFE> /x9a/xa1 <CJK> +@@ -2716,242 +3024,242 @@ CHARMAP + <U9EF8> /x9a/xb1 <CJK> + <U7AC8> /x9a/xb2 <CJK> + <U9F44> /x9a/xb3 <CJK> +-<UEABF> /x9a/xb4 <CJK> +-<UEAC0> /x9a/xb5 <CJK> +-<UEAC1> /x9a/xb6 <CJK> ++<U00020094> /x9a/xb4 <CJK> ++<U000202B7> /x9a/xb5 <CJK> ++<U000203A0> /x9a/xb6 <CJK> + <U691A> /x9a/xb7 <CJK> + <U94C3> /x9a/xb8 <CJK> + <U59AC> /x9a/xb9 <CJK> +-<UEAC5> /x9a/xba <CJK> ++<U000204D7> /x9a/xba <CJK> + <U5840> /x9a/xbb <CJK> + <U94C1> /x9a/xbc <CJK> + <U37B9> /x9a/xbd <CJK> +-<UEAC9> /x9a/xbe <CJK> +-<UEACA> /x9a/xbf <CJK> +-<UEACB> /x9a/xc0 <CJK> +-<UEACC> /x9a/xc1 <CJK> ++<U000205D5> /x9a/xbe <CJK> ++<U00020615> /x9a/xbf <CJK> ++<U00020676> /x9a/xc0 <CJK> ++<U000216BA> /x9a/xc1 <CJK> + <U5757> /x9a/xc2 <CJK> + <U7173> /x9a/xc3 <CJK> +-<UEACF> /x9a/xc4 <CJK> +-<UEAD0> /x9a/xc5 <CJK> +-<UEAD1> /x9a/xc6 <CJK> ++<U00020AC2> /x9a/xc4 <CJK> ++<U00020ACD> /x9a/xc5 <CJK> ++<U00020BBF> /x9a/xc6 <CJK> + <U546A> /x9a/xc7 <CJK> +-<UEAD3> /x9a/xc8 <CJK> +-<UEAD4> /x9a/xc9 <CJK> ++<U0002F83B> /x9a/xc8 <CJK> ++<U00020BCB> /x9a/xc9 <CJK> + <U549E> /x9a/xca <CJK> +-<UEAD6> /x9a/xcb <CJK> +-<UEAD7> /x9a/xcc <CJK> ++<U00020BFB> /x9a/xcb <CJK> ++<U00020C3B> /x9a/xcc <CJK> + <U00020C53> /x9a/xcd <CJK> +-<UEAD9> /x9a/xce <CJK> +-<UEADA> /x9a/xcf <CJK> ++<U00020C65> /x9a/xce <CJK> ++<U00020C7C> /x9a/xcf <CJK> + <U60E7> /x9a/xd0 <CJK> +-<UEADC> /x9a/xd1 <CJK> ++<U00020C8D> /x9a/xd1 <CJK> + <U567A> /x9a/xd2 <CJK> +-<UEADE> /x9a/xd3 <CJK> +-<UEADF> /x9a/xd4 <CJK> +-<UEAE0> /x9a/xd5 <CJK> +-<UEAE1> /x9a/xd6 <CJK> +-<UEAE2> /x9a/xd7 <CJK> +-<UEAE3> /x9a/xd8 <CJK> ++<U00020CB5> /x9a/xd3 <CJK> ++<U00020CDD> /x9a/xd4 <CJK> ++<U00020CED> /x9a/xd5 <CJK> ++<U00020D6F> /x9a/xd6 <CJK> ++<U00020DB2> /x9a/xd7 <CJK> ++<U00020DC8> /x9a/xd8 <CJK> + <U6955> /x9a/xd9 <CJK> + <U9C2F> /x9a/xda <CJK> + <U87A5> /x9a/xdb <CJK> +-<UEAE7> /x9a/xdc <CJK> ++<U00020E04> /x9a/xdc <CJK> + <U00020E0E> /x9a/xdd <CJK> +-<UEAE9> /x9a/xde <CJK> +-<UEAEA> /x9a/xdf <CJK> ++<U00020ED7> /x9a/xde <CJK> ++<U00020F90> /x9a/xdf <CJK> + <U00020F2D> /x9a/xe0 <CJK> +-<UEAEC> /x9a/xe1 <CJK> ++<U00020E73> /x9a/xe1 <CJK> + <U5C20> /x9a/xe2 <CJK> +-<UEAEE> /x9a/xe3 <CJK> ++<U00020FBC> /x9a/xe3 <CJK> + <U5E0B> /x9a/xe4 <CJK> +-<UEAF0> /x9a/xe5 <CJK> +-<UEAF1> /x9a/xe6 <CJK> ++<U0002105C> /x9a/xe5 <CJK> ++<U0002104F> /x9a/xe6 <CJK> + <U00021076> /x9a/xe7 <CJK> + <U671E> /x9a/xe8 <CJK> + <U0002107B> /x9a/xe9 <CJK> +-<UEAF5> /x9a/xea <CJK> +-<UEAF6> /x9a/xeb <CJK> ++<U00021088> /x9a/xea <CJK> ++<U00021096> /x9a/xeb <CJK> + <U3647> /x9a/xec <CJK> +-<UEAF8> /x9a/xed <CJK> +-<UEAF9> /x9a/xee <CJK> +-<UEAFA> /x9a/xef <CJK> +-<UEAFB> /x9a/xf0 <CJK> ++<U000210BF> /x9a/xed <CJK> ++<U000210D3> /x9a/xee <CJK> ++<U0002112F> /x9a/xef <CJK> ++<U0002113B> /x9a/xf0 <CJK> + <U5364> /x9a/xf1 <CJK> + <U84AD> /x9a/xf2 <CJK> + <U000212E3> /x9a/xf3 <CJK> +-<UEAFF> /x9a/xf4 <CJK> +-<UEB00> /x9a/xf5 <CJK> ++<U00021375> /x9a/xf4 <CJK> ++<U00021336> /x9a/xf5 <CJK> + <U8B81> /x9a/xf6 <CJK> +-<UEB02> /x9a/xf7 <CJK> +-<UEB03> /x9a/xf8 <CJK> +-<UEB04> /x9a/xf9 <CJK> +-<UEB05> /x9a/xfa <CJK> ++<U00021577> /x9a/xf7 <CJK> ++<U00021619> /x9a/xf8 <CJK> ++<U000217C3> /x9a/xf9 <CJK> ++<U000217C7> /x9a/xfa <CJK> + <U4E78> /x9a/xfb <CJK> + <U70BB> /x9a/xfc <CJK> +-<UEB08> /x9a/xfd <CJK> +-<UEB09> /x9a/xfe <CJK> +-<UEB0A> /x9b/x40 <CJK> +-<UEB0B> /x9b/x41 <CJK> +-<UEB0C> /x9b/x42 <CJK> +-<UEB0D> /x9b/x43 <CJK> +-<UEB0E> /x9b/x44 <CJK> +-<UEB0F> /x9b/x45 <CJK> ++<U0002182D> /x9a/xfd <CJK> ++<U0002196A> /x9a/xfe <CJK> ++<U00021A2D> /x9b/x40 <CJK> ++<U00021A45> /x9b/x41 <CJK> ++<U00021C2A> /x9b/x42 <CJK> ++<U00021C70> /x9b/x43 <CJK> ++<U00021CAC> /x9b/x44 <CJK> ++<U00021EC8> /x9b/x45 <CJK> + <U62C3> /x9b/x46 <CJK> + <U00021ED5> /x9b/x47 <CJK> +-<UEB12> /x9b/x48 <CJK> ++<U00021F15> /x9b/x48 <CJK> + <U7198> /x9b/x49 <CJK> + <U6855> /x9b/x4a <CJK> +-<UEB15> /x9b/x4b <CJK> ++<U00022045> /x9b/x4b <CJK> + <U69E9> /x9b/x4c <CJK> + <U36C8> /x9b/x4d <CJK> + <U0002227C> /x9b/x4e <CJK> +-<UEB19> /x9b/x4f <CJK> +-<UEB1A> /x9b/x50 <CJK> +-<UEB1B> /x9b/x51 <CJK> +-<UEB1C> /x9b/x52 <CJK> +-<UEB1D> /x9b/x53 <CJK> ++<U000223D7> /x9b/x4f <CJK> ++<U000223FA> /x9b/x50 <CJK> ++<U0002272A> /x9b/x51 <CJK> ++<U00022871> /x9b/x52 <CJK> ++<U0002294F> /x9b/x53 <CJK> + <U82FD> /x9b/x54 <CJK> +-<UEB1F> /x9b/x55 <CJK> +-<UEB20> /x9b/x56 <CJK> ++<U00022967> /x9b/x55 <CJK> ++<U00022993> /x9b/x56 <CJK> + <U00022AD5> /x9b/x57 <CJK> + <U89A5> /x9b/x58 <CJK> +-<UEB23> /x9b/x59 <CJK> ++<U00022AE8> /x9b/x59 <CJK> + <U8FA0> /x9b/x5a <CJK> +-<UEB25> /x9b/x5b <CJK> ++<U00022B0E> /x9b/x5b <CJK> + <U97B8> /x9b/x5c <CJK> +-<UEB27> /x9b/x5d <CJK> ++<U00022B3F> /x9b/x5d <CJK> + <U9847> /x9b/x5e <CJK> + <U9ABD> /x9b/x5f <CJK> +-<UEB2A> /x9b/x60 <CJK> +-<UEB2C> /x9b/x62 <CJK> +-<UEB2D> /x9b/x63 <CJK> +-<UEB2E> /x9b/x64 <CJK> ++<U00022C4C> /x9b/x60 <CJK> ++<U00022C88> /x9b/x62 <CJK> ++<U00022CB7> /x9b/x63 <CJK> ++<U00025BE8> /x9b/x64 <CJK> + <U00022D08> /x9b/x65 <CJK> +-<UEB30> /x9b/x66 <CJK> +-<UEB31> /x9b/x67 <CJK> +-<UEB32> /x9b/x68 <CJK> +-<UEB33> /x9b/x69 <CJK> +-<UEB34> /x9b/x6a <CJK> +-<UEB35> /x9b/x6b <CJK> +-<UEB36> /x9b/x6c <CJK> +-<UEB37> /x9b/x6d <CJK> +-<UEB38> /x9b/x6e <CJK> +-<UEB39> /x9b/x6f <CJK> ++<U00022D12> /x9b/x66 <CJK> ++<U00022DB7> /x9b/x67 <CJK> ++<U00022D95> /x9b/x68 <CJK> ++<U00022E42> /x9b/x69 <CJK> ++<U00022F74> /x9b/x6a <CJK> ++<U00022FCC> /x9b/x6b <CJK> ++<U00023033> /x9b/x6c <CJK> ++<U00023066> /x9b/x6d <CJK> ++<U0002331F> /x9b/x6e <CJK> ++<U000233DE> /x9b/x6f <CJK> + <U5FB1> /x9b/x70 <CJK> + <U6648> /x9b/x71 <CJK> + <U66BF> /x9b/x72 <CJK> +-<UEB3D> /x9b/x73 <CJK> +-<UEB3E> /x9b/x74 <CJK> +-<UEB3F> /x9b/x75 <CJK> ++<U00027A79> /x9b/x73 <CJK> ++<U00023567> /x9b/x74 <CJK> ++<U000235F3> /x9b/x75 <CJK> + <U000249BA> /x9b/x77 <CJK> +-<UEB43> /x9b/x79 <CJK> +-<UEB44> /x9b/x7a <CJK> ++<U0002361A> /x9b/x79 <CJK> ++<U00023716> /x9b/x7a <CJK> + <U00020346> /x9b/x7c <CJK> + <U58B5> /x9b/x7d <CJK> + <U670E> /x9b/x7e <CJK> + <U6918> /x9b/xa1 <CJK> +-<UEB4A> /x9b/xa2 <CJK> ++<U00023AA7> /x9b/xa2 <CJK> + <U00027657> /x9b/xa3 <CJK> + <U00025FE2> /x9b/xa4 <CJK> +-<UEB4D> /x9b/xa5 <CJK> +-<UEB4E> /x9b/xa6 <CJK> ++<U00023E11> /x9b/xa5 <CJK> ++<U00023EB9> /x9b/xa6 <CJK> + <U000275FE> /x9b/xa7 <CJK> + <U0002209A> /x9b/xa8 <CJK> + <U48D0> /x9b/xa9 <CJK> + <U4AB8> /x9b/xaa <CJK> +-<UEB53> /x9b/xab <CJK> ++<U00024119> /x9b/xab <CJK> + <U00028A9A> /x9b/xac <CJK> +-<UEB55> /x9b/xad <CJK> +-<UEB56> /x9b/xae <CJK> ++<U000242EE> /x9b/xad <CJK> ++<U0002430D> /x9b/xae <CJK> + <U0002403B> /x9b/xaf <CJK> +-<UEB58> /x9b/xb0 <CJK> ++<U00024334> /x9b/xb0 <CJK> + <U00024396> /x9b/xb1 <CJK> +-<UEB5A> /x9b/xb2 <CJK> +-<UEB5B> /x9b/xb3 <CJK> ++<U00024A45> /x9b/xb2 <CJK> ++<U000205CA> /x9b/xb3 <CJK> + <U51D2> /x9b/xb4 <CJK> + <U00020611> /x9b/xb5 <CJK> + <U599F> /x9b/xb6 <CJK> + <U00021EA8> /x9b/xb7 <CJK> + <U3BBE> /x9b/xb8 <CJK> + <U00023CFF> /x9b/xb9 <CJK> +-<UEB62> /x9b/xba <CJK> +-<UEB63> /x9b/xbb <CJK> ++<U00024404> /x9b/xba <CJK> ++<U000244D6> /x9b/xbb <CJK> + <U5788> /x9b/xbc <CJK> +-<UEB65> /x9b/xbd <CJK> ++<U00024674> /x9b/xbd <CJK> + <U399B> /x9b/xbe <CJK> +-<UEB67> /x9b/xbf <CJK> +-<UEB68> /x9b/xc0 <CJK> +-<UEB69> /x9b/xc1 <CJK> ++<U0002472F> /x9b/xbf <CJK> ++<U000285E8> /x9b/xc0 <CJK> ++<U000299C9> /x9b/xc1 <CJK> + <U3762> /x9b/xc2 <CJK> + <U000221C3> /x9b/xc3 <CJK> + <U8B5E> /x9b/xc4 <CJK> + <U00028B4E> /x9b/xc5 <CJK> +-<UEB6F> /x9b/xc7 <CJK> +-<UEB70> /x9b/xc8 <CJK> +-<UEB71> /x9b/xc9 <CJK> ++<U00024812> /x9b/xc7 <CJK> ++<U000248FB> /x9b/xc8 <CJK> ++<U00024A15> /x9b/xc9 <CJK> + <U7209> /x9b/xca <CJK> +-<UEB73> /x9b/xcb <CJK> ++<U00024AC0> /x9b/xcb <CJK> + <U00020C78> /x9b/xcc <CJK> + <U5965> /x9b/xcd <CJK> +-<UEB76> /x9b/xce <CJK> +-<UEB77> /x9b/xcf <CJK> ++<U00024EA5> /x9b/xce <CJK> ++<U00024F86> /x9b/xcf <CJK> + <U00020779> /x9b/xd0 <CJK> + <U8EDA> /x9b/xd1 <CJK> +-<UEB7A> /x9b/xd2 <CJK> ++<U0002502C> /x9b/xd2 <CJK> + <U528F> /x9b/xd3 <CJK> + <U573F> /x9b/xd4 <CJK> + <U7171> /x9b/xd5 <CJK> +-<UEB7E> /x9b/xd6 <CJK> +-<UEB7F> /x9b/xd7 <CJK> +-<UEB80> /x9b/xd8 <CJK> ++<U00025299> /x9b/xd6 <CJK> ++<U00025419> /x9b/xd7 <CJK> ++<U00023F4A> /x9b/xd8 <CJK> + <U00024AA7> /x9b/xd9 <CJK> + <U55BC> /x9b/xda <CJK> +-<UEB83> /x9b/xdb <CJK> ++<U00025446> /x9b/xdb <CJK> + <U0002546E> /x9b/xdc <CJK> + <U00026B52> /x9b/xdd <CJK> + <U3473> /x9b/xdf <CJK> +-<UEB88> /x9b/xe0 <CJK> ++<U0002553F> /x9b/xe0 <CJK> + <U00027632> /x9b/xe1 <CJK> +-<UEB8A> /x9b/xe2 <CJK> ++<U0002555E> /x9b/xe2 <CJK> + <U4718> /x9b/xe3 <CJK> +-<UEB8C> /x9b/xe4 <CJK> ++<U00025562> /x9b/xe4 <CJK> + <U00025566> /x9b/xe5 <CJK> + <U000257C7> /x9b/xe6 <CJK> + <U0002493F> /x9b/xe7 <CJK> +-<UEB90> /x9b/xe8 <CJK> ++<U0002585D> /x9b/xe8 <CJK> + <U5066> /x9b/xe9 <CJK> + <U34FB> /x9b/xea <CJK> +-<UEB93> /x9b/xeb <CJK> +-<UEB95> /x9b/xed <CJK> ++<U000233CC> /x9b/xeb <CJK> ++<U00025903> /x9b/xed <CJK> + <U477C> /x9b/xee <CJK> + <U00028948> /x9b/xef <CJK> + <U00025AAE> /x9b/xf0 <CJK> +-<UEB99> /x9b/xf1 <CJK> ++<U00025B89> /x9b/xf1 <CJK> + <U00025C06> /x9b/xf2 <CJK> +-<UEB9B> /x9b/xf3 <CJK> ++<U00021D90> /x9b/xf3 <CJK> + <U57A1> /x9b/xf4 <CJK> + <U7151> /x9b/xf5 <CJK> +-<UEB9F> /x9b/xf7 <CJK> ++<U00026102> /x9b/xf7 <CJK> + <U00027C12> /x9b/xf8 <CJK> + <U9056> /x9b/xf9 <CJK> +-<UEBA2> /x9b/xfa <CJK> ++<U000261B2> /x9b/xfa <CJK> + <U00024F9A> /x9b/xfb <CJK> + <U8B62> /x9b/xfc <CJK> +-<UEBA5> /x9b/xfd <CJK> +-<UEBA6> /x9b/xfe <CJK> ++<U00026402> /x9b/xfd <CJK> ++<U0002644A> /x9b/xfe <CJK> + <U5D5B> /x9c/x40 <CJK> + <U00026BF7> /x9c/x41 <CJK> +-<UEBAA> /x9c/x43 <CJK> +-<UEBAB> /x9c/x44 <CJK> ++<U00026484> /x9c/x43 <CJK> ++<U0002191C> /x9c/x44 <CJK> + <U8AEA> /x9c/x45 <CJK> + <U000249F6> /x9c/x46 <CJK> +-<UEBAE> /x9c/x47 <CJK> ++<U00026488> /x9c/x47 <CJK> + <U00023FEF> /x9c/x48 <CJK> + <U00026512> /x9c/x49 <CJK> + <U4BC0> /x9c/x4a <CJK> +-<UEBB2> /x9c/x4b <CJK> +-<UEBB3> /x9c/x4c <CJK> ++<U000265BF> /x9c/x4b <CJK> ++<U000266B5> /x9c/x4c <CJK> + <U0002271B> /x9c/x4d <CJK> + <U9465> /x9c/x4e <CJK> + <U000257E1> /x9c/x4f <CJK> +@@ -2960,68 +3268,68 @@ CHARMAP + <U0002F8CD> /x9c/x52 <CJK> + <U56B9> /x9c/x54 <CJK> + <U00024521> /x9c/x55 <CJK> +-<UEBBD> /x9c/x56 <CJK> ++<U000266FC> /x9c/x56 <CJK> + <U4E6A> /x9c/x57 <CJK> +-<UEBBF> /x9c/x58 <CJK> ++<U00024934> /x9c/x58 <CJK> + <U9656> /x9c/x59 <CJK> + <U6D8F> /x9c/x5a <CJK> + <U00026CBD> /x9c/x5b <CJK> + <U3618> /x9c/x5c <CJK> + <U8977> /x9c/x5d <CJK> +-<UEBC5> /x9c/x5e <CJK> ++<U00026799> /x9c/x5e <CJK> + <U0002686E> /x9c/x5f <CJK> + <U00026411> /x9c/x60 <CJK> + <U0002685E> /x9c/x61 <CJK> +-<UEBCA> /x9c/x63 <CJK> ++<U000268C7> /x9c/x63 <CJK> + <U7B42> /x9c/x64 <CJK> +-<UEBCC> /x9c/x65 <CJK> ++<U000290C0> /x9c/x65 <CJK> + <U00020A11> /x9c/x66 <CJK> +-<UEBCE> /x9c/x67 <CJK> +-<UEBD0> /x9c/x69 <CJK> ++<U00026926> /x9c/x67 <CJK> ++<U00026939> /x9c/x69 <CJK> + <U7A45> /x9c/x6a <CJK> + <U000269FA> /x9c/x6c <CJK> + <U9A26> /x9c/x6d <CJK> +-<UEBD5> /x9c/x6e <CJK> ++<U00026A2D> /x9c/x6e <CJK> + <U365F> /x9c/x6f <CJK> +-<UEBD7> /x9c/x70 <CJK> +-<UEBD8> /x9c/x71 <CJK> ++<U00026469> /x9c/x70 <CJK> ++<U00020021> /x9c/x71 <CJK> + <U7983> /x9c/x72 <CJK> +-<UEBDA> /x9c/x73 <CJK> +-<UEBDB> /x9c/x74 <CJK> ++<U00026A34> /x9c/x73 <CJK> ++<U00026B5B> /x9c/x74 <CJK> + <U5D2C> /x9c/x75 <CJK> +-<UEBDD> /x9c/x76 <CJK> +-<UEBDF> /x9c/x78 <CJK> ++<U00023519> /x9c/x76 <CJK> ++<U00026B9D> /x9c/x78 <CJK> + <U46D0> /x9c/x79 <CJK> +-<UEBE1> /x9c/x7a <CJK> ++<U00026CA4> /x9c/x7a <CJK> + <U753B> /x9c/x7b <CJK> + <U8865> /x9c/x7c <CJK> +-<UEBE4> /x9c/x7d <CJK> ++<U00026DAE> /x9c/x7d <CJK> + <U58B6> /x9c/x7e <CJK> + <U371C> /x9c/xa1 <CJK> + <U0002258D> /x9c/xa2 <CJK> +-<UEBE8> /x9c/xa3 <CJK> +-<UEBE9> /x9c/xa4 <CJK> ++<U0002704B> /x9c/xa3 <CJK> ++<U000271CD> /x9c/xa4 <CJK> + <U3C54> /x9c/xa5 <CJK> +-<UEBEB> /x9c/xa6 <CJK> +-<UEBEC> /x9c/xa7 <CJK> ++<U00027280> /x9c/xa6 <CJK> ++<U00027285> /x9c/xa7 <CJK> + <U9281> /x9c/xa8 <CJK> + <U0002217A> /x9c/xa9 <CJK> +-<UEBEF> /x9c/xaa <CJK> ++<U0002728B> /x9c/xaa <CJK> + <U9330> /x9c/xab <CJK> + <U000272E6> /x9c/xac <CJK> +-<UEBF2> /x9c/xad <CJK> ++<U000249D0> /x9c/xad <CJK> + <U6C39> /x9c/xae <CJK> + <U949F> /x9c/xaf <CJK> +-<UEBF5> /x9c/xb0 <CJK> ++<U00027450> /x9c/xb0 <CJK> + <U00020EF8> /x9c/xb1 <CJK> + <U8827> /x9c/xb2 <CJK> + <U88F5> /x9c/xb3 <CJK> +-<UEBF9> /x9c/xb4 <CJK> +-<UEBFA> /x9c/xb5 <CJK> ++<U00022926> /x9c/xb4 <CJK> ++<U00028473> /x9c/xb5 <CJK> + <U000217B1> /x9c/xb6 <CJK> + <U6EB8> /x9c/xb7 <CJK> + <U00024A2A> /x9c/xb8 <CJK> +-<UEBFE> /x9c/xb9 <CJK> ++<U00021820> /x9c/xb9 <CJK> + <U39A4> /x9c/xba <CJK> + <U36B9> /x9c/xbb <CJK> + <U453F> /x9c/xbe <CJK> +@@ -3029,26 +3337,26 @@ CHARMAP + <U00029CAD> /x9c/xc0 <CJK> + <U000298A4> /x9c/xc1 <CJK> + <U8943> /x9c/xc2 <CJK> +-<UEC08> /x9c/xc3 <CJK> +-<UEC09> /x9c/xc4 <CJK> ++<U000277CC> /x9c/xc3 <CJK> ++<U00027858> /x9c/xc4 <CJK> + <U56D6> /x9c/xc5 <CJK> + <U40DF> /x9c/xc6 <CJK> + <U0002160A> /x9c/xc7 <CJK> + <U39A1> /x9c/xc8 <CJK> + <U0002372F> /x9c/xc9 <CJK> +-<UEC0F> /x9c/xca <CJK> ++<U000280E8> /x9c/xca <CJK> + <U000213C5> /x9c/xcb <CJK> + <U71AD> /x9c/xcc <CJK> + <U8366> /x9c/xcd <CJK> +-<UEC13> /x9c/xce <CJK> ++<U000279DD> /x9c/xce <CJK> + <U000291A8> /x9c/xcf <CJK> + <U4CB7> /x9c/xd1 <CJK> + <U000270AF> /x9c/xd2 <CJK> + <U000289AB> /x9c/xd3 <CJK> +-<UEC19> /x9c/xd4 <CJK> +-<UEC1A> /x9c/xd5 <CJK> +-<UEC1B> /x9c/xd6 <CJK> +-<UEC1C> /x9c/xd7 <CJK> ++<U000279FD> /x9c/xd4 <CJK> ++<U00027A0A> /x9c/xd5 <CJK> ++<U00027B0B> /x9c/xd6 <CJK> ++<U00027D66> /x9c/xd7 <CJK> + <U0002417A> /x9c/xd8 <CJK> + <U7B43> /x9c/xd9 <CJK> + <U797E> /x9c/xda <CJK> +@@ -3056,21 +3364,21 @@ CHARMAP + <U6FB5> /x9c/xdc <CJK> + <U0002A2DF> /x9c/xdd <CJK> + <U6A03> /x9c/xde <CJK> +-<UEC24> /x9c/xdf <CJK> ++<U00028318> /x9c/xdf <CJK> + <U53A2> /x9c/xe0 <CJK> +-<UEC26> /x9c/xe1 <CJK> ++<U00026E07> /x9c/xe1 <CJK> + <U93BF> /x9c/xe2 <CJK> + <U6836> /x9c/xe3 <CJK> + <U975D> /x9c/xe4 <CJK> + <U0002816F> /x9c/xe5 <CJK> +-<UEC2B> /x9c/xe6 <CJK> ++<U00028023> /x9c/xe6 <CJK> + <U000269B5> /x9c/xe7 <CJK> + <U000213ED> /x9c/xe8 <CJK> + <U0002322F> /x9c/xe9 <CJK> +-<UEC2F> /x9c/xea <CJK> ++<U00028048> /x9c/xea <CJK> + <U5D85> /x9c/xeb <CJK> + <U00028C30> /x9c/xec <CJK> +-<UEC32> /x9c/xed <CJK> ++<U00028083> /x9c/xed <CJK> + <U5715> /x9c/xee <CJK> + <U9823> /x9c/xef <CJK> + <U00028949> /x9c/xf0 <CJK> +@@ -3083,74 +3391,74 @@ CHARMAP + <U00023F81> /x9c/xf7 <CJK> + <U3C11> /x9c/xf8 <CJK> + <U6736> /x9c/xf9 <CJK> +-<UEC3F> /x9c/xfa <CJK> ++<U00028090> /x9c/xfa <CJK> + <U000280F4> /x9c/xfb <CJK> + <U0002812E> /x9c/xfc <CJK> + <U00021FA1> /x9c/xfd <CJK> +-<UEC43> /x9c/xfe <CJK> +-<UEC44> /x9d/x40 <CJK> +-<UEC45> /x9d/x41 <CJK> +-<UEC46> /x9d/x42 <CJK> +-<UEC47> /x9d/x43 <CJK> +-<UEC48> /x9d/x44 <CJK> +-<UEC49> /x9d/x45 <CJK> ++<U0002814F> /x9c/xfe <CJK> ++<U00028189> /x9d/x40 <CJK> ++<U000281AF> /x9d/x41 <CJK> ++<U0002821A> /x9d/x42 <CJK> ++<U00028306> /x9d/x43 <CJK> ++<U0002832F> /x9d/x44 <CJK> ++<U0002838A> /x9d/x45 <CJK> + <U35CA> /x9d/x46 <CJK> +-<UEC4B> /x9d/x47 <CJK> ++<U00028468> /x9d/x47 <CJK> + <U000286AA> /x9d/x48 <CJK> + <U48FA> /x9d/x49 <CJK> + <U63E6> /x9d/x4a <CJK> +-<UEC4F> /x9d/x4b <CJK> ++<U00028956> /x9d/x4b <CJK> + <U7808> /x9d/x4c <CJK> + <U9255> /x9d/x4d <CJK> +-<UEC52> /x9d/x4e <CJK> ++<U000289B8> /x9d/x4e <CJK> + <U43F2> /x9d/x4f <CJK> +-<UEC54> /x9d/x50 <CJK> ++<U000289E7> /x9d/x50 <CJK> + <U43DF> /x9d/x51 <CJK> +-<UEC56> /x9d/x52 <CJK> +-<UEC57> /x9d/x53 <CJK> +-<UEC58> /x9d/x54 <CJK> ++<U000289E8> /x9d/x52 <CJK> ++<U00028B46> /x9d/x53 <CJK> ++<U00028BD4> /x9d/x54 <CJK> + <U59F8> /x9d/x55 <CJK> +-<UEC5A> /x9d/x56 <CJK> +-<UEC5C> /x9d/x58 <CJK> +-<UEC5D> /x9d/x59 <CJK> ++<U00028C09> /x9d/x56 <CJK> ++<U00028FC5> /x9d/x58 <CJK> ++<U000290EC> /x9d/x59 <CJK> + <U00029110> /x9d/x5b <CJK> +-<UEC60> /x9d/x5c <CJK> ++<U0002913C> /x9d/x5c <CJK> + <U3DF7> /x9d/x5d <CJK> +-<UEC62> /x9d/x5e <CJK> +-<UEC63> /x9d/x5f <CJK> ++<U0002915E> /x9d/x5e <CJK> ++<U00024ACA> /x9d/x5f <CJK> + <U8FD0> /x9d/x60 <CJK> + <U728F> /x9d/x61 <CJK> + <U568B> /x9d/x62 <CJK> +-<UEC67> /x9d/x63 <CJK> ++<U000294E7> /x9d/x63 <CJK> + <U000295E9> /x9d/x64 <CJK> +-<UEC69> /x9d/x65 <CJK> +-<UEC6A> /x9d/x66 <CJK> +-<UEC6B> /x9d/x67 <CJK> +-<UEC6C> /x9d/x68 <CJK> +-<UEC6D> /x9d/x69 <CJK> ++<U000295B0> /x9d/x65 <CJK> ++<U000295B8> /x9d/x66 <CJK> ++<U00029732> /x9d/x67 <CJK> ++<U000298D1> /x9d/x68 <CJK> ++<U00029949> /x9d/x69 <CJK> + <U0002996A> /x9d/x6a <CJK> +-<UEC6F> /x9d/x6b <CJK> +-<UEC70> /x9d/x6c <CJK> ++<U000299C3> /x9d/x6b <CJK> ++<U00029A28> /x9d/x6c <CJK> + <U00029B0E> /x9d/x6d <CJK> +-<UEC72> /x9d/x6e <CJK> +-<UEC73> /x9d/x6f <CJK> ++<U00029D5A> /x9d/x6e <CJK> ++<U00029D9B> /x9d/x6f <CJK> + <U7E9F> /x9d/x70 <CJK> +-<UEC75> /x9d/x71 <CJK> ++<U00029EF8> /x9d/x71 <CJK> + <U00029F23> /x9d/x72 <CJK> + <U4CA4> /x9d/x73 <CJK> + <U9547> /x9d/x74 <CJK> +-<UEC79> /x9d/x75 <CJK> ++<U0002A293> /x9d/x75 <CJK> + <U71A2> /x9d/x76 <CJK> +-<UEC7B> /x9d/x77 <CJK> ++<U0002A2FF> /x9d/x77 <CJK> + <U4D91> /x9d/x78 <CJK> + <U9012> /x9d/x79 <CJK> +-<UEC7E> /x9d/x7a <CJK> ++<U0002A5CB> /x9d/x7a <CJK> + <U4D9C> /x9d/x7b <CJK> + <U00020C9C> /x9d/x7c <CJK> + <U8FBE> /x9d/x7d <CJK> + <U55C1> /x9d/x7e <CJK> + <U8FBA> /x9d/xa1 <CJK> +-<UEC84> /x9d/xa2 <CJK> ++<U000224B0> /x9d/xa2 <CJK> + <U8FB9> /x9d/xa3 <CJK> + <U00024A93> /x9d/xa4 <CJK> + <U4509> /x9d/xa5 <CJK> +@@ -3160,14 +3468,14 @@ CHARMAP + <U4EEA> /x9d/xa9 <CJK> + <U34E4> /x9d/xaa <CJK> + <U00028B2C> /x9d/xab <CJK> +-<UEC8E> /x9d/xac <CJK> ++<U0002789D> /x9d/xac <CJK> + <U373A> /x9d/xad <CJK> + <U8E80> /x9d/xae <CJK> + <U000217F5> /x9d/xaf <CJK> +-<UEC92> /x9d/xb0 <CJK> ++<U00028024> /x9d/xb0 <CJK> + <U00028B6C> /x9d/xb1 <CJK> + <U00028B99> /x9d/xb2 <CJK> +-<UEC95> /x9d/xb3 <CJK> ++<U00027A3E> /x9d/xb3 <CJK> + <U000266AF> /x9d/xb4 <CJK> + <U3DEB> /x9d/xb5 <CJK> + <U00027655> /x9d/xb6 <CJK> +@@ -3192,14 +3500,14 @@ CHARMAP + <U541A> /x9d/xca <CJK> + <U00025311> /x9d/xcb <CJK> + <U3DC6> /x9d/xcc <CJK> +-<UECAF> /x9d/xcd <CJK> ++<U00029D98> /x9d/xcd <CJK> + <U4C7D> /x9d/xce <CJK> + <U5622> /x9d/xcf <CJK> + <U561E> /x9d/xd0 <CJK> + <U7F49> /x9d/xd1 <CJK> + <U00025ED8> /x9d/xd2 <CJK> + <U5975> /x9d/xd3 <CJK> +-<UECB6> /x9d/xd4 <CJK> ++<U00023D40> /x9d/xd4 <CJK> + <U8770> /x9d/xd5 <CJK> + <U4E1C> /x9d/xd6 <CJK> + <U00020FEA> /x9d/xd7 <CJK> +@@ -3224,7 +3532,7 @@ CHARMAP + <U7962> /x9d/xea <CJK> + <U5643> /x9d/xeb <CJK> + <U5416> /x9d/xec <CJK> +-<UECCF> /x9d/xed <CJK> ++<U00020E9D> /x9d/xed <CJK> + <U35CE> /x9d/xee <CJK> + <U5605> /x9d/xef <CJK> + <U55F1> /x9d/xf0 <CJK> +@@ -3237,12 +3545,12 @@ CHARMAP + <U5497> /x9d/xf7 <CJK> + <U5572> /x9d/xf8 <CJK> + <U00020C41> /x9d/xf9 <CJK> +-<UECDC> /x9d/xfa <CJK> ++<U00020C96> /x9d/xfa <CJK> + <U5ED0> /x9d/xfb <CJK> + <U00025148> /x9d/xfc <CJK> + <U00020E76> /x9d/xfd <CJK> +-<UECE0> /x9d/xfe <CJK> +-<UECE1> /x9e/x40 <CJK> ++<U00022C62> /x9d/xfe <CJK> ++<U00020EA2> /x9e/x40 <CJK> + <U9EAB> /x9e/x41 <CJK> + <U7D5A> /x9e/x42 <CJK> + <U55DE> /x9e/x43 <CJK> +@@ -3257,9 +3565,9 @@ CHARMAP + <U63B9> /x9e/x4c <CJK> + <U63FE> /x9e/x4d <CJK> + <U5569> /x9e/x4e <CJK> +-<UECF0> /x9e/x4f <CJK> ++<U00022B43> /x9e/x4f <CJK> + <U9C72> /x9e/x50 <CJK> +-<UECF2> /x9e/x51 <CJK> ++<U00022EB3> /x9e/x51 <CJK> + <U519A> /x9e/x52 <CJK> + <U34DF> /x9e/x53 <CJK> + <U00020DA7> /x9e/x54 <CJK> +@@ -3269,7 +3577,7 @@ CHARMAP + <U5513> /x9e/x58 <CJK> + <U7666> /x9e/x59 <CJK> + <U8E2D> /x9e/x5a <CJK> +-<UECFC> /x9e/x5b <CJK> ++<U0002688A> /x9e/x5b <CJK> + <U75B1> /x9e/x5c <CJK> + <U80B6> /x9e/x5d <CJK> + <U8804> /x9e/x5e <CJK> +@@ -3290,7 +3598,7 @@ CHARMAP + <U000241A3> /x9e/x6d <CJK> + <U00027D73> /x9e/x6e <CJK> + <U00026ED0> /x9e/x6f <CJK> +-<UED11> /x9e/x70 <CJK> ++<U000272B6> /x9e/x70 <CJK> + <U9170> /x9e/x71 <CJK> + <U000211D9> /x9e/x72 <CJK> + <U9208> /x9e/x73 <CJK> +@@ -3302,20 +3610,20 @@ CHARMAP + <U00021CA2> /x9e/x79 <CJK> + <U474E> /x9e/x7a <CJK> + <U00024FC2> /x9e/x7b <CJK> +-<UED1D> /x9e/x7c <CJK> ++<U00027FF9> /x9e/x7c <CJK> + <U00020FEB> /x9e/x7d <CJK> + <U40FA> /x9e/x7e <CJK> + <U9C5D> /x9e/xa1 <CJK> + <U651F> /x9e/xa2 <CJK> + <U00022DA0> /x9e/xa3 <CJK> + <U48F3> /x9e/xa4 <CJK> +-<UED24> /x9e/xa5 <CJK> ++<U000247E0> /x9e/xa5 <CJK> + <U00029D7C> /x9e/xa6 <CJK> + <U00020FEC> /x9e/xa7 <CJK> + <U00020E0A> /x9e/xa8 <CJK> +-<UED29> /x9e/xaa <CJK> ++<U000275A3> /x9e/xaa <CJK> + <U00020FED> /x9e/xab <CJK> +-<UED2C> /x9e/xad <CJK> ++<U00026048> /x9e/xad <CJK> + <U00021187> /x9e/xae <CJK> + <U71A3> /x9e/xaf <CJK> + <U7E8E> /x9e/xb0 <CJK> +@@ -3330,13 +3638,13 @@ CHARMAP + <U39DC> /x9e/xb9 <CJK> + <U537D> /x9e/xba <CJK> + <U36A5> /x9e/xbb <CJK> +-<UED3B> /x9e/xbc <CJK> ++<U00024618> /x9e/xbc <CJK> + <U589A> /x9e/xbd <CJK> + <U00024B6E> /x9e/xbe <CJK> + <U822D> /x9e/xbf <CJK> + <U544B> /x9e/xc0 <CJK> + <U57AA> /x9e/xc1 <CJK> +-<UED41> /x9e/xc2 <CJK> ++<U00025A95> /x9e/xc2 <CJK> + <U00020979> /x9e/xc3 <CJK> + <U3A52> /x9e/xc5 <CJK> + <U00022465> /x9e/xc6 <CJK> +@@ -3349,10 +3657,10 @@ CHARMAP + <U4C5B> /x9e/xcd <CJK> + <U00024FA9> /x9e/xce <CJK> + <U0002959E> /x9e/xcf <CJK> +-<UED4F> /x9e/xd0 <CJK> ++<U00029FDE> /x9e/xd0 <CJK> + <U845C> /x9e/xd1 <CJK> + <U00023DB6> /x9e/xd2 <CJK> +-<UED52> /x9e/xd3 <CJK> ++<U000272B2> /x9e/xd3 <CJK> + <U000267B3> /x9e/xd4 <CJK> + <U00023720> /x9e/xd5 <CJK> + <U632E> /x9e/xd6 <CJK> +@@ -3365,19 +3673,19 @@ CHARMAP + <U3E74> /x9e/xdd <CJK> + <U367A> /x9e/xde <CJK> + <U45E9> /x9e/xdf <CJK> +-<UED5F> /x9e/xe0 <CJK> ++<U0002048E> /x9e/xe0 <CJK> + <U7640> /x9e/xe1 <CJK> + <U5AF0> /x9e/xe2 <CJK> + <U00020EB6> /x9e/xe3 <CJK> + <U787A> /x9e/xe4 <CJK> +-<U47B6> /x9e/xe5 <CJK> ++<U00027F2E> /x9e/xe5 <CJK> + <U58A7> /x9e/xe6 <CJK> + <U40BF> /x9e/xe7 <CJK> + <U567C> /x9e/xe8 <CJK> + <U9B8B> /x9e/xe9 <CJK> + <U5D74> /x9e/xea <CJK> + <U7654> /x9e/xeb <CJK> +-<UED6B> /x9e/xec <CJK> ++<U0002A434> /x9e/xec <CJK> + <U9E85> /x9e/xed <CJK> + <U4CE1> /x9e/xee <CJK> + <U37FB> /x9e/xf0 <CJK> +@@ -3388,7 +3696,7 @@ CHARMAP + <U000212A9> /x9e/xf6 <CJK> + <U57A7> /x9e/xf7 <CJK> + <U00024963> /x9e/xf8 <CJK> +-<UED78> /x9e/xf9 <CJK> ++<U00029E06> /x9e/xf9 <CJK> + <U5234> /x9e/xfa <CJK> + <U000270AE> /x9e/xfb <CJK> + <U35AD> /x9e/xfc <CJK> +@@ -3399,16 +3707,16 @@ CHARMAP + <U0002176C> /x9f/x43 <CJK> + <U5C53> /x9f/x44 <CJK> + <U64D3> /x9f/x45 <CJK> +-<UED84> /x9f/x46 <CJK> +-<UED85> /x9f/x47 <CJK> ++<U000294D0> /x9f/x46 <CJK> ++<U00026335> /x9f/x47 <CJK> + <U00027164> /x9f/x48 <CJK> + <U86AD> /x9f/x49 <CJK> +-<UED88> /x9f/x4a <CJK> ++<U00020D28> /x9f/x4a <CJK> + <U00026D22> /x9f/x4b <CJK> + <U00024AE2> /x9f/x4c <CJK> +-<UED8B> /x9f/x4d <CJK> ++<U00020D71> /x9f/x4d <CJK> + <U51FE> /x9f/x4f <CJK> +-<UED8E> /x9f/x50 <CJK> ++<U00021F0F> /x9f/x50 <CJK> + <U5D8E> /x9f/x51 <CJK> + <U9703> /x9f/x52 <CJK> + <U00021DD1> /x9f/x53 <CJK> +@@ -3469,7 +3777,7 @@ CHARMAP + <U9681> /x9f/xaf <CJK> + <U915C> /x9f/xb0 <CJK> + <U9151> /x9f/xb2 <CJK> +-<UEDCF> /x9f/xb3 <CJK> ++<U00028E97> /x9f/xb3 <CJK> + <U637F> /x9f/xb4 <CJK> + <U00026D23> /x9f/xb5 <CJK> + <U6ACA> /x9f/xb6 <CJK> +@@ -3480,7 +3788,7 @@ CHARMAP + <U000203FC> /x9f/xbb <CJK> + <U734F> /x9f/xbc <CJK> + <U7C70> /x9f/xbd <CJK> +-<UEDDA> /x9f/xbe <CJK> ++<U00025C21> /x9f/xbe <CJK> + <U00023CFD> /x9f/xbf <CJK> + <U00024919> /x9f/xc1 <CJK> + <U76D6> /x9f/xc2 <CJK> +@@ -3496,7 +3804,7 @@ CHARMAP + <U5DF5> /x9f/xce <CJK> + <U4ECE> /x9f/xcf <CJK> + <U6C31> /x9f/xd0 <CJK> +-<UEDED> /x9f/xd1 <CJK> ++<U000201F2> /x9f/xd1 <CJK> + <U4F39> /x9f/xd2 <CJK> + <U549C> /x9f/xd3 <CJK> + <U54DA> /x9f/xd4 <CJK> +@@ -3519,7 +3827,7 @@ CHARMAP + <U8818> /x9f/xe8 <CJK> + <U7F78> /x9f/xe9 <CJK> + <U5620> /x9f/xeb <CJK> +-<UEE08> /x9f/xec <CJK> ++<U0002A64A> /x9f/xec <CJK> + <U8E77> /x9f/xed <CJK> + <U9F53> /x9f/xee <CJK> + <U8DD4> /x9f/xf0 <CJK> +@@ -3596,7 +3904,7 @@ CHARMAP + <U5D57> /xa0/xa1 <CJK> + <U00028BC2> /xa0/xa2 <CJK> + <U8FDA> /xa0/xa3 <CJK> +-<UEE5D> /xa0/xa4 <CJK> ++<U00028E39> /xa0/xa4 <CJK> + <U50D9> /xa0/xa6 <CJK> + <U00021D46> /xa0/xa7 <CJK> + <U7906> /xa0/xa8 <CJK> +@@ -3606,7 +3914,7 @@ CHARMAP + <U4065> /xa0/xac <CJK> + <U77FE> /xa0/xae <CJK> + <U7CC2> /xa0/xb0 <CJK> +-<UEE6A> /xa0/xb1 <CJK> ++<U00025F1A> /xa0/xb1 <CJK> + <U7CDA> /xa0/xb2 <CJK> + <U7A2D> /xa0/xb3 <CJK> + <U8066> /xa0/xb4 <CJK> +@@ -3660,7 +3968,7 @@ CHARMAP + <U00023CC7> /xa0/xe9 <CJK> + <U00025ED7> /xa0/xea <CJK> + <U00027656> /xa0/xeb <CJK> +-<UEEA5> /xa0/xec <CJK> ++<U00025531> /xa0/xec <CJK> + <U00021944> /xa0/xed <CJK> + <U000212FE> /xa0/xee <CJK> + <U00029903> /xa0/xef <CJK> +@@ -3671,14 +3979,14 @@ CHARMAP + <U00028A0F> /xa0/xf4 <CJK> + <U00023677> /xa0/xf5 <CJK> + <U000200EE> /xa0/xf6 <CJK> +-<UEEB0> /xa0/xf7 <CJK> ++<U00026846> /xa0/xf7 <CJK> + <U00024F0E> /xa0/xf8 <CJK> + <U4562> /xa0/xf9 <CJK> + <U5B1F> /xa0/xfa <CJK> +-<UEEB4> /xa0/xfb <CJK> ++<U0002634C> /xa0/xfb <CJK> + <U9F50> /xa0/xfc <CJK> + <U9EA6> /xa0/xfd <CJK> +-<UEEB7> /xa0/xfe <CJK> ++<U0002626B> /xa0/xfe <CJK> + <U3000> /xa1/x40 IDEOGRAPHIC SPACE + <UFF0C> /xa1/x41 FULLWIDTH COMMA + <U3001> /xa1/x42 IDEOGRAPHIC COMMA +@@ -9783,16 +10091,16 @@ CHARMAP + <U21E7> /xc8/x76 UPWARDS WHITE ARROW + <U21B8> /xc8/x77 NORTH WEST ARROW TO LONG BAR + <U21B9> /xc8/x78 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +-<UF7E5> /xc8/x79 <CJK> +-<UF7E6> /xc8/x7a <CJK> ++<U31CF> /xc8/x79 <CJK> ++<U000200CC> /xc8/x7a <CJK> + <U4E5A> /xc8/x7b <CJK> +-<UF7E8> /xc8/x7c <CJK> ++<U0002008A> /xc8/x7c <CJK> + <U5202> /xc8/x7d <CJK> +-<UF7EA> /xc8/x7e <CJK> +-<UF7EB> /xc8/xa1 <CJK> ++<U4491> /xc8/x7e <CJK> ++<U9FB0> /xc8/xa1 <CJK> + <U5188> /xc8/xa2 <CJK> +-<UF7ED> /xc8/xa3 <CJK> +-<UF7EE> /xc8/xa4 <CJK> ++<U9FB1> /xc8/xa3 <CJK> ++<U00027607> /xc8/xa4 <CJK> + <UFFE2> /xc8/xcd FULLWIDTH NOT SIGN + <UFFE4> /xc8/xce FULLWIDTH BROKEN BAR + <UFF07> /xc8/xcf FULLWIDTH APOSTROPHE +@@ -17536,7 +17844,7 @@ CHARMAP + <U00020547> /xfa/x40 <CJK> + <U92DB> /xfa/x41 <CJK> + <U000205DF> /xfa/x42 <CJK> +-<UE003> /xfa/x43 <CJK> ++<U00023FC5> /xfa/x43 <CJK> + <U854C> /xfa/x44 <CJK> + <U42B5> /xfa/x45 <CJK> + <U73EF> /xfa/x46 <CJK> +@@ -17557,10 +17865,10 @@ CHARMAP + <U00026BB3> /xfa/x55 <CJK> + <U00021305> /xfa/x56 <CJK> + <U4FAB> /xfa/x57 <CJK> +-<UE018> /xfa/x58 <CJK> ++<U000224ED> /xfa/x58 <CJK> + <U5008> /xfa/x59 <CJK> + <U00026D29> /xfa/x5a <CJK> +-<UE01B> /xfa/x5b <CJK> ++<U00027A84> /xfa/x5b <CJK> + <U00023600> /xfa/x5c <CJK> + <U00024AB1> /xfa/x5d <CJK> + <U00022513> /xfa/x5e <CJK> +@@ -17576,7 +17884,7 @@ CHARMAP + <U986C> /xfa/x6a <CJK> + <U3743> /xfa/x6b <CJK> + <U8416> /xfa/x6c <CJK> +-<UE02D> /xfa/x6d <CJK> ++<U000249A4> /xfa/x6d <CJK> + <U00020487> /xfa/x6e <CJK> + <U5160> /xfa/x6f <CJK> + <U000233B4> /xfa/x70 <CJK> +@@ -17587,7 +17895,7 @@ CHARMAP + <U00022530> /xfa/x75 <CJK> + <U0002058E> /xfa/x76 <CJK> + <U00023233> /xfa/x77 <CJK> +-<UE038> /xfa/x78 <CJK> ++<U00021983> /xfa/x78 <CJK> + <U5B82> /xfa/x79 <CJK> + <U877D> /xfa/x7a <CJK> + <U000205B3> /xfa/x7b <CJK> +@@ -17607,7 +17915,7 @@ CHARMAP + <U51ED> /xfa/xab <CJK> + <U83CD> /xfa/xac <CJK> + <U693E> /xfa/xad <CJK> +-<UE04C> /xfa/xae <CJK> ++<U0002372D> /xfa/xae <CJK> + <U5F7B> /xfa/xaf <CJK> + <U520B> /xfa/xb0 <CJK> + <U5226> /xfa/xb1 <CJK> +@@ -17621,7 +17929,7 @@ CHARMAP + <U8542> /xfa/xb9 <CJK> + <U52E0> /xfa/xba <CJK> + <U860D> /xfa/xbb <CJK> +-<UE05A> /xfa/xbc <CJK> ++<U00026B13> /xfa/xbc <CJK> + <U00028ADE> /xfa/xbe <CJK> + <U5549> /xfa/xbf <CJK> + <U6ED9> /xfa/xc0 <CJK> +@@ -17676,13 +17984,13 @@ CHARMAP + <U6D5B> /xfa/xf3 <CJK> + <U546D> /xfa/xf4 <CJK> + <U00026B53> /xfa/xf5 <CJK> +-<UE094> /xfa/xf6 <CJK> ++<U00020D74> /xfa/xf6 <CJK> + <U555D> /xfa/xf7 <CJK> + <U548F> /xfa/xf8 <CJK> + <U54A4> /xfa/xf9 <CJK> + <U47A6> /xfa/xfa <CJK> +-<UE099> /xfa/xfb <CJK> +-<UE09A> /xfa/xfc <CJK> ++<U0002170D> /xfa/xfb <CJK> ++<U00020EDD> /xfa/xfc <CJK> + <U3DB4> /xfa/xfd <CJK> + <U00020D4D> /xfa/xfe <CJK> + <U000289BC> /xfb/x40 <CJK> +@@ -17724,7 +18032,7 @@ CHARMAP + <U36B1> /xfb/x65 <CJK> + <U00026C7E> /xfb/x66 <CJK> + <U57E6> /xfb/x67 <CJK> +-<UE0C5> /xfb/x68 <CJK> ++<U00021416> /xfb/x68 <CJK> + <U5803> /xfb/x69 <CJK> + <U00021454> /xfb/x6a <CJK> + <U00024363> /xfb/x6b <CJK> +@@ -17735,7 +18043,7 @@ CHARMAP + <U3561> /xfb/x70 <CJK> + <U58E0> /xfb/x71 <CJK> + <U58DC> /xfb/x72 <CJK> +-<UE0D0> /xfb/x73 <CJK> ++<U0002123C> /xfb/x73 <CJK> + <U58FB> /xfb/x74 <CJK> + <U5BFF> /xfb/x75 <CJK> + <U5743> /xfb/x76 <CJK> +@@ -17769,17 +18077,17 @@ CHARMAP + <U5AAB> /xfb/xb4 <CJK> + <U5A63> /xfb/xb5 <CJK> + <U36E6> /xfb/xb6 <CJK> +-<UE0F2> /xfb/xb7 <CJK> ++<U000249A9> /xfb/xb7 <CJK> + <U3708> /xfb/xb9 <CJK> + <U5A96> /xfb/xba <CJK> + <U7465> /xfb/xbb <CJK> + <U5AD3> /xfb/xbc <CJK> + <U00026FA1> /xfb/xbd <CJK> +-<UE0F9> /xfb/xbe <CJK> ++<U00022554> /xfb/xbe <CJK> + <U3D85> /xfb/xbf <CJK> + <U00021911> /xfb/xc0 <CJK> + <U3732> /xfb/xc1 <CJK> +-<UE0FD> /xfb/xc2 <CJK> ++<U000216B8> /xfb/xc2 <CJK> + <U5E83> /xfb/xc3 <CJK> + <U52D0> /xfb/xc4 <CJK> + <U5B76> /xfb/xc5 <CJK> +@@ -17788,11 +18096,11 @@ CHARMAP + <U00027A0E> /xfb/xc8 <CJK> + <U4004> /xfb/xc9 <CJK> + <U485D> /xfb/xca <CJK> +-<UE106> /xfb/xcb <CJK> ++<U00020204> /xfb/xcb <CJK> + <U5BD5> /xfb/xcc <CJK> + <U6160> /xfb/xcd <CJK> +-<UE109> /xfb/xce <CJK> +-<UE10A> /xfb/xcf <CJK> ++<U00021A34> /xfb/xce <CJK> ++<U000259CC> /xfb/xcf <CJK> + <U000205A5> /xfb/xd0 <CJK> + <U5BF3> /xfb/xd1 <CJK> + <U5B9D> /xfb/xd2 <CJK> +@@ -17829,7 +18137,7 @@ CHARMAP + <U5E2E> /xfb/xf1 <CJK> + <U6A8A> /xfb/xf2 <CJK> + <U5E7A> /xfb/xf4 <CJK> +-<UE130> /xfb/xf5 <CJK> ++<U000244BC> /xfb/xf5 <CJK> + <U00020CD3> /xfb/xf6 <CJK> + <U53A6> /xfb/xf7 <CJK> + <U4EB7> /xfb/xf8 <CJK> +@@ -17859,11 +18167,11 @@ CHARMAP + <U00026E6E> /xfc/x53 <CJK> + <U5F72> /xfc/x54 <CJK> + <U9340> /xfc/x55 <CJK> +-<UE150> /xfc/x56 <CJK> ++<U00028A36> /xfc/x56 <CJK> + <U5FA7> /xfc/x57 <CJK> + <U5DB6> /xfc/x58 <CJK> + <U3D5F> /xfc/x59 <CJK> +-<UE154> /xfc/x5a <CJK> ++<U00025250> /xfc/x5a <CJK> + <U00021F6A> /xfc/x5b <CJK> + <U000270F8> /xfc/x5c <CJK> + <U00022668> /xfc/x5d <CJK> +@@ -17872,7 +18180,7 @@ CHARMAP + <U00028A29> /xfc/x60 <CJK> + <U6031> /xfc/x61 <CJK> + <U6685> /xfc/x62 <CJK> +-<UE15D> /xfc/x63 <CJK> ++<U00021877> /xfc/x63 <CJK> + <U3963> /xfc/x64 <CJK> + <U3DC7> /xfc/x65 <CJK> + <U3639> /xfc/x66 <CJK> +@@ -17882,20 +18190,20 @@ CHARMAP + <U3E40> /xfc/x6a <CJK> + <U609E> /xfc/x6b <CJK> + <U60B3> /xfc/x6d <CJK> +-<UE168> /xfc/x6e <CJK> ++<U00024982> /xfc/x6e <CJK> + <U0002498F> /xfc/x6f <CJK> +-<UE16A> /xfc/x70 <CJK> ++<U00027A53> /xfc/x70 <CJK> + <U74A4> /xfc/x71 <CJK> + <U50E1> /xfc/x72 <CJK> + <U5AA0> /xfc/x73 <CJK> + <U6164> /xfc/x74 <CJK> + <U8424> /xfc/x75 <CJK> + <U6142> /xfc/x76 <CJK> +-<UE171> /xfc/x77 <CJK> ++<U0002F8A6> /xfc/x77 <CJK> + <U00026ED2> /xfc/x78 <CJK> + <U6181> /xfc/x79 <CJK> + <U51F4> /xfc/x7a <CJK> +-<UE175> /xfc/x7b <CJK> ++<U00020656> /xfc/x7b <CJK> + <U6187> /xfc/x7c <CJK> + <U5BAA> /xfc/x7d <CJK> + <U00023FB7> /xfc/x7e <CJK> +@@ -17921,7 +18229,7 @@ CHARMAP + <U3A17> /xfc/xb4 <CJK> + <U6438> /xfc/xb5 <CJK> + <U63F8> /xfc/xb6 <CJK> +-<UE18F> /xfc/xb7 <CJK> ++<U0002138E> /xfc/xb7 <CJK> + <U000217FC> /xfc/xb8 <CJK> + <U6F8A> /xfc/xba <CJK> + <U00022E36> /xfc/xbb <CJK> +@@ -17963,7 +18271,7 @@ CHARMAP + <U6667> /xfc/xdf <CJK> + <U000251E6> /xfc/xe0 <CJK> + <U6673> /xfc/xe1 <CJK> +-<UE1BB> /xfc/xe3 <CJK> ++<U00021E3D> /xfc/xe3 <CJK> + <U00023231> /xfc/xe4 <CJK> + <U000285F4> /xfc/xe5 <CJK> + <U000231C8> /xfc/xe6 <CJK> +@@ -17979,8 +18287,8 @@ CHARMAP + <U000237C2> /xfc/xf0 <CJK> + <U6767> /xfc/xf2 <CJK> + <U6762> /xfc/xf3 <CJK> +-<UE1CC> /xfc/xf4 <CJK> +-<UE1CD> /xfc/xf5 <CJK> ++<U000241CD> /xfc/xf4 <CJK> ++<U000290ED> /xfc/xf5 <CJK> + <U67D7> /xfc/xf6 <CJK> + <U44E9> /xfc/xf7 <CJK> + <U6822> /xfc/xf8 <CJK> +@@ -17990,7 +18298,7 @@ CHARMAP + <U000233E6> /xfc/xfc <CJK> + <U00026DA0> /xfc/xfd <CJK> + <U685D> /xfc/xfe <CJK> +-<UE1D7> /xfd/x40 <CJK> ++<U0002346F> /xfd/x40 <CJK> + <U69E1> /xfd/x41 <CJK> + <U6A0B> /xfd/x42 <CJK> + <U00028ADF> /xfd/x43 <CJK> +@@ -18014,10 +18322,10 @@ CHARMAP + <U8363> /xfd/x55 <CJK> + <U5090> /xfd/x56 <CJK> + <U69F9> /xfd/x57 <CJK> +-<UE1EF> /xfd/x58 <CJK> ++<U00023659> /xfd/x58 <CJK> + <U0002212A> /xfd/x59 <CJK> + <U6A45> /xfd/x5a <CJK> +-<UE1F2> /xfd/x5b <CJK> ++<U00023703> /xfd/x5b <CJK> + <U6A9D> /xfd/x5c <CJK> + <U3BF3> /xfd/x5d <CJK> + <U67B1> /xfd/x5e <CJK> +@@ -18025,15 +18333,15 @@ CHARMAP + <U0002919C> /xfd/x60 <CJK> + <U3C0D> /xfd/x61 <CJK> + <U6B1D> /xfd/x62 <CJK> +-<UE1FA> /xfd/x63 <CJK> ++<U00020923> /xfd/x63 <CJK> + <U60DE> /xfd/x64 <CJK> + <U6B35> /xfd/x65 <CJK> + <U6B74> /xfd/x66 <CJK> +-<UE1FE> /xfd/x67 <CJK> ++<U000227CD> /xfd/x67 <CJK> + <U6EB5> /xfd/x68 <CJK> + <U00023ADB> /xfd/x69 <CJK> + <U000203B5> /xfd/x6a <CJK> +-<UE202> /xfd/x6b <CJK> ++<U00021958> /xfd/x6b <CJK> + <U3740> /xfd/x6c <CJK> + <U5421> /xfd/x6d <CJK> + <U00023B5A> /xfd/x6e <CJK> +@@ -18042,7 +18350,7 @@ CHARMAP + <U6BDC> /xfd/x71 <CJK> + <U6C37> /xfd/x72 <CJK> + <U0002248B> /xfd/x73 <CJK> +-<UE20B> /xfd/x74 <CJK> ++<U000248F1> /xfd/x74 <CJK> + <U00026B51> /xfd/x75 <CJK> + <U6C5A> /xfd/x76 <CJK> + <U8226> /xfd/x77 <CJK> +@@ -18056,10 +18364,10 @@ CHARMAP + <U00023CC9> /xfd/xa1 <CJK> + <U36E5> /xfd/xa2 <CJK> + <U3CEB> /xfd/xa3 <CJK> +-<UE219> /xfd/xa4 <CJK> ++<U00020D32> /xfd/xa4 <CJK> + <U9B83> /xfd/xa5 <CJK> + <U000231F9> /xfd/xa6 <CJK> +-<UE21C> /xfd/xa7 <CJK> ++<U00022491> /xfd/xa7 <CJK> + <U7F8F> /xfd/xa8 <CJK> + <U6837> /xfd/xa9 <CJK> + <U00026D25> /xfd/xaa <CJK> +@@ -18070,7 +18378,7 @@ CHARMAP + <U6E7C> /xfd/xaf <CJK> + <U6F04> /xfd/xb0 <CJK> + <U0002497F> /xfd/xb1 <CJK> +-<UE227> /xfd/xb2 <CJK> ++<U00024085> /xfd/xb2 <CJK> + <U00026E72> /xfd/xb3 <CJK> + <U8533> /xfd/xb4 <CJK> + <U00026F74> /xfd/xb5 <CJK> +@@ -18097,16 +18405,16 @@ CHARMAP + <U6F5C> /xfd/xcd <CJK> + <U3D4E> /xfd/xce <CJK> + <U6F74> /xfd/xcf <CJK> +-<UE245> /xfd/xd0 <CJK> ++<U00029170> /xfd/xd0 <CJK> + <U3D3B> /xfd/xd1 <CJK> + <U6F9F> /xfd/xd2 <CJK> + <U00024144> /xfd/xd3 <CJK> + <U6FD3> /xfd/xd4 <CJK> +-<UE24A> /xfd/xd5 <CJK> ++<U00024091> /xfd/xd5 <CJK> + <U00024155> /xfd/xd6 <CJK> + <U00024039> /xfd/xd7 <CJK> +-<U00025D20> /xfd/xd8 <CJK> +-<UE24E> /xfd/xd9 <CJK> ++<U00023FF0> /xfd/xd8 <CJK> ++<U00023FB4> /xfd/xd9 <CJK> + <U0002413F> /xfd/xda <CJK> + <U51DF> /xfd/xdb <CJK> + <U00024156> /xfd/xdc <CJK> +@@ -18134,7 +18442,7 @@ CHARMAP + <U00024365> /xfd/xf3 <CJK> + <U714F> /xfd/xf4 <CJK> + <U9362> /xfd/xf5 <CJK> +-<UE26B> /xfd/xf6 <CJK> ++<U000242C1> /xfd/xf6 <CJK> + <U712C> /xfd/xf7 <CJK> + <U0002445A> /xfd/xf8 <CJK> + <U00024A27> /xfd/xf9 <CJK> +@@ -18149,7 +18457,7 @@ CHARMAP + <U9443> /xfe/x43 <CJK> + <U7224> /xfe/x44 <CJK> + <U9341> /xfe/x45 <CJK> +-<UE27A> /xfe/x46 <CJK> ++<U00025605> /xfe/x46 <CJK> + <U722E> /xfe/x47 <CJK> + <U7240> /xfe/x48 <CJK> + <U00024974> /xfe/x49 <CJK> +@@ -18157,7 +18465,7 @@ CHARMAP + <U7255> /xfe/x4b <CJK> + <U7257> /xfe/x4c <CJK> + <U3E55> /xfe/x4d <CJK> +-<UE282> /xfe/x4e <CJK> ++<U00023044> /xfe/x4e <CJK> + <U680D> /xfe/x4f <CJK> + <U6F3D> /xfe/x50 <CJK> + <U7282> /xfe/x51 <CJK> +@@ -18170,7 +18478,7 @@ CHARMAP + <U732E> /xfe/x59 <CJK> + <U73CF> /xfe/x5a <CJK> + <U73AA> /xfe/x5b <CJK> +-<UE290> /xfe/x5c <CJK> ++<U00020C3A> /xfe/x5c <CJK> + <U00026A2E> /xfe/x5d <CJK> + <U73C9> /xfe/x5e <CJK> + <U7449> /xfe/x5f <CJK> +@@ -18181,13 +18489,13 @@ CHARMAP + <U36C5> /xfe/x64 <CJK> + <U000249B7> /xfe/x65 <CJK> + <U0002498D> /xfe/x66 <CJK> +-<UE29B> /xfe/x67 <CJK> ++<U000249FB> /xfe/x67 <CJK> + <U73F7> /xfe/x68 <CJK> + <U7415> /xfe/x69 <CJK> + <U6903> /xfe/x6a <CJK> + <U00024A26> /xfe/x6b <CJK> + <U7439> /xfe/x6c <CJK> +-<UE2A1> /xfe/x6d <CJK> ++<U000205C3> /xfe/x6d <CJK> + <U3ED7> /xfe/x6e <CJK> + <U000228AD> /xfe/x70 <CJK> + <U7460> /xfe/x71 <CJK> +@@ -18203,12 +18511,12 @@ CHARMAP + <U6A2C> /xfe/x7b <CJK> + <U7482> /xfe/x7c <CJK> + <U4953> /xfe/x7d <CJK> +-<UE2B2> /xfe/x7e <CJK> ++<U00024A8C> /xfe/x7e <CJK> + <U0002415F> /xfe/xa1 <CJK> + <U00024A79> /xfe/xa2 <CJK> + <U00028B8F> /xfe/xa3 <CJK> + <U5B46> /xfe/xa4 <CJK> +-<UE2B7> /xfe/xa5 <CJK> ++<U00028C03> /xfe/xa5 <CJK> + <U0002189E> /xfe/xa6 <CJK> + <U74C8> /xfe/xa7 <CJK> + <U00021988> /xfe/xa8 <CJK> +@@ -18217,7 +18525,7 @@ CHARMAP + <U00028ED9> /xfe/xac <CJK> + <U00021A4B> /xfe/xad <CJK> + <U5BD7> /xfe/xae <CJK> +-<UE2C1> /xfe/xaf <CJK> ++<U00028EAC> /xfe/xaf <CJK> + <U9385> /xfe/xb0 <CJK> + <U754D> /xfe/xb1 <CJK> + <U754A> /xfe/xb2 <CJK> +@@ -18225,7 +18533,7 @@ CHARMAP + <U756E> /xfe/xb4 <CJK> + <U00024F82> /xfe/xb5 <CJK> + <U3F04> /xfe/xb6 <CJK> +-<UE2C9> /xfe/xb7 <CJK> ++<U00024D13> /xfe/xb7 <CJK> + <U758E> /xfe/xb8 <CJK> + <U745D> /xfe/xb9 <CJK> + <U759E> /xfe/xba <CJK> +@@ -18236,7 +18544,7 @@ CHARMAP + <U764F> /xfe/xbf <CJK> + <U766F> /xfe/xc0 <CJK> + <U7676> /xfe/xc1 <CJK> +-<UE2D4> /xfe/xc2 <CJK> ++<U000263F5> /xfe/xc2 <CJK> + <U7690> /xfe/xc3 <CJK> + <U81EF> /xfe/xc4 <CJK> + <U37F8> /xfe/xc5 <CJK> +@@ -18250,7 +18558,7 @@ CHARMAP + <U8462> /xfe/xcd <CJK> + <U0002509D> /xfe/xce <CJK> + <U0002517D> /xfe/xcf <CJK> +-<UE2E2> /xfe/xd0 <CJK> ++<U00021E1C> /xfe/xd0 <CJK> + <U771E> /xfe/xd1 <CJK> + <U7726> /xfe/xd2 <CJK> + <U7740> /xfe/xd3 <CJK> +@@ -18259,12 +18567,12 @@ CHARMAP + <U7758> /xfe/xd6 <CJK> + <U000232AC> /xfe/xd7 <CJK> + <U77AF> /xfe/xd8 <CJK> +-<UE2EB> /xfe/xd9 <CJK> +-<UE2EC> /xfe/xda <CJK> ++<U00028964> /xfe/xd9 <CJK> ++<U00028968> /xfe/xda <CJK> + <U000216C1> /xfe/xdb <CJK> + <U77F4> /xfe/xdc <CJK> +-<UE2F0> /xfe/xde <CJK> +-<UE2F1> /xfe/xdf <CJK> ++<U00021376> /xfe/xde <CJK> ++<U00024A12> /xfe/xdf <CJK> + <U68CA> /xfe/xe0 <CJK> + <U78AF> /xfe/xe1 <CJK> + <U78C7> /xfe/xe2 <CJK> +@@ -18279,7 +18587,7 @@ CHARMAP + <U8FB8> /xfe/xeb <CJK> + <U8884> /xfe/xec <CJK> + <U00028B2B> /xfe/xed <CJK> +-<UE300> /xfe/xee <CJK> ++<U00026083> /xfe/xee <CJK> + <U0002261C> /xfe/xef <CJK> + <U7986> /xfe/xf0 <CJK> + <U8900> /xfe/xf1 <CJK> +@@ -18299,15 +18607,11 @@ CHARMAP + END CHARMAP + + WIDTH +-<UF303>...<UF318> 2 +-<UF325> 2 +-<UF327> 2 +-<UF344> 2 +-<UF346> 2 +-<UF34A>...<UFF5A> 2 ++<U43F0>...<U31CE> 2 ++<U0002A3A9>...<UFF5A> 2 + <U4E00>...<U8FB5> 2 + <U30FD>...<U30F6> 2 +-<UF7E5>...<U2EE3> 2 ++<U31CF>...<U2EE3> 2 + <U7881>...<U256F> 2 +-<UE003>...<U79D4> 2 ++<U4E42>...<U79D4> 2 + END WIDTH diff --git a/SOURCES/glibc-rh1213603.patch b/SOURCES/glibc-rh1213603.patch new file mode 100644 index 0000000..3b14dbd --- /dev/null +++ b/SOURCES/glibc-rh1213603.patch @@ -0,0 +1,41 @@ +commit 31d0a4fa646db8b8c97ce24e0ec0a7b73de4fca1 +Author: Florian Weimer <fweimer@redhat.com> +Date: Sat Jun 11 12:12:56 2016 +0200 + + nss_db: Fix initialization of iteration position [BZ #20237] + + When get*ent is called without a preceding set*ent, we need + to set the initial iteration position in get*ent. + + Reproducer: Add “services: db files” to /etc/nsswitch.conf, then run + “perl -e getservent”. It will segfault before this change, and exit + silently after it. + +Index: b/nss/nss_db/db-XXX.c +=================================================================== +--- a/nss/nss_db/db-XXX.c ++++ b/nss/nss_db/db-XXX.c +@@ -76,7 +76,7 @@ CONCAT(_nss_db_set,ENTNAME) (int stayope + keep_db |= stayopen; + + /* Reset the sequential index. */ +- entidx = (const char *) state.header + state.header->valstroffset; ++ entidx = NULL; + } + + __libc_lock_unlock (lock); +@@ -249,8 +249,14 @@ CONCAT(_nss_db_get,ENTNAME_r) (struct ST + H_ERRNO_SET (NETDB_INTERNAL); + goto out; + } ++ entidx = NULL; + } + ++ /* Start from the beginning if freshly initialized or reset ++ requested by set*ent. */ ++ if (entidx == NULL) ++ entidx = (const char *) state.header + state.header->valstroffset; ++ + status = NSS_STATUS_UNAVAIL; + if (state.header != MAP_FAILED) + { diff --git a/SOURCES/glibc-rh1216246.patch b/SOURCES/glibc-rh1216246.patch new file mode 100644 index 0000000..0dd0bc4 --- /dev/null +++ b/SOURCES/glibc-rh1216246.patch @@ -0,0 +1,69 @@ +commit 8b59c73386ddb64331ee03c29925a18dae547733 +Author: Carlos O'Donell <carlos@systemhalted.org> +Date: Wed Jul 8 02:42:11 2015 -0400 + + Fix ruserok scalability with large ~/.rhosts file. + + Fixes bug 18557. + +diff --git glibc-2.17-c758a686/inet/rcmd.c glibc-2.17-c758a686/inet/rcmd.c +index 98b3735..91623b0 100644 +--- glibc-2.17-c758a686/inet/rcmd.c ++++ glibc-2.17-c758a686/inet/rcmd.c +@@ -809,29 +809,38 @@ __validuser2_sa(hostf, ra, ralen, luser, ruser, rhost) + *p = '\0'; /* <nul> terminate username (+host?) */ + + /* buf -> host(?) ; user -> username(?) */ ++ if (*buf == '\0') ++ break; ++ if (*user == '\0') ++ user = luser; ++ ++ /* First check the user part. This is an optimization, since ++ one should always check the host first in order to detect ++ negative host checks (which we check for later). */ ++ ucheck = __icheckuser (user, ruser); ++ ++ /* Either we found the user, or we didn't and this is a ++ negative host check. We must do the negative host lookup ++ in order to preserve the semantics of stopping on this line ++ before processing others. */ ++ if (ucheck != 0 || *buf == '-') { ++ ++ /* Next check host part */ ++ hcheck = __checkhost_sa (ra, ralen, buf, rhost); ++ ++ /* Negative '-host user(?)' match? */ ++ if (hcheck < 0) ++ break; + +- /* First check host part */ +- hcheck = __checkhost_sa (ra, ralen, buf, rhost); +- +- if (hcheck < 0) +- break; +- +- if (hcheck) { +- /* Then check user part */ +- if (! (*user)) +- user = luser; +- +- ucheck = __icheckuser (user, ruser); +- +- /* Positive 'host user' match? */ +- if (ucheck > 0) { ++ /* Positive 'host user' match? */ ++ if (hcheck > 0 && ucheck > 0) { + retval = 0; + break; + } + +- /* Negative 'host -user' match? */ +- if (ucheck < 0) +- break; ++ /* Negative 'host -user' match? */ ++ if (hcheck > 0 && ucheck < 0) ++ break; + + /* Neither, go on looking for match */ + } diff --git a/SOURCES/glibc-rh1219891.patch b/SOURCES/glibc-rh1219891.patch new file mode 100644 index 0000000..8e1d986 --- /dev/null +++ b/SOURCES/glibc-rh1219891.patch @@ -0,0 +1,117 @@ +commit e83d72988d89378e7c70a1b7ba0b450a699ea70a +Author: David S. Miller <davem@davemloft.net> +Date: Wed Jan 9 23:04:32 2013 -0800 + + Sync netinet/tcp.h with upstream Linux kernel. + + [BZ# 15003] + * sysdeps/gnu/netinet/tcp.h (TCP_COOKIE_TRANSACTIONS, + TCP_THIN_LINEAR_TIMEOUTS, TCP_THIN_DUPACK, TCP_USER_TIMEOUT, + TCP_REPAIR, TCP_REPAIR_QUEUE, TCP_QUEUE_SEQ, TCP_REPAIR_OPTIONS, + TCP_FASTOPEN): Define. + (tcp_repair_opt): New structure. + (TCP_NO_QUEUE, TCP_RECV_QUEUE, TCP_SEND_QUEUE, TCP_QUEUES_NR): New + enum values. + (TCP_COOKIE_MIN, TCP_COOKIE_MAX, TCP_COOKIE_PAIR_SIZE, + TCP_COOKIE_IN_ALWAYS, TCP_COOKIE_OUT_NEVER, TCP_S_DATA_IN, + TCP_S_DATA_OUT, TCP_MSS_DEFAULT, TCP_MSS_DESIRED): Define. + (tcp_cookie_transactions): New structure. + +diff --git glibc-2.17-c758a686/sysdeps/gnu/netinet/tcp.h glibc-2.17-c758a686/sysdeps/gnu/netinet/tcp.h +index 278fc9d..b62a696 100644 +--- glibc-2.17-c758a686/sysdeps/gnu/netinet/tcp.h ++++ glibc-2.17-c758a686/sysdeps/gnu/netinet/tcp.h +@@ -37,20 +37,29 @@ + /* + * User-settable options (used with setsockopt). + */ +-#define TCP_NODELAY 1 /* Don't delay send to coalesce packets */ +-#define TCP_MAXSEG 2 /* Set maximum segment size */ +-#define TCP_CORK 3 /* Control sending of partial frames */ +-#define TCP_KEEPIDLE 4 /* Start keeplives after this period */ +-#define TCP_KEEPINTVL 5 /* Interval between keepalives */ +-#define TCP_KEEPCNT 6 /* Number of keepalives before death */ +-#define TCP_SYNCNT 7 /* Number of SYN retransmits */ +-#define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */ +-#define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */ +-#define TCP_WINDOW_CLAMP 10 /* Bound advertised window */ +-#define TCP_INFO 11 /* Information about this connection. */ +-#define TCP_QUICKACK 12 /* Bock/reenable quick ACKs. */ +-#define TCP_CONGESTION 13 /* Congestion control algorithm. */ +-#define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ ++#define TCP_NODELAY 1 /* Don't delay send to coalesce packets */ ++#define TCP_MAXSEG 2 /* Set maximum segment size */ ++#define TCP_CORK 3 /* Control sending of partial frames */ ++#define TCP_KEEPIDLE 4 /* Start keeplives after this period */ ++#define TCP_KEEPINTVL 5 /* Interval between keepalives */ ++#define TCP_KEEPCNT 6 /* Number of keepalives before death */ ++#define TCP_SYNCNT 7 /* Number of SYN retransmits */ ++#define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */ ++#define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */ ++#define TCP_WINDOW_CLAMP 10 /* Bound advertised window */ ++#define TCP_INFO 11 /* Information about this connection. */ ++#define TCP_QUICKACK 12 /* Bock/reenable quick ACKs. */ ++#define TCP_CONGESTION 13 /* Congestion control algorithm. */ ++#define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ ++#define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ ++#define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ ++#define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ ++#define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ ++#define TCP_REPAIR 19 /* TCP sock is under repair right now */ ++#define TCP_REPAIR_QUEUE 20 /* Set TCP queue to repair */ ++#define TCP_QUEUE_SEQ 21 /* Set sequence number of repaired queue. */ ++#define TCP_REPAIR_OPTIONS 22 /* Repair TCP connection options */ ++#define TCP_FASTOPEN 23 /* Enable FastOpen on listeners */ + + #ifdef __USE_MISC + # include <sys/types.h> +@@ -243,6 +252,49 @@ struct tcp_md5sig + u_int8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* Key (binary). */ + }; + ++/* For socket repair options. */ ++struct tcp_repair_opt ++{ ++ u_int32_t opt_code; ++ u_int32_t opt_val; ++}; ++ ++/* Queue to repair, for TCP_REPAIR_QUEUE. */ ++enum ++{ ++ TCP_NO_QUEUE, ++ TCP_RECV_QUEUE, ++ TCP_SEND_QUEUE, ++ TCP_QUEUES_NR, ++}; ++ ++/* For cookie transactions socket options. */ ++#define TCP_COOKIE_MIN 8 /* 64-bits */ ++#define TCP_COOKIE_MAX 16 /* 128-bits */ ++#define TCP_COOKIE_PAIR_SIZE (2*TCP_COOKIE_MAX) ++ ++/* Flags for both getsockopt and setsockopt */ ++#define TCP_COOKIE_IN_ALWAYS (1 << 0) /* Discard SYN without cookie */ ++#define TCP_COOKIE_OUT_NEVER (1 << 1) /* Prohibit outgoing cookies, ++ * supercedes everything. */ ++ ++/* Flags for getsockopt */ ++#define TCP_S_DATA_IN (1 << 2) /* Was data received? */ ++#define TCP_S_DATA_OUT (1 << 3) /* Was data sent? */ ++ ++#define TCP_MSS_DEFAULT 536U /* IPv4 (RFC1122, RFC2581) */ ++#define TCP_MSS_DESIRED 1220U /* IPv6 (tunneled), EDNS0 (RFC3226) */ ++ ++struct tcp_cookie_transactions ++{ ++ u_int16_t tcpct_flags; ++ u_int8_t __tcpct_pad1; ++ u_int8_t tcpct_cookie_desired; ++ u_int16_t tcpct_s_data_desired; ++ u_int16_t tcpct_used; ++ u_int8_t tcpct_value[TCP_MSS_DEFAULT]; ++}; ++ + #endif /* Misc. */ + + #endif /* netinet/tcp.h */ diff --git a/SOURCES/glibc-rh1221046.patch b/SOURCES/glibc-rh1221046.patch new file mode 100644 index 0000000..38a3d59 --- /dev/null +++ b/SOURCES/glibc-rh1221046.patch @@ -0,0 +1,52 @@ +Superseded by this upstream patch: + +commit a06b40cdf5ba0d2ab4f9b4c77d21e45ff284fac7 +Author: Szabolcs Nagy <szabolcs.nagy@arm.com> +Date: Tue May 26 22:27:23 2015 +0530 + + struct stat is not posix conform + +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-rh1227699.patch b/SOURCES/glibc-rh1227699.patch new file mode 100644 index 0000000..1935856 --- /dev/null +++ b/SOURCES/glibc-rh1227699.patch @@ -0,0 +1,33 @@ +# +# This is the original fix for bug 1124987 in Fedora. +# This patch should never go upstream. We are applying it +# in rhel-7.2 as a workaround. +# +# Upstream commit f8aeae347377f3dfa8cbadde057adf1827fb1d44 fixes +# this issue correctly, but reveals other bugs, therefore for now +# this patch is a workaround. +# +diff -urN glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h +--- glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h 2014-08-21 01:00:55.000000000 -0400 ++++ glibc-2.17-c758a686/sysdeps/generic/ldsodefs.h 2014-09-04 19:29:42.929692810 -0400 +@@ -388,8 +388,18 @@ + have to iterate beyond the first element in the slotinfo list. */ + #define TLS_SLOTINFO_SURPLUS (62) + +-/* Number of additional slots in the dtv allocated. */ +-#define DTV_SURPLUS (14) ++/* Number of additional allocated dtv slots. This was initially ++ 14, but problems with python, MESA, and X11's uses of static TLS meant ++ that most distributions were very close to this limit when they loaded ++ dynamically interpreted languages that used graphics. The simplest ++ solution was to roughly double the number of slots. The actual static ++ image space usage was relatively small, for example in MESA you ++ had only two dispatch pointers for a total of 16 bytes. If we hit up ++ against this limit again we should start a campaign with the ++ distributions to coordinate the usage of static TLS. Any user of this ++ resource is effectively coordinating a global resource since this ++ surplus is allocated for each thread at startup. */ ++#define DTV_SURPLUS (32) + + /* Initial dtv of the main thread, not allocated with normal malloc. */ + EXTERN void *_dl_initial_dtv; diff --git a/SOURCES/glibc-rh1228114-1.patch b/SOURCES/glibc-rh1228114-1.patch new file mode 100644 index 0000000..65d539d --- /dev/null +++ b/SOURCES/glibc-rh1228114-1.patch @@ -0,0 +1,234 @@ +commit 89fb6835583088059b8d8987c86caac33e37e5ea +Author: Siddhesh Poyarekar <siddhesh@redhat.com> +Date: Tue Jun 11 11:11:11 2013 +0530 + + Fix symbol definitions for __clock_* functions + + __clock_gettime and other __clock_* functions could result in an extra + PLT reference within libc.so if it actually gets used. None of the + code currently uses them, which is why this probably went unnoticed. + +Index: b/include/time.h +=================================================================== +--- a/include/time.h ++++ b/include/time.h +@@ -21,6 +21,7 @@ libc_hidden_proto (strptime) + + extern __typeof (clock_getres) __clock_getres; + extern __typeof (clock_gettime) __clock_gettime; ++libc_hidden_proto (__clock_gettime) + extern __typeof (clock_settime) __clock_settime; + extern __typeof (clock_nanosleep) __clock_nanosleep; + extern __typeof (clock_getcpuclockid) __clock_getcpuclockid; +Index: b/rt/clock_getcpuclockid.c +=================================================================== +--- a/rt/clock_getcpuclockid.c ++++ b/rt/clock_getcpuclockid.c +@@ -21,7 +21,7 @@ + #include <unistd.h> + + int +-clock_getcpuclockid (pid_t pid, clockid_t *clock_id) ++__clock_getcpuclockid (pid_t pid, clockid_t *clock_id) + { + /* We don't allow any process ID but our own. */ + if (pid != 0 && pid != getpid ()) +@@ -37,4 +37,4 @@ clock_getcpuclockid (pid_t pid, clockid_ + return ENOENT; + #endif + } +-strong_alias (clock_getcpuclockid, __clock_getcpuclockid) ++weak_alias (__clock_getcpuclockid, clock_getcpuclockid) +Index: b/rt/clock_getres.c +=================================================================== +--- a/rt/clock_getres.c ++++ b/rt/clock_getres.c +@@ -21,10 +21,10 @@ + + /* Get resolution of clock. */ + int +-clock_getres (clockid_t clock_id, struct timespec *res) ++__clock_getres (clockid_t clock_id, struct timespec *res) + { + __set_errno (ENOSYS); + return -1; + } +-strong_alias (clock_getres, __clock_getres) ++weak_alias (__clock_getres, clock_getres) + stub_warning (clock_getres) +Index: b/rt/clock_gettime.c +=================================================================== +--- a/rt/clock_gettime.c ++++ b/rt/clock_gettime.c +@@ -21,10 +21,11 @@ + + /* Get current value of CLOCK and store it in TP. */ + int +-clock_gettime (clockid_t clock_id, struct timespec *tp) ++__clock_gettime (clockid_t clock_id, struct timespec *tp) + { + __set_errno (ENOSYS); + return -1; + } +-strong_alias (clock_gettime, __clock_gettime) ++weak_alias (__clock_gettime, clock_gettime) ++libc_hidden_def (__clock_gettime) + stub_warning (clock_gettime) +Index: b/rt/clock_nanosleep.c +=================================================================== +--- a/rt/clock_nanosleep.c ++++ b/rt/clock_nanosleep.c +@@ -20,8 +20,8 @@ + #include <time.h> + + int +-clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, +- struct timespec *rem) ++__clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, ++ struct timespec *rem) + { + if (__builtin_expect (req->tv_nsec, 0) < 0 + || __builtin_expect (req->tv_nsec, 0) >= 1000000000) +@@ -33,5 +33,5 @@ clock_nanosleep (clockid_t clock_id, int + /* Not implemented. */ + return ENOSYS; + } +-strong_alias (clock_nanosleep, __clock_nanosleep) ++weak_alias (__clock_nanosleep, clock_nanosleep) + stub_warning (clock_nanosleep) +Index: b/rt/clock_settime.c +=================================================================== +--- a/rt/clock_settime.c ++++ b/rt/clock_settime.c +@@ -21,10 +21,10 @@ + + /* Set CLOCK to value TP. */ + int +-clock_settime (clockid_t clock_id, const struct timespec *tp) ++__clock_settime (clockid_t clock_id, const struct timespec *tp) + { + __set_errno (ENOSYS); + return -1; + } +-strong_alias (clock_settime, __clock_settime) ++weak_alias (__clock_settime, clock_settime) + stub_warning (clock_settime) +Index: b/sysdeps/posix/clock_getres.c +=================================================================== +--- a/sysdeps/posix/clock_getres.c ++++ b/sysdeps/posix/clock_getres.c +@@ -76,7 +76,7 @@ realtime_getres (struct timespec *res) + + /* Get resolution of clock. */ + int +-clock_getres (clockid_t clock_id, struct timespec *res) ++__clock_getres (clockid_t clock_id, struct timespec *res) + { + int retval = -1; + +@@ -115,4 +115,4 @@ clock_getres (clockid_t clock_id, struct + + return retval; + } +-strong_alias (clock_getres, __clock_getres) ++weak_alias (__clock_getres, clock_getres) +Index: b/sysdeps/unix/clock_gettime.c +=================================================================== +--- a/sysdeps/unix/clock_gettime.c ++++ b/sysdeps/unix/clock_gettime.c +@@ -89,7 +89,7 @@ realtime_gettime (struct timespec *tp) + + /* Get current value of CLOCK and store it in TP. */ + int +-clock_gettime (clockid_t clock_id, struct timespec *tp) ++__clock_gettime (clockid_t clock_id, struct timespec *tp) + { + int retval = -1; + +@@ -132,4 +132,5 @@ clock_gettime (clockid_t clock_id, struc + + return retval; + } +-strong_alias (clock_gettime, __clock_gettime) ++weak_alias (__clock_gettime, clock_gettime) ++libc_hidden_def (__clock_gettime) +Index: b/sysdeps/unix/clock_nanosleep.c +=================================================================== +--- a/sysdeps/unix/clock_nanosleep.c ++++ b/sysdeps/unix/clock_nanosleep.c +@@ -39,8 +39,8 @@ + /* This implementation assumes that these is only a `nanosleep' system + call. So we have to remap all other activities. */ + int +-clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, +- struct timespec *rem) ++__clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, ++ struct timespec *rem) + { + struct timespec now; + +@@ -98,4 +98,4 @@ clock_nanosleep (clockid_t clock_id, int + + return __builtin_expect (nanosleep (req, rem), 0) ? errno : 0; + } +-strong_alias (clock_nanosleep, __clock_nanosleep) ++weak_alias (__clock_nanosleep, clock_nanosleep) +Index: b/sysdeps/unix/clock_settime.c +=================================================================== +--- a/sysdeps/unix/clock_settime.c ++++ b/sysdeps/unix/clock_settime.c +@@ -72,7 +72,7 @@ hp_timing_settime (clockid_t clock_id, c + + /* Set CLOCK to value TP. */ + int +-clock_settime (clockid_t clock_id, const struct timespec *tp) ++__clock_settime (clockid_t clock_id, const struct timespec *tp) + { + int retval; + +@@ -124,4 +124,4 @@ clock_settime (clockid_t clock_id, const + + return retval; + } +-strong_alias (clock_settime, __clock_settime) ++weak_alias (__clock_settime, clock_settime) +Index: b/sysdeps/unix/sysv/linux/clock_getcpuclockid.c +=================================================================== +--- a/sysdeps/unix/sysv/linux/clock_getcpuclockid.c ++++ b/sysdeps/unix/sysv/linux/clock_getcpuclockid.c +@@ -23,7 +23,7 @@ + #include "kernel-posix-cpu-timers.h" + + int +-clock_getcpuclockid (pid_t pid, clockid_t *clock_id) ++__clock_getcpuclockid (pid_t pid, clockid_t *clock_id) + { + /* The clockid_t value is a simple computation from the PID. + But we do a clock_getres call to validate it. */ +@@ -46,4 +46,4 @@ clock_getcpuclockid (pid_t pid, clockid_ + else + return INTERNAL_SYSCALL_ERRNO (r, err); + } +-strong_alias (clock_getcpuclockid, __clock_getcpuclockid) ++weak_alias (__clock_getcpuclockid, clock_getcpuclockid) +Index: b/sysdeps/unix/sysv/linux/clock_nanosleep.c +=================================================================== +--- a/sysdeps/unix/sysv/linux/clock_nanosleep.c ++++ b/sysdeps/unix/sysv/linux/clock_nanosleep.c +@@ -26,8 +26,8 @@ + /* We can simply use the syscall. The CPU clocks are not supported + with this function. */ + int +-clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, +- struct timespec *rem) ++__clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, ++ struct timespec *rem) + { + INTERNAL_SYSCALL_DECL (err); + int r; +@@ -52,4 +52,4 @@ clock_nanosleep (clockid_t clock_id, int + return (INTERNAL_SYSCALL_ERROR_P (r, err) + ? INTERNAL_SYSCALL_ERRNO (r, err) : 0); + } +-strong_alias (clock_nanosleep, __clock_nanosleep) ++weak_alias (__clock_nanosleep, clock_nanosleep) diff --git a/SOURCES/glibc-rh1228114-2.patch b/SOURCES/glibc-rh1228114-2.patch new file mode 100644 index 0000000..f9d1876 --- /dev/null +++ b/SOURCES/glibc-rh1228114-2.patch @@ -0,0 +1,1552 @@ +commit cf0bd2f73bd65beab613865bba567d7787836888 +Author: Florian Weimer <fweimer@redhat.com> +Date: Tue Feb 28 15:28:45 2017 +0100 + + sunrpc: Improvements for UDP client timeout handling [BZ #20257] + + This commit fixes various aspects in the UDP client timeout handling. + Timeouts are now applied in a more consistent fashion. Discarded UDP + packets no longer prevent the timeout from happening at all. + +Index: b/inet/deadline.c +=================================================================== +--- /dev/null ++++ b/inet/deadline.c +@@ -0,0 +1,122 @@ ++/* Computing deadlines for timeouts. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <net-internal.h> ++ ++#include <assert.h> ++#include <limits.h> ++#include <stdio.h> ++#include <stdint.h> ++#include <time.h> ++ ++struct deadline_current_time internal_function ++__deadline_current_time (void) ++{ ++ struct deadline_current_time result; ++ if (__clock_gettime (CLOCK_MONOTONIC, &result.current) != 0) ++ { ++ struct timeval current_tv; ++ if (__gettimeofday (¤t_tv, NULL) == 0) ++ __libc_fatal ("Fatal error: gettimeofday system call failed\n"); ++ result.current.tv_sec = current_tv.tv_sec; ++ result.current.tv_nsec = current_tv.tv_usec * 1000; ++ } ++ assert (result.current.tv_sec >= 0); ++ return result; ++} ++ ++/* A special deadline value for which __deadline_is_infinite is ++ true. */ ++static inline struct deadline ++infinite_deadline (void) ++{ ++ return (struct deadline) { { -1, -1 } }; ++} ++ ++struct deadline internal_function ++__deadline_from_timeval (struct deadline_current_time current, ++ struct timeval tv) ++{ ++ assert (__is_timeval_valid_timeout (tv)); ++ ++ /* Compute second-based deadline. Perform the addition in ++ uintmax_t, which is unsigned, to simply overflow detection. */ ++ uintmax_t sec = current.current.tv_sec; ++ sec += tv.tv_sec; ++ if (sec < (uintmax_t) tv.tv_sec) ++ return infinite_deadline (); ++ ++ /* Compute nanosecond deadline. */ ++ int nsec = current.current.tv_nsec + tv.tv_usec * 1000; ++ if (nsec >= 1000 * 1000 * 1000) ++ { ++ /* Carry nanosecond overflow to seconds. */ ++ nsec -= 1000 * 1000 * 1000; ++ if (sec + 1 < sec) ++ return infinite_deadline (); ++ ++sec; ++ } ++ /* This uses a GCC extension, otherwise these casts for detecting ++ overflow would not be defined. */ ++ if ((time_t) sec < 0 || sec != (uintmax_t) (time_t) sec) ++ return infinite_deadline (); ++ ++ return (struct deadline) { { sec, nsec } }; ++} ++ ++int internal_function ++__deadline_to_ms (struct deadline_current_time current, ++ struct deadline deadline) ++{ ++ if (__deadline_is_infinite (deadline)) ++ return INT_MAX; ++ ++ if (current.current.tv_sec > deadline.absolute.tv_sec ++ || (current.current.tv_sec == deadline.absolute.tv_sec ++ && current.current.tv_nsec >= deadline.absolute.tv_nsec)) ++ return 0; ++ time_t sec = deadline.absolute.tv_sec - current.current.tv_sec; ++ if (sec >= INT_MAX) ++ /* This value will overflow below. */ ++ return INT_MAX; ++ int nsec = deadline.absolute.tv_nsec - current.current.tv_nsec; ++ if (nsec < 0) ++ { ++ /* Borrow from the seconds field. */ ++ assert (sec > 0); ++ --sec; ++ nsec += 1000 * 1000 * 1000; ++ } ++ ++ /* Prepare for rounding up to milliseconds. */ ++ nsec += 999999; ++ if (nsec > 1000 * 1000 * 1000) ++ { ++ assert (sec < INT_MAX); ++ ++sec; ++ nsec -= 1000 * 1000 * 1000; ++ } ++ ++ unsigned int msec = nsec / (1000 * 1000); ++ if (sec > INT_MAX / 1000) ++ return INT_MAX; ++ msec += sec * 1000; ++ if (msec > INT_MAX) ++ return INT_MAX; ++ return msec; ++} +Index: b/inet/tst-deadline.c +=================================================================== +--- /dev/null ++++ b/inet/tst-deadline.c +@@ -0,0 +1,188 @@ ++/* Tests for computing deadlines for timeouts. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <inet/net-internal.h> ++#include <limits.h> ++#include <stdbool.h> ++#include <stdint.h> ++#include <support/check.h> ++ ++/* Find the maximum value which can be represented in a time_t. */ ++static time_t ++time_t_max (void) ++{ ++ _Static_assert (0 > (time_t) -1, "time_t is signed"); ++ uintmax_t current = 1; ++ while (true) ++ { ++ uintmax_t next = current * 2; ++ /* This cannot happen because time_t is signed. */ ++ TEST_VERIFY_EXIT (next > current); ++ ++next; ++ if ((time_t) next < 0 || next != (uintmax_t) (time_t) next) ++ /* Value cannot be represented in time_t. Return the previous ++ value. */ ++ return current; ++ current = next; ++ } ++} ++ ++static int ++do_test (void) ++{ ++ { ++ struct deadline_current_time current_time = __deadline_current_time (); ++ TEST_VERIFY (current_time.current.tv_sec >= 0); ++ current_time = __deadline_current_time (); ++ /* Due to CLOCK_MONOTONIC, either seconds or nanoseconds are ++ greater than zero. This is also true for the gettimeofday ++ fallback. */ ++ TEST_VERIFY (current_time.current.tv_sec >= 0); ++ TEST_VERIFY (current_time.current.tv_sec > 0 ++ || current_time.current.tv_nsec > 0); ++ } ++ ++ /* Check basic computations of deadlines. */ ++ struct deadline_current_time current_time = { { 1, 123456789 } }; ++ struct deadline deadline = __deadline_from_timeval ++ (current_time, (struct timeval) { 0, 1 }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 1); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 123457789); ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1); ++ ++ deadline = __deadline_from_timeval ++ (current_time, ((struct timeval) { 0, 2 })); ++ TEST_VERIFY (deadline.absolute.tv_sec == 1); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 123458789); ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1); ++ ++ deadline = __deadline_from_timeval ++ (current_time, ((struct timeval) { 1, 0 })); ++ TEST_VERIFY (deadline.absolute.tv_sec == 2); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 123456789); ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000); ++ ++ /* Check if timeouts are correctly rounded up to the next ++ millisecond. */ ++ for (int i = 0; i < 999999; ++i) ++ { ++ ++current_time.current.tv_nsec; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000); ++ } ++ ++ /* A full millisecond has elapsed, so the time to the deadline is ++ now less than 1000. */ ++ ++current_time.current.tv_nsec; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 999); ++ ++ /* Check __deadline_to_ms carry-over. */ ++ current_time = (struct deadline_current_time) { { 9, 123456789 } }; ++ deadline = (struct deadline) { { 10, 122456789 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 999); ++ deadline = (struct deadline) { { 10, 122456790 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000); ++ deadline = (struct deadline) { { 10, 123456788 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000); ++ deadline = (struct deadline) { { 10, 123456789 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000); ++ ++ /* Check __deadline_to_ms overflow. */ ++ deadline = (struct deadline) { { INT_MAX - 1, 1 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == INT_MAX); ++ ++ /* Check __deadline_to_ms for elapsed deadlines. */ ++ current_time = (struct deadline_current_time) { { 9, 123456789 } }; ++ deadline.absolute = current_time.current; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0); ++ current_time = (struct deadline_current_time) { { 9, 123456790 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0); ++ current_time = (struct deadline_current_time) { { 10, 0 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0); ++ current_time = (struct deadline_current_time) { { 10, 123456788 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0); ++ current_time = (struct deadline_current_time) { { 10, 123456789 } }; ++ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0); ++ ++ /* Check carry-over in __deadline_from_timeval. */ ++ current_time = (struct deadline_current_time) { { 9, 998000001 } }; ++ for (int i = 0; i < 2000; ++i) ++ { ++ deadline = __deadline_from_timeval ++ (current_time, (struct timeval) { 1, i }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 10); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 998000001 + i * 1000); ++ } ++ for (int i = 2000; i < 3000; ++i) ++ { ++ deadline = __deadline_from_timeval ++ (current_time, (struct timeval) { 2, i }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 12); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 1 + (i - 2000) * 1000); ++ } ++ ++ /* Check infinite deadlines. */ ++ deadline = __deadline_from_timeval ++ ((struct deadline_current_time) { { 0, 1000 * 1000 * 1000 - 1000 } }, ++ (struct timeval) { time_t_max (), 1 }); ++ TEST_VERIFY (__deadline_is_infinite (deadline)); ++ deadline = __deadline_from_timeval ++ ((struct deadline_current_time) { { 0, 1000 * 1000 * 1000 - 1001 } }, ++ (struct timeval) { time_t_max (), 1 }); ++ TEST_VERIFY (!__deadline_is_infinite (deadline)); ++ deadline = __deadline_from_timeval ++ ((struct deadline_current_time) ++ { { time_t_max (), 1000 * 1000 * 1000 - 1000 } }, ++ (struct timeval) { 0, 1 }); ++ TEST_VERIFY (__deadline_is_infinite (deadline)); ++ deadline = __deadline_from_timeval ++ ((struct deadline_current_time) ++ { { time_t_max () / 2 + 1, 0 } }, ++ (struct timeval) { time_t_max () / 2 + 1, 0 }); ++ TEST_VERIFY (__deadline_is_infinite (deadline)); ++ ++ /* Check __deadline_first behavior. */ ++ deadline = __deadline_first ++ ((struct deadline) { { 1, 2 } }, ++ (struct deadline) { { 1, 3 } }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 1); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 2); ++ deadline = __deadline_first ++ ((struct deadline) { { 1, 3 } }, ++ (struct deadline) { { 1, 2 } }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 1); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 2); ++ deadline = __deadline_first ++ ((struct deadline) { { 1, 2 } }, ++ (struct deadline) { { 2, 1 } }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 1); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 2); ++ deadline = __deadline_first ++ ((struct deadline) { { 1, 2 } }, ++ (struct deadline) { { 2, 4 } }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 1); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 2); ++ deadline = __deadline_first ++ ((struct deadline) { { 2, 4 } }, ++ (struct deadline) { { 1, 2 } }); ++ TEST_VERIFY (deadline.absolute.tv_sec == 1); ++ TEST_VERIFY (deadline.absolute.tv_nsec == 2); ++ ++ return 0; ++} ++ ++#include <support/test-driver.c> +Index: b/sunrpc/Makefile +=================================================================== +--- a/sunrpc/Makefile ++++ b/sunrpc/Makefile +@@ -96,11 +96,13 @@ others += rpcgen + + all: # Make this the default target; it will be defined in Rules. + +-tests = tst-xdrmem tst-xdrmem2 ++tests = tst-xdrmem tst-xdrmem2 tst-udp-timeout \ ++ tst-udp-nonblocking + xtests := tst-getmyaddr + + ifeq ($(have-thread-library),yes) + xtests += thrsvc ++tests += tst-udp-garbage + endif + + headers += $(rpcsvc:%.x=rpcsvc/%.h) +@@ -225,3 +227,8 @@ endif + endif + + $(objpfx)thrsvc: $(common-objpfx)linkobj/libc.so $(shared-thread-library) ++ ++$(objpfx)tst-udp-timeout: $(common-objpfx)linkobj/libc.so ++$(objpfx)tst-udp-nonblocking: $(common-objpfx)linkobj/libc.so ++$(objpfx)tst-udp-garbage: \ ++ $(common-objpfx)linkobj/libc.so $(shared-thread-library) +Index: b/sunrpc/clnt_udp.c +=================================================================== +--- a/sunrpc/clnt_udp.c ++++ b/sunrpc/clnt_udp.c +@@ -54,6 +54,7 @@ + #endif + + #include <kernel-features.h> ++#include <inet/net-internal.h> + + extern u_long _create_xid (void); + +@@ -79,7 +80,9 @@ static const struct clnt_ops udp_ops = + }; + + /* +- * Private data kept per client handle ++ * Private data kept per client handle. This private struct is ++ * unfortunately part of the ABI; ypbind contains a copy of it and ++ * accesses it through CLIENT::cl_private field. + */ + struct cu_data + { +@@ -309,28 +312,38 @@ clntudp_call (cl, proc, xargs, argsp, xr + int inlen; + socklen_t fromlen; + struct pollfd fd; +- int milliseconds = (cu->cu_wait.tv_sec * 1000) + +- (cu->cu_wait.tv_usec / 1000); + struct sockaddr_in from; + struct rpc_msg reply_msg; + XDR reply_xdrs; +- struct timeval time_waited; + bool_t ok; + int nrefreshes = 2; /* number of times to refresh cred */ +- struct timeval timeout; + int anyup; /* any network interface up */ + +- if (cu->cu_total.tv_usec == -1) +- { +- timeout = utimeout; /* use supplied timeout */ +- } +- else +- { +- timeout = cu->cu_total; /* use default timeout */ +- } ++ struct deadline_current_time current_time = __deadline_current_time (); ++ struct deadline total_deadline; /* Determined once by overall timeout. */ ++ struct deadline response_deadline; /* Determined anew for each query. */ ++ ++ /* Choose the timeout value. For non-sending usage (xargs == NULL), ++ the total deadline does not matter, only cu->cu_wait is used ++ below. */ ++ if (xargs != NULL) ++ { ++ struct timeval tv; ++ if (cu->cu_total.tv_usec == -1) ++ /* Use supplied timeout. */ ++ tv = utimeout; ++ else ++ /* Use default timeout. */ ++ tv = cu->cu_total; ++ if (!__is_timeval_valid_timeout (tv)) ++ return (cu->cu_error.re_status = RPC_TIMEDOUT); ++ total_deadline = __deadline_from_timeval (current_time, tv); ++ } ++ ++ /* Guard against bad timeout specification. */ ++ if (!__is_timeval_valid_timeout (cu->cu_wait)) ++ return (cu->cu_error.re_status = RPC_TIMEDOUT); + +- time_waited.tv_sec = 0; +- time_waited.tv_usec = 0; + call_again: + xdrs = &(cu->cu_outxdrs); + if (xargs == NULL) +@@ -356,27 +369,46 @@ send_again: + return (cu->cu_error.re_status = RPC_CANTSEND); + } + +- /* +- * Hack to provide rpc-based message passing +- */ +- if (timeout.tv_sec == 0 && timeout.tv_usec == 0) +- { +- return (cu->cu_error.re_status = RPC_TIMEDOUT); +- } ++ /* sendto may have blocked, so recompute the current time. */ ++ current_time = __deadline_current_time (); + get_reply: +- /* +- * sub-optimal code appears here because we have +- * some clock time to spare while the packets are in flight. +- * (We assume that this is actually only executed once.) +- */ ++ response_deadline = __deadline_from_timeval (current_time, cu->cu_wait); ++ + reply_msg.acpted_rply.ar_verf = _null_auth; + reply_msg.acpted_rply.ar_results.where = resultsp; + reply_msg.acpted_rply.ar_results.proc = xresults; + fd.fd = cu->cu_sock; + fd.events = POLLIN; + anyup = 0; ++ ++ /* Per-response retry loop. current_time must be up-to-date at the ++ top of the loop. */ + for (;;) + { ++ int milliseconds; ++ if (xargs != NULL) ++ { ++ if (__deadline_elapsed (current_time, total_deadline)) ++ /* Overall timeout expired. */ ++ return (cu->cu_error.re_status = RPC_TIMEDOUT); ++ milliseconds = __deadline_to_ms ++ (current_time, __deadline_first (total_deadline, ++ response_deadline)); ++ if (milliseconds == 0) ++ /* Per-query timeout expired. */ ++ goto send_again; ++ } ++ else ++ { ++ /* xatgs == NULL. Collect a response without sending a ++ query. In this mode, we need to ignore the total ++ deadline. */ ++ milliseconds = __deadline_to_ms (current_time, response_deadline); ++ if (milliseconds == 0) ++ /* Cannot send again, so bail out. */ ++ return (cu->cu_error.re_status = RPC_CANTSEND); ++ } ++ + switch (__poll (&fd, 1, milliseconds)) + { + +@@ -387,27 +419,10 @@ send_again: + if (!anyup) + return (cu->cu_error.re_status = RPC_CANTRECV); + } +- +- time_waited.tv_sec += cu->cu_wait.tv_sec; +- time_waited.tv_usec += cu->cu_wait.tv_usec; +- while (time_waited.tv_usec >= 1000000) +- { +- time_waited.tv_sec++; +- time_waited.tv_usec -= 1000000; +- } +- if ((time_waited.tv_sec < timeout.tv_sec) || +- ((time_waited.tv_sec == timeout.tv_sec) && +- (time_waited.tv_usec < timeout.tv_usec))) +- goto send_again; +- return (cu->cu_error.re_status = RPC_TIMEDOUT); +- +- /* +- * buggy in other cases because time_waited is not being +- * updated. +- */ ++ goto next_response; + case -1: + if (errno == EINTR) +- continue; ++ goto next_response; + cu->cu_error.re_errno = errno; + return (cu->cu_error.re_status = RPC_CANTRECV); + } +@@ -463,20 +478,22 @@ send_again: + if (inlen < 0) + { + if (errno == EWOULDBLOCK) +- continue; ++ goto next_response; + cu->cu_error.re_errno = errno; + return (cu->cu_error.re_status = RPC_CANTRECV); + } +- if (inlen < 4) +- continue; ++ /* Accept the response if the packet is sufficiently long and ++ the transaction ID matches the query (if available). */ ++ if (inlen >= 4 ++ && (xargs == NULL ++ || memcmp (cu->cu_inbuf, cu->cu_outbuf, ++ sizeof (u_int32_t)) == 0)) ++ break; + +- /* see if reply transaction id matches sent id. +- Don't do this if we only wait for a replay */ +- if (xargs != NULL +- && memcmp (cu->cu_inbuf, cu->cu_outbuf, sizeof (u_int32_t)) != 0) +- continue; +- /* we now assume we have the proper reply */ +- break; ++ next_response: ++ /* Update the current time because poll and recvmsg waited for ++ an unknown time. */ ++ current_time = __deadline_current_time (); + } + + /* +Index: b/sunrpc/tst-udp-garbage.c +=================================================================== +--- /dev/null ++++ b/sunrpc/tst-udp-garbage.c +@@ -0,0 +1,104 @@ ++/* Test that garbage packets do not affect timeout handling. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <netinet/in.h> ++#include <rpc/clnt.h> ++#include <rpc/svc.h> ++#include <stdbool.h> ++#include <support/check.h> ++#include <support/namespace.h> ++#include <support/xsocket.h> ++#include <support/xthread.h> ++#include <sys/socket.h> ++#include <unistd.h> ++ ++/* Descriptor for the server UDP socket. */ ++static int server_fd; ++ ++static void * ++garbage_sender_thread (void *unused) ++{ ++ while (true) ++ { ++ struct sockaddr_storage sa; ++ socklen_t salen = sizeof (sa); ++ char buf[1]; ++ if (recvfrom (server_fd, buf, sizeof (buf), 0, ++ (struct sockaddr *) &sa, &salen) < 0) ++ FAIL_EXIT1 ("recvfrom: %m"); ++ ++ /* Send garbage packets indefinitely. */ ++ buf[0] = 0; ++ while (true) ++ { ++ /* sendto can fail if the client closed the socket. */ ++ if (sendto (server_fd, buf, sizeof (buf), 0, ++ (struct sockaddr *) &sa, salen) < 0) ++ break; ++ ++ /* Wait a bit, to avoid burning too many CPU cycles in a ++ tight loop. The wait period must be much shorter than ++ the client timeouts configured below. */ ++ usleep (50 * 1000); ++ } ++ } ++} ++ ++static int ++do_test (void) ++{ ++ support_become_root (); ++ support_enter_network_namespace (); ++ ++ server_fd = xsocket (AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP); ++ struct sockaddr_in server_address = ++ { ++ .sin_family = AF_INET, ++ .sin_addr.s_addr = htonl (INADDR_LOOPBACK), ++ }; ++ xbind (server_fd, ++ (struct sockaddr *) &server_address, sizeof (server_address)); ++ { ++ socklen_t sinlen = sizeof (server_address); ++ xgetsockname (server_fd, (struct sockaddr *) &server_address, &sinlen); ++ TEST_VERIFY (sizeof (server_address) == sinlen); ++ } ++ ++ /* Garbage packet source. */ ++ xpthread_detach (xpthread_create (NULL, garbage_sender_thread, NULL)); ++ ++ /* Test client. Use an arbitrary timeout of one second, which is ++ much longer than the garbage packet interval, but still ++ reasonably short, so that the test completes quickly. */ ++ int client_fd = RPC_ANYSOCK; ++ CLIENT *clnt = clntudp_create (&server_address, ++ 1, 2, /* Arbitrary RPC endpoint numbers. */ ++ (struct timeval) { 1, 0 }, ++ &client_fd); ++ if (clnt == NULL) ++ FAIL_EXIT1 ("clntudp_create: %m"); ++ ++ TEST_VERIFY (clnt_call (clnt, 3, /* Arbitrary RPC procedure number. */ ++ (xdrproc_t) xdr_void, NULL, ++ (xdrproc_t) xdr_void, NULL, ++ ((struct timeval) { 1, 0 }))); ++ ++ return 0; ++} ++ ++#include <support/test-driver.c> +Index: b/sunrpc/tst-udp-nonblocking.c +=================================================================== +--- /dev/null ++++ b/sunrpc/tst-udp-nonblocking.c +@@ -0,0 +1,333 @@ ++/* Test non-blocking use of the UDP client. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <netinet/in.h> ++#include <rpc/clnt.h> ++#include <rpc/svc.h> ++#include <stdbool.h> ++#include <string.h> ++#include <support/check.h> ++#include <support/namespace.h> ++#include <support/test-driver.h> ++#include <support/xsocket.h> ++#include <support/xunistd.h> ++#include <sys/socket.h> ++#include <time.h> ++#include <unistd.h> ++ ++/* Test data serialization and deserialization. */ ++ ++struct test_query ++{ ++ uint32_t a; ++ uint32_t b; ++ uint32_t timeout_ms; ++}; ++ ++static bool_t ++xdr_test_query (XDR *xdrs, void *data, ...) ++{ ++ struct test_query *p = data; ++ return xdr_uint32_t (xdrs, &p->a) ++ && xdr_uint32_t (xdrs, &p->b) ++ && xdr_uint32_t (xdrs, &p->timeout_ms); ++} ++ ++struct test_response ++{ ++ uint32_t server_id; ++ uint32_t seq; ++ uint32_t sum; ++}; ++ ++static bool_t ++xdr_test_response (XDR *xdrs, void *data, ...) ++{ ++ struct test_response *p = data; ++ return xdr_uint32_t (xdrs, &p->server_id) ++ && xdr_uint32_t (xdrs, &p->seq) ++ && xdr_uint32_t (xdrs, &p->sum); ++} ++ ++/* Implementation of the test server. */ ++ ++enum ++ { ++ /* Number of test servers to run. */ ++ SERVER_COUNT = 3, ++ ++ /* RPC parameters, chosen at random. */ ++ PROGNUM = 8242, ++ VERSNUM = 19654, ++ ++ /* Main RPC operation. */ ++ PROC_ADD = 1, ++ ++ /* Request process termination. */ ++ PROC_EXIT, ++ ++ /* Special exit status to mark successful processing. */ ++ EXIT_MARKER = 55, ++ }; ++ ++/* Set by the parent process to tell test servers apart. */ ++static int server_id; ++ ++/* Implementation of the test server. */ ++static void ++server_dispatch (struct svc_req *request, SVCXPRT *transport) ++{ ++ /* Query sequence number. */ ++ static uint32_t seq = 0; ++ ++seq; ++ static bool proc_add_seen; ++ ++ if (test_verbose) ++ printf ("info: server_dispatch server_id=%d seq=%u rq_proc=%lu\n", ++ server_id, seq, request->rq_proc); ++ ++ switch (request->rq_proc) ++ { ++ case PROC_ADD: ++ { ++ struct test_query query; ++ memset (&query, 0xc0, sizeof (query)); ++ TEST_VERIFY_EXIT ++ (svc_getargs (transport, xdr_test_query, ++ (void *) &query)); ++ ++ if (test_verbose) ++ printf (" a=%u b=%u timeout_ms=%u\n", ++ query.a, query.b, query.timeout_ms); ++ ++ usleep (query.timeout_ms * 1000); ++ ++ struct test_response response = ++ { ++ .server_id = server_id, ++ .seq = seq, ++ .sum = query.a + query.b, ++ }; ++ TEST_VERIFY (svc_sendreply (transport, xdr_test_response, ++ (void *) &response)); ++ if (test_verbose) ++ printf (" server id %d response seq=%u sent\n", server_id, seq); ++ proc_add_seen = true; ++ } ++ break; ++ ++ case PROC_EXIT: ++ TEST_VERIFY (proc_add_seen); ++ TEST_VERIFY (svc_sendreply (transport, (xdrproc_t) xdr_void, NULL)); ++ _exit (EXIT_MARKER); ++ break; ++ ++ default: ++ FAIL_EXIT1 ("invalid rq_proc value: %lu", request->rq_proc); ++ break; ++ } ++} ++ ++/* Return the number seconds since an arbitrary point in time. */ ++static double ++get_ticks (void) ++{ ++ { ++ struct timespec ts; ++ if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0) ++ return ts.tv_sec + ts.tv_nsec * 1e-9; ++ } ++ { ++ struct timeval tv; ++ TEST_VERIFY_EXIT (gettimeofday (&tv, NULL) == 0); ++ return tv.tv_sec + tv.tv_usec * 1e-6; ++ } ++} ++ ++static int ++do_test (void) ++{ ++ support_become_root (); ++ support_enter_network_namespace (); ++ ++ /* Information about the test servers. */ ++ struct ++ { ++ SVCXPRT *transport; ++ struct sockaddr_in address; ++ pid_t pid; ++ uint32_t xid; ++ } servers[SERVER_COUNT]; ++ ++ /* Spawn the test servers. */ ++ for (int i = 0; i < SERVER_COUNT; ++i) ++ { ++ servers[i].transport = svcudp_create (RPC_ANYSOCK); ++ TEST_VERIFY_EXIT (servers[i].transport != NULL); ++ servers[i].address = (struct sockaddr_in) ++ { ++ .sin_family = AF_INET, ++ .sin_addr.s_addr = htonl (INADDR_LOOPBACK), ++ .sin_port = htons (servers[i].transport->xp_port), ++ }; ++ servers[i].xid = 0xabcd0101 + i; ++ if (test_verbose) ++ printf ("info: setting up server %d xid=%x on port %d\n", ++ i, servers[i].xid, servers[i].transport->xp_port); ++ ++ server_id = i; ++ servers[i].pid = xfork (); ++ if (servers[i].pid == 0) ++ { ++ TEST_VERIFY (svc_register (servers[i].transport, ++ PROGNUM, VERSNUM, server_dispatch, 0)); ++ svc_run (); ++ FAIL_EXIT1 ("supposed to be unreachable"); ++ } ++ /* We need to close the socket so that we do not accidentally ++ consume the request. */ ++ TEST_VERIFY (close (servers[i].transport->xp_sock) == 0); ++ } ++ ++ ++ /* The following code mirrors what ypbind does. */ ++ ++ /* Copied from clnt_udp.c (like ypbind). */ ++ struct cu_data ++ { ++ int cu_sock; ++ bool_t cu_closeit; ++ struct sockaddr_in cu_raddr; ++ int cu_rlen; ++ struct timeval cu_wait; ++ struct timeval cu_total; ++ struct rpc_err cu_error; ++ XDR cu_outxdrs; ++ u_int cu_xdrpos; ++ u_int cu_sendsz; ++ char *cu_outbuf; ++ u_int cu_recvsz; ++ char cu_inbuf[1]; ++ }; ++ ++ int client_socket = xsocket (AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0); ++ CLIENT *clnt = clntudp_create (&servers[0].address, PROGNUM, VERSNUM, ++ /* 5 seconds per-response timeout. */ ++ ((struct timeval) { 5, 0 }), ++ &client_socket); ++ TEST_VERIFY (clnt != NULL); ++ clnt->cl_auth = authunix_create_default (); ++ { ++ struct timeval zero = { 0, 0 }; ++ TEST_VERIFY (clnt_control (clnt, CLSET_TIMEOUT, (void *) &zero)); ++ } ++ ++ /* Poke at internal data structures (like ypbind). */ ++ struct cu_data *cu = (struct cu_data *) clnt->cl_private; ++ ++ /* Send a ping to each server. */ ++ double before_pings = get_ticks (); ++ for (int i = 0; i < SERVER_COUNT; ++i) ++ { ++ if (test_verbose) ++ printf ("info: sending server %d ping\n", i); ++ /* Reset the xid because it is changed by each invocation of ++ clnt_call. Subtract one to compensate for the xid update ++ during the call. */ ++ *((u_int32_t *) (cu->cu_outbuf)) = servers[i].xid - 1; ++ cu->cu_raddr = servers[i].address; ++ ++ struct test_query query = { .a = 100, .b = i + 1 }; ++ if (i == 1) ++ /* Shorter timeout to prefer this server. These timeouts must ++ be much shorter than the 5-second per-response timeout ++ configured with clntudp_create. */ ++ query.timeout_ms = 700; ++ else ++ query.timeout_ms = 1400; ++ struct test_response response = { 0 }; ++ /* NB: Do not check the return value. The server reply will ++ prove that the call worked. */ ++ double before_one_ping = get_ticks (); ++ clnt_call (clnt, PROC_ADD, ++ xdr_test_query, (void *) &query, ++ xdr_test_response, (void *) &response, ++ ((struct timeval) { 0, 0 })); ++ double after_one_ping = get_ticks (); ++ if (test_verbose) ++ printf ("info: non-blocking send took %f seconds\n", ++ after_one_ping - before_one_ping); ++ /* clnt_call should return immediately. Accept some delay in ++ case the process is descheduled. */ ++ TEST_VERIFY (after_one_ping - before_one_ping < 0.3); ++ } ++ ++ /* Collect the non-blocking response. */ ++ if (test_verbose) ++ printf ("info: collecting response\n"); ++ struct test_response response = { 0 }; ++ TEST_VERIFY ++ (clnt_call (clnt, PROC_ADD, NULL, NULL, ++ xdr_test_response, (void *) &response, ++ ((struct timeval) { 0, 0 })) == RPC_SUCCESS); ++ double after_pings = get_ticks (); ++ if (test_verbose) ++ printf ("info: send/receive took %f seconds\n", ++ after_pings - before_pings); ++ /* Expected timeout is 0.7 seconds. */ ++ TEST_VERIFY (0.7 <= after_pings - before_pings); ++ TEST_VERIFY (after_pings - before_pings < 1.2); ++ ++ uint32_t xid; ++ memcpy (&xid, &cu->cu_inbuf, sizeof (xid)); ++ if (test_verbose) ++ printf ("info: non-blocking response: xid=%x server_id=%u seq=%u sum=%u\n", ++ xid, response.server_id, response.seq, response.sum); ++ /* Check that the reply from the preferred server was used. */ ++ TEST_VERIFY (servers[1].xid == xid); ++ TEST_VERIFY (response.server_id == 1); ++ TEST_VERIFY (response.seq == 1); ++ TEST_VERIFY (response.sum == 102); ++ ++ auth_destroy (clnt->cl_auth); ++ clnt_destroy (clnt); ++ ++ for (int i = 0; i < SERVER_COUNT; ++i) ++ { ++ if (test_verbose) ++ printf ("info: requesting server %d termination\n", i); ++ client_socket = RPC_ANYSOCK; ++ clnt = clntudp_create (&servers[i].address, PROGNUM, VERSNUM, ++ ((struct timeval) { 5, 0 }), ++ &client_socket); ++ TEST_VERIFY_EXIT (clnt != NULL); ++ TEST_VERIFY (clnt_call (clnt, PROC_EXIT, ++ (xdrproc_t) xdr_void, NULL, ++ (xdrproc_t) xdr_void, NULL, ++ ((struct timeval) { 3, 0 })) == RPC_SUCCESS); ++ clnt_destroy (clnt); ++ ++ int status; ++ xwaitpid (servers[i].pid, &status, 0); ++ TEST_VERIFY (WIFEXITED (status) && WEXITSTATUS (status) == EXIT_MARKER); ++ } ++ ++ return 0; ++} ++ ++#include <support/test-driver.c> +Index: b/sunrpc/tst-udp-timeout.c +=================================================================== +--- /dev/null ++++ b/sunrpc/tst-udp-timeout.c +@@ -0,0 +1,402 @@ ++/* Test timeout handling in the UDP client. ++ Copyright (C) 2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <netinet/in.h> ++#include <rpc/clnt.h> ++#include <rpc/svc.h> ++#include <stdbool.h> ++#include <string.h> ++#include <support/check.h> ++#include <support/namespace.h> ++#include <support/test-driver.h> ++#include <support/xsocket.h> ++#include <support/xunistd.h> ++#include <sys/socket.h> ++#include <time.h> ++#include <unistd.h> ++ ++/* Test data serialization and deserialization. */ ++ ++struct test_query ++{ ++ uint32_t a; ++ uint32_t b; ++ uint32_t timeout_ms; ++ uint32_t wait_for_seq; ++ uint32_t garbage_packets; ++}; ++ ++static bool_t ++xdr_test_query (XDR *xdrs, void *data, ...) ++{ ++ struct test_query *p = data; ++ return xdr_uint32_t (xdrs, &p->a) ++ && xdr_uint32_t (xdrs, &p->b) ++ && xdr_uint32_t (xdrs, &p->timeout_ms) ++ && xdr_uint32_t (xdrs, &p->wait_for_seq) ++ && xdr_uint32_t (xdrs, &p->garbage_packets); ++} ++ ++struct test_response ++{ ++ uint32_t seq; ++ uint32_t sum; ++}; ++ ++static bool_t ++xdr_test_response (XDR *xdrs, void *data, ...) ++{ ++ struct test_response *p = data; ++ return xdr_uint32_t (xdrs, &p->seq) ++ && xdr_uint32_t (xdrs, &p->sum); ++} ++ ++/* Implementation of the test server. */ ++ ++enum ++ { ++ /* RPC parameters, chosen at random. */ ++ PROGNUM = 15717, ++ VERSNUM = 13689, ++ ++ /* Main RPC operation. */ ++ PROC_ADD = 1, ++ ++ /* Reset the sequence number. */ ++ PROC_RESET_SEQ, ++ ++ /* Request process termination. */ ++ PROC_EXIT, ++ ++ /* Special exit status to mark successful processing. */ ++ EXIT_MARKER = 55, ++ }; ++ ++static void ++server_dispatch (struct svc_req *request, SVCXPRT *transport) ++{ ++ /* Query sequence number. */ ++ static uint32_t seq = 0; ++ ++seq; ++ ++ if (test_verbose) ++ printf ("info: server_dispatch seq=%u rq_proc=%lu\n", ++ seq, request->rq_proc); ++ ++ switch (request->rq_proc) ++ { ++ case PROC_ADD: ++ { ++ struct test_query query; ++ memset (&query, 0xc0, sizeof (query)); ++ TEST_VERIFY_EXIT ++ (svc_getargs (transport, xdr_test_query, ++ (void *) &query)); ++ ++ if (test_verbose) ++ printf (" a=%u b=%u timeout_ms=%u wait_for_seq=%u" ++ " garbage_packets=%u\n", ++ query.a, query.b, query.timeout_ms, query.wait_for_seq, ++ query.garbage_packets); ++ ++ if (seq < query.wait_for_seq) ++ { ++ /* No response at this point. */ ++ if (test_verbose) ++ printf (" skipped response\n"); ++ break; ++ } ++ ++ if (query.garbage_packets > 0) ++ { ++ int per_packet_timeout; ++ if (query.timeout_ms > 0) ++ per_packet_timeout ++ = query.timeout_ms * 1000 / query.garbage_packets; ++ else ++ per_packet_timeout = 0; ++ ++ char buf[20]; ++ memset (&buf, 0xc0, sizeof (buf)); ++ for (int i = 0; i < query.garbage_packets; ++i) ++ { ++ /* 13 is relatively prime to 20 = sizeof (buf) + 1, so ++ the len variable will cover the entire interval ++ [0, 20] if query.garbage_packets is sufficiently ++ large. */ ++ size_t len = (i * 13 + 1) % (sizeof (buf) + 1); ++ TEST_VERIFY (sendto (transport->xp_sock, ++ buf, len, MSG_NOSIGNAL, ++ (struct sockaddr *) &transport->xp_raddr, ++ transport->xp_addrlen) == len); ++ if (per_packet_timeout > 0) ++ usleep (per_packet_timeout); ++ } ++ } ++ else if (query.timeout_ms > 0) ++ usleep (query.timeout_ms * 1000); ++ ++ struct test_response response = ++ { ++ .seq = seq, ++ .sum = query.a + query.b, ++ }; ++ TEST_VERIFY (svc_sendreply (transport, xdr_test_response, ++ (void *) &response)); ++ } ++ break; ++ ++ case PROC_RESET_SEQ: ++ seq = 0; ++ TEST_VERIFY (svc_sendreply (transport, (xdrproc_t) xdr_void, NULL)); ++ break; ++ ++ case PROC_EXIT: ++ TEST_VERIFY (svc_sendreply (transport, (xdrproc_t) xdr_void, NULL)); ++ _exit (EXIT_MARKER); ++ break; ++ ++ default: ++ FAIL_EXIT1 ("invalid rq_proc value: %lu", request->rq_proc); ++ break; ++ } ++} ++ ++/* Implementation of the test client. */ ++ ++static struct test_response ++test_call (CLIENT *clnt, int proc, struct test_query query, ++ struct timeval timeout) ++{ ++ if (test_verbose) ++ printf ("info: test_call proc=%d timeout=%lu.%06lu\n", ++ proc, (unsigned long) timeout.tv_sec, ++ (unsigned long) timeout.tv_usec); ++ struct test_response response; ++ TEST_VERIFY_EXIT (clnt_call (clnt, proc, ++ xdr_test_query, (void *) &query, ++ xdr_test_response, (void *) &response, ++ timeout) ++ == RPC_SUCCESS); ++ return response; ++} ++ ++static void ++test_call_timeout (CLIENT *clnt, int proc, struct test_query query, ++ struct timeval timeout) ++{ ++ struct test_response response; ++ TEST_VERIFY (clnt_call (clnt, proc, ++ xdr_test_query, (void *) &query, ++ xdr_test_response, (void *) &response, ++ timeout) ++ == RPC_TIMEDOUT); ++} ++ ++/* Complete one regular RPC call to drain the server socket ++ buffer. Resets the sequence number. */ ++static void ++test_call_flush (CLIENT *clnt) ++{ ++ /* This needs a longer timeout to flush out all pending requests. ++ The choice of 5 seconds is larger than the per-response timeouts ++ requested via the timeout_ms field. */ ++ if (test_verbose) ++ printf ("info: flushing pending queries\n"); ++ TEST_VERIFY_EXIT (clnt_call (clnt, PROC_RESET_SEQ, ++ (xdrproc_t) xdr_void, NULL, ++ (xdrproc_t) xdr_void, NULL, ++ ((struct timeval) { 5, 0 })) ++ == RPC_SUCCESS); ++} ++ ++/* Return the number seconds since an arbitrary point in time. */ ++static double ++get_ticks (void) ++{ ++ { ++ struct timespec ts; ++ if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0) ++ return ts.tv_sec + ts.tv_nsec * 1e-9; ++ } ++ { ++ struct timeval tv; ++ TEST_VERIFY_EXIT (gettimeofday (&tv, NULL) == 0); ++ return tv.tv_sec + tv.tv_usec * 1e-6; ++ } ++} ++ ++static void ++test_udp_server (int port) ++{ ++ struct sockaddr_in sin = ++ { ++ .sin_family = AF_INET, ++ .sin_addr.s_addr = htonl (INADDR_LOOPBACK), ++ .sin_port = htons (port) ++ }; ++ int sock = RPC_ANYSOCK; ++ ++ /* The client uses a 1.5 second timeout for retries. The timeouts ++ are arbitrary, but chosen so that there is a substantial gap ++ between them, but the total time spent waiting is not too ++ large. */ ++ CLIENT *clnt = clntudp_create (&sin, PROGNUM, VERSNUM, ++ (struct timeval) { 1, 500 * 1000 }, ++ &sock); ++ TEST_VERIFY_EXIT (clnt != NULL); ++ ++ /* Basic call/response test. */ ++ struct test_response response = test_call ++ (clnt, PROC_ADD, ++ (struct test_query) { .a = 17, .b = 4 }, ++ (struct timeval) { 3, 0 }); ++ TEST_VERIFY (response.sum == 21); ++ TEST_VERIFY (response.seq == 1); ++ ++ /* Check that garbage packets do not interfere with timeout ++ processing. */ ++ double before = get_ticks (); ++ response = test_call ++ (clnt, PROC_ADD, ++ (struct test_query) { ++ .a = 19, .b = 4, .timeout_ms = 500, .garbage_packets = 21, ++ }, ++ (struct timeval) { 3, 0 }); ++ TEST_VERIFY (response.sum == 23); ++ TEST_VERIFY (response.seq == 2); ++ double after = get_ticks (); ++ if (test_verbose) ++ printf ("info: 21 garbage packets took %f seconds\n", after - before); ++ /* Expected timeout is 0.5 seconds. Add some slack in case process ++ scheduling delays processing the query or response, but do not ++ accept a retry (which would happen at 1.5 seconds). */ ++ TEST_VERIFY (0.5 <= after - before); ++ TEST_VERIFY (after - before < 1.2); ++ test_call_flush (clnt); ++ ++ /* Check that missing a response introduces a 1.5 second timeout, as ++ requested when calling clntudp_create. */ ++ before = get_ticks (); ++ response = test_call ++ (clnt, PROC_ADD, ++ (struct test_query) { .a = 170, .b = 40, .wait_for_seq = 2 }, ++ (struct timeval) { 3, 0 }); ++ TEST_VERIFY (response.sum == 210); ++ TEST_VERIFY (response.seq == 2); ++ after = get_ticks (); ++ if (test_verbose) ++ printf ("info: skipping one response took %f seconds\n", ++ after - before); ++ /* Expected timeout is 1.5 seconds. Do not accept a second retry ++ (which would happen at 3 seconds). */ ++ TEST_VERIFY (1.5 <= after - before); ++ TEST_VERIFY (after - before < 2.9); ++ test_call_flush (clnt); ++ ++ /* Check that the overall timeout wins against the per-query ++ timeout. */ ++ before = get_ticks (); ++ test_call_timeout ++ (clnt, PROC_ADD, ++ (struct test_query) { .a = 170, .b = 41, .wait_for_seq = 2 }, ++ (struct timeval) { 0, 750 * 1000 }); ++ after = get_ticks (); ++ if (test_verbose) ++ printf ("info: 0.75 second timeout took %f seconds\n", ++ after - before); ++ TEST_VERIFY (0.75 <= after - before); ++ TEST_VERIFY (after - before < 1.4); ++ test_call_flush (clnt); ++ ++ for (int with_garbage = 0; with_garbage < 2; ++with_garbage) ++ { ++ /* Check that no response at all causes the client to bail out. */ ++ before = get_ticks (); ++ test_call_timeout ++ (clnt, PROC_ADD, ++ (struct test_query) { ++ .a = 170, .b = 40, .timeout_ms = 1200, ++ .garbage_packets = with_garbage * 21 ++ }, ++ (struct timeval) { 0, 750 * 1000 }); ++ after = get_ticks (); ++ if (test_verbose) ++ printf ("info: test_udp_server: 0.75 second timeout took %f seconds" ++ " (garbage %d)\n", ++ after - before, with_garbage); ++ TEST_VERIFY (0.75 <= after - before); ++ TEST_VERIFY (after - before < 1.4); ++ test_call_flush (clnt); ++ ++ /* As above, but check the total timeout. */ ++ before = get_ticks (); ++ test_call_timeout ++ (clnt, PROC_ADD, ++ (struct test_query) { ++ .a = 170, .b = 40, .timeout_ms = 3000, ++ .garbage_packets = with_garbage * 30 ++ }, ++ (struct timeval) { 2, 300 * 1000 }); ++ after = get_ticks (); ++ if (test_verbose) ++ printf ("info: test_udp_server: 2.3 second timeout took %f seconds" ++ " (garbage %d)\n", ++ after - before, with_garbage); ++ TEST_VERIFY (2.3 <= after - before); ++ TEST_VERIFY (after - before < 3.0); ++ test_call_flush (clnt); ++ } ++ ++ TEST_VERIFY_EXIT (clnt_call (clnt, PROC_EXIT, ++ (xdrproc_t) xdr_void, NULL, ++ (xdrproc_t) xdr_void, NULL, ++ ((struct timeval) { 5, 0 })) ++ == RPC_SUCCESS); ++ clnt_destroy (clnt); ++} ++ ++static int ++do_test (void) ++{ ++ support_become_root (); ++ support_enter_network_namespace (); ++ ++ SVCXPRT *transport = svcudp_create (RPC_ANYSOCK); ++ TEST_VERIFY_EXIT (transport != NULL); ++ TEST_VERIFY (svc_register (transport, PROGNUM, VERSNUM, server_dispatch, 0)); ++ ++ pid_t pid = xfork (); ++ if (pid == 0) ++ { ++ svc_run (); ++ FAIL_EXIT1 ("supposed to be unreachable"); ++ } ++ test_udp_server (transport->xp_port); ++ ++ int status; ++ xwaitpid (pid, &status, 0); ++ TEST_VERIFY (WIFEXITED (status) && WEXITSTATUS (status) == EXIT_MARKER); ++ ++ SVC_DESTROY (transport); ++ return 0; ++} ++ ++/* The minimum run time is around 17 seconds. */ ++#define TIMEOUT 25 ++#include <support/test-driver.c> +Index: b/inet/net-internal.h +=================================================================== +--- /dev/null ++++ b/inet/net-internal.h +@@ -0,0 +1,112 @@ ++/* Network-related functions for internal library use. ++ Copyright (C) 2016-2017 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef _NET_INTERNAL_H ++#define _NET_INTERNAL_H 1 ++ ++#include <stdbool.h> ++#include <stdint.h> ++#include <sys/time.h> ++ ++/* Deadline handling for enforcing timeouts. ++ ++ Code should call __deadline_current_time to obtain the current time ++ and cache it locally. The cache needs updating after every ++ long-running or potentially blocking operation. Deadlines relative ++ to the current time can be computed using __deadline_from_timeval. ++ The deadlines may have to be recomputed in response to certain ++ events (such as an incoming packet), but they are absolute (not ++ relative to the current time). A timeout suitable for use with the ++ poll function can be computed from such a deadline using ++ __deadline_to_ms. ++ ++ The fields in the structs defined belowed should only be used ++ within the implementation. */ ++ ++/* Cache of the current time. Used to compute deadlines from relative ++ timeouts and vice versa. */ ++struct deadline_current_time ++{ ++ struct timespec current; ++}; ++ ++/* Return the current time. Terminates the process if the current ++ time is not available. */ ++struct deadline_current_time __deadline_current_time (void) ++ internal_function attribute_hidden; ++ ++/* Computed absolute deadline. */ ++struct deadline ++{ ++ struct timespec absolute; ++}; ++ ++ ++/* For internal use only. */ ++static inline bool ++__deadline_is_infinite (struct deadline deadline) ++{ ++ return deadline.absolute.tv_nsec < 0; ++} ++ ++/* Return true if the current time is at the deadline or past it. */ ++static inline bool ++__deadline_elapsed (struct deadline_current_time current, ++ struct deadline deadline) ++{ ++ return !__deadline_is_infinite (deadline) ++ && (current.current.tv_sec > deadline.absolute.tv_sec ++ || (current.current.tv_sec == deadline.absolute.tv_sec ++ && current.current.tv_nsec >= deadline.absolute.tv_nsec)); ++} ++ ++/* Return the deadline which occurs first. */ ++static inline struct deadline ++__deadline_first (struct deadline left, struct deadline right) ++{ ++ if (__deadline_is_infinite (right) ++ || left.absolute.tv_sec < right.absolute.tv_sec ++ || (left.absolute.tv_sec == right.absolute.tv_sec ++ && left.absolute.tv_nsec < right.absolute.tv_nsec)) ++ return left; ++ else ++ return right; ++} ++ ++/* Add TV to the current time and return it. Returns a special ++ infinite absolute deadline on overflow. */ ++struct deadline __deadline_from_timeval (struct deadline_current_time, ++ struct timeval tv) ++ internal_function attribute_hidden; ++ ++/* Compute the number of milliseconds until the specified deadline, ++ from the current time in the argument. The result is mainly for ++ use with poll. If the deadline has already passed, return 0. If ++ the result would overflow an int, return INT_MAX. */ ++int __deadline_to_ms (struct deadline_current_time, struct deadline) ++ internal_function attribute_hidden; ++ ++/* Return true if TV.tv_sec is non-negative and TV.tv_usec is in the ++ interval [0, 999999]. */ ++static inline bool ++__is_timeval_valid_timeout (struct timeval tv) ++{ ++ return tv.tv_sec >= 0 && tv.tv_usec >= 0 && tv.tv_usec < 1000 * 1000; ++} ++ ++#endif /* _NET_INTERNAL_H */ +Index: b/inet/Makefile +=================================================================== +--- a/inet/Makefile ++++ b/inet/Makefile +@@ -44,13 +44,18 @@ routines := htonl htons \ + getaliasent_r getaliasent getaliasname getaliasname_r \ + in6_addr getnameinfo if_index ifaddrs inet6_option \ + getipv4sourcefilter setipv4sourcefilter \ +- getsourcefilter setsourcefilter inet6_opt inet6_rth ++ getsourcefilter setsourcefilter inet6_opt inet6_rth \ ++ deadline + + aux := check_pf check_native ifreq + + tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \ + tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line \ +- tst-getni1 tst-getni2 tst-inet6_rth tst-checks ++ tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-deadline ++ ++# tst-deadline must be linked statically so that we can access ++# internal functions. ++tests-static += tst-deadline + + include ../Rules + 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 <neleai@seznam.cz> +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..7939344 --- /dev/null +++ b/SOURCES/glibc-rh1234449-2.patch @@ -0,0 +1,940 @@ +commit 42261ad731991df345880b0b509d83b0b9a9b9d8 +Author: Florian Weimer <fweimer@redhat.com> +Date: Fri Apr 24 17:34:47 2015 +0200 + + Make time zone file parser more robust [BZ #17715] + +commit 6807b1db8233ed84671f061b5d825622233df303 +Author: Kevin Easton <kevin@guarana.org> +Date: Tue Feb 24 23:57:07 2015 -0500 + + Reduce lock contention in __tz_convert() [BZ #16145] (partial fix) + +commit 9d46370ca338054cb6ea7ebeddcf06c7ac7ad1a9 +Author: Joseph Myers <joseph@codesourcery.com> +Date: Fri Oct 16 20:21:49 2015 +0000 + + Convert 703 function definitions to prototype style. + (A subset of these changes (tzset.c) were applied as part of this patch.) + +commit 0748546f660d27a2ad29fa6174d456e2f6490758 +Author: Paul Eggert <eggert@cs.ucla.edu> +Date: Wed Sep 18 13:15:12 2013 -0700 + + Support TZ transition times < 00:00:00. + + This is needed for version-3 tz-format files; it supports time + stamps past 2037 for America/Godthab (the only entry in the tz + database for which this change is relevant). + * manual/time.texi (TZ Variable): Document transition times + from -167:59:59 through -00:00:01. + * time/tzset.c (tz_rule): Time of day is now signed. + (__tzset_parse_tz): Parse negative time of day. + (A subset of these changes were applied as part of this patch.) + +commit 3cc652e951c71785032019fec82e3b8543d85305 +Author: Mike Frysinger <vapier@gentoo.org> +Date: Fri Sep 18 13:49:08 2015 -0400 + + timezone: fix parallel check failures + + The XT testdata install rules expect the testdata dir to already exist in + the build tree, but it doesn't actually create it. Instead, it relies on + the build-testdata define happening to be executed before it (which runs + zic which creates the dir). When we run in parallel though, it's easy to + hit a failure: + $ cd timezone + $ rm -rf $objdir/timezone/testdata + $ make check -j + ... + cp testdata/XT1 .../timezone/testdata/XT1 + cp: cannot create regular file '.../timezone/testdata/XT1': No such file or directory + Makefile:116: recipe for target '.../timezone/testdata/XT1' failed + make: *** [.../timezone/testdata/XT1] Error 1 + make: *** Waiting for unfinished jobs.... + +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 <ctype.h> + #include <errno.h> + #include <bits/libc-lock.h> ++#include <stdbool.h> + #include <stddef.h> + #include <stdio.h> + #include <stdlib.h> +@@ -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. +--- /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 ++ <http://www.gnu.org/licenses/>. */ ++ ++#define _GNU_SOURCE 1 ++ ++#include <errno.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <sys/resource.h> ++#include <time.h> ++#include <unistd.h> ++ ++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/timezone/Makefile b/timezone/Makefile +index 81d4a3e..bfb3463 100644 +--- a/timezone/Makefile ++++ b/timezone/Makefile +@@ -113,6 +113,7 @@ $(testdata)/Asia/Tokyo: asia $(zic-deps) + $(build-testdata) + + $(testdata)/XT%: testdata/XT% ++ $(make-target-directory) + cp $< $@ + + $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make +diff -Nrup -a a/timezone/testdata/XT1 b/timezone/testdata/XT1 +--- a/timezone/testdata/XT1 1969-12-31 19:00:00.000000000 -0500 ++++ b/timezone/testdata/XT1 2017-09-14 10:19:11.382923956 -0400 +@@ -0,0 +1,2 @@ ++TZif2